Skip to content

Commit 67a66cb

Browse files
Bugfix: Reload recycle bin on trashed entity (#18228)
* add entity trashed event * dispatch event when entity is trashed * remove double event listeners * export action class * Update default-tree.context.ts * wip reload tree when entity is trashed * move into data folder * clean up listeners * move manifest * wip reload root * clean up * add recycle bin tree item * use for media * pass entity types through manifest + add recycle bin tree item kind * remove custom implementation for document recycle bin * use kind * rename to supportedEntityTypes * Update recycle-bin-tree-item.context.ts * clean up * Update recycle-bin-tree-item.context.ts * Update recycle-bin-tree-item.context.ts --------- Co-authored-by: Niels Lyngsø <[email protected]>
1 parent 14b8eee commit 67a66cb

25 files changed

+207
-93
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
export { UmbTrashEntityAction } from './trash/index.js';
1+
export { UmbTrashEntityAction, UmbEntityTrashedEvent } from './trash/index.js';
22
export { UmbRestoreFromRecycleBinEntityAction } from './restore-from-recycle-bin/restore-from-recycle-bin.action.js';
33
export { UmbEmptyRecycleBinEntityAction } from './empty-recycle-bin/empty-recycle-bin.action.js';
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1-
export type * from './types.js';
21
export * from './trash.action.js';
2+
export * from './trash.event.js';
3+
export type * from './types.js';

src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { UmbEntityActionBase } from '../../../entity-action/entity-action-base.j
22
import { UmbRequestReloadStructureForEntityEvent } from '../../../entity-action/request-reload-structure-for-entity.event.js';
33
import type { UmbRecycleBinRepository } from '../../recycle-bin-repository.interface.js';
44
import type { MetaEntityActionTrashKind } from './types.js';
5+
import { UmbEntityTrashedEvent } from './trash.event.js';
56
import { createExtensionApiByAlias } from '@umbraco-cms/backoffice/extension-registry';
67
import { umbConfirmModal } from '@umbraco-cms/backoffice/modal';
78
import type { UmbItemRepository } from '@umbraco-cms/backoffice/repository';
@@ -43,15 +44,25 @@ export class UmbTrashEntityAction extends UmbEntityActionBase<MetaEntityActionTr
4344
);
4445
await recycleBinRepository.requestTrash({ unique: this.args.unique });
4546

47+
this.#notify();
48+
}
49+
50+
async #notify() {
4651
const actionEventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT);
52+
4753
const event = new UmbRequestReloadStructureForEntityEvent({
4854
unique: this.args.unique,
4955
entityType: this.args.entityType,
5056
});
5157

5258
actionEventContext.dispatchEvent(event);
5359

54-
// TODO: reload destination
60+
const trashedEvent = new UmbEntityTrashedEvent({
61+
unique: this.args.unique,
62+
entityType: this.args.entityType,
63+
});
64+
65+
actionEventContext.dispatchEvent(trashedEvent);
5566
}
5667
}
5768

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { UmbEntityActionEvent, type UmbEntityActionEventArgs } from '@umbraco-cms/backoffice/entity-action';
2+
3+
export class UmbEntityTrashedEvent extends UmbEntityActionEvent {
4+
static readonly TYPE = 'entity-trashed';
5+
6+
constructor(args: UmbEntityActionEventArgs) {
7+
super(UmbEntityTrashedEvent.TYPE, args);
8+
}
9+
}
Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1-
import { manifests as trashEntityActionManifests } from './entity-action/trash/manifests.js';
2-
import { manifests as restoreFromRecycleBinEntityActionManifests } from './entity-action/restore-from-recycle-bin/manifests.js';
3-
import { manifests as emptyRecycleBinEntityActionManifests } from './entity-action/empty-recycle-bin/manifests.js';
41
import { manifests as conditionManifests } from './conditions/manifests.js';
2+
import { manifests as emptyRecycleBinEntityActionManifests } from './entity-action/empty-recycle-bin/manifests.js';
3+
import { manifests as restoreFromRecycleBinEntityActionManifests } from './entity-action/restore-from-recycle-bin/manifests.js';
4+
import { manifests as trashEntityActionManifests } from './entity-action/trash/manifests.js';
5+
import { manifests as treeManifests } from './tree/manifests.js';
6+
57
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
68

