From 6effe321366e7c07b9d32a11e7f8b9a671e9be62 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 21 Oct 2025 20:46:16 +0200 Subject: [PATCH] Document Recycle Bin: Fix missing item name when restoring (#20599) allow to pass in a item data resolver --- .../restore-from-recycle-bin-modal.element.ts | 42 +++++++++++++------ .../restore-from-recycle-bin-modal.token.ts | 2 + .../restore-from-recycle-bin.action.ts | 1 + .../restore-from-recycle-bin/types.ts | 2 + .../recycle-bin/entity-action/manifests.ts | 1 + 5 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts index 8370cc78b0..e8454907f6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts @@ -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< ${this._isAutomaticRestore - ? html` Restore ${this._restoreItem?.name} to ${this._destinationItem?.name}` + ? html` Restore ${this._restoreItemName} to ${this._destinationItemName}` : this.#renderCustomSelectDestination()} ${this.#renderActions()} @@ -151,8 +167,8 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement<

Cannot automatically restore this item.

There is no location where this item can be automatically restored. You can select a new location below.

Restore to:
- ${this._destinationItem - ? html` + ${this._destinationItem && this._destinationItemName + ? html` (this._destinationItem = undefined)} label="Remove" >${this.localize.term('general_remove')}, UmbPickerModalValue> | string; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts index 63dc760e12..e4141ff231 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts @@ -24,6 +24,7 @@ export class UmbRestoreFromRecycleBinEntityAction extends UmbEntityActionBase, UmbPickerModalValue> | string; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts index bbcf5e5185..25a428c959 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts @@ -46,6 +46,7 @@ export const manifests: Array = [ 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, },