From 3f151632974b449079f462ae7a007645202cf7a3 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sun, 22 Feb 2015 09:45:49 +0100 Subject: [PATCH] Making LayoutEditor a reusable editor template. --- .../Drivers/LayoutPartDriver.cs | 38 ++++---- .../Orchard.Layouts/Orchard.Layouts.csproj | 2 + .../ViewModels/LayoutEditor.cs | 15 +++ .../ViewModels/LayoutPartViewModel.cs | 8 +- .../Views/EditorTemplates/LayoutEditor.cshtml | 91 ++++++++++++++++++ .../Views/EditorTemplates/Parts.Layout.cshtml | 93 +------------------ 6 files changed, 131 insertions(+), 116 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Layouts/ViewModels/LayoutEditor.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Layouts/Views/EditorTemplates/LayoutEditor.cshtml diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/LayoutPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/LayoutPartDriver.cs index 9b56f1ac0..e4b981470 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/LayoutPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Drivers/LayoutPartDriver.cs @@ -27,12 +27,12 @@ namespace Orchard.Layouts.Drivers { private readonly ILayoutModelMapper _mapper; public LayoutPartDriver( - ILayoutSerializer serializer, - IElementDisplay elementDisplay, - IElementManager elementManager, + ILayoutSerializer serializer, + IElementDisplay elementDisplay, + IElementManager elementManager, ILayoutManager layoutManager, - Lazy contentPartDisplay, - IShapeDisplay shapeDisplay, + Lazy contentPartDisplay, + IShapeDisplay shapeDisplay, ILayoutModelMapper mapper) { _serializer = serializer; @@ -65,32 +65,34 @@ namespace Orchard.Layouts.Drivers { protected override DriverResult Editor(LayoutPart part, IUpdateModel updater, dynamic shapeHelper) { return ContentShape("Parts_Layout_Edit", () => { var viewModel = new LayoutPartViewModel { - Data = _mapper.ToEditorModel(part.LayoutData, new DescribeElementsContext { Content = part}).ToJson(), - ConfigurationData = GetConfigurationData(part), - TemplateId = part.TemplateId, - Content = part, - SessionKey = part.SessionKey, - Templates = _layoutManager.GetTemplates().Where(x => x.Id != part.Id).ToArray() + LayoutEditor = new LayoutEditor { + Data = _mapper.ToEditorModel(part.LayoutData, new DescribeElementsContext { Content = part }).ToJson(), + ConfigurationData = GetConfigurationData(part), + TemplateId = part.TemplateId, + Content = part, + SessionKey = part.SessionKey, + Templates = _layoutManager.GetTemplates().Where(x => x.Id != part.Id).ToArray() + } }; if (updater != null) { updater.TryUpdateModel(viewModel, Prefix, null, new[] { "Part", "Templates" }); var describeContext = new DescribeElementsContext { Content = part }; - var elementInstances = _mapper.ToLayoutModel(viewModel.Data, describeContext).ToArray(); - var removedElementInstances = _serializer.Deserialize(viewModel.Trash, describeContext).ToArray(); + var elementInstances = _mapper.ToLayoutModel(viewModel.LayoutEditor.Data, describeContext).ToArray(); + var removedElementInstances = _serializer.Deserialize(viewModel.LayoutEditor.Trash, describeContext).ToArray(); var context = new LayoutSavingContext { Content = part, Updater = updater, Elements = elementInstances, RemovedElements = removedElementInstances }; - + _elementManager.Saving(context); _elementManager.Removing(context); part.LayoutData = _serializer.Serialize(elementInstances); - part.TemplateId = viewModel.TemplateId; - part.SessionKey = viewModel.SessionKey; + part.TemplateId = viewModel.LayoutEditor.TemplateId; + part.SessionKey = viewModel.LayoutEditor.SessionKey; } return shapeHelper.EditorTemplate(TemplateName: "Parts.Layout", Model: viewModel, Prefix: Prefix); @@ -120,7 +122,7 @@ namespace Orchard.Layouts.Drivers { Session = new ImportContentContextWrapper(context) }); }); - + context.ImportAttribute(part.PartDefinition.Name, "TemplateId", s => part.TemplateId = GetTemplateId(context, s)); } @@ -151,7 +153,7 @@ namespace Orchard.Layouts.Drivers { // If the element has no editor then the toolbox will add the element straight to to designer when being dragged & dropped, // so we'll want to present the user with a prerendered element. - html = descriptor.EnableEditorDialog ? "" : RenderElement(element, new DescribeElementsContext { Content = part}) + html = descriptor.EnableEditorDialog ? "" : RenderElement(element, new DescribeElementsContext { Content = part }) }; }) }) diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj b/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj index 52f0ecc53..2f807207f 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Orchard.Layouts.csproj @@ -377,6 +377,7 @@ + @@ -505,6 +506,7 @@ + diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/ViewModels/LayoutEditor.cs b/src/Orchard.Web/Modules/Orchard.Layouts/ViewModels/LayoutEditor.cs new file mode 100644 index 000000000..aafe067be --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Layouts/ViewModels/LayoutEditor.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using Orchard.ContentManagement; +using Orchard.Layouts.Models; + +namespace Orchard.Layouts.ViewModels { + public class LayoutEditor { + public IContent Content { get; set; } + public string Data { get; set; } + public string ConfigurationData { get; set; } + public string Trash { get; set; } + public int? TemplateId { get; set; } + public string SessionKey { get; set; } + public IList Templates { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/ViewModels/LayoutPartViewModel.cs b/src/Orchard.Web/Modules/Orchard.Layouts/ViewModels/LayoutPartViewModel.cs index db05ad508..03ff3aed8 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/ViewModels/LayoutPartViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/ViewModels/LayoutPartViewModel.cs @@ -4,12 +4,6 @@ using Orchard.Layouts.Models; namespace Orchard.Layouts.ViewModels { public class LayoutPartViewModel { - public IContent Content { get; set; } - public string Data { get; set; } - public string ConfigurationData { get; set; } - public string Trash { get; set; } - public int? TemplateId { get; set; } - public string SessionKey { get; set; } - public IList Templates { get; set; } + public LayoutEditor LayoutEditor { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Views/EditorTemplates/LayoutEditor.cshtml b/src/Orchard.Web/Modules/Orchard.Layouts/Views/EditorTemplates/LayoutEditor.cshtml new file mode 100644 index 000000000..03ec6768f --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Views/EditorTemplates/LayoutEditor.cshtml @@ -0,0 +1,91 @@ +@using System.Globalization +@model Orchard.Layouts.ViewModels.LayoutEditor +@{ + // Library dependencies. + Style.Require("jQueryUI_Orchard"); + Style.Include("Lib/font-awesome.css", "Lib/font-awesome.min.css"); + Style.Include("Lib/Bootstrap/bootstrap.css", "Lib/Bootstrap/bootstrap.min.css"); + Script.Require("jQueryCookie"); + Script.Require("jQueryUI_Draggable"); + Script.Require("jQueryUI_Droppable"); + Script.Require("jQueryUI_Sortable"); + Script.Require("jQueryUI_Resizable"); + Script.Require("jQueryUI_Position"); + Script.Require("TinyMce"); + Script.Require("Layouts.LayoutEditor"); + Script.Include("Lib/sortable.js"); + Script.Include("Lib/affix.js"); + Script.Include("jquery.deserialize.js"); + + // Utilities. + Style.Include("dialog.css"); + Script.Include("dialog.js"); + Script.Include("frame.js"); + Script.Include("serializer.js"); + + // The actual layout editor. + Style.Include("LayoutEditor.css", "LayoutEditor.min.css"); + Script.Include("LayoutDesignerHost.js"); + + using (Script.Foot()) { + + } + + var contentId = Model.Content != null ? Model.Content.Id : default(int?); + var contentType = Model.Content != null ? Model.Content.ContentItem.ContentType : default(string); +} + +
+ + @Html.HiddenFor(m => m.SessionKey) + @Html.HiddenFor(m => m.Data, new { @class = "layout-data-field" }) +
+ +
+
+
    + @if (Model.Templates.Any()) { + var options = Model.Templates.Select(x => new SelectListItem { Text = Html.ItemDisplayText(x).ToString(), Value = x.Id.ToString(CultureInfo.InvariantCulture), Selected = x.Id == Model.TemplateId }); +
  1. +
    + +
    +
  2. + } +
+
+
+
+ +
+
+
+ @Display.DialogTemplate(Name: "Layout") +
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Views/EditorTemplates/Parts.Layout.cshtml b/src/Orchard.Web/Modules/Orchard.Layouts/Views/EditorTemplates/Parts.Layout.cshtml index 15bf7742d..188f8a730 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Views/EditorTemplates/Parts.Layout.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Views/EditorTemplates/Parts.Layout.cshtml @@ -1,91 +1,2 @@ -@using System.Globalization -@model Orchard.Layouts.ViewModels.LayoutPartViewModel -@{ - // Library dependencies. - Style.Require("jQueryUI_Orchard"); - Style.Include("Lib/font-awesome.css", "Lib/font-awesome.min.css"); - Style.Include("Lib/Bootstrap/bootstrap.css", "Lib/Bootstrap/bootstrap.min.css"); - Script.Require("jQueryCookie"); - Script.Require("jQueryUI_Draggable"); - Script.Require("jQueryUI_Droppable"); - Script.Require("jQueryUI_Sortable"); - Script.Require("jQueryUI_Resizable"); - Script.Require("jQueryUI_Position"); - Script.Require("TinyMce"); - Script.Require("Layouts.LayoutEditor"); - Script.Include("Lib/sortable.js"); - Script.Include("Lib/affix.js"); - Script.Include("jquery.deserialize.js"); - - // Utilities. - Style.Include("dialog.css"); - Script.Include("dialog.js"); - Script.Include("frame.js"); - Script.Include("serializer.js"); - - // The actual layout editor. - Style.Include("LayoutEditor.css", "LayoutEditor.min.css"); - Script.Include("LayoutDesignerHost.js"); - - using (Script.Foot()) { - - } - - var contentId = Model.Content != null ? Model.Content.Id : default(int?); - var contentType = Model.Content != null ? Model.Content.ContentItem.ContentType : default(string); -} - -
- - @Html.HiddenFor(m => m.SessionKey) - @Html.HiddenFor(m => m.Data, new { @class = "layout-data-field" }) -
- -
-
-
    - @if (Model.Templates.Any()) { - var options = Model.Templates.Select(x => new SelectListItem { Text = Html.ItemDisplayText(x).ToString(), Value = x.Id.ToString(CultureInfo.InvariantCulture), Selected = x.Id == Model.TemplateId }); -
  1. -
    - -
    -
  2. - } -
-
-
-
- -
-
-
- @Display.DialogTemplate(Name: "Layout") -
\ No newline at end of file +@model Orchard.Layouts.ViewModels.LayoutPartViewModel +@Html.EditorFor(m => m.LayoutEditor) \ No newline at end of file