From 4f34920dbb10506b3618c921cea2bf6eb437c143 Mon Sep 17 00:00:00 2001 From: loudej Date: Thu, 3 Dec 2009 01:08:29 +0000 Subject: [PATCH] Updating displays/editors api to include a content item view model. --HG-- extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4043002 --- .../Controllers/PageController.cs | 2 +- .../Models/SandboxContentProvider.cs | 10 +++++++ .../Orchard.Sandbox/Orchard.Sandbox.csproj | 3 ++ .../DisplayTemplates/SandboxPageDetail.ascx | 14 ++++++++++ .../DisplayTemplates/SandboxPageList.ascx | 8 ++++++ .../Models/EditorTemplates/SandboxPage.ascx | 14 ++++++++++ .../SandboxSettingsRecord.ascx | 24 ++++++++-------- .../Orchard.Sandbox/Views/Page/Edit.aspx | 8 ++++-- .../Orchard.Sandbox/Views/Page/Show.aspx | 5 ++-- src/Orchard/Models/ContentItemMetadata.cs | 4 +-- src/Orchard/Models/DefaultContentManager.cs | 21 ++++++++------ .../Models/Driver/GetDisplaysContext.cs | 19 +++++++------ .../Models/Driver/GetEditorsContext.cs | 11 ++++---- .../Models/Driver/UpdateContentContext.cs | 5 +++- src/Orchard/Models/IContentManager.cs | 6 ++-- .../Models/ViewModels/ItemDisplayViewModel.cs | 28 +++++++++++++++++-- .../Models/ViewModels/ItemEditorViewModel.cs | 26 ++++++++++++++++- src/Orchard/Tasks/SweepGenerator.cs | 3 +- 18 files changed, 160 insertions(+), 51 deletions(-) create mode 100644 src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPageDetail.ascx create mode 100644 src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPageList.ascx create mode 100644 src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/EditorTemplates/SandboxPage.ascx diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/PageController.cs b/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/PageController.cs index 7d4103a93..a6f07804c 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/PageController.cs +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/PageController.cs @@ -40,7 +40,7 @@ namespace Orchard.Sandbox.Controllers { var page = _contentManager.Get(id); var model = new PageShowViewModel { Page = page, - ItemView = _contentManager.GetDisplays(page, null, null) + ItemView = _contentManager.GetDisplays(page, null, "Detail") }; return View(model); } diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Models/SandboxContentProvider.cs b/src/Orchard.Web/Packages/Orchard.Sandbox/Models/SandboxContentProvider.cs index c38c102e6..7b4110010 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Models/SandboxContentProvider.cs +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Models/SandboxContentProvider.cs @@ -4,6 +4,7 @@ using Orchard.Core.Common.Models; using Orchard.Data; using Orchard.Models; using Orchard.Models.Driver; +using Orchard.Models.ViewModels; namespace Orchard.Sandbox.Models { public class SandboxContentProvider : ContentProvider { @@ -43,6 +44,15 @@ namespace Orchard.Sandbox.Models { }); }); + //TODO: helper that glues this for free - include list of known-displaytype prefixes + + OnGetDisplays((context, page) => context.ItemView.TemplateName = "SandboxPage" + context.DisplayType); + OnGetEditors((context, page) => context.ItemView.TemplateName = "SandboxPage"); + OnUpdateEditors((context, page) => { + context.Updater.TryUpdateModel((ItemEditorViewModel)context.ItemView, "", null, null); + context.ItemView.TemplateName = "SandboxPage"; + }); + // add settings to site, and simple record-template gui Filters.Add(new ActivatingFilter>("site")); Filters.Add(new StorageFilter(settingsRepository) { AutomaticallyCreateMissingRecord = true }); diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Orchard.Sandbox.csproj b/src/Orchard.Web/Packages/Orchard.Sandbox/Orchard.Sandbox.csproj index 1d225b55a..674219e2a 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Orchard.Sandbox.csproj +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Orchard.Sandbox.csproj @@ -75,6 +75,9 @@ + + + diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPageDetail.ascx b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPageDetail.ascx new file mode 100644 index 000000000..579ea4b88 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPageDetail.ascx @@ -0,0 +1,14 @@ +<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl>" %> +<%@ Import Namespace="Orchard.Mvc.Html"%> +<%@ Import Namespace="Orchard.Sandbox.Models" %> +<%@ Import Namespace="Orchard.Models.ViewModels" %> +<%@ Import Namespace="Orchard.Models" %> + +

