Merge remote-tracking branch 'origin/temp8' into temp8-removes-config-based-indexes-3901

This commit is contained in:
Stephan
2019-01-10 14:04:52 +01:00
230 changed files with 1345 additions and 3273 deletions

View File

@@ -95,8 +95,8 @@
<PackageReference Include="Microsoft.AspNet.Mvc" Version="5.2.6" />
<PackageReference Include="Microsoft.AspNet.WebApi" Version="5.2.6" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="2.10.0" />
<PackageReference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" Version="2.0.0" />
<PackageReference Include="Microsoft.Net.Compilers" Version="2.9.0">
<PackageReference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" Version="2.0.1" />
<PackageReference Include="Microsoft.Net.Compilers" Version="2.10.0">
<PrivateAssets>all</PrivateAssets>
<!-- development dependency -->
</PackageReference>
@@ -107,7 +107,7 @@
<PackageReference Include="MySql.Data" Version="6.10.7" />
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
<PackageReference Include="Umbraco.ModelsBuilder.Ui">
<Version>8.0.0-alpha.26</Version>
<Version>8.0.0-alpha.31</Version>
</PackageReference>
<PackageReference Include="Umbraco.SqlServerCE" Version="4.0.0.1" />
</ItemGroup>
@@ -164,13 +164,6 @@
<Compile Include="Umbraco\Developer\Packages\DirectoryBrowser.aspx.designer.cs">
<DependentUpon>directoryBrowser.aspx</DependentUpon>
</Compile>
<Compile Include="Umbraco\Dialogs\ChangeDocType.aspx.cs">
<DependentUpon>ChangeDocType.aspx</DependentUpon>
<SubType>ASPXCodeBehind</SubType>
</Compile>
<Compile Include="Umbraco\Dialogs\ChangeDocType.aspx.designer.cs">
<DependentUpon>ChangeDocType.aspx</DependentUpon>
</Compile>
<Compile Include="Umbraco\Masterpages\Default.Master.cs">
<DependentUpon>default.Master</DependentUpon>
<SubType>ASPXCodeBehind</SubType>
@@ -294,15 +287,6 @@
<Content Include="Umbraco\Config\Lang\pt.xml" />
<Content Include="Umbraco\Config\Lang\ru.xml" />
<Content Include="Umbraco\Config\Lang\zh.xml" />
<Content Include="Umbraco\Developer\RelationTypes\EditRelationType.aspx" />
<Content Include="Umbraco\Developer\RelationTypes\Images\Bidirectional.png" />
<Content Include="Umbraco\Developer\RelationTypes\Images\ParentToChild.png" />
<Content Include="Umbraco\Developer\RelationTypes\Images\Refresh.gif" />
<Content Include="Umbraco\Developer\RelationTypes\NewRelationType.aspx" />
<Content Include="Umbraco\Developer\RelationTypes\RelationTypesWebService.asmx" />
<Content Include="Umbraco\Dialogs\ChangeDocType.aspx">
<SubType>ASPXCodeBehind</SubType>
</Content>
<Content Include="Umbraco\Config\Lang\ko.xml" />
<Content Include="Umbraco\Dashboard\FeedProxy.aspx" />
<Content Include="default.aspx" />
@@ -316,7 +300,6 @@
<Content Include="Umbraco\Config\Lang\nl.xml" />
<Content Include="Umbraco\Config\Lang\nb.xml" />
<Content Include="Umbraco\Config\Lang\sv.xml" />
<Content Include="Umbraco\Dialogs\republish.aspx" />
<Content Include="Umbraco\Developer\Packages\directoryBrowser.aspx" />
<Content Include="Umbraco\Developer\Packages\editPackage.aspx" />
<Content Include="Umbraco\Config\Create\UI.xml" />

View File

@@ -118,7 +118,7 @@
on-login="hideLoginScreen()">
</umb-login>
@Html.BareMinimumServerVariablesScript(Url, Url.Action("ExternalLogin", "BackOffice", new { area = ViewBag.UmbracoPath }), Model.Features, Current.Config.Global())
@Html.BareMinimumServerVariablesScript(Url, Url.Action("ExternalLogin", "BackOffice", new { area = ViewBag.UmbracoPath }), Model.Features, Current.Configs.Global())
<script>

