diff --git a/src/Orchard.Web/Core/Containers/Drivers/ContainablePartDriver.cs b/src/Orchard.Web/Core/Containers/Drivers/ContainablePartDriver.cs index 144b147cd..773484327 100644 --- a/src/Orchard.Web/Core/Containers/Drivers/ContainablePartDriver.cs +++ b/src/Orchard.Web/Core/Containers/Drivers/ContainablePartDriver.cs @@ -4,13 +4,13 @@ using System.Web.Mvc; using System.Xml; using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; +using Orchard.ContentManagement.Handlers; using Orchard.Core.Common.Models; using Orchard.Core.Containers.Models; using Orchard.Core.Containers.Services; using Orchard.Core.Containers.Settings; using Orchard.Core.Containers.ViewModels; using Orchard.Localization; -using Orchard.ContentManagement.Handlers; namespace Orchard.Core.Containers.Drivers { public class ContainablePartDriver : ContentPartDriver { @@ -96,5 +96,9 @@ namespace Orchard.Core.Containers.Drivers { protected override void Exporting(ContainablePart part, ExportContentContext context) { context.Element(part.PartDefinition.Name).SetAttributeValue("Position", part.Position); } + + protected override void Cloning(ContainablePart originalPart, ContainablePart clonePart, CloneContentContext context) { + clonePart.Position = originalPart.Position; + } } } diff --git a/src/Orchard.Web/Core/Containers/Drivers/ContainerPartDriver.cs b/src/Orchard.Web/Core/Containers/Drivers/ContainerPartDriver.cs index de010c2c6..d9bbbd52e 100644 --- a/src/Orchard.Web/Core/Containers/Drivers/ContainerPartDriver.cs +++ b/src/Orchard.Web/Core/Containers/Drivers/ContainerPartDriver.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Web.Routing; using System.Xml; using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; @@ -11,12 +12,11 @@ using Orchard.Core.Common.Models; using Orchard.Core.Containers.Models; using Orchard.Core.Containers.Services; using Orchard.Core.Containers.ViewModels; -using Orchard.Localization; -using Orchard.UI.Notify; -using System.Web.Routing; -using Orchard.Settings; using Orchard.Core.Feeds; +using Orchard.Localization; +using Orchard.Settings; using Orchard.UI.Navigation; +using Orchard.UI.Notify; namespace Orchard.Core.Containers.Drivers { public class ContainerPartDriver : ContentPartDriver { @@ -57,7 +57,7 @@ namespace Orchard.Core.Containers.Drivers { var metadata = container.ContentManager.GetItemMetadata(container); if (metadata != null) { - _feedManager.Register(metadata.DisplayText, "rss", new RouteValueDictionary {{"containerid", container.Id}}); + _feedManager.Register(metadata.DisplayText, "rss", new RouteValueDictionary { { "containerid", container.Id } }); } // Retrieving pager parameters. @@ -179,5 +179,17 @@ namespace Orchard.Core.Containers.Drivers { context.Element(part.PartDefinition.Name).SetAttributeValue("AdminMenuImageSet", part.AdminMenuImageSet); context.Element(part.PartDefinition.Name).SetAttributeValue("ItemCount", part.ItemCount); } + + protected override void Cloning(ContainerPart originalPart, ContainerPart clonePart, CloneContentContext context) { + clonePart.ItemContentTypes = originalPart.ItemContentTypes; + clonePart.ItemsShown = originalPart.ItemsShown; + clonePart.Paginated = originalPart.Paginated; + clonePart.PageSize = originalPart.PageSize; + clonePart.ShowOnAdminMenu = originalPart.ShowOnAdminMenu; + clonePart.AdminMenuText = originalPart.AdminMenuText; + clonePart.AdminMenuPosition = originalPart.AdminMenuPosition; + clonePart.AdminMenuImageSet = originalPart.AdminMenuImageSet; + clonePart.ItemCount = originalPart.ItemCount; + } } } diff --git a/src/Orchard.Web/Core/Contents/Controllers/AdminController.cs b/src/Orchard.Web/Core/Contents/Controllers/AdminController.cs index ecac3f423..c0ede8a2b 100644 --- a/src/Orchard.Web/Core/Contents/Controllers/AdminController.cs +++ b/src/Orchard.Web/Core/Contents/Controllers/AdminController.cs @@ -436,15 +436,15 @@ namespace Orchard.Core.Contents.Controllers { } [HttpPost] - public ActionResult Clone(int id) { + public ActionResult Clone(int id, string returnUrl) { var originalContentItem = _contentManager.GetLatest(id); if (!Services.Authorizer.Authorize(Permissions.ViewContent, originalContentItem, T("You do not have permission to view existing content."))) return new HttpUnauthorizedResult(); if (!Services.Authorizer.Authorize(Permissions.CreateContent, originalContentItem, T("Couldn't clone content"))) - return new HttpUnauthorizedResult(); - + return new HttpUnauthorizedResult(); + // pass a dummy content to the authorization check to check for "own" variations var dummyContent = _contentManager.New(originalContentItem.ContentType); @@ -461,8 +461,13 @@ namespace Orchard.Core.Contents.Controllers { ? T("The content has been cloned as a draft.") : T("The {0} has been cloned as a draft.", originalContentItem.TypeDefinition.DisplayName)); - var adminRouteValues = _contentManager.GetItemMetadata(cloneContentItem).AdminRouteValues; - return RedirectToRoute(adminRouteValues); + if (string.IsNullOrWhiteSpace(returnUrl)) { + var adminRouteValues = _contentManager.GetItemMetadata(cloneContentItem).AdminRouteValues; + return RedirectToRoute(adminRouteValues); + } + else { + return this.RedirectLocal(returnUrl, () => RedirectToAction("List")); + } } [HttpPost] diff --git a/src/Orchard.Web/Core/Contents/Views/Parts.Contents.Clone.SummaryAdmin.cshtml b/src/Orchard.Web/Core/Contents/Views/Parts.Contents.Clone.SummaryAdmin.cshtml index 0bd473b0c..118caa590 100644 --- a/src/Orchard.Web/Core/Contents/Views/Parts.Contents.Clone.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Core/Contents/Views/Parts.Contents.Clone.SummaryAdmin.cshtml @@ -6,7 +6,7 @@ @if (Authorizer.Authorize(Permissions.CreateContent, contentPart)) { } \ No newline at end of file diff --git a/src/Orchard.Web/Core/Contents/Views/Parts.Contents.Publish.SummaryAdmin.cshtml b/src/Orchard.Web/Core/Contents/Views/Parts.Contents.Publish.SummaryAdmin.cshtml index 88607f375..898a86dee 100644 --- a/src/Orchard.Web/Core/Contents/Views/Parts.Contents.Publish.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Core/Contents/Views/Parts.Contents.Publish.SummaryAdmin.cshtml @@ -26,7 +26,7 @@ } } diff --git a/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs b/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs index 83b8e86ae..06fa86e88 100644 --- a/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs +++ b/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs @@ -231,10 +231,12 @@ namespace Orchard.Core.Navigation.Controllers { _contentManager.Create(contentItem); menuPart.Menu = menu; - menuPart.MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu)); var model = _contentManager.UpdateEditor(contentItem, this); + // This needs to be called after UpdateEditor for INavigationFilters not to operate with stale data. + menuPart.MenuPosition = Position.GetNext(_navigationManager.BuildMenu(menu)); + if (!ModelState.IsValid) { _transactionManager.Cancel(); return View(model); diff --git a/src/Orchard.Web/Core/Navigation/Drivers/AdminMenuPartDriver.cs b/src/Orchard.Web/Core/Navigation/Drivers/AdminMenuPartDriver.cs index 473542408..0e48e13f8 100644 --- a/src/Orchard.Web/Core/Navigation/Drivers/AdminMenuPartDriver.cs +++ b/src/Orchard.Web/Core/Navigation/Drivers/AdminMenuPartDriver.cs @@ -1,6 +1,7 @@ using System; using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; +using Orchard.ContentManagement.Handlers; using Orchard.Core.Navigation.Models; using Orchard.Core.Navigation.Settings; using Orchard.Localization; @@ -94,5 +95,11 @@ namespace Orchard.Core.Navigation.Drivers { context.Element(part.PartDefinition.Name).SetAttributeValue("AdminMenuPosition", part.AdminMenuPosition); context.Element(part.PartDefinition.Name).SetAttributeValue("OnAdminMenu", part.OnAdminMenu); } + + protected override void Cloning(AdminMenuPart originalPart, AdminMenuPart clonePart, CloneContentContext context) { + clonePart.AdminMenuText = originalPart.AdminMenuText; + clonePart.AdminMenuPosition = originalPart.AdminMenuPosition; + clonePart.OnAdminMenu = originalPart.OnAdminMenu; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Core/Navigation/Drivers/MenuItemPartDriver.cs b/src/Orchard.Web/Core/Navigation/Drivers/MenuItemPartDriver.cs index 5da805c8d..64016f36f 100644 --- a/src/Orchard.Web/Core/Navigation/Drivers/MenuItemPartDriver.cs +++ b/src/Orchard.Web/Core/Navigation/Drivers/MenuItemPartDriver.cs @@ -1,5 +1,6 @@ using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; +using Orchard.ContentManagement.Handlers; using Orchard.Core.Navigation.Models; using Orchard.Security; @@ -29,9 +30,7 @@ namespace Orchard.Core.Navigation.Drivers { if (!_authorizationService.TryCheckAccess(Permissions.ManageMenus, currentUser, menu)) // tests if the current user has permissions to manage that specific menu return null; - if (updater != null) { - updater.TryUpdateModel(part, Prefix, null, null); - } + updater?.TryUpdateModel(part, Prefix, null, null); return Editor(part, shapeHelper); } @@ -50,5 +49,9 @@ namespace Orchard.Core.Navigation.Drivers { protected override void Exporting(MenuItemPart part, ContentManagement.Handlers.ExportContentContext context) { context.Element(part.PartDefinition.Name).SetAttributeValue("Url", part.Url); } + + protected override void Cloning(MenuItemPart originalPart, MenuItemPart clonePart, CloneContentContext context) { + clonePart.Url = originalPart.Url; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Core/Navigation/Drivers/MenuPartDriver.cs b/src/Orchard.Web/Core/Navigation/Drivers/MenuPartDriver.cs index 613554455..cccdcbfc4 100644 --- a/src/Orchard.Web/Core/Navigation/Drivers/MenuPartDriver.cs +++ b/src/Orchard.Web/Core/Navigation/Drivers/MenuPartDriver.cs @@ -1,6 +1,7 @@ using System.Linq; using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; +using Orchard.ContentManagement.Handlers; using Orchard.Core.Navigation.Models; using Orchard.Core.Navigation.Services; using Orchard.Core.Navigation.ViewModels; @@ -17,8 +18,8 @@ namespace Orchard.Core.Navigation.Drivers { private readonly IMenuService _menuService; public MenuPartDriver( - IAuthorizationService authorizationService, - INavigationManager navigationManager, + IAuthorizationService authorizationService, + INavigationManager navigationManager, IOrchardServices orchardServices, IMenuService menuService) { _authorizationService = authorizationService; @@ -58,7 +59,7 @@ namespace Orchard.Core.Navigation.Drivers { protected override DriverResult Editor(MenuPart part, IUpdateModel updater, dynamic shapeHelper) { var model = new MenuPartViewModel(); - if(updater.TryUpdateModel(model, Prefix, null, null)) { + if (updater.TryUpdateModel(model, Prefix, null, null)) { var menu = model.OnMenu ? _orchardServices.ContentManager.Get(model.CurrentMenuId) : null; if (!_authorizationService.TryCheckAccess(Permissions.ManageMenus, _orchardServices.WorkContext.CurrentUser, menu)) @@ -103,7 +104,7 @@ namespace Orchard.Core.Navigation.Drivers { protected override void Exporting(MenuPart part, ContentManagement.Handlers.ExportContentContext context) { // is it on a menu ? - if(part.Menu == null) { + if (part.Menu == null) { return; } @@ -114,5 +115,11 @@ namespace Orchard.Core.Navigation.Drivers { context.Element(part.PartDefinition.Name).SetAttributeValue("MenuText", part.MenuText); context.Element(part.PartDefinition.Name).SetAttributeValue("MenuPosition", part.MenuPosition); } + + protected override void Cloning(MenuPart originalPart, MenuPart clonePart, CloneContentContext context) { + clonePart.MenuText = originalPart.MenuText; + clonePart.MenuPosition = originalPart.MenuPosition; + clonePart.Menu = originalPart.Menu; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Core/Navigation/Drivers/MenuWidgetPartDriver.cs b/src/Orchard.Web/Core/Navigation/Drivers/MenuWidgetPartDriver.cs index 626a66691..befceccd8 100644 --- a/src/Orchard.Web/Core/Navigation/Drivers/MenuWidgetPartDriver.cs +++ b/src/Orchard.Web/Core/Navigation/Drivers/MenuWidgetPartDriver.cs @@ -11,7 +11,6 @@ using Orchard.Core.Title.Models; using Orchard.Localization; using Orchard.UI.Navigation; using Orchard.Utility.Extensions; -using Orchard.ContentManagement.Utilities; namespace Orchard.Core.Navigation.Drivers { public class MenuWidgetPartDriver : ContentPartDriver { @@ -41,10 +40,10 @@ namespace Orchard.Core.Navigation.Drivers { } protected override DriverResult Display(MenuWidgetPart part, string displayType, dynamic shapeHelper) { - return ContentShape( "Parts_MenuWidget", () => { + return ContentShape("Parts_MenuWidget", () => { var menu = _menuService.GetMenu(part.MenuContentItemId); - - if(menu == null) { + + if (menu == null) { return null; } @@ -57,9 +56,9 @@ namespace Orchard.Core.Navigation.Drivers { } var localized = new List(); - foreach(var menuItem in menuItems) { + foreach (var menuItem in menuItems) { // if there is no associated content, it as culture neutral - if(menuItem.Content == null) { + if (menuItem.Content == null) { localized.Add(menuItem); } @@ -73,7 +72,7 @@ namespace Orchard.Core.Navigation.Drivers { var request = _workContextAccessor.GetContext().HttpContext.Request; var routeData = request.RequestContext.RouteData; - var selectedPath = NavigationHelper.SetSelectedPath(menuItems, request, routeData); + var selectedPath = NavigationHelper.SetSelectedPath(menuItems, request, routeData); var menuShape = shapeHelper.Menu(); if (part.Breadcrumb) { @@ -135,9 +134,9 @@ namespace Orchard.Core.Navigation.Drivers { } // limit the number of levels to display (down from and including the start level) - if(part.Levels > 0) { + if (part.Levels > 0) { var current = topLevelItems.ToList(); - for (var i = 1; current.Any() && i < part.Levels; i++ ) { + for (var i = 1; current.Any() && i < part.Levels; i++) { var temp = new List(); foreach (var menuItem in current) { temp.AddRange(menuItem.Items); @@ -147,7 +146,7 @@ namespace Orchard.Core.Navigation.Drivers { // cut the sub-levels beneath any menu items that are at the lowest level being displayed foreach (var menuItem in current) { menuItem.Items = Enumerable.Empty(); - } + } } menuItems = topLevelItems; } @@ -160,29 +159,29 @@ namespace Orchard.Core.Navigation.Drivers { return shapeHelper.Parts_MenuWidget(Menu: menuShape); }); } - + protected override DriverResult Editor(MenuWidgetPart part, dynamic shapeHelper) { return ContentShape("Parts_MenuWidget_Edit", () => { - var model = new MenuWidgetViewModel { - CurrentMenuId = part.MenuContentItemId, - StartLevel = part.StartLevel, - StopLevel = part.Levels, - Breadcrumb = part.Breadcrumb, - AddCurrentPage = part.AddCurrentPage, - AddHomePage = part.AddHomePage, - ShowFullMenu = part.ShowFullMenu, - Menus = _menuService.GetMenus(), - }; + var model = new MenuWidgetViewModel { + CurrentMenuId = part.MenuContentItemId, + StartLevel = part.StartLevel, + StopLevel = part.Levels, + Breadcrumb = part.Breadcrumb, + AddCurrentPage = part.AddCurrentPage, + AddHomePage = part.AddHomePage, + ShowFullMenu = part.ShowFullMenu, + Menus = _menuService.GetMenus(), + }; - return shapeHelper.EditorTemplate(TemplateName: "Parts.MenuWidget.Edit", Model: model, Prefix: Prefix); - }); + return shapeHelper.EditorTemplate(TemplateName: "Parts.MenuWidget.Edit", Model: model, Prefix: Prefix); + }); } protected override DriverResult Editor(MenuWidgetPart part, IUpdateModel updater, dynamic shapeHelper) { var model = new MenuWidgetViewModel(); - if(updater.TryUpdateModel(model, Prefix, null, null)) { + if (updater.TryUpdateModel(model, Prefix, null, null)) { part.StartLevel = model.StartLevel; part.Levels = model.StopLevel; part.Breadcrumb = model.Breadcrumb; @@ -223,5 +222,14 @@ namespace Orchard.Core.Navigation.Drivers { context.Element(part.PartDefinition.Name).SetAttributeValue("ShowFullMenu", part.ShowFullMenu); } + protected override void Cloning(MenuWidgetPart originalPart, MenuWidgetPart clonePart, CloneContentContext context) { + clonePart.StartLevel = originalPart.StartLevel; + clonePart.Levels = originalPart.Levels; + clonePart.Breadcrumb = originalPart.Breadcrumb; + clonePart.AddCurrentPage = originalPart.AddCurrentPage; + clonePart.AddHomePage = originalPart.AddHomePage; + clonePart.ShowFullMenu = originalPart.ShowFullMenu; + clonePart.MenuContentItemId = originalPart.MenuContentItemId; + } } } diff --git a/src/Orchard.Web/Core/Navigation/Drivers/ShapeMenuItemPartDriver.cs b/src/Orchard.Web/Core/Navigation/Drivers/ShapeMenuItemPartDriver.cs index 61dd7cde0..ad7fdf9a2 100644 --- a/src/Orchard.Web/Core/Navigation/Drivers/ShapeMenuItemPartDriver.cs +++ b/src/Orchard.Web/Core/Navigation/Drivers/ShapeMenuItemPartDriver.cs @@ -48,5 +48,9 @@ namespace Orchard.Core.Navigation.Drivers { protected override void Exporting(ShapeMenuItemPart part, ExportContentContext context) { context.Element(part.PartDefinition.Name).SetAttributeValue("ShapeType", part.ShapeType); } + + protected override void Cloning(ShapeMenuItemPart originalPart, ShapeMenuItemPart clonePart, CloneContentContext context) { + clonePart.ShapeType = originalPart.ShapeType; + } } } diff --git a/src/Orchard.Web/Modules/Orchard.AntiSpam/Drivers/SpamFilterPartDriver.cs b/src/Orchard.Web/Modules/Orchard.AntiSpam/Drivers/SpamFilterPartDriver.cs index 772f515a3..d4e6479fa 100644 --- a/src/Orchard.Web/Modules/Orchard.AntiSpam/Drivers/SpamFilterPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.AntiSpam/Drivers/SpamFilterPartDriver.cs @@ -1,6 +1,5 @@ using System; using Orchard.AntiSpam.Models; -using Orchard.AntiSpam.Settings; using Orchard.ContentManagement.Drivers; using Orchard.ContentManagement.Handlers; using Orchard.Localization; @@ -39,17 +38,19 @@ namespace Orchard.AntiSpam.Drivers { } var status = context.Attribute(part.PartDefinition.Name, "Status"); - - if (status != null) { - SpamStatus value; - if(Enum.TryParse(status, out value)) { - part.Status = value; - } + + if (status != null && Enum.TryParse(status, out SpamStatus value)) { + part.Status = value; } } protected override void Exporting(SpamFilterPart part, ExportContentContext context) { context.Element(part.PartDefinition.Name).SetAttributeValue("Status", part.Status.ToString()); } + + protected override void Cloning(SpamFilterPart originalPart, SpamFilterPart clonePart, CloneContentContext context) { + clonePart.Status = originalPart.Status; + } + } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.ArchiveLater/Drivers/ArchiveLaterPartDriver.cs b/src/Orchard.Web/Modules/Orchard.ArchiveLater/Drivers/ArchiveLaterPartDriver.cs index 48899fd37..585bd088d 100644 --- a/src/Orchard.Web/Modules/Orchard.ArchiveLater/Drivers/ArchiveLaterPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.ArchiveLater/Drivers/ArchiveLaterPartDriver.cs @@ -66,7 +66,7 @@ namespace Orchard.ArchiveLater.Drivers { var model = BuildViewModelFromPart(part); return ContentShape("Parts_ArchiveLater_Edit", - () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix)); + () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix)); } protected override DriverResult Editor(ArchiveLaterPart part, IUpdateModel updater, dynamic shapeHelper) { @@ -76,10 +76,10 @@ namespace Orchard.ArchiveLater.Drivers { if (model.ArchiveLater) { try { var utcDateTime = _dateLocalizationServices.ConvertFromLocalizedString(model.Editor.Date, model.Editor.Time); - _archiveLaterService.ArchiveLater(model.ContentItem, utcDateTime.HasValue ? utcDateTime.Value : DateTime.MaxValue); + _archiveLaterService.ArchiveLater(model.ContentItem, utcDateTime ?? DateTime.MaxValue); } catch (FormatException) { - updater.AddModelError(Prefix, T("'{0} {1}' could not be parsed as a valid date and time.", model.Editor.Date, model.Editor.Time)); + updater.AddModelError(Prefix, T("'{0} {1}' could not be parsed as a valid date and time.", model.Editor.Date, model.Editor.Time)); } } else { @@ -88,7 +88,7 @@ namespace Orchard.ArchiveLater.Drivers { } return ContentShape("Parts_ArchiveLater_Edit", - () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix)); + () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix)); } protected override void Importing(ArchiveLaterPart part, ImportContentContext context) { @@ -109,5 +109,10 @@ namespace Orchard.ArchiveLater.Drivers { .SetAttributeValue("ScheduledArchiveUtc", XmlConvert.ToString(scheduled.Value, XmlDateTimeSerializationMode.Utc)); } } + + protected override void Cloning(ArchiveLaterPart originalPart, ArchiveLaterPart clonePart, CloneContentContext context) { + clonePart.ScheduledArchiveUtc.Value = originalPart.ScheduledArchiveUtc.Value; + } + } } diff --git a/src/Orchard.Web/Modules/Orchard.Autoroute/Drivers/AutoroutePartDriver.cs b/src/Orchard.Web/Modules/Orchard.Autoroute/Drivers/AutoroutePartDriver.cs index 06e6ae496..b1d649d25 100644 --- a/src/Orchard.Web/Modules/Orchard.Autoroute/Drivers/AutoroutePartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Autoroute/Drivers/AutoroutePartDriver.cs @@ -13,7 +13,6 @@ using Orchard.ContentManagement.Handlers; using Orchard.Localization; using Orchard.Localization.Services; using Orchard.Mvc; -using Orchard.Security; using Orchard.UI.Notify; using Orchard.Utility.Extensions; @@ -29,10 +28,9 @@ namespace Orchard.Autoroute.Drivers { public AutoroutePartDriver( IAutorouteService autorouteService, - INotifier notifier, + INotifier notifier, IHomeAliasService homeAliasService, IAliasService aliasService, - IAuthorizer authorizer, ICultureManager cultureManager, IContentManager contentManager, IHttpContextAccessor httpContextAccessor) { @@ -57,7 +55,7 @@ namespace Orchard.Autoroute.Drivers { protected override DriverResult Editor(AutoroutePart part, IUpdateModel updater, dynamic shapeHelper) { var settings = part.TypePartDefinition.Settings.GetModel(); var itemCulture = _cultureManager.GetSiteCulture(); - + // If we are editing an existing content item, check to see if we are an ILocalizableAspect so we can use its culture for alias generation. if (part.Record.Id != 0) { var localizableAspect = part.As(); @@ -87,7 +85,7 @@ namespace Orchard.Autoroute.Drivers { foreach (var pattern in settings.DefaultPatterns.Where(x => String.IsNullOrWhiteSpace(x.Culture))) { pattern.Culture = _cultureManager.GetSiteCulture(); } - + // If the content type has no pattern for autoroute, then use a default one. if (!settings.Patterns.Any(x => String.Equals(x.Culture, itemCulture, StringComparison.OrdinalIgnoreCase))) { settings.Patterns = new List { new RoutePattern { Name = "Title", Description = "my-title", Pattern = "{Content.Slug}", Culture = itemCulture } }; @@ -100,10 +98,12 @@ namespace Orchard.Autoroute.Drivers { if (!String.IsNullOrWhiteSpace(settings.DefaultPatternIndex)) { var patternIndex = settings.DefaultPatternIndex; settings.DefaultPatterns.Add(new DefaultPattern { PatternIndex = patternIndex, Culture = itemCulture }); - } else { + } + else { settings.DefaultPatterns.Add(new DefaultPattern { PatternIndex = "0", Culture = itemCulture }); } - } else { + } + else { settings.DefaultPatterns.Add(new DefaultPattern { PatternIndex = "0", Culture = itemCulture }); } } @@ -128,7 +128,7 @@ namespace Orchard.Autoroute.Drivers { var previous = part.DisplayAlias; if (updater != null && updater.TryUpdateModel(viewModel, Prefix, null, null)) { - + // Remove any leading slash in the permalink. if (viewModel.CurrentUrl != null) { viewModel.CurrentUrl = viewModel.CurrentUrl.TrimStart('/'); @@ -137,15 +137,15 @@ namespace Orchard.Autoroute.Drivers { part.DisplayAlias = viewModel.CurrentUrl; // Reset the alias if we need to force regeneration, and the user didn't provide a custom one. - if(settings.AutomaticAdjustmentOnEdit && previous == part.DisplayAlias) { + if (settings.AutomaticAdjustmentOnEdit && previous == part.DisplayAlias) { part.DisplayAlias = String.Empty; } if (!_autorouteService.IsPathValid(part.DisplayAlias)) { updater.AddModelError("CurrentUrl", T("Please do not use any of the following characters in your permalink: \":\", \"?\", \"#\", \"[\", \"]\", \"@\", \"!\", \"$\", \"&\", \"'\", \"(\", \")\", \"*\", \"+\", \",\", \";\", \"=\", \", \"<\", \">\", \"\\\", \"|\", \"%\", \".\". No spaces are allowed (please use dashes or underscores instead).")); } - - if (part.DisplayAlias != null && part.DisplayAlias.Length > 1850){ + + if (part.DisplayAlias != null && part.DisplayAlias.Length > 1850) { updater.AddModelError("CurrentUrl", T("Your permalink is too long. The permalink can only be up to 1,850 characters.")); } @@ -153,7 +153,7 @@ namespace Orchard.Autoroute.Drivers { part.PromoteToHomePage = viewModel.PromoteToHomePage; } - return ContentShape("Parts_Autoroute_Edit", + return ContentShape("Parts_Autoroute_Edit", () => shapeHelper.EditorTemplate(TemplateName: "Parts.Autoroute.Edit", Model: viewModel, Prefix: Prefix)); } @@ -177,5 +177,11 @@ namespace Orchard.Autoroute.Drivers { context.Element(part.PartDefinition.Name).SetAttributeValue("UseCulturePattern", part.Record.UseCulturePattern); context.Element(part.PartDefinition.Name).SetAttributeValue("PromoteToHomePage", part.PromoteToHomePage); } + + protected override void Cloning(AutoroutePart originalPart, AutoroutePart clonePart, CloneContentContext context) { + clonePart.CustomPattern = originalPart.CustomPattern; + clonePart.UseCustomPattern = originalPart.UseCustomPattern; + clonePart.UseCulturePattern = originalPart.UseCulturePattern; + } } } diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/BlogArchivesPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/BlogArchivesPartDriver.cs index 5ea0c3d1f..b750ff36f 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/BlogArchivesPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/BlogArchivesPartDriver.cs @@ -13,7 +13,7 @@ namespace Orchard.Blogs.Drivers { private readonly IContentManager _contentManager; public BlogArchivesPartDriver( - IBlogService blogService, + IBlogService blogService, IBlogPostService blogPostService, IContentManager contentManager) { _blogService = blogService; @@ -22,25 +22,24 @@ namespace Orchard.Blogs.Drivers { } protected override DriverResult Display(BlogArchivesPart part, string displayType, dynamic shapeHelper) { - return ContentShape("Parts_Blogs_BlogArchives", - () => { - var blog = _blogService.Get(part.BlogId, VersionOptions.Published).As(); + return ContentShape("Parts_Blogs_BlogArchives", () => { + var blog = _blogService.Get(part.BlogId, VersionOptions.Published).As(); - if (blog == null) - return null; + if (blog == null) + return null; - return shapeHelper.Parts_Blogs_BlogArchives(Blog: blog, Archives: _blogPostService.GetArchives(blog)); - }); + return shapeHelper.Parts_Blogs_BlogArchives(Blog: blog, Archives: _blogPostService.GetArchives(blog)); + }); } protected override DriverResult Editor(BlogArchivesPart part, dynamic shapeHelper) { var viewModel = new BlogArchivesViewModel { BlogId = part.BlogId, Blogs = _blogService.Get().ToList().OrderBy(b => _contentManager.GetItemMetadata(b).DisplayText) - }; + }; return ContentShape("Parts_Blogs_BlogArchives_Edit", - () => shapeHelper.EditorTemplate(TemplateName: "Parts.Blogs.BlogArchives", Model: viewModel, Prefix: Prefix)); + () => shapeHelper.EditorTemplate(TemplateName: "Parts.Blogs.BlogArchives", Model: viewModel, Prefix: Prefix)); } protected override DriverResult Editor(BlogArchivesPart part, IUpdateModel updater, dynamic shapeHelper) { @@ -69,5 +68,8 @@ namespace Orchard.Blogs.Drivers { context.Element(part.PartDefinition.Name).SetAttributeValue("Blog", blogIdentity); } + protected override void Cloning(BlogArchivesPart originalPart, BlogArchivesPart clonePart, CloneContentContext context) { + clonePart.BlogId = originalPart.BlogId; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/BlogPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/BlogPartDriver.cs index 7e965fd4a..ee7fc6a1e 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/BlogPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/BlogPartDriver.cs @@ -2,6 +2,7 @@ using Orchard.Blogs.Models; using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; +using Orchard.ContentManagement.Handlers; namespace Orchard.Blogs.Drivers { public class BlogPartDriver : ContentPartDriver { @@ -31,7 +32,7 @@ namespace Orchard.Blogs.Drivers { return Editor(blogPart, shapeHelper); } - protected override void Importing(BlogPart part, ContentManagement.Handlers.ImportContentContext context) { + protected override void Importing(BlogPart part, ImportContentContext context) { // Don't do anything if the tag is not specified. if (context.Data.Element(part.PartDefinition.Name) == null) { return; @@ -50,10 +51,16 @@ namespace Orchard.Blogs.Drivers { ); } - protected override void Exporting(BlogPart part, ContentManagement.Handlers.ExportContentContext context) { + protected override void Exporting(BlogPart part, ExportContentContext context) { context.Element(part.PartDefinition.Name).SetAttributeValue("Description", part.Description); context.Element(part.PartDefinition.Name).SetAttributeValue("PostCount", part.PostCount); context.Element(part.PartDefinition.Name).SetAttributeValue("FeedProxyUrl", part.FeedProxyUrl); } + + protected override void Cloning(BlogPart originalPart, BlogPart clonePart, CloneContentContext context) { + clonePart.Description = originalPart.Description; + clonePart.PostCount = originalPart.PostCount; + clonePart.FeedProxyUrl = originalPart.FeedProxyUrl; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/RecentBlogPostsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/RecentBlogPostsPartDriver.cs index 91d19aea1..d05e0baa3 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/RecentBlogPostsPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/RecentBlogPostsPartDriver.cs @@ -14,7 +14,7 @@ namespace Orchard.Blogs.Drivers { private readonly IContentManager _contentManager; public RecentBlogPostsPartDriver( - IBlogService blogService, + IBlogService blogService, IContentManager contentManager) { _blogService = blogService; _contentManager = contentManager; @@ -22,7 +22,7 @@ namespace Orchard.Blogs.Drivers { protected override DriverResult Display(RecentBlogPostsPart part, string displayType, dynamic shapeHelper) { return ContentShape("Parts_Blogs_RecentBlogPosts", () => { - var blog = _contentManager.Get(part.BlogId); + var blog = _contentManager.Get(part.BlogId); if (blog == null) { return null; @@ -87,5 +87,10 @@ namespace Orchard.Blogs.Drivers { context.Element(part.PartDefinition.Name).SetAttributeValue("Blog", blogIdentity); context.Element(part.PartDefinition.Name).SetAttributeValue("Count", part.Count); } + + protected override void Cloning(RecentBlogPostsPart originalPart, RecentBlogPostsPart clonePart, CloneContentContext context) { + clonePart.BlogId = originalPart.BlogId; + clonePart.Count = originalPart.Count; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentPartDriver.cs index cd79d4b4f..403dead05 100644 --- a/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentPartDriver.cs @@ -2,12 +2,13 @@ using System; using System.Globalization; using System.Xml; using Orchard.Comments.Models; -using Orchard.ContentManagement; -using Orchard.ContentManagement.Drivers; -using Orchard.ContentManagement.Aspects; -using Orchard.Services; -using Orchard.Localization; using Orchard.Comments.Services; +using Orchard.ContentManagement; +using Orchard.ContentManagement.Aspects; +using Orchard.ContentManagement.Drivers; +using Orchard.ContentManagement.Handlers; +using Orchard.Localization; +using Orchard.Services; using Orchard.UI.Notify; namespace Orchard.Comments.Drivers { @@ -41,17 +42,17 @@ namespace Orchard.Comments.Drivers { return Combined( ContentShape("Parts_Comment", () => shapeHelper.Parts_Comment()), ContentShape("Parts_Comment_SummaryAdmin", () => shapeHelper.Parts_Comment_SummaryAdmin()) - ); + ); } // GET protected override DriverResult Editor(CommentPart part, dynamic shapeHelper) { if (UI.Admin.AdminFilter.IsApplied(_workContextAccessor.GetContext().HttpContext.Request.RequestContext)) { - return ContentShape("Parts_Comment_AdminEdit", + return ContentShape("Parts_Comment_AdminEdit", () => shapeHelper.EditorTemplate(TemplateName: "Parts.Comment.AdminEdit", Model: part, Prefix: Prefix)); } else { - return ContentShape("Parts_Comment_Edit", + return ContentShape("Parts_Comment_Edit", () => shapeHelper.EditorTemplate(TemplateName: "Parts.Comment", Model: part, Prefix: Prefix)); } } @@ -102,9 +103,9 @@ namespace Orchard.Comments.Drivers { } var currentUser = workContext.CurrentUser; - part.UserName = (currentUser != null ? currentUser.UserName : null); + part.UserName = currentUser?.UserName; - if (currentUser != null) + if (currentUser != null) part.Author = currentUser.UserName; else if (string.IsNullOrWhiteSpace(part.Author)) { updater.AddModelError("Comments.Author", T("Name is mandatory")); @@ -227,5 +228,33 @@ namespace Orchard.Comments.Drivers { } } } + + protected override void Cloning(CommentPart originalPart, CommentPart clonePart, CloneContentContext context) { + clonePart.Author = originalPart.Author; + clonePart.SiteName = originalPart.SiteName; + clonePart.UserName = originalPart.UserName; + clonePart.Email = originalPart.Email; + clonePart.Position = originalPart.Position; + clonePart.Status = originalPart.Status; + clonePart.CommentDateUtc = originalPart.CommentDateUtc; + clonePart.CommentText = originalPart.CommentText; + var commentedOn = _contentManager.Get(originalPart.CommentedOn); + if (commentedOn != null) { + clonePart.CommentedOn = originalPart.CommentedOn; + } + if (originalPart.RepliedOn.HasValue) { + var repliedOn = _contentManager.Get(originalPart.RepliedOn.Value); + if (repliedOn != null) { + clonePart.RepliedOn = originalPart.RepliedOn; + } + } + else { + clonePart.RepliedOn = null; + } + var commentedOnContainer = _contentManager.Get(originalPart.CommentedOnContainer); + if (commentedOnContainer != null) { + clonePart.CommentedOnContainer = originalPart.CommentedOnContainer; + } + } } } diff --git a/src/Orchard.Web/Modules/Orchard.ContentPermissions/Drivers/ContentPermissionsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.ContentPermissions/Drivers/ContentPermissionsPartDriver.cs index c10971e25..bf3389b2e 100644 --- a/src/Orchard.Web/Modules/Orchard.ContentPermissions/Drivers/ContentPermissionsPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.ContentPermissions/Drivers/ContentPermissionsPartDriver.cs @@ -5,13 +5,13 @@ using System.Xml; using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; using Orchard.ContentManagement.Handlers; +using Orchard.ContentPermissions.Models; +using Orchard.ContentPermissions.Settings; +using Orchard.ContentPermissions.ViewModels; using Orchard.Localization; using Orchard.Roles.Models; using Orchard.Roles.Services; using Orchard.Security; -using Orchard.ContentPermissions.Models; -using Orchard.ContentPermissions.Settings; -using Orchard.ContentPermissions.ViewModels; namespace Orchard.ContentPermissions.Drivers { public class ContentPermissionsPartDriver : ContentPartDriver { @@ -50,7 +50,7 @@ namespace Orchard.ContentPermissions.Drivers { var allRoles = _roleService.GetRoles().Select(x => x.Name).OrderBy(x => x).ToList(); - if(settings == null) { + if (settings == null) { settings = new ContentPermissionsPartSettings { View = ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry { Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.ViewContent, UserSimulation.Create(x), null) }).ToList()), ViewOwn = ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry { Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.ViewOwnContent, UserSimulation.Create(x), null) }).ToList()), @@ -73,12 +73,12 @@ namespace Orchard.ContentPermissions.Drivers { model = new ContentPermissionsPartViewModel { ViewRoles = ContentPermissionsPartViewModel.ExtractRoleEntries(allRoles, settings.View), ViewOwnRoles = ContentPermissionsPartViewModel.ExtractRoleEntries(allRoles, settings.ViewOwn), - PublishRoles= ContentPermissionsPartViewModel.ExtractRoleEntries(allRoles, settings.Publish), - PublishOwnRoles= ContentPermissionsPartViewModel.ExtractRoleEntries(allRoles, settings.PublishOwn), - EditRoles= ContentPermissionsPartViewModel.ExtractRoleEntries(allRoles, settings.Edit), - EditOwnRoles= ContentPermissionsPartViewModel.ExtractRoleEntries(allRoles, settings.EditOwn), - DeleteRoles= ContentPermissionsPartViewModel.ExtractRoleEntries(allRoles, settings.Delete), - DeleteOwnRoles= ContentPermissionsPartViewModel.ExtractRoleEntries(allRoles, settings.DeleteOwn), + PublishRoles = ContentPermissionsPartViewModel.ExtractRoleEntries(allRoles, settings.Publish), + PublishOwnRoles = ContentPermissionsPartViewModel.ExtractRoleEntries(allRoles, settings.PublishOwn), + EditRoles = ContentPermissionsPartViewModel.ExtractRoleEntries(allRoles, settings.Edit), + EditOwnRoles = ContentPermissionsPartViewModel.ExtractRoleEntries(allRoles, settings.EditOwn), + DeleteRoles = ContentPermissionsPartViewModel.ExtractRoleEntries(allRoles, settings.Delete), + DeleteOwnRoles = ContentPermissionsPartViewModel.ExtractRoleEntries(allRoles, settings.DeleteOwn), PreviewRoles = ContentPermissionsPartViewModel.ExtractRoleEntries(allRoles, settings.Preview), PreviewOwnRoles = ContentPermissionsPartViewModel.ExtractRoleEntries(allRoles, settings.PreviewOwn), AllRoles = ContentPermissionsPartViewModel.ExtractRoleEntries(allRoles, settings.DisplayedRoles) @@ -185,46 +185,60 @@ namespace Orchard.ContentPermissions.Drivers { context.ImportAttribute(part.PartDefinition.Name, "PreviewOwnContent", s => part.PreviewOwnContent = s); } + protected override void Cloning(ContentPermissionsPart originalPart, ContentPermissionsPart clonePart, CloneContentContext context) { + clonePart.Enabled = originalPart.Enabled; + clonePart.ViewContent = originalPart.ViewContent; + clonePart.EditContent = originalPart.EditContent; + clonePart.PublishContent = originalPart.PublishContent; + clonePart.DeleteContent = originalPart.DeleteContent; + clonePart.PreviewContent = originalPart.PreviewContent; + clonePart.ViewOwnContent = originalPart.ViewOwnContent; + clonePart.EditOwnContent = originalPart.EditOwnContent; + clonePart.PublishOwnContent = originalPart.PublishOwnContent; + clonePart.DeleteOwnContent = originalPart.DeleteOwnContent; + clonePart.PreviewOwnContent = originalPart.PreviewOwnContent; + } + private void OverrideDefaultPermissions(ContentPermissionsPart part, List allRoles, ContentPermissionsPartSettings settings) { // reset permissions the user can't change if (!_authorizer.Authorize(Core.Contents.Permissions.ViewContent, part.ContentItem)) { - part.ViewContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry {Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.ViewContent, UserSimulation.Create(x), null)})) : settings.View; + part.ViewContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry { Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.ViewContent, UserSimulation.Create(x), null) })) : settings.View; } if (!_authorizer.Authorize(Core.Contents.Permissions.ViewOwnContent, part.ContentItem)) { - part.ViewOwnContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry {Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.ViewOwnContent, UserSimulation.Create(x), null)})) : settings.ViewOwn; + part.ViewOwnContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry { Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.ViewOwnContent, UserSimulation.Create(x), null) })) : settings.ViewOwn; } if (!_authorizer.Authorize(Core.Contents.Permissions.PublishContent, part.ContentItem)) { - part.PublishContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry {Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.PublishContent, UserSimulation.Create(x), null)})) : settings.Publish; + part.PublishContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry { Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.PublishContent, UserSimulation.Create(x), null) })) : settings.Publish; } if (!_authorizer.Authorize(Core.Contents.Permissions.PublishOwnContent, part.ContentItem)) { - part.PublishOwnContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry {Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.PublishOwnContent, UserSimulation.Create(x), null)})) : settings.PublishOwn; + part.PublishOwnContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry { Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.PublishOwnContent, UserSimulation.Create(x), null) })) : settings.PublishOwn; } if (!_authorizer.Authorize(Core.Contents.Permissions.EditContent, part.ContentItem)) { - part.EditContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry {Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.EditContent, UserSimulation.Create(x), null)})) : settings.Edit; + part.EditContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry { Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.EditContent, UserSimulation.Create(x), null) })) : settings.Edit; } if (!_authorizer.Authorize(Core.Contents.Permissions.EditOwnContent, part.ContentItem)) { - part.EditOwnContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry {Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.EditOwnContent, UserSimulation.Create(x), null)})) : settings.EditOwn; + part.EditOwnContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry { Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.EditOwnContent, UserSimulation.Create(x), null) })) : settings.EditOwn; } if (!_authorizer.Authorize(Core.Contents.Permissions.DeleteContent, part.ContentItem)) { - part.DeleteContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry {Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.DeleteContent, UserSimulation.Create(x), null)})) : settings.Delete; + part.DeleteContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry { Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.DeleteContent, UserSimulation.Create(x), null) })) : settings.Delete; } if (!_authorizer.Authorize(Core.Contents.Permissions.DeleteOwnContent, part.ContentItem)) { - part.DeleteOwnContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry {Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.DeleteOwnContent, UserSimulation.Create(x), null)})) : settings.DeleteOwn; + part.DeleteOwnContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry { Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.DeleteOwnContent, UserSimulation.Create(x), null) })) : settings.DeleteOwn; } if (!_authorizer.Authorize(Core.Contents.Permissions.PreviewContent, part.ContentItem)) { - part.PreviewContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry {Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.PreviewContent, UserSimulation.Create(x), null)})) : settings.Preview; + part.PreviewContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry { Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.PreviewContent, UserSimulation.Create(x), null) })) : settings.Preview; } if (!_authorizer.Authorize(Core.Contents.Permissions.PreviewOwnContent, part.ContentItem)) { - part.PreviewOwnContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry {Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.PreviewOwnContent, UserSimulation.Create(x), null)})) : settings.PreviewOwn; + part.PreviewOwnContent = settings == null ? ContentPermissionsPartViewModel.SerializePermissions(allRoles.Select(x => new RoleEntry { Role = x, Checked = _authorizationService.TryCheckAccess(Core.Contents.Permissions.PreviewOwnContent, UserSimulation.Create(x), null) })) : settings.PreviewOwn; } } } diff --git a/src/Orchard.Web/Modules/Orchard.ContentPicker/Drivers/ContentMenuItemPartDriver.cs b/src/Orchard.Web/Modules/Orchard.ContentPicker/Drivers/ContentMenuItemPartDriver.cs index 3ce50ed99..e17d0094c 100644 --- a/src/Orchard.Web/Modules/Orchard.ContentPicker/Drivers/ContentMenuItemPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.ContentPicker/Drivers/ContentMenuItemPartDriver.cs @@ -4,8 +4,6 @@ using Orchard.ContentManagement.Handlers; using Orchard.ContentPicker.Models; using Orchard.ContentPicker.ViewModels; using Orchard.Core.Navigation; -using Orchard.Core.Navigation.Models; -using Orchard.Core.Navigation.ViewModels; using Orchard.Localization; using Orchard.Security; @@ -17,7 +15,7 @@ namespace Orchard.ContentPicker.Drivers { public ContentMenuItemPartDriver( IContentManager contentManager, - IAuthorizationService authorizationService, + IAuthorizationService authorizationService, IWorkContextAccessor workContextAccessor) { _contentManager = contentManager; _authorizationService = authorizationService; @@ -29,14 +27,13 @@ namespace Orchard.ContentPicker.Drivers { public Localizer T { get; set; } protected override DriverResult Editor(ContentMenuItemPart part, dynamic shapeHelper) { - return ContentShape("Parts_ContentMenuItem_Edit", - () => { - var model = new ContentMenuItemEditViewModel { - ContentItemId = part.Content == null ? -1 : part.Content.Id, - Part = part - }; - return shapeHelper.EditorTemplate(TemplateName: "Parts.ContentMenuItem.Edit", Model: model, Prefix: Prefix); - }); + return ContentShape("Parts_ContentMenuItem_Edit", () => { + var model = new ContentMenuItemEditViewModel { + ContentItemId = part.Content == null ? -1 : part.Content.Id, + Part = part + }; + return shapeHelper.EditorTemplate(TemplateName: "Parts.ContentMenuItem.Edit", Model: model, Prefix: Prefix); + }); } protected override DriverResult Editor(ContentMenuItemPart part, IUpdateModel updater, dynamic shapeHelper) { @@ -48,9 +45,9 @@ namespace Orchard.ContentPicker.Drivers { var model = new ContentMenuItemEditViewModel(); - if(updater.TryUpdateModel(model, Prefix, null, null)) { + if (updater.TryUpdateModel(model, Prefix, null, null)) { var contentItem = _contentManager.Get(model.ContentItemId, VersionOptions.Latest); - if(contentItem == null) { + if (contentItem == null) { updater.AddModelError("ContentItemId", T("You must select a Content Item")); } else { @@ -67,12 +64,14 @@ namespace Orchard.ContentPicker.Drivers { return; } - context.ImportAttribute(part.PartDefinition.Name, "ContentItem", + context.ImportAttribute( + part.PartDefinition.Name, + "ContentItem", contentItemId => { var contentItem = context.GetItemFromSession(contentItemId); part.Content = contentItem; - }, () => - part.Content = null + }, + () => part.Content = null ); } @@ -85,5 +84,9 @@ namespace Orchard.ContentPicker.Drivers { } } } + + protected override void Cloning(ContentMenuItemPart originalPart, ContentMenuItemPart clonePart, CloneContentContext context) { + clonePart.Content = originalPart.Content; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/AudioPartDriver.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/AudioPartDriver.cs index 859db198b..acfcf7c84 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/AudioPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/AudioPartDriver.cs @@ -10,7 +10,7 @@ namespace Orchard.MediaLibrary.Drivers { ContentShape("Parts_Audio_SummaryAdmin", () => shapeHelper.Parts_Audio_SummaryAdmin()), ContentShape("Parts_Audio_Summary", () => shapeHelper.Parts_Audio_Summary()), ContentShape("Parts_Audio", () => shapeHelper.Parts_Audio()) - ); + ); } protected override void Exporting(AudioPart part, ContentManagement.Handlers.ExportContentContext context) { @@ -27,6 +27,7 @@ namespace Orchard.MediaLibrary.Drivers { part.Length = int.Parse(length) ); } + protected override void Cloning(AudioPart originalPart, AudioPart clonePart, CloneContentContext context) { clonePart.Length = originalPart.Length; } diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/DocumentPartDriver.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/DocumentPartDriver.cs index 0ef734942..f586bf44f 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/DocumentPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/DocumentPartDriver.cs @@ -27,6 +27,7 @@ namespace Orchard.MediaLibrary.Drivers { part.Length = int.Parse(length) ); } + protected override void Cloning(DocumentPart originalPart, DocumentPart clonePart, CloneContentContext context) { clonePart.Length = originalPart.Length; } diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/MediaPartDriver.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/MediaPartDriver.cs index 6aa91d1d9..b2be5d04b 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/MediaPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/MediaPartDriver.cs @@ -32,10 +32,11 @@ namespace Orchard.MediaLibrary.Drivers { } protected override DriverResult Editor(MediaPart part, dynamic shapeHelper) { - return ContentShape("Parts_Media_Edit", () => shapeHelper.EditorTemplate(TemplateName: "Parts.Media.Edit", Model: part, Prefix: Prefix)); + return ContentShape("Parts_Media_Edit", + () => shapeHelper.EditorTemplate(TemplateName: "Parts.Media.Edit", Model: part, Prefix: Prefix)); } - protected override void Importing(MediaPart part, ContentManagement.Handlers.ImportContentContext context) { + protected override void Importing(MediaPart part, ImportContentContext context) { // Don't do anything if the tag is not specified. if (context.Data.Element(part.PartDefinition.Name) == null) { return; @@ -76,12 +77,12 @@ namespace Orchard.MediaLibrary.Drivers { } protected override void Cloning(MediaPart originalPart, MediaPart clonePart, CloneContentContext context) { - clonePart.Caption = originalPart.Caption; - clonePart.FileName = originalPart.FileName; - clonePart.FolderPath = originalPart.FolderPath; - clonePart.LogicalType = originalPart.LogicalType; - clonePart.AlternateText = originalPart.AlternateText; clonePart.MimeType = originalPart.MimeType; + clonePart.Caption = originalPart.Caption; + clonePart.AlternateText = originalPart.AlternateText; + clonePart.FolderPath = originalPart.FolderPath; + clonePart.FileName = originalPart.FileName; + clonePart.LogicalType = originalPart.LogicalType; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/OEmbedPartDriver.cs b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/OEmbedPartDriver.cs index 81da1f09b..3742aa439 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/OEmbedPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaLibrary/Drivers/OEmbedPartDriver.cs @@ -1,11 +1,10 @@ -using Orchard.ContentManagement; +using System.Xml; +using System.Xml.Linq; +using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; using Orchard.ContentManagement.FieldStorage.InfosetStorage; -using Orchard.MediaLibrary.Models; -using System.Xml; -using System.Xml.Linq; using Orchard.ContentManagement.Handlers; -using System.Collections; +using Orchard.MediaLibrary.Models; namespace Orchard.MediaLibrary.Drivers { public class OEmbedPartDriver : ContentPartDriver { diff --git a/src/Orchard.Web/Modules/Orchard.MediaProcessing/Drivers/ImageProfilePartDriver.cs b/src/Orchard.Web/Modules/Orchard.MediaProcessing/Drivers/ImageProfilePartDriver.cs index 4eaed50a2..75d900ff6 100644 --- a/src/Orchard.Web/Modules/Orchard.MediaProcessing/Drivers/ImageProfilePartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.MediaProcessing/Drivers/ImageProfilePartDriver.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Xml.Linq; using Orchard.ContentManagement; @@ -27,26 +28,26 @@ namespace Orchard.MediaProcessing.Drivers { get { return "MediaProcessing"; } } - protected override DriverResult Display(ImageProfilePart part, string displayType, dynamic shapeHelper) { - return ContentShape("Parts_MediaProcessing_ImageProfile", - () => shapeHelper.Parts_MediaProcessing_ImageProfile(Name: part.Name)); - } + protected override DriverResult Display(ImageProfilePart part, string displayType, dynamic shapeHelper) => + ContentShape("Parts_MediaProcessing_ImageProfile", () => + shapeHelper.Parts_MediaProcessing_ImageProfile(Name: part.Name)); protected override DriverResult Editor(ImageProfilePart part, dynamic shapeHelper) { var viewModel = new ImageProfileViewModel { Name = part.Name }; - return ContentShape("Parts_MediaProcessing_ImageProfile_Edit", - () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: viewModel, Prefix: Prefix)); + + return ContentShape("Parts_MediaProcessing_ImageProfile_Edit", () => + shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: viewModel, Prefix: Prefix)); } protected override DriverResult Editor(ImageProfilePart part, IUpdateModel updater, dynamic shapeHelper) { var currentName = part.Name; var viewModel = new ImageProfileViewModel(); - + // It would be nice if IUpdateModel provided access to the IsValid property of the Controller, instead of having to track a local flag. var isValid = updater.TryUpdateModel(viewModel, Prefix, null, null); - if (String.IsNullOrWhiteSpace(viewModel.Name)) { + if (string.IsNullOrWhiteSpace(viewModel.Name)) { updater.AddModelError("Name", T("The Name can't be empty.")); isValid = false; } @@ -71,17 +72,17 @@ namespace Orchard.MediaProcessing.Drivers { element.Add( new XAttribute("Name", part.Name), new XElement("Filters", - part.Filters.Select(filter => - new XElement("Filter", - new XAttribute("Description", filter.Description ?? ""), - new XAttribute("Category", filter.Category ?? ""), - new XAttribute("Type", filter.Type ?? ""), - new XAttribute("Position", filter.Position), - new XAttribute("State", filter.State ?? "") - ) - ) + part.Filters.Select(filter => + new XElement("Filter", + new XAttribute("Description", filter.Description ?? ""), + new XAttribute("Category", filter.Category ?? ""), + new XAttribute("Type", filter.Type ?? ""), + new XAttribute("Position", filter.Position), + new XAttribute("State", filter.State ?? "") + ) ) - ); + ) + ); } protected override void Importing(ImageProfilePart part, ImportContentContext context) { @@ -106,5 +107,21 @@ namespace Orchard.MediaProcessing.Drivers { part.Record.Filters.Add(result); } } + + protected override void Cloning(ImageProfilePart originalPart, ImageProfilePart clonePart, CloneContentContext context) { + clonePart.Name = originalPart.Name; + clonePart.ModifiedUtc = originalPart.ModifiedUtc; + clonePart.Record.FileNames = new List(); + clonePart.Record.Filters = originalPart.Filters.Select(filter => + new FilterRecord { + Description = filter.Description, + Category = filter.Category, + Type = filter.Type, + Position = filter.Position, + State = filter.State, + ImageProfilePartRecord = clonePart.Record + }).ToList( + ); + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Projections/Drivers/NavigationQueryPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Projections/Drivers/NavigationQueryPartDriver.cs index 0babaebc0..70d537b46 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/Drivers/NavigationQueryPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/Drivers/NavigationQueryPartDriver.cs @@ -1,5 +1,4 @@ -using System; -using System.Linq; +using System.Linq; using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; using Orchard.ContentManagement.Handlers; @@ -29,12 +28,12 @@ namespace Orchard.Projections.Drivers { protected override DriverResult Editor(NavigationQueryPart part, dynamic shapeHelper) { return ContentShape("Parts_NavigationQueryPart_Edit", () => { - var model = new NavigationQueryPartEditViewModel { Items = part.Items, Skip = part.Skip, - QueryRecordId = part.QueryPartRecord == null ? "-1" : part.QueryPartRecord.Id.ToString(), - Queries = Services.ContentManager.Query().Join().OrderBy(x => x.Title).List(), + QueryRecordId = part.QueryPartRecord == null ? "-1" : part.QueryPartRecord.Id.ToString(), + Queries = Services.ContentManager.Query() + .Join().OrderBy(x => x.Title).List(), }; return shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix); @@ -47,7 +46,7 @@ namespace Orchard.Projections.Drivers { if (updater.TryUpdateModel(model, Prefix, null, null)) { part.Record.Items = model.Items; part.Record.Skip = model.Skip; - part.Record.QueryPartRecord = _queryRepository.Get(Int32.Parse(model.QueryRecordId)); + part.Record.QueryPartRecord = _queryRepository.Get(int.Parse(model.QueryRecordId)); } return Editor(part, shapeHelper); @@ -59,8 +58,8 @@ namespace Orchard.Projections.Drivers { return; } - context.ImportAttribute(part.PartDefinition.Name, "Items", x => part.Record.Items = Int32.Parse(x)); - context.ImportAttribute(part.PartDefinition.Name, "Offset", x => part.Record.Skip = Int32.Parse(x)); + context.ImportAttribute(part.PartDefinition.Name, "Items", x => part.Record.Items = int.Parse(x)); + context.ImportAttribute(part.PartDefinition.Name, "Offset", x => part.Record.Skip = int.Parse(x)); } protected override void Imported(NavigationQueryPart part, ImportContentContext context) { @@ -70,18 +69,25 @@ namespace Orchard.Projections.Drivers { part.Record.QueryPartRecord = context.GetItemFromSession(query).As().Record; } } - + protected override void Exporting(NavigationQueryPart part, ExportContentContext context) { context.Element(part.PartDefinition.Name).SetAttributeValue("Items", part.Record.Items); context.Element(part.PartDefinition.Name).SetAttributeValue("Offset", part.Record.Skip); if (part.Record.QueryPartRecord != null) { - var queryPart = Services.ContentManager.Query("Query").Where(x => x.Id == part.Record.QueryPartRecord.Id).List().FirstOrDefault(); + var queryPart = Services.ContentManager.Query("Query") + .Where(x => x.Id == part.Record.QueryPartRecord.Id).List().FirstOrDefault(); if (queryPart != null) { var queryIdentity = Services.ContentManager.GetItemMetadata(queryPart).Identity; context.Element(part.PartDefinition.Name).SetAttributeValue("Query", queryIdentity.ToString()); } } } + + protected override void Cloning(NavigationQueryPart originalPart, NavigationQueryPart clonePart, CloneContentContext context) { + clonePart.Items = originalPart.Items; + clonePart.Skip = originalPart.Skip; + clonePart.QueryPartRecord = originalPart.QueryPartRecord; + } } } diff --git a/src/Orchard.Web/Modules/Orchard.Projections/Drivers/QueryPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Projections/Drivers/QueryPartDriver.cs index fa38c9d79..a67516286 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/Drivers/QueryPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/Drivers/QueryPartDriver.cs @@ -10,7 +10,6 @@ using Orchard.Projections.Services; using Orchard.Projections.ViewModels; namespace Orchard.Projections.Drivers { - public class QueryPartDriver : ContentPartDriver { private readonly IProjectionManager _projectionManager; private readonly IFormManager _formManager; @@ -126,7 +125,8 @@ namespace Orchard.Projections.Drivers { return; } - context.ImportAttribute(part.PartDefinition.Name, "VersionScope", scope => part.VersionScope = (QueryVersionScopeOptions)Enum.Parse(typeof(QueryVersionScopeOptions), scope)); + context.ImportAttribute(part.PartDefinition.Name, "VersionScope", scope => + part.VersionScope = (QueryVersionScopeOptions)Enum.Parse(typeof(QueryVersionScopeOptions), scope)); var queryElement = context.Data.Element(part.PartDefinition.Name); @@ -197,7 +197,9 @@ namespace Orchard.Projections.Drivers { DisplayType = layout.Attribute("DisplayType").Value, State = state, Type = type, - GUIdentifier = string.IsNullOrWhiteSpace(layout.Attribute("GUIdentifier").Value) ? Guid.NewGuid().ToString() : layout.Attribute("GUIdentifier").Value, + GUIdentifier = string.IsNullOrWhiteSpace(layout.Attribute("GUIdentifier").Value) + ? Guid.NewGuid().ToString() + : layout.Attribute("GUIdentifier").Value, Properties = layout.Element("Properties").Elements("Property").Select(GetProperty).ToList(), GroupProperty = GetProperty(layout.Element("Group").Element("Property")) }; @@ -287,5 +289,92 @@ namespace Orchard.Projections.Drivers { ZeroIsEmpty = Convert.ToBoolean(property.Attribute("ZeroIsEmpty").Value), }; } + + protected override void Cloning(QueryPart originalPart, QueryPart clonePart, CloneContentContext context) { + clonePart.VersionScope = originalPart.VersionScope; + + clonePart.Record.FilterGroups = originalPart.FilterGroups.Select(originalGroup => { + var cloneGroup = new FilterGroupRecord { + QueryPartRecord = clonePart.Record + }; + + cloneGroup.Filters = originalGroup.Filters.Select(filter => new FilterRecord { + Category = filter.Category, + Description = filter.Description, + Position = filter.Position, + State = filter.State, + Type = filter.Type, + FilterGroupRecord = cloneGroup + }).ToList(); + + return cloneGroup; + }).ToList(); + + clonePart.Record.SortCriteria = originalPart.SortCriteria.Select(sortCriterion => new SortCriterionRecord { + Category = sortCriterion.Category, + Description = sortCriterion.Description, + Position = sortCriterion.Position, + State = sortCriterion.State, + Type = sortCriterion.Type, + QueryPartRecord = clonePart.Record + }).ToList(); + + clonePart.Record.Layouts = originalPart.Layouts.Select(layout => { + var cloneLayout = new LayoutRecord { + Category = layout.Category, + Description = layout.Description, + Display = layout.Display, + DisplayType = layout.DisplayType, + GUIdentifier = Guid.NewGuid().ToString(), + State = layout.State, + Type = layout.Type, + QueryPartRecord = clonePart.Record + }; + + cloneLayout.Properties = layout.Properties.Select(property => { + var cloneProperty = new PropertyRecord { + AddEllipsis = property.AddEllipsis, + Category = property.Category, + CreateLabel = property.CreateLabel, + CustomLabelCss = property.CustomLabelCss, + Description = property.Description, + CustomLabelTag = property.CustomLabelTag, + CustomPropertyCss = property.CustomPropertyCss, + CustomPropertyTag = property.CustomPropertyTag, + CustomWrapperCss = property.CustomWrapperCss, + CustomWrapperTag = property.CustomWrapperTag, + CustomizeLabelHtml = property.CustomizeLabelHtml, + CustomizePropertyHtml = property.CustomizePropertyHtml, + CustomizeWrapperHtml = property.CustomizeWrapperHtml, + ExcludeFromDisplay = property.ExcludeFromDisplay, + HideEmpty = property.HideEmpty, + Label = property.Label, + LinkToContent = property.LinkToContent, + MaxLength = property.MaxLength, + NoResultText = property.NoResultText, + Position = property.Position, + PreserveLines = property.PreserveLines, + RewriteOutputCondition = property.RewriteOutputCondition, + RewriteText = property.RewriteText, + State = property.State, + StripHtmlTags = property.StripHtmlTags, + TrimLength = property.TrimLength, + TrimOnWordBoundary = property.TrimOnWordBoundary, + TrimWhiteSpace = property.TrimWhiteSpace, + Type = property.Type, + ZeroIsEmpty = property.ZeroIsEmpty, + LayoutRecord = cloneLayout + }; + + if (cloneLayout.GroupProperty == null && layout.GroupProperty == property) { + cloneLayout.GroupProperty = cloneProperty; + } + + return cloneProperty; + }).ToList(); + + return cloneLayout; + }).ToList(); + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.PublishLater/Drivers/PublishLaterPartDriver.cs b/src/Orchard.Web/Modules/Orchard.PublishLater/Drivers/PublishLaterPartDriver.cs index 9efc3e4d9..2c968ac21 100644 --- a/src/Orchard.Web/Modules/Orchard.PublishLater/Drivers/PublishLaterPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.PublishLater/Drivers/PublishLaterPartDriver.cs @@ -56,12 +56,12 @@ namespace Orchard.PublishLater.Drivers { protected override DriverResult Display(PublishLaterPart part, string displayType, dynamic shapeHelper) { return Combined( ContentShape("Parts_PublishLater_Metadata", - () => shapeHelper.Parts_PublishLater_Metadata(ScheduledPublishUtc: part.ScheduledPublishUtc.Value)), + () => shapeHelper.Parts_PublishLater_Metadata(ScheduledPublishUtc: part.ScheduledPublishUtc.Value)), ContentShape("Parts_PublishLater_Metadata_Summary", - () => shapeHelper.Parts_PublishLater_Metadata_Summary(ScheduledPublishUtc: part.ScheduledPublishUtc.Value)), + () => shapeHelper.Parts_PublishLater_Metadata_Summary(ScheduledPublishUtc: part.ScheduledPublishUtc.Value)), ContentShape("Parts_PublishLater_Metadata_SummaryAdmin", - () => shapeHelper.Parts_PublishLater_Metadata_SummaryAdmin(ScheduledPublishUtc: part.ScheduledPublishUtc.Value)) - ); + () => shapeHelper.Parts_PublishLater_Metadata_SummaryAdmin(ScheduledPublishUtc: part.ScheduledPublishUtc.Value)) + ); } private PublishLaterViewModel BuildViewModelFromPart(PublishLaterPart part) { @@ -79,7 +79,7 @@ namespace Orchard.PublishLater.Drivers { var model = BuildViewModelFromPart(part); return ContentShape("Parts_PublishLater_Edit", - () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix)); + () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix)); } protected override DriverResult Editor(PublishLaterPart part, IUpdateModel updater, dynamic shapeHelper) { @@ -101,7 +101,7 @@ namespace Orchard.PublishLater.Drivers { } } catch (FormatException) { - updater.AddModelError(Prefix, T("'{0} {1}' could not be parsed as a valid date and time.", model.Editor.Date, model.Editor.Time)); + updater.AddModelError(Prefix, T("'{0} {1}' could not be parsed as a valid date and time.", model.Editor.Date, model.Editor.Time)); } } else { @@ -134,5 +134,9 @@ namespace Orchard.PublishLater.Drivers { .SetAttributeValue("ScheduledPublishUtc", XmlConvert.ToString(scheduled.Value, XmlDateTimeSerializationMode.Utc)); } } + + protected override void Cloning(PublishLaterPart originalPart, PublishLaterPart clonePart, CloneContentContext context) { + clonePart.ScheduledPublishUtc.Value = originalPart.ScheduledPublishUtc.Value; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Roles/Drivers/UserRolesPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Roles/Drivers/UserRolesPartDriver.cs index 662b6f4d1..65f4792b2 100644 --- a/src/Orchard.Web/Modules/Orchard.Roles/Drivers/UserRolesPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Roles/Drivers/UserRolesPartDriver.cs @@ -1,8 +1,10 @@ using System; +using System.Collections.Generic; using System.Linq; -using Orchard.ContentManagement.Drivers; -using Orchard.Data; using Orchard.ContentManagement; +using Orchard.ContentManagement.Drivers; +using Orchard.ContentManagement.Handlers; +using Orchard.Data; using Orchard.Localization; using Orchard.Roles.Events; using Orchard.Roles.Models; @@ -10,7 +12,6 @@ using Orchard.Roles.Services; using Orchard.Roles.ViewModels; using Orchard.Security; using Orchard.UI.Notify; -using System.Collections.Generic; namespace Orchard.Roles.Drivers { public class UserRolesPartDriver : ContentPartDriver { @@ -49,42 +50,38 @@ namespace Orchard.Roles.Drivers { public Localizer T { get; set; } - private Lazy> _allRoles; + private readonly Lazy> _allRoles; - protected override DriverResult Editor(UserRolesPart userRolesPart, dynamic shapeHelper) { - - return ContentShape("Parts_Roles_UserRoles_Edit", - () => { - var currentUser = _authenticationService.GetAuthenticatedUser(); - // Get the roles we are authorized to assign - var authorizedRoleIds = _allRoles.Value - .Where(rr => _authorizationService.TryCheckAccess( - Permissions.CreatePermissionForAssignRole(rr.Name), - currentUser, - userRolesPart)) - .Select(rr => rr.Id).ToList(); - // If the user has no roles they can assign, we will show nothing - if (!authorizedRoleIds.Any()) { - return null; - } - var allRoles = _allRoles.Value - .Select(x => new UserRoleEntry { - RoleId = x.Id, - Name = x.Name, - Granted = userRolesPart.Roles.Contains(x.Name) - }); - var model = new UserRolesViewModel { - User = userRolesPart.As(), - UserRoles = userRolesPart, - Roles = allRoles.ToList(), - AuthorizedRoleIds = authorizedRoleIds - }; - return shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix); - }); - } + protected override DriverResult Editor(UserRolesPart userRolesPart, dynamic shapeHelper) => + ContentShape("Parts_Roles_UserRoles_Edit", () => { + var currentUser = _authenticationService.GetAuthenticatedUser(); + // Get the roles we are authorized to assign + var authorizedRoleIds = _allRoles.Value + .Where(rr => _authorizationService.TryCheckAccess( + Permissions.CreatePermissionForAssignRole(rr.Name), + currentUser, + userRolesPart)) + .Select(rr => rr.Id).ToList(); + // If the user has no roles they can assign, we will show nothing + if (!authorizedRoleIds.Any()) { + return null; + } + var allRoles = _allRoles.Value + .Select(x => new UserRoleEntry { + RoleId = x.Id, + Name = x.Name, + Granted = userRolesPart.Roles.Contains(x.Name) + }); + var model = new UserRolesViewModel { + User = userRolesPart.As(), + UserRoles = userRolesPart, + Roles = allRoles.ToList(), + AuthorizedRoleIds = authorizedRoleIds + }; + return shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix); + }); protected override DriverResult Editor(UserRolesPart userRolesPart, IUpdateModel updater, dynamic shapeHelper) { - var currentUser = _authenticationService.GetAuthenticatedUser(); // Get the roles we are authorized to assign var authorizedRoleIds = _allRoles.Value @@ -135,11 +132,10 @@ namespace Orchard.Roles.Drivers { () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix)); } - private static UserRolesViewModel BuildEditorViewModel(UserRolesPart userRolesPart) { - return new UserRolesViewModel { User = userRolesPart.As(), UserRoles = userRolesPart }; - } + private static UserRolesViewModel BuildEditorViewModel(UserRolesPart userRolesPart) => + new UserRolesViewModel { User = userRolesPart.As(), UserRoles = userRolesPart }; - protected override void Importing(UserRolesPart part, ContentManagement.Handlers.ImportContentContext context) { + protected override void Importing(UserRolesPart part, ImportContentContext context) { // Don't do anything if the tag is not specified. if (context.Data.Element(part.PartDefinition.Name) == null) { return; @@ -168,8 +164,8 @@ namespace Orchard.Roles.Drivers { }); } - protected override void Exporting(UserRolesPart part, ContentManagement.Handlers.ExportContentContext context) { + protected override void Exporting(UserRolesPart part, ExportContentContext context) { context.Element(part.PartDefinition.Name).SetAttributeValue("Roles", string.Join(",", part.Roles)); } } -} \ No newline at end of file +} diff --git a/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchFormPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchFormPartDriver.cs index 20915d493..4bb314b70 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchFormPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchFormPartDriver.cs @@ -37,7 +37,7 @@ namespace Orchard.Search.Drivers { }; if (updater != null) { - if (updater.TryUpdateModel(viewModel, Prefix, null, new[] {"AvailableIndexes"})) { + if (updater.TryUpdateModel(viewModel, Prefix, null, new[] { "AvailableIndexes" })) { part.OverrideIndex = viewModel.OverrideIndex; part.SelectedIndex = viewModel.SelectedIndex; } @@ -56,5 +56,10 @@ namespace Orchard.Search.Drivers { context.ImportAttribute(part.PartDefinition.Name, "OverrideIndex", x => part.OverrideIndex = XmlHelper.Parse(x)); context.ImportAttribute(part.PartDefinition.Name, "SelectedIndex", x => part.SelectedIndex = x); } + + protected override void Cloning(SearchFormPart originalPart, SearchFormPart clonePart, CloneContentContext context) { + clonePart.OverrideIndex = originalPart.OverrideIndex; + clonePart.SelectedIndex = originalPart.SelectedIndex; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchSettingsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchSettingsPartDriver.cs index 86f8f4db7..b1e78e35b 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchSettingsPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchSettingsPartDriver.cs @@ -9,7 +9,6 @@ using Orchard.Search.Models; using Orchard.Search.ViewModels; namespace Orchard.Search.Drivers { - public class SearchSettingsPartDriver : ContentPartDriver { private readonly IIndexManager _indexManager; @@ -22,10 +21,8 @@ namespace Orchard.Search.Drivers { protected override string Prefix { get { return "SearchSettings"; } } - protected override DriverResult Editor(SearchSettingsPart part, dynamic shapeHelper) { - return Editor(part, null, shapeHelper); - - } + protected override DriverResult Editor(SearchSettingsPart part, dynamic shapeHelper) => + Editor(part, null, shapeHelper); protected override DriverResult Editor(SearchSettingsPart part, IUpdateModel updater, dynamic shapeHelper) { return Combined( @@ -90,4 +87,4 @@ namespace Orchard.Search.Drivers { }); } } -} \ No newline at end of file +} diff --git a/src/Orchard.Web/Modules/Orchard.Tags/Drivers/TagCloudDriver.cs b/src/Orchard.Web/Modules/Orchard.Tags/Drivers/TagCloudDriver.cs index eb3fe1538..076cda966 100644 --- a/src/Orchard.Web/Modules/Orchard.Tags/Drivers/TagCloudDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Tags/Drivers/TagCloudDriver.cs @@ -8,30 +8,21 @@ using Orchard.Tags.Models; namespace Orchard.Tags.Drivers { [OrchardFeature("Orchard.Tags.TagCloud")] public class TagCloudDriver : ContentPartDriver { - - protected override string Prefix { - get { - return "tagcloud"; - } - } + protected override string Prefix => "tagcloud"; protected override DriverResult Display(TagCloudPart part, string displayType, dynamic shapeHelper) { - return ContentShape("Parts_TagCloud", - () => shapeHelper.Parts_TagCloud( - TagCounts: part.TagCounts, - ContentPart: part, - ContentItem: part.ContentItem)); + return ContentShape("Parts_TagCloud", () => shapeHelper.Parts_TagCloud( + TagCounts: part.TagCounts, + ContentPart: part, + ContentItem: part.ContentItem)); } - protected override DriverResult Editor(TagCloudPart part, dynamic shapeHelper) { + protected override DriverResult Editor(TagCloudPart part, dynamic shapeHelper) => + ContentShape("Parts_TagCloud_Edit", () => shapeHelper.EditorTemplate( + TemplateName: "Parts/TagCloud", + Model: part, + Prefix: Prefix)); - return ContentShape("Parts_TagCloud_Edit", - () => shapeHelper.EditorTemplate( - TemplateName: "Parts/TagCloud", - Model: part, - Prefix: Prefix)); - } - protected override DriverResult Editor(TagCloudPart part, IUpdateModel updater, dynamic shapeHelper) { updater.TryUpdateModel(part, Prefix, null, null); return Editor(part, shapeHelper); @@ -51,5 +42,10 @@ namespace Orchard.Tags.Drivers { part.Slug = context.Attribute(part.PartDefinition.Name, "Slug"); part.Buckets = Convert.ToInt32(context.Attribute(part.PartDefinition.Name, "Buckets")); } + + protected override void Cloning(TagCloudPart originalPart, TagCloudPart clonePart, CloneContentContext context) { + clonePart.Slug = originalPart.Slug; + clonePart.Buckets = originalPart.Buckets; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Taxonomies/Drivers/TaxonomyNavigationPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Taxonomies/Drivers/TaxonomyNavigationPartDriver.cs index 6cd72a5df..8f28a3471 100644 --- a/src/Orchard.Web/Modules/Orchard.Taxonomies/Drivers/TaxonomyNavigationPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Taxonomies/Drivers/TaxonomyNavigationPartDriver.cs @@ -23,9 +23,8 @@ namespace Orchard.Taxonomies.Drivers { protected override string Prefix { get { return "TaxonomyNavigationPart"; } } - protected override DriverResult Editor(TaxonomyNavigationPart part, dynamic shapeHelper) { - return Editor(part, null, shapeHelper); - } + protected override DriverResult Editor(TaxonomyNavigationPart part, dynamic shapeHelper) => + Editor(part, null, shapeHelper); protected override DriverResult Editor(TaxonomyNavigationPart part, IUpdateModel updater, dynamic shapeHelper) { return ContentShape( @@ -112,24 +111,27 @@ namespace Orchard.Taxonomies.Drivers { part.LevelsToDisplay = Int32.Parse(context.Attribute(part.PartDefinition.Name, "LevelsToDisplay")); var taxonomyId = context.Attribute(part.PartDefinition.Name, "TaxonomyId"); - var taxonomy = context.GetItemFromSession(taxonomyId); - - if (taxonomy == null) { - throw new OrchardException(T("Unknown taxonomy: {0}", taxonomyId)); - } + var taxonomy = context.GetItemFromSession(taxonomyId) + ?? throw new OrchardException(T("Unknown taxonomy: {0}", taxonomyId)); part.TaxonomyId = taxonomy.Id; - var termId = context.Attribute(part.PartDefinition.Name, "TermId"); - if (!String.IsNullOrEmpty(termId)) { - var term = context.GetItemFromSession(termId); - if (term == null) { - throw new OrchardException(T("Unknown term: {0}", termId)); - } + if (!String.IsNullOrEmpty(termId)) { + var term = context.GetItemFromSession(termId) + ?? throw new OrchardException(T("Unknown term: {0}", termId)); part.TermId = term.Id; } } + + protected override void Cloning(TaxonomyNavigationPart originalPart, TaxonomyNavigationPart clonePart, CloneContentContext context) { + clonePart.DisplayContentCount = originalPart.DisplayContentCount; + clonePart.DisplayRootTerm = originalPart.DisplayRootTerm; + clonePart.HideEmptyTerms = originalPart.HideEmptyTerms; + clonePart.LevelsToDisplay = originalPart.LevelsToDisplay; + clonePart.TaxonomyId = originalPart.TaxonomyId; + clonePart.TermId = originalPart.TermId; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Templates/Drivers/ShapePartDriver.cs b/src/Orchard.Web/Modules/Orchard.Templates/Drivers/ShapePartDriver.cs index dbd29f8a1..c10ce7c87 100644 --- a/src/Orchard.Web/Modules/Orchard.Templates/Drivers/ShapePartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Templates/Drivers/ShapePartDriver.cs @@ -5,13 +5,13 @@ using System.Xml.Linq; using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; using Orchard.ContentManagement.Handlers; +using Orchard.Core.Title.Models; using Orchard.Data; using Orchard.Localization; using Orchard.Templates.Models; using Orchard.Templates.Services; using Orchard.Templates.ViewModels; using Orchard.Utility.Extensions; -using Orchard.Core.Title.Models; namespace Orchard.Templates.Drivers { public class ShapePartDriver : ContentPartDriver { @@ -31,13 +31,11 @@ namespace Orchard.Templates.Drivers { Localizer T { get; set; } - protected override DriverResult Display(ShapePart part, string displayType, dynamic shapeHelper) { - return ContentShape("Parts_Shape_SummaryAdmin", () => shapeHelper.Parts_Shape_SummaryAdmin()); - } + protected override DriverResult Display(ShapePart part, string displayType, dynamic shapeHelper) => + ContentShape("Parts_Shape_SummaryAdmin", () => shapeHelper.Parts_Shape_SummaryAdmin()); - protected override DriverResult Editor(ShapePart part, dynamic shapeHelper) { - return Editor(part, null, shapeHelper); - } + protected override DriverResult Editor(ShapePart part, dynamic shapeHelper) => + Editor(part, null, shapeHelper); protected override DriverResult Editor(ShapePart part, IUpdateModel updater, dynamic shapeHelper) { var viewModel = new ShapePartViewModel { @@ -101,6 +99,11 @@ namespace Orchard.Templates.Drivers { } } + protected override void Cloning(ShapePart originalPart, ShapePart clonePart, CloneContentContext context) { + clonePart.Template = originalPart.Template; + clonePart.RenderingMode = originalPart.RenderingMode; + } + private bool ValidateShapeName(ShapePart part, IUpdateModel updater) { var titleViewModel = new TitleViewModel(); if (!updater.TryUpdateModel(titleViewModel, "Title", null, null)) diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Drivers/LayerPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Widgets/Drivers/LayerPartDriver.cs index 9390165c0..d161e5e59 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/Drivers/LayerPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Drivers/LayerPartDriver.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Linq; using Orchard.Conditions.Services; using Orchard.ContentManagement; @@ -10,7 +9,6 @@ using Orchard.Widgets.Models; using Orchard.Widgets.Services; namespace Orchard.Widgets.Drivers { - public class LayerPartDriver : ContentPartDriver { private readonly IConditionManager _conditionManager; private readonly IWidgetsService _widgetsService; @@ -18,7 +16,6 @@ namespace Orchard.Widgets.Drivers { public LayerPartDriver( IConditionManager conditionManager, IWidgetsService widgetsService) { - _conditionManager = conditionManager; _widgetsService = widgetsService; @@ -27,14 +24,9 @@ namespace Orchard.Widgets.Drivers { public Localizer T { get; set; } - protected override DriverResult Editor(LayerPart layerPart, dynamic shapeHelper) { - var results = new List { - ContentShape("Parts_Widgets_LayerPart", - () => shapeHelper.EditorTemplate(TemplateName: "Parts.Widgets.LayerPart", Model: layerPart, Prefix: Prefix)) - }; - - return Combined(results.ToArray()); - } + protected override DriverResult Editor(LayerPart layerPart, dynamic shapeHelper) => + ContentShape("Parts_Widgets_LayerPart", + () => shapeHelper.EditorTemplate(TemplateName: "Parts.Widgets.LayerPart", Model: layerPart, Prefix: Prefix)); protected override DriverResult Editor(LayerPart layerPart, IUpdateModel updater, dynamic shapeHelper) { if (updater.TryUpdateModel(layerPart, Prefix, null, null)) { @@ -87,5 +79,11 @@ namespace Orchard.Widgets.Drivers { context.Element(part.PartDefinition.Name).SetAttributeValue("Description", part.Description); context.Element(part.PartDefinition.Name).SetAttributeValue("LayerRule", part.LayerRule); } + + protected override void Cloning(LayerPart originalPart, LayerPart clonePart, CloneContentContext context) { + clonePart.Name = originalPart.Name; + clonePart.Description = originalPart.Description; + clonePart.LayerRule = originalPart.LayerRule; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Widgets/Drivers/WidgetPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Widgets/Drivers/WidgetPartDriver.cs index 0388c283b..29ec300dc 100644 --- a/src/Orchard.Web/Modules/Orchard.Widgets/Drivers/WidgetPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Widgets/Drivers/WidgetPartDriver.cs @@ -1,14 +1,13 @@ using System; -using System.Collections.Generic; using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; +using Orchard.ContentManagement.Handlers; using Orchard.Localization; using Orchard.Utility.Extensions; using Orchard.Widgets.Models; using Orchard.Widgets.Services; namespace Orchard.Widgets.Drivers { - public class WidgetPartDriver : ContentPartDriver { private readonly IWidgetsService _widgetsService; private readonly IContentManager _contentManager; @@ -16,7 +15,6 @@ namespace Orchard.Widgets.Drivers { public WidgetPartDriver(IWidgetsService widgetsService, IContentManager contentManager) { _widgetsService = widgetsService; _contentManager = contentManager; - T = NullLocalizer.Instance; } @@ -30,12 +28,8 @@ namespace Orchard.Widgets.Drivers { widgetPart.AvailableZones = _widgetsService.GetZones(); widgetPart.AvailableLayers = _widgetsService.GetLayers(); - var results = new List { - ContentShape("Parts_Widgets_WidgetPart", - () => shapeHelper.EditorTemplate(TemplateName: "Parts.Widgets.WidgetPart", Model: widgetPart, Prefix: Prefix)) - }; - - return Combined(results.ToArray()); + return ContentShape("Parts_Widgets_WidgetPart", + () => shapeHelper.EditorTemplate(TemplateName: "Parts.Widgets.WidgetPart", Model: widgetPart, Prefix: Prefix)); } protected override DriverResult Editor(WidgetPart widgetPart, IUpdateModel updater, dynamic shapeHelper) { @@ -100,5 +94,14 @@ namespace Orchard.Widgets.Drivers { context.Element(part.PartDefinition.Name).SetAttributeValue("Name", part.Name); context.Element(part.PartDefinition.Name).SetAttributeValue("CssClasses", part.CssClasses); } + + protected override void Cloning(WidgetPart originalPart, WidgetPart clonePart, CloneContentContext context) { + clonePart.Title = originalPart.Title; + clonePart.Position = originalPart.Position; + clonePart.Zone = originalPart.Zone; + clonePart.RenderTitle = originalPart.RenderTitle; + clonePart.Name = originalPart.Name; + clonePart.CssClasses = originalPart.CssClasses; + } } } diff --git a/src/Orchard/ContentManagement/Drivers/Coordinators/ContentPartDriverCoordinator.cs b/src/Orchard/ContentManagement/Drivers/Coordinators/ContentPartDriverCoordinator.cs index 10efd58ee..e32bb0061 100644 --- a/src/Orchard/ContentManagement/Drivers/Coordinators/ContentPartDriverCoordinator.cs +++ b/src/Orchard/ContentManagement/Drivers/Coordinators/ContentPartDriverCoordinator.cs @@ -31,8 +31,8 @@ namespace Orchard.ContentManagement.Drivers.Coordinators { foreach (var typePartDefinition in contentTypeDefinition.Parts) { var partName = typePartDefinition.PartDefinition.Name; var partInfo = partInfos.FirstOrDefault(pi => pi.PartName == partName); - var part = partInfo != null - ? partInfo.Factory(typePartDefinition) + var part = partInfo != null + ? partInfo.Factory(typePartDefinition) : new ContentPart { TypePartDefinition = typePartDefinition }; context.Builder.Weld(part); } @@ -45,24 +45,21 @@ namespace Orchard.ContentManagement.Drivers.Coordinators { public override void BuildDisplay(BuildDisplayContext context) { _drivers.Invoke(driver => { var result = driver.BuildDisplay(context); - if (result != null) - result.Apply(context); + result?.Apply(context); }, Logger); } public override void BuildEditor(BuildEditorContext context) { _drivers.Invoke(driver => { var result = driver.BuildEditor(context); - if (result != null) - result.Apply(context); + result?.Apply(context); }, Logger); } public override void UpdateEditor(UpdateEditorContext context) { _drivers.Invoke(driver => { var result = driver.UpdateEditor(context); - if (result != null) - result.Apply(context); + result?.Apply(context); }, Logger); } @@ -97,12 +94,14 @@ namespace Orchard.ContentManagement.Drivers.Coordinators { } public override void Cloning(CloneContentContext context) { + context.Logger = Logger; foreach (var contentPartDriver in _drivers) { contentPartDriver.Cloning(context); } } public override void Cloned(CloneContentContext context) { + context.Logger = Logger; foreach (var contentPartDriver in _drivers) { contentPartDriver.Cloned(context); }