<%=Html.Encode(Model.Item.Record.Name) %>

+ +<%foreach (var display in Model.Displays) { %> +<%=Html.DisplayFor(m=>display.Model, display.TemplateName, display.Prefix) %> +<%} %> + +

+ <%=Html.ItemEditLink("Edit this page", Model.Item) %>, <%=Html.ActionLink("Return to list", "index") %>

diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPageList.ascx b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPageList.ascx new file mode 100644 index 000000000..273d6919f --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/DisplayTemplates/SandboxPageList.ascx @@ -0,0 +1,8 @@ +<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl>" %> +<%@ Import Namespace="Orchard.Sandbox.Models" %> +<%@ Import Namespace="Orchard.Models.ViewModels" %> +<%@ Import Namespace="Orchard.Models" %> +

<%=Html.Encode(Model.Item.Record.Name) %>

+<%foreach (var display in Model.Displays) { %> +<%=Html.DisplayFor(m=>display.Model, display.TemplateName, display.Prefix??"") %> +<%} %> diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/EditorTemplates/SandboxPage.ascx b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/EditorTemplates/SandboxPage.ascx new file mode 100644 index 000000000..c7b69babd --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/EditorTemplates/SandboxPage.ascx @@ -0,0 +1,14 @@ +<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl>" %> +<%@ Import Namespace="Orchard.Sandbox.Models" %> +<%@ Import Namespace="Orchard.Models.ViewModels" %> +<%@ Import Namespace="Orchard.Models" %> + + +
  • +<%=Html.LabelFor(m => m.Item.Record.Name)%> +<%=Html.EditorFor(m => m.Item.Record.Name)%> +
  • + +<%foreach (var e in Model.Editors) { %> +<%=Html.EditorFor(m=>e.Model, e.TemplateName, e.Prefix??"") %> +<%} %> diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/EditorTemplates/SandboxSettingsRecord.ascx b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/EditorTemplates/SandboxSettingsRecord.ascx index 3ed997b28..010c29386 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/EditorTemplates/SandboxSettingsRecord.ascx +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Models/EditorTemplates/SandboxSettingsRecord.ascx @@ -1,14 +1,12 @@ <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> -

    Sandbox

    -
      -
    1. - <%= Html.LabelFor(x=>x.AllowAnonymousEdits) %> - <%= Html.EditorFor(x=>x.AllowAnonymousEdits) %> - <%= Html.ValidationMessage("AllowAnonymousEdits", "*")%> -
    2. -
    3. - <%= Html.LabelFor(x => x.NameOfThemeWhenEditingPage)%> - <%= Html.EditorFor(x=>x.NameOfThemeWhenEditingPage) %> - <%= Html.ValidationMessage("NameOfThemeWhenEditingPage", "*")%> -
    4. -
    +
    + Sandbox + <%= Html.LabelFor(x=>x.AllowAnonymousEdits) %> + <%= Html.EditorFor(x=>x.AllowAnonymousEdits) %> + <%= Html.ValidationMessage("AllowAnonymousEdits", "*")%> +
    + <%= Html.LabelFor(x => x.NameOfThemeWhenEditingPage)%> + <%= Html.EditorFor(x=>x.NameOfThemeWhenEditingPage) %> + <%= Html.ValidationMessage("NameOfThemeWhenEditingPage", "*")%> +
    +
    diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Page/Edit.aspx b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Page/Edit.aspx index e35a1fea9..acfee75d1 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Page/Edit.aspx +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Page/Edit.aspx @@ -24,13 +24,17 @@ Edit Page <%using (Html.BeginForm()) { %>
      -
    • + <%=Html.EditorFor(m => m.ItemView, Model.ItemView.TemplateName, Model.ItemView.Prefix ?? "")%> + +
    • + + <%--
    • <%=Html.LabelFor(x => x.Page.Record.Name)%><%=Html.EditorFor(x => x.Page.Record.Name)%>
    • <%foreach (var x in Model.ItemView.Editors) { %> <%=Html.EditorFor(m=>x.Model, x.TemplateName, x.Prefix) %> <%} %>
    • -
    • + --%>
    <%} %> diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Page/Show.aspx b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Page/Show.aspx index 1e4b00900..9f4bbc563 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Page/Show.aspx +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Views/Page/Show.aspx @@ -20,13 +20,14 @@
    <% Html.RenderPartial("Messages", Model.Messages); %> -

    <%=Html.Encode(Model.Page.Record.Name) %>

    + <%=Html.DisplayFor(m => m.ItemView, Model.ItemView.TemplateName, "")%> +<%--

    <%=Html.Encode(Model.Page.Record.Name) %>

    <%foreach (var display in Model.ItemView.Displays) { %> <%=Html.DisplayFor(m=>display.Model, display.TemplateName, display.Prefix) %> <%} %>

    <%=Html.ActionLink("Edit this page", "edit", new{Model.Page.ContentItem.Id}, new{}) %>, <%=Html.ActionLink("Return to list", "index") %>

    -
    +--%> diff --git a/src/Orchard/Models/ContentItemMetadata.cs b/src/Orchard/Models/ContentItemMetadata.cs index 08a2aea47..cc6f9ba2d 100644 --- a/src/Orchard/Models/ContentItemMetadata.cs +++ b/src/Orchard/Models/ContentItemMetadata.cs @@ -7,7 +7,7 @@ namespace Orchard.Models { public RouteValueDictionary DisplayRouteValues { get; set; } public RouteValueDictionary EditorRouteValues { get; set; } - public IEnumerable DisplayTabs { get; set; } - public IEnumerable EditorTabs { get; set; } + public IEnumerable DisplayGroups { get; set; } + public IEnumerable EditorGroups { get; set; } } } \ No newline at end of file diff --git a/src/Orchard/Models/DefaultContentManager.cs b/src/Orchard/Models/DefaultContentManager.cs index 9593d53a9..bac8608e2 100644 --- a/src/Orchard/Models/DefaultContentManager.cs +++ b/src/Orchard/Models/DefaultContentManager.cs @@ -136,32 +136,35 @@ namespace Orchard.Models { return context.Metadata; } - public ItemDisplayViewModel GetDisplays(IContent content, string tabName, string displayType) { - var context = new GetDisplaysContext(content); + public ItemDisplayViewModel GetDisplays(TContentPart content, string groupName, string displayType) where TContentPart : IContent { + var itemView = new ItemDisplayViewModel {Item = content, Displays = Enumerable.Empty()}; + var context = new GetDisplaysContext(itemView, groupName, displayType); foreach (var driver in Drivers) { driver.GetDisplays(context); } context.ItemView.Displays = OrderTemplates(context.ItemView.Displays); - return context.ItemView; + return itemView; } - public ItemEditorViewModel GetEditors(IContent content, string tabName) { - var context = new GetEditorsContext(content); + public ItemEditorViewModel GetEditors(TContentPart content, string groupName) where TContentPart : IContent { + var itemView = new ItemEditorViewModel { Item = content, Editors = Enumerable.Empty() }; + var context = new GetEditorsContext(itemView, groupName); foreach (var driver in Drivers) { driver.GetEditors(context); } context.ItemView.Editors = OrderTemplates(context.ItemView.Editors); - return context.ItemView; + return itemView; } - public ItemEditorViewModel UpdateEditors(IContent content, string tabName, IUpdateModel updater) { + public ItemEditorViewModel UpdateEditors(TContentPart content, string groupName, IUpdateModel updater) where TContentPart : IContent { + var itemView = new ItemEditorViewModel { Item = content, Editors = Enumerable.Empty() }; - var context = new UpdateContentContext(content, updater); + var context = new UpdateContentContext(itemView, groupName, updater); foreach (var driver in Drivers) { driver.UpdateEditors(context); } context.ItemView.Editors = OrderTemplates(context.ItemView.Editors); - return context.ItemView; + return itemView; } private static IEnumerable OrderTemplates(IEnumerable templates) { diff --git a/src/Orchard/Models/Driver/GetDisplaysContext.cs b/src/Orchard/Models/Driver/GetDisplaysContext.cs index 8aab2daa2..2fc0cdd84 100644 --- a/src/Orchard/Models/Driver/GetDisplaysContext.cs +++ b/src/Orchard/Models/Driver/GetDisplaysContext.cs @@ -1,20 +1,23 @@ +using System; using System.Collections.Generic; using System.Linq; using Orchard.Models.ViewModels; namespace Orchard.Models.Driver { public class GetDisplaysContext { - public GetDisplaysContext(IContent content) { - ContentItem = content.ContentItem; - ItemView = new ItemDisplayViewModel { - ContentItem = ContentItem, - Displays = Enumerable.Empty(), - }; + public GetDisplaysContext(ItemDisplayViewModel itemView, string groupName, string displayType) { + ContentItem = itemView.Item; + GroupName = groupName; + DisplayType = displayType; + ItemView = itemView; } - + public ContentItem ContentItem { get; set; } + public string GroupName { get; set; } + public string DisplayType { get; set; } public ItemDisplayViewModel ItemView { get; set; } - + + public void AddDisplay(TemplateViewModel display) { ItemView.Displays = ItemView.Displays.Concat(new[] { display }); } diff --git a/src/Orchard/Models/Driver/GetEditorsContext.cs b/src/Orchard/Models/Driver/GetEditorsContext.cs index 33e6e30e9..7084f1b16 100644 --- a/src/Orchard/Models/Driver/GetEditorsContext.cs +++ b/src/Orchard/Models/Driver/GetEditorsContext.cs @@ -5,15 +5,14 @@ using Orchard.Models.ViewModels; namespace Orchard.Models.Driver { public class GetEditorsContext { - public GetEditorsContext(IContent content) { - ContentItem = content.ContentItem; - ItemView = new ItemEditorViewModel { - ContentItem = ContentItem, - Editors = Enumerable.Empty(), - }; + public GetEditorsContext(ItemEditorViewModel itemView, string groupName) { + ContentItem = itemView.Item; + GroupName = groupName; + ItemView = itemView; } public ContentItem ContentItem { get; set; } + public string GroupName { get; set; } public ItemEditorViewModel ItemView { get; set; } public void AddEditor(TemplateViewModel editor) { diff --git a/src/Orchard/Models/Driver/UpdateContentContext.cs b/src/Orchard/Models/Driver/UpdateContentContext.cs index dfe293ba6..23af9e674 100644 --- a/src/Orchard/Models/Driver/UpdateContentContext.cs +++ b/src/Orchard/Models/Driver/UpdateContentContext.cs @@ -1,6 +1,9 @@ +using Orchard.Models.ViewModels; + namespace Orchard.Models.Driver { public class UpdateContentContext : GetEditorsContext { - public UpdateContentContext(IContent content, IUpdateModel updater) : base(content) { + public UpdateContentContext(ItemEditorViewModel itemView, string groupName, IUpdateModel updater) + : base(itemView, groupName) { Updater = updater; } diff --git a/src/Orchard/Models/IContentManager.cs b/src/Orchard/Models/IContentManager.cs index 085f2d370..a24318a57 100644 --- a/src/Orchard/Models/IContentManager.cs +++ b/src/Orchard/Models/IContentManager.cs @@ -15,8 +15,8 @@ namespace Orchard.Models { IContentQuery Query(); ContentItemMetadata GetItemMetadata(IContent contentItem); - ItemDisplayViewModel GetDisplays(IContent contentItem, string tabName, string displayType); - ItemEditorViewModel GetEditors(IContent contentItem, string tabName); - ItemEditorViewModel UpdateEditors(IContent contentItem, string tabName, IUpdateModel updater); + ItemDisplayViewModel GetDisplays(TContentPart contentItem, string groupName, string displayType) where TContentPart : IContent; + ItemEditorViewModel GetEditors(TContentPart contentItem, string groupName) where TContentPart : IContent; + ItemEditorViewModel UpdateEditors(TContentPart contentItem, string groupName, IUpdateModel updater) where TContentPart : IContent; } } diff --git a/src/Orchard/Models/ViewModels/ItemDisplayViewModel.cs b/src/Orchard/Models/ViewModels/ItemDisplayViewModel.cs index 0366236d6..28d43eeb8 100644 --- a/src/Orchard/Models/ViewModels/ItemDisplayViewModel.cs +++ b/src/Orchard/Models/ViewModels/ItemDisplayViewModel.cs @@ -1,9 +1,33 @@ +using System; using System.Collections.Generic; namespace Orchard.Models.ViewModels { - public class ItemDisplayViewModel { - public ContentItem ContentItem { get; set; } + public class ItemDisplayViewModel { + private ContentItem _item; + public ContentItem Item { + get { return _item; } + set { SetItem(value); } + } + + protected virtual void SetItem(ContentItem value) { + _item = value; + } + public string TemplateName { get; set; } + public string Prefix { get; set; } public IEnumerable Displays { get; set; } } + + public class ItemDisplayViewModel : ItemDisplayViewModel where TPart : IContent { + private TPart _item; + public new TPart Item { + get { return _item; } + set { SetItem(value.ContentItem); } + } + + protected override void SetItem(ContentItem value) { + _item = value.As(); + base.SetItem(value); + } + } } \ No newline at end of file diff --git a/src/Orchard/Models/ViewModels/ItemEditorViewModel.cs b/src/Orchard/Models/ViewModels/ItemEditorViewModel.cs index e2671592d..1d4cd3d11 100644 --- a/src/Orchard/Models/ViewModels/ItemEditorViewModel.cs +++ b/src/Orchard/Models/ViewModels/ItemEditorViewModel.cs @@ -2,8 +2,32 @@ using System.Collections.Generic; namespace Orchard.Models.ViewModels { public class ItemEditorViewModel { - public ContentItem ContentItem { get; set; } + private ContentItem _item; + public ContentItem Item { + get { return _item; } + set { SetItem(value); } + } + + protected virtual void SetItem(ContentItem value) { + _item = value; + } + public string TemplateName { get; set; } + public string Prefix { get; set; } + public IEnumerable Editors { get; set; } } + + public class ItemEditorViewModel : ItemEditorViewModel where TPart : IContent { + private TPart _item; + public new TPart Item { + get { return _item; } + set { SetItem(value.ContentItem); } + } + + protected override void SetItem(ContentItem value) { + _item = value.As(); + base.SetItem(value); + } + } } \ No newline at end of file diff --git a/src/Orchard/Tasks/SweepGenerator.cs b/src/Orchard/Tasks/SweepGenerator.cs index e403a4a86..ae8658f61 100644 --- a/src/Orchard/Tasks/SweepGenerator.cs +++ b/src/Orchard/Tasks/SweepGenerator.cs @@ -15,13 +15,14 @@ namespace Orchard.Tasks { _timer = new Timer(); _timer.Elapsed += Elapsed; Logger = NullLogger.Instance; + Interval = TimeSpan.FromMinutes(5); } public ILogger Logger { get; set; } public TimeSpan Interval { get { return TimeSpan.FromMilliseconds(_timer.Interval); } - set { _timer.Interval = value.Milliseconds; } + set { _timer.Interval = value.TotalMilliseconds; } } public void Activated() {