View File

@@ -1,147 +0,0 @@
<%@ Page Language="C#" AutoEventWireup="true" Inherits="umbraco.cms.presentation.developer.RelationTypes.EditRelationType" MasterPageFile="../../masterpages/umbracoPage.Master" %>
<%@ Register TagPrefix="umb" Namespace="Umbraco.Web._Legacy.Controls" Assembly="Umbraco.Web" %>
<asp:Content ID="headContent" ContentPlaceHolderID="head" runat="server">
<style type="text/css">
table.relations { }
table.relations th { width:auto; }
table.relations th.objectTypeIcon { width:20px; }
table.relations th.directionIcon { width:16px; height:16px; }
table.relations td { background: transparent none no-repeat scroll center center }
table.relations td a { text-decoration: underline; }
/* objectType icons */
table.relations td.ContentItemType {}
table.relations td.ROOT {}
table.relations td.Document {}
table.relations td.Media {}
table.relations td.MemberType {}
table.relations td.Template {}
table.relations td.MemberGroup {}
table.relations td.ContentItem {}
table.relations td.MediaType {}
table.relations td.DocumentType {}
table.relations td.RecycleBin {}
table.relations td.Stylesheet {}
table.relations td.Member {}
table.relations td.DataType {}
/* direction icons */
table.relations td.parentToChild { background-image: url('../../developer/RelationTypes/Images/ParentToChild.png'); }
table.relations td.bidirectional { background-image: url('../../developer/RelationTypes/Images/Bidirectional.png'); }
</style>
</asp:Content>
<asp:Content ID="bodyContent" ContentPlaceHolderID="body" runat="server">
<umb:TabView runat="server" ID="tabControl" Width="200" />
<umb:Pane ID="idPane" runat="server" Text="">
<umb:PropertyPanel runat="server" id="idPropertyPanel" Text="Id">
<asp:Literal ID="idLiteral" runat="server" />
</umb:PropertyPanel>
</umb:Pane>
<umb:Pane ID="nameAliasPane" runat="server" Text="">
<umb:PropertyPanel runat="server" ID="nameProperyPanel" Text="Name">
<asp:TextBox ID="nameTextBox" runat="server" Columns="40" ></asp:TextBox>
<asp:RequiredFieldValidator ID="nameRequiredFieldValidator" runat="server" ControlToValidate="nameTextBox" ValidationGroup="RelationType" ErrorMessage="Name Required" Display="Dynamic" />
</umb:PropertyPanel>
<umb:PropertyPanel runat="server" id="aliasPropertyPanel" Text="Alias">
<asp:TextBox ID="aliasTextBox" runat="server" Columns="40"></asp:TextBox>
<asp:RequiredFieldValidator ID="aliasRequiredFieldValidator" runat="server" ControlToValidate="aliasTextBox" ValidationGroup="RelationType" ErrorMessage="Alias Required" Display="Dynamic" />
<asp:CustomValidator ID="aliasCustomValidator" runat="server" ControlToValidate="aliasTextBox" ValidationGroup="RelationType" onservervalidate="AliasCustomValidator_ServerValidate" ErrorMessage="Duplicate Alias" Display="Dynamic" />
</umb:PropertyPanel>
</umb:Pane>
<umb:Pane ID="directionPane" runat="server" Text="">
<umb:PropertyPanel runat="server" id="dualPropertyPanel" Text="Direction">
<asp:RadioButtonList ID="dualRadioButtonList" runat="server" RepeatDirection="Vertical">
<asp:ListItem Enabled="true" Selected="False" Text="Parent to Child" Value="0" />
<asp:ListItem Enabled="true" Selected="False" Text="Bidirectional" Value="1"/>
</asp:RadioButtonList>
</umb:PropertyPanel>
</umb:Pane>
<umb:Pane ID="objectTypePane" runat="server" Text="">
<umb:PropertyPanel runat="server" id="parentPropertyPanel" Text="Parent">
<asp:Literal ID="parentLiteral" runat="server" />
</umb:PropertyPanel>
<umb:PropertyPanel runat="server" id="childPropertyPanel" Text="Child">
<asp:Literal ID="childLiteral" runat="server" />
</umb:PropertyPanel>
</umb:Pane>
<umb:Pane ID="relationsCountPane" runat="server" Text="">
<umb:PropertyPanel runat="server" id="relationsCountPropertyPanel" Text="Count">
<asp:Literal ID="relationsCountLiteral" runat="server" />
</umb:PropertyPanel>
</umb:Pane>
<umb:Pane ID="relationsPane" runat="server" Text="">
<umb:PropertyPanel runat="server" id="relationsPropertyPanel" Text="Relations">
<asp:Repeater ID="relationsRepeater" runat="server">
<HeaderTemplate>
<table class="table relations">
<thead>
<tr>
<th class="objectTypeIcon">&nbsp;</th>
<th>Parent</th>
<th class="directionIcon">&nbsp;</th>
<th class="objectTypeIcon">&nbsp;</th>
<th>Child</th>
<th>Created</th>
<th>Comment</th>
</tr>
</thead>
<tbody>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td class="<%= this.ParentObjectType %>">&nbsp;</td>
<td><a href="<%# GetEditUrl(this.ParentObjectType, (int)DataBinder.Eval(Container.DataItem, "ParentId")) %>" target="_blank"><%# DataBinder.Eval(Container.DataItem, "ParentText") %></a></td>
<td class="<%= this.RelationTypeDirection %>">&nbsp;</td>
<td class="<%= this.ChildObjectType %>">&nbsp;</td>
<td><a href="<%# GetEditUrl(this.ChildObjectType, (int)DataBinder.Eval(Container.DataItem, "ChildId")) %>" target="_blank"><%# DataBinder.Eval(Container.DataItem, "ChildText") %></a></td>
<td><%# DataBinder.Eval(Container.DataItem, "DateTime") %></td>
<td><%# DataBinder.Eval(Container.DataItem, "Comment") %></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</tbody>
</table>
</FooterTemplate>
</asp:Repeater>
</umb:PropertyPanel>
</umb:Pane>
</asp:Content>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 421 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 434 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -1,50 +0,0 @@
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="NewRelationType.aspx.cs" Inherits="umbraco.cms.presentation.developer.RelationTypes.NewRelationType" MasterPageFile="../../masterpages/umbracoDialog.Master"%>
<%@ Register TagPrefix="umb" Namespace="Umbraco.Web._Legacy.Controls" Assembly="Umbraco.Web" %>
<asp:Content ID="bodyContent" ContentPlaceHolderID="body" runat="server">
<umb:Pane ID="nameAliasPane" runat="server" Text="">
<umb:PropertyPanel runat="server" ID="nameProperyPanel" Text="Name">
<asp:TextBox ID="descriptionTextBox" runat="server" Columns="40" AutoCompleteType="Disabled" style="width:200px;" />
<asp:RequiredFieldValidator ID="descriptionRequiredFieldValidator" runat="server" ControlToValidate="descriptionTextBox" ValidationGroup="NewRelationType" ErrorMessage="Name Required" Display="Dynamic" />
</umb:PropertyPanel>
<umb:PropertyPanel runat="server" id="aliasPropertyPanel" Text="Alias">
<asp:TextBox ID="aliasTextBox" runat="server" Columns="40" AutoCompleteType="Disabled" style="width:200px;" />
<asp:RequiredFieldValidator ID="aliasRequiredFieldValidator" runat="server" ControlToValidate="aliasTextBox" ValidationGroup="NewRelationType" ErrorMessage="Alias Required" Display="Dynamic" />
<asp:CustomValidator ID="aliasCustomValidator" runat="server" ControlToValidate="aliasTextBox" ValidationGroup="NewRelationType" onservervalidate="AliasCustomValidator_ServerValidate" ErrorMessage="Duplicate Alias" Display="Dynamic" />
</umb:PropertyPanel>
</umb:Pane>
<umb:Pane ID="directionPane" runat="server" Text="">
<umb:PropertyPanel runat="server" id="PropertyPanel1" Text="Direction">
<asp:RadioButtonList ID="dualRadioButtonList" runat="server" RepeatDirection="Horizontal">
<asp:ListItem Enabled="true" Selected="True" Text="Parent to Child" Value="0"/>
<asp:ListItem Enabled="true" Selected="False" Text="Bidirectional" Value="1"/>
</asp:RadioButtonList>
</umb:PropertyPanel>
</umb:Pane>
<umb:Pane ID="objectTypePane" runat="server" Text="">
<umb:PropertyPanel runat="server" id="PropertyPanel2" Text="Parent">
<asp:DropDownList ID="parentDropDownList" runat="server" />
</umb:PropertyPanel>
<umb:PropertyPanel runat="server" id="PropertyPanel3" Text="Child">
<asp:DropDownList ID="childDropDownList" runat="server" />
</umb:PropertyPanel>
</umb:Pane>
<umb:Pane runat="server" CssClass="btn-toolbar umb-btn-toolbar">
<a href="#" class="btn btn-link" onclick="UmbClientMgr.closeModalWindow()"><%=Services.TextService.Localize("cancel")%></a>
<asp:Button ID="addButton" runat="server" Text="Create" cssclass="btn btn-primary" onclick="AddButton_Click" CausesValidation="true" ValidationGroup="NewRelationType" />
</umb:Pane>
</asp:Content>

