From 6f85eefd85a2faae029fcfe85dbce83fb419798a Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Wed, 19 Jun 2013 14:39:21 +0200 Subject: [PATCH 1/9] updated ignore file with correct case sensitivity Conflicts: .gitignore --- .gitignore | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 339279d0f5..38d41211d5 100644 --- a/.gitignore +++ b/.gitignore @@ -23,11 +23,11 @@ _NCrunch_*/ umbraco.config *.vs10x App_Data/TEMP/* -umbraco/presentation/umbraco/plugins/* -umbraco/presentation/usercontrols/* -umbraco/presentation/scripts/* -umbraco/presentation/fonts/* -umbraco/presentation/css/* +[Uu]mbraco/[Pp]resentation/[Uu]mbraco/[Pp]lugins/* +[Uu]mbraco/[Pp]resentation/[Uu]ser[Cc]ontrols/* +[Uu]mbraco/[Pp]resentation/[Ss]cripts/* +[Uu]mbraco/[Pp]resentation/[Ff]onts/* +[Uu]mbraco/[Pp]resentation/[Cc]ss/* src/Umbraco.Web.UI/[Cc]ss/* src/Umbraco.Web.UI/App_Code/* @@ -44,7 +44,6 @@ src/Umbraco.Web.UI/Web.*.config.transformed umbraco/presentation/umbraco/plugins/uComponents/uComponentsInstaller.ascx umbraco/presentation/packages/uComponents/MultiNodePicker/CustomTreeService.asmx _BuildOutput/* -*.ncrunchsolution build/UmbracoCms.AllBinaries*zip build/UmbracoCms.WebPI*zip build/UmbracoCms*zip @@ -54,14 +53,28 @@ src/Umbraco.Tests/config/trees.config src/Umbraco.Web.UI/web.config *.orig src/Umbraco.Tests/config/404handlers.config -src/Umbraco.Web.UI/Views/*.cshtml -src/Umbraco.Web.UI/Views/*.vbhtml -src/Umbraco.Tests/config/umbracoSettings.config -src/Umbraco.Web.UI/App_Plugins/* -src/Umbraco.Web.UI/Views/* +src/Umbraco.Web.UI/[Vv]iews/*.cshtml +src/Umbraco.Web.UI/[Vv]iews/*.vbhtml +src/Umbraco.Tests/[Cc]onfig/umbracoSettings.config +src/Umbraco.Web.UI/[Vv]iews/* src/packages/ src/packages/repositories.config -src/Umbraco.Web.UI/[W]eb.config +src/Umbraco.Web.UI/[Ww]eb.config *.transformed -webpihash.txt \ No newline at end of file +webpihash.txt + +node_modules +src/Umbraco.Web.UI/[Uu]mbraco/[Ll]ib/* +src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/umbraco.* +src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/routes.js +src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/main.js +src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/app.js +src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.js +src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.css +src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.html +src/Umbraco.Web.UI/[Uu]mbraco/[Aa]ssets/* +src/Umbraco.Web.UI.Client/[Bb]uild/* +src/Umbraco.Web.UI.Client/[Bb]uild/[Bb]elle/ +src/Umbraco.Web.UI/[Uu]ser[Cc]ontrols/ +build/_BuildOutput/ From febe6ec2410ed071c64398d42644300bc0f7449f Mon Sep 17 00:00:00 2001 From: Stefan Kip Date: Thu, 20 Jun 2013 14:56:39 +0200 Subject: [PATCH 2/9] Removed space before UmbracoModule Removed space before UmbracoModule --- src/Umbraco.Web.UI/web.Template.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI/web.Template.config b/src/Umbraco.Web.UI/web.Template.config index c0e24992f3..db376cb516 100644 --- a/src/Umbraco.Web.UI/web.Template.config +++ b/src/Umbraco.Web.UI/web.Template.config @@ -190,7 +190,7 @@ - + @@ -290,4 +290,4 @@ - \ No newline at end of file + From 0b0fb92cf13e02bcfeb0d7ea74c3ee0e9176791d Mon Sep 17 00:00:00 2001 From: Michiel van Oosterhout Date: Thu, 20 Jun 2013 16:01:03 +0200 Subject: [PATCH 3/9] Changed default user email address to use the example domain, instead of domain.com --- src/Umbraco.Web.UI/install/steps/defaultUser.ascx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI/install/steps/defaultUser.ascx b/src/Umbraco.Web.UI/install/steps/defaultUser.ascx index 5ada28686d..4d8f90faa9 100644 --- a/src/Umbraco.Web.UI/install/steps/defaultUser.ascx +++ b/src/Umbraco.Web.UI/install/steps/defaultUser.ascx @@ -33,7 +33,7 @@
Email: - +
From d3562b797e96088e027b03c484e64401cc7218ed Mon Sep 17 00:00:00 2001 From: AndyButland Date: Thu, 20 Jun 2013 15:14:07 +0200 Subject: [PATCH 4/9] Back-office UI for change of document type for content item --- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 10 + .../config/ClientDependency.config | 2 +- src/Umbraco.Web.UI/umbraco/config/lang/en.xml | 18 ++ .../umbraco/config/lang/en_us.xml | 18 ++ .../umbraco/dialogs/ChangeDocType.aspx | 113 +++++++ .../umbraco/dialogs/ChangeDocType.aspx.cs | 279 ++++++++++++++++++ .../dialogs/ChangeDocType.aspx.designer.cs | 186 ++++++++++++ .../Application/UmbracoApplicationActions.js | 9 + .../umbraco_client/Tree/menuIcons.css | 7 +- .../umbraco_client/Tree/sprites.png | Bin 12301 -> 12897 bytes src/Umbraco.Web/Umbraco.Web.csproj | 12 +- .../umbraco/Trees/loadContent.cs | 2 + .../Actions/ActionChangeDocType.cs | 94 ++++++ src/umbraco.cms/umbraco.cms.csproj | 1 + 14 files changed, 743 insertions(+), 8 deletions(-) create mode 100644 src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx create mode 100644 src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs create mode 100644 src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.designer.cs create mode 100644 src/umbraco.cms/Actions/ActionChangeDocType.cs diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index b1d094a1b3..4b6679c49c 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -330,6 +330,13 @@ editPython.aspx + + ChangeDocType.aspx + ASPXCodeBehind + + + ChangeDocType.aspx + EditMacro.aspx ASPXCodeBehind @@ -503,6 +510,9 @@ + + ASPXCodeBehind + diff --git a/src/Umbraco.Web.UI/config/ClientDependency.config b/src/Umbraco.Web.UI/config/ClientDependency.config index 936b7e6332..99957f0fa8 100644 --- a/src/Umbraco.Web.UI/config/ClientDependency.config +++ b/src/Umbraco.Web.UI/config/ClientDependency.config @@ -10,7 +10,7 @@ NOTES: * Compression/Combination/Minification is not enabled unless debug="false" is specified on the 'compiliation' element in the web.config * A new version will invalidate both client and server cache and create new persisted files --> - + diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index 004794145b..17a4e991df 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -8,6 +8,7 @@ Manage hostnames Audit Trail Browse Node + Change Document Type Copy Create Create Package @@ -80,6 +81,23 @@ Show styles Insert table + + To change the document type for the selected content, first select from the list of valid types for this location. + Then confirm and/or amend the mapping of properties from the current type to the new, and click Save. + Current Property + Current type + The document type cannot be changed, as there are no alternatives valid for this location. + Map Properties + Map to Property + New Template + New Type + none + Content + Select New Document Type + The document type of the selected content has been successfully changed and the properties mapped. + Could not complete property mapping as one or more properties have more than one mapping defined. + Only alternate types valid for the current location are displayed. + About this page Alias diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml index 87e904e5c3..00705ebda7 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml @@ -8,6 +8,7 @@ Manage hostnames Audit Trail Browse Node + Change Document Type Copy Create Create Package @@ -79,6 +80,23 @@ Show styles Insert table + + To change the document type for the selected content, first select from the list of valid types for this location. + Then confirm and/or amend the mapping of properties from the current type to the new, and click Save. + Current Property + Current type + The document type cannot be changed, as there are no alternatives valid for this location. + Map Properties + Map to Property + New Template + New Type + none + Content + Select New Document Type + The document type of the selected content has been successfully changed and the properties mapped. + Could not complete property mapping as one or more properties have more than one mapping defined. + Only alternate types valid for the current location are displayed. + About this page Alias diff --git a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx new file mode 100644 index 0000000000..28d3080cc1 --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx @@ -0,0 +1,113 @@ +<%@ Page Language="c#" MasterPageFile="../masterpages/umbracoDialog.Master"Codebehind="ChangeDocType.aspx.cs" AutoEventWireup="True" Inherits="Umbraco.Web.UI.Umbraco.Dialogs.ChangeDocType" %> +<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %> +<%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %> + + + + + + + + + + +

+ <%= umbraco.ui.Text("changeDocType", "changeDocTypeInstruction") %> +

+ + + + + + + + + + + + +
<%=umbraco.ui.Text("changeDocType", "validDocTypesNote") %> +
+ + + + + + +
+

<%=umbraco.ui.Text("changeDocType", "docTypeCannotBeChanged") %>

+
+
+ + + +

+ <%= umbraco.ui.Text("changeDocType", "changeDocTypeInstruction2") %> +

+ + + + + + + + + + + + + + + + + + +
<%= umbraco.ui.Text("changeDocType", "currentProperty") %><%= umbraco.ui.Text("changeDocType", "mapToProperty") %>
+ <%# DataBinder.Eval(Container, "DataItem.Name") %> + + +
+ +
+
+ + +
+
+ <%=umbraco.ui.Text("changeDocType", "successMessage") %> +

+ <%=umbraco.ui.Text("defaultdialogs", "closeThisWindow") %> +
+
+ + +
+
+ +
+
+ + +
+

+ + + <%= umbraco.ui.Text("or") %> + + <%=umbraco.ui.Text("general", "cancel", this.getUser())%> +

+
+ +
+ \ No newline at end of file diff --git a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs new file mode 100644 index 0000000000..69411c276e --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs @@ -0,0 +1,279 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web.UI; +using System.Web.UI.WebControls; +using umbraco.BasePages; +using Umbraco.Core; +using Umbraco.Core.Models; + +namespace Umbraco.Web.UI.Umbraco.Dialogs +{ + public partial class ChangeDocType : UmbracoEnsuredPage + { + private IContent _content; + + protected void Page_Load(object sender, EventArgs e) + { + var contentNodeId = int.Parse(Request.QueryString["id"]); + _content = ApplicationContext.Current.Services.ContentService.GetById(contentNodeId); + + LocalizeTexts(); + + if (!Page.IsPostBack) + { + DisplayContentDetails(); + if (PopulateListOfValidAlternateDocumentTypes()) + { + PopulateListOfTemplates(); + PopulatePropertyMappingWithSources(); + PopulatePropertyMappingWithDestinations(); + } + else + { + DisplayNotAvailable(); + } + } + } + + private void LocalizeTexts() + { + ChangeDocTypePane.Text = global::umbraco.ui.Text("changeDocType", "selectNewDocType"); + ContentNamePropertyPanel.Text = global::umbraco.ui.Text("changeDocType", "selectedContent"); + CurrentTypePropertyPanel.Text = global::umbraco.ui.Text("changeDocType", "currentType"); + NewTypePropertyPanel.Text = global::umbraco.ui.Text("changeDocType", "newType"); + NewTemplatePropertyPanel.Text = global::umbraco.ui.Text("changeDocType", "newTemplate"); + ChangeDocTypePropertyMappingPane.Text = global::umbraco.ui.Text("changeDocType", "mapProperties"); + ValidateAndSave.Text = global::umbraco.ui.Text("buttons", "save"); + } + + private void DisplayContentDetails() + { + ContentNameLabel.Text = _content.Name; + CurrentTypeLabel.Text = _content.ContentType.Name; + } + + private bool PopulateListOfValidAlternateDocumentTypes() + { + // Get all content types + var documentTypes = ApplicationContext.Current.Services.ContentTypeService.GetAllContentTypes(); + + // Save a flag if the allowed at root option has been set for any document types (if not, then all are allowed there) + var haveTypesAllowedAtRootBeenDefined = documentTypes.Any(x => x.AllowedAsRoot); + + // Remove current one + documentTypes = documentTypes.Where(x => x.Id != _content.ContentType.Id); + + // Remove any not valid for current location + if (_content.ParentId == -1 && haveTypesAllowedAtRootBeenDefined) + { + // Root content, and at least one type has been defined as allowed at root, so only include those that have + // been selected as allowed + documentTypes = documentTypes.Where(x => x.AllowedAsRoot); + } + else + { + // Below root, so only include those allowed as sub-nodes for the parent + var parentNode = ApplicationContext.Current.Services.ContentService.GetById(_content.ParentId); + documentTypes = documentTypes.Where(x => parentNode.ContentType.AllowedContentTypes + .Select(y => y.Id.Value) + .Contains(x.Id)); + } + + // If we have at least one, bind to list and return true + if (documentTypes.Any()) + { + NewDocumentTypeList.DataSource = documentTypes.OrderBy(x => x.Name); + NewDocumentTypeList.DataValueField = "Id"; + NewDocumentTypeList.DataTextField = "Name"; + NewDocumentTypeList.DataBind(); + return true; + } + + return false; + } + + private void PopulateListOfTemplates() + { + // Get selected new document type + var contentType = GetSelectedDocumentType(); + + // Populate template list + NewTemplateList.DataSource = contentType.AllowedTemplates; + NewTemplateList.DataValueField = "Id"; + NewTemplateList.DataTextField = "Name"; + NewTemplateList.DataBind(); + NewTemplateList.Items.Add(new ListItem("<" + global::umbraco.ui.Text("changeDocType", "none") + ">", "0")); + + // Set default template + if (contentType.DefaultTemplate != null) + { + var itemToSelect = NewTemplateList.Items.FindByValue(contentType.DefaultTemplate.Id.ToString()); + if (itemToSelect != null) + { + itemToSelect.Selected = true; + } + } + } + + private void PopulatePropertyMappingWithSources() + { + PropertyMappingRepeater.DataSource = _content.ContentType.PropertyTypes; + PropertyMappingRepeater.DataBind(); + } + + private void PopulatePropertyMappingWithDestinations() + { + // Get selected new document type + var contentType = GetSelectedDocumentType(); + + // Loop through list of source properties and populate destination options with all those of same property type + foreach (RepeaterItem ri in PropertyMappingRepeater.Items) + { + if (ri.ItemType == ListItemType.Item || ri.ItemType == ListItemType.AlternatingItem) + { + // Get data type from hidden field + var dataTypeId = Guid.Parse(((HiddenField)ri.FindControl("DataTypeId")).Value); + + // Bind destination list with properties that match data type + var ddl = (DropDownList)ri.FindControl("DestinationProperty"); + ddl.DataSource = contentType.PropertyTypes.Where(x => x.DataTypeId == dataTypeId); + ddl.DataValueField = "Alias"; + ddl.DataTextField = "Name"; + ddl.DataBind(); + ddl.Items.Add(new ListItem("<" + global::umbraco.ui.Text("changeDocType", "none") + ">", string.Empty)); + + // Set default selection to be one with matching alias + var alias = ((HiddenField)ri.FindControl("Alias")).Value; + var item = ddl.Items.FindByValue(alias); + if (item != null) + { + item.Selected = true; + } + } + } + } + + private IContentType GetSelectedDocumentType() + { + return ApplicationContext.Current.Services.ContentTypeService.GetContentType(int.Parse(NewDocumentTypeList.SelectedItem.Value)); + } + + private void DisplayNotAvailable() + { + NewTypePropertyPanel.Visible = false; + NewTemplatePropertyPanel.Visible = false; + SavePlaceholder.Visible = false; + NotAvailablePlaceholder.Visible = true; + } + + protected void NewDocumentTypeList_SelectedIndexChanged(object sender, EventArgs e) + { + PopulateListOfTemplates(); + PopulatePropertyMappingWithDestinations(); + } + + protected void ValidateAndSave_Click(object sender, EventArgs e) + { + if (IsPropertyMappingValid()) + { + // For all properties to be mapped, save the values to a temporary list + var propertyValues = SaveMappedPropertyValues(); + + // Get flag for if content already published + var wasPublished = _content.Published; + + // Change the document type + var newContentType = GetSelectedDocumentType(); + _content.ChangeContentType(newContentType); + + // Set the template if one has been selected + if (NewTemplateList.SelectedItem != null) + { + var templateId = int.Parse(NewTemplateList.SelectedItem.Value); + if (templateId > 0) + { + var template = ApplicationContext.Current.Services.FileService.GetTemplate(templateId); + _content.Template = template; + } + } + + // Set the property values + foreach (var propertyValue in propertyValues) + { + _content.SetValue(propertyValue.Key, propertyValue.Value); + } + + // Save + var user = global::umbraco.BusinessLogic.User.GetCurrent(); + ApplicationContext.Current.Services.ContentService.Save(_content, user.Id); + + // Publish if the content was already published + if (wasPublished) + { + ApplicationContext.Current.Services.ContentService.Publish(_content, user.Id); + } + + SuccessPlaceholder.Visible = true; + SaveAndCancelPlaceholder.Visible = false; + ValidationPlaceholder.Visible = false; + } + else + { + ValidationPlaceholder.Visible = true; + } + } + + private bool IsPropertyMappingValid() + { + // Check whether any properties have been mapped to more than once + var mappedPropertyAliases = new List(); + foreach (RepeaterItem ri in PropertyMappingRepeater.Items) + { + if (ri.ItemType == ListItemType.Item || ri.ItemType == ListItemType.AlternatingItem) + { + var ddl = (DropDownList)ri.FindControl("DestinationProperty"); + var mappedPropertyAlias = ddl.SelectedItem.Value; + if (!string.IsNullOrEmpty(mappedPropertyAlias)) + { + if (mappedPropertyAliases.Contains(mappedPropertyAlias)) + { + ValidationError.Text = global::umbraco.ui.Text("changeDocType", "validationErrorPropertyWithMoreThanOneMapping"); + return false; + } + + mappedPropertyAliases.Add(mappedPropertyAlias); + } + } + } + + return true; + } + + private IList> SaveMappedPropertyValues() + { + // Create list of mapped property values for assignment after the document type is changed + var mappedPropertyValues = new List>(); + foreach (RepeaterItem ri in PropertyMappingRepeater.Items) + { + if (ri.ItemType == ListItemType.Item || ri.ItemType == ListItemType.AlternatingItem) + { + // Get property alias to map to + var ddl = (DropDownList)ri.FindControl("DestinationProperty"); + var mappedAlias = ddl.SelectedItem.Value; + if (!string.IsNullOrEmpty(mappedAlias)) + { + // If mapping property, get current property value from alias + var sourceAlias = ((HiddenField)ri.FindControl("Alias")).Value; + var sourcePropertyValue = _content.GetValue(sourceAlias); + + // Add to list + mappedPropertyValues.Add(new KeyValuePair(mappedAlias, sourcePropertyValue)); + } + } + } + + return mappedPropertyValues; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.designer.cs b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.designer.cs new file mode 100644 index 0000000000..4d419b3af4 --- /dev/null +++ b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.designer.cs @@ -0,0 +1,186 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Umbraco.Web.UI.Umbraco.Dialogs { + + + public partial class ChangeDocType { + + /// + /// ChangeDocTypePane control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::umbraco.uicontrols.Pane ChangeDocTypePane; + + /// + /// ContentNamePropertyPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::umbraco.uicontrols.PropertyPanel ContentNamePropertyPanel; + + /// + /// ContentNameLabel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label ContentNameLabel; + + /// + /// CurrentTypePropertyPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::umbraco.uicontrols.PropertyPanel CurrentTypePropertyPanel; + + /// + /// CurrentTypeLabel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Label CurrentTypeLabel; + + /// + /// NewTypePropertyPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::umbraco.uicontrols.PropertyPanel NewTypePropertyPanel; + + /// + /// NewDocumentTypeList control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DropDownList NewDocumentTypeList; + + /// + /// NewDocumentTypeValidator control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator NewDocumentTypeValidator; + + /// + /// NewTemplatePropertyPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::umbraco.uicontrols.PropertyPanel NewTemplatePropertyPanel; + + /// + /// NewTemplateList control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DropDownList NewTemplateList; + + /// + /// NotAvailablePlaceholder control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.PlaceHolder NotAvailablePlaceholder; + + /// + /// ChangeDocTypePropertyMappingPane control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::umbraco.uicontrols.Pane ChangeDocTypePropertyMappingPane; + + /// + /// PropertyMappingRepeater control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Repeater PropertyMappingRepeater; + + /// + /// SuccessPlaceholder control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.PlaceHolder SuccessPlaceholder; + + /// + /// ValidationPlaceholder control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.PlaceHolder ValidationPlaceholder; + + /// + /// ValidationError control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal ValidationError; + + /// + /// SaveAndCancelPlaceholder control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.PlaceHolder SaveAndCancelPlaceholder; + + /// + /// SavePlaceholder control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.PlaceHolder SavePlaceholder; + + /// + /// ValidateAndSave control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button ValidateAndSave; + } +} diff --git a/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoApplicationActions.js b/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoApplicationActions.js index 933ba3b5b0..97420b9053 100644 --- a/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoApplicationActions.js +++ b/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoApplicationActions.js @@ -181,6 +181,15 @@ Umbraco.Application.Actions = function () { }, + actionChangeDocType: function () { + /// + + if (UmbClientMgr.mainTree().getActionNode().nodeId != '0' && UmbClientMgr.mainTree().getActionNode().nodeType != '') { + UmbClientMgr.openModalWindow("dialogs/changeDocType.aspx?id=" + UmbClientMgr.mainTree().getActionNode().nodeId + '&app=' + this._currApp + '&rnd=' + this._utils.generateRandom(), uiKeys['actions_changeDocType'], true, 600, 600); + } + + }, + actionRights: function () { /// diff --git a/src/Umbraco.Web.UI/umbraco_client/Tree/menuIcons.css b/src/Umbraco.Web.UI/umbraco_client/Tree/menuIcons.css index 680c4a0296..9cbe7c96d5 100644 --- a/src/Umbraco.Web.UI/umbraco_client/Tree/menuIcons.css +++ b/src/Umbraco.Web.UI/umbraco_client/Tree/menuIcons.css @@ -105,8 +105,11 @@ { background-position: -7px -207px; } - .sprLiveEdit { background-position: -7px -706px; -} \ No newline at end of file +} +.sprChangeDocType +{ + background-position: -12px -741px; +} \ No newline at end of file diff --git a/src/Umbraco.Web.UI/umbraco_client/Tree/sprites.png b/src/Umbraco.Web.UI/umbraco_client/Tree/sprites.png index 8a3ed9b934e88ab3a1ac7c6b75629a865f32c233..820942c9632271016835078addc851b21d2b3eb2 100644 GIT binary patch literal 12897 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 Vh2k9j_m2paytJ}Zm4tEd{{yXv`x5{F literal 12301 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 diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 21fa2d97bb..99195c14f5 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -420,9 +420,9 @@ ASPXCodeBehind - - ASPXCodeBehind - + + ASPXCodeBehind + ASPXCodeBehind @@ -1941,7 +1941,7 @@ ASPXCodeBehind - + ASPXCodeBehind @@ -2038,7 +2038,9 @@ ASPXCodeBehind - + + ASPXCodeBehind + diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadContent.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadContent.cs index f34a5365c8..8972665520 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadContent.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadContent.cs @@ -115,6 +115,8 @@ namespace umbraco actions.Add(ActionSort.Instance); actions.Add(ActionRollback.Instance); actions.Add(ContextMenuSeperator.Instance); + actions.Add(ActionChangeDocType.Instance); + actions.Add(ContextMenuSeperator.Instance); actions.Add(ActionPublish.Instance); actions.Add(ActionToPublish.Instance); actions.Add(ActionAssignDomain.Instance); diff --git a/src/umbraco.cms/Actions/ActionChangeDocType.cs b/src/umbraco.cms/Actions/ActionChangeDocType.cs new file mode 100644 index 0000000000..dee4d53607 --- /dev/null +++ b/src/umbraco.cms/Actions/ActionChangeDocType.cs @@ -0,0 +1,94 @@ +using System; +using umbraco.interfaces; +using umbraco.BasePages; + +namespace umbraco.BusinessLogic.Actions +{ + /// + /// This action is invoked when the document type of a piece of content is changed + /// + public class ActionChangeDocType : IAction + { + //create singleton +#pragma warning disable 612,618 + private static readonly ActionChangeDocType m_instance = new ActionChangeDocType(); +#pragma warning restore 612,618 + + /// + /// A public constructor exists ONLY for backwards compatibility in regards to 3rd party add-ons. + /// All Umbraco assemblies should use the singleton instantiation (this.Instance) + /// When this applicatio is refactored, this constuctor should be made private. + /// + [Obsolete("Use the singleton instantiation instead of a constructor")] + public ActionChangeDocType() { } + + public static ActionChangeDocType Instance + { + get { return m_instance; } + } + + #region IAction Members + + public char Letter + { + get + { + + return '7'; + } + } + + public string JsFunctionName + { + get + { + return string.Format("{0}.actionChangeDocType()", ClientTools.Scripts.GetAppActions); + } + } + + public string JsSource + { + get + { + + return null; + } + } + + public string Alias + { + get + { + + return "changeDocType"; + } + } + + public string Icon + { + get + { + + return ".sprChangeDocType"; + } + } + + public bool ShowInNotifier + { + get + { + + return true; + } + } + public bool CanBePermissionAssigned + { + get + { + + return true; + } + } + #endregion + } +} diff --git a/src/umbraco.cms/umbraco.cms.csproj b/src/umbraco.cms/umbraco.cms.csproj index 29e453ebac..22f3fb4d83 100644 --- a/src/umbraco.cms/umbraco.cms.csproj +++ b/src/umbraco.cms/umbraco.cms.csproj @@ -174,6 +174,7 @@ + From 9c23bbd87ac0a6af1f93d23a8009d700746510fe Mon Sep 17 00:00:00 2001 From: AndyButland Date: Thu, 27 Jun 2013 21:44:53 +0200 Subject: [PATCH 5/9] Minor styling improvements --- src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx | 5 +++-- src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx index 28d3080cc1..c880393c2e 100644 --- a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx +++ b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx @@ -45,8 +45,9 @@ -
-

<%=umbraco.ui.Text("changeDocType", "docTypeCannotBeChanged") %>

+
+

<%=umbraco.ui.Text("changeDocType", "docTypeCannotBeChanged") %>

+
diff --git a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs index 69411c276e..ebb8dba62c 100644 --- a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs +++ b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs @@ -165,6 +165,7 @@ namespace Umbraco.Web.UI.Umbraco.Dialogs NewTemplatePropertyPanel.Visible = false; SavePlaceholder.Visible = false; NotAvailablePlaceholder.Visible = true; + ChangeDocTypePropertyMappingPane.Visible = false; } protected void NewDocumentTypeList_SelectedIndexChanged(object sender, EventArgs e) From 3ecd564c5793982535d10a9b3957b0c14d96982c Mon Sep 17 00:00:00 2001 From: AndyButland Date: Thu, 27 Jun 2013 21:49:06 +0200 Subject: [PATCH 6/9] Sync tree once document type changed --- src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs index ebb8dba62c..41a07efb42 100644 --- a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs +++ b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs @@ -215,6 +215,9 @@ namespace Umbraco.Web.UI.Umbraco.Dialogs ApplicationContext.Current.Services.ContentService.Publish(_content, user.Id); } + // Sync the tree + ClientTools.SyncTree(_content.Path, true); + SuccessPlaceholder.Visible = true; SaveAndCancelPlaceholder.Visible = false; ValidationPlaceholder.Visible = false; From 9d0f544840eac196ab4053b5e668e08fcb5aeb7d Mon Sep 17 00:00:00 2001 From: AndyButland Date: Thu, 27 Jun 2013 22:24:10 +0200 Subject: [PATCH 7/9] Handled inherited properties on source and destination side --- .../umbraco/dialogs/ChangeDocType.aspx.cs | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs index 41a07efb42..a6eb60a92e 100644 --- a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs +++ b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs @@ -118,7 +118,7 @@ namespace Umbraco.Web.UI.Umbraco.Dialogs private void PopulatePropertyMappingWithSources() { - PropertyMappingRepeater.DataSource = _content.ContentType.PropertyTypes; + PropertyMappingRepeater.DataSource = GetPropertiesOfContentType(_content.ContentType); PropertyMappingRepeater.DataBind(); } @@ -127,6 +127,9 @@ namespace Umbraco.Web.UI.Umbraco.Dialogs // Get selected new document type var contentType = GetSelectedDocumentType(); + // Get properties of new document type (including any from parent types) + var properties = GetPropertiesOfContentType(contentType); + // Loop through list of source properties and populate destination options with all those of same property type foreach (RepeaterItem ri in PropertyMappingRepeater.Items) { @@ -134,10 +137,10 @@ namespace Umbraco.Web.UI.Umbraco.Dialogs { // Get data type from hidden field var dataTypeId = Guid.Parse(((HiddenField)ri.FindControl("DataTypeId")).Value); - + // Bind destination list with properties that match data type var ddl = (DropDownList)ri.FindControl("DestinationProperty"); - ddl.DataSource = contentType.PropertyTypes.Where(x => x.DataTypeId == dataTypeId); + ddl.DataSource = properties.Where(x => x.DataTypeId == dataTypeId); ddl.DataValueField = "Alias"; ddl.DataTextField = "Name"; ddl.DataBind(); @@ -159,6 +162,18 @@ namespace Umbraco.Web.UI.Umbraco.Dialogs return ApplicationContext.Current.Services.ContentTypeService.GetContentType(int.Parse(NewDocumentTypeList.SelectedItem.Value)); } + private IEnumerable GetPropertiesOfContentType(IContentType contentType) + { + var properties = contentType.PropertyTypes.ToList(); + while (contentType.ParentId > -1) + { + contentType = ApplicationContext.Current.Services.ContentTypeService.GetContentType(contentType.ParentId); + properties.AddRange(contentType.PropertyTypes); + } + + return properties.OrderBy(x => x.Name); + } + private void DisplayNotAvailable() { NewTypePropertyPanel.Visible = false; From aaec90e47a18e038cc2474a0117b3a130fb8ae34 Mon Sep 17 00:00:00 2001 From: AndyButland Date: Sat, 29 Jun 2013 21:54:48 +0200 Subject: [PATCH 8/9] Used override on change document type to clear properties; display of summary on completion --- src/Umbraco.Web.UI/umbraco/config/lang/en.xml | 6 ++- .../umbraco/dialogs/ChangeDocType.aspx | 5 +- .../umbraco/dialogs/ChangeDocType.aspx.cs | 52 +++++++++++++++---- .../dialogs/ChangeDocType.aspx.designer.cs | 27 ++++++++++ 4 files changed, 77 insertions(+), 13 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index 17a4e991df..6512773c1b 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -84,6 +84,7 @@ To change the document type for the selected content, first select from the list of valid types for this location. Then confirm and/or amend the mapping of properties from the current type to the new, and click Save. + The content has been re-published. Current Property Current type The document type cannot be changed, as there are no alternatives valid for this location. @@ -91,10 +92,11 @@ Map to Property New Template New Type - none + none Content Select New Document Type - The document type of the selected content has been successfully changed and the properties mapped. + The document type of the selected content has been successfully changed to [new type] and the following properties mapped: + to Could not complete property mapping as one or more properties have more than one mapping defined. Only alternate types valid for the current location are displayed. diff --git a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx index c880393c2e..b5625e4ee6 100644 --- a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx +++ b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx @@ -72,6 +72,7 @@ <%# DataBinder.Eval(Container, "DataItem.Name") %> + @@ -86,7 +87,9 @@
- <%=umbraco.ui.Text("changeDocType", "successMessage") %> + + +

<%=umbraco.ui.Text("defaultdialogs", "closeThisWindow") %>
diff --git a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs index a6eb60a92e..e794f1e76e 100644 --- a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs +++ b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text; using System.Web.UI; using System.Web.UI.WebControls; using umbraco.BasePages; @@ -11,6 +12,14 @@ namespace Umbraco.Web.UI.Umbraco.Dialogs { public partial class ChangeDocType : UmbracoEnsuredPage { + class PropertyMapping + { + public string FromName { get; set; } + public string ToName { get; set; } + public string ToAlias { get; set; } + public object Value { get; set; } + } + private IContent _content; protected void Page_Load(object sender, EventArgs e) @@ -194,14 +203,14 @@ namespace Umbraco.Web.UI.Umbraco.Dialogs if (IsPropertyMappingValid()) { // For all properties to be mapped, save the values to a temporary list - var propertyValues = SaveMappedPropertyValues(); + var propertyMappings = SavePropertyMappings(); // Get flag for if content already published var wasPublished = _content.Published; - // Change the document type + // Change the document type passing flag to clear the properties var newContentType = GetSelectedDocumentType(); - _content.ChangeContentType(newContentType); + _content.ChangeContentType(newContentType, true); // Set the template if one has been selected if (NewTemplateList.SelectedItem != null) @@ -209,16 +218,19 @@ namespace Umbraco.Web.UI.Umbraco.Dialogs var templateId = int.Parse(NewTemplateList.SelectedItem.Value); if (templateId > 0) { - var template = ApplicationContext.Current.Services.FileService.GetTemplate(templateId); - _content.Template = template; + _content.Template = ApplicationContext.Current.Services.FileService.GetTemplate(templateId); } } // Set the property values - foreach (var propertyValue in propertyValues) + var propertiesMappedMessageBuilder = new StringBuilder("
    "); + foreach (var propertyMapping in propertyMappings) { - _content.SetValue(propertyValue.Key, propertyValue.Value); + propertiesMappedMessageBuilder.AppendFormat("
  • {0} {1} {2}
  • ", + propertyMapping.FromName, global::umbraco.ui.Text("changeDocType", "to"), propertyMapping.ToName); + _content.SetValue(propertyMapping.ToAlias, propertyMapping.Value); } + propertiesMappedMessageBuilder.Append("
"); // Save var user = global::umbraco.BusinessLogic.User.GetCurrent(); @@ -233,9 +245,23 @@ namespace Umbraco.Web.UI.Umbraco.Dialogs // Sync the tree ClientTools.SyncTree(_content.Path, true); + // Display success message + SuccessMessage.Text = global::umbraco.ui.Text("changeDocType", "successMessage").Replace("[new type]", "" + newContentType.Name + ""); + PropertiesMappedMessage.Text = propertiesMappedMessageBuilder.ToString(); + if (wasPublished) + { + ContentPublishedMessage.Text = global::umbraco.ui.Text("changeDocType", "contentRepublished"); + ContentPublishedMessage.Visible = true; + } + else + { + ContentPublishedMessage.Visible = false; + } SuccessPlaceholder.Visible = true; SaveAndCancelPlaceholder.Visible = false; ValidationPlaceholder.Visible = false; + ChangeDocTypePane.Visible = false; + ChangeDocTypePropertyMappingPane.Visible = false; } else { @@ -269,10 +295,10 @@ namespace Umbraco.Web.UI.Umbraco.Dialogs return true; } - private IList> SaveMappedPropertyValues() + private IList SavePropertyMappings() { // Create list of mapped property values for assignment after the document type is changed - var mappedPropertyValues = new List>(); + var mappedPropertyValues = new List(); foreach (RepeaterItem ri in PropertyMappingRepeater.Items) { if (ri.ItemType == ListItemType.Item || ri.ItemType == ListItemType.AlternatingItem) @@ -287,7 +313,13 @@ namespace Umbraco.Web.UI.Umbraco.Dialogs var sourcePropertyValue = _content.GetValue(sourceAlias); // Add to list - mappedPropertyValues.Add(new KeyValuePair(mappedAlias, sourcePropertyValue)); + mappedPropertyValues.Add(new PropertyMapping + { + FromName = ((HiddenField)ri.FindControl("Name")).Value, + ToName = ddl.SelectedItem.Text, + ToAlias = mappedAlias, + Value = sourcePropertyValue + }); } } } diff --git a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.designer.cs b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.designer.cs index 4d419b3af4..c49801294e 100644 --- a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.designer.cs +++ b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.designer.cs @@ -138,6 +138,33 @@ namespace Umbraco.Web.UI.Umbraco.Dialogs { /// protected global::System.Web.UI.WebControls.PlaceHolder SuccessPlaceholder; + /// + /// SuccessMessage control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal SuccessMessage; + + /// + /// PropertiesMappedMessage control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal PropertiesMappedMessage; + + /// + /// ContentPublishedMessage control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal ContentPublishedMessage; + /// /// ValidationPlaceholder control. /// From adeb859195219d87e9437c860b56d3dfc126d2b7 Mon Sep 17 00:00:00 2001 From: AndyButland Date: Sat, 29 Jun 2013 22:30:12 +0200 Subject: [PATCH 9/9] Reload content page when document type changed if content already loaded; improved display of confirmation screen --- src/Umbraco.Web.UI/umbraco/config/lang/en.xml | 3 +- .../umbraco/dialogs/ChangeDocType.aspx | 1 + .../umbraco/dialogs/ChangeDocType.aspx.cs | 3 ++ .../Application/UmbracoClientManager.js | 14 +++++++++ .../BasePages/ClientTools.cs | 30 +++++++++++++++++-- 5 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index 6512773c1b..5431b1dfce 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -87,7 +87,8 @@ The content has been re-published. Current Property Current type - The document type cannot be changed, as there are no alternatives valid for this location. + The document type cannot be changed, as there are no alternatives valid for this location. + Document Type Changed Map Properties Map to Property New Template diff --git a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx index b5625e4ee6..c6fb07ed19 100644 --- a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx +++ b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx @@ -85,6 +85,7 @@ +

<%=umbraco.ui.Text("changeDocType", "docTypeChanged") %>


diff --git a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs index e794f1e76e..39c0efc74d 100644 --- a/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs +++ b/src/Umbraco.Web.UI/umbraco/dialogs/ChangeDocType.aspx.cs @@ -245,6 +245,9 @@ namespace Umbraco.Web.UI.Umbraco.Dialogs // Sync the tree ClientTools.SyncTree(_content.Path, true); + // Reload the page if the content was already being viewed + ClientTools.ReloadContentFrameUrlIfPathLoaded("/editContent.aspx?id=" + _content.Id); + // Display success message SuccessMessage.Text = global::umbraco.ui.Text("changeDocType", "successMessage").Replace("[new type]", "" + newContentType.Name + ""); PropertiesMappedMessage.Text = propertiesMappedMessageBuilder.ToString(); diff --git a/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoClientManager.js b/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoClientManager.js index e3bc82b260..feeb02bf4f 100644 --- a/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoClientManager.js +++ b/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoClientManager.js @@ -141,6 +141,20 @@ Umbraco.Sys.registerNamespace("Umbraco.Application"); },200); } }, + reloadContentFrameUrlIfPathLoaded: function (url) { + var contentFrame; + if (typeof this.mainWindow().right != "undefined") { + contentFrame = this.mainWindow().right; + } + else { + contentFrame = this.mainWindow(); + } + + var currentPath = contentFrame.location.pathname + (contentFrame.location.search ? contentFrame.location.search : ""); + if (currentPath == url) { + contentFrame.location.reload(); + } + }, openModalWindow: function(url, name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback) { //need to create the modal on the top window if the top window has a client manager, if not, create it on the current window diff --git a/src/umbraco.businesslogic/BasePages/ClientTools.cs b/src/umbraco.businesslogic/BasePages/ClientTools.cs index 80b90eb6ea..a2675263ba 100644 --- a/src/umbraco.businesslogic/BasePages/ClientTools.cs +++ b/src/umbraco.businesslogic/BasePages/ClientTools.cs @@ -47,6 +47,9 @@ namespace umbraco.BasePages public static string ChangeContentFrameUrl(string url) { return string.Format(ClientMgrScript + ".contentFrame('{0}');", url); } + public static string ReloadContentFrameUrlIfPathLoaded(string url) { + return string.Format(ClientMgrScript + ".reloadContentFrameUrlIfPathLoaded('{0}');", url); + } public static string ChildNodeCreated = GetMainTree + ".childNodeCreated();"; public static string SyncTree { get { return GetMainTree + ".syncTree('{0}', {1});"; } } public static string ClearTreeCache { get { return GetMainTree + ".clearTreeCache();"; } } @@ -146,8 +149,7 @@ namespace umbraco.BasePages //don't load if there is no url if (string.IsNullOrEmpty(url)) return this; - if (url.StartsWith("/") && !url.StartsWith(IOHelper.ResolveUrl(SystemDirectories.Umbraco))) - url = IOHelper.ResolveUrl(SystemDirectories.Umbraco) + "/" + url; + url = EnsureUmbracoUrl(url); if (url.Trim().StartsWith("~")) url = IOHelper.ResolveUrl(url); @@ -157,6 +159,30 @@ namespace umbraco.BasePages return this; } + /// + /// Reloads the content in the content frame if the specified URL is currently loaded + /// + /// + public ClientTools ReloadContentFrameUrlIfPathLoaded(string url) + { + if (string.IsNullOrEmpty(url)) return this; + + url = EnsureUmbracoUrl(url); + + RegisterClientScript(Scripts.ReloadContentFrameUrlIfPathLoaded(url)); + + return this; + } + + private string EnsureUmbracoUrl(string url) + { + if (url.StartsWith("/") && !url.StartsWith(IOHelper.ResolveUrl(SystemDirectories.Umbraco))) + { + url = IOHelper.ResolveUrl(SystemDirectories.Umbraco) + url; + } + return url; + } + /// /// Shows the dashboard for the given application ///