diff --git a/zero.Debug/Renderers/module.headline.js b/zero.Debug/Renderers/module.headline.js index f8727c13..843d75f4 100644 --- a/zero.Debug/Renderers/module.headline.js +++ b/zero.Debug/Renderers/module.headline.js @@ -15,7 +15,7 @@ // define a preview which is rendered in the overview preview: { - template: '
{{model.subline}}' + template: '' }, fields: [ diff --git a/zero.Debug/Renderers/module.offset.js b/zero.Debug/Renderers/module.offset.js new file mode 100644 index 00000000..00b9568c --- /dev/null +++ b/zero.Debug/Renderers/module.offset.js @@ -0,0 +1,5 @@ +export default { + alias: 'module.offset', + + fields: [] +}; \ No newline at end of file diff --git a/zero.Debug/Renderers/module.richtext.js b/zero.Debug/Renderers/module.richtext.js index 6c4031f1..ded31c0f 100644 --- a/zero.Debug/Renderers/module.richtext.js +++ b/zero.Debug/Renderers/module.richtext.js @@ -15,7 +15,7 @@ // define a preview which is rendered in the overview preview: { - template: '
' + template: '' }, fields: [ diff --git a/zero.Debug/Renderers/module.textwithimage.js b/zero.Debug/Renderers/module.textwithimage.js index dd263824..43272053 100644 --- a/zero.Debug/Renderers/module.textwithimage.js +++ b/zero.Debug/Renderers/module.textwithimage.js @@ -3,7 +3,7 @@ // define a preview which is rendered in the overview preview: { - template: '
' + template: '' }, fields: [ diff --git a/zero.Debug/TestData/Modules/OffsetModule.cs b/zero.Debug/TestData/Modules/OffsetModule.cs new file mode 100644 index 00000000..029dca83 --- /dev/null +++ b/zero.Debug/TestData/Modules/OffsetModule.cs @@ -0,0 +1,10 @@ +using System; +using zero.Core.Entities; + +namespace zero.TestData +{ + public class OffsetModule : Module + { + + } +} diff --git a/zero.Debug/TestData/TestPlugin.cs b/zero.Debug/TestData/TestPlugin.cs index a7b7e3f7..d0de47a0 100644 --- a/zero.Debug/TestData/TestPlugin.cs +++ b/zero.Debug/TestData/TestPlugin.cs @@ -35,7 +35,8 @@ namespace zero.TestData zero.Modules.Add("headline", "Headline", "Headline with optional subline", "fth-underline", "Texts"); zero.Modules.Add("textWithImage", "Text with image", "Short textblock with image", "fth-layers", "Texts", new List() { "root" }); zero.Modules.Add("gallery", "Gallery", "Image gallery grid", "fth-image", "Media"); - zero.Modules.Add("download", "Downloads", "List containing downloads", "fth-download", "Lists"); + zero.Modules.Add("download", "Downloads", "List containing downloads", "fth-download", "Misc"); + zero.Modules.Add("offset", "Offset", "Offset between two modules", "fth-code", "Misc"); } public void ConfigureServices(IServiceCollection services) diff --git a/zero.Web.UI/App/components/modules/edit-module.vue b/zero.Web.UI/App/components/modules/edit-module.vue index 04e76217..8c42e5ed 100644 --- a/zero.Web.UI/App/components/modules/edit-module.vue +++ b/zero.Web.UI/App/components/modules/edit-module.vue @@ -35,6 +35,7 @@ components: { UiEditor }, data: () => ({ + isAdd: true, disabled: false, id: null, loading: true, @@ -48,11 +49,21 @@ onLoad(form) { - form.load(!this.id ? ModulesApi.getEmpty(this.config.module.alias) : null).then(response => + if (this.config.model) + { + this.isAdd = false; + this.model = JSON.parse(JSON.stringify(this.config.model)); + } + + form.load(ModulesApi.getEmpty(this.config.module.alias)).then(response => { this.disabled = !response.meta.canEdit; this.meta = response.meta; - this.model = response.entity; + + if (this.isAdd) + { + this.model = response.entity; + } this.loading = false; }); }, diff --git a/zero.Web.UI/App/components/modules/module-preview-inner.vue b/zero.Web.UI/App/components/modules/module-preview-inner.vue index 03e457de..0916f1b6 100644 --- a/zero.Web.UI/App/components/modules/module-preview-inner.vue +++ b/zero.Web.UI/App/components/modules/module-preview-inner.vue @@ -1,6 +1,4 @@  + + \ No newline at end of file diff --git a/zero.Web.UI/App/components/modules/predefined/module-preview-text.vue b/zero.Web.UI/App/components/modules/predefined/module-preview-text.vue new file mode 100644 index 00000000..4689cf10 --- /dev/null +++ b/zero.Web.UI/App/components/modules/predefined/module-preview-text.vue @@ -0,0 +1,48 @@ + + + + + \ No newline at end of file diff --git a/zero.Web.UI/App/components/overlays/dropdown-button.vue b/zero.Web.UI/App/components/overlays/dropdown-button.vue index d2b7fdde..e3cd4475 100644 --- a/zero.Web.UI/App/components/overlays/dropdown-button.vue +++ b/zero.Web.UI/App/components/overlays/dropdown-button.vue @@ -41,6 +41,10 @@ disabled: { type: Boolean, default: false + }, + prevent: { + type: Boolean, + default: false } }, @@ -63,7 +67,7 @@ } while (current = current.$parent); - if (false && !this.dropdown) + if (!this.dropdown) { warn('ui-dropdown-button: Could not find parent '); } @@ -77,6 +81,11 @@ if (!this.loading && !this.disabled) { + if (!this.prevent) + { + this.dropdown.hide(); + } + this.$emit('click', this.value, { dropdown: this.dropdown, hide() diff --git a/zero.Web.UI/App/services/arrays.js b/zero.Web.UI/App/services/arrays.js index d0482602..69917684 100644 --- a/zero.Web.UI/App/services/arrays.js +++ b/zero.Web.UI/App/services/arrays.js @@ -7,6 +7,7 @@ const arrayMoveMutate = (array, from, to) => }; export default { + /// /// Move an item in an array /// @@ -15,5 +16,39 @@ export default { array = array.slice(); arrayMoveMutate(array, from, to); return array; + }, + + /// + /// Replaces an item in an array + /// + replace(array, origin, target) + { + const index = array.indexOf(origin); + + if (index < 0) + { + return index; + } + + array.splice(index, 1); + array.splice(index, 0, target); + return index; + }, + + + /// + /// Removes an item from an array + /// + remove(array, value) + { + const index = array.indexOf(value); + + if (index < 0) + { + return; + } + + array.splice(index, 1); + return index; } }; \ No newline at end of file diff --git a/zero.Web.UI/Sass/Core/_settings.scss b/zero.Web.UI/Sass/Core/_settings.scss index f2044bc9..82e1038c 100644 --- a/zero.Web.UI/Sass/Core/_settings.scss +++ b/zero.Web.UI/Sass/Core/_settings.scss @@ -157,7 +157,7 @@ --color-accent-warn: rgb(211, 172, 35); --color-accent-warn-bg: rgba(233, 193, 56, 0.1); --color-accent-error: rgb(216, 40, 83); - --color-accent-error-bg: rgba(216, 40, 83, 0.08); + --color-accent-error-bg: rgba(216, 40, 83, 0.15); // sizes diff --git a/zero.Web/Controllers/BackofficeController.cs b/zero.Web/Controllers/BackofficeController.cs index e64970ea..30c87b4f 100644 --- a/zero.Web/Controllers/BackofficeController.cs +++ b/zero.Web/Controllers/BackofficeController.cs @@ -57,17 +57,15 @@ namespace zero.Web.Controllers /// /// Creates an edit model with appropriate options and permissions /// - public JsonResult Edit(T data, bool typed = true, Action transform = null) where T : IZeroIdEntity + public JsonResult Edit(T data, bool typed = true, Action> transform = null) where T : IZeroIdEntity { Type type = typeof(T); bool canBeShared = AppAwareShareableType.IsAssignableFrom(type); //ControllerContext.ActionDescriptor.FilterDescriptors[0]. - dynamic model = new ExpandoObject(); + EditModel model = new EditModel(); model.Entity = data; - - model.Meta = new ExpandoObject(); model.Meta.Token = Token.Get(data); model.Meta.IsAppAware = AppAwareType.IsAssignableFrom(type); model.Meta.CanBeShared = canBeShared; @@ -82,6 +80,32 @@ namespace zero.Web.Controllers } + /// + /// Creates an edit model with appropriate options and permissions + /// + public JsonResult Edit(TWrapper data, bool typed = true, Action> transform = null) + where T : IZeroIdEntity + where TWrapper : EditModel, new() + { + Type type = typeof(T); + bool canBeShared = AppAwareShareableType.IsAssignableFrom(type); + + //ControllerContext.ActionDescriptor.FilterDescriptors[0]. + + data.Meta.Token = Token.Get(data.Entity); + data.Meta.IsAppAware = AppAwareType.IsAssignableFrom(type); + data.Meta.CanBeShared = canBeShared; + data.Meta.CanCreate = true; + data.Meta.CanCreateShared = canBeShared; + data.Meta.CanEdit = true; + data.Meta.CanDelete = true; + + transform?.Invoke(data); + + return Json(data, typed); + } + + public IActionResult JsonPreviews(Dictionary items, Func transform) { IList previews = new List(); diff --git a/zero.Web/Controllers/PagesController.cs b/zero.Web/Controllers/PagesController.cs index 0e755557..3337cde9 100644 --- a/zero.Web/Controllers/PagesController.cs +++ b/zero.Web/Controllers/PagesController.cs @@ -2,6 +2,7 @@ using System.Threading.Tasks; using zero.Core.Api; using zero.Core.Entities; +using zero.Web.Models; namespace zero.Web.Controllers { @@ -22,7 +23,17 @@ namespace zero.Web.Controllers public IActionResult GetPageType([FromQuery] string alias) => Json(Api.GetPageType(alias)); - public async Task GetById([FromQuery] string id) => Edit(await Api.GetById(id)); + public async Task GetById([FromQuery] string id) + { + T entity = await Api.GetById(id); + + return Edit>(new PageEditModel() + { + Entity = entity, + Revisions = await RevisionsApi.GetPaged(id), + PageType = Api.GetPageType(entity.PageTypeAlias) + }); + } public IActionResult GetEmpty(string type, string parent = null) => Edit(new T() { diff --git a/zero.Web/Models/ObsoleteEditModel.cs b/zero.Web/Models/ObsoleteEditModel.cs index 1f595cf2..9743823b 100644 --- a/zero.Web/Models/ObsoleteEditModel.cs +++ b/zero.Web/Models/ObsoleteEditModel.cs @@ -4,7 +4,6 @@ namespace zero.Web.Models { public class EditModel : EditModel { } - public class EditModel { /// @@ -12,6 +11,15 @@ namespace zero.Web.Models /// public T Entity { get; set; } + /// + /// Meta data + /// + public EditMetaModel Meta { get; set; } = new EditMetaModel(); + } + + + public class EditMetaModel + { /// /// Whether an entity of this type can be created /// diff --git a/zero.Web/Models/PageEditModel.cs b/zero.Web/Models/PageEditModel.cs new file mode 100644 index 00000000..3557a542 --- /dev/null +++ b/zero.Web/Models/PageEditModel.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using zero.Core.Entities; + +namespace zero.Web.Models +{ + public class PageEditModel : EditModel where T : IPage + { + public PageType PageType { get; set; } + + public ListResult Revisions { get; set; } + } +}