View File

@@ -1 +0,0 @@
<%@ WebService Language="C#" CodeBehind="RelationTypesWebService.asmx.cs" Class="umbraco.cms.presentation.developer.RelationTypes.RelationTypesWebService" %>

View File

@@ -1,120 +0,0 @@
<%@ Page Language="c#" MasterPageFile="../masterpages/umbracoDialog.Master"Codebehind="ChangeDocType.aspx.cs" AutoEventWireup="True" Inherits="Umbraco.Web.UI.Umbraco.Dialogs.ChangeDocType" %>
<%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %>
<%@ Register TagPrefix="cc1" Namespace="Umbraco.Web._Legacy.Controls" Assembly="Umbraco.Web" %>
<asp:Content ContentPlaceHolderID="head" runat="server">
<style type="text/css">
#propertyMapping thead tr th{border-bottom:1px solid #ccc; padding: 4px; padding-right: 25px;
background-image: url(<%= Umbraco.Core.IO.IOHelper.ResolveUrl(Umbraco.Core.IO.SystemDirectories.UmbracoClient) %>/tableSorting/img/bg.gif);
cursor: pointer;
font-weight: bold;
background-repeat: no-repeat;
background-position: center right;
}
#propertyMapping tbody tr td{border-bottom:1px solid #efefef}
#propertyMapping td{padding: 4px; ;}
body.umbracoDialog { overflow: auto; }
.umb-dialog .umb-control-group .umb-el-wrap { overflow: hidden; }
.umb-dialog .umb-control-group .umb-el-wrap label { float: left; width: 140px; font-weight: bold; }
.umb-dialog .umb-control-group .umb-el-wrap label:after { content:":"; }
.umb-dialog .umb-control-group .umb-el-wrap .controls-row { float: left; width: 280px; padding-bottom: 8px; }
.umb-dialog .umb-control-group .umb-el-wrap .controls-row select { width: auto; }
</style>
</asp:Content>
<asp:Content ContentPlaceHolderID="body" runat="server">
<cc1:Pane runat="server" ID="ChangeDocTypePane">
<p class="help">
<%= Services.TextService.Localize("changeDocType/changeDocTypeInstruction") %>
</p>
<cc1:PropertyPanel ID="ContentNamePropertyPanel" runat="server">
<asp:Label ID="ContentNameLabel" runat="server" />
</cc1:PropertyPanel>
<cc1:PropertyPanel ID="CurrentTypePropertyPanel" runat="server">
<asp:Label ID="CurrentTypeLabel" runat="server" />
</cc1:PropertyPanel>
<cc1:PropertyPanel ID="NewTypePropertyPanel" runat="server">
<asp:DropDownList ID="NewDocumentTypeList" runat="server" AutoPostBack="true" OnSelectedIndexChanged="NewDocumentTypeList_SelectedIndexChanged" />
<asp:RequiredFieldValidator ControlToValidate="NewDocumentTypeList" ErrorMessage="*" ID="NewDocumentTypeValidator" runat="server" Display="Dynamic" />
<br /><small><%=Services.TextService.Localize("changeDocType/validDocTypesNote") %></small>
</cc1:PropertyPanel>
<cc1:PropertyPanel ID="NewTemplatePropertyPanel" runat="server">
<asp:DropDownList ID="NewTemplateList" runat="server" />
</cc1:PropertyPanel>
<asp:PlaceHolder ID="NotAvailablePlaceholder" runat="server" Visible="false">
<div class="propertyItem notice" style="padding-top: 10px">
<p><%=Services.TextService.Localize("changeDocType/docTypeCannotBeChanged") %></p>
</div>
</asp:PlaceHolder>
</cc1:Pane>
<cc1:Pane runat="server" ID="ChangeDocTypePropertyMappingPane">
<p class="help">
<%= Services.TextService.Localize("changeDocType/changeDocTypeInstruction2") %>
</p>
<asp:Repeater ID="PropertyMappingRepeater" runat="server">
<HeaderTemplate>
<table id="propertyMapping">
<thead>
<tr>
<th><%= Services.TextService.Localize("changeDocType/currentProperty") %></th>
<th><%= Services.TextService.Localize("changeDocType/mapToProperty") %></th>
</tr>
</thead>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<%# DataBinder.Eval(Container, "DataItem.Name") %>
<asp:HiddenField ID="Alias" runat="server" Value='<%#DataBinder.Eval(Container, "DataItem.Alias")%>' />
<asp:HiddenField ID="Name" runat="server" Value='<%#DataBinder.Eval(Container, "DataItem.Name")%>' />
<asp:HiddenField ID="PropertyEditorAlias" runat="server" Value='<%#DataBinder.Eval(Container, "DataItem.PropertyEditorAlias")%>' />
</td>
<td><asp:DropDownList id="DestinationProperty" runat="server" /></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</cc1:Pane>
<asp:PlaceHolder ID="SuccessPlaceholder" runat="server" Visible="false">
<p><%=Services.TextService.Localize("changeDocType/docTypeChanged") %></p>
<p>
<asp:Literal ID="SuccessMessage" runat="server" />
<asp:Literal ID="PropertiesMappedMessage" runat="server" />
<asp:Literal ID="ContentPublishedMessage" runat="server" />
<br /><br />
<a href="#" style="color: blue" onclick="UmbClientMgr.closeModalWindow()"><%=Services.TextService.Localize("defaultdialogs/closeThisWindow") %></a>
</p>
</asp:PlaceHolder>
<asp:PlaceHolder ID="ValidationPlaceholder" runat="server" Visible="false">
<br />
<div class="notice" style="padding: 10px">
<asp:Literal id="ValidationError" runat="server" />
</div>
</asp:PlaceHolder>
<div class="btn-toolbar umb-btn-toolbar">
<asp:PlaceHolder ID="SaveAndCancelPlaceholder" runat="server">
<a href="#" class="btn btn-link" onclick="UmbClientMgr.closeModalWindow()"><%=Services.TextService.Localize("general/cancel")%></a>
<asp:PlaceHolder ID="SavePlaceholder" runat="server">
<asp:Button ID="ValidateAndSave" runat="server" CssClass="btn btn-primary" Text="Create" OnClick="ValidateAndSave_Click"></asp:Button>
</asp:PlaceHolder>
</asp:Placeholder>
</div>
</asp:Content>

