From ee0fe843182afcc2739f5f76e23f76f51c5e9a13 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 19 Feb 2024 16:23:56 +0100 Subject: [PATCH 01/85] use const --- .../documents/user-permissions/manifests.ts | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts index 6269ef72e6..d363be4874 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts @@ -1,3 +1,4 @@ +import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; import type { ManifestUserGranularPermission, @@ -27,7 +28,7 @@ const permissions: Array = [ alias: UMB_USER_PERMISSION_DOCUMENT_READ, name: 'Read Document User Permission', meta: { - entityType: 'document', + entityType: UMB_DOCUMENT_ENTITY_TYPE, labelKey: 'actions_browse', descriptionKey: 'actionDescriptions_browse', }, @@ -37,7 +38,7 @@ const permissions: Array = [ alias: UMB_USER_PERMISSION_DOCUMENT_CREATE_BLUEPRINT, name: 'Create Document Blueprint User Permission', meta: { - entityType: 'document', + entityType: UMB_DOCUMENT_ENTITY_TYPE, labelKey: 'actions_createblueprint', descriptionKey: 'actionDescriptions_createblueprint', }, @@ -47,7 +48,7 @@ const permissions: Array = [ alias: UMB_USER_PERMISSION_DOCUMENT_DELETE, name: 'Delete Document User Permission', meta: { - entityType: 'document', + entityType: UMB_DOCUMENT_ENTITY_TYPE, labelKey: 'actions_delete', descriptionKey: 'actionDescriptions_delete', }, @@ -57,7 +58,7 @@ const permissions: Array = [ alias: UMB_USER_PERMISSION_DOCUMENT_CREATE, name: 'Create Document User Permission', meta: { - entityType: 'document', + entityType: UMB_DOCUMENT_ENTITY_TYPE, labelKey: 'actions_create', descriptionKey: 'actionDescriptions_create', }, @@ -67,7 +68,7 @@ const permissions: Array = [ alias: UMB_USER_PERMISSION_DOCUMENT_NOTIFICATIONS, name: 'Document Notifications User Permission', meta: { - entityType: 'document', + entityType: UMB_DOCUMENT_ENTITY_TYPE, labelKey: 'actions_notify', descriptionKey: 'actionDescriptions_notify', }, @@ -77,7 +78,7 @@ const permissions: Array = [ alias: UMB_USER_PERMISSION_DOCUMENT_PUBLISH, name: 'Publish Document User Permission', meta: { - entityType: 'document', + entityType: UMB_DOCUMENT_ENTITY_TYPE, labelKey: 'actions_publish', descriptionKey: 'actionDescriptions_publish', }, @@ -87,7 +88,7 @@ const permissions: Array = [ alias: UMB_USER_PERMISSION_DOCUMENT_PERMISSIONS, name: 'Document Permissions User Permission', meta: { - entityType: 'document', + entityType: UMB_DOCUMENT_ENTITY_TYPE, labelKey: 'actions_setPermissions', descriptionKey: 'actionDescriptions_rights', }, @@ -97,7 +98,7 @@ const permissions: Array = [ alias: UMB_USER_PERMISSION_DOCUMENT_SEND_FOR_APPROVAL, name: 'Send Document For Approval User Permission', meta: { - entityType: 'document', + entityType: UMB_DOCUMENT_ENTITY_TYPE, labelKey: 'actions_sendtopublish', descriptionKey: 'actionDescriptions_sendtopublish', }, @@ -107,7 +108,7 @@ const permissions: Array = [ alias: UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH, name: 'Unpublish Document User Permission', meta: { - entityType: 'document', + entityType: UMB_DOCUMENT_ENTITY_TYPE, labelKey: 'actions_unpublish', descriptionKey: 'actionDescriptions_unpublish', }, @@ -117,7 +118,7 @@ const permissions: Array = [ alias: UMB_USER_PERMISSION_DOCUMENT_UPDATE, name: 'Update Document User Permission', meta: { - entityType: 'document', + entityType: UMB_DOCUMENT_ENTITY_TYPE, labelKey: 'actions_update', descriptionKey: 'actionDescriptions_update', }, @@ -127,7 +128,7 @@ const permissions: Array = [ alias: UMB_USER_PERMISSION_DOCUMENT_COPY, name: 'Copy Document User Permission', meta: { - entityType: 'document', + entityType: UMB_DOCUMENT_ENTITY_TYPE, labelKey: 'actions_copy', descriptionKey: 'actionDescriptions_copy', group: 'structure', @@ -138,7 +139,7 @@ const permissions: Array = [ alias: UMB_USER_PERMISSION_DOCUMENT_MOVE, name: 'Move Document User Permission', meta: { - entityType: 'document', + entityType: UMB_DOCUMENT_ENTITY_TYPE, labelKey: 'actions_move', descriptionKey: 'actionDescriptions_move', group: 'structure', @@ -149,7 +150,7 @@ const permissions: Array = [ alias: UMB_USER_PERMISSION_DOCUMENT_SORT, name: 'Sort Document User Permission', meta: { - entityType: 'document', + entityType: UMB_DOCUMENT_ENTITY_TYPE, labelKey: 'actions_sort', descriptionKey: 'actionDescriptions_sort', group: 'structure', @@ -160,7 +161,7 @@ const permissions: Array = [ alias: UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES, name: 'Document Culture And Hostnames User Permission', meta: { - entityType: 'document', + entityType: UMB_DOCUMENT_ENTITY_TYPE, labelKey: 'actions_assigndomain', descriptionKey: 'actionDescriptions_assignDomain', group: 'administration', @@ -171,7 +172,7 @@ const permissions: Array = [ alias: UMB_USER_PERMISSION_DOCUMENT_PUBLIC_ACCESS, name: 'Document Public Access User Permission', meta: { - entityType: 'document', + entityType: UMB_DOCUMENT_ENTITY_TYPE, labelKey: 'actions_protect', descriptionKey: 'actionDescriptions_protect', group: 'administration', @@ -182,7 +183,7 @@ const permissions: Array = [ alias: UMB_USER_PERMISSION_DOCUMENT_ROLLBACK, name: 'Document Rollback User Permission', meta: { - entityType: 'document', + entityType: UMB_DOCUMENT_ENTITY_TYPE, labelKey: 'actions_rollback', descriptionKey: 'actionDescriptions_rollback', group: 'administration', @@ -197,7 +198,7 @@ export const granularPermissions: Array = [ name: 'Document Granular User Permission', js: () => import('../components/input-document-granular-permission/input-document-granular-permission.element.js'), meta: { - entityType: 'document', + entityType: UMB_DOCUMENT_ENTITY_TYPE, }, }, ]; From 3c906f0acd7d0a2d567fd01575d7623338dafe72 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 20 Feb 2024 10:51:59 +0100 Subject: [PATCH 02/85] allow conditions on user permissions --- .../core/extension-registry/models/user-permission.model.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts index 7a3b35a448..f57d7a2d1d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts @@ -1,6 +1,6 @@ -import type { ManifestBase } from '@umbraco-cms/backoffice/extension-api'; +import type { ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api'; -export interface ManifestUserPermission extends ManifestBase { +export interface ManifestUserPermission extends ManifestWithDynamicConditions { type: 'userPermission'; meta: MetaUserPermission; } From 04b1630d82c0dd2b1f463a49bf2c09a8129aba72 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 20 Feb 2024 10:52:15 +0100 Subject: [PATCH 03/85] remove entityType from meta --- .../core/extension-registry/models/user-permission.model.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts index f57d7a2d1d..aa094a860f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts @@ -6,7 +6,6 @@ export interface ManifestUserPermission extends ManifestWithDynamicConditions { } export interface MetaUserPermission { - entityType: string; label?: string; labelKey?: string; description?: string; From 186aa815f02cfe703c25bea104fff521fa4548a0 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 20 Feb 2024 11:35:30 +0100 Subject: [PATCH 04/85] make extension type explicit for entities --- .../core/extension-registry/models/index.ts | 4 +-- .../models/user-permission.model.ts | 11 +++--- .../documents/user-permissions/manifests.ts | 36 +++++++++---------- .../media/media/user-permissions/manifests.ts | 8 ++--- .../user-group-ref/user-group-ref.element.ts | 6 ++-- ...r-group-default-permission-list.element.ts | 2 +- ...y-user-permission-settings-list.element.ts | 16 ++++----- 7 files changed, 42 insertions(+), 41 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts index 32a47be86f..290093c562 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts @@ -32,7 +32,7 @@ import type { ManifestWorkspaceAction } from './workspace-action.model.js'; import type { ManifestWorkspaceContext } from './workspace-context.model.js'; import type { ManifestWorkspaceFooterApp } from './workspace-footer-app.model.js'; import type { ManifestWorkspaceView } from './workspace-view.model.js'; -import type { ManifestUserPermission } from './user-permission.model.js'; +import type { ManifestEntityUserPermission } from './user-permission.model.js'; import type { ManifestUserGranularPermission } from './user-granular-permission.model.js'; import type { ManifestCollectionAction } from './collection-action.model.js'; import type { @@ -126,6 +126,6 @@ export type ManifestTypes = | ManifestWorkspaceContext | ManifestWorkspaceFooterApp | ManifestWorkspaceView - | ManifestUserPermission + | ManifestEntityUserPermission | ManifestUserGranularPermission | ManifestBase; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts index aa094a860f..ac979cb9d5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts @@ -1,11 +1,12 @@ -import type { ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api'; +import type { ManifestBase } from '@umbraco-cms/backoffice/extension-api'; -export interface ManifestUserPermission extends ManifestWithDynamicConditions { - type: 'userPermission'; - meta: MetaUserPermission; +export interface ManifestEntityUserPermission extends ManifestBase { + type: 'entityUserPermission'; + meta: MetaEntityUserPermission; } -export interface MetaUserPermission { +export interface MetaEntityUserPermission { + entityType: string; label?: string; labelKey?: string; description?: string; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts index d363be4874..097f75e69b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts @@ -2,7 +2,7 @@ import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; import type { ManifestUserGranularPermission, - ManifestUserPermission, + ManifestEntityUserPermission, } from '@umbraco-cms/backoffice/extension-registry'; export const UMB_USER_PERMISSION_DOCUMENT_CREATE = 'Umb.UserPermission.Document.Create'; @@ -22,9 +22,9 @@ export const UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES = 'Umb.UserPermi export const UMB_USER_PERMISSION_DOCUMENT_PUBLIC_ACCESS = 'Umb.UserPermission.Document.PublicAccess'; export const UMB_USER_PERMISSION_DOCUMENT_ROLLBACK = 'Umb.UserPermission.Document.Rollback'; -const permissions: Array = [ +const permissions: Array = [ { - type: 'userPermission', + type: 'entityUserPermission', alias: UMB_USER_PERMISSION_DOCUMENT_READ, name: 'Read Document User Permission', meta: { @@ -34,7 +34,7 @@ const permissions: Array = [ }, }, { - type: 'userPermission', + type: 'entityUserPermission', alias: UMB_USER_PERMISSION_DOCUMENT_CREATE_BLUEPRINT, name: 'Create Document Blueprint User Permission', meta: { @@ -44,7 +44,7 @@ const permissions: Array = [ }, }, { - type: 'userPermission', + type: 'entityUserPermission', alias: UMB_USER_PERMISSION_DOCUMENT_DELETE, name: 'Delete Document User Permission', meta: { @@ -54,7 +54,7 @@ const permissions: Array = [ }, }, { - type: 'userPermission', + type: 'entityUserPermission', alias: UMB_USER_PERMISSION_DOCUMENT_CREATE, name: 'Create Document User Permission', meta: { @@ -64,7 +64,7 @@ const permissions: Array = [ }, }, { - type: 'userPermission', + type: 'entityUserPermission', alias: UMB_USER_PERMISSION_DOCUMENT_NOTIFICATIONS, name: 'Document Notifications User Permission', meta: { @@ -74,7 +74,7 @@ const permissions: Array = [ }, }, { - type: 'userPermission', + type: 'entityUserPermission', alias: UMB_USER_PERMISSION_DOCUMENT_PUBLISH, name: 'Publish Document User Permission', meta: { @@ -84,7 +84,7 @@ const permissions: Array = [ }, }, { - type: 'userPermission', + type: 'entityUserPermission', alias: UMB_USER_PERMISSION_DOCUMENT_PERMISSIONS, name: 'Document Permissions User Permission', meta: { @@ -94,7 +94,7 @@ const permissions: Array = [ }, }, { - type: 'userPermission', + type: 'entityUserPermission', alias: UMB_USER_PERMISSION_DOCUMENT_SEND_FOR_APPROVAL, name: 'Send Document For Approval User Permission', meta: { @@ -104,7 +104,7 @@ const permissions: Array = [ }, }, { - type: 'userPermission', + type: 'entityUserPermission', alias: UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH, name: 'Unpublish Document User Permission', meta: { @@ -114,7 +114,7 @@ const permissions: Array = [ }, }, { - type: 'userPermission', + type: 'entityUserPermission', alias: UMB_USER_PERMISSION_DOCUMENT_UPDATE, name: 'Update Document User Permission', meta: { @@ -124,7 +124,7 @@ const permissions: Array = [ }, }, { - type: 'userPermission', + type: 'entityUserPermission', alias: UMB_USER_PERMISSION_DOCUMENT_COPY, name: 'Copy Document User Permission', meta: { @@ -135,7 +135,7 @@ const permissions: Array = [ }, }, { - type: 'userPermission', + type: 'entityUserPermission', alias: UMB_USER_PERMISSION_DOCUMENT_MOVE, name: 'Move Document User Permission', meta: { @@ -146,7 +146,7 @@ const permissions: Array = [ }, }, { - type: 'userPermission', + type: 'entityUserPermission', alias: UMB_USER_PERMISSION_DOCUMENT_SORT, name: 'Sort Document User Permission', meta: { @@ -157,7 +157,7 @@ const permissions: Array = [ }, }, { - type: 'userPermission', + type: 'entityUserPermission', alias: UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES, name: 'Document Culture And Hostnames User Permission', meta: { @@ -168,7 +168,7 @@ const permissions: Array = [ }, }, { - type: 'userPermission', + type: 'entityUserPermission', alias: UMB_USER_PERMISSION_DOCUMENT_PUBLIC_ACCESS, name: 'Document Public Access User Permission', meta: { @@ -179,7 +179,7 @@ const permissions: Array = [ }, }, { - type: 'userPermission', + type: 'entityUserPermission', alias: UMB_USER_PERMISSION_DOCUMENT_ROLLBACK, name: 'Document Rollback User Permission', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/user-permissions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/user-permissions/manifests.ts index 3ddbb9b526..1fa4411521 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/user-permissions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/user-permissions/manifests.ts @@ -1,11 +1,11 @@ -import type { ManifestUserPermission } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestEntityUserPermission } from '@umbraco-cms/backoffice/extension-registry'; export const UMB_USER_PERMISSION_MEDIA_MOVE = 'Umb.UserPermission.Media.Move'; export const UMB_USER_PERMISSION_MEDIA_COPY = 'Umb.UserPermission.Media.Copy'; -const permissions: Array = [ +const permissions: Array = [ { - type: 'userPermission', + type: 'entityUserPermission', alias: UMB_USER_PERMISSION_MEDIA_MOVE, name: 'Move Media Item User Permission', meta: { @@ -16,7 +16,7 @@ const permissions: Array = [ }, }, { - type: 'userPermission', + type: 'entityUserPermission', alias: UMB_USER_PERMISSION_MEDIA_COPY, name: 'Copy Media Item User Permission', meta: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/user-group-ref/user-group-ref.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/user-group-ref/user-group-ref.element.ts index ad89f8484d..5a679c3bdb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/user-group-ref/user-group-ref.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/user-group-ref/user-group-ref.element.ts @@ -1,7 +1,7 @@ import { UUIRefNodeElement } from '@umbraco-cms/backoffice/external/uui'; import { customElement, html, property } from '@umbraco-cms/backoffice/external/lit'; import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; -import type { ManifestUserPermission } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestEntityUserPermission } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { map } from '@umbraco-cms/backoffice/external/rxjs'; @@ -25,7 +25,7 @@ export class UmbUserGroupRefElement extends UmbElementMixin(UUIRefNodeElement) { async #observeUserPermissions(value: Array) { if (value) { this.observe( - umbExtensionsRegistry.byType('userPermission').pipe( + umbExtensionsRegistry.byType('entityUserPermission').pipe( map((manifests) => { return manifests.filter((manifest) => manifest.alias && value.includes(manifest.alias)); }), @@ -38,7 +38,7 @@ export class UmbUserGroupRefElement extends UmbElementMixin(UUIRefNodeElement) { } } - #setUserPermissionLabels(manifests: Array) { + #setUserPermissionLabels(manifests: Array) { this.#userPermissionLabels = manifests.map((manifest) => manifest.meta.labelKey ? this.localize.term(manifest.meta.labelKey) : manifest.meta.label ?? '', ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-default-permission-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-default-permission-list.element.ts index 3c89528ec5..eb450d2f10 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-default-permission-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-default-permission-list.element.ts @@ -32,7 +32,7 @@ export class UmbUserGroupDefaultPermissionListElement extends UmbLitElement { #observeUserPermissions() { this.observe( - umbExtensionsRegistry.byType('userPermission'), + umbExtensionsRegistry.byType('entityUserPermission'), (userPermissionManifests) => { this._entityTypes = [...new Set(userPermissionManifests.map((manifest) => manifest.meta.entityType))]; }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts index 3736f28c5f..e300852a5b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts @@ -1,6 +1,6 @@ import type { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; import { UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; -import type { ManifestUserPermission } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestEntityUserPermission } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { css, html, customElement, property, state, nothing, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; @@ -24,9 +24,9 @@ export class UmbEntityUserPermissionSettingsListElement extends UmbLitElement { selectedPermissions: Array = []; @state() - private _manifests: Array = []; + private _manifests: Array = []; - #manifestObserver?: UmbObserverController>; + #manifestObserver?: UmbObserverController>; #isAllowed(permissionAlias: string) { return this.selectedPermissions?.includes(permissionAlias); @@ -36,7 +36,7 @@ export class UmbEntityUserPermissionSettingsListElement extends UmbLitElement { this.#manifestObserver?.destroy(); this.#manifestObserver = this.observe( - umbExtensionsRegistry.byType('userPermission'), + umbExtensionsRegistry.byType('entityUserPermission'), (userPermissionManifests) => { this._manifests = userPermissionManifests.filter((manifest) => manifest.meta.entityType === this.entityType); }, @@ -64,14 +64,14 @@ export class UmbEntityUserPermissionSettingsListElement extends UmbLitElement { return html`${this.#renderGroupedPermissions(this._manifests)} `; } - #renderGroupedPermissions(permissionManifests: Array) { + #renderGroupedPermissions(permissionManifests: Array) { // TODO: groupBy is not known by TS yet // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error const groupedPermissions = Object.groupBy( permissionManifests, - (manifest: ManifestUserPermission) => manifest.meta.group, - ) as Record>; + (manifest: ManifestEntityUserPermission) => manifest.meta.group, + ) as Record>; return html` ${Object.entries(groupedPermissions).map( ([group, manifests]) => html` @@ -84,7 +84,7 @@ export class UmbEntityUserPermissionSettingsListElement extends UmbLitElement { `; } - #renderPermission(manifest: ManifestUserPermission) { + #renderPermission(manifest: ManifestEntityUserPermission) { return html` Date: Tue, 20 Feb 2024 14:49:52 +0100 Subject: [PATCH 05/85] add verb to each permission manifest --- .../models/user-permission.model.ts | 1 + .../documents/user-permissions/manifests.ts | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts index ac979cb9d5..6b05b2eba7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts @@ -7,6 +7,7 @@ export interface ManifestEntityUserPermission extends ManifestBase { export interface MetaEntityUserPermission { entityType: string; + verb: string; label?: string; labelKey?: string; description?: string; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts index 097f75e69b..30936509f1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts @@ -29,6 +29,7 @@ const permissions: Array = [ name: 'Read Document User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, + verb: 'Umb.Document.Read', labelKey: 'actions_browse', descriptionKey: 'actionDescriptions_browse', }, @@ -39,6 +40,7 @@ const permissions: Array = [ name: 'Create Document Blueprint User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, + verb: 'Umb.Document.CreateBlueprint', labelKey: 'actions_createblueprint', descriptionKey: 'actionDescriptions_createblueprint', }, @@ -49,6 +51,7 @@ const permissions: Array = [ name: 'Delete Document User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, + verb: 'Umb.Document.Delete', labelKey: 'actions_delete', descriptionKey: 'actionDescriptions_delete', }, @@ -59,6 +62,7 @@ const permissions: Array = [ name: 'Create Document User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, + verb: 'Umb.Document.Create', labelKey: 'actions_create', descriptionKey: 'actionDescriptions_create', }, @@ -69,6 +73,7 @@ const permissions: Array = [ name: 'Document Notifications User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, + verb: 'Umb.Document.Notifications', labelKey: 'actions_notify', descriptionKey: 'actionDescriptions_notify', }, @@ -79,6 +84,7 @@ const permissions: Array = [ name: 'Publish Document User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, + verb: 'Umb.Document.Publish', labelKey: 'actions_publish', descriptionKey: 'actionDescriptions_publish', }, @@ -89,6 +95,7 @@ const permissions: Array = [ name: 'Document Permissions User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, + verb: 'Umb.Document.Permissions', labelKey: 'actions_setPermissions', descriptionKey: 'actionDescriptions_rights', }, @@ -99,6 +106,7 @@ const permissions: Array = [ name: 'Send Document For Approval User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, + verb: 'Umb.Document.SendForApproval', labelKey: 'actions_sendtopublish', descriptionKey: 'actionDescriptions_sendtopublish', }, @@ -109,6 +117,7 @@ const permissions: Array = [ name: 'Unpublish Document User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, + verb: 'Umb.Document.Unpublish', labelKey: 'actions_unpublish', descriptionKey: 'actionDescriptions_unpublish', }, @@ -119,6 +128,7 @@ const permissions: Array = [ name: 'Update Document User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, + verb: 'Umb.Document.Update', labelKey: 'actions_update', descriptionKey: 'actionDescriptions_update', }, @@ -129,6 +139,7 @@ const permissions: Array = [ name: 'Copy Document User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, + verb: 'Umb.Document.Copy', labelKey: 'actions_copy', descriptionKey: 'actionDescriptions_copy', group: 'structure', @@ -140,6 +151,7 @@ const permissions: Array = [ name: 'Move Document User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, + verb: 'Umb.Document.Move', labelKey: 'actions_move', descriptionKey: 'actionDescriptions_move', group: 'structure', @@ -151,6 +163,7 @@ const permissions: Array = [ name: 'Sort Document User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, + verb: 'Umb.Document.Sort', labelKey: 'actions_sort', descriptionKey: 'actionDescriptions_sort', group: 'structure', @@ -162,6 +175,7 @@ const permissions: Array = [ name: 'Document Culture And Hostnames User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, + verb: 'Umb.Document.CultureAndHostnames', labelKey: 'actions_assigndomain', descriptionKey: 'actionDescriptions_assignDomain', group: 'administration', @@ -173,6 +187,7 @@ const permissions: Array = [ name: 'Document Public Access User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, + verb: 'Umb.Document.PublicAccess', labelKey: 'actions_protect', descriptionKey: 'actionDescriptions_protect', group: 'administration', @@ -184,6 +199,7 @@ const permissions: Array = [ name: 'Document Rollback User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, + verb: 'Umb.Document.Rollback', labelKey: 'actions_rollback', descriptionKey: 'actionDescriptions_rollback', group: 'administration', From b6d4331db261dfb81afe03f8e5df802281655557 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 20 Feb 2024 15:44:40 +0100 Subject: [PATCH 06/85] rename component --- ...up-entity-user-permission-list.element.ts} | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/{user-group-default-permission-list.element.ts => user-group-entity-user-permission-list.element.ts} (70%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-default-permission-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-entity-user-permission-list.element.ts similarity index 70% rename from src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-default-permission-list.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-entity-user-permission-list.element.ts index eb450d2f10..22169fb217 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-default-permission-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-entity-user-permission-list.element.ts @@ -5,10 +5,10 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -@customElement('umb-user-group-default-permission-list') -export class UmbUserGroupDefaultPermissionListElement extends UmbLitElement { +@customElement('umb-user-group-entity-user-permission-list') +export class UmbUserGroupEntityUserPermissionListElement extends UmbLitElement { @state() - private _userGroupDefaultPermissions?: Array; + private _userGroupPermissions?: Array; @state() private _entityTypes: Array = []; @@ -18,23 +18,23 @@ export class UmbUserGroupDefaultPermissionListElement extends UmbLitElement { constructor() { super(); - this.#observeUserPermissions(); + this.#observeEntityUserPermissions(); this.consumeContext(UMB_USER_GROUP_WORKSPACE_CONTEXT, (instance) => { this.#userGroupWorkspaceContext = instance; this.observe( this.#userGroupWorkspaceContext.data, - (userGroup) => (this._userGroupDefaultPermissions = userGroup?.permissions), - 'umbUserGroupPermissionsObserver', + (userGroup) => (this._userGroupPermissions = userGroup?.permissions), + 'umbUserGroupEntityUserPermissionsObserver', ); }); } - #observeUserPermissions() { + #observeEntityUserPermissions() { this.observe( umbExtensionsRegistry.byType('entityUserPermission'), - (userPermissionManifests) => { - this._entityTypes = [...new Set(userPermissionManifests.map((manifest) => manifest.meta.entityType))]; + (manifests) => { + this._entityTypes = [...new Set(manifests.map((manifest) => manifest.meta.entityType))]; }, 'umbUserPermissionsObserver', ); @@ -55,7 +55,7 @@ export class UmbUserGroupDefaultPermissionListElement extends UmbLitElement {

${entityType}

`; } @@ -63,10 +63,10 @@ export class UmbUserGroupDefaultPermissionListElement extends UmbLitElement { static styles = [UmbTextStyles]; } -export default UmbUserGroupDefaultPermissionListElement; +export default UmbUserGroupEntityUserPermissionListElement; declare global { interface HTMLElementTagNameMap { - 'umb-user-group-default-permission-list': UmbUserGroupDefaultPermissionListElement; + 'umb-user-group-default-permission-list': UmbUserGroupEntityUserPermissionListElement; } } From 987506791b78277ca56b0606ca9afefd14fbcfc8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 20 Feb 2024 15:44:48 +0100 Subject: [PATCH 07/85] test new data --- .../src/mocks/data/user-permission.data.ts | 44 +++++-------------- 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-permission.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-permission.data.ts index e6121a1349..794e4bec08 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-permission.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-permission.data.ts @@ -1,43 +1,21 @@ import { UmbEntityData } from './entity.data.js'; -import { - UMB_DOCUMENT_ENTITY_TYPE, - UMB_USER_PERMISSION_DOCUMENT_CREATE, - UMB_USER_PERMISSION_DOCUMENT_READ, -} from '@umbraco-cms/backoffice/document'; -export type UserPermissionModel = { +export interface UserPermissionModel { id: string; - target: unknown; - permissions: Array; -}; + verb: string; +} -export const data: Array = [ +export interface DocumentUserPermissionModel extends UserPermissionModel { + document?: { id: string }; +} + +export const data: Array = [ { id: '408074bb-f776-485e-b85e-c2473e45663b', - target: { - entityType: UMB_DOCUMENT_ENTITY_TYPE, - documentId: 'simple-document-id', - userGroupId: 'user-group-administrators-id', + verb: 'Umb.Document.Read', + document: { + id: 'simple-document-id', }, - permissions: [UMB_USER_PERMISSION_DOCUMENT_READ], - }, - { - id: 'b70b1453-a912-4157-ba62-20c2f0ab6a88', - target: { - entityType: UMB_DOCUMENT_ENTITY_TYPE, - documentId: 'simple-document-id', - userGroupId: 'user-group-editors-id', - }, - permissions: [UMB_USER_PERMISSION_DOCUMENT_READ, UMB_USER_PERMISSION_DOCUMENT_CREATE], - }, - { - id: 'b70b1453-a912-4157-ba62-20c2f0ab6a88', - target: { - entityType: UMB_DOCUMENT_ENTITY_TYPE, - documentId: 'c05da24d-7740-447b-9cdc-bd8ce2172e38', - userGroupId: 'user-group-administrators-id', - }, - permissions: [UMB_USER_PERMISSION_DOCUMENT_READ], }, ]; From 6dbd9660e20f230f327bda97b3be79c6be726487 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 20 Feb 2024 15:44:59 +0100 Subject: [PATCH 08/85] test new data --- .../mocks/data/user-group/user-group.data.ts | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts index 46986bd2d8..030ff084f5 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts @@ -1,9 +1,4 @@ import type { UserGroupItemResponseModel, UserGroupResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { - UMB_USER_PERMISSION_DOCUMENT_CREATE, - UMB_USER_PERMISSION_DOCUMENT_DELETE, - UMB_USER_PERMISSION_DOCUMENT_READ, -} from '@umbraco-cms/backoffice/document'; export type UmbMockUserGroupModel = UserGroupResponseModel & UserGroupItemResponseModel; @@ -14,9 +9,9 @@ export const data: Array = [ icon: 'icon-medal', documentStartNode: { id: 'all-property-editors-document-id' }, permissions: [ - UMB_USER_PERMISSION_DOCUMENT_READ, - UMB_USER_PERMISSION_DOCUMENT_CREATE, - UMB_USER_PERMISSION_DOCUMENT_DELETE, + { + verb: 'Umb.Document.Read', + }, ], sections: [], languages: [], @@ -30,7 +25,7 @@ export const data: Array = [ name: 'Editors', icon: 'icon-tools', documentStartNode: { id: 'all-property-editors-document-id' }, - permissions: [UMB_USER_PERMISSION_DOCUMENT_CREATE, UMB_USER_PERMISSION_DOCUMENT_DELETE], + permissions: [], sections: [], languages: [], hasAccessToAllLanguages: true, @@ -43,7 +38,7 @@ export const data: Array = [ name: 'Sensitive data', icon: 'icon-lock', documentStartNode: { id: 'all-property-editors-document-id' }, - permissions: [UMB_USER_PERMISSION_DOCUMENT_CREATE, UMB_USER_PERMISSION_DOCUMENT_DELETE], + permissions: [], sections: [], languages: [], hasAccessToAllLanguages: true, @@ -56,7 +51,7 @@ export const data: Array = [ name: 'Translators', icon: 'icon-globe', documentStartNode: { id: 'all-property-editors-document-id' }, - permissions: [UMB_USER_PERMISSION_DOCUMENT_CREATE, UMB_USER_PERMISSION_DOCUMENT_DELETE], + permissions: [], sections: [], languages: [], hasAccessToAllLanguages: true, @@ -69,7 +64,7 @@ export const data: Array = [ name: 'Writers', icon: 'icon-edit', documentStartNode: { id: 'all-property-editors-document-id' }, - permissions: [UMB_USER_PERMISSION_DOCUMENT_CREATE, UMB_USER_PERMISSION_DOCUMENT_DELETE], + permissions: [], sections: [], languages: [], hasAccessToAllLanguages: true, From c89150ba0ceccf72ee3ed3f44948042a56def21e Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 20 Feb 2024 16:02:58 +0100 Subject: [PATCH 09/85] rename method --- .../entity-user-permission-settings-list.element.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts index e300852a5b..494b753cca 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts @@ -16,7 +16,7 @@ export class UmbEntityUserPermissionSettingsListElement extends UmbLitElement { public set entityType(value: string) { if (value === this._entityType) return; this._entityType = value; - this.#observeUserPermissions(); + this.#observeEntityUserPermissions(); } private _entityType: string = ''; @@ -32,12 +32,13 @@ export class UmbEntityUserPermissionSettingsListElement extends UmbLitElement { return this.selectedPermissions?.includes(permissionAlias); } - #observeUserPermissions() { + #observeEntityUserPermissions() { this.#manifestObserver?.destroy(); this.#manifestObserver = this.observe( umbExtensionsRegistry.byType('entityUserPermission'), (userPermissionManifests) => { + debugger; this._manifests = userPermissionManifests.filter((manifest) => manifest.meta.entityType === this.entityType); }, 'umbUserPermissionManifestsObserver', From 650fb8038d9d23451473a0b7b4d3f76e9042938c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 20 Feb 2024 16:04:16 +0100 Subject: [PATCH 10/85] update name --- .../workspace/user-group-workspace-editor.element.ts | 4 ++-- .../entity-user-permission-settings-list.element.ts | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts index e6dd436e2f..410d501914 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts @@ -12,7 +12,7 @@ import type { UmbInputSectionElement } from '@umbraco-cms/backoffice/components' import type { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; import type { UmbInputMediaElement } from '@umbraco-cms/backoffice/media'; -import './components/user-group-default-permission-list.element.js'; +import './components/user-group-entity-user-permission-list.element.js'; import './components/user-group-granular-permission-list.element.js'; @customElement('umb-user-group-workspace-editor') @@ -138,7 +138,7 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement {
- +
`; } From 53f6eb363a806a6903a2ea09a32ad8e874ef3330 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 20 Feb 2024 21:46:32 +0100 Subject: [PATCH 23/85] remove TBD from label --- .../documents/documents/entity-actions/permissions/manifests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/manifests.ts index 4342532571..f05c1a9de3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/manifests.ts @@ -11,7 +11,7 @@ const entityActions: Array = [ api: UmbDocumentPermissionsEntityAction, meta: { icon: 'icon-vcard', - label: 'Permissions (TBD)', + label: 'Permissions', repositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, entityTypes: [UMB_DOCUMENT_ENTITY_TYPE], }, From 473b2c42cdb936a6440850bfa3d871fef6f5a389 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 20 Feb 2024 21:46:41 +0100 Subject: [PATCH 24/85] pass entity type --- .../documents/entity-actions/permissions/permissions.action.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions.action.ts index 2c08ad502b..e464a2c999 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions.action.ts @@ -22,7 +22,7 @@ export class UmbDocumentPermissionsEntityAction extends UmbEntityActionBase Date: Wed, 21 Feb 2024 12:30:12 +0100 Subject: [PATCH 25/85] add $type to mock data --- .../mocks/data/user-group/user-group.data.ts | 66 ++++++++++--------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts index c42952dbcd..f1f6bd9eb6 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts @@ -9,21 +9,23 @@ export const data: Array = [ icon: 'icon-medal', documentStartNode: { id: 'all-property-editors-document-id' }, permissions: [ - { verb: 'Umb.Document.Read' }, - { verb: 'Umb.Document.Create' }, - { verb: 'Umb.Document.Update' }, - { verb: 'Umb.Document.Delete' }, - { verb: 'Umb.Document.CreateBlueprint' }, - { verb: 'Umb.Document.Notifications' }, - { verb: 'Umb.Document.Publish' }, - { verb: 'Umb.Document.Permissions' }, - { verb: 'Umb.Document.Unpublish' }, - { verb: 'Umb.Document.Copy' }, - { verb: 'Umb.Document.Move' }, - { verb: 'Umb.Document.Sort' }, - { verb: 'Umb.Document.CultureAndHostnames' }, - { verb: 'Umb.Document.PublicAccess' }, - { verb: 'Umb.Document.Rollback' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Read' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Create' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Update' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Delete' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.CreateBlueprint' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Notifications' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Publish' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Permissions' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Unpublish' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Copy' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Move' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Sort' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.CultureAndHostnames' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.PublicAccess' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Rollback' }, + + { $type: 'DocumentPermissionModel', verb: 'Umb.Document.Rollback', document: { id: '12345' } }, ], sections: [], languages: [], @@ -38,19 +40,19 @@ export const data: Array = [ icon: 'icon-tools', documentStartNode: { id: 'all-property-editors-document-id' }, permissions: [ - { verb: 'Umb.Document.Read' }, - { verb: 'Umb.Document.Create' }, - { verb: 'Umb.Document.Update' }, - { verb: 'Umb.Document.Delete' }, - { verb: 'Umb.Document.CreateBlueprint' }, - { verb: 'Umb.Document.Notifications' }, - { verb: 'Umb.Document.Publish' }, - { verb: 'Umb.Document.Unpublish' }, - { verb: 'Umb.Document.Copy' }, - { verb: 'Umb.Document.Move' }, - { verb: 'Umb.Document.Sort' }, - { verb: 'Umb.Document.PublicAccess' }, - { verb: 'Umb.Document.Rollback' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Read' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Create' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Update' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Delete' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.CreateBlueprint' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Notifications' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Publish' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Unpublish' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Copy' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Move' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Sort' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.PublicAccess' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Rollback' }, ], sections: [], languages: [], @@ -91,10 +93,10 @@ export const data: Array = [ icon: 'icon-edit', documentStartNode: { id: 'all-property-editors-document-id' }, permissions: [ - { verb: 'Umb.Document.Read' }, - { verb: 'Umb.Document.Create' }, - { verb: 'Umb.Document.Update' }, - { verb: 'Umb.Document.Notifications' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Read' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Create' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Update' }, + { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Notifications' }, ], sections: [], languages: [], From 0a3873ac76d8adef8f7f98274bbbbabbd4d28c20 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 21 Feb 2024 12:31:24 +0100 Subject: [PATCH 26/85] add schemaType to manifest + only pass values to permission extension that match their schema type --- .../core/extension-registry/models/index.ts | 4 +- .../models/user-granular-permission.model.ts | 8 +- .../documents/documents/components/index.ts | 1 - ...ut-document-granular-permission.element.ts | 110 ------------------ ...cument-granular-user-permission.element.ts | 28 +++++ .../documents/user-permissions/manifests.ts | 8 +- ...-group-granular-permission-list.element.ts | 45 ++++++- 7 files changed, 79 insertions(+), 125 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document-granular-permission/input-document-granular-permission.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts index 290093c562..b01f3efe3b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts @@ -33,7 +33,7 @@ import type { ManifestWorkspaceContext } from './workspace-context.model.js'; import type { ManifestWorkspaceFooterApp } from './workspace-footer-app.model.js'; import type { ManifestWorkspaceView } from './workspace-view.model.js'; import type { ManifestEntityUserPermission } from './user-permission.model.js'; -import type { ManifestUserGranularPermission } from './user-granular-permission.model.js'; +import type { ManifestGranularUserPermission } from './user-granular-permission.model.js'; import type { ManifestCollectionAction } from './collection-action.model.js'; import type { ManifestBase, @@ -127,5 +127,5 @@ export type ManifestTypes = | ManifestWorkspaceFooterApp | ManifestWorkspaceView | ManifestEntityUserPermission - | ManifestUserGranularPermission + | ManifestGranularUserPermission | ManifestBase; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-granular-permission.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-granular-permission.model.ts index fc6698a802..1bfbf6e455 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-granular-permission.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-granular-permission.model.ts @@ -1,10 +1,10 @@ import type { ManifestElement } from '@umbraco-cms/backoffice/extension-api'; -export interface ManifestUserGranularPermission extends ManifestElement { +export interface ManifestGranularUserPermission extends ManifestElement { type: 'userGranularPermission'; - meta: MetaUserGranularPermission; + meta: MetaGranularUserPermission; } -export interface MetaUserGranularPermission { - entityType: string; +export interface MetaGranularUserPermission { + schemaType: string; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/index.ts index b6945bba60..361ab007ce 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/index.ts @@ -1,3 +1,2 @@ export * from './input-document/input-document.element.js'; -export * from './input-document-granular-permission/input-document-granular-permission.element.js'; export * from './input-document-root-picker/input-document-root-picker.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document-granular-permission/input-document-granular-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document-granular-permission/input-document-granular-permission.element.ts deleted file mode 100644 index a34ff5248e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document-granular-permission/input-document-granular-permission.element.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { UmbDocumentItemRepository } from '../../repository/index.js'; -import type { UmbDocumentItemModel } from '../../repository/item/types.js'; -import type { PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; -import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; -import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; -import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; -import { UMB_MODAL_MANAGER_CONTEXT, UMB_DOCUMENT_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; -import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; -import { splitStringToArray } from '@umbraco-cms/backoffice/utils'; - -@customElement('umb-input-document-granular-permission') -export class UmbInputDocumentGranularPermissionElement extends FormControlMixin(UmbLitElement) { - private _selectedIds: Array = []; - public get selectedIds(): Array { - return this._selectedIds; - } - public set selectedIds(ids: Array) { - this._selectedIds = ids; - super.value = ids.join(','); - this.#observePickedDocuments(); - } - - @property() - public set value(idsString: string) { - if (idsString !== this._value) { - this.selectedIds = splitStringToArray(idsString); - } - } - - @state() - private _items?: Array; - - #documentItemRepository = new UmbDocumentItemRepository(this); - #modalContext?: UmbModalManagerContext; - #pickedItemsObserver?: UmbObserverController>; - - constructor() { - super(); - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => (this.#modalContext = instance)); - } - - protected firstUpdated(_changedProperties: PropertyValueMap | Map): void { - super.firstUpdated(_changedProperties); - this.#observePickedDocuments(); - } - - protected getFormElement() { - return undefined; - } - - async #observePickedDocuments() { - this.#pickedItemsObserver?.destroy(); - - const { asObservable } = await this.#documentItemRepository.requestItems(this._selectedIds); - this.#pickedItemsObserver = this.observe(asObservable(), (items) => (this._items = items)); - } - - #openDocumentPicker() { - // We send a shallow copy(good enough as its just an array of ids) of our this._selectedIds, as we don't want the modal to manipulate our data: - // TODO: Use value instead: - const modalContext = this.#modalContext?.open(UMB_DOCUMENT_PICKER_MODAL, { - value: { - selection: [...this._selectedIds], - }, - }); - - //modalContext?.onSubmit().then((value) => { - //this.#setSelection(selection); - //}); - } - - #setSelection(newSelection: Array) { - this.selectedIds = newSelection; - this.dispatchEvent(new UmbChangeEvent()); - } - - disconnectedCallback(): void { - super.disconnectedCallback(); - this.#pickedItemsObserver?.destroy(); - } - - render() { - return html` - ${this._items?.map((item) => this.#renderItem(item))} - Add - `; - } - - #renderItem(item: UmbDocumentItemModel) { - return html`
Render something here ${item.unique}
`; - } - - static styles = [ - css` - #add-button { - width: 100%; - } - `, - ]; -} - -export default UmbInputDocumentGranularPermissionElement; - -declare global { - interface HTMLElementTagNameMap { - 'umb-input-document-granular-permission': UmbInputDocumentGranularPermissionElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts new file mode 100644 index 0000000000..5a513b95b6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts @@ -0,0 +1,28 @@ +import type { UmbDocumentUserPermissionModel } from '../types.js'; +import { css, customElement, html, property } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; + +@customElement('umb-document-granular-user-permission') +export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { + @property({ type: Array, attribute: false }) + value: Array = []; + + render() { + return html`${this.value.map( + (permission) => html` +
${permission.$type}
+
${permission.document.id}
+ `, + )}`; + } + + static styles = [css``]; +} + +export default UmbDocumentGranularUserPermissionElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-document-granular-user-permission': UmbDocumentGranularUserPermissionElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts index 86bb6a16b2..1f97daa266 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts @@ -1,7 +1,7 @@ import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; import type { - ManifestUserGranularPermission, + ManifestGranularUserPermission, ManifestEntityUserPermission, } from '@umbraco-cms/backoffice/extension-registry'; @@ -195,14 +195,14 @@ const permissions: Array = [ }, ]; -export const granularPermissions: Array = [ +export const granularPermissions: Array = [ { type: 'userGranularPermission', alias: 'Umb.UserGranularPermission.Document', name: 'Document Granular User Permission', - element: () => import('./input-document-granular-permission/input-document-granular-permission.element.js'), + element: () => import('./document-granular-user-permission/document-granular-user-permission.element.js'), meta: { - entityType: UMB_DOCUMENT_ENTITY_TYPE, + schemaType: 'DocumentPermissionModel', }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts index 83170394d6..3a399088af 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts @@ -1,5 +1,7 @@ import { UMB_USER_GROUP_WORKSPACE_CONTEXT } from '../user-group-workspace.context.js'; -import type { UmbUserGroupDetailModel } from '../../types.js'; +import { createExtensionElement } from '@umbraco-cms/backoffice/extension-api'; +import type { ManifestGranularUserPermission } from '@umbraco-cms/backoffice/extension-registry'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -7,7 +9,7 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @customElement('umb-user-group-granular-permission-list') export class UmbUserGroupGranularPermissionListElement extends UmbLitElement { @state() - private _userGroup?: UmbUserGroupDetailModel; + _extensionElements: Array = []; #workspaceContext?: typeof UMB_USER_GROUP_WORKSPACE_CONTEXT.TYPE; @@ -16,12 +18,47 @@ export class UmbUserGroupGranularPermissionListElement extends UmbLitElement { this.consumeContext(UMB_USER_GROUP_WORKSPACE_CONTEXT, (instance) => { this.#workspaceContext = instance; - this.observe(this.#workspaceContext.data, (userGroup) => (this._userGroup = userGroup), 'umbUserGroupObserver'); + }); + + this.#observeExtensionRegistry(); + } + + #observeExtensionRegistry() { + this.observe(umbExtensionsRegistry.byType('userGranularPermission'), (manifests) => { + if (!manifests) { + this._extensionElements = []; + return; + } + + manifests.forEach(async (manifest) => this.#extensionElementSetup(manifest)); }); } + async #extensionElementSetup(manifest: ManifestGranularUserPermission) { + const element = (await createExtensionElement(manifest)) as any; + if (!element) throw new Error(`Failed to create extension element for manifest ${manifest.alias}`); + if (!this.#workspaceContext) throw new Error('User Group Workspace context is not available'); + + this.observe( + this.#workspaceContext.data, + (userGroup) => { + if (!userGroup) return; + + const schemaType = manifest.meta.schemaType; + const permissionsForSchemaType = + userGroup.permissions.filter((permission) => permission.$type === schemaType) || []; + + element.value = permissionsForSchemaType; + }, + 'umbUserGroupPermissionObserver', + ); + + this._extensionElements.push(element); + this.requestUpdate('_extensionElements'); + } + render() { - return html``; + return html`${this._extensionElements.map((element) => html`${element}`)}`; } static styles = [UmbTextStyles, css``]; From d7b851a3bdfbc2b092b77773155317a99d79e807 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 21 Feb 2024 15:20:15 +0100 Subject: [PATCH 27/85] use correct mock id --- .../src/mocks/data/user-group/user-group.data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts index f1f6bd9eb6..0fe4aab7bf 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts @@ -25,7 +25,7 @@ export const data: Array = [ { $type: 'GlobalPermissionModel', verb: 'Umb.Document.PublicAccess' }, { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Rollback' }, - { $type: 'DocumentPermissionModel', verb: 'Umb.Document.Rollback', document: { id: '12345' } }, + { $type: 'DocumentPermissionModel', verb: 'Umb.Document.Rollback', document: { id: 'simple-document-id' } }, ], sections: [], languages: [], From 57c7a73d3aac37f0b84b450efc604cc80b24bb50 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 21 Feb 2024 15:20:32 +0100 Subject: [PATCH 28/85] unique can be null if root is selected --- .../src/packages/core/event/deselected.event.ts | 4 ++-- .../src/packages/core/event/selected.event.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/event/deselected.event.ts b/src/Umbraco.Web.UI.Client/src/packages/core/event/deselected.event.ts index 0f2594503a..401db9833f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/event/deselected.event.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/event/deselected.event.ts @@ -1,8 +1,8 @@ export class UmbDeselectedEvent extends Event { public static readonly TYPE = 'deselected'; - public unique: string; + public unique: string | null; - public constructor(unique: string) { + public constructor(unique: string | null) { // mimics the native change event super(UmbDeselectedEvent.TYPE, { bubbles: true, composed: false, cancelable: false }); this.unique = unique; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/event/selected.event.ts b/src/Umbraco.Web.UI.Client/src/packages/core/event/selected.event.ts index e3ae853d01..14374a1769 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/event/selected.event.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/event/selected.event.ts @@ -1,8 +1,8 @@ export class UmbSelectedEvent extends Event { public static readonly TYPE = 'selected'; - public unique: string; + public unique: string | null; - public constructor(unique: string) { + public constructor(unique: string | null) { // mimics the native change event super(UmbSelectedEvent.TYPE, { bubbles: true, composed: false, cancelable: false }); this.unique = unique; From 7cc9f2690cce2815d4dbea94237749ab5bd86bbb Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 21 Feb 2024 15:20:44 +0100 Subject: [PATCH 29/85] add null check --- .../permissions/permissions-modal.element.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions-modal.element.ts index fb480097c9..eb7ab078bf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions-modal.element.ts @@ -99,9 +99,12 @@ export class UmbPermissionsModalElement extends UmbLitElement { this.#userGroupPickerModal = this.#modalManagerContext.open(UMB_USER_GROUP_PICKER_MODAL); - this.#userGroupPickerModal.addEventListener(UmbSelectedEvent.TYPE, (event) => - this.#openUserPermissionsModal((event as UmbSelectedEvent).unique), - ); + this.#userGroupPickerModal.addEventListener(UmbSelectedEvent.TYPE, (event) => { + const selectEvent = event as UmbSelectedEvent; + const unique = selectEvent.unique; + if (!unique) return; + this.#openUserPermissionsModal(unique); + }); } #openUserPermissionsModal(id: string) { From 2d7fc655fdd05806764c310b60586b3406d9e1a6 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 21 Feb 2024 15:21:35 +0100 Subject: [PATCH 30/85] dispatch select/deselect events from the selection manager --- .../src/shared/utils/selection-manager/selection.manager.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/shared/utils/selection-manager/selection.manager.ts b/src/Umbraco.Web.UI.Client/src/shared/utils/selection-manager/selection.manager.ts index 9451be884d..22c751aff2 100644 --- a/src/Umbraco.Web.UI.Client/src/shared/utils/selection-manager/selection.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/shared/utils/selection-manager/selection.manager.ts @@ -1,6 +1,6 @@ import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; +import { UmbDeselectedEvent, UmbSelectedEvent, UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; import { UmbArrayState, UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; /** @@ -105,6 +105,7 @@ export class UmbSelectionManager extends UmbBaseController { if (this.isSelected(unique)) return; const newSelection = this.getMultiple() ? [...this.getSelection(), unique] : [unique]; this.#selection.setValue(newSelection); + this.getHostElement().dispatchEvent(new UmbSelectedEvent(unique)); this.getHostElement().dispatchEvent(new UmbSelectionChangeEvent()); } @@ -117,6 +118,7 @@ export class UmbSelectionManager extends UmbBaseController { if (this.getSelectable() === false) return; const newSelection = this.getSelection().filter((x) => x !== unique); this.#selection.setValue(newSelection); + this.getHostElement().dispatchEvent(new UmbDeselectedEvent(unique)); this.getHostElement().dispatchEvent(new UmbSelectionChangeEvent()); } From b3bc0e406ab9c4efdeaed83a5ebe60050a840d72 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 21 Feb 2024 15:42:23 +0100 Subject: [PATCH 31/85] dispatch select events on modal context --- .../tree-picker/tree-picker-modal.element.ts | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/tree-picker/tree-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/tree-picker/tree-picker-modal.element.ts index badaa63ece..fbf2dd4a34 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/tree-picker/tree-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/tree-picker/tree-picker-modal.element.ts @@ -2,7 +2,7 @@ import { html, customElement, state, ifDefined } from '@umbraco-cms/backoffice/e import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbTreePickerModalData, UmbPickerModalValue } from '@umbraco-cms/backoffice/modal'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; -import { UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; +import { UmbDeselectedEvent, UmbSelectedEvent, UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; import type { UmbTreeElement, UmbTreeItemModelBase, UmbTreeSelectionConfiguration } from '@umbraco-cms/backoffice/tree'; @customElement('umb-tree-picker-modal') @@ -30,11 +30,21 @@ export class UmbTreePickerModalElement From fd986d6455717808a41cbeae3360ffe7d51dded5 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 21 Feb 2024 15:47:10 +0100 Subject: [PATCH 32/85] wip document granular permission element --- ...cument-granular-user-permission.element.ts | 104 ++++++++++++++++-- 1 file changed, 95 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts index 5a513b95b6..ee7eb03770 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts @@ -1,19 +1,105 @@ import type { UmbDocumentUserPermissionModel } from '../types.js'; -import { css, customElement, html, property } from '@umbraco-cms/backoffice/external/lit'; +import { UmbDocumentItemRepository, type UmbDocumentItemModel } from '../../repository/index.js'; +import { css, customElement, html, ifDefined, repeat, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; +import { UMB_DOCUMENT_PICKER_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; +import { UmbSelectedEvent } from '@umbraco-cms/backoffice/event'; @customElement('umb-document-granular-user-permission') export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { - @property({ type: Array, attribute: false }) - value: Array = []; + /* + public get value(): Array { + return this.#pickerContext.getSelection(); + } + */ + + public set value(value: Array) { + const uniques = value.map((item) => item.document.id); + this.#observePickedDocuments(uniques); + } + + @state() + private _items?: Array; + + #documentItemRepository = new UmbDocumentItemRepository(this); + #modalManagerContext?: UmbModalManagerContext; + + constructor() { + super(); + + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => (this.#modalManagerContext = instance)); + } + + async #observePickedDocuments(uniques: Array) { + const { asObservable } = await this.#documentItemRepository.requestItems(uniques); + this.observe(asObservable(), (items) => (this._items = items)); + } + + #openPicker() { + const modalContext = this.#modalManagerContext?.open(UMB_DOCUMENT_PICKER_MODAL, { + data: { + hideTreeRoot: true, + }, + }); + + modalContext?.addEventListener(UmbSelectedEvent.TYPE, (event) => { + const selectedEvent = event as UmbSelectedEvent; + const unique = selectedEvent.unique; + if (!unique) return; + console.log(unique); + }); + + modalContext?.onSubmit().then((value) => { + //this.#setSelection(selection); + }); + } render() { - return html`${this.value.map( - (permission) => html` -
${permission.$type}
-
${permission.document.id}
- `, - )}`; + return html`${this.#renderItems()} ${this.#renderAddButton()}`; + } + + #renderItems() { + if (!this._items) return; + return html` + ${repeat( + this._items, + (item) => item.unique, + (item) => this.#renderRef(item), + )} + `; + } + + #renderAddButton() { + return html``; + } + + // TODO: make umb-document-ref element + #renderRef(item: UmbDocumentItemModel) { + if (!item.unique) return; + // TODO: get correct variant name + const name = item.variants[0]?.name; + + return html` + + ${this.#renderIcon(item)} ${this.#renderIsTrashed(item)} + + + `; + } + + #renderIcon(item: UmbDocumentItemModel) { + if (!item.documentType.icon) return; + return html``; + } + + #renderIsTrashed(item: UmbDocumentItemModel) { + if (!item.isTrashed) return; + return html`Trashed`; } static styles = [css``]; From f99ded144ce41065d3d527f789183f745d0693dc Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 21 Feb 2024 15:48:15 +0100 Subject: [PATCH 33/85] set button to 100% width --- .../document-granular-user-permission.element.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts index ee7eb03770..d85222acd6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts @@ -102,7 +102,13 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { return html`Trashed`; } - static styles = [css``]; + static styles = [ + css` + #add-button { + width: 100%; + } + `, + ]; } export default UmbDocumentGranularUserPermissionElement; From 734fd706ea11e16dd27da975c66b27ff774d7c89 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 21 Feb 2024 16:13:01 +0100 Subject: [PATCH 34/85] generate new server models --- .../src/external/backend-api/src/index.ts | 5 ++--- .../src/models/CultureAndScheduleRequestModel.ts | 12 ------------ .../src/models/CurrentUserResponseModel.ts | 6 +++++- .../src/models/DocumentPermissionModel.ts | 2 +- ...PermissionModel.ts => FallbackPermissionModel.ts} | 4 ++-- .../src/models/PublishDocumentRequestModel.ts | 4 +--- .../PublishDocumentWithDescendantsRequestModel.ts | 9 +++++---- ...RequestModel.ts => UnknownTypePermissionModel.ts} | 6 +++--- .../backend-api/src/models/UserGroupBaseModel.ts | 5 +++-- .../backend-api/src/services/DocumentResource.ts | 2 +- 10 files changed, 23 insertions(+), 32 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CultureAndScheduleRequestModel.ts rename src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/{GlobalPermissionModel.ts => FallbackPermissionModel.ts} (67%) rename src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/{ScheduleRequestModel.ts => UnknownTypePermissionModel.ts} (56%) diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts index 1502cc2d3a..7609f9cc3c 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts @@ -76,7 +76,6 @@ export type { CreateTemplateRequestModel } from './models/CreateTemplateRequestM export type { CreateUserGroupRequestModel } from './models/CreateUserGroupRequestModel'; export type { CreateUserRequestModel } from './models/CreateUserRequestModel'; export type { CreateUserResponseModel } from './models/CreateUserResponseModel'; -export type { CultureAndScheduleRequestModel } from './models/CultureAndScheduleRequestModel'; export type { CultureReponseModel } from './models/CultureReponseModel'; export type { CurrentUserResponseModel } from './models/CurrentUserResponseModel'; export type { CurrenUserConfigurationResponseModel } from './models/CurrenUserConfigurationResponseModel'; @@ -142,6 +141,7 @@ export type { DynamicRootResponseModel } from './models/DynamicRootResponseModel export type { EnableTwoFactorRequestModel } from './models/EnableTwoFactorRequestModel'; export type { EnableUserRequestModel } from './models/EnableUserRequestModel'; export type { EntityTreeItemResponseModel } from './models/EntityTreeItemResponseModel'; +export type { FallbackPermissionModel } from './models/FallbackPermissionModel'; export type { FieldPresentationModel } from './models/FieldPresentationModel'; export type { FileSystemCreateRequestModelBaseModel } from './models/FileSystemCreateRequestModelBaseModel'; export type { FileSystemFileCreateRequestModelBaseModel } from './models/FileSystemFileCreateRequestModelBaseModel'; @@ -156,7 +156,6 @@ export type { FileSystemTreeItemPresentationModel } from './models/FileSystemTre export type { FolderModelBaseModel } from './models/FolderModelBaseModel'; export type { FolderResponseModel } from './models/FolderResponseModel'; export type { FolderTreeItemResponseModel } from './models/FolderTreeItemResponseModel'; -export type { GlobalPermissionModel } from './models/GlobalPermissionModel'; export type { HealthCheckActionRequestModel } from './models/HealthCheckActionRequestModel'; export type { HealthCheckGroupPresentationBaseModel } from './models/HealthCheckGroupPresentationBaseModel'; export type { HealthCheckGroupPresentationModel } from './models/HealthCheckGroupPresentationModel'; @@ -324,7 +323,6 @@ export { RuntimeModeModel } from './models/RuntimeModeModel'; export type { SavedLogSearchPresenationBaseModel } from './models/SavedLogSearchPresenationBaseModel'; export type { SavedLogSearchRequestModel } from './models/SavedLogSearchRequestModel'; export type { SavedLogSearchResponseModel } from './models/SavedLogSearchResponseModel'; -export type { ScheduleRequestModel } from './models/ScheduleRequestModel'; export type { ScriptFolderResponseModel } from './models/ScriptFolderResponseModel'; export type { ScriptItemResponseModel } from './models/ScriptItemResponseModel'; export type { ScriptResponseModel } from './models/ScriptResponseModel'; @@ -366,6 +364,7 @@ export type { TemplateResponseModel } from './models/TemplateResponseModel'; export type { TemporaryFileResponseModel } from './models/TemporaryFileResponseModel'; export type { TourStatusModel } from './models/TourStatusModel'; export type { TreeItemPresentationModel } from './models/TreeItemPresentationModel'; +export type { UnknownTypePermissionModel } from './models/UnknownTypePermissionModel'; export type { UnlockUsersRequestModel } from './models/UnlockUsersRequestModel'; export type { UnpublishDocumentRequestModel } from './models/UnpublishDocumentRequestModel'; export type { UpdateContentForDocumentRequestModel } from './models/UpdateContentForDocumentRequestModel'; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CultureAndScheduleRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CultureAndScheduleRequestModel.ts deleted file mode 100644 index 8ebf39abe3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CultureAndScheduleRequestModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ScheduleRequestModel } from './ScheduleRequestModel'; - -export type CultureAndScheduleRequestModel = { - culture?: string | null; - schedule?: ScheduleRequestModel | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts index 2da7f46b48..dfbfcb96e9 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts @@ -3,6 +3,10 @@ /* tslint:disable */ /* eslint-disable */ +import type { DocumentPermissionModel } from './DocumentPermissionModel'; +import type { FallbackPermissionModel } from './FallbackPermissionModel'; +import type { UnknownTypePermissionModel } from './UnknownTypePermissionModel'; + export type CurrentUserResponseModel = { id: string; email: string; @@ -14,6 +18,6 @@ export type CurrentUserResponseModel = { avatarUrls: Array; languages: Array; hasAccessToAllLanguages: boolean; - permissions: Array; + permissions: Array<(DocumentPermissionModel | FallbackPermissionModel | UnknownTypePermissionModel)>; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentPermissionModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentPermissionModel.ts index 8da09c07fa..481339207b 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentPermissionModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentPermissionModel.ts @@ -6,7 +6,7 @@ import type { ReferenceByIdModel } from './ReferenceByIdModel'; export type DocumentPermissionModel = { - verb: string; document: ReferenceByIdModel; + verbs: Array; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/GlobalPermissionModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FallbackPermissionModel.ts similarity index 67% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/GlobalPermissionModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FallbackPermissionModel.ts index 8652e351d2..a651e1f100 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/GlobalPermissionModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FallbackPermissionModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -export type GlobalPermissionModel = { - verb: string; +export type FallbackPermissionModel = { + verbs: Array; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentRequestModel.ts index 4c08971560..18355d089b 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentRequestModel.ts @@ -3,9 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -import type { CultureAndScheduleRequestModel } from './CultureAndScheduleRequestModel'; - export type PublishDocumentRequestModel = { - publishSchedules: Array; + cultures: Array; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentWithDescendantsRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentWithDescendantsRequestModel.ts index 9796f30e5a..270f4d9c43 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentWithDescendantsRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentWithDescendantsRequestModel.ts @@ -3,8 +3,9 @@ /* tslint:disable */ /* eslint-disable */ -export type PublishDocumentWithDescendantsRequestModel = { - includeUnpublishedDescendants: boolean; - cultures: Array; -}; +import type { PublishDocumentRequestModel } from './PublishDocumentRequestModel'; + +export type PublishDocumentWithDescendantsRequestModel = (PublishDocumentRequestModel & { + includeUnpublishedDescendants: boolean; +}); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScheduleRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnknownTypePermissionModel.ts similarity index 56% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScheduleRequestModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnknownTypePermissionModel.ts index 59b83b94a6..6a2d4b840d 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScheduleRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnknownTypePermissionModel.ts @@ -3,8 +3,8 @@ /* tslint:disable */ /* eslint-disable */ -export type ScheduleRequestModel = { - publishTime?: string | null; - unpublishTime?: string | null; +export type UnknownTypePermissionModel = { + verbs: Array; + context: string; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupBaseModel.ts index cfa8210378..234c546604 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupBaseModel.ts @@ -4,8 +4,9 @@ /* eslint-disable */ import type { DocumentPermissionModel } from './DocumentPermissionModel'; -import type { GlobalPermissionModel } from './GlobalPermissionModel'; +import type { FallbackPermissionModel } from './FallbackPermissionModel'; import type { ReferenceByIdModel } from './ReferenceByIdModel'; +import type { UnknownTypePermissionModel } from './UnknownTypePermissionModel'; export type UserGroupBaseModel = { name: string; @@ -17,6 +18,6 @@ export type UserGroupBaseModel = { documentRootAccess: boolean; mediaStartNode?: ReferenceByIdModel | null; mediaRootAccess: boolean; - permissions: Array<(DocumentPermissionModel | GlobalPermissionModel)>; + permissions: Array<(DocumentPermissionModel | FallbackPermissionModel | UnknownTypePermissionModel)>; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentResource.ts index 1453062de2..dab44ef423 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentResource.ts @@ -459,7 +459,7 @@ export class DocumentResource { requestBody, }: { id: string, - requestBody?: PublishDocumentRequestModel, + requestBody?: (PublishDocumentRequestModel | PublishDocumentWithDescendantsRequestModel), }): CancelablePromise { return __request(OpenAPI, { method: 'PUT', From 50e98a95f3072b485398ced156d98df7f637bd33 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 21 Feb 2024 16:28:17 +0100 Subject: [PATCH 35/85] verbs is an array --- .../mocks/data/user-group/user-group.data.ts | 68 +++++++++---------- .../models/user-permission.model.ts | 2 +- ...cument-granular-user-permission.element.ts | 22 ++++-- .../documents/user-permissions/manifests.ts | 30 ++++---- ...-group-granular-permission-list.element.ts | 1 + ...y-user-permission-settings-list.element.ts | 20 +++--- .../packages/user/user-permission/types.ts | 2 +- 7 files changed, 77 insertions(+), 68 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts index 0fe4aab7bf..d35b7fb000 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts @@ -9,23 +9,23 @@ export const data: Array = [ icon: 'icon-medal', documentStartNode: { id: 'all-property-editors-document-id' }, permissions: [ - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Read' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Create' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Update' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Delete' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.CreateBlueprint' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Notifications' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Publish' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Permissions' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Unpublish' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Copy' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Move' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Sort' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.CultureAndHostnames' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.PublicAccess' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Rollback' }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Read'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Create'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Update'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Delete'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.CreateBlueprint'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Notifications'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Publish'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Permissions'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Unpublish'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Copy'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Move'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Sort'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.CultureAndHostnames'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.PublicAccess'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Rollback'] }, - { $type: 'DocumentPermissionModel', verb: 'Umb.Document.Rollback', document: { id: 'simple-document-id' } }, + { $type: 'DocumentPermissionModel', verbs: ['Umb.Document.Rollback'], document: { id: 'simple-document-id' } }, ], sections: [], languages: [], @@ -40,19 +40,19 @@ export const data: Array = [ icon: 'icon-tools', documentStartNode: { id: 'all-property-editors-document-id' }, permissions: [ - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Read' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Create' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Update' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Delete' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.CreateBlueprint' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Notifications' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Publish' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Unpublish' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Copy' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Move' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Sort' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.PublicAccess' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Rollback' }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Read'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Create'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Update'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Delete'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.CreateBlueprint'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Notifications'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Publish'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Unpublish'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Copy'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Move'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Sort'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.PublicAccess'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Rollback'] }, ], sections: [], languages: [], @@ -79,7 +79,7 @@ export const data: Array = [ name: 'Translators', icon: 'icon-globe', documentStartNode: { id: 'all-property-editors-document-id' }, - permissions: [{ verb: 'Umb.Document.Read' }, { verb: 'Umb.Document.Update' }], + permissions: [{ verbs: ['Umb.Document.Read'] }, { verbs: ['Umb.Document.Update'] }], sections: [], languages: [], hasAccessToAllLanguages: true, @@ -93,10 +93,10 @@ export const data: Array = [ icon: 'icon-edit', documentStartNode: { id: 'all-property-editors-document-id' }, permissions: [ - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Read' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Create' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Update' }, - { $type: 'GlobalPermissionModel', verb: 'Umb.Document.Notifications' }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Read'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Create'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Update'] }, + { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Notifications'] }, ], sections: [], languages: [], diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts index 6b05b2eba7..e89ce82af6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts @@ -7,7 +7,7 @@ export interface ManifestEntityUserPermission extends ManifestBase { export interface MetaEntityUserPermission { entityType: string; - verb: string; + verbs: Array; label?: string; labelKey?: string; description?: string; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts index d85222acd6..c8291bfc33 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts @@ -1,20 +1,23 @@ import type { UmbDocumentUserPermissionModel } from '../types.js'; import { UmbDocumentItemRepository, type UmbDocumentItemModel } from '../../repository/index.js'; -import { css, customElement, html, ifDefined, repeat, state } from '@umbraco-cms/backoffice/external/lit'; +import { css, customElement, html, ifDefined, property, repeat, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; import { UMB_DOCUMENT_PICKER_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import { UmbSelectedEvent } from '@umbraco-cms/backoffice/event'; +import type { ManifestGranularUserPermission } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-document-granular-user-permission') export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { - /* - public get value(): Array { - return this.#pickerContext.getSelection(); - } - */ + @property({ type: Object, attribute: false }) + manifest?: ManifestGranularUserPermission; + _value: Array = []; + public get value(): Array { + return this._value; + } public set value(value: Array) { + this._value = value; const uniques = value.map((item) => item.document.id); this.#observePickedDocuments(uniques); } @@ -85,7 +88,7 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { const name = item.variants[0]?.name; return html` - + ${this.#renderIcon(item)} ${this.#renderIsTrashed(item)} @@ -102,6 +105,11 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { return html`Trashed`; } + #getPermissionVerbsForItem(item: UmbDocumentItemModel) { + const permission = this._value?.find((permission) => permission.document.id === item.unique); + return permission?.verbs; + } + static styles = [ css` #add-button { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts index 096684c82b..ded2423ace 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts @@ -29,7 +29,7 @@ const permissions: Array = [ name: 'Read Document User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, - verb: 'Umb.Document.Read', + verbs: ['Umb.Document.Read'], labelKey: 'actions_browse', descriptionKey: 'actionDescriptions_browse', }, @@ -40,7 +40,7 @@ const permissions: Array = [ name: 'Create Document Blueprint User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, - verb: 'Umb.Document.CreateBlueprint', + verbs: ['Umb.Document.CreateBlueprint'], labelKey: 'actions_createblueprint', descriptionKey: 'actionDescriptions_createblueprint', }, @@ -51,7 +51,7 @@ const permissions: Array = [ name: 'Delete Document User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, - verb: 'Umb.Document.Delete', + verbs: ['Umb.Document.Delete'], labelKey: 'actions_delete', descriptionKey: 'actionDescriptions_delete', }, @@ -62,7 +62,7 @@ const permissions: Array = [ name: 'Create Document User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, - verb: 'Umb.Document.Create', + verbs: ['Umb.Document.Create'], labelKey: 'actions_create', descriptionKey: 'actionDescriptions_create', }, @@ -73,7 +73,7 @@ const permissions: Array = [ name: 'Document Notifications User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, - verb: 'Umb.Document.Notifications', + verbs: ['Umb.Document.Notifications'], labelKey: 'actions_notify', descriptionKey: 'actionDescriptions_notify', }, @@ -84,7 +84,7 @@ const permissions: Array = [ name: 'Publish Document User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, - verb: 'Umb.Document.Publish', + verbs: ['Umb.Document.Publish'], labelKey: 'actions_publish', descriptionKey: 'actionDescriptions_publish', }, @@ -95,7 +95,7 @@ const permissions: Array = [ name: 'Document Permissions User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, - verb: 'Umb.Document.Permissions', + verbs: ['Umb.Document.Permissions'], labelKey: 'actions_setPermissions', descriptionKey: 'actionDescriptions_rights', }, @@ -106,7 +106,7 @@ const permissions: Array = [ name: 'Unpublish Document User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, - verb: 'Umb.Document.Unpublish', + verbs: ['Umb.Document.Unpublish'], labelKey: 'actions_unpublish', descriptionKey: 'actionDescriptions_unpublish', }, @@ -117,7 +117,7 @@ const permissions: Array = [ name: 'Update Document User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, - verb: 'Umb.Document.Update', + verbs: ['Umb.Document.Update'], labelKey: 'actions_update', descriptionKey: 'actionDescriptions_update', }, @@ -128,7 +128,7 @@ const permissions: Array = [ name: 'Copy Document User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, - verb: 'Umb.Document.Copy', + verbs: ['Umb.Document.Copy'], labelKey: 'actions_copy', descriptionKey: 'actionDescriptions_copy', group: 'structure', @@ -140,7 +140,7 @@ const permissions: Array = [ name: 'Move Document User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, - verb: 'Umb.Document.Move', + verbs: ['Umb.Document.Move'], labelKey: 'actions_move', descriptionKey: 'actionDescriptions_move', group: 'structure', @@ -152,7 +152,7 @@ const permissions: Array = [ name: 'Sort Document User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, - verb: 'Umb.Document.Sort', + verbs: ['Umb.Document.Sort'], labelKey: 'actions_sort', descriptionKey: 'actionDescriptions_sort', group: 'structure', @@ -164,7 +164,7 @@ const permissions: Array = [ name: 'Document Culture And Hostnames User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, - verb: 'Umb.Document.CultureAndHostnames', + verbs: ['Umb.Document.CultureAndHostnames'], labelKey: 'actions_assigndomain', descriptionKey: 'actionDescriptions_assignDomain', group: 'administration', @@ -176,7 +176,7 @@ const permissions: Array = [ name: 'Document Public Access User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, - verb: 'Umb.Document.PublicAccess', + verbs: ['Umb.Document.PublicAccess'], labelKey: 'actions_protect', descriptionKey: 'actionDescriptions_protect', group: 'administration', @@ -188,7 +188,7 @@ const permissions: Array = [ name: 'Document Rollback User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, - verb: 'Umb.Document.Rollback', + verbs: ['Umb.Document.Rollback'], labelKey: 'actions_rollback', descriptionKey: 'actionDescriptions_rollback', group: 'administration', diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts index 3a399088af..aea3ed7aca 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts @@ -48,6 +48,7 @@ export class UmbUserGroupGranularPermissionListElement extends UmbLitElement { const permissionsForSchemaType = userGroup.permissions.filter((permission) => permission.$type === schemaType) || []; + element.manifest = manifest; element.value = permissionsForSchemaType; }, 'umbUserGroupPermissionObserver', diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts index 4fc3e193aa..50e5334a7e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts @@ -29,8 +29,8 @@ export class UmbEntityUserPermissionSettingsListElement extends UmbLitElement { #manifestObserver?: UmbObserverController>; - #isAllowed(permissionVerb: string) { - const permission = { verb: permissionVerb }; + #isAllowed(permissionVerbs: Array) { + const permission = { verbs: permissionVerbs }; const permissionAsString = JSON.stringify(permission); return this.selectedPermissions?.map((p) => JSON.stringify(p)).includes(permissionAsString); } @@ -47,22 +47,22 @@ export class UmbEntityUserPermissionSettingsListElement extends UmbLitElement { ); } - #onChangeUserPermission(event: UmbChangeEvent, permissionVerb: string) { + #onChangeUserPermission(event: UmbChangeEvent, permissionVerbs: Array) { event.stopPropagation(); const target = event.target as UmbUserPermissionSettingElement; - target.allowed ? this.#addUserPermission(permissionVerb) : this.#removeUserPermission(permissionVerb); + target.allowed ? this.#addUserPermission(permissionVerbs) : this.#removeUserPermission(permissionVerbs); } - #addUserPermission(permissionVerb: string) { - const newUserPermission: UmbUserPermissionModel = { verb: permissionVerb }; + #addUserPermission(permissionVerbs: Array) { + const newUserPermission: UmbUserPermissionModel = { verbs: permissionVerbs }; this.selectedPermissions = [...this.selectedPermissions, newUserPermission]; this.dispatchEvent(new UmbSelectionChangeEvent()); } - #removeUserPermission(permissionVerb: string) { + #removeUserPermission(permissionVerbs: Array) { // We only want to remove the global permission and not any granular permissions with the same verb // because we don't know what models can be part of the array we will make a string comparison - const permission: UmbUserPermissionModel = { verb: permissionVerb }; + const permission: UmbUserPermissionModel = { verbs: permissionVerbs }; const permissionAsString = JSON.stringify(permission); this.selectedPermissions = this.selectedPermissions @@ -102,9 +102,9 @@ export class UmbEntityUserPermissionSettingsListElement extends UmbLitElement { description=${ifDefined( manifest.meta.descriptionKey ? this.localize.term(manifest.meta.descriptionKey) : manifest.meta.description, )} - ?allowed=${this.#isAllowed(manifest.meta.verb)} + ?allowed=${this.#isAllowed(manifest.meta.verbs)} @change=${(event: UmbChangeEvent) => - this.#onChangeUserPermission(event, manifest.meta.verb)}>
`; + this.#onChangeUserPermission(event, manifest.meta.verbs)}>`; } disconnectedCallback() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/types.ts index 27021c1da0..72afd351e5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/types.ts @@ -1,3 +1,3 @@ export interface UmbUserPermissionModel { - verb: string; + verbs: Array; } From 3cbdc1efb41bd1d9d66d6b13824ca43a310f0041 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 21 Feb 2024 16:32:32 +0100 Subject: [PATCH 36/85] use correct models --- .../mocks/data/user-group/user-group.db.ts | 7 +++++-- .../src/mocks/data/user-permission.data.ts | 21 +++++++------------ 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts index 5a2acd0bfa..7fbb109acc 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts @@ -6,7 +6,8 @@ import { data } from './user-group.data.js'; import type { CreateUserGroupRequestModel, DocumentPermissionModel, - GlobalPermissionModel, + FallbackPermissionModel, + UnknownTypePermissionModel, UserGroupItemResponseModel, UserGroupResponseModel, } from '@umbraco-cms/backoffice/external/backend-api'; @@ -26,7 +27,9 @@ export class UmbUserGroupMockDB extends UmbEntityMockDbBase { + getPermissions( + userGroupIds: string[], + ): Array { const permissions = this.data .filter((userGroup) => userGroupIds.includes(userGroup.id)) .map((userGroup) => (userGroup.permissions?.length ? userGroup.permissions : [])) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-permission.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-permission.data.ts index 794e4bec08..8309cd1187 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-permission.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-permission.data.ts @@ -1,25 +1,20 @@ import { UmbEntityData } from './entity.data.js'; +import type { + DocumentPermissionModel, + FallbackPermissionModel, + UnknownTypePermissionModel, +} from '@umbraco-cms/backoffice/external/backend-api'; -export interface UserPermissionModel { - id: string; - verb: string; -} - -export interface DocumentUserPermissionModel extends UserPermissionModel { - document?: { id: string }; -} - -export const data: Array = [ +export const data: Array = [ { - id: '408074bb-f776-485e-b85e-c2473e45663b', - verb: 'Umb.Document.Read', + verbs: ['Umb.Document.Read'], document: { id: 'simple-document-id', }, }, ]; -class UmbUserPermissionData extends UmbEntityData { +class UmbUserPermissionData extends UmbEntityData { constructor() { super(data); } From 2971a134a954bad40fbb6834c4d5f01fbe3267db Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 21 Feb 2024 16:33:13 +0100 Subject: [PATCH 37/85] delete unused --- .../src/mocks/data/user-permission.data.ts | 23 ------------------- 1 file changed, 23 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/mocks/data/user-permission.data.ts diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-permission.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-permission.data.ts deleted file mode 100644 index 8309cd1187..0000000000 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-permission.data.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { UmbEntityData } from './entity.data.js'; -import type { - DocumentPermissionModel, - FallbackPermissionModel, - UnknownTypePermissionModel, -} from '@umbraco-cms/backoffice/external/backend-api'; - -export const data: Array = [ - { - verbs: ['Umb.Document.Read'], - document: { - id: 'simple-document-id', - }, - }, -]; - -class UmbUserPermissionData extends UmbEntityData { - constructor() { - super(data); - } -} - -export const umbUserPermissionData = new UmbUserPermissionData(); From f2cfb4aca19526ff5c6f8c07422a2d3272f92ccb Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 21 Feb 2024 19:33:56 +0100 Subject: [PATCH 38/85] remove export --- src/Umbraco.Web.UI.Client/src/packages/media/media/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/index.ts index f2f41d5d5a..900c9ef3da 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/index.ts @@ -3,7 +3,6 @@ import './components/index.js'; export * from './repository/index.js'; export * from './workspace/index.js'; export * from './tracked-reference/index.js'; -export * from './user-permissions/index.js'; export * from './components/index.js'; export * from './entity.js'; From b409a530dc5a56fa27ba4867b37b953888130b90 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 21 Feb 2024 19:57:23 +0100 Subject: [PATCH 39/85] add $type to model --- .../src/packages/user/user-permission/types.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/types.ts index 72afd351e5..e84687e8bb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/types.ts @@ -1,3 +1,4 @@ export interface UmbUserPermissionModel { + $type: string; verbs: Array; } From d74953e6ae0f30c39e056b4cc71d75073a591fd0 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 21 Feb 2024 19:57:36 +0100 Subject: [PATCH 40/85] use new model name in $type --- .../mocks/data/user-group/user-group.data.ts | 69 ++++++++++--------- ...y-user-permission-settings-list.element.ts | 2 +- 2 files changed, 37 insertions(+), 34 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts index d35b7fb000..36f35d6784 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts @@ -9,21 +9,21 @@ export const data: Array = [ icon: 'icon-medal', documentStartNode: { id: 'all-property-editors-document-id' }, permissions: [ - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Read'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Create'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Update'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Delete'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.CreateBlueprint'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Notifications'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Publish'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Permissions'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Unpublish'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Copy'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Move'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Sort'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.CultureAndHostnames'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.PublicAccess'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Rollback'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Read'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Create'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Update'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Delete'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.CreateBlueprint'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Notifications'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Publish'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Permissions'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Unpublish'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Copy'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Move'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Sort'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.CultureAndHostnames'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.PublicAccess'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Rollback'] }, { $type: 'DocumentPermissionModel', verbs: ['Umb.Document.Rollback'], document: { id: 'simple-document-id' } }, ], @@ -40,19 +40,19 @@ export const data: Array = [ icon: 'icon-tools', documentStartNode: { id: 'all-property-editors-document-id' }, permissions: [ - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Read'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Create'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Update'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Delete'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.CreateBlueprint'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Notifications'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Publish'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Unpublish'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Copy'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Move'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Sort'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.PublicAccess'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Rollback'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Read'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Create'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Update'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Delete'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.CreateBlueprint'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Notifications'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Publish'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Unpublish'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Copy'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Move'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Sort'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.PublicAccess'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Rollback'] }, ], sections: [], languages: [], @@ -79,7 +79,10 @@ export const data: Array = [ name: 'Translators', icon: 'icon-globe', documentStartNode: { id: 'all-property-editors-document-id' }, - permissions: [{ verbs: ['Umb.Document.Read'] }, { verbs: ['Umb.Document.Update'] }], + permissions: [ + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Read'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Update'] }, + ], sections: [], languages: [], hasAccessToAllLanguages: true, @@ -93,10 +96,10 @@ export const data: Array = [ icon: 'icon-edit', documentStartNode: { id: 'all-property-editors-document-id' }, permissions: [ - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Read'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Create'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Update'] }, - { $type: 'GlobalPermissionModel', verbs: ['Umb.Document.Notifications'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Read'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Create'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Update'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Notifications'] }, ], sections: [], languages: [], diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts index 50e5334a7e..941cbcad1a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts @@ -30,7 +30,7 @@ export class UmbEntityUserPermissionSettingsListElement extends UmbLitElement { #manifestObserver?: UmbObserverController>; #isAllowed(permissionVerbs: Array) { - const permission = { verbs: permissionVerbs }; + const permission = { $type: 'FallbackPermissionModel', verbs: permissionVerbs }; const permissionAsString = JSON.stringify(permission); return this.selectedPermissions?.map((p) => JSON.stringify(p)).includes(permissionAsString); } From 9ce679b137a8fb83ef3362381bbc4221447fde48 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 21 Feb 2024 20:05:38 +0100 Subject: [PATCH 41/85] use duplicate instead of copy --- .../src/mocks/data/user-group/user-group.data.ts | 4 ++-- .../documents/documents/user-permissions/constants.ts | 2 +- .../documents/documents/user-permissions/manifests.ts | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts index 36f35d6784..f0d24f9c0a 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts @@ -18,7 +18,7 @@ export const data: Array = [ { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Publish'] }, { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Permissions'] }, { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Unpublish'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Copy'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Duplicate'] }, { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Move'] }, { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Sort'] }, { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.CultureAndHostnames'] }, @@ -48,7 +48,7 @@ export const data: Array = [ { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Notifications'] }, { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Publish'] }, { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Unpublish'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Copy'] }, + { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Duplicate'] }, { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Move'] }, { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Sort'] }, { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.PublicAccess'] }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/constants.ts index 7dd4b77160..b33399bf8f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/constants.ts @@ -8,7 +8,7 @@ export const UMB_USER_PERMISSION_DOCUMENT_PUBLISH = 'Umb.UserPermission.Document export const UMB_USER_PERMISSION_DOCUMENT_PERMISSIONS = 'Umb.UserPermission.Document.Permissions'; export const UMB_USER_PERMISSION_DOCUMENT_SEND_FOR_APPROVAL = 'Umb.UserPermission.Document.SendForApproval'; export const UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH = 'Umb.UserPermission.Document.Unpublish'; -export const UMB_USER_PERMISSION_DOCUMENT_COPY = 'Umb.UserPermission.Document.Copy'; +export const UMB_USER_PERMISSION_DOCUMENT_DUPLICATE = 'Umb.UserPermission.Document.Duplicate'; export const UMB_USER_PERMISSION_DOCUMENT_MOVE = 'Umb.UserPermission.Document.Move'; export const UMB_USER_PERMISSION_DOCUMENT_SORT = 'Umb.UserPermission.Document.Sort'; export const UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES = 'Umb.UserPermission.Document.CultureAndHostnames'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts index ded2423ace..a7cbb23f9d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts @@ -9,7 +9,7 @@ import { UMB_USER_PERMISSION_DOCUMENT_PERMISSIONS, UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH, UMB_USER_PERMISSION_DOCUMENT_UPDATE, - UMB_USER_PERMISSION_DOCUMENT_COPY, + UMB_USER_PERMISSION_DOCUMENT_DUPLICATE, UMB_USER_PERMISSION_DOCUMENT_MOVE, UMB_USER_PERMISSION_DOCUMENT_SORT, UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES, @@ -124,11 +124,11 @@ const permissions: Array = [ }, { type: 'entityUserPermission', - alias: UMB_USER_PERMISSION_DOCUMENT_COPY, - name: 'Copy Document User Permission', + alias: UMB_USER_PERMISSION_DOCUMENT_DUPLICATE, + name: 'Duplicate Document User Permission', meta: { entityType: UMB_DOCUMENT_ENTITY_TYPE, - verbs: ['Umb.Document.Copy'], + verbs: ['Umb.Document.Duplicate'], labelKey: 'actions_copy', descriptionKey: 'actionDescriptions_copy', group: 'structure', From 1090ed79c188c0c5855cefc75d1133c3af5553ec Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 21 Feb 2024 21:00:05 +0100 Subject: [PATCH 42/85] add entity type to document item model --- .../src/packages/documents/documents/repository/item/types.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/item/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/item/types.ts index 7de3100c2a..cb1daa099f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/item/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/item/types.ts @@ -1,6 +1,8 @@ +import type { UmbDocumentEntityType } from '../../entity.js'; import type { DocumentVariantStateModel } from '@umbraco-cms/backoffice/external/backend-api'; export interface UmbDocumentItemModel { + entityType: UmbDocumentEntityType; name: string; // TODO: this is not correct. We need to get it from the variants. This is a temp solution. unique: string; isTrashed: boolean; From 2ba0d5d6e1ed49cb0bc1fc0be32b7a138a10defb Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 22 Feb 2024 11:14:02 +0100 Subject: [PATCH 43/85] wip add and edit permissions for a document --- ...ty-user-permission-settings-modal.token.ts | 4 +- .../permissions/permissions-modal.element.ts | 2 +- .../item/document-item.server.data-source.ts | 2 + ...cument-granular-user-permission.element.ts | 85 ++++++++++++++++--- ...y-user-permission-settings-list.element.ts | 4 +- ...-user-permission-settings-modal.element.ts | 15 ++-- 6 files changed, 89 insertions(+), 23 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/entity-user-permission-settings-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/entity-user-permission-settings-modal.token.ts index bac358195d..b0e651c090 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/entity-user-permission-settings-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/entity-user-permission-settings-modal.token.ts @@ -3,12 +3,12 @@ import { UmbModalToken } from './modal-token.js'; export interface UmbEntityUserPermissionSettingsModalData { unique: string; entityType: string; - allowedPermissions: Array; + allowedVerbs: Array; headline?: string; } export type UmbEntityUserPermissionSettingsModalValue = { - allowedPermissions: Array; + allowedVerbs: Array; }; export const UMB_ENTITY_USER_PERMISSION_MODAL = new UmbModalToken< diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions-modal.element.ts index eb7ab078bf..7909d2c49d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions-modal.element.ts @@ -117,7 +117,7 @@ export class UmbPermissionsModalElement extends UmbLitElement { data: { unique: id, entityType: this.data.entityType, - allowedPermissions: userGroupRef?.permissions || [], + allowedVerbs: userGroupRef?.permissions || [], headline: `Permissions for ${userGroupRef?.name}`, }, }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/item/document-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/item/document-item.server.data-source.ts index 989fb63a77..5551bd4dd3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/item/document-item.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/item/document-item.server.data-source.ts @@ -1,3 +1,4 @@ +import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; import type { UmbDocumentItemModel } from './types.js'; import type { DocumentItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; @@ -32,6 +33,7 @@ const getItems = (uniques: Array) => DocumentResource.getItemDocument({ const mapper = (item: DocumentItemResponseModel): UmbDocumentItemModel => { return { + entityType: UMB_DOCUMENT_ENTITY_TYPE, unique: item.id, isTrashed: item.isTrashed, isProtected: item.isProtected, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts index c8291bfc33..98736f3dbe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts @@ -3,7 +3,11 @@ import { UmbDocumentItemRepository, type UmbDocumentItemModel } from '../../repo import { css, customElement, html, ifDefined, property, repeat, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; -import { UMB_DOCUMENT_PICKER_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; +import { + UMB_DOCUMENT_PICKER_MODAL, + UMB_ENTITY_USER_PERMISSION_MODAL, + UMB_MODAL_MANAGER_CONTEXT, +} from '@umbraco-cms/backoffice/modal'; import { UmbSelectedEvent } from '@umbraco-cms/backoffice/event'; import type { ManifestGranularUserPermission } from '@umbraco-cms/backoffice/extension-registry'; @@ -27,6 +31,8 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { #documentItemRepository = new UmbDocumentItemRepository(this); #modalManagerContext?: UmbModalManagerContext; + #documentPickerModalContext?: any; + #entityUserPermissionModalContext?: any; constructor() { super(); @@ -39,23 +45,69 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { this.observe(asObservable(), (items) => (this._items = items)); } - #openPicker() { - const modalContext = this.#modalManagerContext?.open(UMB_DOCUMENT_PICKER_MODAL, { + async #editGranularPermission(item: UmbDocumentItemModel) { + const currentPermissionVerbs = this.#getPermissionVerbsForItem(item); + const result = await this.#selectEntityUserPermissionsForDocument(item, currentPermissionVerbs); + debugger; + } + + #addGranularPermission() { + this.#documentPickerModalContext = this.#modalManagerContext?.open(UMB_DOCUMENT_PICKER_MODAL, { data: { hideTreeRoot: true, }, }); - modalContext?.addEventListener(UmbSelectedEvent.TYPE, (event) => { + this.#documentPickerModalContext?.addEventListener(UmbSelectedEvent.TYPE, async (event) => { const selectedEvent = event as UmbSelectedEvent; const unique = selectedEvent.unique; if (!unique) return; - console.log(unique); + + const documentItem = await this.#requestDocumentItem(unique); + const result = await this.#selectEntityUserPermissionsForDocument(documentItem); + this.#documentPickerModalContext?.reject(); + + const permissionItem: UmbDocumentUserPermissionModel = { + $type: 'DocumentPermissionModel', + document: { id: unique }, + verbs: [], + }; + + this._value = [...this._value, permissionItem]; + this.requestUpdate(); + }); + } + + async #requestDocumentItem(unique: string) { + if (!unique) throw new Error('Could not open permissions modal, no unique was provided'); + + const { data } = await this.#documentItemRepository.requestItems([unique]); + + const documentItem = data?.[0]; + if (!documentItem) throw new Error('No document item found'); + return documentItem; + } + + async #selectEntityUserPermissionsForDocument(item: UmbDocumentItemModel, allowedVerbs: Array = []) { + // TODO: get correct variant name + const name = item.variants[0]?.name; + const headline = name ? `Permissions for ${name}` : 'Permissions'; + + this.#entityUserPermissionModalContext = this.#modalManagerContext?.open(UMB_ENTITY_USER_PERMISSION_MODAL, { + data: { + unique: item.unique, + entityType: item.entityType, + allowedVerbs, + headline, + }, }); - modalContext?.onSubmit().then((value) => { - //this.#setSelection(selection); - }); + try { + const value = await this.#entityUserPermissionModalContext?.onSubmit(); + return value?.allowedVerbs; + } catch (error) { + return []; + } } render() { @@ -77,7 +129,7 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { return html``; } @@ -90,7 +142,7 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { return html` ${this.#renderIcon(item)} ${this.#renderIsTrashed(item)} - + ${this.#renderEditButton(item)} `; } @@ -105,6 +157,19 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { return html`Trashed`; } + #renderEditButton(item: UmbDocumentItemModel) { + // TODO: get correct variant name + const name = item.variants[0]?.name; + + return html` + this.#editGranularPermission(item)} + label="${this.localize.term('general_edit')} ${name}" + >${this.localize.term('general_edit')} + `; + } + #getPermissionVerbsForItem(item: UmbDocumentItemModel) { const permission = this._value?.find((permission) => permission.document.id === item.unique); return permission?.verbs; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts index 941cbcad1a..2a9421b269 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts @@ -54,7 +54,7 @@ export class UmbEntityUserPermissionSettingsListElement extends UmbLitElement { } #addUserPermission(permissionVerbs: Array) { - const newUserPermission: UmbUserPermissionModel = { verbs: permissionVerbs }; + const newUserPermission: UmbUserPermissionModel = { $type: 'FallbackPermissionModel', verbs: permissionVerbs }; this.selectedPermissions = [...this.selectedPermissions, newUserPermission]; this.dispatchEvent(new UmbSelectionChangeEvent()); } @@ -62,7 +62,7 @@ export class UmbEntityUserPermissionSettingsListElement extends UmbLitElement { #removeUserPermission(permissionVerbs: Array) { // We only want to remove the global permission and not any granular permissions with the same verb // because we don't know what models can be part of the array we will make a string comparison - const permission: UmbUserPermissionModel = { verbs: permissionVerbs }; + const permission: UmbUserPermissionModel = { $type: 'FallbackPermissionModel', verbs: permissionVerbs }; const permissionAsString = JSON.stringify(permission); this.selectedPermissions = this.selectedPermissions diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts index 0eb6f69665..64d4f00693 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts @@ -2,10 +2,9 @@ import { html, customElement, css, nothing, state } from '@umbraco-cms/backoffic import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbEntityUserPermissionSettingsModalData, - UmbEntityUserPermissionSettingsModalValue} from '@umbraco-cms/backoffice/modal'; -import { - UmbModalBaseElement, + UmbEntityUserPermissionSettingsModalValue, } from '@umbraco-cms/backoffice/modal'; +import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import type { UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; @customElement('umb-entity-user-permission-settings-modal') @@ -16,7 +15,7 @@ export class UmbEntityUserPermissionSettingsModalElement extends UmbModalBaseEle set data(data: UmbEntityUserPermissionSettingsModalData | undefined) { super.data = data; this._entityType = data?.entityType; - this._allowedPermissions = data?.allowedPermissions ?? []; + this._allowedVerbs = data?.allowedVerbs ?? []; this._headline = data?.headline ?? this._headline; } @@ -27,16 +26,16 @@ export class UmbEntityUserPermissionSettingsModalElement extends UmbModalBaseEle _entityType?: string; @state() - _allowedPermissions: Array = []; + _allowedVerbs: Array = []; private _handleConfirm() { - this.value = { allowedPermissions: this._allowedPermissions }; + this.value = { allowedVerbs: this._allowedVerbs }; this.modalContext?.submit(); } #onSelectedUserPermission(event: UmbSelectionChangeEvent) { const target = event.target as any; - this._allowedPermissions = target.selectedPermissions; + this._allowedVerbs = target.selectedPermissions; } render() { @@ -46,7 +45,7 @@ export class UmbEntityUserPermissionSettingsModalElement extends UmbModalBaseEle ${this._entityType ? html` ` : nothing} From 077267a398e33ae07d73992e4485767b754b0326 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 22 Feb 2024 11:23:29 +0100 Subject: [PATCH 44/85] prevent selected the same document --- .../document-granular-user-permission.element.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts index 98736f3dbe..60950e3fb0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts @@ -10,6 +10,7 @@ import { } from '@umbraco-cms/backoffice/modal'; import { UmbSelectedEvent } from '@umbraco-cms/backoffice/event'; import type { ManifestGranularUserPermission } from '@umbraco-cms/backoffice/extension-registry'; +import { UmbDocumentTreeItemModel } from '../../tree/types.js'; @customElement('umb-document-granular-user-permission') export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { @@ -55,6 +56,10 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { this.#documentPickerModalContext = this.#modalManagerContext?.open(UMB_DOCUMENT_PICKER_MODAL, { data: { hideTreeRoot: true, + // prevent already selected items to be picked again + // TODO: this type is wrong. It should be the tree item type + pickableFilter: (treeItem: UmbDocumentItemModel) => + !this._items?.map((i) => i.unique).includes(treeItem.unique), }, }); From baf51dc783acb4f6b42ecdc3a98d4f1c576d5ca9 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 22 Feb 2024 13:19:17 +0100 Subject: [PATCH 45/85] pass allowed verbs instead of full permission --- ...ty-user-permission-settings-modal.token.ts | 1 - ...cument-granular-user-permission.element.ts | 28 +++++++++++++------ ...y-user-permission-settings-list.element.ts | 21 ++++---------- ...-user-permission-settings-modal.element.ts | 15 ++-------- 4 files changed, 28 insertions(+), 37 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/entity-user-permission-settings-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/entity-user-permission-settings-modal.token.ts index b0e651c090..50bc5515ad 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/entity-user-permission-settings-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/entity-user-permission-settings-modal.token.ts @@ -3,7 +3,6 @@ import { UmbModalToken } from './modal-token.js'; export interface UmbEntityUserPermissionSettingsModalData { unique: string; entityType: string; - allowedVerbs: Array; headline?: string; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts index 60950e3fb0..073801f059 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts @@ -10,7 +10,6 @@ import { } from '@umbraco-cms/backoffice/modal'; import { UmbSelectedEvent } from '@umbraco-cms/backoffice/event'; import type { ManifestGranularUserPermission } from '@umbraco-cms/backoffice/extension-registry'; -import { UmbDocumentTreeItemModel } from '../../tree/types.js'; @customElement('umb-document-granular-user-permission') export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { @@ -47,9 +46,19 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { } async #editGranularPermission(item: UmbDocumentItemModel) { - const currentPermissionVerbs = this.#getPermissionVerbsForItem(item); + const currentPermissionVerbs = this.#getPermissionForDocument(item.unique)?.verbs ?? []; const result = await this.#selectEntityUserPermissionsForDocument(item, currentPermissionVerbs); - debugger; + + // update permission with new verbs + this.value = this._value.map((permission) => { + if (permission.document.id === item.unique) { + return { + ...permission, + verbs: result, + }; + } + return permission; + }); } #addGranularPermission() { @@ -102,9 +111,11 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { data: { unique: item.unique, entityType: item.entityType, - allowedVerbs, headline, }, + value: { + allowedVerbs, + }, }); try { @@ -135,7 +146,7 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { id="add-button" look="placeholder" @click=${this.#addGranularPermission} - label=${this.localize.term('general_choose')}>`; + label=${this.localize.term('general_add')}>`; } // TODO: make umb-document-ref element @@ -145,7 +156,7 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { const name = item.variants[0]?.name; return html` - + ${this.#renderIcon(item)} ${this.#renderIsTrashed(item)} ${this.#renderEditButton(item)} @@ -175,9 +186,8 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { `; } - #getPermissionVerbsForItem(item: UmbDocumentItemModel) { - const permission = this._value?.find((permission) => permission.document.id === item.unique); - return permission?.verbs; + #getPermissionForDocument(unique: string) { + return this._value?.find((permission) => permission.document.id === unique); } static styles = [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts index 2a9421b269..a04d929bc2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts @@ -22,7 +22,7 @@ export class UmbEntityUserPermissionSettingsListElement extends UmbLitElement { private _entityType: string = ''; @property({ attribute: false }) - selectedPermissions: Array = []; + allowedVerbs: Array = []; @state() private _manifests: Array = []; @@ -30,9 +30,7 @@ export class UmbEntityUserPermissionSettingsListElement extends UmbLitElement { #manifestObserver?: UmbObserverController>; #isAllowed(permissionVerbs: Array) { - const permission = { $type: 'FallbackPermissionModel', verbs: permissionVerbs }; - const permissionAsString = JSON.stringify(permission); - return this.selectedPermissions?.map((p) => JSON.stringify(p)).includes(permissionAsString); + return permissionVerbs.some((verb) => this.allowedVerbs.includes(verb)); } #observeEntityUserPermissions() { @@ -54,21 +52,14 @@ export class UmbEntityUserPermissionSettingsListElement extends UmbLitElement { } #addUserPermission(permissionVerbs: Array) { - const newUserPermission: UmbUserPermissionModel = { $type: 'FallbackPermissionModel', verbs: permissionVerbs }; - this.selectedPermissions = [...this.selectedPermissions, newUserPermission]; + const verbs = [...this.allowedVerbs, ...permissionVerbs]; + // ensure we only have unique verbs + this.allowedVerbs = [...new Set(verbs)]; this.dispatchEvent(new UmbSelectionChangeEvent()); } #removeUserPermission(permissionVerbs: Array) { - // We only want to remove the global permission and not any granular permissions with the same verb - // because we don't know what models can be part of the array we will make a string comparison - const permission: UmbUserPermissionModel = { $type: 'FallbackPermissionModel', verbs: permissionVerbs }; - const permissionAsString = JSON.stringify(permission); - - this.selectedPermissions = this.selectedPermissions - .map((p) => JSON.stringify(p)) - .filter((p) => p !== permissionAsString) - .map((p) => JSON.parse(p)); + this.allowedVerbs = this.allowedVerbs.filter((p) => !permissionVerbs.includes(p)); this.dispatchEvent(new UmbSelectionChangeEvent()); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts index 64d4f00693..7b7e1f9bdf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts @@ -15,7 +15,6 @@ export class UmbEntityUserPermissionSettingsModalElement extends UmbModalBaseEle set data(data: UmbEntityUserPermissionSettingsModalData | undefined) { super.data = data; this._entityType = data?.entityType; - this._allowedVerbs = data?.allowedVerbs ?? []; this._headline = data?.headline ?? this._headline; } @@ -25,17 +24,9 @@ export class UmbEntityUserPermissionSettingsModalElement extends UmbModalBaseEle @state() _entityType?: string; - @state() - _allowedVerbs: Array = []; - - private _handleConfirm() { - this.value = { allowedVerbs: this._allowedVerbs }; - this.modalContext?.submit(); - } - #onSelectedUserPermission(event: UmbSelectionChangeEvent) { const target = event.target as any; - this._allowedVerbs = target.selectedPermissions; + this.updateValue({ allowedVerbs: target.allowedVerbs }); } render() { @@ -45,7 +36,7 @@ export class UmbEntityUserPermissionSettingsModalElement extends UmbModalBaseEle ${this._entityType ? html` ` : nothing} @@ -57,7 +48,7 @@ export class UmbEntityUserPermissionSettingsModalElement extends UmbModalBaseEle color="positive" look="primary" label="Confirm" - @click=${this._handleConfirm}> + @click=${this._submitModal}> `; } From 7a1976323178d09b0d16b5fa12e00d951667477b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 22 Feb 2024 13:58:03 +0100 Subject: [PATCH 46/85] remove manifest --- .../components/user-group-granular-permission-list.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts index aea3ed7aca..c268d427bc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts @@ -1,3 +1,4 @@ +import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; import { UMB_USER_GROUP_WORKSPACE_CONTEXT } from '../user-group-workspace.context.js'; import { createExtensionElement } from '@umbraco-cms/backoffice/extension-api'; import type { ManifestGranularUserPermission } from '@umbraco-cms/backoffice/extension-registry'; @@ -48,7 +49,6 @@ export class UmbUserGroupGranularPermissionListElement extends UmbLitElement { const permissionsForSchemaType = userGroup.permissions.filter((permission) => permission.$type === schemaType) || []; - element.manifest = manifest; element.value = permissionsForSchemaType; }, 'umbUserGroupPermissionObserver', From 8f3103112d3a144f5ffc16b6087ebc4441b48ffb Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 22 Feb 2024 13:58:19 +0100 Subject: [PATCH 47/85] render permission names --- ...cument-granular-user-permission.element.ts | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts index 073801f059..58a278f03e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts @@ -1,6 +1,6 @@ import type { UmbDocumentUserPermissionModel } from '../types.js'; import { UmbDocumentItemRepository, type UmbDocumentItemModel } from '../../repository/index.js'; -import { css, customElement, html, ifDefined, property, repeat, state } from '@umbraco-cms/backoffice/external/lit'; +import { css, customElement, html, ifDefined, repeat, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; import { @@ -9,13 +9,11 @@ import { UMB_MODAL_MANAGER_CONTEXT, } from '@umbraco-cms/backoffice/modal'; import { UmbSelectedEvent } from '@umbraco-cms/backoffice/event'; -import type { ManifestGranularUserPermission } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestEntityUserPermission } from '@umbraco-cms/backoffice/extension-registry'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-document-granular-user-permission') export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { - @property({ type: Object, attribute: false }) - manifest?: ManifestGranularUserPermission; - _value: Array = []; public get value(): Array { return this._value; @@ -154,9 +152,10 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { if (!item.unique) return; // TODO: get correct variant name const name = item.variants[0]?.name; + const permissionNames = this.#getPermissionNamesForDocument(item.unique); return html` - + ${this.#renderIcon(item)} ${this.#renderIsTrashed(item)} ${this.#renderEditButton(item)} @@ -190,6 +189,26 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { return this._value?.find((permission) => permission.document.id === unique); } + #getPermissionNamesForDocument(unique: string) { + const permission = this.#getPermissionForDocument(unique); + if (!permission) return; + + return umbExtensionsRegistry + .getAllExtensions() + .filter((manifest) => manifest.type === 'entityUserPermission') + .filter((manifest) => manifest.meta.verbs.every((verb) => permission.verbs.includes(verb))) + .map((manifest) => { + if (manifest.meta.labelKey) { + return this.localize.term(manifest.meta.labelKey); + } else if (manifest.meta.label) { + return manifest.meta.label; + } else { + return manifest.name; + } + }) + .join(', '); + } + static styles = [ css` #add-button { From dc4940f0c1fca64871a40f1ecf504cca505cb3d7 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 22 Feb 2024 13:59:08 +0100 Subject: [PATCH 48/85] remove unused --- .../components/user-group-granular-permission-list.element.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts index c268d427bc..3a399088af 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts @@ -1,4 +1,3 @@ -import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; import { UMB_USER_GROUP_WORKSPACE_CONTEXT } from '../user-group-workspace.context.js'; import { createExtensionElement } from '@umbraco-cms/backoffice/extension-api'; import type { ManifestGranularUserPermission } from '@umbraco-cms/backoffice/extension-registry'; From 600acf53084ba5174863d8372e01eebe6f96460f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 22 Feb 2024 14:18:02 +0100 Subject: [PATCH 49/85] check that the full array is present --- .../entity-user-permission-settings-list.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts index a04d929bc2..8e9edb7c45 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts @@ -30,7 +30,7 @@ export class UmbEntityUserPermissionSettingsListElement extends UmbLitElement { #manifestObserver?: UmbObserverController>; #isAllowed(permissionVerbs: Array) { - return permissionVerbs.some((verb) => this.allowedVerbs.includes(verb)); + return permissionVerbs.every((verb) => this.allowedVerbs.includes(verb)); } #observeEntityUserPermissions() { From 4f34143db2a2f923f5e9d16ca93d51090be153a5 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 22 Feb 2024 14:21:28 +0100 Subject: [PATCH 50/85] generate new server models --- .../src/external/backend-api/src/index.ts | 8 +++++--- .../ContentTypeForDocumentTypeResponseModel.ts | 2 ++ .../models/ContentTypeForMediaTypeResponseModel.ts | 2 ++ .../models/ContentTypeForMemberTypeResponseModel.ts | 2 ++ .../ContentTypeReferenceResponseModelBaseModel.ts | 4 +++- .../CreateContentTypeForDocumentTypeRequestModel.ts | 1 + .../CreateContentTypeForMediaTypeRequestModel.ts | 1 + .../CreateContentTypeForMemberTypeRequestModel.ts | 2 ++ .../src/models/CreateMediaTypeRequestModel.ts | 2 ++ .../src/models/CultureAndScheduleRequestModel.ts | 12 ++++++++++++ .../src/models/CurrentUserResponseModel.ts | 8 ++++---- ...del.ts => DocumentPermissionPresentationModel.ts} | 3 ++- ...del.ts => FallbackPermissionPresentationModel.ts} | 3 ++- .../src/models/PublishDocumentRequestModel.ts | 4 +++- .../PublishDocumentWithDescendantsRequestModel.ts | 7 +++---- .../backend-api/src/models/ScheduleRequestModel.ts | 10 ++++++++++ ....ts => UnknownTypePermissionPresentationModel.ts} | 3 ++- .../UpdateContentTypeForDocumentTypeRequestModel.ts | 2 ++ .../UpdateContentTypeForMediaTypeRequestModel.ts | 2 ++ .../UpdateContentTypeForMemberTypeRequestModel.ts | 2 ++ .../backend-api/src/models/UserGroupBaseModel.ts | 8 ++++---- .../backend-api/src/services/DocumentResource.ts | 2 +- 22 files changed, 69 insertions(+), 21 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CultureAndScheduleRequestModel.ts rename src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/{DocumentPermissionModel.ts => DocumentPermissionPresentationModel.ts} (78%) rename src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/{FallbackPermissionModel.ts => FallbackPermissionPresentationModel.ts} (69%) create mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScheduleRequestModel.ts rename src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/{UnknownTypePermissionModel.ts => UnknownTypePermissionPresentationModel.ts} (71%) diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts index 7609f9cc3c..59dc00896d 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts @@ -76,6 +76,7 @@ export type { CreateTemplateRequestModel } from './models/CreateTemplateRequestM export type { CreateUserGroupRequestModel } from './models/CreateUserGroupRequestModel'; export type { CreateUserRequestModel } from './models/CreateUserRequestModel'; export type { CreateUserResponseModel } from './models/CreateUserResponseModel'; +export type { CultureAndScheduleRequestModel } from './models/CultureAndScheduleRequestModel'; export type { CultureReponseModel } from './models/CultureReponseModel'; export type { CurrentUserResponseModel } from './models/CurrentUserResponseModel'; export type { CurrenUserConfigurationResponseModel } from './models/CurrenUserConfigurationResponseModel'; @@ -106,7 +107,7 @@ export type { DocumentCollectionResponseModel } from './models/DocumentCollectio export type { DocumentConfigurationResponseModel } from './models/DocumentConfigurationResponseModel'; export type { DocumentItemResponseModel } from './models/DocumentItemResponseModel'; export type { DocumentNotificationResponseModel } from './models/DocumentNotificationResponseModel'; -export type { DocumentPermissionModel } from './models/DocumentPermissionModel'; +export type { DocumentPermissionPresentationModel } from './models/DocumentPermissionPresentationModel'; export type { DocumentRecycleBinItemResponseModel } from './models/DocumentRecycleBinItemResponseModel'; export type { DocumentResponseModel } from './models/DocumentResponseModel'; export type { DocumentTreeItemResponseModel } from './models/DocumentTreeItemResponseModel'; @@ -141,7 +142,7 @@ export type { DynamicRootResponseModel } from './models/DynamicRootResponseModel export type { EnableTwoFactorRequestModel } from './models/EnableTwoFactorRequestModel'; export type { EnableUserRequestModel } from './models/EnableUserRequestModel'; export type { EntityTreeItemResponseModel } from './models/EntityTreeItemResponseModel'; -export type { FallbackPermissionModel } from './models/FallbackPermissionModel'; +export type { FallbackPermissionPresentationModel } from './models/FallbackPermissionPresentationModel'; export type { FieldPresentationModel } from './models/FieldPresentationModel'; export type { FileSystemCreateRequestModelBaseModel } from './models/FileSystemCreateRequestModelBaseModel'; export type { FileSystemFileCreateRequestModelBaseModel } from './models/FileSystemFileCreateRequestModelBaseModel'; @@ -323,6 +324,7 @@ export { RuntimeModeModel } from './models/RuntimeModeModel'; export type { SavedLogSearchPresenationBaseModel } from './models/SavedLogSearchPresenationBaseModel'; export type { SavedLogSearchRequestModel } from './models/SavedLogSearchRequestModel'; export type { SavedLogSearchResponseModel } from './models/SavedLogSearchResponseModel'; +export type { ScheduleRequestModel } from './models/ScheduleRequestModel'; export type { ScriptFolderResponseModel } from './models/ScriptFolderResponseModel'; export type { ScriptItemResponseModel } from './models/ScriptItemResponseModel'; export type { ScriptResponseModel } from './models/ScriptResponseModel'; @@ -364,7 +366,7 @@ export type { TemplateResponseModel } from './models/TemplateResponseModel'; export type { TemporaryFileResponseModel } from './models/TemporaryFileResponseModel'; export type { TourStatusModel } from './models/TourStatusModel'; export type { TreeItemPresentationModel } from './models/TreeItemPresentationModel'; -export type { UnknownTypePermissionModel } from './models/UnknownTypePermissionModel'; +export type { UnknownTypePermissionPresentationModel } from './models/UnknownTypePermissionPresentationModel'; export type { UnlockUsersRequestModel } from './models/UnlockUsersRequestModel'; export type { UnpublishDocumentRequestModel } from './models/UnpublishDocumentRequestModel'; export type { UpdateContentForDocumentRequestModel } from './models/UpdateContentForDocumentRequestModel'; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForDocumentTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForDocumentTypeResponseModel.ts index f5b3816589..b89c790244 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForDocumentTypeResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForDocumentTypeResponseModel.ts @@ -5,6 +5,7 @@ import type { DocumentTypePropertyTypeContainerResponseModel } from './DocumentTypePropertyTypeContainerResponseModel'; import type { DocumentTypePropertyTypeResponseModel } from './DocumentTypePropertyTypeResponseModel'; +import type { ReferenceByIdModel } from './ReferenceByIdModel'; export type ContentTypeForDocumentTypeResponseModel = { alias: string; @@ -14,6 +15,7 @@ export type ContentTypeForDocumentTypeResponseModel = { allowedAsRoot: boolean; variesByCulture: boolean; variesBySegment: boolean; + collection?: ReferenceByIdModel | null; isElement: boolean; properties: Array; containers: Array; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForMediaTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForMediaTypeResponseModel.ts index 457df240bc..16d6ad3480 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForMediaTypeResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForMediaTypeResponseModel.ts @@ -5,6 +5,7 @@ import type { MediaTypePropertyTypeContainerResponseModel } from './MediaTypePropertyTypeContainerResponseModel'; import type { MediaTypePropertyTypeResponseModel } from './MediaTypePropertyTypeResponseModel'; +import type { ReferenceByIdModel } from './ReferenceByIdModel'; export type ContentTypeForMediaTypeResponseModel = { alias: string; @@ -14,6 +15,7 @@ export type ContentTypeForMediaTypeResponseModel = { allowedAsRoot: boolean; variesByCulture: boolean; variesBySegment: boolean; + collection?: ReferenceByIdModel | null; isElement: boolean; properties: Array; containers: Array; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForMemberTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForMemberTypeResponseModel.ts index c8223ec647..cb0ad99ab8 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForMemberTypeResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeForMemberTypeResponseModel.ts @@ -5,6 +5,7 @@ import type { MemberTypePropertyTypeContainerResponseModel } from './MemberTypePropertyTypeContainerResponseModel'; import type { MemberTypePropertyTypeResponseModel } from './MemberTypePropertyTypeResponseModel'; +import type { ReferenceByIdModel } from './ReferenceByIdModel'; export type ContentTypeForMemberTypeResponseModel = { alias: string; @@ -14,6 +15,7 @@ export type ContentTypeForMemberTypeResponseModel = { allowedAsRoot: boolean; variesByCulture: boolean; variesBySegment: boolean; + collection?: ReferenceByIdModel | null; isElement: boolean; properties: Array; containers: Array; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeReferenceResponseModelBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeReferenceResponseModelBaseModel.ts index a6e3ce7d8b..af8e13c191 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeReferenceResponseModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ContentTypeReferenceResponseModelBaseModel.ts @@ -3,9 +3,11 @@ /* tslint:disable */ /* eslint-disable */ +import type { ReferenceByIdModel } from './ReferenceByIdModel'; + export type ContentTypeReferenceResponseModelBaseModel = { id: string; icon: string; - hasListView: boolean; + collection?: ReferenceByIdModel | null; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForDocumentTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForDocumentTypeRequestModel.ts index fa26c2f097..91540e1f32 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForDocumentTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForDocumentTypeRequestModel.ts @@ -15,6 +15,7 @@ export type CreateContentTypeForDocumentTypeRequestModel = { allowedAsRoot: boolean; variesByCulture: boolean; variesBySegment: boolean; + collection?: ReferenceByIdModel | null; isElement: boolean; properties: Array; containers: Array; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForMediaTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForMediaTypeRequestModel.ts index 16d446f260..3fe3830e3a 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForMediaTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForMediaTypeRequestModel.ts @@ -15,6 +15,7 @@ export type CreateContentTypeForMediaTypeRequestModel = { allowedAsRoot: boolean; variesByCulture: boolean; variesBySegment: boolean; + collection?: ReferenceByIdModel | null; isElement: boolean; properties: Array; containers: Array; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForMemberTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForMemberTypeRequestModel.ts index 2d652a28b9..103e02ebf5 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForMemberTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateContentTypeForMemberTypeRequestModel.ts @@ -5,6 +5,7 @@ import type { CreateMemberTypePropertyTypeContainerRequestModel } from './CreateMemberTypePropertyTypeContainerRequestModel'; import type { CreateMemberTypePropertyTypeRequestModel } from './CreateMemberTypePropertyTypeRequestModel'; +import type { ReferenceByIdModel } from './ReferenceByIdModel'; export type CreateContentTypeForMemberTypeRequestModel = { alias: string; @@ -14,6 +15,7 @@ export type CreateContentTypeForMemberTypeRequestModel = { allowedAsRoot: boolean; variesByCulture: boolean; variesBySegment: boolean; + collection?: ReferenceByIdModel | null; isElement: boolean; properties: Array; containers: Array; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaTypeRequestModel.ts index e143edb901..9db4ac7433 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaTypeRequestModel.ts @@ -6,9 +6,11 @@ import type { CreateContentTypeForMediaTypeRequestModel } from './CreateContentTypeForMediaTypeRequestModel'; import type { MediaTypeCompositionModel } from './MediaTypeCompositionModel'; import type { MediaTypeSortModel } from './MediaTypeSortModel'; +import type { ReferenceByIdModel } from './ReferenceByIdModel'; export type CreateMediaTypeRequestModel = (CreateContentTypeForMediaTypeRequestModel & { allowedMediaTypes: Array; compositions: Array; + collection?: ReferenceByIdModel | null; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CultureAndScheduleRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CultureAndScheduleRequestModel.ts new file mode 100644 index 0000000000..8ebf39abe3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CultureAndScheduleRequestModel.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ScheduleRequestModel } from './ScheduleRequestModel'; + +export type CultureAndScheduleRequestModel = { + culture?: string | null; + schedule?: ScheduleRequestModel | null; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts index dfbfcb96e9..b3b98fcc41 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts @@ -3,9 +3,9 @@ /* tslint:disable */ /* eslint-disable */ -import type { DocumentPermissionModel } from './DocumentPermissionModel'; -import type { FallbackPermissionModel } from './FallbackPermissionModel'; -import type { UnknownTypePermissionModel } from './UnknownTypePermissionModel'; +import type { DocumentPermissionPresentationModel } from './DocumentPermissionPresentationModel'; +import type { FallbackPermissionPresentationModel } from './FallbackPermissionPresentationModel'; +import type { UnknownTypePermissionPresentationModel } from './UnknownTypePermissionPresentationModel'; export type CurrentUserResponseModel = { id: string; @@ -18,6 +18,6 @@ export type CurrentUserResponseModel = { avatarUrls: Array; languages: Array; hasAccessToAllLanguages: boolean; - permissions: Array<(DocumentPermissionModel | FallbackPermissionModel | UnknownTypePermissionModel)>; + permissions: Array<(DocumentPermissionPresentationModel | FallbackPermissionPresentationModel | UnknownTypePermissionPresentationModel)>; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentPermissionModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentPermissionPresentationModel.ts similarity index 78% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentPermissionModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentPermissionPresentationModel.ts index 481339207b..420b96ec34 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentPermissionModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentPermissionPresentationModel.ts @@ -5,7 +5,8 @@ import type { ReferenceByIdModel } from './ReferenceByIdModel'; -export type DocumentPermissionModel = { +export type DocumentPermissionPresentationModel = { + $type: string; document: ReferenceByIdModel; verbs: Array; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FallbackPermissionModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FallbackPermissionPresentationModel.ts similarity index 69% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FallbackPermissionModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FallbackPermissionPresentationModel.ts index a651e1f100..7279ce521d 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FallbackPermissionModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FallbackPermissionPresentationModel.ts @@ -3,7 +3,8 @@ /* tslint:disable */ /* eslint-disable */ -export type FallbackPermissionModel = { +export type FallbackPermissionPresentationModel = { + $type: string; verbs: Array; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentRequestModel.ts index 18355d089b..4c08971560 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentRequestModel.ts @@ -3,7 +3,9 @@ /* tslint:disable */ /* eslint-disable */ +import type { CultureAndScheduleRequestModel } from './CultureAndScheduleRequestModel'; + export type PublishDocumentRequestModel = { - cultures: Array; + publishSchedules: Array; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentWithDescendantsRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentWithDescendantsRequestModel.ts index 270f4d9c43..9796f30e5a 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentWithDescendantsRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentWithDescendantsRequestModel.ts @@ -3,9 +3,8 @@ /* tslint:disable */ /* eslint-disable */ -import type { PublishDocumentRequestModel } from './PublishDocumentRequestModel'; - -export type PublishDocumentWithDescendantsRequestModel = (PublishDocumentRequestModel & { +export type PublishDocumentWithDescendantsRequestModel = { includeUnpublishedDescendants: boolean; -}); + cultures: Array; +}; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScheduleRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScheduleRequestModel.ts new file mode 100644 index 0000000000..59b83b94a6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScheduleRequestModel.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type ScheduleRequestModel = { + publishTime?: string | null; + unpublishTime?: string | null; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnknownTypePermissionModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnknownTypePermissionPresentationModel.ts similarity index 71% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnknownTypePermissionModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnknownTypePermissionPresentationModel.ts index 6a2d4b840d..ca089bbf6f 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnknownTypePermissionModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnknownTypePermissionPresentationModel.ts @@ -3,7 +3,8 @@ /* tslint:disable */ /* eslint-disable */ -export type UnknownTypePermissionModel = { +export type UnknownTypePermissionPresentationModel = { + $type: string; verbs: Array; context: string; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForDocumentTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForDocumentTypeRequestModel.ts index 752409e225..55e6966d8c 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForDocumentTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForDocumentTypeRequestModel.ts @@ -3,6 +3,7 @@ /* tslint:disable */ /* eslint-disable */ +import type { ReferenceByIdModel } from './ReferenceByIdModel'; import type { UpdateDocumentTypePropertyTypeContainerRequestModel } from './UpdateDocumentTypePropertyTypeContainerRequestModel'; import type { UpdateDocumentTypePropertyTypeRequestModel } from './UpdateDocumentTypePropertyTypeRequestModel'; @@ -14,6 +15,7 @@ export type UpdateContentTypeForDocumentTypeRequestModel = { allowedAsRoot: boolean; variesByCulture: boolean; variesBySegment: boolean; + collection?: ReferenceByIdModel | null; isElement: boolean; properties: Array; containers: Array; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForMediaTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForMediaTypeRequestModel.ts index 40e766fdcc..6edc724854 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForMediaTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForMediaTypeRequestModel.ts @@ -3,6 +3,7 @@ /* tslint:disable */ /* eslint-disable */ +import type { ReferenceByIdModel } from './ReferenceByIdModel'; import type { UpdateMediaTypePropertyTypeContainerRequestModel } from './UpdateMediaTypePropertyTypeContainerRequestModel'; import type { UpdateMediaTypePropertyTypeRequestModel } from './UpdateMediaTypePropertyTypeRequestModel'; @@ -14,6 +15,7 @@ export type UpdateContentTypeForMediaTypeRequestModel = { allowedAsRoot: boolean; variesByCulture: boolean; variesBySegment: boolean; + collection?: ReferenceByIdModel | null; isElement: boolean; properties: Array; containers: Array; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForMemberTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForMemberTypeRequestModel.ts index 4aadb2a232..6e32bbb080 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForMemberTypeRequestModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateContentTypeForMemberTypeRequestModel.ts @@ -3,6 +3,7 @@ /* tslint:disable */ /* eslint-disable */ +import type { ReferenceByIdModel } from './ReferenceByIdModel'; import type { UpdateMemberTypePropertyTypeContainerRequestModel } from './UpdateMemberTypePropertyTypeContainerRequestModel'; import type { UpdateMemberTypePropertyTypeRequestModel } from './UpdateMemberTypePropertyTypeRequestModel'; @@ -14,6 +15,7 @@ export type UpdateContentTypeForMemberTypeRequestModel = { allowedAsRoot: boolean; variesByCulture: boolean; variesBySegment: boolean; + collection?: ReferenceByIdModel | null; isElement: boolean; properties: Array; containers: Array; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupBaseModel.ts index 234c546604..d390132cae 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupBaseModel.ts @@ -3,10 +3,10 @@ /* tslint:disable */ /* eslint-disable */ -import type { DocumentPermissionModel } from './DocumentPermissionModel'; -import type { FallbackPermissionModel } from './FallbackPermissionModel'; +import type { DocumentPermissionPresentationModel } from './DocumentPermissionPresentationModel'; +import type { FallbackPermissionPresentationModel } from './FallbackPermissionPresentationModel'; import type { ReferenceByIdModel } from './ReferenceByIdModel'; -import type { UnknownTypePermissionModel } from './UnknownTypePermissionModel'; +import type { UnknownTypePermissionPresentationModel } from './UnknownTypePermissionPresentationModel'; export type UserGroupBaseModel = { name: string; @@ -18,6 +18,6 @@ export type UserGroupBaseModel = { documentRootAccess: boolean; mediaStartNode?: ReferenceByIdModel | null; mediaRootAccess: boolean; - permissions: Array<(DocumentPermissionModel | FallbackPermissionModel | UnknownTypePermissionModel)>; + permissions: Array<(DocumentPermissionPresentationModel | FallbackPermissionPresentationModel | UnknownTypePermissionPresentationModel)>; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentResource.ts index dab44ef423..1453062de2 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentResource.ts @@ -459,7 +459,7 @@ export class DocumentResource { requestBody, }: { id: string, - requestBody?: (PublishDocumentRequestModel | PublishDocumentWithDescendantsRequestModel), + requestBody?: PublishDocumentRequestModel, }): CancelablePromise { return __request(OpenAPI, { method: 'PUT', From 4fd5ef3f7dc72e27515bc395393c04d59cf006bf Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 22 Feb 2024 14:26:06 +0100 Subject: [PATCH 51/85] update permission models --- .../mocks/data/user-group/user-group.data.ts | 74 ++++++++++--------- .../mocks/data/user-group/user-group.db.ts | 10 ++- ...cument-granular-user-permission.element.ts | 2 +- 3 files changed, 46 insertions(+), 40 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts index f0d24f9c0a..25f02c1ebd 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts @@ -9,23 +9,27 @@ export const data: Array = [ icon: 'icon-medal', documentStartNode: { id: 'all-property-editors-document-id' }, permissions: [ - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Read'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Create'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Update'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Delete'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.CreateBlueprint'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Notifications'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Publish'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Permissions'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Unpublish'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Duplicate'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Move'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Sort'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.CultureAndHostnames'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.PublicAccess'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Rollback'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Read'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Create'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Update'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Delete'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.CreateBlueprint'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Notifications'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Publish'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Permissions'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Unpublish'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Duplicate'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Move'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Sort'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.CultureAndHostnames'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.PublicAccess'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Rollback'] }, - { $type: 'DocumentPermissionModel', verbs: ['Umb.Document.Rollback'], document: { id: 'simple-document-id' } }, + { + $type: 'DocumentPermissionPresentationModel', + verbs: ['Umb.Document.Rollback'], + document: { id: 'simple-document-id' }, + }, ], sections: [], languages: [], @@ -40,19 +44,19 @@ export const data: Array = [ icon: 'icon-tools', documentStartNode: { id: 'all-property-editors-document-id' }, permissions: [ - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Read'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Create'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Update'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Delete'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.CreateBlueprint'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Notifications'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Publish'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Unpublish'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Duplicate'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Move'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Sort'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.PublicAccess'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Rollback'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Read'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Create'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Update'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Delete'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.CreateBlueprint'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Notifications'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Publish'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Unpublish'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Duplicate'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Move'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Sort'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.PublicAccess'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Rollback'] }, ], sections: [], languages: [], @@ -80,8 +84,8 @@ export const data: Array = [ icon: 'icon-globe', documentStartNode: { id: 'all-property-editors-document-id' }, permissions: [ - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Read'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Update'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Read'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Update'] }, ], sections: [], languages: [], @@ -96,10 +100,10 @@ export const data: Array = [ icon: 'icon-edit', documentStartNode: { id: 'all-property-editors-document-id' }, permissions: [ - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Read'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Create'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Update'] }, - { $type: 'FallbackPermissionModel', verbs: ['Umb.Document.Notifications'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Read'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Create'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Update'] }, + { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Notifications'] }, ], sections: [], languages: [], diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts index 7fbb109acc..f13a4bd000 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts @@ -5,9 +5,9 @@ import type { UmbMockUserGroupModel } from './user-group.data.js'; import { data } from './user-group.data.js'; import type { CreateUserGroupRequestModel, - DocumentPermissionModel, - FallbackPermissionModel, - UnknownTypePermissionModel, + DocumentPermissionPresentationModel, + FallbackPermissionPresentationModel, + UnknownTypePermissionPresentationModel, UserGroupItemResponseModel, UserGroupResponseModel, } from '@umbraco-cms/backoffice/external/backend-api'; @@ -29,7 +29,9 @@ export class UmbUserGroupMockDB extends UmbEntityMockDbBase { + ): Array< + FallbackPermissionPresentationModel | DocumentPermissionPresentationModel | UnknownTypePermissionPresentationModel + > { const permissions = this.data .filter((userGroup) => userGroupIds.includes(userGroup.id)) .map((userGroup) => (userGroup.permissions?.length ? userGroup.permissions : [])) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts index 58a278f03e..51b770dcd5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts @@ -80,7 +80,7 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { this.#documentPickerModalContext?.reject(); const permissionItem: UmbDocumentUserPermissionModel = { - $type: 'DocumentPermissionModel', + $type: 'DocumentPermissionPresentationModel', document: { id: unique }, verbs: [], }; From 24adb845a1c5d76c3d1b781ebcf2266d0ac4e3ca Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 22 Feb 2024 14:30:54 +0100 Subject: [PATCH 52/85] update current user model --- .../src/packages/user/current-user/types.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/types.ts index 21a3296d5a..9ecef4e1ce 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/types.ts @@ -1,3 +1,9 @@ +import type { + DocumentPermissionPresentationModel, + FallbackPermissionPresentationModel, + UnknownTypePermissionPresentationModel, +} from '@umbraco-cms/backoffice/external/backend-api'; + export interface UmbCurrentUserModel { unique: string; email: string; @@ -9,5 +15,7 @@ export interface UmbCurrentUserModel { avatarUrls: Array; languages: Array; hasAccessToAllLanguages: boolean; - permissions: Array; + permissions: Array< + DocumentPermissionPresentationModel | FallbackPermissionPresentationModel | UnknownTypePermissionPresentationModel + >; } From 851e91ac29a98b023e12a9efe0d6f92cc5a595ed Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 22 Feb 2024 14:31:10 +0100 Subject: [PATCH 53/85] use new $type name --- .../packages/documents/documents/user-permissions/manifests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts index a7cbb23f9d..14c4c780f8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts @@ -203,7 +203,7 @@ export const granularPermissions: Array = [ name: 'Document Granular User Permission', element: () => import('./document-granular-user-permission/document-granular-user-permission.element.js'), meta: { - schemaType: 'DocumentPermissionModel', + schemaType: 'DocumentPermissionPresentationModel', }, }, ]; From 5dadf0a854c512c01a5df6fd6de16b01630bdc80 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 22 Feb 2024 14:35:40 +0100 Subject: [PATCH 54/85] remove permission entity action - we will build it later --- .../documents/entity-actions/manifests.ts | 2 - .../entity-actions/permissions/manifests.ts | 30 --- .../permissions/permissions-modal.element.ts | 173 ------------------ .../permissions/permissions.action.ts | 29 --- 4 files changed, 234 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/manifests.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions-modal.element.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions.action.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts index 2a7eed5f84..f49da1c251 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts @@ -5,7 +5,6 @@ import { UmbCreateDocumentBlueprintEntityAction } from './create-blueprint.actio import { UmbUnpublishDocumentEntityAction } from './unpublish.action.js'; import { UmbRollbackDocumentEntityAction } from './rollback.action.js'; import { manifests as createManifests } from './create/manifests.js'; -import { manifests as permissionManifests } from './permissions/manifests.js'; import { manifests as publicAccessManifests } from './public-access/manifests.js'; import { manifests as cultureAndHostnamesManifests } from './culture-and-hostnames/manifests.js'; import { @@ -17,7 +16,6 @@ import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ ...createManifests, - ...permissionManifests, ...publicAccessManifests, ...cultureAndHostnamesManifests, { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/manifests.ts deleted file mode 100644 index f05c1a9de3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/manifests.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS } from '../../repository/index.js'; -import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; -import { UmbDocumentPermissionsEntityAction } from './permissions.action.js'; -import type { ManifestEntityAction, ManifestModal } from '@umbraco-cms/backoffice/extension-registry'; - -const entityActions: Array = [ - { - type: 'entityAction', - alias: 'Umb.EntityAction.Document.Permissions', - name: 'Document Permissions Entity Action', - api: UmbDocumentPermissionsEntityAction, - meta: { - icon: 'icon-vcard', - label: 'Permissions', - repositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, - entityTypes: [UMB_DOCUMENT_ENTITY_TYPE], - }, - }, -]; - -const modals: Array = [ - { - type: 'modal', - alias: 'Umb.Modal.Permissions', - name: 'Permissions Modal', - js: () => import('./permissions-modal.element.js'), - }, -]; - -export const manifests = [...entityActions, ...modals]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions-modal.element.ts deleted file mode 100644 index 7909d2c49d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions-modal.element.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { UmbDocumentPermissionRepository } from '../../user-permissions/index.js'; -import { UmbDocumentItemRepository } from '../../repository/index.js'; -import { UmbUserGroupItemRepository, UMB_USER_GROUP_PICKER_MODAL } from '@umbraco-cms/backoffice/user-group'; -import { html, customElement, property, state, ifDefined, nothing } from '@umbraco-cms/backoffice/external/lit'; -import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import type { - UmbEntityUserPermissionSettingsModalData, - UmbEntityUserPermissionSettingsModalValue, - UmbModalContext, - UmbModalManagerContext, -} from '@umbraco-cms/backoffice/modal'; -import { UMB_ENTITY_USER_PERMISSION_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UmbSelectedEvent } from '@umbraco-cms/backoffice/event'; - -type UmbUserGroupRefData = { - id: string; - name?: string; - icon?: string | null; - permissions: Array; -}; - -@customElement('umb-permissions-modal') -export class UmbPermissionsModalElement extends UmbLitElement { - @property({ attribute: false }) - modalContext?: UmbModalContext; - - @property({ type: Object }) - data?: UmbEntityUserPermissionSettingsModalData; - - @state() - _entityItem?: any; - - @state() - _userGroupRefs: Array = []; - - #userPermissions: Array = []; - #userGroupIemRepository = new UmbUserGroupItemRepository(this); - #documentPermissionRepository = new UmbDocumentPermissionRepository(this); - #documentItemRepository = new UmbDocumentItemRepository(this); - #modalManagerContext?: UmbModalManagerContext; - #userGroupPickerModal?: UmbModalContext; - - private _handleConfirm() { - this.modalContext?.submit(); - } - - private _handleCancel() { - this.modalContext?.reject(); - } - - constructor() { - super(); - - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { - this.#modalManagerContext = instance; - }); - } - - protected async firstUpdated(): Promise { - if (!this.data?.unique) throw new Error('Could not load permissions, no unique was provided'); - this.#getEntityItem(this.data.unique); - this.#getEntityPermissions(this.data.unique); - } - - async #getEntityItem(unique: string) { - const { data } = await this.#documentItemRepository.requestItems([unique]); - if (!data) throw new Error('Could not load item'); - this._entityItem = data[0]; - } - - async #getEntityPermissions(unique: string) { - const { data } = await this.#documentPermissionRepository.requestPermissions(unique); - if (data) { - this.#userPermissions = data; - this.#mapToUserGroupRefs(); - } - } - - async #mapToUserGroupRefs() { - const userGroupIds = [...new Set(this.#userPermissions.map((permission) => permission.target.userGroupId))]; - const { data } = await this.#userGroupIemRepository.requestItems(userGroupIds); - - const userGroups = data ?? []; - - this._userGroupRefs = this.#userPermissions.map((entry) => { - const userGroup = userGroups.find((userGroup) => userGroup.unique == entry.target.userGroupId); - return { - id: entry.target.userGroupId, - name: userGroup?.name, - icon: userGroup?.icon, - permissions: entry.permissions, - }; - }); - } - - #openUserGroupPickerModal() { - if (!this.#modalManagerContext) return; - - this.#userGroupPickerModal = this.#modalManagerContext.open(UMB_USER_GROUP_PICKER_MODAL); - - this.#userGroupPickerModal.addEventListener(UmbSelectedEvent.TYPE, (event) => { - const selectEvent = event as UmbSelectedEvent; - const unique = selectEvent.unique; - if (!unique) return; - this.#openUserPermissionsModal(unique); - }); - } - - #openUserPermissionsModal(id: string) { - if (!id) throw new Error('Could not open permissions modal, no id was provided'); - if (!this.data?.entityType) throw new Error('Could not open permissions modal, no entity type was provided'); - - const userGroupRef = this._userGroupRefs.find((userGroup) => userGroup.id == id); - - const modalContext = this.#modalManagerContext?.open(UMB_ENTITY_USER_PERMISSION_MODAL, { - data: { - unique: id, - entityType: this.data.entityType, - allowedVerbs: userGroupRef?.permissions || [], - headline: `Permissions for ${userGroupRef?.name}`, - }, - }); - - modalContext?.onSubmit().then((value) => { - console.log(value); - }); - } - - render() { - return html` - - - Permissions set for User Groups for document: ${this.data?.entityType}: - - ${this._userGroupRefs.map( - (userGroup) => - html` this.#openUserPermissionsModal(userGroup.id)} - standalone> - ${userGroup.icon ? html`` : nothing} - `, - )} - - Select user group - - - Cancel - - - `; - } - - static styles = [UmbTextStyles]; -} - -export default UmbPermissionsModalElement; - -declare global { - interface HTMLElementTagNameMap { - 'umb-permissions-modal': UmbPermissionsModalElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions.action.ts deleted file mode 100644 index e464a2c999..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions.action.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { UmbDocumentDetailRepository } from '../../repository/index.js'; -import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; -import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; -import { UMB_MODAL_MANAGER_CONTEXT, UMB_PERMISSIONS_MODAL } from '@umbraco-cms/backoffice/modal'; - -export class UmbDocumentPermissionsEntityAction extends UmbEntityActionBase { - #modalManagerContext?: UmbModalManagerContext; - - constructor(host: UmbControllerHostElement, repositoryAlias: string, unique: string, entityType: string) { - super(host, repositoryAlias, unique, entityType); - - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { - this.#modalManagerContext = instance; - }); - } - - async execute() { - if (!this.repository) return; - if (!this.#modalManagerContext) return; - - this.#modalManagerContext.open(UMB_PERMISSIONS_MODAL, { - data: { - unique: this.unique, - entityType: this.entityType, - }, - }); - } -} From 5be504510705aadeed24bb77bc8afaef1945cfaf Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 22 Feb 2024 14:52:07 +0100 Subject: [PATCH 55/85] type hacking --- .../document-granular-user-permission.element.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts index 51b770dcd5..c1681ba059 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts @@ -196,8 +196,12 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { return umbExtensionsRegistry .getAllExtensions() .filter((manifest) => manifest.type === 'entityUserPermission') - .filter((manifest) => manifest.meta.verbs.every((verb) => permission.verbs.includes(verb))) - .map((manifest) => { + .filter((manifest) => + (manifest as ManifestEntityUserPermission).meta.verbs.every((verb) => permission.verbs.includes(verb)), + ) + .map((m) => { + const manifest = m as ManifestEntityUserPermission; + if (manifest.meta.labelKey) { return this.localize.term(manifest.meta.labelKey); } else if (manifest.meta.label) { From 17974397099f5d092d1c5a13abfb9dfeed9a75e1 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 22 Feb 2024 14:52:44 +0100 Subject: [PATCH 56/85] remove unused --- .../document-granular-user-permission.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts index c1681ba059..9282b52d45 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts @@ -1,6 +1,6 @@ import type { UmbDocumentUserPermissionModel } from '../types.js'; import { UmbDocumentItemRepository, type UmbDocumentItemModel } from '../../repository/index.js'; -import { css, customElement, html, ifDefined, repeat, state } from '@umbraco-cms/backoffice/external/lit'; +import { css, customElement, html, repeat, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; import { From fe71a952a5ec7156823688685c1904570bb1b7e9 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 22 Feb 2024 14:59:32 +0100 Subject: [PATCH 57/85] add todo --- .../src/packages/documents/documents/user-permissions/types.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/types.ts index 0fbb345370..14feb94a9e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/types.ts @@ -1,5 +1,6 @@ import type { UmbUserPermissionModel } from '@umbraco-cms/backoffice/user-permission'; export interface UmbDocumentUserPermissionModel extends UmbUserPermissionModel { - document: { unique: string }; + // TODO: this should be unique instead of an id, but we currently have now way to map a mixed server response. + document: { id: string }; } From b11bde0131b96f12e5c10f2d201aa08321b44478 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 22 Feb 2024 15:01:33 +0100 Subject: [PATCH 58/85] add type to event --- .../document-granular-user-permission.element.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts index 9282b52d45..9b2027f3a2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts @@ -8,7 +8,7 @@ import { UMB_ENTITY_USER_PERMISSION_MODAL, UMB_MODAL_MANAGER_CONTEXT, } from '@umbraco-cms/backoffice/modal'; -import { UmbSelectedEvent } from '@umbraco-cms/backoffice/event'; +import { UmbDeselectedEvent, UmbSelectedEvent } from '@umbraco-cms/backoffice/event'; import type { ManifestEntityUserPermission } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -70,7 +70,7 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { }, }); - this.#documentPickerModalContext?.addEventListener(UmbSelectedEvent.TYPE, async (event) => { + this.#documentPickerModalContext?.addEventListener(UmbSelectedEvent.TYPE, async (event: UmbDeselectedEvent) => { const selectedEvent = event as UmbSelectedEvent; const unique = selectedEvent.unique; if (!unique) return; From dd3f700909d0c03d836e52b69b381ca3bb0fe030 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 22 Feb 2024 15:17:19 +0100 Subject: [PATCH 59/85] listen for value changes --- .../document-granular-user-permission.element.ts | 5 ++++- .../user-group-granular-permission-list.element.ts | 13 +++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts index 9b2027f3a2..412ad5fad2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts @@ -8,7 +8,8 @@ import { UMB_ENTITY_USER_PERMISSION_MODAL, UMB_MODAL_MANAGER_CONTEXT, } from '@umbraco-cms/backoffice/modal'; -import { UmbDeselectedEvent, UmbSelectedEvent } from '@umbraco-cms/backoffice/event'; +import type { UmbDeselectedEvent } from '@umbraco-cms/backoffice/event'; +import { UmbChangeEvent, UmbSelectedEvent } from '@umbraco-cms/backoffice/event'; import type { ManifestEntityUserPermission } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -57,6 +58,8 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { } return permission; }); + + this.dispatchEvent(new UmbChangeEvent()); } #addGranularPermission() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts index 3a399088af..21a47b0330 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts @@ -1,4 +1,5 @@ import { UMB_USER_GROUP_WORKSPACE_CONTEXT } from '../user-group-workspace.context.js'; +import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; import { createExtensionElement } from '@umbraco-cms/backoffice/extension-api'; import type { ManifestGranularUserPermission } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -49,6 +50,7 @@ export class UmbUserGroupGranularPermissionListElement extends UmbLitElement { userGroup.permissions.filter((permission) => permission.$type === schemaType) || []; element.value = permissionsForSchemaType; + element.addEventListener(UmbChangeEvent.TYPE, this.#onValueChange); }, 'umbUserGroupPermissionObserver', ); @@ -57,10 +59,21 @@ export class UmbUserGroupGranularPermissionListElement extends UmbLitElement { this.requestUpdate('_extensionElements'); } + #onValueChange = (e: UmbChangeEvent) => { + e.stopPropagation(); + const target = e.target as any; + console.log('Value changed', target.value); + }; + render() { return html`${this._extensionElements.map((element) => html`${element}`)}`; } + disconnectedCallback(): void { + this._extensionElements.forEach((element) => element.removeEventListener(UmbChangeEvent.TYPE, this.#onValueChange)); + super.disconnectedCallback(); + } + static styles = [UmbTextStyles, css``]; } From 83483148d8d4ebe19f6f6cea733970653fdf5286 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 22 Feb 2024 15:32:39 +0100 Subject: [PATCH 60/85] update value when new permission is added --- .../document-granular-user-permission.element.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts index 412ad5fad2..d2b101d697 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts @@ -85,11 +85,10 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { const permissionItem: UmbDocumentUserPermissionModel = { $type: 'DocumentPermissionPresentationModel', document: { id: unique }, - verbs: [], + verbs: result, }; - this._value = [...this._value, permissionItem]; - this.requestUpdate(); + this.value = [...this._value, permissionItem]; }); } From d712636aeab0a091d265bd6a85e88d4c30d4ef5a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 22 Feb 2024 21:09:34 +0100 Subject: [PATCH 61/85] add granular crud --- .../mocks/data/user-group/user-group.data.ts | 83 +++++++++++-------- ...cument-granular-user-permission.element.ts | 33 ++++++-- ...oup-entity-user-permission-list.element.ts | 20 +++-- ...-group-granular-permission-list.element.ts | 20 ++++- .../packages/user/user-permission/types.ts | 1 + 5 files changed, 106 insertions(+), 51 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts index 25f02c1ebd..106ad3f7f5 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts @@ -9,23 +9,29 @@ export const data: Array = [ icon: 'icon-medal', documentStartNode: { id: 'all-property-editors-document-id' }, permissions: [ - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Read'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Create'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Update'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Delete'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.CreateBlueprint'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Notifications'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Publish'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Permissions'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Unpublish'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Duplicate'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Move'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Sort'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.CultureAndHostnames'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.PublicAccess'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Rollback'] }, - { + id: '8553fd2c-584d-4f5f-bd95-2421e9c3fdeb', + $type: 'FallbackPermissionPresentationModel', + verbs: [ + 'Umb.Document.Read', + 'Umb.Document.Create', + 'Umb.Document.Update', + 'Umb.Document.Delete', + 'Umb.Document.CreateBlueprint', + 'Umb.Document.Notifications', + 'Umb.Document.Publish', + 'Umb.Document.Permissions', + 'Umb.Document.Unpublish', + 'Umb.Document.Duplicate', + 'Umb.Document.Move', + 'Umb.Document.Sort', + 'Umb.Document.CultureAndHostnames', + 'Umb.Document.PublicAccess', + 'Umb.Document.Rollback', + ], + }, + { + id: '9fdeee5d-aecc-498d-b8a4-e2727da07fd7', $type: 'DocumentPermissionPresentationModel', verbs: ['Umb.Document.Rollback'], document: { id: 'simple-document-id' }, @@ -44,19 +50,24 @@ export const data: Array = [ icon: 'icon-tools', documentStartNode: { id: 'all-property-editors-document-id' }, permissions: [ - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Read'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Create'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Update'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Delete'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.CreateBlueprint'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Notifications'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Publish'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Unpublish'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Duplicate'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Move'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Sort'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.PublicAccess'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Rollback'] }, + { + $type: 'FallbackPermissionPresentationModel', + verbs: [ + 'Umb.Document.Read', + 'Umb.Document.Create', + 'Umb.Document.Update', + 'Umb.Document.Delete', + 'Umb.Document.CreateBlueprint', + 'Umb.Document.Notifications', + 'Umb.Document.Publish', + 'Umb.Document.Unpublish', + 'Umb.Document.Duplicate', + 'Umb.Document.Move', + 'Umb.Document.Sort', + 'Umb.Document.PublicAccess', + 'Umb.Document.Rollback', + ], + }, ], sections: [], languages: [], @@ -84,8 +95,10 @@ export const data: Array = [ icon: 'icon-globe', documentStartNode: { id: 'all-property-editors-document-id' }, permissions: [ - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Read'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Update'] }, + { + $type: 'FallbackPermissionPresentationModel', + verbs: ['Umb.Document.Read', 'Umb.Document.Update'], + }, ], sections: [], languages: [], @@ -100,10 +113,10 @@ export const data: Array = [ icon: 'icon-edit', documentStartNode: { id: 'all-property-editors-document-id' }, permissions: [ - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Read'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Create'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Update'] }, - { $type: 'FallbackPermissionPresentationModel', verbs: ['Umb.Document.Notifications'] }, + { + $type: 'FallbackPermissionPresentationModel', + verbs: ['Umb.Document.Read', 'Umb.Document.Create', 'Umb.Document.Update', 'Umb.Document.Notifications'], + }, ], sections: [], languages: [], diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts index d2b101d697..0349d1d17b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts @@ -12,6 +12,7 @@ import type { UmbDeselectedEvent } from '@umbraco-cms/backoffice/event'; import { UmbChangeEvent, UmbSelectedEvent } from '@umbraco-cms/backoffice/event'; import type { ManifestEntityUserPermission } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { UmbId } from '@umbraco-cms/backoffice/id'; @customElement('umb-document-granular-user-permission') export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { @@ -47,6 +48,8 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { async #editGranularPermission(item: UmbDocumentItemModel) { const currentPermissionVerbs = this.#getPermissionForDocument(item.unique)?.verbs ?? []; const result = await this.#selectEntityUserPermissionsForDocument(item, currentPermissionVerbs); + // don't do anything if the verbs have not been updated + if (JSON.stringify(result) === JSON.stringify(currentPermissionVerbs)) return; // update permission with new verbs this.value = this._value.map((permission) => { @@ -83,12 +86,14 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { this.#documentPickerModalContext?.reject(); const permissionItem: UmbDocumentUserPermissionModel = { + id: UmbId.new(), $type: 'DocumentPermissionPresentationModel', document: { id: unique }, verbs: result, }; this.value = [...this._value, permissionItem]; + this.dispatchEvent(new UmbChangeEvent()); }); } @@ -122,10 +127,18 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { const value = await this.#entityUserPermissionModalContext?.onSubmit(); return value?.allowedVerbs; } catch (error) { - return []; + return allowedVerbs; } } + #removeGranularPermission(item: UmbDocumentItemModel) { + const permission = this.#getPermissionForDocument(item.unique); + if (!permission) return; + + this.value = this._value.filter((p) => p.id !== permission.id); + this.dispatchEvent(new UmbChangeEvent()); + } + render() { return html`${this.#renderItems()} ${this.#renderAddButton()}`; } @@ -149,7 +162,6 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { label=${this.localize.term('general_add')}>`; } - // TODO: make umb-document-ref element #renderRef(item: UmbDocumentItemModel) { if (!item.unique) return; // TODO: get correct variant name @@ -159,7 +171,9 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { return html` ${this.#renderIcon(item)} ${this.#renderIsTrashed(item)} - ${this.#renderEditButton(item)} + + ${this.#renderEditButton(item)} ${this.#renderRemoveButton(item)} + `; } @@ -175,18 +189,19 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { } #renderEditButton(item: UmbDocumentItemModel) { - // TODO: get correct variant name - const name = item.variants[0]?.name; - return html` this.#editGranularPermission(item)} - label="${this.localize.term('general_edit')} ${name}" - >${this.localize.term('general_edit')} + label=${this.localize.term('general_edit')}> `; } + #renderRemoveButton(item: UmbDocumentItemModel) { + return html` this.#removeGranularPermission(item)} + label=${this.localize.term('general_remove')}>`; + } + #getPermissionForDocument(unique: string) { return this._value?.find((permission) => permission.document.id === unique); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-entity-user-permission-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-entity-user-permission-list.element.ts index f555e987d6..dbbce9b817 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-entity-user-permission-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-entity-user-permission-list.element.ts @@ -4,12 +4,11 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -import type { UmbUserPermissionModel } from '@umbraco-cms/backoffice/user-permission'; @customElement('umb-user-group-entity-user-permission-list') export class UmbUserGroupEntityUserPermissionListElement extends UmbLitElement { @state() - private _userGroupPermissions?: Array; + private _allowedVerbs?: Array; @state() private _entityTypes: Array = []; @@ -25,7 +24,15 @@ export class UmbUserGroupEntityUserPermissionListElement extends UmbLitElement { this.#userGroupWorkspaceContext = instance; this.observe( this.#userGroupWorkspaceContext.data, - (userGroup) => (this._userGroupPermissions = userGroup?.permissions), + (userGroup) => { + const allAllowedVerbs = + userGroup?.permissions + .filter((permission) => permission.$type === 'FallbackPermissionPresentationModel') + .flatMap((permission) => permission.verbs) || []; + + // make a unique list of allowed verbs + this._allowedVerbs = [...new Set(allAllowedVerbs)]; + }, 'umbUserGroupEntityUserPermissionsObserver', ); }); @@ -43,8 +50,9 @@ export class UmbUserGroupEntityUserPermissionListElement extends UmbLitElement { #onSelectedUserPermission(event: UmbSelectionChangeEvent) { const target = event.target as any; - const selection = target.selectedPermissions; - this.#userGroupWorkspaceContext?.setPermissions(selection); + const selection = target.allowedVerbs; + debugger; + //this.#userGroupWorkspaceContext?.setPermissions(selection); } render() { @@ -56,7 +64,7 @@ export class UmbUserGroupEntityUserPermissionListElement extends UmbLitElement {

${entityType}

`; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts index 21a47b0330..eb53ad4656 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts @@ -5,6 +5,7 @@ import type { ManifestGranularUserPermission } from '@umbraco-cms/backoffice/ext import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { appendToFrozenArray, filterFrozenArray } from '@umbraco-cms/backoffice/observable-api'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @customElement('umb-user-group-granular-permission-list') @@ -50,6 +51,7 @@ export class UmbUserGroupGranularPermissionListElement extends UmbLitElement { userGroup.permissions.filter((permission) => permission.$type === schemaType) || []; element.value = permissionsForSchemaType; + element.manifest = manifest; element.addEventListener(UmbChangeEvent.TYPE, this.#onValueChange); }, 'umbUserGroupPermissionObserver', @@ -61,8 +63,24 @@ export class UmbUserGroupGranularPermissionListElement extends UmbLitElement { #onValueChange = (e: UmbChangeEvent) => { e.stopPropagation(); + // TODO: make interface const target = e.target as any; - console.log('Value changed', target.value); + const schemaType = target.manifest?.meta.schemaType; + if (!schemaType) throw new Error('Schema type is not available'); + + /* Remove all permissions of the same schema type from + the user group and append the new permissions. + We do it this way to support appends, updates and deletion without we know the + exact action but on the changed value */ + const storedValueWithoutSchemaTypeItems = filterFrozenArray( + this.#workspaceContext?.getPermissions() || [], + (x) => x.$type !== schemaType, + ); + + const value = target.value || []; + const newCombinedValue = [...storedValueWithoutSchemaTypeItems, ...value]; + + this.#workspaceContext?.setPermissions(newCombinedValue); }; render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/types.ts index e84687e8bb..151dfc8858 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/types.ts @@ -1,4 +1,5 @@ export interface UmbUserPermissionModel { + id: string; $type: string; verbs: Array; } From e66229acb8be7a5817d3814c9ed3d5f874eec09a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 23 Feb 2024 09:51:34 +0100 Subject: [PATCH 62/85] generate new server models --- .../src/external/backend-api/src/index.ts | 1 - .../src/models/CurrentUserResponseModel.ts | 3 +- .../src/models/DataTypeResponseModel.ts | 1 + .../FallbackPermissionPresentationModel.ts | 10 ---- .../src/models/UserGroupBaseModel.ts | 4 +- .../src/services/DocumentResource.ts | 54 +++++++++++++++++++ .../backend-api/src/services/MediaResource.ts | 53 ++++++++++++++++++ 7 files changed, 111 insertions(+), 15 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FallbackPermissionPresentationModel.ts diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts index 59dc00896d..d03abff57c 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts @@ -142,7 +142,6 @@ export type { DynamicRootResponseModel } from './models/DynamicRootResponseModel export type { EnableTwoFactorRequestModel } from './models/EnableTwoFactorRequestModel'; export type { EnableUserRequestModel } from './models/EnableUserRequestModel'; export type { EntityTreeItemResponseModel } from './models/EntityTreeItemResponseModel'; -export type { FallbackPermissionPresentationModel } from './models/FallbackPermissionPresentationModel'; export type { FieldPresentationModel } from './models/FieldPresentationModel'; export type { FileSystemCreateRequestModelBaseModel } from './models/FileSystemCreateRequestModelBaseModel'; export type { FileSystemFileCreateRequestModelBaseModel } from './models/FileSystemFileCreateRequestModelBaseModel'; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts index b3b98fcc41..5202fb7a88 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts @@ -4,7 +4,6 @@ /* eslint-disable */ import type { DocumentPermissionPresentationModel } from './DocumentPermissionPresentationModel'; -import type { FallbackPermissionPresentationModel } from './FallbackPermissionPresentationModel'; import type { UnknownTypePermissionPresentationModel } from './UnknownTypePermissionPresentationModel'; export type CurrentUserResponseModel = { @@ -18,6 +17,6 @@ export type CurrentUserResponseModel = { avatarUrls: Array; languages: Array; hasAccessToAllLanguages: boolean; - permissions: Array<(DocumentPermissionPresentationModel | FallbackPermissionPresentationModel | UnknownTypePermissionPresentationModel)>; + permissions: Array<(DocumentPermissionPresentationModel | UnknownTypePermissionPresentationModel)>; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeResponseModel.ts index afd9143aef..4be982e714 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeResponseModel.ts @@ -10,5 +10,6 @@ export type DataTypeResponseModel = (DataTypeModelBaseModel & { id: string; parent?: ReferenceByIdModel | null; isDeletable: boolean; + canIgnoreStartNodes: boolean; }); diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FallbackPermissionPresentationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FallbackPermissionPresentationModel.ts deleted file mode 100644 index 7279ce521d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FallbackPermissionPresentationModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type FallbackPermissionPresentationModel = { - $type: string; - verbs: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupBaseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupBaseModel.ts index d390132cae..12df62d966 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupBaseModel.ts @@ -4,7 +4,6 @@ /* eslint-disable */ import type { DocumentPermissionPresentationModel } from './DocumentPermissionPresentationModel'; -import type { FallbackPermissionPresentationModel } from './FallbackPermissionPresentationModel'; import type { ReferenceByIdModel } from './ReferenceByIdModel'; import type { UnknownTypePermissionPresentationModel } from './UnknownTypePermissionPresentationModel'; @@ -18,6 +17,7 @@ export type UserGroupBaseModel = { documentRootAccess: boolean; mediaStartNode?: ReferenceByIdModel | null; mediaRootAccess: boolean; - permissions: Array<(DocumentPermissionPresentationModel | FallbackPermissionPresentationModel | UnknownTypePermissionPresentationModel)>; + fallbackPermissions: Array; + permissions: Array<(DocumentPermissionPresentationModel | UnknownTypePermissionPresentationModel)>; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentResource.ts index 1453062de2..70fc1eff70 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentResource.ts @@ -11,12 +11,14 @@ import type { DocumentNotificationResponseModel } from '../models/DocumentNotifi import type { DocumentResponseModel } from '../models/DocumentResponseModel'; import type { DomainsResponseModel } from '../models/DomainsResponseModel'; import type { MoveDocumentRequestModel } from '../models/MoveDocumentRequestModel'; +import type { MoveMediaRequestModel } from '../models/MoveMediaRequestModel'; import type { PagedDocumentCollectionResponseModel } from '../models/PagedDocumentCollectionResponseModel'; import type { PagedDocumentRecycleBinItemResponseModel } from '../models/PagedDocumentRecycleBinItemResponseModel'; import type { PagedDocumentTreeItemResponseModel } from '../models/PagedDocumentTreeItemResponseModel'; import type { PublicAccessRequestModel } from '../models/PublicAccessRequestModel'; import type { PublishDocumentRequestModel } from '../models/PublishDocumentRequestModel'; import type { PublishDocumentWithDescendantsRequestModel } from '../models/PublishDocumentWithDescendantsRequestModel'; +import type { ReferenceByIdModel } from '../models/ReferenceByIdModel'; import type { SortingRequestModel } from '../models/SortingRequestModel'; import type { UnpublishDocumentRequestModel } from '../models/UnpublishDocumentRequestModel'; import type { UpdateDocumentNotificationsRequestModel } from '../models/UpdateDocumentNotificationsRequestModel'; @@ -683,6 +685,58 @@ export class DocumentResource { }); } + /** + * @returns any Success + * @throws ApiError + */ + public static getRecycleBinDocumentByIdOriginalParent({ + id, + }: { + id: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/recycle-bin/document/{id}/original-parent', + path: { + 'id': id, + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static putRecycleBinDocumentByIdRestore({ + id, + requestBody, + }: { + id: string, + requestBody?: MoveMediaRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/recycle-bin/document/{id}/restore', + path: { + 'id': id, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, + 404: `Not Found`, + }, + }); + } + /** * @returns PagedDocumentRecycleBinItemResponseModel Success * @throws ApiError diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MediaResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MediaResource.ts index bbfb4abc63..d85c17a566 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MediaResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MediaResource.ts @@ -11,6 +11,7 @@ import type { MoveMediaRequestModel } from '../models/MoveMediaRequestModel'; import type { PagedMediaCollectionResponseModel } from '../models/PagedMediaCollectionResponseModel'; import type { PagedMediaRecycleBinItemResponseModel } from '../models/PagedMediaRecycleBinItemResponseModel'; import type { PagedMediaTreeItemResponseModel } from '../models/PagedMediaTreeItemResponseModel'; +import type { ReferenceByIdModel } from '../models/ReferenceByIdModel'; import type { SortingRequestModel } from '../models/SortingRequestModel'; import type { UpdateMediaRequestModel } from '../models/UpdateMediaRequestModel'; @@ -360,6 +361,58 @@ export class MediaResource { }); } + /** + * @returns any Success + * @throws ApiError + */ + public static getRecycleBinMediaByIdOriginalParent({ + id, + }: { + id: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/recycle-bin/media/{id}/original-parent', + path: { + 'id': id, + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static putRecycleBinMediaByIdRestore({ + id, + requestBody, + }: { + id: string, + requestBody?: MoveMediaRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/recycle-bin/media/{id}/restore', + path: { + 'id': id, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, + 404: `Not Found`, + }, + }); + } + /** * @returns PagedMediaRecycleBinItemResponseModel Success * @throws ApiError From 2a256294c7d9c5c81544a038b3b9513b9657ead1 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 23 Feb 2024 10:01:06 +0100 Subject: [PATCH 63/85] update models + mock data --- .../mocks/data/user-group/user-group.data.ts | 93 ++++++++----------- .../mocks/data/user-group/user-group.db.ts | 7 +- .../user-group-detail.server.data-source.ts | 1 + .../src/packages/user/user-group/types.ts | 1 + .../packages/user/user-permission/types.ts | 1 - 5 files changed, 46 insertions(+), 57 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts index 106ad3f7f5..81a46cb651 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.data.ts @@ -8,30 +8,25 @@ export const data: Array = [ name: 'Administrators', icon: 'icon-medal', documentStartNode: { id: 'all-property-editors-document-id' }, + fallbackPermissions: [ + 'Umb.Document.Read', + 'Umb.Document.Create', + 'Umb.Document.Update', + 'Umb.Document.Delete', + 'Umb.Document.CreateBlueprint', + 'Umb.Document.Notifications', + 'Umb.Document.Publish', + 'Umb.Document.Permissions', + 'Umb.Document.Unpublish', + 'Umb.Document.Duplicate', + 'Umb.Document.Move', + 'Umb.Document.Sort', + 'Umb.Document.CultureAndHostnames', + 'Umb.Document.PublicAccess', + 'Umb.Document.Rollback', + ], permissions: [ { - id: '8553fd2c-584d-4f5f-bd95-2421e9c3fdeb', - $type: 'FallbackPermissionPresentationModel', - verbs: [ - 'Umb.Document.Read', - 'Umb.Document.Create', - 'Umb.Document.Update', - 'Umb.Document.Delete', - 'Umb.Document.CreateBlueprint', - 'Umb.Document.Notifications', - 'Umb.Document.Publish', - 'Umb.Document.Permissions', - 'Umb.Document.Unpublish', - 'Umb.Document.Duplicate', - 'Umb.Document.Move', - 'Umb.Document.Sort', - 'Umb.Document.CultureAndHostnames', - 'Umb.Document.PublicAccess', - 'Umb.Document.Rollback', - ], - }, - { - id: '9fdeee5d-aecc-498d-b8a4-e2727da07fd7', $type: 'DocumentPermissionPresentationModel', verbs: ['Umb.Document.Rollback'], document: { id: 'simple-document-id' }, @@ -49,26 +44,22 @@ export const data: Array = [ name: 'Editors', icon: 'icon-tools', documentStartNode: { id: 'all-property-editors-document-id' }, - permissions: [ - { - $type: 'FallbackPermissionPresentationModel', - verbs: [ - 'Umb.Document.Read', - 'Umb.Document.Create', - 'Umb.Document.Update', - 'Umb.Document.Delete', - 'Umb.Document.CreateBlueprint', - 'Umb.Document.Notifications', - 'Umb.Document.Publish', - 'Umb.Document.Unpublish', - 'Umb.Document.Duplicate', - 'Umb.Document.Move', - 'Umb.Document.Sort', - 'Umb.Document.PublicAccess', - 'Umb.Document.Rollback', - ], - }, + fallbackPermissions: [ + 'Umb.Document.Read', + 'Umb.Document.Create', + 'Umb.Document.Update', + 'Umb.Document.Delete', + 'Umb.Document.CreateBlueprint', + 'Umb.Document.Notifications', + 'Umb.Document.Publish', + 'Umb.Document.Unpublish', + 'Umb.Document.Duplicate', + 'Umb.Document.Move', + 'Umb.Document.Sort', + 'Umb.Document.PublicAccess', + 'Umb.Document.Rollback', ], + permissions: [], sections: [], languages: [], hasAccessToAllLanguages: true, @@ -81,6 +72,7 @@ export const data: Array = [ name: 'Sensitive data', icon: 'icon-lock', documentStartNode: { id: 'all-property-editors-document-id' }, + fallbackPermissions: [], permissions: [], sections: [], languages: [], @@ -94,12 +86,8 @@ export const data: Array = [ name: 'Translators', icon: 'icon-globe', documentStartNode: { id: 'all-property-editors-document-id' }, - permissions: [ - { - $type: 'FallbackPermissionPresentationModel', - verbs: ['Umb.Document.Read', 'Umb.Document.Update'], - }, - ], + fallbackPermissions: ['Umb.Document.Read', 'Umb.Document.Update'], + permissions: [], sections: [], languages: [], hasAccessToAllLanguages: true, @@ -112,12 +100,13 @@ export const data: Array = [ name: 'Writers', icon: 'icon-edit', documentStartNode: { id: 'all-property-editors-document-id' }, - permissions: [ - { - $type: 'FallbackPermissionPresentationModel', - verbs: ['Umb.Document.Read', 'Umb.Document.Create', 'Umb.Document.Update', 'Umb.Document.Notifications'], - }, + fallbackPermissions: [ + 'Umb.Document.Read', + 'Umb.Document.Create', + 'Umb.Document.Update', + 'Umb.Document.Notifications', ], + permissions: [], sections: [], languages: [], hasAccessToAllLanguages: true, diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts index f13a4bd000..ad7daef15d 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts @@ -6,7 +6,6 @@ import { data } from './user-group.data.js'; import type { CreateUserGroupRequestModel, DocumentPermissionPresentationModel, - FallbackPermissionPresentationModel, UnknownTypePermissionPresentationModel, UserGroupItemResponseModel, UserGroupResponseModel, @@ -29,9 +28,7 @@ export class UmbUserGroupMockDB extends UmbEntityMockDbBase { + ): Array { const permissions = this.data .filter((userGroup) => userGroupIds.includes(userGroup.id)) .map((userGroup) => (userGroup.permissions?.length ? userGroup.permissions : [])) @@ -63,6 +60,7 @@ const createMockMapper = (item: CreateUserGroupRequestModel): UmbMockUserGroupMo mediaRootAccess: item.mediaRootAccess, mediaStartNode: item.mediaStartNode, name: item.name, + fallbackPermissions: item.fallbackPermissions, permissions: item.permissions, sections: item.sections, }; @@ -80,6 +78,7 @@ const detailResponseMapper = (item: UmbMockUserGroupModel): UserGroupResponseMod mediaRootAccess: item.mediaRootAccess, mediaStartNode: item.mediaStartNode, name: item.name, + fallbackPermissions: item.fallbackPermissions, permissions: item.permissions, sections: item.sections, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts index 6a085e3a2f..619f10f9f7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts @@ -146,6 +146,7 @@ export class UmbUserGroupServerDataSource implements UmbDetailDataSource; permissions: Array; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/types.ts index 151dfc8858..e84687e8bb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/types.ts @@ -1,5 +1,4 @@ export interface UmbUserPermissionModel { - id: string; $type: string; verbs: Array; } From eabe03064839ae624e0567999c6526012281d0bd Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 23 Feb 2024 10:15:59 +0100 Subject: [PATCH 64/85] add new field to data type mock data --- .../mocks/data/data-type/data-type.data.ts | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts index 428b407cae..7433db896a 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.data.ts @@ -18,6 +18,7 @@ export const data: Array = [ editorAlias: '', values: [], isDeletable: true, + canIgnoreStartNodes: false, }, { name: 'Folder 2', @@ -28,6 +29,7 @@ export const data: Array = [ editorAlias: '', values: [], isDeletable: true, + canIgnoreStartNodes: false, }, { id: '0cc0eba1-9960-42c9-bf9b-60e150b429ae', @@ -39,6 +41,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, }, { name: 'Text', @@ -49,6 +52,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'maxChars', @@ -65,6 +69,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [], }, { @@ -76,6 +81,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [], }, { @@ -87,6 +93,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'useLabel', @@ -144,6 +151,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'validationLimit', @@ -160,6 +168,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { //showPalette @@ -198,6 +207,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'overlaySize', @@ -230,6 +240,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'startNode', @@ -278,6 +289,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'format', @@ -301,6 +313,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'format', @@ -321,6 +334,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'format', @@ -341,6 +355,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'inputMode', @@ -357,6 +372,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'minNumber', @@ -377,6 +393,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'multiple', @@ -401,6 +418,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'enableRange', @@ -437,6 +455,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'default', @@ -465,6 +484,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'group', @@ -485,6 +505,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [], }, { @@ -496,6 +517,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'items', @@ -516,6 +538,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'items', @@ -536,6 +559,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'blocks', @@ -600,6 +624,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [], }, { @@ -611,6 +636,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'crops', @@ -643,6 +669,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'fileExtensions', @@ -663,6 +690,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'blockGroups', @@ -774,6 +802,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: false, + canIgnoreStartNodes: false, values: [ { alias: 'pageSize', value: 2 }, { alias: 'orderDirection', value: 'desc' }, @@ -818,6 +847,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [], }, { @@ -829,6 +859,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'hideLabel', @@ -908,6 +939,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [], }, { @@ -919,6 +951,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [], }, { @@ -930,6 +963,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [ { alias: 'step', @@ -946,6 +980,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [], }, { @@ -957,6 +992,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [], }, { @@ -968,6 +1004,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [], }, { @@ -979,6 +1016,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [], }, { @@ -990,6 +1028,7 @@ export const data: Array = [ hasChildren: false, isFolder: false, isDeletable: true, + canIgnoreStartNodes: false, values: [], }, ]; From e5183151f82badf1eb87de388a557a8abb186942 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 23 Feb 2024 10:18:50 +0100 Subject: [PATCH 65/85] more mock updates --- .../src/mocks/data/data-type/data-type.db.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.db.ts index ea4a7251d7..468a194c24 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.db.ts @@ -34,6 +34,7 @@ const createFolderMockMapper = (request: CreateFolderRequestModel): UmbMockDataT hasChildren: false, editorAlias: '', isDeletable: true, + canIgnoreStartNodes: false, values: [], }; }; @@ -46,6 +47,7 @@ const createDetailMockMapper = (request: CreateDataTypeRequestModel): UmbMockDat editorAlias: request.editorAlias, editorUiAlias: request.editorUiAlias, values: request.values, + canIgnoreStartNodes: false, isFolder: false, hasChildren: false, isDeletable: true, @@ -61,6 +63,7 @@ const detailResponseMapper = (item: UmbMockDataTypeModel): DataTypeResponseModel editorUiAlias: item.editorUiAlias, values: item.values, isDeletable: item.isDeletable, + canIgnoreStartNodes: item.canIgnoreStartNodes, }; }; From 57b8da00edad011389a3165ba95970c106a6b6bd Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 23 Feb 2024 10:27:33 +0100 Subject: [PATCH 66/85] fix type errors --- .../document-granular-user-permission.element.ts | 3 +-- .../src/packages/user/current-user/types.ts | 5 +---- .../repository/user-group-collection.server.data-source.ts | 1 + .../detail/user-group-detail.server.data-source.ts | 3 +++ .../src/packages/user/user-group/types.ts | 4 ++-- .../user-permission/conditions/user-permission.condition.ts | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts index 0349d1d17b..e5a8d6af5a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts @@ -86,7 +86,6 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { this.#documentPickerModalContext?.reject(); const permissionItem: UmbDocumentUserPermissionModel = { - id: UmbId.new(), $type: 'DocumentPermissionPresentationModel', document: { id: unique }, verbs: result, @@ -135,7 +134,7 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { const permission = this.#getPermissionForDocument(item.unique); if (!permission) return; - this.value = this._value.filter((p) => p.id !== permission.id); + this.value = this._value.filter((v) => JSON.stringify(v) !== JSON.stringify(permission)); this.dispatchEvent(new UmbChangeEvent()); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/types.ts index 9ecef4e1ce..0366531977 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/types.ts @@ -1,6 +1,5 @@ import type { DocumentPermissionPresentationModel, - FallbackPermissionPresentationModel, UnknownTypePermissionPresentationModel, } from '@umbraco-cms/backoffice/external/backend-api'; @@ -15,7 +14,5 @@ export interface UmbCurrentUserModel { avatarUrls: Array; languages: Array; hasAccessToAllLanguages: boolean; - permissions: Array< - DocumentPermissionPresentationModel | FallbackPermissionPresentationModel | UnknownTypePermissionPresentationModel - >; + permissions: Array; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts index 1fde909b47..71e501b93f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts @@ -45,6 +45,7 @@ export class UmbUserGroupCollectionServerDataSource implements UmbCollectionData documentRootAccess: item.documentRootAccess, mediaStartNode: item.mediaStartNode ? { unique: item.mediaStartNode.id } : null, mediaRootAccess: item.mediaRootAccess, + fallbackPermissions: item.fallbackPermissions, permissions: item.permissions, }; return userGroup; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts index b5db6daca1..5a118326e4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts @@ -48,6 +48,7 @@ export class UmbUserGroupServerDataSource implements UmbDetailDataSource; - permissions: Array; + // TODO: add type + permissions: Array; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/conditions/user-permission.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/conditions/user-permission.condition.ts index b5329783c5..ab10e73edc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/conditions/user-permission.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/conditions/user-permission.condition.ts @@ -21,7 +21,7 @@ export class UmbUserPermissionCondition extends UmbBaseController implements Umb this.observe( context.currentUser, (currentUser) => { - this.permitted = currentUser?.permissions?.includes(this.config.match) || false; + //this.permitted = currentUser?.permissions?.includes(this.config.match) || false; this.#onChange(); }, 'umbUserPermissionConditionObserver', From 790894a1d3c684c52952aa397005ffac2e47faa3 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 23 Feb 2024 13:46:13 +0100 Subject: [PATCH 67/85] add data helpers --- .../workspace/user-group-workspace.context.ts | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts index 125ea8b5da..becbcfcc41 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts @@ -18,6 +18,18 @@ export class UmbUserGroupWorkspaceContext #data = new UmbObjectState(undefined); data = this.#data.asObservable(); + readonly name = this.#data.asObservablePart((data) => data?.name || ''); + readonly icon = this.#data.asObservablePart((data) => data?.icon || null); + readonly sections = this.#data.asObservablePart((data) => data?.sections || []); + readonly languages = this.#data.asObservablePart((data) => data?.languages || []); + readonly hasAccessToAllLanguages = this.#data.asObservablePart((data) => data?.hasAccessToAllLanguages || false); + readonly documentStartNode = this.#data.asObservablePart((data) => data?.documentStartNode || null); + readonly documentRootAccess = this.#data.asObservablePart((data) => data?.documentRootAccess || false); + readonly mediaStartNode = this.#data.asObservablePart((data) => data?.mediaStartNode || null); + readonly mediaRootAccess = this.#data.asObservablePart((data) => data?.mediaRootAccess || false); + readonly fallbackPermissions = this.#data.asObservablePart((data) => data?.fallbackPermissions || []); + readonly permissions = this.#data.asObservablePart((data) => data?.permissions || []); + #userUniques = new UmbArrayState([], (x) => x); userUniques = this.#userUniques.asObservable(); @@ -115,6 +127,23 @@ export class UmbUserGroupWorkspaceContext setPermissions(permissions: Array) { this.#data.update({ permissions: permissions }); } + + /** + * Gets the user group fallback permissions. + * @memberof UmbUserGroupWorkspaceContext + */ + getFallbackPermissions() { + return this.#data.getValue()?.fallbackPermissions ?? []; + } + + /** + * Sets the user group fallback permissions. + * @param {Array} fallbackPermissions + * @memberof UmbUserGroupWorkspaceContext + */ + setFallbackPermissions(fallbackPermissions: Array) { + this.#data.update({ fallbackPermissions }); + } } export const UMB_USER_GROUP_WORKSPACE_CONTEXT = new UmbContextToken< From 8efaf8e2f8334a09f512ab0d98a4efac436e77d7 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 23 Feb 2024 13:47:38 +0100 Subject: [PATCH 68/85] wire up new fallbackPermission model --- ...oup-entity-user-permission-list.element.ts | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-entity-user-permission-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-entity-user-permission-list.element.ts index dbbce9b817..2ace678426 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-entity-user-permission-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-entity-user-permission-list.element.ts @@ -8,7 +8,7 @@ import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registr @customElement('umb-user-group-entity-user-permission-list') export class UmbUserGroupEntityUserPermissionListElement extends UmbLitElement { @state() - private _allowedVerbs?: Array; + private _fallBackPermissions?: Array; @state() private _entityTypes: Array = []; @@ -23,15 +23,9 @@ export class UmbUserGroupEntityUserPermissionListElement extends UmbLitElement { this.consumeContext(UMB_USER_GROUP_WORKSPACE_CONTEXT, (instance) => { this.#userGroupWorkspaceContext = instance; this.observe( - this.#userGroupWorkspaceContext.data, - (userGroup) => { - const allAllowedVerbs = - userGroup?.permissions - .filter((permission) => permission.$type === 'FallbackPermissionPresentationModel') - .flatMap((permission) => permission.verbs) || []; - - // make a unique list of allowed verbs - this._allowedVerbs = [...new Set(allAllowedVerbs)]; + this.#userGroupWorkspaceContext.fallbackPermissions, + (fallbackPermissions) => { + this._fallBackPermissions = fallbackPermissions; }, 'umbUserGroupEntityUserPermissionsObserver', ); @@ -50,9 +44,9 @@ export class UmbUserGroupEntityUserPermissionListElement extends UmbLitElement { #onSelectedUserPermission(event: UmbSelectionChangeEvent) { const target = event.target as any; - const selection = target.allowedVerbs; - debugger; - //this.#userGroupWorkspaceContext?.setPermissions(selection); + const verbs = target.allowedVerbs; + if (verbs === undefined || verbs === null) throw new Error('The verbs are not defined'); + this.#userGroupWorkspaceContext?.setFallbackPermissions(verbs); } render() { @@ -64,7 +58,7 @@ export class UmbUserGroupEntityUserPermissionListElement extends UmbLitElement {

${entityType}

`; } From f976c687ac035b327a75e9c6c4cfbb85b9539435 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 23 Feb 2024 14:03:37 +0100 Subject: [PATCH 69/85] move component --- .../src/packages/user/user-permission/components/index.ts | 2 ++ .../user-permission-setting/user-permission-setting.element.ts | 0 .../src/packages/user/user/components/index.ts | 3 +-- 3 files changed, 3 insertions(+), 2 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/user/{user => user-permission}/components/user-permission-setting/user-permission-setting.element.ts (100%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/index.ts index 782bc56df3..1a4c241057 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/index.ts @@ -1,3 +1,5 @@ import './entity-user-permission-settings-list/entity-user-permission-settings-list.element.js'; +import './user-permission-setting/user-permission-setting.element.js'; export * from './entity-user-permission-settings-list/entity-user-permission-settings-list.element.js'; +export * from './user-permission-setting/user-permission-setting.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-permission-setting/user-permission-setting.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/user-permission-setting/user-permission-setting.element.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/user/user/components/user-permission-setting/user-permission-setting.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/user-permission-setting/user-permission-setting.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/components/index.ts index 59a54593ec..113850b9a0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/components/index.ts @@ -1,7 +1,6 @@ import './user-input/user-input.element.js'; -import './user-permission-setting/user-permission-setting.element.js'; import './user-document-start-node/user-document-start-node.element.js'; import './user-media-start-node/user-media-start-node.element.js'; export * from './user-input/user-input.element.js'; -export * from './user-permission-setting/user-permission-setting.element.js'; +export * from '../../user-permission/components/user-permission-setting/user-permission-setting.element.js'; From f1d1837185369a4906793a3b3ca884f3a54726c8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 23 Feb 2024 23:15:40 +0100 Subject: [PATCH 70/85] render granular in a property layout --- ....model.ts => entity-user-permission.model.ts} | 0 .../core/extension-registry/models/index.ts | 4 ++-- .../models/user-granular-permission.model.ts | 4 ++++ .../documents/user-permissions/manifests.ts | 2 ++ ...ser-group-granular-permission-list.element.ts | 16 +++++++++++++++- 5 files changed, 23 insertions(+), 3 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/{user-permission.model.ts => entity-user-permission.model.ts} (100%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-user-permission.model.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-permission.model.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-user-permission.model.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts index b01f3efe3b..d8dcd66155 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts @@ -32,7 +32,7 @@ import type { ManifestWorkspaceAction } from './workspace-action.model.js'; import type { ManifestWorkspaceContext } from './workspace-context.model.js'; import type { ManifestWorkspaceFooterApp } from './workspace-footer-app.model.js'; import type { ManifestWorkspaceView } from './workspace-view.model.js'; -import type { ManifestEntityUserPermission } from './user-permission.model.js'; +import type { ManifestEntityUserPermission } from './entity-user-permission.model.js'; import type { ManifestGranularUserPermission } from './user-granular-permission.model.js'; import type { ManifestCollectionAction } from './collection-action.model.js'; import type { @@ -72,7 +72,7 @@ export type * from './tinymce-plugin.model.js'; export type * from './tree-item.model.js'; export type * from './tree.model.js'; export type * from './user-granular-permission.model.js'; -export type * from './user-permission.model.js'; +export type * from './entity-user-permission.model.js'; export type * from './user-profile-app.model.js'; export type * from './workspace-action.model.js'; export type * from './workspace-context.model.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-granular-permission.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-granular-permission.model.ts index 1bfbf6e455..e70b2caac2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-granular-permission.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/user-granular-permission.model.ts @@ -7,4 +7,8 @@ export interface ManifestGranularUserPermission extends ManifestElement { export interface MetaGranularUserPermission { schemaType: string; + label?: string; + labelKey?: string; + description?: string; + descriptionKey?: string; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts index 14c4c780f8..f2441212db 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts @@ -204,6 +204,8 @@ export const granularPermissions: Array = [ element: () => import('./document-granular-user-permission/document-granular-user-permission.element.js'), meta: { schemaType: 'DocumentPermissionPresentationModel', + label: 'Documents', + description: 'Assign permissions to specific documents', }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts index a1a828565d..6df5b05c9d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts @@ -83,7 +83,21 @@ export class UmbUserGroupGranularPermissionListElement extends UmbLitElement { }; render() { - return html`${this._extensionElements.map((element) => html`${element}`)}`; + return html`${this._extensionElements.map((element) => this.#renderProperty(element))}`; + } + + #renderProperty(element: any) { + const manifest = element.manifest as ManifestGranularUserPermission; + const label = manifest.meta.labelKey ? this.localize.term(manifest.meta.labelKey) : manifest.meta.label; + const description = manifest.meta.descriptionKey + ? this.localize.term(manifest.meta.descriptionKey) + : manifest.meta.description; + + return html` + +
${element}
+
+ `; } disconnectedCallback(): void { From 04faaa7bc33130a893278567ce09e2b44c83d8d6 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 23 Feb 2024 23:20:51 +0100 Subject: [PATCH 71/85] render en property layout --- .../workspace/user-group-workspace-editor.element.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts index 9bcb7a29dc..ceb0247712 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts @@ -138,7 +138,10 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement {
- + + + +
From 00569990be27d9047a3e80d99e99cecd4a66847a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sun, 25 Feb 2024 21:09:16 +0100 Subject: [PATCH 72/85] Update CurrentUserResponseModel.ts --- .../external/backend-api/src/models/CurrentUserResponseModel.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts index 5202fb7a88..cdbbf941b8 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts @@ -17,6 +17,7 @@ export type CurrentUserResponseModel = { avatarUrls: Array; languages: Array; hasAccessToAllLanguages: boolean; + fallbackPermissions: Array; permissions: Array<(DocumentPermissionPresentationModel | UnknownTypePermissionPresentationModel)>; }; From 9e4a5bdbe7ed3e59cf19c7af56f31e6e3ac1afe5 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 26 Feb 2024 12:02:15 +0100 Subject: [PATCH 73/85] name as input --- .../user-group-entity-user-permission-list.element.ts | 6 +++--- .../packages/user/user-permission/components/index.ts | 4 ++-- .../input-entity-user-permission.element.ts} | 9 ++++----- .../entity-user-permission-settings-modal.element.ts | 4 ++-- 4 files changed, 11 insertions(+), 12 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/{entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts => input-entity-user-permission/input-entity-user-permission.element.ts} (91%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-entity-user-permission-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-entity-user-permission-list.element.ts index 2ace678426..4749b92bb0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-entity-user-permission-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-entity-user-permission-list.element.ts @@ -1,7 +1,7 @@ +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UMB_USER_GROUP_WORKSPACE_CONTEXT } from '../user-group-workspace.context.js'; import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -56,10 +56,10 @@ export class UmbUserGroupEntityUserPermissionListElement extends UmbLitElement { #renderPermissionsByEntityType(entityType: string) { return html`

${entityType}

- + @selection-change=${this.#onSelectedUserPermission}> `; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/index.ts index 1a4c241057..8eb0d0a8d0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/index.ts @@ -1,5 +1,5 @@ -import './entity-user-permission-settings-list/entity-user-permission-settings-list.element.js'; +import './input-entity-user-permission/input-entity-user-permission.element.js'; import './user-permission-setting/user-permission-setting.element.js'; -export * from './entity-user-permission-settings-list/entity-user-permission-settings-list.element.js'; +export * from './input-entity-user-permission/input-entity-user-permission.element.js'; export * from './user-permission-setting/user-permission-setting.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.ts similarity index 91% rename from src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.ts index 8e9edb7c45..c6c72c9db2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/entity-user-permission-settings-list/entity-user-permission-settings-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.ts @@ -1,4 +1,3 @@ -import type { UmbUserPermissionModel } from '../../types.js'; import type { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; import { UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; import type { ManifestEntityUserPermission } from '@umbraco-cms/backoffice/extension-registry'; @@ -8,8 +7,8 @@ import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-a import type { UmbUserPermissionSettingElement } from '@umbraco-cms/backoffice/user'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -@customElement('umb-entity-user-permission-settings-list') -export class UmbEntityUserPermissionSettingsListElement extends UmbLitElement { +@customElement('umb-input-entity-user-permission') +export class UmbInputEntityUserPermissionElement extends UmbLitElement { @property({ type: String, attribute: 'entity-type' }) public get entityType(): string { return this._entityType; @@ -104,10 +103,10 @@ export class UmbEntityUserPermissionSettingsListElement extends UmbLitElement { } } -export default UmbEntityUserPermissionSettingsListElement; +export default UmbInputEntityUserPermissionElement; declare global { interface HTMLElementTagNameMap { - 'umb-entity-user-permission-settings-list': UmbEntityUserPermissionSettingsListElement; + 'umb-input-entity-user-permission': UmbInputEntityUserPermissionElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts index 7b7e1f9bdf..4e5dc89a2a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts @@ -34,10 +34,10 @@ export class UmbEntityUserPermissionSettingsModalElement extends UmbModalBaseEle ${this._entityType - ? html` ` + @selection-change=${this.#onSelectedUserPermission}>` : nothing} From ecc2c2e2a2a9967c0031f53cc4bec83161f92bbd Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 26 Feb 2024 12:44:17 +0100 Subject: [PATCH 74/85] dispatch change event --- ...er-group-entity-user-permission-list.element.ts | 5 +++-- .../input-entity-user-permission.element.ts | 14 +++++++++----- ...ntity-user-permission-settings-modal.element.ts | 6 +++--- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-entity-user-permission-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-entity-user-permission-list.element.ts index 4749b92bb0..9b30e8c4fa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-entity-user-permission-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-entity-user-permission-list.element.ts @@ -42,7 +42,8 @@ export class UmbUserGroupEntityUserPermissionListElement extends UmbLitElement { ); } - #onSelectedUserPermission(event: UmbSelectionChangeEvent) { + #onPermissionChange(event: UmbSelectionChangeEvent) { + event.stopPropagation(); const target = event.target as any; const verbs = target.allowedVerbs; if (verbs === undefined || verbs === null) throw new Error('The verbs are not defined'); @@ -59,7 +60,7 @@ export class UmbUserGroupEntityUserPermissionListElement extends UmbLitElement { + @change=${this.#onPermissionChange}> `; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.ts index c6c72c9db2..db350d2b06 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.ts @@ -1,14 +1,14 @@ -import type { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; -import { UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; +import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; import type { ManifestEntityUserPermission } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { html, customElement, property, state, nothing, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; import type { UmbUserPermissionSettingElement } from '@umbraco-cms/backoffice/user'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; @customElement('umb-input-entity-user-permission') -export class UmbInputEntityUserPermissionElement extends UmbLitElement { +export class UmbInputEntityUserPermissionElement extends FormControlMixin(UmbLitElement) { @property({ type: String, attribute: 'entity-type' }) public get entityType(): string { return this._entityType; @@ -28,6 +28,10 @@ export class UmbInputEntityUserPermissionElement extends UmbLitElement { #manifestObserver?: UmbObserverController>; + protected getFormElement() { + return undefined; + } + #isAllowed(permissionVerbs: Array) { return permissionVerbs.every((verb) => this.allowedVerbs.includes(verb)); } @@ -54,12 +58,12 @@ export class UmbInputEntityUserPermissionElement extends UmbLitElement { const verbs = [...this.allowedVerbs, ...permissionVerbs]; // ensure we only have unique verbs this.allowedVerbs = [...new Set(verbs)]; - this.dispatchEvent(new UmbSelectionChangeEvent()); + this.dispatchEvent(new UmbChangeEvent()); } #removeUserPermission(permissionVerbs: Array) { this.allowedVerbs = this.allowedVerbs.filter((p) => !permissionVerbs.includes(p)); - this.dispatchEvent(new UmbSelectionChangeEvent()); + this.dispatchEvent(new UmbChangeEvent()); } render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts index 4e5dc89a2a..9192d0dce4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/modals/entity-user-permission-settings/entity-user-permission-settings-modal.element.ts @@ -1,5 +1,5 @@ -import { html, customElement, css, nothing, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { html, customElement, css, nothing, state } from '@umbraco-cms/backoffice/external/lit'; import type { UmbEntityUserPermissionSettingsModalData, UmbEntityUserPermissionSettingsModalValue, @@ -24,7 +24,7 @@ export class UmbEntityUserPermissionSettingsModalElement extends UmbModalBaseEle @state() _entityType?: string; - #onSelectedUserPermission(event: UmbSelectionChangeEvent) { + #onPermissionChange(event: UmbSelectionChangeEvent) { const target = event.target as any; this.updateValue({ allowedVerbs: target.allowedVerbs }); } @@ -37,7 +37,7 @@ export class UmbEntityUserPermissionSettingsModalElement extends UmbModalBaseEle ? html` ` + @change=${this.#onPermissionChange}>` : nothing}
From c910c7931dbd18f2124d58b6a7c63e5936302702 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 26 Feb 2024 12:46:40 +0100 Subject: [PATCH 75/85] update name --- .../packages/user/user-permission/components/index.ts | 4 ++-- .../input-entity-user-permission.element.ts | 8 ++++---- .../input-user-permission-verb.element.ts} | 10 +++++----- .../src/packages/user/user/components/index.ts | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/{user-permission-setting/user-permission-setting.element.ts => input-user-permission-verb/input-user-permission-verb.element.ts} (86%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/index.ts index 8eb0d0a8d0..70730115a2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/index.ts @@ -1,5 +1,5 @@ import './input-entity-user-permission/input-entity-user-permission.element.js'; -import './user-permission-setting/user-permission-setting.element.js'; +import './input-user-permission-verb/input-user-permission-verb.element.js'; export * from './input-entity-user-permission/input-entity-user-permission.element.js'; -export * from './user-permission-setting/user-permission-setting.element.js'; +export * from './input-user-permission-verb/input-user-permission-verb.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.ts index db350d2b06..75697d1a24 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.ts @@ -3,7 +3,7 @@ import type { ManifestEntityUserPermission } from '@umbraco-cms/backoffice/exten import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { html, customElement, property, state, nothing, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; -import type { UmbUserPermissionSettingElement } from '@umbraco-cms/backoffice/user'; +import type { UmbUserPermissionVerbElement } from '@umbraco-cms/backoffice/user'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; @@ -50,7 +50,7 @@ export class UmbInputEntityUserPermissionElement extends FormControlMixin(UmbLit #onChangeUserPermission(event: UmbChangeEvent, permissionVerbs: Array) { event.stopPropagation(); - const target = event.target as UmbUserPermissionSettingElement; + const target = event.target as UmbUserPermissionVerbElement; target.allowed ? this.#addUserPermission(permissionVerbs) : this.#removeUserPermission(permissionVerbs); } @@ -91,14 +91,14 @@ export class UmbInputEntityUserPermissionElement extends FormControlMixin(UmbLit } #renderPermission(manifest: ManifestEntityUserPermission) { - return html` - this.#onChangeUserPermission(event, manifest.meta.verbs)}>`; + this.#onChangeUserPermission(event, manifest.meta.verbs)}>`; } disconnectedCallback() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/user-permission-setting/user-permission-setting.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-user-permission-verb/input-user-permission-verb.element.ts similarity index 86% rename from src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/user-permission-setting/user-permission-setting.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-user-permission-verb/input-user-permission-verb.element.ts index 01c173edbc..a0c7c4c24c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/user-permission-setting/user-permission-setting.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-user-permission-verb/input-user-permission-verb.element.ts @@ -1,11 +1,11 @@ +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UUIBooleanInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; -@customElement('umb-user-permission-setting') -export class UmbUserPermissionSettingElement extends UmbLitElement { +@customElement('umb-input-user-permission-verb') +export class UmbUserPermissionVerbElement extends UmbLitElement { @property({ type: String, attribute: true }) label: string = ''; @@ -54,10 +54,10 @@ export class UmbUserPermissionSettingElement extends UmbLitElement { ]; } -export default UmbUserPermissionSettingElement; +export default UmbUserPermissionVerbElement; declare global { interface HTMLElementTagNameMap { - 'umb-user-permission-setting': UmbUserPermissionSettingElement; + 'umb-input-user-permission-verb': UmbUserPermissionVerbElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/components/index.ts index 113850b9a0..416c579290 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/components/index.ts @@ -3,4 +3,4 @@ import './user-document-start-node/user-document-start-node.element.js'; import './user-media-start-node/user-media-start-node.element.js'; export * from './user-input/user-input.element.js'; -export * from '../../user-permission/components/user-permission-setting/user-permission-setting.element.js'; +export * from '../../user-permission/components/input-user-permission-verb/input-user-permission-verb.element.js'; From 8b6431beb2d55d657e3d62c2e7ca0953b996293d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 26 Feb 2024 12:49:15 +0100 Subject: [PATCH 76/85] update mock --- src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts index e12caf1687..66759eea20 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts @@ -64,6 +64,7 @@ class UmbUserMockDB extends UmbEntityMockDbBase { languages: [], documentStartNodeIds: firstUser.documentStartNodeIds, mediaStartNodeIds: firstUser.mediaStartNodeIds, + fallbackPermissions: [], permissions, }; } From 574589a5b222aadd215c6585877989a7c4bd9eaf Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 26 Feb 2024 13:09:07 +0100 Subject: [PATCH 77/85] use input in name --- .../input-document-granular-user-permission.element.ts} | 9 ++++----- .../documents/documents/user-permissions/manifests.ts | 3 ++- 2 files changed, 6 insertions(+), 6 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/{document-granular-user-permission/document-granular-user-permission.element.ts => input-document-granular-user-permission/input-document-granular-user-permission.element.ts} (95%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts similarity index 95% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts index e5a8d6af5a..62b0d51e47 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-granular-user-permission/document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts @@ -12,10 +12,9 @@ import type { UmbDeselectedEvent } from '@umbraco-cms/backoffice/event'; import { UmbChangeEvent, UmbSelectedEvent } from '@umbraco-cms/backoffice/event'; import type { ManifestEntityUserPermission } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -import { UmbId } from '@umbraco-cms/backoffice/id'; -@customElement('umb-document-granular-user-permission') -export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { +@customElement('umb-input-document-granular-user-permission') +export class UmbInputDocumentGranularUserPermissionElement extends UmbLitElement { _value: Array = []; public get value(): Array { return this._value; @@ -238,10 +237,10 @@ export class UmbDocumentGranularUserPermissionElement extends UmbLitElement { ]; } -export default UmbDocumentGranularUserPermissionElement; +export default UmbInputDocumentGranularUserPermissionElement; declare global { interface HTMLElementTagNameMap { - 'umb-document-granular-user-permission': UmbDocumentGranularUserPermissionElement; + 'umb-document-granular-user-permission': UmbInputDocumentGranularUserPermissionElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts index f2441212db..e4fdbff634 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts @@ -201,7 +201,8 @@ export const granularPermissions: Array = [ type: 'userGranularPermission', alias: 'Umb.UserGranularPermission.Document', name: 'Document Granular User Permission', - element: () => import('./document-granular-user-permission/document-granular-user-permission.element.js'), + element: () => + import('./input-document-granular-user-permission/input-document-granular-user-permission.element.js'), meta: { schemaType: 'DocumentPermissionPresentationModel', label: 'Documents', From 1d064889c0ddb8574780cede6353565efece0685 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 26 Feb 2024 13:22:03 +0100 Subject: [PATCH 78/85] extend form control --- ...cument-granular-user-permission.element.ts | 25 +++++++++++-------- ...-group-granular-permission-list.element.ts | 2 +- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts index 62b0d51e47..11e021d7f3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts @@ -12,15 +12,16 @@ import type { UmbDeselectedEvent } from '@umbraco-cms/backoffice/event'; import { UmbChangeEvent, UmbSelectedEvent } from '@umbraco-cms/backoffice/event'; import type { ManifestEntityUserPermission } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; @customElement('umb-input-document-granular-user-permission') -export class UmbInputDocumentGranularUserPermissionElement extends UmbLitElement { - _value: Array = []; - public get value(): Array { - return this._value; +export class UmbInputDocumentGranularUserPermissionElement extends FormControlMixin(UmbLitElement) { + _permissions: Array = []; + public get permissions(): Array { + return this._permissions; } - public set value(value: Array) { - this._value = value; + public set permissions(value: Array) { + this._permissions = value; const uniques = value.map((item) => item.document.id); this.#observePickedDocuments(uniques); } @@ -39,6 +40,10 @@ export class UmbInputDocumentGranularUserPermissionElement extends UmbLitElement this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => (this.#modalManagerContext = instance)); } + protected getFormElement() { + return undefined; + } + async #observePickedDocuments(uniques: Array) { const { asObservable } = await this.#documentItemRepository.requestItems(uniques); this.observe(asObservable(), (items) => (this._items = items)); @@ -51,7 +56,7 @@ export class UmbInputDocumentGranularUserPermissionElement extends UmbLitElement if (JSON.stringify(result) === JSON.stringify(currentPermissionVerbs)) return; // update permission with new verbs - this.value = this._value.map((permission) => { + this.permissions = this._permissions.map((permission) => { if (permission.document.id === item.unique) { return { ...permission, @@ -90,7 +95,7 @@ export class UmbInputDocumentGranularUserPermissionElement extends UmbLitElement verbs: result, }; - this.value = [...this._value, permissionItem]; + this.permissions = [...this._permissions, permissionItem]; this.dispatchEvent(new UmbChangeEvent()); }); } @@ -133,7 +138,7 @@ export class UmbInputDocumentGranularUserPermissionElement extends UmbLitElement const permission = this.#getPermissionForDocument(item.unique); if (!permission) return; - this.value = this._value.filter((v) => JSON.stringify(v) !== JSON.stringify(permission)); + this.permissions = this._permissions.filter((v) => JSON.stringify(v) !== JSON.stringify(permission)); this.dispatchEvent(new UmbChangeEvent()); } @@ -201,7 +206,7 @@ export class UmbInputDocumentGranularUserPermissionElement extends UmbLitElement } #getPermissionForDocument(unique: string) { - return this._value?.find((permission) => permission.document.id === unique); + return this._permissions?.find((permission) => permission.document.id === unique); } #getPermissionNamesForDocument(unique: string) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts index 6df5b05c9d..c22c7c131f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts @@ -49,7 +49,7 @@ export class UmbUserGroupGranularPermissionListElement extends UmbLitElement { const permissionsForSchemaType = userGroup.permissions.filter((permission) => permission.$type === schemaType) || []; - element.value = permissionsForSchemaType; + element.permissions = permissionsForSchemaType; element.manifest = manifest; element.addEventListener(UmbChangeEvent.TYPE, this.#onValueChange); }, From ccbd3b3c1c4f3bf20d118d301f27185fb2403cb9 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 26 Feb 2024 14:50:44 +0100 Subject: [PATCH 79/85] get correct value prop --- .../user-group-granular-permission-list.element.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts index c22c7c131f..d367f19ed0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts @@ -53,7 +53,7 @@ export class UmbUserGroupGranularPermissionListElement extends UmbLitElement { element.manifest = manifest; element.addEventListener(UmbChangeEvent.TYPE, this.#onValueChange); }, - 'umbUserGroupPermissionObserver', + 'umbUserGroupGranularPermissionObserver', ); this._extensionElements.push(element); @@ -76,8 +76,8 @@ export class UmbUserGroupGranularPermissionListElement extends UmbLitElement { (x) => x.$type !== schemaType, ); - const value = target.value || []; - const newCombinedValue = [...storedValueWithoutSchemaTypeItems, ...value]; + const permissions = target.permissions || []; + const newCombinedValue = [...storedValueWithoutSchemaTypeItems, ...permissions]; this.#workspaceContext?.setPermissions(newCombinedValue); }; From 664b9042bb150b8b700b7dab61155a3d8cd6252c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 26 Feb 2024 14:54:11 +0100 Subject: [PATCH 80/85] Update data-type.db.ts --- .../src/mocks/data/data-type/data-type.db.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.db.ts index 318e32c0ad..468a194c24 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/data-type/data-type.db.ts @@ -51,7 +51,6 @@ const createDetailMockMapper = (request: CreateDataTypeRequestModel): UmbMockDat isFolder: false, hasChildren: false, isDeletable: true, - canIgnoreStartNodes: false, }; }; From 552394814a0d2a26810b77bcec57fe4e7c041d2d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 26 Feb 2024 16:19:35 +0100 Subject: [PATCH 81/85] add fallbackPermissions to current user model --- .../current-user/repository/current-user.server.data-source.ts | 1 + .../src/packages/user/current-user/types.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/repository/current-user.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/repository/current-user.server.data-source.ts index 5038b01a3e..4493a27a86 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/repository/current-user.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/repository/current-user.server.data-source.ts @@ -40,6 +40,7 @@ export class UmbCurrentUserServerDataSource { avatarUrls: data.avatarUrls, languages: data.languages, hasAccessToAllLanguages: data.hasAccessToAllLanguages, + fallbackPermissions: data.fallbackPermissions, permissions: data.permissions, }; return { data: user }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/types.ts index 0366531977..788b669d5c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/types.ts @@ -14,5 +14,6 @@ export interface UmbCurrentUserModel { avatarUrls: Array; languages: Array; hasAccessToAllLanguages: boolean; + fallbackPermissions: Array; permissions: Array; } From def6a3e0e74911037b7794adfaee62d7f4bcddb6 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 09:17:40 +0100 Subject: [PATCH 82/85] generate new server models --- .../src/external/backend-api/src/index.ts | 1 - .../src/models/CurrentUserResponseModel.ts | 1 + .../TemporaryFileConfigurationResponseModel.ts | 12 ------------ .../src/services/TemporaryFileResource.ts | 3 +-- 4 files changed, 2 insertions(+), 15 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemporaryFileConfigurationResponseModel.ts diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts index ddedf43e1a..d03abff57c 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts @@ -362,7 +362,6 @@ export type { TemplateQueryResultItemPresentationModel } from './models/Template export type { TemplateQueryResultResponseModel } from './models/TemplateQueryResultResponseModel'; export type { TemplateQuerySettingsResponseModel } from './models/TemplateQuerySettingsResponseModel'; export type { TemplateResponseModel } from './models/TemplateResponseModel'; -export type { TemporaryFileConfigurationResponseModel } from './models/TemporaryFileConfigurationResponseModel'; export type { TemporaryFileResponseModel } from './models/TemporaryFileResponseModel'; export type { TourStatusModel } from './models/TourStatusModel'; export type { TreeItemPresentationModel } from './models/TreeItemPresentationModel'; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts index cdbbf941b8..986c653af0 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts @@ -19,5 +19,6 @@ export type CurrentUserResponseModel = { hasAccessToAllLanguages: boolean; fallbackPermissions: Array; permissions: Array<(DocumentPermissionPresentationModel | UnknownTypePermissionPresentationModel)>; + allowedSections: Array; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemporaryFileConfigurationResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemporaryFileConfigurationResponseModel.ts deleted file mode 100644 index e9c57080fd..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemporaryFileConfigurationResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type TemporaryFileConfigurationResponseModel = { - imageFileTypes: Array; - disallowedUploadedFilesExtensions: Array; - allowedUploadedFileExtensions: Array; - maxFileSize?: number | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TemporaryFileResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TemporaryFileResource.ts index c78ba660da..848076b99a 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TemporaryFileResource.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TemporaryFileResource.ts @@ -2,7 +2,6 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { TemporaryFileConfigurationResponseModel } from '../models/TemporaryFileConfigurationResponseModel'; import type { TemporaryFileResponseModel } from '../models/TemporaryFileResponseModel'; import type { CancelablePromise } from '../core/CancelablePromise'; @@ -86,7 +85,7 @@ export class TemporaryFileResource { * @returns any Success * @throws ApiError */ - public static getTemporaryFileConfiguration(): CancelablePromise { + public static getTemporaryFileConfiguration(): CancelablePromise { return __request(OpenAPI, { method: 'GET', url: '/umbraco/management/api/v1/temporary-file/configuration', From 46009a0e26012f9b09ab50a45475562d1c836b86 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 09:19:55 +0100 Subject: [PATCH 83/85] add to model --- src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts index 66759eea20..0493571cf9 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts @@ -66,6 +66,7 @@ class UmbUserMockDB extends UmbEntityMockDbBase { mediaStartNodeIds: firstUser.mediaStartNodeIds, fallbackPermissions: [], permissions, + allowedSections: [], }; } From 260f23f5bbcb7a8fc58bbca43c0a465f5ed54007 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 27 Feb 2024 09:21:49 +0100 Subject: [PATCH 84/85] clean up --- .../user/current-user/utils/is-current-user.function.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/utils/is-current-user.function.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/utils/is-current-user.function.ts index 12ed90a23c..2c06760c8a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/utils/is-current-user.function.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/utils/is-current-user.function.ts @@ -5,9 +5,13 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export const isCurrentUser = async (host: UmbControllerHost, userId: string) => { let currentUserContext: typeof UMB_CURRENT_USER_CONTEXT.TYPE | undefined; - await new UmbContextConsumerController(host, UMB_CURRENT_USER_CONTEXT, (context) => { + const controller = new UmbContextConsumerController(host, UMB_CURRENT_USER_CONTEXT, (context) => { currentUserContext = context; - }).asPromise(); + }); + + await controller.asPromise(); + + controller.destroy(); return await currentUserContext!.isUserCurrentUser(userId); }; From 58f330d5e4ab6ad496162507b90d46fed7e9f7dc Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 28 Feb 2024 22:31:35 +0100 Subject: [PATCH 85/85] fix types --- .../packages/core/utils/selection-manager/selection.manager.ts | 2 +- .../user/current-user/utils/is-current-user.function.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/selection-manager/selection.manager.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/selection-manager/selection.manager.ts index 44a54b057e..1d2a043c50 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/utils/selection-manager/selection.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/selection-manager/selection.manager.ts @@ -8,7 +8,7 @@ import { UmbArrayState, UmbBooleanState } from '@umbraco-cms/backoffice/observab * @export * @class UmbSelectionManager */ -export class UmbSelectionManager extends UmbBaseController { +export class UmbSelectionManager extends UmbBaseController { #selectable = new UmbBooleanState(false); public readonly selectable = this.#selectable.asObservable(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/utils/is-current-user.function.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/utils/is-current-user.function.ts index 1f8a9c2d65..820146e9a3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/utils/is-current-user.function.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/utils/is-current-user.function.ts @@ -4,7 +4,7 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export const isCurrentUser = async (host: UmbControllerHost, userUnique: string) => { const ctrl = new UmbContextConsumerController(host, UMB_CURRENT_USER_CONTEXT); - const currentUserContext = await ctrl.asPromise(); + let currentUserContext = await ctrl.asPromise(); ctrl.destroy(); const controller = new UmbContextConsumerController(host, UMB_CURRENT_USER_CONTEXT, (context) => {