Document Recycle Bin: Fix missing item name when restoring (#20599)

allow to pass in a item data resolver
This commit is contained in:
Mads Rasmussen
2025-10-21 20:46:16 +02:00
committed by GitHub
parent f0ac7b4a50
commit 6effe32136
5 changed files with 35 additions and 13 deletions

View File

@@ -10,9 +10,7 @@ import { UmbModalBaseElement, umbOpenModal } from '@umbraco-cms/backoffice/modal
import { createExtensionApiByAlias } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbItemRepository } from '@umbraco-cms/backoffice/repository';
const elementName = 'umb-restore-from-recycle-bin-modal';
@customElement(elementName)
@customElement('umb-restore-from-recycle-bin-modal')
export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement<
UmbRestoreFromRecycleBinModalData,
UmbRestoreFromRecycleBinModalValue
@@ -21,10 +19,13 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement<
private _isAutomaticRestore = false;
@state()
private _restoreItem?: any;
private _destinationItem?: any;
@state()
private _destinationItem?: any;
private _destinationItemName?: string;
@state()
private _restoreItemName?: string;
#recycleBinRepository?: UmbRecycleBinRepository;
@@ -34,7 +35,16 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement<
super.firstUpdated(_changedProperties);
if (!this.data?.unique) throw new Error('Cannot restore an item without a unique identifier.');
this._restoreItem = await this.#requestItem(this.data.unique);
const restoreItem = await this.#requestItem(this.data.unique);
if (this.data.itemDataResolver) {
const resolver = new this.data.itemDataResolver(this);
resolver.setData(restoreItem);
this._restoreItemName = await resolver.getName();
} else {
this._restoreItemName = restoreItem.name;
}
const unique = await this.#requestAutomaticRestoreDestination();
if (unique !== undefined) {
@@ -47,9 +57,7 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement<
// TODO: handle ROOT lookup. Currently, we can't look up the root in the item repository.
// This is a temp solution to show something in the UI.
if (unique === null) {
this._destinationItem = {
name: 'ROOT',
};
this._destinationItemName = 'Root';
this.#setDestinationValue({
unique: null,
@@ -61,6 +69,14 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement<
this._destinationItem = await this.#requestItem(unique);
if (!this._destinationItem) throw new Error('Cant find destination item.');
if (this.data?.itemDataResolver) {
const resolver = new this.data.itemDataResolver(this);
resolver.setData(this._destinationItem);
this._destinationItemName = await resolver.getName();
} else {
this._destinationItemName = this._destinationItem.name;
}
this.#setDestinationValue({
unique: this._destinationItem.unique,
entityType: this._destinationItem.entityType,
@@ -138,7 +154,7 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement<
<umb-body-layout headline="Restore">
<uui-box>
${this._isAutomaticRestore
? html` Restore ${this._restoreItem?.name} to ${this._destinationItem?.name}`
? html` Restore ${this._restoreItemName} to ${this._destinationItemName}`
: this.#renderCustomSelectDestination()}
</uui-box>
${this.#renderActions()}
@@ -151,8 +167,8 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement<
<h4>Cannot automatically restore this item.</h4>
<p>There is no location where this item can be automatically restored. You can select a new location below.</p>
<h5>Restore to:</h5>
${this._destinationItem
? html`<uui-ref-node name=${this._destinationItem.name}>
${this._destinationItem && this._destinationItemName
? html`<uui-ref-node name=${this._destinationItemName}>
<uui-action-bar slot="actions">
<uui-button @click=${() => (this._destinationItem = undefined)} label="Remove"
>${this.localize.term('general_remove')}</uui-button
@@ -186,6 +202,6 @@ export default UmbRestoreFromRecycleBinModalElement;
declare global {
interface HTMLElementTagNameMap {
[elementName]: UmbRestoreFromRecycleBinModalElement;
['umb-restore-from-recycle-bin-modal']: UmbRestoreFromRecycleBinModalElement;
}
}

View File

@@ -1,4 +1,5 @@
import type { UmbEntityModel } from '@umbraco-cms/backoffice/entity';
import type { UmbItemDataResolverConstructor } from '@umbraco-cms/backoffice/entity-item';
import type { UmbPickerModalData, UmbPickerModalValue } from '@umbraco-cms/backoffice/modal';
import { UmbModalToken } from '@umbraco-cms/backoffice/modal';
@@ -7,6 +8,7 @@ export interface UmbRestoreFromRecycleBinModalData {
entityType: string;
recycleBinRepositoryAlias: string;
itemRepositoryAlias: string;
itemDataResolver?: UmbItemDataResolverConstructor;
pickerModal: UmbModalToken<UmbPickerModalData<any>, UmbPickerModalValue> | string;
}

View File

@@ -24,6 +24,7 @@ export class UmbRestoreFromRecycleBinEntityAction extends UmbEntityActionBase<Me
entityType: this.args.entityType,
recycleBinRepositoryAlias: this.args.meta.recycleBinRepositoryAlias,
itemRepositoryAlias: this.args.meta.itemRepositoryAlias,
itemDataResolver: this.args.meta.itemDataResolver,
pickerModal: this.args.meta.pickerModal,
},
});

View File

@@ -1,4 +1,5 @@
import type { ManifestEntityAction, MetaEntityActionDefaultKind } from '@umbraco-cms/backoffice/entity-action';
import type { UmbItemDataResolverConstructor } from '@umbraco-cms/backoffice/entity-item';
import type { UmbModalToken, UmbPickerModalData, UmbPickerModalValue } from '@umbraco-cms/backoffice/modal';
export interface ManifestEntityActionRestoreFromRecycleBinKind
@@ -10,6 +11,7 @@ export interface ManifestEntityActionRestoreFromRecycleBinKind
export interface MetaEntityActionRestoreFromRecycleBinKind extends MetaEntityActionDefaultKind {
recycleBinRepositoryAlias: string;
itemRepositoryAlias: string;
itemDataResolver?: UmbItemDataResolverConstructor;
pickerModal: UmbModalToken<UmbPickerModalData<any>, UmbPickerModalValue> | string;
}

View File

@@ -46,6 +46,7 @@ export const manifests: Array<UmbExtensionManifest> = [
forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE],
meta: {
itemRepositoryAlias: UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS,
itemDataResolver: UmbDocumentItemDataResolver,
recycleBinRepositoryAlias: UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS,
pickerModal: UMB_DOCUMENT_PICKER_MODAL,
},