79
export const manifests: Array<UmbExtensionManifest | UmbExtensionManifestKind> = [
810
...conditionManifests,
911
...emptyRecycleBinEntityActionManifests,
1012
...restoreFromRecycleBinEntityActionManifests,
1113
...trashEntityActionManifests,
14+
...treeManifests,
1215
];
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { manifests as treeItemManifests } from './tree-item/manifests.js';
2+
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
3+
4+
export const manifests: Array<UmbExtensionManifest | UmbExtensionManifestKind> = [...treeItemManifests];
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
2+
import { UMB_TREE_ITEM_DEFAULT_KIND_MANIFEST } from '@umbraco-cms/backoffice/tree';
3+
4+
export const manifests: Array<UmbExtensionManifest | UmbExtensionManifestKind> = [
5+
{
6+
type: 'kind',
7+
alias: 'Umb.Kind.TreeItem.RecycleBin',
8+
matchType: 'treeItem',
9+
matchKind: 'recycleBin',
10+
manifest: {
11+
...UMB_TREE_ITEM_DEFAULT_KIND_MANIFEST.manifest,
12+
type: 'treeItem',
13+
kind: 'recycleBin',
14+
api: () => import('./recycle-bin-tree-item.context.js'),
15+
},
16+
},
17+
];
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import type { ManifestTreeItemRecycleBinKind } from './types.js';
2+
import { UmbDefaultTreeItemContext, type UmbTreeItemModel, type UmbTreeRootModel } from '@umbraco-cms/backoffice/tree';
3+
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
4+
import type { UmbActionEventContext } from '@umbraco-cms/backoffice/action';
5+
import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action';
6+
import { UmbEntityTrashedEvent } from '@umbraco-cms/backoffice/recycle-bin';
7+
8+
export class UmbRecycleBinTreeItemContext<
9+
RecycleBinTreeItemModelType extends UmbTreeItemModel,
10+
RecycleBinTreeRootModelType extends UmbTreeRootModel,
11+
> extends UmbDefaultTreeItemContext<
12+
RecycleBinTreeItemModelType,
13+
RecycleBinTreeRootModelType,
14+
ManifestTreeItemRecycleBinKind
15+
> {
16+
#actionEventContext?: UmbActionEventContext;
17+
18+
constructor(host: UmbControllerHost) {
19+
super(host);
20+
21+
this.consumeContext(UMB_ACTION_EVENT_CONTEXT, (instance) => {
22+
this.#removeEventListener();
23+
this.#actionEventContext = instance;
24+
this.#actionEventContext?.addEventListener(UmbEntityTrashedEvent.TYPE, this.#onEntityTrashed as EventListener);
25+
});
26+
}
27+
28+
#onEntityTrashed = (event: UmbEntityTrashedEvent) => {
29+
const entityType = event.getEntityType();
30+
if (!entityType) throw new Error('Entity type is required');
31+
32+
const supportedEntityTypes = this.getManifest()?.meta.supportedEntityTypes;
33+
34+
if (!supportedEntityTypes) {
35+
throw new Error('Supported entity types are missing from the manifest. (manifest.meta.supportedEntityTypes)');
36+
}
37+
38+
if (supportedEntityTypes.includes(entityType)) {
39+
this.loadChildren();
40+
}
41+
};
42+
43+
#removeEventListener = () => {
44+
this.#actionEventContext?.removeEventListener(UmbEntityTrashedEvent.TYPE, this.#onEntityTrashed as EventListener);
45+
};
46+
47+
override destroy(): void {
48+
this.#removeEventListener();
49+
super.destroy();
50+
}
51+
}
52+
53+
export { UmbRecycleBinTreeItemContext as api };
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import type { ManifestTreeItem } from '@umbraco-cms/backoffice/tree';
2+
3+
export interface ManifestTreeItemRecycleBinKind extends ManifestTreeItem {
4+
type: 'treeItem';
5+
kind: 'recycleBin';
6+
meta: MetaTreeItemRecycleBinKind;
7+
}
8+
9+
export interface MetaTreeItemRecycleBinKind {
10+
supportedEntityTypes: Array<string>;
11+
}
12+
13+
declare global {
14+
interface UmbExtensionManifestMap {
15+
umbManifestTreeItemRecycleBinKind: ManifestTreeItemRecycleBinKind;
16+
}
17+
}

src/Umbraco.Web.UI.Client/src/packages/core/tree/default/default-tree.context.ts

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,8 @@ export class UmbDefaultTreeContext<
161161
this.#loadRootItems(reload);
162162
return;
163163
}
164+
165+
this.#loadTreeRoot();
164166
}
165167

166168
async #loadTreeRoot() {
@@ -300,24 +302,10 @@ export class UmbDefaultTreeContext<
300302

301303
#consumeContexts() {
302304
this.consumeContext(UMB_ACTION_EVENT_CONTEXT, (instance) => {
305+
this.#removeEventListeners();
303306
this.#actionEventContext = instance;
304307

305-
this.#actionEventContext.removeEventListener(
306-
UmbRequestReloadChildrenOfEntityEvent.TYPE,
307-
this.#onReloadRequest as EventListener,
308-
);
309-
310-
this.#actionEventContext.removeEventListener(
311-
UmbRequestReloadChildrenOfEntityEvent.TYPE,
312-
this.#onReloadRequest as EventListener,
313-
);
314-
315-
this.#actionEventContext.addEventListener(
316-
UmbRequestReloadChildrenOfEntityEvent.TYPE,
317-
this.#onReloadRequest as EventListener,
318-
);
319-
320-
this.#actionEventContext.addEventListener(
308+
this.#actionEventContext?.addEventListener(
321309
UmbRequestReloadChildrenOfEntityEvent.TYPE,
322310
this.#onReloadRequest as EventListener,
323311
);
@@ -354,17 +342,15 @@ export class UmbDefaultTreeContext<
354342
this.loadTree();
355343
};
356344

357-
override destroy(): void {
358-
this.#actionEventContext?.removeEventListener(
359-
UmbRequestReloadChildrenOfEntityEvent.TYPE,
360-
this.#onReloadRequest as EventListener,
361-
);
362-
345+
#removeEventListeners() {
363346
this.#actionEventContext?.removeEventListener(
364347
UmbRequestReloadChildrenOfEntityEvent.TYPE,
365348
this.#onReloadRequest as EventListener,
366349
);
350+
}
367351

352+
override destroy(): void {
353+
this.#removeEventListeners();
368354
super.destroy();
369355
}
370356
}

0 commit comments

Comments
 (0)