View File

@@ -1,346 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using Umbraco.Core;
using Umbraco.Core.Services;
using Umbraco.Core.Models;
using Umbraco.Web.UI.Pages;
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)
{
var contentNodeId = int.Parse(Request.QueryString["id"]);
_content = Services.ContentService.GetById(contentNodeId);
LocalizeTexts();
if (!Page.IsPostBack)
{
DisplayContentDetails();
if (PopulateListOfValidAlternateDocumentTypes())
{
PopulateListOfTemplates();
PopulatePropertyMappingWithSources();
PopulatePropertyMappingWithDestinations();
}
else
{
DisplayNotAvailable();
}
}
}
private void LocalizeTexts()
{
ChangeDocTypePane.Text = Services.TextService.Localize("changeDocType/selectNewDocType");
ContentNamePropertyPanel.Text = Services.TextService.Localize("changeDocType/selectedContent");
CurrentTypePropertyPanel.Text = Services.TextService.Localize("changeDocType/currentType");
NewTypePropertyPanel.Text = Services.TextService.Localize("changeDocType/newType");
NewTemplatePropertyPanel.Text = Services.TextService.Localize("changeDocType/newTemplate");
ChangeDocTypePropertyMappingPane.Text = Services.TextService.Localize("changeDocType/mapProperties");
ValidateAndSave.Text = Services.TextService.Localize("buttons/save");
}
private void DisplayContentDetails()
{
ContentNameLabel.Text = _content.Name;
CurrentTypeLabel.Text = _content.ContentType.Name;
}
private bool PopulateListOfValidAlternateDocumentTypes()
{
// Start with all content types
var documentTypes = Services.ContentTypeService.GetAll().ToArray();
// Remove invalid ones from list of potential alternatives
documentTypes = RemoveCurrentDocumentTypeFromAlternatives(documentTypes).ToArray();
documentTypes = RemoveInvalidByParentDocumentTypesFromAlternatives(documentTypes).ToArray();
documentTypes = RemoveInvalidByChildrenDocumentTypesFromAlternatives(documentTypes).ToArray();
// 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 IEnumerable<IContentType> RemoveCurrentDocumentTypeFromAlternatives(IEnumerable<IContentType> documentTypes)
{
return documentTypes
.Where(x => x.Id != _content.ContentType.Id);
}
private IEnumerable<IContentType> RemoveInvalidByParentDocumentTypesFromAlternatives(IEnumerable<IContentType> documentTypes)
{
if (_content.ParentId == -1)
{
// Root content, only include those that have been selected as allowed at root
return documentTypes
.Where(x => x.AllowedAsRoot);
}
else
{
// Below root, so only include those allowed as sub-nodes for the parent
var parentNode = Services.ContentService.GetById(_content.ParentId);
return documentTypes
.Where(x => parentNode.ContentType.AllowedContentTypes
.Select(y => y.Id.Value)
.Contains(x.Id));
}
}
private IEnumerable<IContentType> RemoveInvalidByChildrenDocumentTypesFromAlternatives(IEnumerable<IContentType> documentTypes)
{
//fixme Should do proper paging here ... when this is refactored we will
var docTypeIdsOfChildren = Services.ContentService.GetPagedChildren(_content.Id, 0, int.MaxValue, out var total)
.Select(x => x.ContentType.Id)
.Distinct()
.ToList();
return documentTypes
.Where(x => x.AllowedContentTypes
.Select(y => y.Id.Value)
.ContainsAll(docTypeIdsOfChildren));
}
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("<" + Services.TextService.Localize("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 = GetPropertiesOfContentType(_content.ContentType);
PropertyMappingRepeater.DataBind();
}
private void PopulatePropertyMappingWithDestinations()
{
// 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)
{
if (ri.ItemType == ListItemType.Item || ri.ItemType == ListItemType.AlternatingItem)
{
// Get data type from hidden field
var propEdAlias = ((HiddenField)ri.FindControl("PropertyEditorAlias")).Value;
// Bind destination list with properties that match data type
var ddl = (DropDownList)ri.FindControl("DestinationProperty");
ddl.DataSource = properties.Where(x => x.PropertyEditorAlias == propEdAlias);
ddl.DataValueField = "Alias";
ddl.DataTextField = "Name";
ddl.DataBind();
ddl.Items.Insert(0, new ListItem("<" + Services.TextService.Localize("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 Services.ContentTypeService.Get(int.Parse(NewDocumentTypeList.SelectedItem.Value));
}
private IEnumerable<PropertyType> GetPropertiesOfContentType(IContentType contentType)
{
return contentType.CompositionPropertyTypes;
}
private void DisplayNotAvailable()
{
NewTypePropertyPanel.Visible = false;
NewTemplatePropertyPanel.Visible = false;
SavePlaceholder.Visible = false;
NotAvailablePlaceholder.Visible = true;
ChangeDocTypePropertyMappingPane.Visible = false;
}
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 propertyMappings = SavePropertyMappings();
// Get flag for if content already published
var wasPublished = _content.Published;
// Change the document type passing flag to clear the properties
var newContentType = GetSelectedDocumentType();
_content.ChangeContentType(newContentType, true);
// Set the template if one has been selected
if (NewTemplateList.SelectedItem != null)
{
var templateId = int.Parse(NewTemplateList.SelectedItem.Value);
_content.Template = templateId > 0 ? Services.FileService.GetTemplate(templateId) : null;
}
// Set the property values
var propertiesMappedMessageBuilder = new StringBuilder("<ul>");
foreach (var propertyMapping in propertyMappings)
{
propertiesMappedMessageBuilder.AppendFormat("<li>{0} {1} {2}</li>",
propertyMapping.FromName, Services.TextService.Localize("changeDocType/to"), propertyMapping.ToName);
_content.SetValue(propertyMapping.ToAlias, propertyMapping.Value);
}
propertiesMappedMessageBuilder.Append("</ul>");
// Save
var user = Security.CurrentUser;
Services.ContentService.Save(_content, user.Id);
// Publish if the content was already published
if (wasPublished)
{
// no values to publish, really
Services.ContentService.SaveAndPublish(_content, userId: user.Id);
}
// Sync the tree
ClientTools.SyncTree(_content.Path, true);
// Reload the page if the content was already being viewed
ClientTools.ReloadLocation();
// Display success message
SuccessMessage.Text = Services.TextService.Localize("changeDocType/successMessage").Replace("[new type]", "<strong>" + newContentType.Name + "</strong>");
PropertiesMappedMessage.Text = propertiesMappedMessageBuilder.ToString();
if (wasPublished)
{
ContentPublishedMessage.Text = Services.TextService.Localize("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
{
ValidationPlaceholder.Visible = true;
}
}
private bool IsPropertyMappingValid()
{
// Check whether any properties have been mapped to more than once
var mappedPropertyAliases = new List<string>();
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 = Services.TextService.Localize("changeDocType/validationErrorPropertyWithMoreThanOneMapping");
return false;
}
mappedPropertyAliases.Add(mappedPropertyAlias);
}
}
}
return true;
}
private IList<PropertyMapping> SavePropertyMappings()
{
// Create list of mapped property values for assignment after the document type is changed
var mappedPropertyValues = new List<PropertyMapping>();
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 PropertyMapping
{
FromName = ((HiddenField)ri.FindControl("Name")).Value,
ToName = ddl.SelectedItem.Text,
ToAlias = mappedAlias,
Value = sourcePropertyValue
});
}
}
}
return mappedPropertyValues;
}
}
}

