diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts index 9fc6117162b8..8f1dd94e7ef7 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts @@ -48,7 +48,7 @@ export default { notify: 'Notifications', protect: 'Public Access', publish: 'Publish', - refreshNode: 'Reload', + refreshNode: 'Reload children', remove: 'Remove', rename: 'Rename', republish: 'Republish entire site', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts index 83b6219a6fb8..5aefe450c291 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts @@ -48,7 +48,7 @@ export default { protect: 'Public Access', publish: 'Publish', readOnly: 'Read-only', - refreshNode: 'Reload', + refreshNode: 'Reload children', remove: 'Remove', rename: 'Rename', republish: 'Republish entire site', diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/constants.ts index d60c06800697..c6a840d16037 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/constants.ts @@ -1 +1,2 @@ export * from './common/constants.js'; +export * from './has-children/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/condition/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/condition/constants.ts new file mode 100644 index 000000000000..cdfbe5b0b33b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/condition/constants.ts @@ -0,0 +1 @@ +export const UMB_ENTITY_HAS_CHILDREN_CONDITION_ALIAS = 'Umb.Condition.EntityHasChildren'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/condition/entity-has-children.condition-config.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/condition/entity-has-children.condition-config.ts new file mode 100644 index 000000000000..2c08118a07eb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/condition/entity-has-children.condition-config.ts @@ -0,0 +1,12 @@ +import type { UMB_ENTITY_HAS_CHILDREN_CONDITION_ALIAS } from './constants.js'; +import type { UmbConditionConfigBase } from '@umbraco-cms/backoffice/extension-api'; + +// eslint-disable-next-line @typescript-eslint/no-empty-object-type +export interface UmbEntityHasChildrenConditionConfig + extends UmbConditionConfigBase {} + +declare global { + interface UmbExtensionConditionConfigMap { + UmbEntityHasChildrenConditionConfig: UmbEntityHasChildrenConditionConfig; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/condition/entity-has-children.condition.manifest.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/condition/entity-has-children.condition.manifest.ts new file mode 100644 index 000000000000..ddfde4f2a9a1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/condition/entity-has-children.condition.manifest.ts @@ -0,0 +1,9 @@ +import { UMB_ENTITY_HAS_CHILDREN_CONDITION_ALIAS } from './constants.js'; +import type { ManifestCondition } from '@umbraco-cms/backoffice/extension-api'; + +export const manifest: ManifestCondition = { + type: 'condition', + name: 'Entity Has Children Condition', + alias: UMB_ENTITY_HAS_CHILDREN_CONDITION_ALIAS, + api: () => import('./entity-has-children.condition.js'), +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/condition/entity-has-children.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/condition/entity-has-children.condition.ts new file mode 100644 index 000000000000..cc930c4cf8a9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/condition/entity-has-children.condition.ts @@ -0,0 +1,25 @@ +import { UMB_HAS_CHILDREN_ENTITY_CONTEXT } from '../context/has-children.context-token.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { + UmbConditionConfigBase, + UmbConditionControllerArguments, + UmbExtensionCondition, +} from '@umbraco-cms/backoffice/extension-api'; +import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry'; + +export class UmbEntityHasChildrenCondition + extends UmbConditionBase + implements UmbExtensionCondition +{ + constructor(host: UmbControllerHost, args: UmbConditionControllerArguments) { + super(host, args); + + this.consumeContext(UMB_HAS_CHILDREN_ENTITY_CONTEXT, (context) => { + this.observe(context.hasChildren, (hasChildren) => { + this.permitted = hasChildren === true; + }); + }); + } +} + +export { UmbEntityHasChildrenCondition as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/constants.ts new file mode 100644 index 000000000000..853290d6b288 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/constants.ts @@ -0,0 +1,2 @@ +export * from './condition/constants.js'; +export * from './context/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/context/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/context/constants.ts new file mode 100644 index 000000000000..137e79f8430b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/context/constants.ts @@ -0,0 +1 @@ +export * from './has-children.context-token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/context/has-children.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/context/has-children.context-token.ts new file mode 100644 index 000000000000..a2bb77d5e20d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/context/has-children.context-token.ts @@ -0,0 +1,6 @@ +import type { UmbHasChildrenEntityContext } from './has-children.entity-context.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const UMB_HAS_CHILDREN_ENTITY_CONTEXT = new UmbContextToken( + 'UmbHasChildrenEntityContext', +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/context/has-children.entity-context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/context/has-children.entity-context.ts new file mode 100644 index 000000000000..ed8d1c0de908 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/context/has-children.entity-context.ts @@ -0,0 +1,31 @@ +import { UMB_HAS_CHILDREN_ENTITY_CONTEXT } from './has-children.context-token.js'; +import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; + +export class UmbHasChildrenEntityContext extends UmbContextBase { + #hasChildren = new UmbBooleanState(undefined); + public readonly hasChildren = this.#hasChildren.asObservable(); + + constructor(host: UmbControllerHost) { + super(host, UMB_HAS_CHILDREN_ENTITY_CONTEXT); + } + + /** + * Gets the hasChildren state + * @returns {boolean} - The hasChildren state + * @memberof UmbHasChildrenEntityContext + */ + public getHasChildren(): boolean | undefined { + return this.#hasChildren.getValue(); + } + + /** + * Sets the hasChildren state + * @param {boolean} hasChildren - The hasChildren state + * @memberof UmbHasChildrenEntityContext + */ + public setHasChildren(hasChildren: boolean) { + this.#hasChildren.setValue(hasChildren); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/context/index.ts new file mode 100644 index 000000000000..0b119e565ced --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/context/index.ts @@ -0,0 +1 @@ +export * from './has-children.entity-context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/index.ts new file mode 100644 index 000000000000..00c55032bc33 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/index.ts @@ -0,0 +1 @@ +export * from './context/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/manifests.ts new file mode 100644 index 000000000000..e3b60432b4f5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/has-children/manifests.ts @@ -0,0 +1,4 @@ +import { manifest as conditionManifest } from './condition/entity-has-children.condition.manifest.js'; +import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [conditionManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/index.ts index 37d12fa9f0da..757de9d13ab6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/index.ts @@ -5,7 +5,9 @@ export * from './constants.js'; export * from './entity-action-base.js'; export * from './entity-action-list.element.js'; export * from './entity-action.event.js'; +export * from './has-children/index.js'; export * from './entity-updated.event.js'; + export type * from './types.js'; export { UmbRequestReloadStructureForEntityEvent } from './request-reload-structure-for-entity.event.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts index 7d6813e49a3a..66347b90e6a2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts @@ -2,6 +2,7 @@ import { manifests as createEntityActionManifests } from './common/create/manife import { manifests as defaultEntityActionManifests } from './default/manifests.js'; import { manifests as deleteEntityActionManifests } from './common/delete/manifests.js'; import { manifests as duplicateEntityActionManifests } from './common/duplicate/manifests.js'; +import { manifests as hasChildrenManifests } from './has-children/manifests.js'; import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; @@ -10,4 +11,5 @@ export const manifests: Array = ...defaultEntityActionManifests, ...deleteEntityActionManifests, ...duplicateEntityActionManifests, + ...hasChildrenManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/index.ts index 0730a8d0b57b..9e7d4fe54533 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/index.ts @@ -1,3 +1,3 @@ -export { UmbTrashEntityAction } from './trash/index.js'; +export { UmbTrashEntityAction, UmbEntityTrashedEvent } from './trash/index.js'; export { UmbRestoreFromRecycleBinEntityAction } from './restore-from-recycle-bin/restore-from-recycle-bin.action.js'; export { UmbEmptyRecycleBinEntityAction } from './empty-recycle-bin/empty-recycle-bin.action.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/index.ts index b74b5095ef99..c62cb8c29b13 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/index.ts @@ -1,2 +1,3 @@ -export type * from './types.js'; export * from './trash.action.js'; +export * from './trash.event.js'; +export type * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts index ccc9e05f31b7..6896d26586cc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts @@ -2,6 +2,7 @@ import { UmbEntityActionBase } from '../../../entity-action/entity-action-base.j import { UmbRequestReloadStructureForEntityEvent } from '../../../entity-action/request-reload-structure-for-entity.event.js'; import type { UmbRecycleBinRepository } from '../../recycle-bin-repository.interface.js'; import type { MetaEntityActionTrashKind } from './types.js'; +import { UmbEntityTrashedEvent } from './trash.event.js'; import { createExtensionApiByAlias } from '@umbraco-cms/backoffice/extension-registry'; import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; import type { UmbItemRepository } from '@umbraco-cms/backoffice/repository'; @@ -43,7 +44,12 @@ export class UmbTrashEntityAction extends UmbEntityActionBase = [ @@ -9,4 +11,5 @@ export const manifests: Array = ...emptyRecycleBinEntityActionManifests, ...restoreFromRecycleBinEntityActionManifests, ...trashEntityActionManifests, + ...treeManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/tree/manifests.ts new file mode 100644 index 000000000000..fbc0ae3c245b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/tree/manifests.ts @@ -0,0 +1,4 @@ +import { manifests as treeItemManifests } from './tree-item/manifests.js'; +import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [...treeItemManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/tree/tree-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/tree/tree-item/manifests.ts new file mode 100644 index 000000000000..85542d05a960 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/tree/tree-item/manifests.ts @@ -0,0 +1,17 @@ +import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; +import { UMB_TREE_ITEM_DEFAULT_KIND_MANIFEST } from '@umbraco-cms/backoffice/tree'; + +export const manifests: Array = [ + { + type: 'kind', + alias: 'Umb.Kind.TreeItem.RecycleBin', + matchType: 'treeItem', + matchKind: 'recycleBin', + manifest: { + ...UMB_TREE_ITEM_DEFAULT_KIND_MANIFEST.manifest, + type: 'treeItem', + kind: 'recycleBin', + api: () => import('./recycle-bin-tree-item.context.js'), + }, + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/tree/tree-item/recycle-bin-tree-item.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/tree/tree-item/recycle-bin-tree-item.context.ts new file mode 100644 index 000000000000..a38c0d813bea --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/tree/tree-item/recycle-bin-tree-item.context.ts @@ -0,0 +1,53 @@ +import type { ManifestTreeItemRecycleBinKind } from './types.js'; +import { UmbDefaultTreeItemContext, type UmbTreeItemModel, type UmbTreeRootModel } from '@umbraco-cms/backoffice/tree'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbActionEventContext } from '@umbraco-cms/backoffice/action'; +import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; +import { UmbEntityTrashedEvent } from '@umbraco-cms/backoffice/recycle-bin'; + +export class UmbRecycleBinTreeItemContext< + RecycleBinTreeItemModelType extends UmbTreeItemModel, + RecycleBinTreeRootModelType extends UmbTreeRootModel, +> extends UmbDefaultTreeItemContext< + RecycleBinTreeItemModelType, + RecycleBinTreeRootModelType, + ManifestTreeItemRecycleBinKind +> { + #actionEventContext?: UmbActionEventContext; + + constructor(host: UmbControllerHost) { + super(host); + + this.consumeContext(UMB_ACTION_EVENT_CONTEXT, (instance) => { + this.#removeEventListener(); + this.#actionEventContext = instance; + this.#actionEventContext?.addEventListener(UmbEntityTrashedEvent.TYPE, this.#onEntityTrashed as EventListener); + }); + } + + #onEntityTrashed = (event: UmbEntityTrashedEvent) => { + const entityType = event.getEntityType(); + if (!entityType) throw new Error('Entity type is required'); + + const supportedEntityTypes = this.getManifest()?.meta.supportedEntityTypes; + + if (!supportedEntityTypes) { + throw new Error('Entity types are missing from the manifest.'); + } + + if (supportedEntityTypes.includes(entityType)) { + this.loadChildren(); + } + }; + + #removeEventListener = () => { + this.#actionEventContext?.removeEventListener(UmbEntityTrashedEvent.TYPE, this.#onEntityTrashed as EventListener); + }; + + override destroy(): void { + this.#removeEventListener(); + super.destroy(); + } +} + +export { UmbRecycleBinTreeItemContext as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/tree/tree-item/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/tree/tree-item/types.ts new file mode 100644 index 000000000000..c3331bdb822a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/tree/tree-item/types.ts @@ -0,0 +1,17 @@ +import type { ManifestTreeItem } from '@umbraco-cms/backoffice/tree'; + +export interface ManifestTreeItemRecycleBinKind extends ManifestTreeItem { + type: 'treeItem'; + kind: 'recycleBin'; + meta: MetaTreeItemRecycleBinKind; +} + +export interface MetaTreeItemRecycleBinKind { + supportedEntityTypes: Array; +} + +declare global { + interface UmbExtensionManifestMap { + umbManifestTreeItemRecycleBinKind: ManifestTreeItemRecycleBinKind; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts index 317869be1b48..ff2fee276a8d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts @@ -161,6 +161,8 @@ export class UmbDefaultTreeContext< this.#loadRootItems(reload); return; } + + this.#loadTreeRoot(); } async #loadTreeRoot() { @@ -300,24 +302,10 @@ export class UmbDefaultTreeContext< #consumeContexts() { this.consumeContext(UMB_ACTION_EVENT_CONTEXT, (instance) => { + this.#removeEventListeners(); this.#actionEventContext = instance; - this.#actionEventContext.removeEventListener( - UmbRequestReloadChildrenOfEntityEvent.TYPE, - this.#onReloadRequest as EventListener, - ); - - this.#actionEventContext.removeEventListener( - UmbRequestReloadChildrenOfEntityEvent.TYPE, - this.#onReloadRequest as EventListener, - ); - - this.#actionEventContext.addEventListener( - UmbRequestReloadChildrenOfEntityEvent.TYPE, - this.#onReloadRequest as EventListener, - ); - - this.#actionEventContext.addEventListener( + this.#actionEventContext?.addEventListener( UmbRequestReloadChildrenOfEntityEvent.TYPE, this.#onReloadRequest as EventListener, ); @@ -354,17 +342,15 @@ export class UmbDefaultTreeContext< this.loadTree(); }; - override destroy(): void { - this.#actionEventContext?.removeEventListener( - UmbRequestReloadChildrenOfEntityEvent.TYPE, - this.#onReloadRequest as EventListener, - ); - + #removeEventListeners() { this.#actionEventContext?.removeEventListener( UmbRequestReloadChildrenOfEntityEvent.TYPE, this.#onReloadRequest as EventListener, ); + } + override destroy(): void { + this.#removeEventListeners(); super.destroy(); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts index 45b440be7458..514e929e499b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts @@ -12,6 +12,7 @@ import { UMB_SECTION_CONTEXT, UMB_SECTION_SIDEBAR_CONTEXT } from '@umbraco-cms/b import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { + UmbHasChildrenEntityContext, UmbRequestReloadChildrenOfEntityEvent, UmbRequestReloadStructureForEntityEvent, } from '@umbraco-cms/backoffice/entity-action'; @@ -22,6 +23,7 @@ import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; export abstract class UmbTreeItemContextBase< TreeItemType extends UmbTreeItemModel, TreeRootType extends UmbTreeRootModel, + ManifestType extends ManifestTreeItem = ManifestTreeItem, > extends UmbContextBase> implements UmbTreeItemContext @@ -30,7 +32,7 @@ export abstract class UmbTreeItemContextBase< public entityType?: string; public readonly pagination = new UmbPaginationManager(); - #manifest?: ManifestTreeItem; + #manifest?: ManifestType; protected readonly _treeItem = new UmbObjectState(undefined); readonly treeItem = this._treeItem.asObservable(); @@ -72,6 +74,8 @@ export abstract class UmbTreeItemContextBase< #sectionSidebarContext?: typeof UMB_SECTION_SIDEBAR_CONTEXT.TYPE; #actionEventContext?: typeof UMB_ACTION_EVENT_CONTEXT.TYPE; + #hasChildrenContext = new UmbHasChildrenEntityContext(this); + // TODO: get this from the tree context #paging = { skip: 0, @@ -112,7 +116,7 @@ export abstract class UmbTreeItemContextBase< * @param {ManifestCollection} manifest * @memberof UmbCollectionContext */ - public set manifest(manifest: ManifestTreeItem | undefined) { + public set manifest(manifest: ManifestType | undefined) { if (this.#manifest === manifest) return; this.#manifest = manifest; } @@ -143,7 +147,10 @@ export abstract class UmbTreeItemContextBase< if (!treeItem.entityType) throw new Error('Could not create tree item context, tree item type is missing'); this.entityType = treeItem.entityType; - this.#hasChildren.setValue(treeItem.hasChildren || false); + const hasChildren = treeItem.hasChildren || false; + this.#hasChildren.setValue(hasChildren); + this.#hasChildrenContext.setHasChildren(hasChildren); + this._treeItem.setValue(treeItem); // Update observers: @@ -199,7 +206,10 @@ export abstract class UmbTreeItemContextBase< this.#childItems.setValue(data.items); } - this.#hasChildren.setValue(data.total > 0); + const hasChildren = data.total > 0; + this.#hasChildren.setValue(hasChildren); + this.#hasChildrenContext.setHasChildren(hasChildren); + this.pagination.setTotalItems(data.total); } @@ -248,21 +258,7 @@ export abstract class UmbTreeItemContextBase< }); this.consumeContext(UMB_ACTION_EVENT_CONTEXT, (instance) => { - this.#actionEventContext?.removeEventListener( - UmbRequestReloadTreeItemChildrenEvent.TYPE, - this.#onReloadRequest as EventListener, - ); - - this.#actionEventContext?.removeEventListener( - UmbRequestReloadChildrenOfEntityEvent.TYPE, - this.#onReloadRequest as EventListener, - ); - - this.#actionEventContext?.removeEventListener( - UmbRequestReloadStructureForEntityEvent.TYPE, - this.#onReloadStructureRequest as unknown as EventListener, - ); - + this.#removeEventListeners(); this.#actionEventContext = instance; this.#actionEventContext.addEventListener( @@ -410,7 +406,7 @@ export abstract class UmbTreeItemContextBase< return `section/${pathname}/workspace/${entityType}/edit/${unique}`; } - override destroy(): void { + #removeEventListeners = () => { this.#actionEventContext?.removeEventListener( UmbRequestReloadTreeItemChildrenEvent.TYPE, this.#onReloadRequest as EventListener, @@ -425,6 +421,10 @@ export abstract class UmbTreeItemContextBase< UmbRequestReloadStructureForEntityEvent.TYPE, this.#onReloadStructureRequest as unknown as EventListener, ); + }; + + override destroy(): void { + this.#removeEventListeners(); window.removeEventListener('navigationend', this.#debouncedCheckIsActive); super.destroy(); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/index.ts index 4ff8f02b95b1..4541d82432dc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/index.ts @@ -1,2 +1,3 @@ export * from './tree-item-default.context.js'; export * from './tree-item-default.element.js'; +export { UMB_TREE_ITEM_DEFAULT_KIND_MANIFEST } from './manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/manifests.ts index 237176c148fb..a03d4b8473ba 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/manifests.ts @@ -1,15 +1,15 @@ import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry'; -export const manifests: Array = [ - { - type: 'kind', - alias: 'Umb.Kind.TreeItem.Default', - matchKind: 'default', - matchType: 'treeItem', - manifest: { - type: 'treeItem', - api: () => import('./tree-item-default.context.js'), - element: () => import('./tree-item-default.element.js'), - }, +export const UMB_TREE_ITEM_DEFAULT_KIND_MANIFEST: UmbExtensionManifestKind = { + type: 'kind', + alias: 'Umb.Kind.TreeItem.Default', + matchKind: 'default', + matchType: 'treeItem', + manifest: { + type: 'treeItem', + api: () => import('./tree-item-default.context.js'), + element: () => import('./tree-item-default.element.js'), }, -]; +}; + +export const manifests: Array = [UMB_TREE_ITEM_DEFAULT_KIND_MANIFEST]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/tree-item-default.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/tree-item-default.context.ts index 837fa430f5f0..f189cee6c25b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/tree-item-default.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-default/tree-item-default.context.ts @@ -1,11 +1,12 @@ import { UmbTreeItemContextBase } from '../tree-item-base/index.js'; -import type { UmbTreeItemModel, UmbTreeRootModel } from '../../types.js'; +import type { ManifestTreeItem, UmbTreeItemModel, UmbTreeRootModel } from '../../types.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export class UmbDefaultTreeItemContext< TreeItemType extends UmbTreeItemModel, TreeRootType extends UmbTreeRootModel, -> extends UmbTreeItemContextBase { + ManifestTreeItemType extends ManifestTreeItem = ManifestTreeItem, +> extends UmbTreeItemContextBase { constructor(host: UmbControllerHost) { super(host); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts index 41a9ecade2f0..9efad9e6c9a7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts @@ -4,6 +4,7 @@ import { UMB_DOCUMENT_TREE_REPOSITORY_ALIAS } from '../../tree/index.js'; import { UMB_USER_PERMISSION_DOCUMENT_SORT } from '../../user-permissions/index.js'; import { UMB_SORT_CHILDREN_OF_DOCUMENT_REPOSITORY_ALIAS } from './repository/constants.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; +import { UMB_ENTITY_HAS_CHILDREN_CONDITION_ALIAS } from '@umbraco-cms/backoffice/entity-action'; import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; export const manifests: Array = [ @@ -28,6 +29,9 @@ export const manifests: Array = [ { alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, + { + alias: UMB_ENTITY_HAS_CHILDREN_CONDITION_ALIAS, + }, ], }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts index f4d9b410dee9..3e439369c066 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts @@ -10,6 +10,7 @@ import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS, } from '@umbraco-cms/backoffice/recycle-bin'; +import { UMB_ENTITY_HAS_CHILDREN_CONDITION_ALIAS } from '@umbraco-cms/backoffice/entity-action'; export const manifests: Array = [ { @@ -67,6 +68,9 @@ export const manifests: Array = [ alias: 'Umb.Condition.UserPermission.Document', allOf: [UMB_USER_PERMISSION_DOCUMENT_DELETE], }, + { + alias: UMB_ENTITY_HAS_CHILDREN_CONDITION_ALIAS, + }, ], }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/constants.ts index 1fc640ecea5a..6845ef2508d5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/constants.ts @@ -2,4 +2,4 @@ export const UMB_DOCUMENT_RECYCLE_BIN_TREE_REPOSITORY_ALIAS = 'Umb.Repository.Do export const UMB_DOCUMENT_RECYCLE_BIN_TREE_STORE_ALIAS = 'Umb.Store.Document.RecycleBin.Tree'; export const UMB_DOCUMENT_RECYCLE_BIN_TREE_ALIAS = 'Umb.Tree.Document.RecycleBin'; -export { UMB_DOCUMENT_RECYCLE_BIN_TREE_STORE_CONTEXT } from './document-recycle-bin-tree.store.context-token.js'; +export { UMB_DOCUMENT_RECYCLE_BIN_TREE_STORE_CONTEXT } from './data/document-recycle-bin-tree.store.context-token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/data/document-recycle-bin-tree.repository.ts similarity index 91% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/data/document-recycle-bin-tree.repository.ts index de937fb837c1..23a40ffe6b67 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/data/document-recycle-bin-tree.repository.ts @@ -1,6 +1,6 @@ -import { UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../constants.js'; +import { UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../../constants.js'; +import type { UmbDocumentRecycleBinTreeItemModel, UmbDocumentRecycleBinTreeRootModel } from '../types.js'; import { UmbDocumentRecycleBinTreeServerDataSource } from './document-recycle-bin-tree.server.data-source.js'; -import type { UmbDocumentRecycleBinTreeItemModel, UmbDocumentRecycleBinTreeRootModel } from './types.js'; import { UMB_DOCUMENT_RECYCLE_BIN_TREE_STORE_CONTEXT } from './document-recycle-bin-tree.store.context-token.js'; import { UmbTreeRepositoryBase } from '@umbraco-cms/backoffice/tree'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/data/document-recycle-bin-tree.server.data-source.ts similarity index 93% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.server.data-source.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/data/document-recycle-bin-tree.server.data-source.ts index c64c245b6061..daed1c921cc1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/data/document-recycle-bin-tree.server.data-source.ts @@ -1,6 +1,6 @@ -import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; -import { UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../constants.js'; -import type { UmbDocumentRecycleBinTreeItemModel } from './types.js'; +import { UMB_DOCUMENT_ENTITY_TYPE } from '../../../entity.js'; +import { UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../../constants.js'; +import type { UmbDocumentRecycleBinTreeItemModel } from '../types.js'; import type { DocumentRecycleBinItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.store.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/data/document-recycle-bin-tree.store.context-token.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.store.context-token.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/data/document-recycle-bin-tree.store.context-token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/data/document-recycle-bin-tree.store.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.store.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/data/document-recycle-bin-tree.store.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/data/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/data/index.ts new file mode 100644 index 000000000000..88a4abae9473 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/data/index.ts @@ -0,0 +1,2 @@ +export { UmbDocumentRecycleBinTreeRepository } from './document-recycle-bin-tree.repository.js'; +export { type UmbDocumentRecycleBinTreeStore } from './document-recycle-bin-tree.store.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/data/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/data/manifests.ts new file mode 100644 index 000000000000..d27b5bfe49b5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/data/manifests.ts @@ -0,0 +1,19 @@ +import { + UMB_DOCUMENT_RECYCLE_BIN_TREE_REPOSITORY_ALIAS, + UMB_DOCUMENT_RECYCLE_BIN_TREE_STORE_ALIAS, +} from '../constants.js'; + +export const manifests: Array = [ + { + type: 'repository', + alias: UMB_DOCUMENT_RECYCLE_BIN_TREE_REPOSITORY_ALIAS, + name: 'Document Recycle Bin Tree Repository', + api: () => import('./document-recycle-bin-tree.repository.js'), + }, + { + type: 'treeStore', + alias: UMB_DOCUMENT_RECYCLE_BIN_TREE_STORE_ALIAS, + name: 'Document Recycle Bin Tree Store', + api: () => import('./document-recycle-bin-tree.store.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/index.ts index 88a4abae9473..1894eb8a5a3e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/index.ts @@ -1,2 +1 @@ -export { UmbDocumentRecycleBinTreeRepository } from './document-recycle-bin-tree.repository.js'; -export { type UmbDocumentRecycleBinTreeStore } from './document-recycle-bin-tree.store.js'; +export * from './data/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/manifests.ts index 1a1c9b362271..c4b3774d97f0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/manifests.ts @@ -1,24 +1,10 @@ import { UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../constants.js'; -import { - UMB_DOCUMENT_RECYCLE_BIN_TREE_ALIAS, - UMB_DOCUMENT_RECYCLE_BIN_TREE_REPOSITORY_ALIAS, - UMB_DOCUMENT_RECYCLE_BIN_TREE_STORE_ALIAS, -} from './constants.js'; +import { UMB_DOCUMENT_RECYCLE_BIN_TREE_ALIAS, UMB_DOCUMENT_RECYCLE_BIN_TREE_REPOSITORY_ALIAS } from './constants.js'; +import { manifests as dataManifests } from './data/manifests.js'; import { manifests as reloadTreeItemChildrenManifests } from './reload-tree-item-children/manifests.js'; +import { manifests as rootTreeItemManifests } from './tree-item/manifests.js'; export const manifests: Array = [ - { - type: 'repository', - alias: UMB_DOCUMENT_RECYCLE_BIN_TREE_REPOSITORY_ALIAS, - name: 'Document Recycle Bin Tree Repository', - api: () => import('./document-recycle-bin-tree.repository.js'), - }, - { - type: 'treeStore', - alias: UMB_DOCUMENT_RECYCLE_BIN_TREE_STORE_ALIAS, - name: 'Document Recycle Bin Tree Store', - api: () => import('./document-recycle-bin-tree.store.js'), - }, { type: 'tree', kind: 'default', @@ -28,13 +14,6 @@ export const manifests: Array = [ repositoryAlias: UMB_DOCUMENT_RECYCLE_BIN_TREE_REPOSITORY_ALIAS, }, }, - { - type: 'treeItem', - kind: 'default', - alias: 'Umb.TreeItem.Document.RecycleBin', - name: 'Document Recycle Bin Tree Item', - forEntityTypes: [UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE], - }, { type: 'workspace', kind: 'default', @@ -45,5 +24,7 @@ export const manifests: Array = [ headline: '#general_recycleBin', }, }, + ...dataManifests, ...reloadTreeItemChildrenManifests, + ...rootTreeItemManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/tree-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/tree-item/manifests.ts new file mode 100644 index 000000000000..90fc956ad9c9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/tree-item/manifests.ts @@ -0,0 +1,15 @@ +import { UMB_DOCUMENT_ENTITY_TYPE } from '../../../entity.js'; +import { UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../../constants.js'; + +export const manifests: Array = [ + { + type: 'treeItem', + kind: 'recycleBin', + alias: 'Umb.TreeItem.Document.RecycleBin', + name: 'Document Recycle Bin Tree Item', + forEntityTypes: [UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE], + meta: { + supportedEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], + }, + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/manifests.ts index d0ab6a49e8f1..d572ecbaf12b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/manifests.ts @@ -3,6 +3,7 @@ import { UMB_MEDIA_ITEM_REPOSITORY_ALIAS, UMB_MEDIA_TREE_REPOSITORY_ALIAS } from import { UMB_SORT_CHILDREN_OF_MEDIA_REPOSITORY_ALIAS } from './repository/constants.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; +import { UMB_ENTITY_HAS_CHILDREN_CONDITION_ALIAS } from '@umbraco-cms/backoffice/entity-action'; export const manifests: Array = [ ...repositoryManifests, @@ -21,6 +22,9 @@ export const manifests: Array = [ { alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, }, + { + alias: UMB_ENTITY_HAS_CHILDREN_CONDITION_ALIAS, + }, ], }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/entity-action/manifests.ts index b78ea50e0fb7..017ec905421c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/entity-action/manifests.ts @@ -4,6 +4,7 @@ import { UMB_MEDIA_ENTITY_TYPE, } from '../../constants.js'; import { UMB_MEDIA_RECYCLE_BIN_ROOT_ENTITY_TYPE, UMB_MEDIA_RECYCLE_BIN_REPOSITORY_ALIAS } from '../constants.js'; +import { UMB_ENTITY_HAS_CHILDREN_CONDITION_ALIAS } from '@umbraco-cms/backoffice/entity-action'; import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS, @@ -52,5 +53,10 @@ export const manifests: Array = [ meta: { recycleBinRepositoryAlias: UMB_MEDIA_RECYCLE_BIN_REPOSITORY_ALIAS, }, + conditions: [ + { + alias: UMB_ENTITY_HAS_CHILDREN_CONDITION_ALIAS, + }, + ], }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/manifests.ts index 517c43611312..956585aea832 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/manifests.ts @@ -1,3 +1,4 @@ +import { UMB_MEDIA_ENTITY_TYPE } from '../../entity.js'; import { UMB_MEDIA_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../constants.js'; import { UMB_MEDIA_RECYCLE_BIN_TREE_ALIAS, @@ -30,10 +31,13 @@ export const manifests: Array = [ }, { type: 'treeItem', - kind: 'default', + kind: 'recycleBin', alias: 'Umb.TreeItem.Media.RecycleBin', name: 'Media Recycle Bin Tree Item', forEntityTypes: [UMB_MEDIA_RECYCLE_BIN_ROOT_ENTITY_TYPE], + meta: { + supportedEntityTypes: [UMB_MEDIA_ENTITY_TYPE], + }, }, { type: 'workspace',