add recycle bin conditions for media + document root access

This commit is contained in:
Mads Rasmussen
2024-05-10 13:51:58 +02:00
parent e22cfb7be0
commit ce016bf933
10 changed files with 106 additions and 25 deletions

View File

@@ -1,7 +1,10 @@
import type { UmbMenuItemElement } from '../interfaces/menu-item-element.interface.js';
import type { ManifestElement } from '@umbraco-cms/backoffice/extension-api';
import type { ConditionTypes } from '../conditions/types.js';
import type { ManifestWithDynamicConditions, ManifestElement } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestMenuItem extends ManifestElement<UmbMenuItemElement> {
export interface ManifestMenuItem
extends ManifestElement<UmbMenuItemElement>,
ManifestWithDynamicConditions<ConditionTypes> {
type: 'menuItem';
meta: MetaMenuItem;
}

View File

@@ -0,0 +1,25 @@
import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import type {
UmbConditionConfigBase,
UmbConditionControllerArguments,
UmbExtensionCondition,
} from '@umbraco-cms/backoffice/extension-api';
import { UMB_CURRENT_USER_CONTEXT } from '@umbraco-cms/backoffice/current-user';
export class UmbAllowDocumentRecycleBinCurrentUserCondition
extends UmbConditionBase<UmbConditionConfigBase>
implements UmbExtensionCondition
{
constructor(host: UmbControllerHost, args: UmbConditionControllerArguments<UmbConditionConfigBase>) {
super(host, args);
this.consumeContext(UMB_CURRENT_USER_CONTEXT, (context) => {
this.observe(context.hasDocumentRootAccess, (hasAccess) => {
this.permitted = hasAccess === true;
});
});
}
}
export { UmbAllowDocumentRecycleBinCurrentUserCondition as api };

View File

@@ -5,6 +5,12 @@ import { manifests as treeManifests } from './tree/manifests.js';
import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes> = [
{
type: 'condition',
name: 'Allow Document Recycle Bin Current User Condition',
alias: 'Umb.Condition.CurrentUser.AllowDocumentRecycleBin',
api: () => import('./allow-document-recycle-bin.condition.js'),
},
...entityActionManifests,
...menuItemManifests,
...repositoryManifests,

View File

@@ -14,6 +14,11 @@ const menuItem: ManifestMenuItemTreeKind = {
icon: 'icon-trash',
menus: [UMB_CONTENT_MENU_ALIAS],
},
conditions: [
{
alias: 'Umb.Condition.CurrentUser.AllowDocumentRecycleBin',
},
],
};
export const manifests: Array<ManifestTypes> = [menuItem];

View File

@@ -0,0 +1,25 @@
import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import type {
UmbConditionConfigBase,
UmbConditionControllerArguments,
UmbExtensionCondition,
} from '@umbraco-cms/backoffice/extension-api';
import { UMB_CURRENT_USER_CONTEXT } from '@umbraco-cms/backoffice/current-user';
export class UmbAllowMediaRecycleBinCurrentUserCondition
extends UmbConditionBase<UmbConditionConfigBase>
implements UmbExtensionCondition
{
constructor(host: UmbControllerHost, args: UmbConditionControllerArguments<UmbConditionConfigBase>) {
super(host, args);
this.consumeContext(UMB_CURRENT_USER_CONTEXT, (context) => {
this.observe(context.hasMediaRootAccess, (hasAccess) => {
this.permitted = hasAccess === true;
});
});
}
}
export { UmbAllowMediaRecycleBinCurrentUserCondition as api };

View File

@@ -5,6 +5,12 @@ import { manifests as treeManifests } from './tree/manifests.js';
import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes> = [
{
type: 'condition',
name: 'Allow Media Recycle Bin Current User Condition',
alias: 'Umb.Condition.CurrentUser.AllowMediaRecycleBin',
api: () => import('./allow-media-recycle-bin.condition.js'),
},
...entityActionManifests,
...menuItemManifests,
...repositoryManifests,

View File

@@ -14,6 +14,11 @@ const menuItem: ManifestMenuItemTreeKind = {
icon: 'icon-trash',
menus: [UMB_MEDIA_MENU_ALIAS],
},
conditions: [
{
alias: 'Umb.Condition.CurrentUser.AllowMediaRecycleBin',
},
],
};
export const manifests: Array<ManifestTypes> = [menuItem];

View File

@@ -14,6 +14,8 @@ export class UmbCurrentUserContext extends UmbContextBase<UmbCurrentUserContext>
readonly unique = this.#currentUser.asObservablePart((user) => user?.unique);
readonly languageIsoCode = this.#currentUser.asObservablePart((user) => user?.languageIsoCode);
readonly hasDocumentRootAccess = this.#currentUser.asObservablePart((user) => user?.hasDocumentRootAccess);
readonly hasMediaRootAccess = this.#currentUser.asObservablePart((user) => user?.hasMediaRootAccess);
#authContext?: typeof UMB_AUTH_CONTEXT.TYPE;
#currentUserRepository = new UmbCurrentUserRepository(this);

View File

@@ -30,20 +30,22 @@ export class UmbCurrentUserServerDataSource {
if (data) {
const user: UmbCurrentUserModel = {
unique: data.id,
email: data.email,
userName: data.userName,
name: data.name,
languageIsoCode: data.languageIsoCode || 'en-us', // TODO: make global variable
documentStartNodeUniques: data.documentStartNodeIds,
mediaStartNodeUniques: data.mediaStartNodeIds,
avatarUrls: data.avatarUrls,
languages: data.languages,
hasAccessToAllLanguages: data.hasAccessToAllLanguages,
fallbackPermissions: data.fallbackPermissions,
permissions: data.permissions,
allowedSections: data.allowedSections,
avatarUrls: data.avatarUrls,
documentStartNodeUniques: data.documentStartNodeIds,
email: data.email,
fallbackPermissions: data.fallbackPermissions,
hasAccessToAllLanguages: data.hasAccessToAllLanguages,
hasDocumentRootAccess: data.hasDocumentRootAccess,
hasMediaRootAccess: data.hasMediaRootAccess,
isAdmin: data.isAdmin,
languageIsoCode: data.languageIsoCode || 'en-us', // TODO: make global variable
languages: data.languages,
mediaStartNodeUniques: data.mediaStartNodeIds,
name: data.name,
permissions: data.permissions,
unique: data.id,
userName: data.userName,
};
return { data: user };
}

View File

@@ -7,20 +7,22 @@ import type {
} from '@umbraco-cms/backoffice/external/backend-api';
export interface UmbCurrentUserModel {
unique: string;
email: string;
userName: string;
name: string;
languageIsoCode: string;
documentStartNodeUniques: Array<string>;
mediaStartNodeUniques: Array<string>;
avatarUrls: Array<string>;
languages: Array<string>;
hasAccessToAllLanguages: boolean;
allowedSections: Array<string>;
avatarUrls: Array<string>;
documentStartNodeUniques: Array<string>;
email: string;
fallbackPermissions: Array<string>;
permissions: Array<DocumentPermissionPresentationModel | UnknownTypePermissionPresentationModel>;
hasAccessToAllLanguages: boolean;
hasDocumentRootAccess: boolean;
hasMediaRootAccess: boolean;
isAdmin: boolean;
languageIsoCode: string;
languages: Array<string>;
mediaStartNodeUniques: Array<string>;
name: string;
permissions: Array<DocumentPermissionPresentationModel | UnknownTypePermissionPresentationModel>;
unique: string;
userName: string;
}
export type UmbCurrentUserMfaProviderModel = UserTwoFactorProviderModel;