diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts new file mode 100644 index 0000000000..b9b0d62a56 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts @@ -0,0 +1,91 @@ +import { UMB_ENTITY_CONTEXT } from '@umbraco-cms/backoffice/entity'; +import { UMB_CURRENT_USER_CONTEXT } from '../../../user/current-user/current-user.context.js'; +import { isDocumentUserPermission } from './utils.js'; +import { observeMultiple } from '@umbraco-cms/backoffice/observable-api'; +import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry'; +import type { + ManifestCondition, + UmbConditionConfigBase, + UmbConditionControllerArguments, + UmbExtensionCondition, +} from '@umbraco-cms/backoffice/extension-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { DocumentPermissionPresentationModel } from '@umbraco-cms/backoffice/external/backend-api'; + +export class UmbDocumentUserPermissionCondition + extends UmbConditionBase + implements UmbExtensionCondition +{ + #entityType: string | undefined; + #unique: string | null | undefined; + #documentPermissions: Array = []; + #fallbackPermissions: string[] = []; + + constructor( + host: UmbControllerHost, + args: UmbConditionControllerArguments, + ) { + super(host, args); + + this.consumeContext(UMB_CURRENT_USER_CONTEXT, (context) => { + this.observe( + context.currentUser, + (currentUser) => { + this.#documentPermissions = currentUser?.permissions?.filter(isDocumentUserPermission) || []; + this.#fallbackPermissions = currentUser?.fallbackPermissions || []; + this.#isAllowed(); + }, + 'umbUserPermissionConditionObserver', + ); + }); + + this.consumeContext(UMB_ENTITY_CONTEXT, (context) => { + if (!context) return; + + this.observe( + observeMultiple([context.entityType, context.unique]), + ([entityType, unique]) => { + this.#entityType = entityType; + this.#unique = unique; + this.#isAllowed(); + }, + 'umbUserPermissionEntityContextObserver', + ); + }); + } + + #isAllowed() { + if (!this.#entityType) return; + if (this.#unique === undefined) return; + + let verbs: Array = []; + + if (this.#documentPermissions) { + const permissionsForCurrentDocument = this.#documentPermissions.find( + (permission) => permission.document.id === this.#unique, + ); + const currentDocumentVerbs = permissionsForCurrentDocument ? permissionsForCurrentDocument.verbs : []; + verbs = this.#fallbackPermissions.concat(currentDocumentVerbs); + } + + this.permitted = verbs.includes(this.config.match); + } +} + +export type UmbDocumentUserPermissionConditionConfig = + UmbConditionConfigBase<'Umb.Condition.UserPermission.Document'> & { + /** + * + * + * @example + * "Umb.Document.Create" + */ + match: string; + }; + +export const manifest: ManifestCondition = { + type: 'condition', + name: 'Document User Permission Condition', + alias: 'Umb.Condition.UserPermission.Document', + api: UmbDocumentUserPermissionCondition, +}; 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 1fc1880cb9..be5dfcfca7 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 @@ -17,6 +17,7 @@ import { UMB_USER_PERMISSION_DOCUMENT_ROLLBACK, } from './constants.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; +import { manifest as conditionManifest } from './document-user-permission.condition.js'; import type { ManifestGranularUserPermission, ManifestEntityUserPermission, @@ -211,4 +212,4 @@ export const granularPermissions: Array = [ }, ]; -export const manifests = [...repositoryManifests, ...permissions, ...granularPermissions]; +export const manifests = [...repositoryManifests, ...permissions, ...granularPermissions, conditionManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/utils.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/utils.ts new file mode 100644 index 0000000000..f49a1d73eb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/utils.ts @@ -0,0 +1,10 @@ +import type { + DocumentPermissionPresentationModel, + UnknownTypePermissionPresentationModel, +} from '@umbraco-cms/backoffice/external/backend-api'; + +export function isDocumentUserPermission( + permission: DocumentPermissionPresentationModel | UnknownTypePermissionPresentationModel, +): permission is DocumentPermissionPresentationModel { + return (permission as DocumentPermissionPresentationModel).$type === 'DocumentPermissionPresentationModel'; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/conditions/index.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/conditions/index.ts deleted file mode 100644 index 64b786466c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/conditions/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './user-permission.condition.js'; 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 deleted file mode 100644 index b8074b9fdc..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/conditions/user-permission.condition.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { UMB_CURRENT_USER_CONTEXT } from '../../current-user/current-user.context.js'; -import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry'; -import type { - ManifestCondition, - UmbConditionConfigBase, - UmbConditionControllerArguments, - UmbExtensionCondition, -} from '@umbraco-cms/backoffice/extension-api'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; - -export class UmbUserPermissionCondition - extends UmbConditionBase - implements UmbExtensionCondition -{ - constructor(host: UmbControllerHost, args: UmbConditionControllerArguments) { - super(host, args); - - this.consumeContext(UMB_CURRENT_USER_CONTEXT, (context) => { - this.observe( - context.currentUser, - (currentUser) => { - //this.permitted = currentUser?.permissions?.includes(this.config.match) || false; - }, - 'umbUserPermissionConditionObserver', - ); - }); - } -} - -export type UserPermissionConditionConfig = UmbConditionConfigBase<'Umb.Condition.UserPermission'> & { - /** - * - * - * @example - * "Umb.UserPermission.Document.Create" - */ - match: string; -}; - -export const manifest: ManifestCondition = { - type: 'condition', - name: 'User Permission Condition', - alias: 'Umb.Condition.UserPermission', - api: UmbUserPermissionCondition, -}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/index.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/index.ts index 33baabfff8..85f5141999 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/index.ts @@ -1,4 +1,3 @@ export * from './components/index.js'; -export * from './conditions/index.js'; export type { UmbUserPermissionModel } from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/manifests.ts index 3cdcdd9998..93d3d11fab 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/manifests.ts @@ -1,4 +1,3 @@ -import { manifest as userPermissionConditionManifest } from './conditions/user-permission.condition.js'; import { manifests as userPermissionModalManifests } from './modals/manifests.js'; -export const manifests = [userPermissionConditionManifest, ...userPermissionModalManifests]; +export const manifests = [...userPermissionModalManifests];