From 40467a5cb070753dd4733eaca4e82dbb73ee9802 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 26 Feb 2024 15:10:00 +0100 Subject: [PATCH] add bulk actions for publish and unpublish on documents --- .../publish/publish.action.ts | 11 ++- .../unpublish/unpublish.action.ts | 11 ++- .../document-variant-manager.context.ts | 72 ++++++++++++++++++- 3 files changed, 89 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/publish/publish.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/publish/publish.action.ts index c20657de25..6c1ddffc5f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/publish/publish.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/publish/publish.action.ts @@ -1,14 +1,21 @@ import type { UmbDocumentDetailRepository } from '../../repository/index.js'; +import { UMB_DOCUMENT_VARIANT_MANAGER_CONTEXT } from '../../global-contexts/index.js'; import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-bulk-action'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; export class UmbDocumentPublishEntityBulkAction extends UmbEntityBulkActionBase { + #variantManagerContext?: typeof UMB_DOCUMENT_VARIANT_MANAGER_CONTEXT.TYPE; + constructor(host: UmbControllerHostElement, repositoryAlias: string, selection: Array) { super(host, repositoryAlias, selection); + + this.consumeContext(UMB_DOCUMENT_VARIANT_MANAGER_CONTEXT, (context) => { + this.#variantManagerContext = context; + }); } async execute() { - console.log(`execute publish for: ${this.selection}`); - //await this.repository?.publish(); + if (!this.#variantManagerContext) throw new Error('Variant manager context is missing'); + await this.#variantManagerContext.publishIndescriminate(this.selection); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/unpublish/unpublish.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/unpublish/unpublish.action.ts index 03e9d01c7a..d6d42ec456 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/unpublish/unpublish.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/unpublish/unpublish.action.ts @@ -1,14 +1,21 @@ import type { UmbDocumentDetailRepository } from '../../repository/index.js'; +import { UMB_DOCUMENT_VARIANT_MANAGER_CONTEXT } from '../../global-contexts/index.js'; import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-bulk-action'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; export class UmbDocumentUnpublishEntityBulkAction extends UmbEntityBulkActionBase { + #variantManagerContext?: typeof UMB_DOCUMENT_VARIANT_MANAGER_CONTEXT.TYPE; + constructor(host: UmbControllerHostElement, repositoryAlias: string, selection: Array) { super(host, repositoryAlias, selection); + + this.consumeContext(UMB_DOCUMENT_VARIANT_MANAGER_CONTEXT, (context) => { + this.#variantManagerContext = context; + }); } async execute() { - console.log(`execute unpublish for: ${this.selection}`); - //await this.repository?.unpublish(); + if (!this.#variantManagerContext) throw new Error('Variant manager context is missing'); + await this.#variantManagerContext.unpublishIndescriminate(this.selection); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/global-contexts/document-variant-manager.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/global-contexts/document-variant-manager.context.ts index d0cababfed..b0e04e27f6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/global-contexts/document-variant-manager.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/global-contexts/document-variant-manager.context.ts @@ -11,7 +11,11 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; -import { UMB_APP_LANGUAGE_CONTEXT } from '@umbraco-cms/backoffice/language'; +import { + UMB_APP_LANGUAGE_CONTEXT, + UmbLanguageCollectionRepository, + type UmbLanguageDetailModel, +} from '@umbraco-cms/backoffice/language'; export class UmbDocumentVariantManagerContext extends UmbContextBase @@ -19,8 +23,10 @@ export class UmbDocumentVariantManagerContext { #publishingRepository = new UmbDocumentPublishingRepository(this); #documentRepository = new UmbDocumentDetailRepository(this); + #languageRepository = new UmbLanguageCollectionRepository(this); #modalManagerContext?: typeof UMB_MODAL_MANAGER_CONTEXT.TYPE; #appLanguageCulture?: string; + #languageCollection: Array = []; constructor(host: UmbControllerHost) { super(host, UMB_DOCUMENT_VARIANT_MANAGER_CONTEXT); @@ -34,6 +40,10 @@ export class UmbDocumentVariantManagerContext this.#appLanguageCulture = culture?.toLowerCase(); }); }); + + this.#languageRepository.requestCollection({}).then(({ data }) => { + this.#languageCollection = data?.items ?? []; + }); } /** @@ -112,6 +122,66 @@ export class UmbDocumentVariantManagerContext await this.#publishingRepository.unpublish(documentUnique, variantIds); } } + + /** + * Publish the latest version of documents indescriminately allowing the user to choose between all languages. + * @param documentUniques The unique identifiers of the documents. + */ + async publishIndescriminate(documentUniques: Array) { + // Map to UmbDocumentVariantModel for now, until we have a proper variant model for the variant picker. + const variants: Array = this.#languageCollection.map((x) => ({ + culture: x.unique, + segment: null, + name: x.name, + isMandatory: x.isMandatory, + state: UmbDocumentVariantState.PUBLISHED, + createDate: '', + updateDate: '', + publishDate: '', + })); + + const variantIds = await this.pickVariants( + variants, + 'publish', + this.#appLanguageCulture ? [this.#appLanguageCulture] : undefined, + ); + + if (variantIds.length) { + for (const documentUnique of documentUniques) { + await this.#publishingRepository.publish(documentUnique, variantIds); + } + } + } + + /** + * Unpublish the latest version of documents indescriminately allowing the user to choose between all languages. + * @param documentUniques The unique identifiers of the documents. + */ + async unpublishIndescriminate(documentUniques: Array) { + // Map to UmbDocumentVariantModel for now, until we have a proper variant model for the variant picker. + const variants: Array = this.#languageCollection.map((x) => ({ + culture: x.unique, + segment: null, + name: x.name, + isMandatory: x.isMandatory, + state: UmbDocumentVariantState.PUBLISHED, + createDate: '', + updateDate: '', + publishDate: '', + })); + + const variantIds = await this.pickVariants( + variants, + 'unpublish', + this.#appLanguageCulture ? [this.#appLanguageCulture] : undefined, + ); + + if (variantIds.length) { + for (const documentUnique of documentUniques) { + await this.#publishingRepository.unpublish(documentUnique, variantIds); + } + } + } } export default UmbDocumentVariantManagerContext;