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