From a2ae2d3e0d218ccb3a8fa6347389f6954e73a591 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 8 Feb 2023 09:48:57 +0100 Subject: [PATCH] use new extension point for bulk action + remove old --- .../collection-bulk-action.models.ts | 11 --- .../libs/extensions-registry/models.ts | 3 - .../repository/document.repository.ts | 5 +- .../media/entity-bulk-actions/manifests.ts | 13 +++ .../entity-bulk-actions/trash/trash.action.ts | 52 ++++++++++++ .../media/repository/media.repository.ts | 5 +- ...ection-bulk-action-media-delete.element.ts | 84 ------------------- .../collection/bulk-actions/manifests.ts | 16 ---- .../src/backoffice/shared/index.ts | 2 - 9 files changed, 71 insertions(+), 120 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/libs/extensions-registry/collection-bulk-action.models.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/trash/trash.action.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/bulk-actions/collection-bulk-action-media-delete.element.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/bulk-actions/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/collection-bulk-action.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/collection-bulk-action.models.ts deleted file mode 100644 index 9e8b57be93..0000000000 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/collection-bulk-action.models.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { ManifestElement } from './models'; - -export interface ManifestCollectionBulkAction extends ManifestElement { - type: 'collectionBulkAction'; - meta: MetaCollectionBulkAction; -} - -export interface MetaCollectionBulkAction { - label: string; - entityType: string; -} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models.ts index 27a0621dbf..765e468a6d 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models.ts @@ -1,4 +1,3 @@ -import type { ManifestCollectionBulkAction } from './collection-bulk-action.models'; import type { ManifestCollectionView } from './collection-view.models'; import type { ManifestDashboard } from './dashboard.models'; import type { ManifestDashboardCollection } from './dashboard-collection.models'; @@ -24,7 +23,6 @@ import type { ManifestWorkspaceViewCollection } from './workspace-view-collectio import type { ManifestRepository } from './repository.models'; import type { ClassConstructor } from '@umbraco-cms/models'; -export * from './collection-bulk-action.models'; export * from './collection-view.models'; export * from './dashboard-collection.models'; export * from './dashboard.models'; @@ -50,7 +48,6 @@ export * from './repository.models'; export * from './workspace.models'; export type ManifestTypes = - | ManifestCollectionBulkAction | ManifestCollectionView | ManifestCustom | ManifestDashboard diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts index 305e30c518..71184b84d2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts @@ -220,8 +220,9 @@ export class UmbDocumentRepository implements UmbTreeRepository, UmbDetailReposi // Listing all currently known methods we need to implement: // these currently only covers posting data // TODO: find a good way to split these - async trash() { - alert('trash'); + async trash(keys: Array) { + console.log('document trash: ' + keys); + alert('implement trash'); } async saveAndPublish() { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/manifests.ts index ee4059ed96..14a585f00a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/manifests.ts @@ -1,5 +1,6 @@ import { UmbMediaMoveEntityBulkAction } from './move/move.action'; import { UmbMediaCopyEntityBulkAction } from './copy/copy.action'; +import { UmbMediaTrashEntityBulkAction } from './trash/trash.action'; import { ManifestEntityBulkAction } from '@umbraco-cms/extensions-registry'; const entityType = 'media'; @@ -30,6 +31,18 @@ const entityActions: Array = [ api: UmbMediaCopyEntityBulkAction, }, }, + { + type: 'entityBulkAction', + alias: 'Umb.EntityBulkAction.Media.Trash', + name: 'Trash Media Entity Bulk Action', + weight: 80, + meta: { + entityType, + label: 'Trash', + repositoryAlias, + api: UmbMediaTrashEntityBulkAction, + }, + }, ]; export const manifests = [...entityActions]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/trash/trash.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/trash/trash.action.ts new file mode 100644 index 0000000000..753cadf65d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/entity-bulk-actions/trash/trash.action.ts @@ -0,0 +1,52 @@ +import type { UmbMediaRepository } from '../../repository/media.repository'; +import { UmbActionBase } from '../../../../shared/action'; +import { UmbControllerHostInterface } from '@umbraco-cms/controller'; +import { UmbContextConsumerController } from '@umbraco-cms/context-api'; +import { UmbModalService, UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/modal'; +import { html } from 'lit-html'; + +export class UmbMediaTrashEntityBulkAction extends UmbActionBase { + #selection: Array; + #modalService?: UmbModalService; + + constructor(host: UmbControllerHostInterface, repositoryAlias: string, selection: Array) { + super(host, repositoryAlias); + this.#selection = selection; + + new UmbContextConsumerController(host, UMB_MODAL_SERVICE_CONTEXT_TOKEN, (instance) => { + this.#modalService = instance; + }); + } + + setSelection(selection: Array) { + this.#selection = selection; + } + + async execute() { + // TODO: show error + if (!this.#modalService || !this.repository) return; + + // TODO: should we subscribe in cases like this? + const { data } = await this.repository.requestTreeItems(this.#selection); + + if (data) { + // TODO: use correct markup + const modalHandler = this.#modalService?.confirm({ + headline: `Deleting ${this.#selection.length} items`, + content: html` + This will delete the following files: +
    + ${data.map((item) => html`
  • ${item.name}
  • `)} +
+ `, + color: 'danger', + confirmLabel: 'Delete', + }); + + const { confirmed } = await modalHandler.onClose(); + if (confirmed) { + await this.repository?.trash(this.#selection); + } + } + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.repository.ts index 48f233f88a..c562f024ce 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.repository.ts @@ -213,8 +213,9 @@ export class UmbMediaRepository implements UmbTreeRepository, UmbDetailRepositor return { error }; } - async trash() { - alert('trash'); + async trash(keys: Array) { + console.log('media trash: ' + keys); + alert('implement trash'); } async move(keys: Array, destination: string) { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/bulk-actions/collection-bulk-action-media-delete.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/bulk-actions/collection-bulk-action-media-delete.element.ts deleted file mode 100644 index 9cec6d33a6..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/bulk-actions/collection-bulk-action-media-delete.element.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { UUITextStyles } from '@umbraco-ui/uui-css'; -import { css, html } from 'lit'; -import { customElement } from 'lit/decorators.js'; -import { ifDefined } from 'lit/directives/if-defined.js'; -import { map } from 'rxjs'; -import { repeat } from 'lit-html/directives/repeat.js'; -import { UmbCollectionContext, UMB_COLLECTION_CONTEXT_TOKEN } from '../collection.context'; -import { UmbModalService, UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '../../../../core/modal'; -import { UmbLitElement } from '@umbraco-cms/element'; -import type { ManifestCollectionBulkAction, MediaDetails } from '@umbraco-cms/models'; - -@customElement('umb-collection-bulk-action-media-delete') -export class UmbCollectionBulkActionDeleteElement extends UmbLitElement { - static styles = [UUITextStyles, css``]; - - // TODO: make a UmbCollectionContextMedia: - #collectionContext?: UmbCollectionContext; - - public manifest?: ManifestCollectionBulkAction; - - #modalService?: UmbModalService; - - constructor() { - super(); - - this.consumeContext(UMB_COLLECTION_CONTEXT_TOKEN, (context) => { - this.#collectionContext = context; - }); - - this.consumeContext(UMB_MODAL_SERVICE_CONTEXT_TOKEN, (instance) => { - this.#modalService = instance; - }); - } - - #handleClick(event: Event) { - // TODO: Revisit this subscription nightmare, can we make this simpler, avoid subscribing to the selection? - - const selectionSubscription = this.#collectionContext?.selection.subscribe((selection) => { - const dataSubscription = this.#collectionContext?.data - .pipe(map((items) => items.filter((item) => item.key && selection.includes(item.key)))) - .subscribe((items: Array) => { - const modalHandler = this.#modalService?.confirm({ - headline: `Deleting ${selection.length} items`, - content: html` - This will delete the following files: -
    - ${repeat( - items, - (item) => item.key, - (item) => html`
  • ${item.name}
  • ` - )} -
- `, - color: 'danger', - confirmLabel: 'Delete', - }); - modalHandler?.onClose().then(({ confirmed }) => { - selectionSubscription?.unsubscribe(); - dataSubscription?.unsubscribe(); - - if (confirmed) { - this.#collectionContext?.trash(selection); - this.#collectionContext?.clearSelection(); - } - }); - }); - }); - } - - render() { - // TODO: make a UmbCollectionContextMedia and use a deleteSelection method. - return html``; - } -} - -declare global { - interface HTMLElementTagNameMap { - 'umb-collection-bulk-action-media-delete': UmbCollectionBulkActionDeleteElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/bulk-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/bulk-actions/manifests.ts deleted file mode 100644 index 0a60ed6d77..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/bulk-actions/manifests.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { ManifestCollectionBulkAction } from '@umbraco-cms/models'; - -export const manifests: Array = [ - { - type: 'collectionBulkAction', - alias: 'Umb.CollectionBulkAction.Delete', - name: 'Delete', - elementName: 'umb-collection-bulk-action-media-delete', - loader: () => import('./collection-bulk-action-media-delete.element'), - weight: 200, - meta: { - label: 'Delete', - entityType: 'media', - }, - }, -]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/index.ts index a714adc802..c2b8157f67 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/index.ts @@ -3,7 +3,6 @@ import './components'; import { manifests as propertyActionManifests } from './property-actions/manifests'; import { manifests as propertyEditorModelManifests } from './property-editors/models/manifests'; import { manifests as propertyEditorUIManifests } from './property-editors/uis/manifests'; -import { manifests as collectionBulkActionManifests } from './collection/bulk-actions/manifests'; import { manifests as collectionViewManifests } from './collection/views/manifests'; import { umbExtensionsRegistry } from '@umbraco-cms/extensions-api'; @@ -20,6 +19,5 @@ registerExtensions([ ...propertyActionManifests, ...propertyEditorModelManifests, ...propertyEditorUIManifests, - ...collectionBulkActionManifests, ...collectionViewManifests, ]);