Skip to content

Commit 324e5bc

Browse files
Fix: undefined document name when trashing an item (#20401)
* add interface for item data resolver * export interface * add interface to Document item data resolver implementation * allow to pass a item data resolver to trash action * pipe resolver to modal * pass resolver to document trash manifest * use resolver in modal when available
1 parent ba4a874 commit 324e5bc

File tree

9 files changed

+62
-5
lines changed

9 files changed

+62
-5
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import type { UmbItemModel } from '../types.js';
2+
import type { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
3+
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
4+
import type { Observable } from '@umbraco-cms/backoffice/observable-api';
5+
6+
export interface UmbItemDataResolverConstructor<ItemType extends UmbItemModel = UmbItemModel> {
7+
new (host: UmbControllerHost): UmbItemDataResolver<ItemType>;
8+
}
9+
10+
export interface UmbItemDataResolver<ItemType extends UmbItemModel = UmbItemModel> extends UmbControllerBase {
11+
entityType: Observable<string | undefined>;
12+
unique: Observable<string | undefined>;
13+
name: Observable<string | undefined>;
14+
icon: Observable<string | undefined>;
15+
16+
setData(data: ItemType | undefined): void;
17+
getData(): ItemType | undefined;
18+
19+
getEntityType(): Promise<string | undefined>;
20+
getUnique(): Promise<string | undefined>;
21+
getName(): Promise<string | undefined>;
22+
getIcon(): Promise<string | undefined>;
23+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
export * from './item-data-api-get-request-controller/index.js';
22
export * from './entity-item-ref/index.js';
3+
4+
export type { UmbItemDataResolver, UmbItemDataResolverConstructor } from './data-resolver/types.js';
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
1-
import type { UmbNamedEntityModel } from '@umbraco-cms/backoffice/entity';
1+
import type { UmbEntityModel, UmbNamedEntityModel } from '@umbraco-cms/backoffice/entity';
22
export type * from './item-data-api-get-request-controller/types.js';
3+
export type * from './data-resolver/types.js';
34

45
export interface UmbDefaultItemModel extends UmbNamedEntityModel {
56
icon?: string;
67
}
8+
9+
export interface UmbItemModel extends UmbEntityModel {
10+
unique: string;
11+
name?: string;
12+
icon?: string;
13+
}

src/Umbraco.Web.UI.Client/src/packages/documents/documents/item/document-item-data-resolver.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
55
import type { DocumentVariantStateModel } from '@umbraco-cms/backoffice/external/backend-api';
66
import { UmbBasicState, UmbBooleanState, UmbObjectState, UmbStringState } from '@umbraco-cms/backoffice/observable-api';
77
import { type UmbVariantContext, UMB_VARIANT_CONTEXT } from '@umbraco-cms/backoffice/variant';
8+
import type { UmbItemDataResolver } from '@umbraco-cms/backoffice/entity-item';
89

910
type UmbDocumentItemDataResolverModel = Omit<UmbDocumentItemModel, 'parent' | 'hasChildren'>;
1011

@@ -14,11 +15,13 @@ type UmbDocumentItemDataResolverModel = Omit<UmbDocumentItemModel, 'parent' | 'h
1415
* @class UmbDocumentItemDataResolver
1516
* @augments {UmbControllerBase}
1617
*/
17-
export class UmbDocumentItemDataResolver<
18-
DocumentItemModel extends UmbDocumentItemDataResolverModel,
19-
> extends UmbControllerBase {
18+
export class UmbDocumentItemDataResolver<DocumentItemModel extends UmbDocumentItemDataResolverModel>
19+
extends UmbControllerBase
20+
implements UmbItemDataResolver
21+
{
2022
#data = new UmbObjectState<DocumentItemModel | undefined>(undefined);
2123

24+
public readonly entityType = this.#data.asObservablePart((x) => x?.entityType);
2225
public readonly unique = this.#data.asObservablePart((x) => x?.unique);
2326
public readonly icon = this.#data.asObservablePart((x) => x?.documentType.icon);
2427
public readonly isTrashed = this.#data.asObservablePart((x) => x?.isTrashed);
@@ -101,6 +104,15 @@ export class UmbDocumentItemDataResolver<
101104
this.#setVariantAwareValues();
102105
}
103106

107+
/**
108+
* Get the entity type of the item
109+
* @returns {Promise<string | undefined>} The entity type of the item
110+
* @memberof UmbDocumentItemDataResolver
111+
*/
112+
async getEntityType(): Promise<string | undefined> {
113+
return await this.observe(this.entityType).asPromise();
114+
}
115+
104116
/**
105117
* Get the unique of the item
106118
* @returns {Promise<string | undefined>} The unique of the item

src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
} from '../../constants.js';
88
import { UMB_DOCUMENT_REFERENCE_REPOSITORY_ALIAS } from '../../reference/constants.js';
99
import { UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../../item/constants.js';
10+
import { UmbDocumentItemDataResolver } from '../../item/document-item-data-resolver.js';
1011
import { manifests as bulkTrashManifests } from './bulk-trash/manifests.js';
1112
import {
1213
UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS,
@@ -25,6 +26,7 @@ export const manifests: Array<UmbExtensionManifest> = [
2526
itemRepositoryAlias: UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS,
2627
recycleBinRepositoryAlias: UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS,
2728
referenceRepositoryAlias: UMB_DOCUMENT_REFERENCE_REPOSITORY_ALIAS,
29+
itemDataResolver: UmbDocumentItemDataResolver,
2830
},
2931
conditions: [
3032
{

src/Umbraco.Web.UI.Client/src/packages/relations/relations/entity-actions/trash/modal/trash-with-relation-modal.element.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,13 @@ export class UmbTrashWithRelationConfirmModalElement extends UmbModalBaseElement
4848
const item = data?.[0];
4949
if (!item) throw new Error('Item not found.');
5050

51-
this._name = item.name;
51+
if (this.data.itemDataResolver) {
52+
const resolver = new this.data.itemDataResolver(this);
53+
resolver.setData(item);
54+
this._name = await resolver.getName();
55+
} else {
56+
this._name = item.name;
57+
}
5258

5359
this._referencesConfig = {
5460
unique: this.data.unique,

src/Umbraco.Web.UI.Client/src/packages/relations/relations/entity-actions/trash/modal/trash-with-relation-modal.token.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
import type { UmbItemDataResolverConstructor } from '@umbraco-cms/backoffice/entity-item';
12
import { UmbModalToken } from '@umbraco-cms/backoffice/modal';
23

34
export interface UmbTrashWithRelationConfirmModalData {
45
unique: string;
56
entityType: string;
67
itemRepositoryAlias: string;
78
referenceRepositoryAlias: string;
9+
itemDataResolver?: UmbItemDataResolverConstructor;
810
}
911

1012
export type UmbTrashWithRelationConfirmModalValue = undefined;

src/Umbraco.Web.UI.Client/src/packages/relations/relations/entity-actions/trash/trash-with-relation.action.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export class UmbTrashWithRelationEntityAction extends UmbTrashEntityAction<MetaE
1616
entityType: item.entityType,
1717
itemRepositoryAlias: this.args.meta.itemRepositoryAlias,
1818
referenceRepositoryAlias: this.args.meta.referenceRepositoryAlias,
19+
itemDataResolver: this.args.meta.itemDataResolver,
1920
},
2021
});
2122
}

src/Umbraco.Web.UI.Client/src/packages/relations/relations/entity-actions/trash/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { ManifestEntityAction } from '@umbraco-cms/backoffice/entity-action';
2+
import type { UmbItemDataResolverConstructor } from '@umbraco-cms/backoffice/entity-item';
23
import type { MetaEntityActionTrashKind } from '@umbraco-cms/backoffice/recycle-bin';
34

45
export interface ManifestEntityActionTrashWithRelationKind
@@ -9,6 +10,7 @@ export interface ManifestEntityActionTrashWithRelationKind
910

1011
export interface MetaEntityActionTrashWithRelationKind extends MetaEntityActionTrashKind {
1112
referenceRepositoryAlias: string;
13+
itemDataResolver?: UmbItemDataResolverConstructor;
1214
}
1315

1416
declare global {

0 commit comments

Comments
 (0)