diff --git a/src/Umbraco.Core/Services/PackagingService.cs b/src/Umbraco.Core/Services/PackagingService.cs index 037878b44f..ccfe885adf 100644 --- a/src/Umbraco.Core/Services/PackagingService.cs +++ b/src/Umbraco.Core/Services/PackagingService.cs @@ -582,24 +582,26 @@ namespace Umbraco.Core.Services foreach (XElement tempElement in templateElements) { var dependencies = new List(); - if (tempElement.Element("Master") != null && - string.IsNullOrEmpty(tempElement.Element("Master").Value) == false && - templateElements.Any(x => x.Element("Alias").Value == tempElement.Element("Master").Value)) + var elementCopy = tempElement; + + if (elementCopy.Element("Master") != null && + string.IsNullOrEmpty(elementCopy.Element("Master").Value) == false && + templateElements.Any(x => x.Element("Alias").Value == elementCopy.Element("Master").Value)) { - dependencies.Add(tempElement.Element("Master").Value); + dependencies.Add(elementCopy.Element("Master").Value); } - else if (tempElement.Element("Master") != null && - string.IsNullOrEmpty(tempElement.Element("Master").Value) == false && - templateElements.Any(x => x.Element("Alias").Value == tempElement.Element("Master").Value) == + else if (elementCopy.Element("Master") != null && + string.IsNullOrEmpty(elementCopy.Element("Master").Value) == false && + templateElements.Any(x => x.Element("Alias").Value == elementCopy.Element("Master").Value) == false) { - LogHelper.Info(string.Format("Template '{0}' has an invalid Master '{1}', so the reference has been ignored.", tempElement.Element("Alias").Value, tempElement.Element("Master").Value)); + LogHelper.Info(string.Format("Template '{0}' has an invalid Master '{1}', so the reference has been ignored.", elementCopy.Element("Alias").Value, elementCopy.Element("Master").Value)); } var field = new TopologicalSorter.DependencyField { - Alias = tempElement.Element("Alias").Value, - Item = new Lazy(() => tempElement), + Alias = elementCopy.Element("Alias").Value, + Item = new Lazy(() => elementCopy), DependsOn = dependencies.ToArray() }; diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentControl.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentControl.cs index c80dbb8932..e1e300136e 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentControl.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/ContentControl.cs @@ -25,15 +25,17 @@ using StylesheetProperty = umbraco.cms.businesslogic.web.StylesheetProperty; namespace umbraco.controls { - public class ContentControlLoadEventArgs : System.ComponentModel.CancelEventArgs { } + public class ContentControlLoadEventArgs : CancelEventArgs { } /// /// Summary description for ContentControl. /// public class ContentControl : TabView { - private readonly Content _content; + + internal Dictionary DataTypes = new Dictionary(); + private readonly Content _content; private UmbracoEnsuredPage _prntpage; public event EventHandler SaveAndPublish; public event EventHandler SaveToPublish; @@ -44,31 +46,53 @@ namespace umbraco.controls public TextBox NameTxt = new TextBox(); public PlaceHolder NameTxtHolder = new PlaceHolder(); public RequiredFieldValidator NameTxtValidator = new RequiredFieldValidator(); - private static readonly string _UmbracoPath = SystemDirectories.Umbraco; + private readonly CustomValidator _nameTxtCustomValidator = new CustomValidator(); + private static readonly string UmbracoPath = SystemDirectories.Umbraco; public Pane PropertiesPane = new Pane(); + // zb-00036 #29889 : load it only once + List _virtualTabs; + //default to true! + private bool _savePropertyDataWhenInvalid = true; + private ContentType _contentType; + public Content ContentObject { get { return _content; } } - // Error messages + /// + /// This property controls whether the content property values are persisted even if validation + /// fails. If set to false, then the values will not be persisted. + /// + /// + /// This is required because when we are editing content we should be persisting invalid values to the database + /// as this makes it easier for editors to come back and fix up their changes before they publish. Of course we + /// don't publish if the page is invalid. In the case of media and members, we don't want to persist the values + /// to the database when the page is invalid because there is no published state. + /// Relates to: http://issues.umbraco.org/issue/U4-227 + /// + public bool SavePropertyDataWhenInvalid + { + get { return _savePropertyDataWhenInvalid; } + set { _savePropertyDataWhenInvalid = value; } + } + + [Obsolete("This is no longer used and will be removed from the codebase in future versions")] private string _errorMessage = ""; + [Obsolete("This is no longer used and will be removed from the codebase in future versions")] public string ErrorMessage { set { _errorMessage = value; } } - [Obsolete("This event handler should not be used, it will stil fire for when a SaveAndPublish event is raised but this should be handled with the data APIs")] + [Obsolete("This is no longer used and will be removed from the codebase in future versions")] protected void standardSaveAndPublishHandler(object sender, EventArgs e) { } - // zb-00036 #29889 : load it only once - private List _virtualTabs; - private ContentType _contentType; - + /// /// Constructor to set default properties. /// @@ -110,8 +134,7 @@ namespace umbraco.controls { base.CreateChildControls(); - SaveAndPublish += new EventHandler(standardSaveAndPublishHandler); - Save += new EventHandler(standardSaveAndPublishHandler); + _prntpage = (UmbracoEnsuredPage)Page; int i = 0; Hashtable inTab = new Hashtable(); @@ -254,12 +277,19 @@ namespace umbraco.controls // Name validation NameTxtValidator.ControlToValidate = NameTxt.ID; + _nameTxtCustomValidator.ControlToValidate = NameTxt.ID; string[] errorVars = { ui.Text("name") }; NameTxtValidator.ErrorMessage = " " + ui.Text("errorHandling", "errorMandatoryWithoutTab", errorVars, null) + "
"; NameTxtValidator.EnableClientScript = false; - NameTxtValidator.Display = ValidatorDisplay.Dynamic; + NameTxtValidator.Display = ValidatorDisplay.Dynamic; + _nameTxtCustomValidator.EnableClientScript = false; + _nameTxtCustomValidator.Display = ValidatorDisplay.Dynamic; + _nameTxtCustomValidator.ServerValidate += NameTxtCustomValidatorServerValidate; + _nameTxtCustomValidator.ValidateEmptyText = false; + NameTxtHolder.Controls.Add(NameTxt); NameTxtHolder.Controls.Add(NameTxtValidator); + NameTxtHolder.Controls.Add(_nameTxtCustomValidator); PropertiesPane.addProperty(ui.Text("general", "name", null), NameTxtHolder); Literal ltt = new Literal(); @@ -284,6 +314,23 @@ namespace umbraco.controls } } + /// + /// Custom validates the content name field + /// + /// + /// + /// + /// We need to ensure people are not entering XSS attacks on this field + /// http://issues.umbraco.org/issue/U4-485 + /// + /// This doesn't actually 'validate' but changes the text field value and strips html + /// + void NameTxtCustomValidatorServerValidate(object source, ServerValidateEventArgs args) + { + NameTxt.Text = NameTxt.Text.StripHtml(); + args.IsValid = true; + } + protected override void OnLoad(EventArgs e) { base.OnLoad(e); @@ -316,7 +363,10 @@ namespace umbraco.controls { SetNameAndDataTypeValues(); - Save(this, new EventArgs()); + if (Save != null) + { + Save(this, new EventArgs()); + } } private void DoSaveAndPublish(object sender, ImageClickEventArgs e) @@ -329,20 +379,26 @@ namespace umbraco.controls // see: http://issues.umbraco.org/issue/U4-1660 Save(this, new EventArgs()); - SaveAndPublish(this, new EventArgs()); + if (SaveAndPublish != null) + { + SaveAndPublish(this, new EventArgs()); + } } private void DoSaveToPublish(object sender, ImageClickEventArgs e) { SaveClick(sender, e); - SaveToPublish(this, new EventArgs()); + if (SaveToPublish != null) + { + SaveToPublish(this, new EventArgs()); + } } private void AddSaveAndPublishButtons(ref TabPage tp) { MenuImageButton menuSave = tp.Menu.NewImageButton(); menuSave.ID = tp.ID + "_save"; - menuSave.ImageUrl = _UmbracoPath + "/images/editor/save.gif"; + menuSave.ImageUrl = UmbracoPath + "/images/editor/save.gif"; menuSave.Click += new ImageClickEventHandler(SaveClick); menuSave.OnClickCommand = "invokeSaveHandlers();"; menuSave.AltText = ui.Text("buttons", "save", null); @@ -350,7 +406,7 @@ namespace umbraco.controls { MenuImageButton menuPublish = tp.Menu.NewImageButton(); menuPublish.ID = tp.ID + "_publish"; - menuPublish.ImageUrl = _UmbracoPath + "/images/editor/saveAndPublish.gif"; + menuPublish.ImageUrl = UmbracoPath + "/images/editor/saveAndPublish.gif"; menuPublish.OnClickCommand = "invokeSaveHandlers();"; menuPublish.Click += new ImageClickEventHandler(DoSaveAndPublish); menuPublish.AltText = ui.Text("buttons", "saveAndPublish", null); @@ -359,7 +415,7 @@ namespace umbraco.controls { MenuImageButton menuToPublish = tp.Menu.NewImageButton(); menuToPublish.ID = tp.ID + "_topublish"; - menuToPublish.ImageUrl = _UmbracoPath + "/images/editor/saveToPublish.gif"; + menuToPublish.ImageUrl = UmbracoPath + "/images/editor/saveToPublish.gif"; menuToPublish.OnClickCommand = "invokeSaveHandlers();"; menuToPublish.Click += new ImageClickEventHandler(DoSaveToPublish); menuToPublish.AltText = ui.Text("buttons", "saveToPublish", null); @@ -367,7 +423,7 @@ namespace umbraco.controls } - private void AddControlNew(Property p, TabPage tp, string Caption) + private void AddControlNew(Property p, TabPage tp, string cap) { IDataType dt = p.PropertyType.DataTypeDefinition.DataType; dt.DataEditor.Editor.ID = string.Format("prop_{0}", p.PropertyType.Alias); @@ -494,7 +550,7 @@ namespace umbraco.controls { rq.EnableClientScript = false; rq.Display = ValidatorDisplay.Dynamic; - string[] errorVars = { p.PropertyType.Name, Caption }; + string[] errorVars = { p.PropertyType.Name, cap }; rq.ErrorMessage = ui.Text("errorHandling", "errorMandatory", errorVars, null) + "
"; holder.Controls.AddAt(0, rq); } @@ -529,7 +585,7 @@ namespace umbraco.controls rv.ValidationExpression = p.PropertyType.ValidationRegExp; rv.EnableClientScript = false; rv.Display = ValidatorDisplay.Dynamic; - string[] errorVars = { p.PropertyType.Name, Caption }; + string[] errorVars = { p.PropertyType.Name, cap }; rv.ErrorMessage = ui.Text("errorHandling", "errorRegExp", errorVars, null) + "
"; holder.Controls.AddAt(0, rv); } @@ -564,25 +620,6 @@ namespace umbraco.controls NoPublish } - private string DictinaryItem(string alias) - { - if (alias.Substring(1, 0) == "#") - { - - if (Dictionary.DictionaryItem.hasKey(alias.Substring(1))) - { - - Dictionary.DictionaryItem di = new Dictionary.DictionaryItem(alias.Substring(1)); - - if (di != null && !string.IsNullOrEmpty(di.Value())) - return di.Value(); - } - - } - - return alias + " " + alias.Substring(1); - } - // EVENTS public delegate void BeforeContentControlLoadEventHandler(ContentControl contentControl, ContentControlLoadEventArgs e); public delegate void AfterContentControlLoadEventHandler(ContentControl contentControl, ContentControlLoadEventArgs e); diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/editContent.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/editContent.aspx.cs index bc483e39e2..fb26da5c8f 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/editContent.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/editContent.aspx.cs @@ -1,11 +1,10 @@ using System; using System.Web.UI; using System.Web.UI.WebControls; -using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Persistence.Caching; -using Umbraco.Core.Services; using Umbraco.Core.IO; +using Umbraco.Core.Services; using umbraco.BusinessLogic.Actions; using umbraco.uicontrols.DatePicker; using umbraco.BusinessLogic; @@ -13,6 +12,7 @@ using umbraco.cms.businesslogic.web; using umbraco.presentation; using System.Linq; using Image = System.Web.UI.WebControls.Image; +using Umbraco.Core; namespace umbraco.cms.presentation { @@ -312,9 +312,7 @@ namespace umbraco.cms.presentation _document.Save(); return; } - - //var previouslyPublished = _document.HasPublishedVersion(); - + if (_document.SaveAndPublish(UmbracoUser)) { //library.UpdateDocumentCache(_document.Id); diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/editMedia.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/editMedia.aspx.cs index 4536439571..38d5fc8146 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/editMedia.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/editMedia.aspx.cs @@ -18,9 +18,9 @@ namespace umbraco.cms.presentation /// public partial class editMedia : BasePages.UmbracoEnsuredPage { - private uicontrols.Pane mediaPropertiesPane = new uicontrols.Pane(); - private LiteralControl updateDateLiteral = new LiteralControl(); - private LiteralControl mediaFileLinksLiteral = new LiteralControl(); + private readonly uicontrols.Pane _mediaPropertiesPane = new uicontrols.Pane(); + private readonly LiteralControl _updateDateLiteral = new LiteralControl(); + private readonly LiteralControl _mediaFileLinksLiteral = new LiteralControl(); public editMedia() { @@ -28,12 +28,10 @@ namespace umbraco.cms.presentation } protected uicontrols.TabView TabView1; - protected System.Web.UI.WebControls.TextBox documentName; - private cms.businesslogic.media.Media _media; - controls.ContentControl tmp; - - //protected System.Web.UI.WebControls.Literal SyncPath; - + protected TextBox documentName; + private businesslogic.media.Media _media; + controls.ContentControl _contentControl; + override protected void OnInit(EventArgs e) { base.OnInit(e); @@ -48,89 +46,92 @@ namespace umbraco.cms.presentation bool exists = SqlHelper.ExecuteScalar("SELECT COUNT(nodeId) FROM cmsContentXml WHERE nodeId = @nodeId", SqlHelper.CreateParameter("@nodeId", _media.Id)) > 0; if (!exists) + { _media.XmlGenerate(new XmlDocument()); + } + _contentControl = new controls.ContentControl(_media, controls.ContentControl.publishModes.NoPublish, "TabView1"); + _contentControl.Width = Unit.Pixel(666); + _contentControl.Height = Unit.Pixel(666); - tmp = new controls.ContentControl(_media, controls.ContentControl.publishModes.NoPublish, "TabView1"); - tmp.Width = Unit.Pixel(666); - tmp.Height = Unit.Pixel(666); - plc.Controls.Add(tmp); + //this must be set to false as we don't want to proceed to save anything if the page is invalid + _contentControl.SavePropertyDataWhenInvalid = false; - tmp.Save += new System.EventHandler(Save); + plc.Controls.Add(_contentControl); - this.updateDateLiteral.ID = "updateDate"; - this.updateDateLiteral.Text = _media.VersionDate.ToShortDateString() + " " + _media.VersionDate.ToShortTimeString(); + _contentControl.Save += new System.EventHandler(Save); - this.mediaFileLinksLiteral.ID = "mediaFileLinks"; - mediaPropertiesPane.addProperty(ui.Text("content", "updateDate", base.getUser()), this.updateDateLiteral); + this._updateDateLiteral.ID = "updateDate"; + this._updateDateLiteral.Text = _media.VersionDate.ToShortDateString() + " " + _media.VersionDate.ToShortTimeString(); + + this._mediaFileLinksLiteral.ID = "mediaFileLinks"; + _mediaPropertiesPane.addProperty(ui.Text("content", "updateDate", base.getUser()), this._updateDateLiteral); this.UpdateMediaFileLinksLiteral(); - mediaPropertiesPane.addProperty(ui.Text("content", "mediaLinks"), this.mediaFileLinksLiteral); + _mediaPropertiesPane.addProperty(ui.Text("content", "mediaLinks"), this._mediaFileLinksLiteral); // add the property pane to the page rendering - tmp.tpProp.Controls.AddAt(1, mediaPropertiesPane); + _contentControl.tpProp.Controls.AddAt(1, _mediaPropertiesPane); } protected void Page_Load(object sender, System.EventArgs e) { - //if (!IsPostBack) - //{ - // SyncPath.Text = _media.Path; - // newName.Text = _media.Text.Replace("'", "\\'"); - //} if (!IsPostBack) { ClientTools.SyncTree(_media.Path, false); } } - protected void Save(object sender, System.EventArgs e) + protected void Save(object sender, EventArgs e) { - // error handling test + // do not continue saving anything if the page is invalid! + // http://issues.umbraco.org/issue/U4-227 if (!Page.IsValid) { - foreach (uicontrols.TabPage tp in tmp.GetPanels()) + foreach (uicontrols.TabPage tp in _contentControl.GetPanels()) { tp.ErrorControl.Visible = true; tp.ErrorHeader = ui.Text("errorHandling", "errorHeader"); tp.CloseCaption = ui.Text("close"); } } - else if (Page.IsPostBack) + else { - // hide validation summaries - foreach (uicontrols.TabPage tp in tmp.GetPanels()) + if (Page.IsPostBack) { - tp.ErrorControl.Visible = false; - } - } + // hide validation summaries + foreach (uicontrols.TabPage tp in _contentControl.GetPanels()) + { + tp.ErrorControl.Visible = false; + } + } //The value of the properties has been set on IData through IDataEditor in the ContentControl //so we need to 'retrieve' that value and set it on the property of the new IContent object. //NOTE This is a workaround for the legacy approach to saving values through the DataType instead of the Property //- (The DataType shouldn't be responsible for saving the value - especically directly to the db). - foreach (var item in tmp.DataTypes) + foreach (var item in _contentControl.DataTypes) { _media.getProperty(item.Key).Value = item.Value.Data.Value; } - _media.Save(); + _media.Save(); - this.updateDateLiteral.Text = _media.VersionDate.ToShortDateString() + " " + _media.VersionDate.ToShortTimeString(); - this.UpdateMediaFileLinksLiteral(); - - _media.XmlGenerate(new XmlDocument()); - ClientTools.ShowSpeechBubble(speechBubbleIcon.save, ui.Text("speechBubbles", "editMediaSaved"), ui.Text("editMediaSavedText")); - ClientTools.SyncTree(_media.Path, true); - } + this._updateDateLiteral.Text = _media.VersionDate.ToShortDateString() + " " + _media.VersionDate.ToShortTimeString(); + this.UpdateMediaFileLinksLiteral(); + _media.XmlGenerate(new XmlDocument()); + ClientTools.ShowSpeechBubble(speechBubbleIcon.save, ui.Text("speechBubbles", "editMediaSaved"), ui.Text("editMediaSavedText")); + ClientTools.SyncTree(_media.Path, true); + } + } private void UpdateMediaFileLinksLiteral() { var uploadField = new Factory().GetNewObject(new Guid(Constants.PropertyEditors.UploadField)); // always clear, incase the upload file was removed - this.mediaFileLinksLiteral.Text = string.Empty; + this._mediaFileLinksLiteral.Text = string.Empty; try { @@ -143,14 +144,14 @@ namespace umbraco.cms.presentation if (properties.Any()) { - this.mediaFileLinksLiteral.Text += ""; + this._mediaFileLinksLiteral.Text += "
"; foreach (var property in properties) { - this.mediaFileLinksLiteral.Text += string.Format("", property.PropertyType.Name, property.Value); + this._mediaFileLinksLiteral.Text += string.Format("", property.PropertyType.Name, property.Value); } - this.mediaFileLinksLiteral.Text += "
{0} {1}
{0} {1}
"; + this._mediaFileLinksLiteral.Text += ""; } } catch diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs index fbe3d49c8e..8eb6d893ef 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs @@ -1,17 +1,9 @@ using System; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Web; -using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; - +using Umbraco.Core.IO; using umbraco.cms.businesslogic.member; using System.Web.Security; -using umbraco.IO; namespace umbraco.cms.presentation.members { @@ -25,11 +17,11 @@ namespace umbraco.cms.presentation.members CurrentApp = BusinessLogic.DefaultApps.member.ToString(); } protected uicontrols.TabView TabView1; - protected System.Web.UI.WebControls.TextBox documentName; - private cms.businesslogic.member.Member _document; - private MembershipUser m_Member; - controls.ContentControl tmp; - protected umbraco.uicontrols.UmbracoPanel m_MemberShipPanel = new umbraco.uicontrols.UmbracoPanel(); + protected TextBox documentName; + private Member _document; + private MembershipUser _member; + controls.ContentControl _contentControl; + protected uicontrols.UmbracoPanel m_MemberShipPanel = new uicontrols.UmbracoPanel(); protected TextBox MemberLoginNameTxt = new TextBox(); protected RequiredFieldValidator MemberLoginNameVal = new RequiredFieldValidator(); @@ -39,7 +31,7 @@ namespace umbraco.cms.presentation.members protected controls.DualSelectbox _memberGroups = new controls.DualSelectbox(); - protected void Page_Load(object sender, System.EventArgs e) + protected void Page_Load(object sender, EventArgs e) { // Add password changer @@ -47,19 +39,23 @@ namespace umbraco.cms.presentation.members if (Member.InUmbracoMemberMode()) { - _document = new cms.businesslogic.member.Member(int.Parse(Request.QueryString["id"])); - m_Member = Membership.GetUser(_document.Id); - tmp = new controls.ContentControl(_document, controls.ContentControl.publishModes.NoPublish, "TabView1"); - tmp.Width = Unit.Pixel(666); - tmp.Height = Unit.Pixel(666); - plc.Controls.Add(tmp); + _document = new Member(int.Parse(Request.QueryString["id"])); + _member = Membership.GetUser(_document.Id); + _contentControl = new controls.ContentControl(_document, controls.ContentControl.publishModes.NoPublish, "TabView1"); + _contentControl.Width = Unit.Pixel(666); + _contentControl.Height = Unit.Pixel(666); + + //this must be set to false as we don't want to proceed to save anything if the page is invalid + _contentControl.SavePropertyDataWhenInvalid = false; + + plc.Controls.Add(_contentControl); if (!IsPostBack) { MemberLoginNameTxt.Text = _document.LoginName; MemberEmail.Text = _document.Email; } - PlaceHolder ph = new PlaceHolder(); + var ph = new PlaceHolder(); MemberLoginNameTxt.ID = "loginname"; ph.Controls.Add(MemberLoginNameTxt); ph.Controls.Add(MemberLoginNameVal); @@ -69,26 +65,27 @@ namespace umbraco.cms.presentation.members MemberLoginNameVal.EnableClientScript = false; MemberLoginNameVal.Display = ValidatorDisplay.Dynamic; - tmp.PropertiesPane.addProperty(ui.Text("login"), ph); - tmp.PropertiesPane.addProperty(ui.Text("password"), MemberPasswordTxt); - tmp.PropertiesPane.addProperty("Email", MemberEmail); + _contentControl.PropertiesPane.addProperty(ui.Text("login"), ph); + _contentControl.PropertiesPane.addProperty(ui.Text("password"), MemberPasswordTxt); + _contentControl.PropertiesPane.addProperty("Email", MemberEmail); } else { - m_Member = Membership.GetUser(Request.QueryString["id"]); - MemberLoginNameTxt.Text = m_Member.UserName; + _member = Membership.GetUser(Request.QueryString["id"]); + MemberLoginNameTxt.Text = _member.UserName; if (!IsPostBack) { - MemberEmail.Text = m_Member.Email; + MemberEmail.Text = _member.Email; } m_MemberShipPanel.Width = 300; - m_MemberShipPanel.Text = ui.Text("edit") + " " + m_Member.UserName; - umbraco.uicontrols.Pane props = new umbraco.uicontrols.Pane(); + m_MemberShipPanel.Text = ui.Text("edit") + " " + _member.UserName; + var props = new uicontrols.Pane(); MemberLoginNameTxt.Enabled = false; // check for pw support - if (!Membership.Provider.EnablePasswordRetrieval) { + if (!Membership.Provider.EnablePasswordRetrieval) + { MemberPasswordTxt.Controls.Clear(); MemberPasswordTxt.Controls.Add( new LiteralControl("" + ui.Text("errorHandling", "errorChangingProviderPassword") + "")); @@ -102,20 +99,20 @@ namespace umbraco.cms.presentation.members } // Groups - umbraco.uicontrols.Pane p = new umbraco.uicontrols.Pane(); + var p = new uicontrols.Pane(); _memberGroups.ID = "Membergroups"; _memberGroups.Width = 175; - string selectedMembers = ""; - foreach(string role in Roles.GetAllRoles()) + var selectedMembers = ""; + foreach(var role in Roles.GetAllRoles()) { // if a role starts with __umbracoRole we won't show it as it's an internal role used for public access if (!role.StartsWith("__umbracoRole")) { - ListItem li = new ListItem(role); + var li = new ListItem(role); if (!IsPostBack) { - if (Roles.IsUserInRole(m_Member.UserName, role)) + if (Roles.IsUserInRole(_member.UserName, role)) selectedMembers += role + ","; } _memberGroups.Items.Add(li); @@ -127,125 +124,131 @@ namespace umbraco.cms.presentation.members if (Member.InUmbracoMemberMode()) { - tmp.tpProp.Controls.Add(p); - tmp.Save += new System.EventHandler(tmp_save); + _contentControl.tpProp.Controls.Add(p); + _contentControl.Save += new System.EventHandler(tmp_save); } else m_MemberShipPanel.Controls.Add(p); } - void menuSave_Click(object sender, ImageClickEventArgs e) + void MenuSaveClick(object sender, ImageClickEventArgs e) { tmp_save(sender, e); } - protected void tmp_save(object sender, System.EventArgs e) { - Page.Validate(); - if (Page.IsValid) - { - if (Member.InUmbracoMemberMode()) + + protected void tmp_save(object sender, EventArgs e) + { + Page.Validate(); + if (!Page.IsValid) + { + foreach (uicontrols.TabPage tp in _contentControl.GetPanels()) { - _document.LoginName = MemberLoginNameTxt.Text; - _document.Email = MemberEmail.Text; + tp.ErrorControl.Visible = true; + tp.ErrorHeader = ui.Text("errorHandling", "errorHeader"); + tp.CloseCaption = ui.Text("close"); + } + } + else + { - // Check if password should be changed - string tempPassword = ((controls.passwordChanger) MemberPasswordTxt.Controls[0]).Password; - if (tempPassword.Trim() != "") - _document.Password = tempPassword; - - // Groups - foreach (ListItem li in _memberGroups.Items) + if (Page.IsPostBack) + { + // hide validation summaries + foreach (uicontrols.TabPage tp in _contentControl.GetPanels()) { - if (("," + _memberGroups.Value + ",").IndexOf("," + li.Value + ",") > -1) - { - if (!Roles.IsUserInRole(_document.LoginName, li.Value)) - Roles.AddUserToRole(_document.LoginName, li.Value); - } - else if (Roles.IsUserInRole(_document.LoginName, li.Value)) - { - Roles.RemoveUserFromRole(_document.LoginName, li.Value); - } + tp.ErrorControl.Visible = false; + } + } + + if (Member.InUmbracoMemberMode()) + { + _document.LoginName = MemberLoginNameTxt.Text; + _document.Email = MemberEmail.Text; + + // Check if password should be changed + string tempPassword = ((controls.passwordChanger) MemberPasswordTxt.Controls[0]).Password; + if (tempPassword.Trim() != "") + _document.Password = tempPassword; + + // Groups + foreach (ListItem li in _memberGroups.Items) + { + if (("," + _memberGroups.Value + ",").IndexOf("," + li.Value + ",") > -1) + { + if (!Roles.IsUserInRole(_document.LoginName, li.Value)) + Roles.AddUserToRole(_document.LoginName, li.Value); + } + else if (Roles.IsUserInRole(_document.LoginName, li.Value)) + { + Roles.RemoveUserFromRole(_document.LoginName, li.Value); + } } //The value of the properties has been set on IData through IDataEditor in the ContentControl //so we need to 'retrieve' that value and set it on the property of the new IContent object. //NOTE This is a workaround for the legacy approach to saving values through the DataType instead of the Property //- (The DataType shouldn't be responsible for saving the value - especically directly to the db). - foreach (var item in tmp.DataTypes) + foreach (var item in _contentControl.DataTypes) { _document.getProperty(item.Key).Value = item.Value.Data.Value; } - // refresh cache - _document.XmlGenerate(new System.Xml.XmlDocument()); - _document.Save(); - } - else - { - m_Member.Email = MemberEmail.Text; - if (Membership.Provider.EnablePasswordRetrieval) - { - string tempPassword = ((controls.passwordChanger) MemberPasswordTxt.Controls[0]).Password; - if (tempPassword.Trim() != "") - m_Member.ChangePassword(m_Member.GetPassword(), tempPassword); - } - Membership.UpdateUser(m_Member); - // Groups - foreach (ListItem li in _memberGroups.Items) - if (("," + _memberGroups.Value + ",").IndexOf("," + li.Value + ",") > -1) - { - if (!Roles.IsUserInRole(m_Member.UserName, li.Value)) - Roles.AddUserToRole(m_Member.UserName, li.Value); - } - else if (Roles.IsUserInRole(m_Member.UserName, li.Value)) - { - Roles.RemoveUserFromRole(m_Member.UserName, li.Value); - } + // refresh cache + _document.XmlGenerate(new System.Xml.XmlDocument()); + _document.Save(); + } + else + { + _member.Email = MemberEmail.Text; + if (Membership.Provider.EnablePasswordRetrieval) + { + string tempPassword = ((controls.passwordChanger) MemberPasswordTxt.Controls[0]).Password; + if (tempPassword.Trim() != "") + _member.ChangePassword(_member.GetPassword(), tempPassword); + } + Membership.UpdateUser(_member); + // Groups + foreach (ListItem li in _memberGroups.Items) + if (("," + _memberGroups.Value + ",").IndexOf("," + li.Value + ",") > -1) + { + if (!Roles.IsUserInRole(_member.UserName, li.Value)) + Roles.AddUserToRole(_member.UserName, li.Value); + } + else if (Roles.IsUserInRole(_member.UserName, li.Value)) + { + Roles.RemoveUserFromRole(_member.UserName, li.Value); + } - } + } - ClientTools.ShowSpeechBubble(BasePages.BasePage.speechBubbleIcon.save, - ui.Text("speechBubbles", "editMemberSaved", base.getUser()), ""); + ClientTools.ShowSpeechBubble(speechBubbleIcon.save, ui.Text("speechBubbles", "editMemberSaved", base.getUser()), ""); } } - private umbraco.uicontrols.PropertyPanel AddProperty(string Caption, Control C) { - umbraco.uicontrols.PropertyPanel pp = new umbraco.uicontrols.PropertyPanel(); - pp.Controls.Add(C); - pp.Text = Caption; - return pp; - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) + private uicontrols.PropertyPanel AddProperty(string caption, Control c) + { + var pp = new uicontrols.PropertyPanel(); + pp.Controls.Add(c); + pp.Text = caption; + return pp; + } + + override protected void OnInit(EventArgs e) { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - - if (!Member.InUmbracoMemberMode()) { - m_MemberShipPanel.hasMenu = true; - umbraco.uicontrols.MenuImageButton menuSave = m_MemberShipPanel.Menu.NewImageButton(); - menuSave.ID = m_MemberShipPanel.ID + "_save"; - menuSave.ImageUrl = SystemDirectories.Umbraco + "/images/editor/save.gif"; - menuSave.Click += new ImageClickEventHandler(menuSave_Click); - menuSave.AltText = ui.Text("buttons", "save", null); - - } - InitializeComponent(); - base.OnInit(e); + if (!Member.InUmbracoMemberMode()) + { + m_MemberShipPanel.hasMenu = true; + umbraco.uicontrols.MenuImageButton menuSave = m_MemberShipPanel.Menu.NewImageButton(); + menuSave.ID = m_MemberShipPanel.ID + "_save"; + menuSave.ImageUrl = SystemDirectories.Umbraco + "/images/editor/save.gif"; + menuSave.Click += new ImageClickEventHandler(MenuSaveClick); + menuSave.AltText = ui.Text("buttons", "save", null); + } + base.OnInit(e); } - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - - } - #endregion } } diff --git a/src/umbraco.controls/TabPage.cs b/src/umbraco.controls/TabPage.cs index ce11d37f84..3cf43b78ab 100644 --- a/src/umbraco.controls/TabPage.cs +++ b/src/umbraco.controls/TabPage.cs @@ -10,15 +10,19 @@ using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; namespace umbraco.uicontrols { - public class TabPage : System.Web.UI.WebControls.WebControl { + + public class TabPage : WebControl + { // Ensure that a TabPage cannot be instatiated outside // this assembly -> New instances of a tabpage can only be retrieved through the tabview private bool _hasMenu = true; - private ScrollingMenu _Menu = new ScrollingMenu(); + private readonly ScrollingMenu _menu = new ScrollingMenu(); protected LiteralControl ErrorHeaderControl = new LiteralControl(); - private ValidationSummary _vs = new ValidationSummary(); - private Control _tempErr = new Control(); - internal TabPage() { + private readonly ValidationSummary _vs = new ValidationSummary(); + private readonly Control _tempErr = new Control(); + + internal TabPage() + { } @@ -29,13 +33,19 @@ namespace umbraco.uicontrols { public string ErrorHeader { get; set; } public string CloseCaption { get; set; } - public Control ErrorControl { get { return _tempErr; } } - protected override void OnLoad(EventArgs e) { - if (this.HasMenu) { - Menu.Width = System.Web.UI.WebControls.Unit.Pixel((int)this.Width.Value - 12); - _Menu.ID = this.ID + "_menu"; - this.Controls.Add(_Menu); + public Control ErrorControl + { + get { return _tempErr; } + } + + protected override void OnLoad(EventArgs e) + { + if (this.HasMenu) + { + Menu.Width = Unit.Pixel((int) this.Width.Value - 12); + _menu.ID = this.ID + "_menu"; + this.Controls.Add(_menu); } } @@ -61,42 +71,49 @@ namespace umbraco.uicontrols { } - public ScrollingMenu Menu { - get { return _Menu; } + public ScrollingMenu Menu + { + get { return _menu; } } - public bool HasMenu { + public bool HasMenu + { get { return _hasMenu; } set { _hasMenu = value; } } - protected override void Render(System.Web.UI.HtmlTextWriter writer) { + protected override void Render(HtmlTextWriter writer) + { ErrorHeaderControl.Text = ErrorHeader; CreateChildControls(); writer.WriteLine("
"); - if (HasMenu) { + if (HasMenu) + { writer.WriteLine(""); } - int ScrollingLayerHeight = (int)((System.Web.UI.WebControls.WebControl)this.Parent).Height.Value - 22; - int ScrollingLayerWidth = (int)((System.Web.UI.WebControls.WebControl)this.Parent).Width.Value; + var scrollingLayerHeight = (int) ((WebControl) this.Parent).Height.Value - 22; + var scrollingLayerWidth = (int) ((WebControl) this.Parent).Width.Value; if (HasMenu) - ScrollingLayerHeight = ScrollingLayerHeight - 28; - writer.WriteLine("
"); + scrollingLayerHeight = scrollingLayerHeight - 28; + writer.WriteLine("
"); string styleString = ""; - foreach (string key in this.Style.Keys) { + foreach (string key in this.Style.Keys) + { styleString += key + ":" + this.Style[key] + ";"; } writer.WriteLine("
"); _tempErr.RenderControl(writer); - - foreach (System.Web.UI.Control C in this.Controls) { - if (C.ClientID != _Menu.ClientID && C.ClientID != _tempErr.ClientID ) { + + foreach (Control C in this.Controls) + { + if (C.ClientID != _menu.ClientID && C.ClientID != _tempErr.ClientID) + { C.RenderControl(writer); } } diff --git a/src/umbraco.controls/TabView.cs b/src/umbraco.controls/TabView.cs index 20f8b17a04..dfd9b7f9a7 100644 --- a/src/umbraco.controls/TabView.cs +++ b/src/umbraco.controls/TabView.cs @@ -7,7 +7,6 @@ using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; using ClientDependency.Core; namespace umbraco.uicontrols { @@ -15,92 +14,102 @@ namespace umbraco.uicontrols { [ClientDependency(ClientDependencyType.Javascript, "tabview/javascript.js", "UmbracoClient")] [ClientDependency(ClientDependencyType.Css, "tabview/style.css", "UmbracoClient")] [ClientDependency(0, ClientDependencyType.Javascript, "Application/NamespaceManager.js", "UmbracoClient")] - public class TabView : System.Web.UI.WebControls.WebControl + public class TabView : WebControl { - private HtmlInputHidden tb = new HtmlInputHidden(); - private ArrayList Tabs = new ArrayList(); + private readonly ArrayList _tabs = new ArrayList(); protected ArrayList Panels = new ArrayList(); - private string status = ""; + private string _status = ""; - public ArrayList GetPanels() { - return Panels; - } + public ArrayList GetPanels() + { + return Panels; + } - public TabPage NewTabPage(string text) { - Tabs.Add(text); - TabPage tp = new TabPage(); - tp.Width = this.Width; - tp.ID = this.ID + "_tab0" + (Panels.Count + 1) + "layer"; - Panels.Add(tp); - this.Controls.Add(tp); - return tp; - } + public TabPage NewTabPage(string text) + { + _tabs.Add(text); + var tp = new TabPage(); + tp.Width = this.Width; + tp.ID = this.ID + "_tab0" + (Panels.Count + 1) + "layer"; + Panels.Add(tp); + this.Controls.Add(tp); + return tp; + } - - public string Status { - get { return status; } - set { status = value; } - } - private bool _autoResize = true; - public bool AutoResize { - get { return _autoResize; } - set { _autoResize = value; } - } + public string Status + { + get { return _status; } + set { _status = value; } + } - private string ActiveTabId { - get { - if (this.Parent.Page.IsPostBack) { - return this.Parent.Page.Request.Form[this.ClientID + "_activetab"]; - } - return this.ClientID + "_tab01"; - } - } + private bool _autoResize = true; - protected override void OnPreRender(EventArgs e) { - base.OnPreRender(e); - SetupClientScript(); - } + public bool AutoResize + { + get { return _autoResize; } + set { _autoResize = value; } + } - private void SetupClientScript() { - + private string ActiveTabId + { + get + { + if (this.Parent.Page.IsPostBack) + { + return this.Parent.Page.Request.Form[this.ClientID + "_activetab"]; + } + return this.ClientID + "_tab01"; + } + } - string strTmp = ""; - for (int i = 1; i <= Tabs.Count; i++) { - if (i > 1) - strTmp += ","; - strTmp += "\"" + this.ClientID + "_tab0" + i + "\""; - } - this.Page.ClientScript.RegisterStartupScript( - this.GetType(), - this.ClientID + "TabCollection", ";var " + this.ClientID + "_tabs = new Array(" + strTmp + ");setActiveTab('" + this.ClientID + "','" + this.ActiveTabId + "'," + this.ClientID + "_tabs);", - true); + protected override void OnPreRender(EventArgs e) + { + base.OnPreRender(e); + SetupClientScript(); + } - if (_autoResize) - this.Page.ClientScript.RegisterStartupScript(this.GetType(), "TabviewEvents", "jQuery(document).ready(function(){resizeTabView(" + this.ClientID + "_tabs, '" + this.ClientID + "'); }); jQuery(window).resize(function(){ resizeTabView(" + this.ClientID + "_tabs, '" + this.ClientID + "'); });", true); - } + private void SetupClientScript() + { + string strTmp = ""; + for (int i = 1; i <= _tabs.Count; i++) + { + if (i > 1) + strTmp += ","; + strTmp += "\"" + this.ClientID + "_tab0" + i + "\""; + } + this.Page.ClientScript.RegisterStartupScript( + this.GetType(), + this.ClientID + "TabCollection", ";var " + this.ClientID + "_tabs = new Array(" + strTmp + ");setActiveTab('" + this.ClientID + "','" + this.ActiveTabId + "'," + this.ClientID + "_tabs);", + true); - protected override void Render(HtmlTextWriter writer) { - writer.WriteLine("
"); - writer.WriteLine("
"); - writer.WriteLine(" "); - writer.WriteLine("
"); - writer.WriteLine("
"); - this.RenderChildren(writer); - writer.WriteLine("\t
"); - writer.WriteLine("\t"); - writer.WriteLine("
"); - writer.WriteLine(""); - } + if (_autoResize) + this.Page.ClientScript.RegisterStartupScript(this.GetType(), "TabviewEvents", "jQuery(document).ready(function(){resizeTabView(" + this.ClientID + "_tabs, '" + this.ClientID + "'); }); jQuery(window).resize(function(){ resizeTabView(" + this.ClientID + "_tabs, '" + this.ClientID + "'); });", true); + } + + protected override void Render(HtmlTextWriter writer) + { + writer.WriteLine("
"); + writer.WriteLine("
"); + writer.WriteLine(" "); + writer.WriteLine("
"); + writer.WriteLine("
"); + this.RenderChildren(writer); + writer.WriteLine("\t
"); + writer.WriteLine("\t"); + writer.WriteLine("
"); + writer.WriteLine(""); + } } } \ No newline at end of file