diff --git a/zero.Core/Api/PermissionsApi.cs b/zero.Core/Api/PermissionsApi.cs index 960e4164..a75bad96 100644 --- a/zero.Core/Api/PermissionsApi.cs +++ b/zero.Core/Api/PermissionsApi.cs @@ -10,7 +10,6 @@ namespace zero.Core.Api { protected IZeroOptions Options { get; set; } - public PermissionsApi(IZeroOptions options) { Options = options; @@ -22,6 +21,7 @@ namespace zero.Core.Api { List result = Options.Permissions.GetAllItems().ToList(); PermissionCollection spaceCollection = result.FirstOrDefault(x => x.Alias == Constants.PermissionCollections.Spaces); + PermissionCollection moduleCollection = result.FirstOrDefault(x => x.Alias == Constants.PermissionCollections.Modules); if (spaceCollection != null) { @@ -33,6 +33,16 @@ namespace zero.Core.Api } } + if (moduleCollection != null) + { + moduleCollection.Items.Clear(); + + foreach (ModuleType module in Options.Modules.GetAllItems()) + { + moduleCollection.Items.Add(new Permission(Permissions.Modules.PREFIX + module.Alias, module.Name, module.Description, PermissionValueType.CRUD)); + } + } + return result; } } diff --git a/zero.Core/Constants.cs b/zero.Core/Constants.cs index 7edfab27..e0a55733 100644 --- a/zero.Core/Constants.cs +++ b/zero.Core/Constants.cs @@ -64,6 +64,8 @@ public const string Spaces = "permissionCollectionSpaces"; public const string Settings = "permisssionCollectionSettings"; + + public const string Modules = "permissionCollectionModules"; } } } diff --git a/zero.Core/Identity/Permissions.cs b/zero.Core/Identity/Permissions.cs index 39190e9d..9dc9c61b 100644 --- a/zero.Core/Identity/Permissions.cs +++ b/zero.Core/Identity/Permissions.cs @@ -39,6 +39,12 @@ { public const string PREFIX = "space."; } + + + public struct Modules + { + public const string PREFIX = "module."; + } } diff --git a/zero.Web.UI/App/components/datagrid/datagrid.vue b/zero.Web.UI/App/components/datagrid/datagrid.vue index 0859cca3..a11294a4 100644 --- a/zero.Web.UI/App/components/datagrid/datagrid.vue +++ b/zero.Web.UI/App/components/datagrid/datagrid.vue @@ -181,7 +181,7 @@ .ui-datagrid-items { display: grid; - grid-gap: var(--padding); + gap: var(--padding); grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); align-items: stretch; } diff --git a/zero.Web.UI/App/components/forms/media-old.vue b/zero.Web.UI/App/components/forms/media-old.vue index 5265e0a8..22bb3a89 100644 --- a/zero.Web.UI/App/components/forms/media-old.vue +++ b/zero.Web.UI/App/components/forms/media-old.vue @@ -334,7 +334,7 @@ .display-grid & { display: flex; - grid-gap: 10px; + gap: 10px; .ui-media-preview + .ui-media-preview { diff --git a/zero.Web.UI/App/components/messages/message.vue b/zero.Web.UI/App/components/messages/message.vue index 53bc20af..95f1fae0 100644 --- a/zero.Web.UI/App/components/messages/message.vue +++ b/zero.Web.UI/App/components/messages/message.vue @@ -71,7 +71,7 @@ display: inline-grid; padding: 8px 12px 7px 12px; grid-template-columns: auto 1fr; - grid-gap: 12px; + gap: 12px; border-radius: var(--radius); position: relative; line-height: 20px; diff --git a/zero.Web.UI/App/components/modules/modules-select.vue b/zero.Web.UI/App/components/modules/modules-select.vue index 56f278cd..5eae7d8d 100644 --- a/zero.Web.UI/App/components/modules/modules-select.vue +++ b/zero.Web.UI/App/components/modules/modules-select.vue @@ -148,7 +148,7 @@ font-size: var(--font-size); display: inline-grid; grid-template-columns: auto 1fr; - grid-gap: 25px; + gap: 25px; align-items: center; } @@ -241,7 +241,7 @@ .ui-modules-select-items { display: grid; - grid-gap: 10px; + gap: 10px; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); align-items: stretch; } diff --git a/zero.Web.UI/App/components/modules/modules.vue b/zero.Web.UI/App/components/modules/modules.vue index 87b23840..345e9e7e 100644 --- a/zero.Web.UI/App/components/modules/modules.vue +++ b/zero.Web.UI/App/components/modules/modules.vue @@ -160,7 +160,7 @@ font-size: var(--font-size); display: inline-grid; grid-template-columns: auto 1fr; - grid-gap: 25px; + gap: 25px; align-items: center; } diff --git a/zero.Web.UI/App/components/modules/predefined/module-preview-figure.vue b/zero.Web.UI/App/components/modules/predefined/module-preview-figure.vue index 4402c2a1..32fba50b 100644 --- a/zero.Web.UI/App/components/modules/predefined/module-preview-figure.vue +++ b/zero.Web.UI/App/components/modules/predefined/module-preview-figure.vue @@ -71,7 +71,7 @@ { display: grid; grid-template-columns: auto 1fr; - grid-gap: 20px; + gap: 20px; align-items: center; } diff --git a/zero.Web.UI/App/components/notifications/notification-holder.vue b/zero.Web.UI/App/components/notifications/notification-holder.vue index 7a5a9160..d829a697 100644 --- a/zero.Web.UI/App/components/notifications/notification-holder.vue +++ b/zero.Web.UI/App/components/notifications/notification-holder.vue @@ -46,7 +46,7 @@ { display: grid; grid-template-columns: 1fr auto; - grid-gap: 20px; + gap: 20px; align-items: center; background: var(--color-primary); color: var(--color-primary-fg); diff --git a/zero.Web.UI/App/components/overlays/dropdown-button.vue b/zero.Web.UI/App/components/overlays/dropdown-button.vue index 769c4983..6a7ca358 100644 --- a/zero.Web.UI/App/components/overlays/dropdown-button.vue +++ b/zero.Web.UI/App/components/overlays/dropdown-button.vue @@ -115,7 +115,7 @@ display: grid; width: 100%; grid-template-columns: 1fr auto; - grid-gap: 6px; + gap: 6px; align-items: center; font-size: var(--font-size); padding: 0 16px; diff --git a/zero.Web.UI/App/components/permissions.vue b/zero.Web.UI/App/components/permissions.vue index b19b8451..0f4b5b2d 100644 --- a/zero.Web.UI/App/components/permissions.vue +++ b/zero.Web.UI/App/components/permissions.vue @@ -1,23 +1,25 @@  + + \ No newline at end of file diff --git a/zero.Web.UI/App/components/tree/tree-item.vue b/zero.Web.UI/App/components/tree/tree-item.vue index eb6c1c7f..466e8578 100644 --- a/zero.Web.UI/App/components/tree/tree-item.vue +++ b/zero.Web.UI/App/components/tree/tree-item.vue @@ -151,7 +151,7 @@ { display: grid; grid-template-columns: 30px 1fr auto; - grid-gap: 6px; + gap: 6px; height: 100%; align-items: center; position: relative; diff --git a/zero.Web.UI/App/editor/fields/nested.vue b/zero.Web.UI/App/editor/fields/nested.vue index 5fc4dd9b..30256f1b 100644 --- a/zero.Web.UI/App/editor/fields/nested.vue +++ b/zero.Web.UI/App/editor/fields/nested.vue @@ -141,7 +141,7 @@ { display: grid; grid-template-columns: 30px 1fr auto; - grid-gap: 6px; + gap: 6px; height: 100%; align-items: center; position: relative; diff --git a/zero.Web.UI/App/pages/dashboard/dashboard.vue b/zero.Web.UI/App/pages/dashboard/dashboard.vue index f7abe1fa..7cf631d8 100644 --- a/zero.Web.UI/App/pages/dashboard/dashboard.vue +++ b/zero.Web.UI/App/pages/dashboard/dashboard.vue @@ -30,7 +30,7 @@ display: grid; padding: 20px; padding-left: 0; - grid-gap: 16px; + gap: 16px; grid-template-columns: repeat(auto-fill, minmax(360px, 1fr)); grid-auto-rows: minmax(240px, auto); grid-auto-flow: dense; diff --git a/zero.Web.UI/App/pages/media/media.vue b/zero.Web.UI/App/pages/media/media.vue index 9e4e7ebb..7275ca97 100644 --- a/zero.Web.UI/App/pages/media/media.vue +++ b/zero.Web.UI/App/pages/media/media.vue @@ -273,7 +273,7 @@ overflow-y: auto; display: grid; grid-template-columns: auto 1fr; - grid-gap: 2px; + gap: 2px; justify-content: stretch; } @@ -287,7 +287,7 @@ { /*display: grid; flex-wrap: wrap;*/ - grid-gap: 15px; + gap: 15px; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)) !important; align-items: stretch; } diff --git a/zero.Web.UI/App/pages/media/upload-status.vue b/zero.Web.UI/App/pages/media/upload-status.vue index 3f646980..3b374b95 100644 --- a/zero.Web.UI/App/pages/media/upload-status.vue +++ b/zero.Web.UI/App/pages/media/upload-status.vue @@ -136,7 +136,7 @@ height: 70px; display: grid; grid-template-columns: 70px 1fr; - grid-gap: 15px; + gap: 15px; align-items: center; line-height: 1.4; diff --git a/zero.Web.UI/App/pages/pages/overlays/create.vue b/zero.Web.UI/App/pages/pages/overlays/create.vue index d4ab191e..67eb2255 100644 --- a/zero.Web.UI/App/pages/pages/overlays/create.vue +++ b/zero.Web.UI/App/pages/pages/overlays/create.vue @@ -114,7 +114,7 @@ display: grid; width: 100%; grid-template-columns: 30px 1fr auto; - grid-gap: 6px; + gap: 6px; align-items: center; position: relative; color: var(--color-fg); diff --git a/zero.Web.UI/App/pages/pages/overlays/sort.vue b/zero.Web.UI/App/pages/pages/overlays/sort.vue index 5354d490..fbe815a3 100644 --- a/zero.Web.UI/App/pages/pages/overlays/sort.vue +++ b/zero.Web.UI/App/pages/pages/overlays/sort.vue @@ -103,7 +103,7 @@ display: grid; width: 100%; grid-template-columns: 1fr auto; - grid-gap: 6px; + gap: 6px; align-items: center; font-size: var(--font-size); height: 46px; diff --git a/zero.Web.UI/App/pages/pages/pages.vue b/zero.Web.UI/App/pages/pages/pages.vue index 6a9ad26f..889b9c8c 100644 --- a/zero.Web.UI/App/pages/pages/pages.vue +++ b/zero.Web.UI/App/pages/pages/pages.vue @@ -240,7 +240,7 @@ { display: grid; grid-template-columns: auto 1fr; - grid-gap: 2px; + gap: 2px; justify-content: stretch; height: 100vh; } @@ -260,7 +260,7 @@ font-size: var(--font-size); display: grid; grid-template-columns: auto 1fr; - grid-gap: 35px; + gap: 35px; align-items: center; & + .page-overview-action diff --git a/zero.Web.UI/App/pages/pages/recyclebin/recyclebin-actions.vue b/zero.Web.UI/App/pages/pages/recyclebin/recyclebin-actions.vue index 21777f00..43363e13 100644 --- a/zero.Web.UI/App/pages/pages/recyclebin/recyclebin-actions.vue +++ b/zero.Web.UI/App/pages/pages/recyclebin/recyclebin-actions.vue @@ -111,7 +111,7 @@ { display: grid; grid-template-columns: auto 1fr; - grid-gap: var(--padding); + gap: var(--padding); align-items: center; width: 100%; background: var(--color-bg-bright); diff --git a/zero.Web.UI/App/pages/settings/applications-items.vue b/zero.Web.UI/App/pages/settings/applications-items.vue index 2ddaed2a..235ec488 100644 --- a/zero.Web.UI/App/pages/settings/applications-items.vue +++ b/zero.Web.UI/App/pages/settings/applications-items.vue @@ -52,7 +52,7 @@ .apps-items { display: grid; - grid-gap: var(--padding); + gap: var(--padding); grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); align-items: stretch; margin-top: 40px; diff --git a/zero.Web.UI/App/pages/settings/role.vue b/zero.Web.UI/App/pages/settings/role.vue index 80bb41c3..cebdd70a 100644 --- a/zero.Web.UI/App/pages/settings/role.vue +++ b/zero.Web.UI/App/pages/settings/role.vue @@ -1,7 +1,7 @@  diff --git a/zero.Web.UI/App/pages/settings/settings.vue b/zero.Web.UI/App/pages/settings/settings.vue index 40d0e546..60e51c64 100644 --- a/zero.Web.UI/App/pages/settings/settings.vue +++ b/zero.Web.UI/App/pages/settings/settings.vue @@ -64,7 +64,7 @@ width: 100%; max-width: 2000px; display: grid; - grid-gap: 80px 40px; + gap: 80px 40px; grid-template-columns: repeat(auto-fill, minmax(400px, 1fr)); padding-left: 80px; } @@ -72,7 +72,7 @@ .settings-group-items { display: grid; - grid-gap: 30px 20px; + gap: 30px 20px; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); align-items: stretch; margin-top: 40px; @@ -84,7 +84,7 @@ font-size: var(--font-size); display: grid; grid-template-columns: auto 1fr; - grid-gap: 20px; + gap: 20px; align-items: center; } diff --git a/zero.Web.UI/App/pages/settings/users.vue b/zero.Web.UI/App/pages/settings/users.vue index ca2c01a4..51eec534 100644 --- a/zero.Web.UI/App/pages/settings/users.vue +++ b/zero.Web.UI/App/pages/settings/users.vue @@ -129,7 +129,7 @@ .users-roles { display: grid; - grid-gap: var(--padding); + gap: var(--padding); grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); align-items: stretch; margin-bottom: calc(var(--padding) * 2); diff --git a/zero.Web.UI/App/pages/spaces/spaces.vue b/zero.Web.UI/App/pages/spaces/spaces.vue index 91f77f0f..d52f6222 100644 --- a/zero.Web.UI/App/pages/spaces/spaces.vue +++ b/zero.Web.UI/App/pages/spaces/spaces.vue @@ -149,7 +149,7 @@ { display: grid; grid-template-columns: auto 1fr; - grid-gap: 2px; + gap: 2px; justify-content: stretch; height: 100vh; } @@ -207,7 +207,7 @@ { display: grid; grid-template-columns: 30px 1fr auto; - grid-gap: 6px; + gap: 6px; height: 100%; align-items: center; position: relative; diff --git a/zero.Web.UI/Sass/Canvas/_canvas.scss b/zero.Web.UI/Sass/Canvas/_canvas.scss index 8f28065d..e020beda 100644 --- a/zero.Web.UI/Sass/Canvas/_canvas.scss +++ b/zero.Web.UI/Sass/Canvas/_canvas.scss @@ -61,7 +61,7 @@ body { display: grid; grid-template-columns: 1fr 1fr; - grid-gap: var(--padding); + gap: var(--padding); align-items: stretch; justify-content: stretch; diff --git a/zero.Web.UI/Sass/Canvas/_navigation.scss b/zero.Web.UI/Sass/Canvas/_navigation.scss index 9b2473c5..0cc973f9 100644 --- a/zero.Web.UI/Sass/Canvas/_navigation.scss +++ b/zero.Web.UI/Sass/Canvas/_navigation.scss @@ -56,7 +56,7 @@ a.app-nav-item { display: grid; grid-template-columns: 30px 1fr auto; - grid-gap: 6px; + gap: 6px; align-items: center; font-size: var(--font-size); padding: 0 var(--padding); @@ -158,7 +158,7 @@ a.app-nav-child display: grid; width: 100%; grid-template-columns: auto 1fr auto; - grid-gap: 16px; + gap: 16px; color: var(--color-fg-dim-two); align-items: center; diff --git a/zero.Web.UI/Sass/Modules/_box.scss b/zero.Web.UI/Sass/Modules/_box.scss index f4d0b099..4036974b 100644 --- a/zero.Web.UI/Sass/Modules/_box.scss +++ b/zero.Web.UI/Sass/Modules/_box.scss @@ -62,7 +62,7 @@ { display: grid; grid-template-columns: 1fr auto; - grid-gap: 16px; + gap: 16px; } .ui-box, .ui-blank-box diff --git a/zero.Web/Defaults/ModulePermissions.cs b/zero.Web/Defaults/ModulePermissions.cs new file mode 100644 index 00000000..3adccf27 --- /dev/null +++ b/zero.Web/Defaults/ModulePermissions.cs @@ -0,0 +1,17 @@ +using zero.Core; +using zero.Core.Identity; + +namespace zero.Web.Defaults +{ + public class ModulePermissions : PermissionCollection + { + public ModulePermissions() + { + Alias = Constants.PermissionCollections.Modules; + Label = "@permission.collections.modules"; + Description = "@permission.collections.modules_description"; + + // Items get added at runtime + } + } +} diff --git a/zero.Web/Defaults/ZeroBackofficePlugin.cs b/zero.Web/Defaults/ZeroBackofficePlugin.cs index 1a44798a..8407b14a 100644 --- a/zero.Web/Defaults/ZeroBackofficePlugin.cs +++ b/zero.Web/Defaults/ZeroBackofficePlugin.cs @@ -73,6 +73,7 @@ namespace zero.Web.Defaults zero.Mapper.Add(); zero.Permissions.AddCollection(); + zero.Permissions.AddCollection(); zero.Permissions.AddCollection(); zero.Permissions.AddCollection(); } diff --git a/zero.Web/Resources/Localization/zero.en-us.json b/zero.Web/Resources/Localization/zero.en-us.json index bc556817..dbc29e29 100644 --- a/zero.Web/Resources/Localization/zero.en-us.json +++ b/zero.Web/Resources/Localization/zero.en-us.json @@ -286,12 +286,14 @@ "none": "None" }, "collections": { - "sections": "Access to sections", + "sections": "Sections", "sections_description": "Allow access to the following sections", - "settings": "Access to settings", + "settings": "Settings", "settings_description": "Define read and write access for settings areas", - "spaces": "Access to spaces", - "spaces_description": "Granular control of spaces" + "spaces": "Spaces", + "spaces_description": "Granular control of spaces", + "modules": "Modules", + "modules_description": "Availability of composing block modules" } },