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:
@@ -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>;
|
||||
}
|
||||
@@ -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';
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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: [
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user