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
This commit is contained in:
Mads Rasmussen
2025-10-07 13:26:44 +02:00
committed by GitHub
parent ba4a874fb4
commit 324e5bcb0a
9 changed files with 62 additions and 5 deletions

View File

@@ -0,0 +1,23 @@
import type { UmbItemModel } from '../types.js';
import type { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import type { Observable } from '@umbraco-cms/backoffice/observable-api';
export interface UmbItemDataResolverConstructor<ItemType extends UmbItemModel = UmbItemModel> {
new (host: UmbControllerHost): UmbItemDataResolver<ItemType>;
}
export interface UmbItemDataResolver<ItemType extends UmbItemModel = UmbItemModel> extends UmbControllerBase {
entityType: Observable<string | undefined>;
unique: Observable<string | undefined>;
name: Observable<string | undefined>;
icon: Observable<string | undefined>;
setData(data: ItemType | undefined): void;
getData(): ItemType | undefined;
getEntityType(): Promise<string | undefined>;
getUnique(): Promise<string | undefined>;
getName(): Promise<string | undefined>;
getIcon(): Promise<string | undefined>;
}

View File

@@ -1,2 +1,4 @@
export * from './item-data-api-get-request-controller/index.js';
export * from './entity-item-ref/index.js';
export type { UmbItemDataResolver, UmbItemDataResolverConstructor } from './data-resolver/types.js';

View File

@@ -1,6 +1,13 @@
import type { UmbNamedEntityModel } from '@umbraco-cms/backoffice/entity';
import type { UmbEntityModel, UmbNamedEntityModel } from '@umbraco-cms/backoffice/entity';
export type * from './item-data-api-get-request-controller/types.js';
export type * from './data-resolver/types.js';
export interface UmbDefaultItemModel extends UmbNamedEntityModel {
icon?: string;
}
export interface UmbItemModel extends UmbEntityModel {
unique: string;
name?: string;
icon?: string;
}

View File

@@ -5,6 +5,7 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import type { DocumentVariantStateModel } from '@umbraco-cms/backoffice/external/backend-api';
import { UmbBasicState, UmbBooleanState, UmbObjectState, UmbStringState } from '@umbraco-cms/backoffice/observable-api';
import { type UmbVariantContext, UMB_VARIANT_CONTEXT } from '@umbraco-cms/backoffice/variant';
import type { UmbItemDataResolver } from '@umbraco-cms/backoffice/entity-item';
type UmbDocumentItemDataResolverModel = Omit<UmbDocumentItemModel, 'parent' | 'hasChildren'>;
@@ -14,11 +15,13 @@ type UmbDocumentItemDataResolverModel = Omit<UmbDocumentItemModel, 'parent' | 'h
* @class UmbDocumentItemDataResolver
* @augments {UmbControllerBase}
*/
export class UmbDocumentItemDataResolver<
DocumentItemModel extends UmbDocumentItemDataResolverModel,
> extends UmbControllerBase {
export class UmbDocumentItemDataResolver<DocumentItemModel extends UmbDocumentItemDataResolverModel>
extends UmbControllerBase
implements UmbItemDataResolver
{
#data = new UmbObjectState<DocumentItemModel | undefined>(undefined);
public readonly entityType = this.#data.asObservablePart((x) => x?.entityType);
public readonly unique = this.#data.asObservablePart((x) => x?.unique);
public readonly icon = this.#data.asObservablePart((x) => x?.documentType.icon);
public readonly isTrashed = this.#data.asObservablePart((x) => x?.isTrashed);
@@ -101,6 +104,15 @@ export class UmbDocumentItemDataResolver<
this.#setVariantAwareValues();
}
/**
* Get the entity type of the item
* @returns {Promise<string | undefined>} The entity type of the item
* @memberof UmbDocumentItemDataResolver
*/
async getEntityType(): Promise<string | undefined> {
return await this.observe(this.entityType).asPromise();
}
/**
* Get the unique of the item
* @returns {Promise<string | undefined>} The unique of the item

View File

@@ -7,6 +7,7 @@ import {
} from '../../constants.js';
import { UMB_DOCUMENT_REFERENCE_REPOSITORY_ALIAS } from '../../reference/constants.js';
import { UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../../item/constants.js';
import { UmbDocumentItemDataResolver } from '../../item/document-item-data-resolver.js';
import { manifests as bulkTrashManifests } from './bulk-trash/manifests.js';
import {
UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS,
@@ -25,6 +26,7 @@ export const manifests: Array<UmbExtensionManifest> = [
itemRepositoryAlias: UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS,
recycleBinRepositoryAlias: UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS,
referenceRepositoryAlias: UMB_DOCUMENT_REFERENCE_REPOSITORY_ALIAS,
itemDataResolver: UmbDocumentItemDataResolver,
},
conditions: [
{

View File

@@ -48,7 +48,13 @@ export class UmbTrashWithRelationConfirmModalElement extends UmbModalBaseElement
const item = data?.[0];
if (!item) throw new Error('Item not found.');
this._name = item.name;
if (this.data.itemDataResolver) {
const resolver = new this.data.itemDataResolver(this);
resolver.setData(item);
this._name = await resolver.getName();
} else {
this._name = item.name;
}
this._referencesConfig = {
unique: this.data.unique,

View File

@@ -1,3 +1,4 @@
import type { UmbItemDataResolverConstructor } from '@umbraco-cms/backoffice/entity-item';
import { UmbModalToken } from '@umbraco-cms/backoffice/modal';
export interface UmbTrashWithRelationConfirmModalData {
@@ -5,6 +6,7 @@ export interface UmbTrashWithRelationConfirmModalData {
entityType: string;
itemRepositoryAlias: string;
referenceRepositoryAlias: string;
itemDataResolver?: UmbItemDataResolverConstructor;
}
export type UmbTrashWithRelationConfirmModalValue = undefined;

View File

@@ -16,6 +16,7 @@ export class UmbTrashWithRelationEntityAction extends UmbTrashEntityAction<MetaE
entityType: item.entityType,
itemRepositoryAlias: this.args.meta.itemRepositoryAlias,
referenceRepositoryAlias: this.args.meta.referenceRepositoryAlias,
itemDataResolver: this.args.meta.itemDataResolver,
},
});
}

View File

@@ -1,4 +1,5 @@
import type { ManifestEntityAction } from '@umbraco-cms/backoffice/entity-action';
import type { UmbItemDataResolverConstructor } from '@umbraco-cms/backoffice/entity-item';
import type { MetaEntityActionTrashKind } from '@umbraco-cms/backoffice/recycle-bin';
export interface ManifestEntityActionTrashWithRelationKind
@@ -9,6 +10,7 @@ export interface ManifestEntityActionTrashWithRelationKind
export interface MetaEntityActionTrashWithRelationKind extends MetaEntityActionTrashKind {
referenceRepositoryAlias: string;
itemDataResolver?: UmbItemDataResolverConstructor;
}
declare global {