View File

@@ -1,213 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Umbraco.Web.UI.Umbraco.Dialogs {
public partial class ChangeDocType {
/// <summary>
/// ChangeDocTypePane control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::Umbraco.Web._Legacy.Controls.Pane ChangeDocTypePane;
/// <summary>
/// ContentNamePropertyPanel control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::Umbraco.Web._Legacy.Controls.PropertyPanel ContentNamePropertyPanel;
/// <summary>
/// ContentNameLabel control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Label ContentNameLabel;
/// <summary>
/// CurrentTypePropertyPanel control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::Umbraco.Web._Legacy.Controls.PropertyPanel CurrentTypePropertyPanel;
/// <summary>
/// CurrentTypeLabel control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Label CurrentTypeLabel;
/// <summary>
/// NewTypePropertyPanel control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::Umbraco.Web._Legacy.Controls.PropertyPanel NewTypePropertyPanel;
/// <summary>
/// NewDocumentTypeList control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.DropDownList NewDocumentTypeList;
/// <summary>
/// NewDocumentTypeValidator control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator NewDocumentTypeValidator;
/// <summary>
/// NewTemplatePropertyPanel control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::Umbraco.Web._Legacy.Controls.PropertyPanel NewTemplatePropertyPanel;
/// <summary>
/// NewTemplateList control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.DropDownList NewTemplateList;
/// <summary>
/// NotAvailablePlaceholder control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.PlaceHolder NotAvailablePlaceholder;
/// <summary>
/// ChangeDocTypePropertyMappingPane control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::Umbraco.Web._Legacy.Controls.Pane ChangeDocTypePropertyMappingPane;
/// <summary>
/// PropertyMappingRepeater control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Repeater PropertyMappingRepeater;
/// <summary>
/// SuccessPlaceholder control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.PlaceHolder SuccessPlaceholder;
/// <summary>
/// SuccessMessage control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Literal SuccessMessage;
/// <summary>
/// PropertiesMappedMessage control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Literal PropertiesMappedMessage;
/// <summary>
/// ContentPublishedMessage control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Literal ContentPublishedMessage;
/// <summary>
/// ValidationPlaceholder control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.PlaceHolder ValidationPlaceholder;
/// <summary>
/// ValidationError control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Literal ValidationError;
/// <summary>
/// SaveAndCancelPlaceholder control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.PlaceHolder SaveAndCancelPlaceholder;
/// <summary>
/// SavePlaceholder control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.PlaceHolder SavePlaceholder;
/// <summary>
/// ValidateAndSave control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Button ValidateAndSave;
}
}

