From 0c76809ee25418925b140b8824641b3b732bc3a5 Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Mon, 25 May 2020 11:27:23 +0200 Subject: [PATCH] output nested renderers in editor --- zero.Core/Api/PageTreeApi.cs | 10 +-- zero.Core/Api/PagesApi.cs | 44 +++++++++--- zero.Core/Entities/Pages/Page.cs | 24 +++++-- zero.Core/ServiceCollectionExtensions.cs | 14 ++-- .../TestData/Renderers/NewsPageRenderer.cs | 2 + zero.Web.UI/App/editor/editor-component.vue | 6 +- zero.Web.UI/App/pages/pages/page.vue | 68 ++++++++----------- zero.Web.UI/Sass/Modules/_box.scss | 8 +++ zero.Web/Controllers/PageTreeController.cs | 10 +-- zero.Web/Controllers/PagesController.cs | 19 +++++- zero.Web/Defaults/DefaultBackofficePlugin.cs | 1 + zero.Web/Renderers/LanguageRenderer.cs | 19 ++++++ zero.Web/ZeroBuilder.cs | 2 - 13 files changed, 147 insertions(+), 80 deletions(-) create mode 100644 zero.Web/Renderers/LanguageRenderer.cs diff --git a/zero.Core/Api/PageTreeApi.cs b/zero.Core/Api/PageTreeApi.cs index 8b664fe1..cd336996 100644 --- a/zero.Core/Api/PageTreeApi.cs +++ b/zero.Core/Api/PageTreeApi.cs @@ -12,7 +12,7 @@ using zero.Core.Options; namespace zero.Core.Api { - public class PageTreeApi : AppAwareBackofficeApi, IPageTreeApi + public class PageTreeApi : AppAwareBackofficeApi, IPageTreeApi where T : IPage { protected IZeroOptions Options { get; private set; } @@ -31,8 +31,8 @@ namespace zero.Core.Api using (IAsyncDocumentSession session = Raven.OpenAsyncSession()) { - IList pages = await session - .Query() + IList pages = await session + .Query() .Scope(Scope) .WhereIf(x => x.ParentId == parentId, !parentId.IsNullOrEmpty(), x => x.ParentId == null) .ToListAsync(); @@ -65,7 +65,7 @@ namespace zero.Core.Api // build tree - foreach (Page page in pages) + foreach (T page in pages) { PageType pageType = pageTypes.FirstOrDefault(x => x.Alias == page.PageTypeAlias); @@ -117,7 +117,7 @@ namespace zero.Core.Api } - public interface IPageTreeApi : IAppAwareBackofficeApi + public interface IPageTreeApi where T : IPage { /// /// Get all children for the current parent page (or root if empty) diff --git a/zero.Core/Api/PagesApi.cs b/zero.Core/Api/PagesApi.cs index 0e510c09..a650f91f 100644 --- a/zero.Core/Api/PagesApi.cs +++ b/zero.Core/Api/PagesApi.cs @@ -9,7 +9,7 @@ using zero.Core.Options; namespace zero.Core.Api { - public class PagesApi : AppAwareBackofficeApi, IPagesApi + public class PagesApi : AppAwareBackofficeApi, IPagesApi where T : IPage { protected IZeroOptions Options { get; private set; } @@ -20,16 +20,9 @@ namespace zero.Core.Api /// - public async Task> GetChildren(string parentId = null) + public async Task GetById(string id) { - using (IAsyncDocumentSession session = Raven.OpenAsyncSession()) - { - return await session - .Query() - .Scope(Scope) - .WhereIf(x => x.ParentId == parentId, !parentId.IsNullOrEmpty(), x => x.ParentId == null) - .ToListAsync(); - } + return await GetById(id); } @@ -65,11 +58,30 @@ namespace zero.Core.Api return types.Where(x => pageType.AllowedChildrenTypes.Contains(x.Alias)).ToList(); } + + + /// + public async Task> Save(T model) + { + return await Save(model, null); + } + + + /// + public async Task> Delete(string id) + { + return await DeleteById(id); + } } - public interface IPagesApi : IAppAwareBackofficeApi + public interface IPagesApi where T : IPage { + /// + /// Get page by Id + /// + Task GetById(string id); + /// /// Get all available page types /// @@ -79,5 +91,15 @@ namespace zero.Core.Api /// Get all page types which are allowed below a selected parent page /// Task> GetAllowedPageTypes(string parentId = null); + + /// + /// Creates or updates a page + /// + Task> Save(T model); + + /// + /// Deletes a page by Id + /// + Task> Delete(string id); } } diff --git a/zero.Core/Entities/Pages/Page.cs b/zero.Core/Entities/Pages/Page.cs index 15fccfa4..342b800a 100644 --- a/zero.Core/Entities/Pages/Page.cs +++ b/zero.Core/Entities/Pages/Page.cs @@ -4,19 +4,29 @@ /// A page can consist of unlimited properties and be rendered as you wish /// The backoffice rendering is done by an IRenderer /// - public class Page : ZeroEntity, IAppAwareEntity, IZeroDbConventions + public class Page : ZeroEntity, IPage { - /// - /// Id of the parent page - /// + /// public string ParentId { get; set; } - /// - /// Alias of the used page type - /// + /// public string PageTypeAlias { get; set; } /// public string AppId { get; set; } } + + + public interface IPage : IZeroEntity, IAppAwareEntity, IZeroDbConventions + { + /// + /// Id of the parent page + /// + string ParentId { get; set; } + + /// + /// Alias of the used page type + /// + string PageTypeAlias { get; set; } + } } \ No newline at end of file diff --git a/zero.Core/ServiceCollectionExtensions.cs b/zero.Core/ServiceCollectionExtensions.cs index b3bef5bd..3b235ac8 100644 --- a/zero.Core/ServiceCollectionExtensions.cs +++ b/zero.Core/ServiceCollectionExtensions.cs @@ -14,18 +14,20 @@ namespace zero.Core.Entities services.AddAllByInterfaceTransient(typeof(IValidator), typeof(IValidator<>), AppDomain.CurrentDomain.GetAssemblies()); services.AddTransient(); - services.AddTransient(typeof(IApplicationsApi<>), typeof(ApplicationsApi<>)); - services.AddTransient(); - services.AddTransient(typeof(ICountriesApi<>), typeof(CountriesApi<>)); - services.AddTransient(); - services.AddTransient(typeof(ILanguagesApi<>), typeof(LanguagesApi<>)); - services.AddTransient(); + services.AddTransient(); + + + services.AddTransient(typeof(IApplicationsApi<>), typeof(ApplicationsApi<>)); + services.AddTransient(typeof(ICountriesApi<>), typeof(CountriesApi<>)); + services.AddTransient(typeof(ILanguagesApi<>), typeof(LanguagesApi<>)); services.AddTransient(typeof(ITranslationsApi), typeof(TranslationsApi)); services.AddTransient(typeof(ITranslationsApi<>), typeof(TranslationsApi<>)); services.AddTransient(typeof(ITranslationsApiFacade), typeof(TranslationsApiFacade)); + services.AddTransient(typeof(IPagesApi<>), typeof(PagesApi<>)); + services.AddTransient(typeof(IPageTreeApi<>), typeof(PageTreeApi<>)); } diff --git a/zero.Debug/TestData/Renderers/NewsPageRenderer.cs b/zero.Debug/TestData/Renderers/NewsPageRenderer.cs index da4b9578..190cbafb 100644 --- a/zero.Debug/TestData/Renderers/NewsPageRenderer.cs +++ b/zero.Debug/TestData/Renderers/NewsPageRenderer.cs @@ -10,6 +10,8 @@ namespace zero.TestData { public NewsPageRenderer() { + Alias = "debug.newspage"; + LabelTemplate = "@_test.fields.{0}"; DescriptionTemplate = "@_test.fields.{0}_text"; diff --git a/zero.Web.UI/App/editor/editor-component.vue b/zero.Web.UI/App/editor/editor-component.vue index fa794bfd..ae9c60d6 100644 --- a/zero.Web.UI/App/editor/editor-component.vue +++ b/zero.Web.UI/App/editor/editor-component.vue @@ -54,7 +54,7 @@ computed: { params() { - return this.component.params; + return this.view === 'renderer' ? this.component : this.component.params; }, view() { @@ -63,7 +63,7 @@ classes() { let classes = this.component.params.options.classes; - if (this.view === 'nested') + if (this.view === 'nested' || this.view === 'renderer') { classes.push('full-width'); } @@ -89,7 +89,7 @@ } else if (this.view === 'renderer') { - return import(`zero/editor/editor-nested`); + return import(`zero/editor/editor`); } else { diff --git a/zero.Web.UI/App/pages/pages/page.vue b/zero.Web.UI/App/pages/pages/page.vue index 30460034..2de20184 100644 --- a/zero.Web.UI/App/pages/pages/page.vue +++ b/zero.Web.UI/App/pages/pages/page.vue @@ -1,5 +1,5 @@