View File

@@ -1,41 +0,0 @@
<%@ Page Language="c#" Codebehind="republish.aspx.cs" MasterPageFile="../masterpages/umbracoDialog.Master" AutoEventWireup="True" Inherits="umbraco.cms.presentation.republish" %>
<%@ Register TagPrefix="cc1" Namespace="Umbraco.Web._Legacy.Controls" Assembly="Umbraco.Web" %>
<asp:Content ContentPlaceHolderID="head" runat="server">
<script type="text/javascript">
function showProgress(button, elementId) {
var img = document.getElementById(elementId);
img.style.visibility = "visible";
button.style.display = "none";
}
</script>
</asp:Content>
<asp:Content ContentPlaceHolderID="body" runat="server">
<asp:Panel ID="p_republish" runat="server">
<div class="propertyDiv">
<p><%= Services.TextService.Localize("defaultdialogs/siterepublishHelp")%> </p>
</div>
<div id="buttons" class="btn-toolbar umb-btn-toolbar">
<a href="#" class="btn btn-link" onclick="UmbClientMgr.closeModalWindow();"><%=Services.TextService.Localize("cancel")%></a>
<asp:Button ID="bt_go" cssclass="btn btn-primary" OnClick="go" OnClientClick="showProgress(document.getElementById('buttons'),'progress'); return true;" runat="server" Text="Republish" />
</div>
<div id="progress" style="visibility: hidden;">
<div class="umb-loader-wrapper">
<cc1:ProgressBar ID="progbar" runat="server" Title="Please wait..." />
</div>
</div>
</asp:Panel>
<asp:Panel ID="p_done" Visible="false" runat="server">
<div class="success">
<p><%= Services.TextService.Localize("defaultdialogs/siterepublished")%></p>
</div>
<input type="button" class="btn btn-primary" onclick="UmbClientMgr.closeModalWindow();" value="Ok" />
</asp:Panel>
</asp:Content>

View File

@@ -299,11 +299,11 @@
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs"
type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
warningLevel="4"
compilerOptions="/langversion:7 /nowarn:1659;1699;1701" />
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
warningLevel="4"
compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
</compilers>