From 9a3cd86f949e1d238e4179b147bef45391cebb73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 20 Nov 2024 12:55:08 +0100 Subject: [PATCH 01/68] implement validation for media and prepare for member --- .../src/packages/core/content/index.ts | 3 +- ...content-validation-repository.interface.ts | 8 ++ .../packages/core/content/repository/index.ts | 1 + .../content-detail-workspace-base.ts | 56 +++++++++++- .../document-validation.repository.ts | 6 +- .../document-validation.server.data-source.ts | 7 -- .../workspace/document-workspace.context.ts | 37 +------- .../media/repository/validation/index.ts | 2 +- .../media/repository/validation/manifests.ts | 2 +- .../validation/media-validation.repository.ts | 6 +- .../media-validation.server.data-source.ts | 9 +- .../workspace/media-workspace.context.ts | 2 + .../members/member/repository/index.ts | 1 + .../members/member/repository/manifests.ts | 3 +- .../member/repository/validation/index.ts | 2 + .../member/repository/validation/manifests.ts | 10 +++ .../member-validation.repository.ts | 48 ++++++++++ .../member-validation.server.data-source.ts | 89 +++++++++++++++++++ .../member/member-workspace.context.ts | 4 +- 19 files changed, 239 insertions(+), 57 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/content/repository/content-validation-repository.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/content/repository/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/members/member/repository/validation/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/members/member/repository/validation/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/members/member/repository/validation/member-validation.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/members/member/repository/validation/member-validation.server.data-source.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content/index.ts index fa596229b643..a532e7485e92 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content/index.ts @@ -7,6 +7,7 @@ export * from './constants.js'; export * from './controller/merge-content-variant-data.controller.js'; export * from './manager/index.js'; export * from './property-dataset-context/index.js'; -export type * from './variant-picker/index.js'; export * from './workspace/index.js'; +export type * from './repository/index.js'; export type * from './types.js'; +export type * from './variant-picker/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content/repository/content-validation-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content/repository/content-validation-repository.interface.ts new file mode 100644 index 000000000000..f9630705e441 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content/repository/content-validation-repository.interface.ts @@ -0,0 +1,8 @@ +import type { UmbContentDetailModel } from '../types.js'; +import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import type { UmbDataSourceResponse } from '@umbraco-cms/backoffice/repository'; + +export interface UmbContentValidationRepository { + validateCreate(model: DetailModelType, parentUnique: string | null): Promise>; + validateSave(model: DetailModelType, variantIds: Array): Promise>; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content/repository/index.ts new file mode 100644 index 000000000000..73d477550497 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content/repository/index.ts @@ -0,0 +1 @@ +export type * from './content-validation-repository.interface.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts index 814ffafd884c..db0a159d0df1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts @@ -3,6 +3,7 @@ import { UmbContentWorkspaceDataManager } from '../manager/index.js'; import { UmbMergeContentVariantDataController } from '../controller/merge-content-variant-data.controller.js'; import type { UmbContentVariantPickerData, UmbContentVariantPickerValue } from '../variant-picker/index.js'; import type { UmbContentPropertyDatasetContext } from '../property-dataset-context/index.js'; +import type { UmbContentValidationRepository } from '../repository/content-validation-repository.interface.js'; import type { UmbContentWorkspaceContext } from './content-workspace-context.interface.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbDetailRepository, UmbDetailRepositoryConstructor } from '@umbraco-cms/backoffice/repository'; @@ -33,6 +34,7 @@ import { UMB_VALIDATION_CONTEXT, UMB_VALIDATION_EMPTY_LOCALIZATION_KEY, UmbDataPathVariantQuery, + UmbServerModelValidatorContext, UmbValidationContext, UmbVariantsValidationPathTranslator, UmbVariantValuesValidationPathTranslator, @@ -44,6 +46,7 @@ import { UmbRequestReloadChildrenOfEntityEvent, UmbRequestReloadStructureForEntityEvent, } from '@umbraco-cms/backoffice/entity-action'; +import type { ClassConstructor } from '@umbraco-cms/backoffice/extension-api'; export interface UmbContentDetailWorkspaceContextArgs< DetailModelType extends UmbContentDetailModel, @@ -54,6 +57,8 @@ export interface UmbContentDetailWorkspaceContextArgs< VariantOptionModelType extends UmbEntityVariantOptionModel = UmbEntityVariantOptionModel, > extends UmbEntityDetailWorkspaceContextArgs { contentTypeDetailRepository: UmbDetailRepositoryConstructor; + contentValidationRepository?: ClassConstructor>; + skipValidationOnSubmit?: boolean; contentVariantScaffold: VariantModelType; saveModalToken?: UmbModalToken, UmbContentVariantPickerValue>; } @@ -118,6 +123,11 @@ export abstract class UmbContentDetailWorkspaceContextBase< // TODO: fix type error public readonly variantOptions; + #validateOnSubmit: boolean; + #serverValidation = new UmbServerModelValidatorContext(this); + #validationRepositoryClass?: ClassConstructor>; + #validationRepository?: UmbContentValidationRepository; + #saveModalToken?: UmbModalToken, UmbContentVariantPickerValue>; constructor( @@ -135,6 +145,8 @@ export abstract class UmbContentDetailWorkspaceContextBase< this.#saveModalToken = args.saveModalToken; const contentTypeDetailRepository = new args.contentTypeDetailRepository(this); + this.#validationRepositoryClass = args.contentValidationRepository; + this.#validateOnSubmit = args.skipValidationOnSubmit ? !args.skipValidationOnSubmit : true; this.structure = new UmbContentTypeStructureManager(this, contentTypeDetailRepository); this.variesByCulture = this.structure.ownerContentTypeObservablePart((x) => x?.variesByCulture); this.variesBySegment = this.structure.ownerContentTypeObservablePart((x) => x?.variesBySegment); @@ -470,6 +482,36 @@ export abstract class UmbContentDetailWorkspaceContextBase< } } + protected async _askServerToValidate(saveData: DetailModelType, variantIds: Array) { + if (this.#validationRepositoryClass) { + // Create the validation repository if it does not exist. (we first create this here when we need it) [NL] + this.#validationRepository ??= new this.#validationRepositoryClass(this); + + // We ask the server first to get a concatenated set of validation messages. So we see both front-end and back-end validation messages [NL] + if (this.getIsNew()) { + const parent = this.getParent(); + if (!parent) throw new Error('Parent is not set'); + await this.#serverValidation.askServerForValidation( + saveData, + this.#validationRepository.validateCreate(saveData, parent.unique), + ); + } else { + await this.#serverValidation.askServerForValidation( + saveData, + this.#validationRepository.validateSave(saveData, variantIds), + ); + } + } + } + + /** + * Request a submit of the workspace, in the case of Document Workspaces the validation does not need to be valid for this to be submitted. + * @returns {Promise} a promise which resolves once it has been completed. + */ + public override requestSubmit() { + return this._handleSubmit(); + } + public override submit() { return this._handleSubmit(); } @@ -513,7 +555,19 @@ export abstract class UmbContentDetailWorkspaceContextBase< const saveData = await this._data.constructData(variantIds); await this._runMandatoryValidationForSaveData(saveData); - await this._performCreateOrUpdate(variantIds, saveData); + if (this.#validateOnSubmit) { + await this._askServerToValidate(saveData, variantIds); + return this.validateAndSubmit( + async () => { + return this._performCreateOrUpdate(variantIds, saveData); + }, + async () => { + return this.invalidSubmit(); + }, + ); + } else { + await this._performCreateOrUpdate(variantIds, saveData); + } } protected async _performCreateOrUpdate(variantIds: Array, saveData: DetailModelType) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/validation/document-validation.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/validation/document-validation.repository.ts index 3f48df28c0cc..b8c5ac3106b2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/validation/document-validation.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/validation/document-validation.repository.ts @@ -3,10 +3,14 @@ import { UmbDocumentValidationServerDataSource } from './document-validation.ser import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; +import type { UmbContentValidationRepository } from '@umbraco-cms/backoffice/content'; type DetailModelType = UmbDocumentDetailModel; -export class UmbDocumentValidationRepository extends UmbRepositoryBase { +export class UmbDocumentValidationRepository + extends UmbRepositoryBase + implements UmbContentValidationRepository +{ #validationDataSource: UmbDocumentValidationServerDataSource; constructor(host: UmbControllerHost) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/validation/document-validation.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/validation/document-validation.server.data-source.ts index d32e1120f0e1..85ab9d7550f1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/validation/document-validation.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/validation/document-validation.server.data-source.ts @@ -11,17 +11,10 @@ import type { UmbEntityUnique } from '@umbraco-cms/backoffice/entity'; /** * A server data source for Document Validation - * @class UmbDocumentPublishingServerDataSource - * @implements {DocumentTreeDataSource} */ export class UmbDocumentValidationServerDataSource { //#host: UmbControllerHost; - /** - * Creates an instance of UmbDocumentPublishingServerDataSource. - * @param {UmbControllerHost} host - The controller host for this controller to be appended to - * @memberof UmbDocumentPublishingServerDataSource - */ // TODO: [v15]: ignoring unused var here here to prevent a breaking change // eslint-disable-next-line @typescript-eslint/no-unused-vars constructor(host: UmbControllerHost) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index e77dac186700..dc04c53829ed 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -35,7 +35,6 @@ import { UmbRequestReloadStructureForEntityEvent, } from '@umbraco-cms/backoffice/entity-action'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; -import { UmbServerModelValidatorContext } from '@umbraco-cms/backoffice/validation'; import { UmbDocumentBlueprintDetailRepository } from '@umbraco-cms/backoffice/document-blueprint'; import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; import { @@ -64,9 +63,6 @@ export class UmbDocumentWorkspaceContext { public readonly publishingRepository = new UmbDocumentPublishingRepository(this); - #serverValidation = new UmbServerModelValidatorContext(this); - #validationRepository?: UmbDocumentValidationRepository; - readonly isTrashed = this._data.createObservablePartOfCurrent((data) => data?.isTrashed); readonly contentTypeUnique = this._data.createObservablePartOfCurrent((data) => data?.documentType.unique); readonly contentTypeHasCollection = this._data.createObservablePartOfCurrent( @@ -83,6 +79,8 @@ export class UmbDocumentWorkspaceContext workspaceAlias: UMB_DOCUMENT_WORKSPACE_ALIAS, detailRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, contentTypeDetailRepository: UmbDocumentTypeDetailRepository, + contentValidationRepository: UmbDocumentValidationRepository, + skipValidationOnSubmit: true, contentVariantScaffold: UMB_DOCUMENT_DETAIL_MODEL_VARIANT_SCAFFOLD, saveModalToken: UMB_DOCUMENT_SAVE_MODAL, }); @@ -208,19 +206,6 @@ export class UmbDocumentWorkspaceContext this._data.updateCurrent({ template: { unique: templateUnique } }); } - /** - * Request a submit of the workspace, in the case of Document Workspaces the validation does not need to be valid for this to be submitted. - * @returns {Promise} a promise which resolves once it has been completed. - */ - public override requestSubmit() { - return this._handleSubmit(); - } - - // Because we do not make validation prevent submission this also submits the workspace. [NL] - public override invalidSubmit() { - return this._handleSubmit(); - } - async #handleSaveAndPreview() { const unique = this.getUnique(); if (!unique) throw new Error('Unique is missing'); @@ -289,23 +274,7 @@ export class UmbDocumentWorkspaceContext const saveData = await this._data.constructData(variantIds); await this._runMandatoryValidationForSaveData(saveData); - // Create the validation repository if it does not exist. (we first create this here when we need it) [NL] - this.#validationRepository ??= new UmbDocumentValidationRepository(this); - - // We ask the server first to get a concatenated set of validation messages. So we see both front-end and back-end validation messages [NL] - if (this.getIsNew()) { - const parent = this.getParent(); - if (!parent) throw new Error('Parent is not set'); - this.#serverValidation.askServerForValidation( - saveData, - this.#validationRepository.validateCreate(saveData, parent.unique), - ); - } else { - this.#serverValidation.askServerForValidation( - saveData, - this.#validationRepository.validateSave(saveData, variantIds), - ); - } + await this._askServerToValidate(saveData, variantIds); // TODO: Only validate the specified selection.. [NL] return this.validateAndSubmit( diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/validation/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/validation/index.ts index 9fbf43afefd5..a6e91e60c248 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/validation/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/validation/index.ts @@ -1,2 +1,2 @@ -export { UmbMediaValidationRepository as UmbDocumentValidationRepository } from './media-validation.repository.js'; export { UMB_MEDIA_VALIDATION_REPOSITORY_ALIAS } from './manifests.js'; +export { UmbMediaValidationRepository } from './media-validation.repository.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/validation/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/validation/manifests.ts index 1aea149f16fe..24e59a9d73f5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/validation/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/validation/manifests.ts @@ -1,4 +1,4 @@ -export const UMB_MEDIA_VALIDATION_REPOSITORY_ALIAS = 'Umb.Repository.Document.Validation'; +export const UMB_MEDIA_VALIDATION_REPOSITORY_ALIAS = 'Umb.Repository.Media.Validation'; export const manifests: Array = [ { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/validation/media-validation.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/validation/media-validation.repository.ts index 85faf65a999a..54c0825d2ed4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/validation/media-validation.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/validation/media-validation.repository.ts @@ -3,10 +3,14 @@ import { UmbMediaValidationServerDataSource } from './media-validation.server.da import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; +import type { UmbContentValidationRepository } from '@umbraco-cms/backoffice/content'; type DetailModelType = UmbMediaDetailModel; -export class UmbMediaValidationRepository extends UmbRepositoryBase { +export class UmbMediaValidationRepository + extends UmbRepositoryBase + implements UmbContentValidationRepository +{ #validationDataSource: UmbMediaValidationServerDataSource; constructor(host: UmbControllerHost) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/validation/media-validation.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/validation/media-validation.server.data-source.ts index 5c2737af08a3..ef4d12057b87 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/validation/media-validation.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/validation/media-validation.server.data-source.ts @@ -10,18 +10,11 @@ import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import type { UmbEntityUnique } from '@umbraco-cms/backoffice/entity'; /** - * A server data source for Document Validation - * @class UmbDocumentPublishingServerDataSource - * @implements {DocumentTreeDataSource} + * A server data source for Media Validation */ export class UmbMediaValidationServerDataSource { //#host: UmbControllerHost; - /** - * Creates an instance of UmbDocumentPublishingServerDataSource. - * @param {UmbControllerHost} host - The controller host for this controller to be appended to - * @memberof UmbDocumentPublishingServerDataSource - */ // TODO: [v15]: ignoring unused var here here to prevent a breaking change // eslint-disable-next-line @typescript-eslint/no-unused-vars constructor(host: UmbControllerHost) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts index 5e7c356c3a78..2119a693ad74 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/media-workspace.context.ts @@ -6,6 +6,7 @@ import { UMB_MEDIA_DETAIL_REPOSITORY_ALIAS } from '../repository/index.js'; import type { UmbMediaDetailModel, UmbMediaVariantModel } from '../types.js'; import { UMB_CREATE_MEDIA_WORKSPACE_PATH_PATTERN, UMB_EDIT_MEDIA_WORKSPACE_PATH_PATTERN } from '../paths.js'; import { UMB_MEDIA_COLLECTION_ALIAS } from '../collection/index.js'; +import { UmbMediaValidationRepository } from '../repository/validation/media-validation.repository.js'; import { UMB_MEMBER_DETAIL_MODEL_VARIANT_SCAFFOLD } from './constants.js'; import { UMB_MEDIA_WORKSPACE_ALIAS } from './manifests.js'; import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; @@ -49,6 +50,7 @@ export class UmbMediaWorkspaceContext workspaceAlias: UMB_MEDIA_WORKSPACE_ALIAS, detailRepositoryAlias: UMB_MEDIA_DETAIL_REPOSITORY_ALIAS, contentTypeDetailRepository: UmbMediaTypeDetailRepository, + contentValidationRepository: UmbMediaValidationRepository, contentVariantScaffold: UMB_MEMBER_DETAIL_MODEL_VARIANT_SCAFFOLD, }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/index.ts index 287056d2a107..04ad07963c90 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/index.ts @@ -1,2 +1,3 @@ export { UmbMemberDetailRepository, UMB_MEMBER_DETAIL_REPOSITORY_ALIAS } from './detail/index.js'; export { UmbMemberItemRepository, UMB_MEMBER_ITEM_REPOSITORY_ALIAS, type UmbMemberItemModel } from './item/index.js'; +export * from './validation/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/manifests.ts index 4dfb0c911f4e..74a3121896bb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/manifests.ts @@ -1,4 +1,5 @@ import { manifests as detailManifests } from './detail/manifests.js'; import { manifests as itemManifests } from './item/manifests.js'; +import { manifests as validationManifests } from './validation/manifests.js'; -export const manifests: Array = [...detailManifests, ...itemManifests]; +export const manifests: Array = [...detailManifests, ...itemManifests, ...validationManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/validation/index.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/validation/index.ts new file mode 100644 index 000000000000..b9b6aaf0dc65 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/validation/index.ts @@ -0,0 +1,2 @@ +export { UmbMemberValidationRepository } from './member-validation.repository.js'; +export { UMB_MEMBER_VALIDATION_REPOSITORY_ALIAS } from './manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/validation/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/validation/manifests.ts new file mode 100644 index 000000000000..e88d2792af2e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/validation/manifests.ts @@ -0,0 +1,10 @@ +export const UMB_MEMBER_VALIDATION_REPOSITORY_ALIAS = 'Umb.Repository.Member.Validation'; + +export const manifests: Array = [ + { + type: 'repository', + alias: UMB_MEMBER_VALIDATION_REPOSITORY_ALIAS, + name: 'Member Validation Repository', + api: () => import('./member-validation.repository.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/validation/member-validation.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/validation/member-validation.repository.ts new file mode 100644 index 000000000000..648b5b9a9efa --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/validation/member-validation.repository.ts @@ -0,0 +1,48 @@ +import type { UmbMemberDetailModel } from '../../types.js'; +import { UmbMemberValidationServerDataSource } from './member-validation.server.data-source.js'; +import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; +import type { UmbContentValidationRepository } from '@umbraco-cms/backoffice/content'; + +type DetailModelType = UmbMemberDetailModel; + +export class UmbMemberValidationRepository + extends UmbRepositoryBase + implements UmbContentValidationRepository +{ + #validationDataSource: UmbMemberValidationServerDataSource; + + constructor(host: UmbControllerHost) { + super(host); + + this.#validationDataSource = new UmbMemberValidationServerDataSource(this); + } + + /** + * Returns a promise with an observable of the detail for the given unique + * @param {DetailModelType} model - The model to validate + * @param {string | null} [parentUnique] - The parent unique + * @returns {*} + */ + async validateCreate(model: DetailModelType, parentUnique: string | null) { + if (!model) throw new Error('Data is missing'); + + return this.#validationDataSource.validateCreate(model, parentUnique); + } + + /** + * Saves the given data + * @param {DetailModelType} model - The model to save + * @param {Array} variantIds - The variant ids to save + * @returns {*} + */ + async validateSave(model: DetailModelType, variantIds: Array) { + if (!model) throw new Error('Data is missing'); + if (!model.unique) throw new Error('Unique is missing'); + + return this.#validationDataSource.validateUpdate(model, variantIds); + } +} + +export { UmbMemberValidationRepository as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/validation/member-validation.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/validation/member-validation.server.data-source.ts new file mode 100644 index 000000000000..6dac610d9c98 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/validation/member-validation.server.data-source.ts @@ -0,0 +1,89 @@ +import type { UmbMemberDetailModel } from '../../types.js'; +import { + type CreateMemberRequestModel, + MemberService, + type UpdateMemberRequestModel, +} from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecute } from '@umbraco-cms/backoffice/resources'; +import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import type { UmbEntityUnique } from '@umbraco-cms/backoffice/entity'; + +/** + * A server data source for Member Validation + */ +export class UmbMemberValidationServerDataSource { + //#host: UmbControllerHost; + + // TODO: [v15]: ignoring unused var here here to prevent a breaking change + // eslint-disable-next-line @typescript-eslint/no-unused-vars + constructor(host: UmbControllerHost) { + //this.#host = host; + } + + /** + * Validate a new Member on the server + * @param {UmbMemberDetailModel} model - Member Model + * @param {UmbEntityUnique} parentUnique - Parent Unique + * @returns {*} - The response from the server + */ + async validateCreate(model: UmbMemberDetailModel, parentUnique: UmbEntityUnique = null) { + if (!model) throw new Error('Member is missing'); + if (!model.unique) throw new Error('Member unique is missing'); + if (!model.newPassword) throw new Error('Member newPassword is missing'); + if (parentUnique === undefined) throw new Error('Parent unique is missing'); + + // TODO: make data mapper to prevent errors + const requestBody: CreateMemberRequestModel = { + email: model.email, + username: model.username, + password: model.newPassword, + isApproved: model.isApproved, + id: model.unique, + memberType: { id: model.memberType.unique }, + values: model.values, + variants: model.variants, + }; + + // Maybe use: tryExecuteAndNotify + return tryExecute( + //this.#host, + MemberService.postMemberValidate({ + requestBody, + }), + ); + } + + /** + * Validate a existing Member + * @param {UmbMemberDetailModel} model - Member Model + * @param {Array} variantIds - Variant Ids + * @returns {Promise<*>} - The response from the server + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async validateUpdate(model: UmbMemberDetailModel, variantIds: Array) { + if (!model.unique) throw new Error('Unique is missing'); + + //const cultures = variantIds.map((id) => id.culture).filter((culture) => culture !== null) as Array; + + // TODO: make data mapper to prevent errors + const requestBody: UpdateMemberRequestModel = { + email: model.email, + username: model.username, + isApproved: model.isApproved, + isLockedOut: model.isLockedOut, + isTwoFactorEnabled: model.isTwoFactorEnabled, + values: model.values, + variants: model.variants, + }; + + // Maybe use: tryExecuteAndNotify + return tryExecute( + //this.#host, + MemberService.putMemberByIdValidate({ + id: model.unique, + requestBody, + }), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace.context.ts index d21e65c1f202..b6a0b3d43e01 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace.context.ts @@ -1,5 +1,5 @@ import type { UmbMemberDetailRepository } from '../../repository/index.js'; -import { UMB_MEMBER_DETAIL_REPOSITORY_ALIAS } from '../../repository/index.js'; +import { UMB_MEMBER_DETAIL_REPOSITORY_ALIAS, UmbMemberValidationRepository } from '../../repository/index.js'; import type { UmbMemberDetailModel, UmbMemberVariantModel } from '../../types.js'; import { UmbMemberPropertyDatasetContext } from '../../property-dataset-context/member-property-dataset-context.js'; import { UMB_MEMBER_ENTITY_TYPE, UMB_MEMBER_ROOT_ENTITY_TYPE } from '../../entity.js'; @@ -38,6 +38,8 @@ export class UmbMemberWorkspaceContext workspaceAlias: UMB_MEMBER_WORKSPACE_ALIAS, detailRepositoryAlias: UMB_MEMBER_DETAIL_REPOSITORY_ALIAS, contentTypeDetailRepository: UmbMemberTypeDetailRepository, + // TODO: Enable Validation Repository when we have UI for showing validation issues on other tabs. [NL] + //contentValidationRepository: UmbMemberValidationRepository, contentVariantScaffold: UMB_MEMBER_DETAIL_MODEL_VARIANT_SCAFFOLD, }); From c48c82b346ad54a9d765619434bdd2313a21aa89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 25 Nov 2024 12:38:43 +0100 Subject: [PATCH 02/68] remove import --- .../members/member/workspace/member/member-workspace.context.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace.context.ts index b6a0b3d43e01..f2d0a4815c70 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace.context.ts @@ -1,5 +1,5 @@ import type { UmbMemberDetailRepository } from '../../repository/index.js'; -import { UMB_MEMBER_DETAIL_REPOSITORY_ALIAS, UmbMemberValidationRepository } from '../../repository/index.js'; +import { UMB_MEMBER_DETAIL_REPOSITORY_ALIAS } from '../../repository/index.js'; import type { UmbMemberDetailModel, UmbMemberVariantModel } from '../../types.js'; import { UmbMemberPropertyDatasetContext } from '../../property-dataset-context/member-property-dataset-context.js'; import { UMB_MEMBER_ENTITY_TYPE, UMB_MEMBER_ROOT_ENTITY_TYPE } from '../../entity.js'; From ed45a2b5ddd326ff244e685dc8ad889092755ded Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 3 Dec 2024 14:59:38 +0100 Subject: [PATCH 03/68] port code from backoffice repo --- .../packages/documents/documents/manifests.ts | 2 + ...ument-published-pending-changes.manager.ts | 53 +++++++++++++++++++ ...ment-publishing.workspace-context.token.ts | 8 +++ .../document-publishing.workspace-context.ts | 38 +++++++++++++ .../documents/publishing/manifests.ts | 17 ++++++ 5 files changed, 118 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-published-pending-changes.manager.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/manifests.ts index 8b4d51bb6e6e..bb29839ea2ff 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/manifests.ts @@ -6,6 +6,7 @@ import { manifests as menuManifests } from './menu/manifests.js'; import { manifests as modalManifests } from './modals/manifests.js'; import { manifests as pickerManifests } from './picker/manifests.js'; import { manifests as propertyEditorManifests } from './property-editors/manifests.js'; +import { manifests as publishingManifests } from './publishing/manifests.js'; import { manifests as recycleBinManifests } from './recycle-bin/manifests.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; import { manifests as rollbackManifests } from './rollback/manifests.js'; @@ -26,6 +27,7 @@ export const manifests: Array = ...modalManifests, ...pickerManifests, ...propertyEditorManifests, + ...publishingManifests, ...recycleBinManifests, ...repositoryManifests, ...rollbackManifests, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-published-pending-changes.manager.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-published-pending-changes.manager.ts new file mode 100644 index 000000000000..2949363a93c1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-published-pending-changes.manager.ts @@ -0,0 +1,53 @@ +import type { UmbDocumentDetailModel } from '../types.js'; +import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; +import { UmbMergeContentVariantDataController } from '@umbraco-cms/backoffice/content'; +import { jsonStringComparison, UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; + +interface UmbDocumentPublishedPendingChangesManagerProcessArgs { + currentData: UmbDocumentDetailModel; + publishedData: UmbDocumentDetailModel; +} + +interface UmbVariantWithChanges { + variantId: UmbVariantId; +} + +export class UmbDocumentPublishedPendingChangesManager extends UmbControllerBase { + #variantsWithChanges = new UmbArrayState([], (x) => x.variantId.toString()); + public readonly variantsWithChanges = this.#variantsWithChanges.asObservable(); + + /** + * Checks each variant if there are any pending changes to publish. + * @param {UmbDocumentPublishedPendingChangesManagerProcessArgs} args - The arguments for the process. + * @param {string} args.unique - The unique identifier of the document. + * @param {UmbDocumentDetailModel} args.currentData - The current document data. + * @returns {Promise} + * @memberof UmbPublishedPendingChangesManager + */ + async process(args: UmbDocumentPublishedPendingChangesManagerProcessArgs): Promise { + if (!args.currentData) throw new Error('Current Data is missing'); + if (!args.publishedData) throw new Error('Published Data is missing'); + + const variantIds = args.currentData.variants?.map((x) => UmbVariantId.Create(x)) ?? []; + + const pendingChangesPromises = variantIds.map(async (variantId) => { + const mergedData = await new UmbMergeContentVariantDataController(this).process( + args.publishedData, + args.currentData, + [variantId], + [variantId], + ); + + if (jsonStringComparison(mergedData, args.publishedData) === false) { + return { variantId }; + } else { + return null; + } + }); + + const variantsWithPendingChanges = (await Promise.all(pendingChangesPromises)).filter((x) => x !== null); + + this.#variantsWithChanges.setValue(variantsWithPendingChanges); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.token.ts new file mode 100644 index 000000000000..026c6b20ff5b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.token.ts @@ -0,0 +1,8 @@ +import type { UmbDocumentPublishingWorkspaceContext } from './document-publishing-workspace.context.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT = new UmbContextToken( + 'UmbWorkspaceContext', + undefined, + (context): context is UmbDocumentPublishingWorkspaceContext => context.publishedPendingChanges !== undefined, +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts new file mode 100644 index 000000000000..083810907650 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts @@ -0,0 +1,38 @@ +import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../workspace/document-workspace.context-token.js'; +import { UmbDocumentPublishingRepository } from '../repository/index.js'; +import { UmbDocumentPublishedPendingChangesManager } from './document-published-pending-changes.manager.js'; +import { UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT } from './document-publishing.workspace-context.token.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; + +export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { + public readonly publishedPendingChanges = new UmbDocumentPublishedPendingChangesManager(this); + + #publishingRepository = new UmbDocumentPublishingRepository(this); + + constructor(host: UmbControllerHost) { + super(host, UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT); + + this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, async (instance) => { + // No need to check pending changes for new documents + if (instance.getIsNew()) { + return; + } + + this.observe(instance.unique, async (unique) => { + if (unique) { + const { data: publishedData } = await this.#publishingRepository.published(unique); + const currentData = instance.getData(); + + if (!currentData || !publishedData) { + return; + } + + this.publishedPendingChanges.process({ currentData, publishedData }); + } + }); + }); + } +} + +export { UmbDocumentPublishingWorkspaceContext as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts new file mode 100644 index 000000000000..c99bd4579a1f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts @@ -0,0 +1,17 @@ +import { UMB_DOCUMENT_WORKSPACE_ALIAS } from '../workspace/constants.js'; +import { UMB_WORKSPACE_CONDITION_ALIAS } from '@umbraco-cms/backoffice/workspace'; + +export const manifests: Array = [ + { + type: 'workspaceContext', + name: 'Document Publishing Workspace Context', + alias: 'Umb.WorkspaceContext.Document.Publishing', + api: () => import('./document-publishing-workspace.context.js'), + conditions: [ + { + alias: UMB_WORKSPACE_CONDITION_ALIAS, + match: UMB_DOCUMENT_WORKSPACE_ALIAS, + }, + ], + }, +]; From e35327fd5ac27f99f68ea0eeff339a0bdf5eb33b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 3 Dec 2024 15:06:07 +0100 Subject: [PATCH 04/68] move repo into publishing module --- .../documents/documents/entity-actions/publish.action.ts | 3 ++- .../documents/entity-actions/unpublish.action.ts | 3 ++- .../entity-bulk-actions/publish/publish.action.ts | 2 +- .../entity-bulk-actions/unpublish/unpublish.action.ts | 2 +- .../src/packages/documents/documents/index.ts | 1 + .../document-publishing.workspace-context.token.ts | 2 +- .../publishing/document-publishing.workspace-context.ts | 2 +- .../src/packages/documents/documents/publishing/index.ts | 1 + .../packages/documents/documents/publishing/manifests.ts | 4 +++- .../repository}/document-publishing.repository.ts | 0 .../repository}/document-publishing.server.data-source.ts | 0 .../publishing => publishing/repository}/index.ts | 0 .../publishing => publishing/repository}/manifests.ts | 0 .../src/packages/documents/documents/repository/index.ts | 1 - .../packages/documents/documents/repository/manifests.ts | 8 +------- .../documents/workspace/document-workspace.context.ts | 2 +- 16 files changed, 15 insertions(+), 16 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{repository/publishing => publishing/repository}/document-publishing.repository.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{repository/publishing => publishing/repository}/document-publishing.server.data-source.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{repository/publishing => publishing/repository}/index.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{repository/publishing => publishing/repository}/manifests.ts (100%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/publish.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/publish.action.ts index 845f47e73de9..7b83309ace7f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/publish.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/publish.action.ts @@ -1,5 +1,6 @@ import { UMB_DOCUMENT_PUBLISH_MODAL } from '../modals/publish-modal/index.js'; -import { UmbDocumentDetailRepository, UmbDocumentPublishingRepository } from '../repository/index.js'; +import { UmbDocumentDetailRepository } from '../repository/index.js'; +import { UmbDocumentPublishingRepository } from '../publishing/index.js'; import type { UmbDocumentVariantOptionModel } from '../types.js'; import { UMB_APP_LANGUAGE_CONTEXT, UmbLanguageCollectionRepository } from '@umbraco-cms/backoffice/language'; import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/unpublish.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/unpublish.action.ts index a885966c8805..24e1a91828e6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/unpublish.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/unpublish.action.ts @@ -1,4 +1,5 @@ -import { UmbDocumentDetailRepository, UmbDocumentPublishingRepository } from '../repository/index.js'; +import { UmbDocumentDetailRepository } from '../repository/index.js'; +import { UmbDocumentPublishingRepository } from '../publishing/repository/index.js'; import type { UmbDocumentVariantOptionModel } from '../types.js'; import { UMB_DOCUMENT_UNPUBLISH_MODAL } from '../modals/index.js'; import { UMB_APP_LANGUAGE_CONTEXT, UmbLanguageCollectionRepository } from '@umbraco-cms/backoffice/language'; 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 84e024fb6476..596a57407f11 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,4 +1,4 @@ -import { UmbDocumentPublishingRepository } from '../../repository/index.js'; +import { UmbDocumentPublishingRepository } from '../../publishing/index.js'; import { UmbPublishDocumentEntityAction } from '../../entity-actions/publish.action.js'; import type { UmbDocumentVariantOptionModel } from '../../types.js'; import { UMB_DOCUMENT_PUBLISH_MODAL } from '../../modals/index.js'; 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 907dbd9ed107..5a90b5d37db2 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,6 +1,6 @@ import { UmbUnpublishDocumentEntityAction } from '../../entity-actions/unpublish.action.js'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; -import { UmbDocumentPublishingRepository } from '../../repository/index.js'; +import { UmbDocumentPublishingRepository } from '../../publishing/index.js'; import type { UmbDocumentVariantOptionModel } from '../../types.js'; import { UMB_DOCUMENT_UNPUBLISH_MODAL } from '../../modals/index.js'; import { UMB_CONFIRM_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/index.ts index 16628f33b623..cc999aaeebea 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/index.ts @@ -7,6 +7,7 @@ export * from './entity.js'; export * from './global-contexts/index.js'; export * from './modals/index.js'; export * from './paths.js'; +export * from './publishing/index.js'; export * from './recycle-bin/index.js'; export * from './reference/index.js'; export * from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.token.ts index 026c6b20ff5b..7e483fdda42d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.token.ts @@ -1,4 +1,4 @@ -import type { UmbDocumentPublishingWorkspaceContext } from './document-publishing-workspace.context.js'; +import type { UmbDocumentPublishingWorkspaceContext } from './document-publishing.workspace-context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export const UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT = new UmbContextToken( diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts index 083810907650..cb9a0173c6d1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts @@ -1,5 +1,5 @@ import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../workspace/document-workspace.context-token.js'; -import { UmbDocumentPublishingRepository } from '../repository/index.js'; +import { UmbDocumentPublishingRepository } from './repository/index.js'; import { UmbDocumentPublishedPendingChangesManager } from './document-published-pending-changes.manager.js'; import { UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT } from './document-publishing.workspace-context.token.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts new file mode 100644 index 000000000000..3d76f338dddc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts @@ -0,0 +1 @@ +export * from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts index c99bd4579a1f..c87e9f5885f6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts @@ -1,4 +1,5 @@ import { UMB_DOCUMENT_WORKSPACE_ALIAS } from '../workspace/constants.js'; +import { manifests as repositoryManifests } from './repository/manifests.js'; import { UMB_WORKSPACE_CONDITION_ALIAS } from '@umbraco-cms/backoffice/workspace'; export const manifests: Array = [ @@ -6,7 +7,7 @@ export const manifests: Array = [ type: 'workspaceContext', name: 'Document Publishing Workspace Context', alias: 'Umb.WorkspaceContext.Document.Publishing', - api: () => import('./document-publishing-workspace.context.js'), + api: () => import('./document-publishing.workspace-context.js'), conditions: [ { alias: UMB_WORKSPACE_CONDITION_ALIAS, @@ -14,4 +15,5 @@ export const manifests: Array = [ }, ], }, + ...repositoryManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/publishing/document-publishing.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.repository.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/publishing/document-publishing.repository.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.repository.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/publishing/document-publishing.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/publishing/document-publishing.server.data-source.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/publishing/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/index.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/publishing/index.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/publishing/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/publishing/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/index.ts index 1a4cea048421..bed352ee99b3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/index.ts @@ -1,6 +1,5 @@ export { UmbDocumentDetailRepository, UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS } from './detail/index.js'; export { UmbDocumentItemRepository, UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from './item/index.js'; -export { UmbDocumentPublishingRepository, UMB_DOCUMENT_PUBLISHING_REPOSITORY_ALIAS } from './publishing/index.js'; export { UmbDocumentUrlRepository, UMB_DOCUMENT_URL_REPOSITORY_ALIAS } from './url/index.js'; export { UmbDocumentPreviewRepository } from './preview/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/manifests.ts index c7ab4b7fdc35..7c077b7378a1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/manifests.ts @@ -1,11 +1,5 @@ import { manifests as detailManifests } from './detail/manifests.js'; import { manifests as itemManifests } from './item/manifests.js'; -import { manifests as publishingManifests } from './publishing/manifests.js'; import { manifests as urlManifests } from './url/manifests.js'; -export const manifests: Array = [ - ...detailManifests, - ...itemManifests, - ...publishingManifests, - ...urlManifests, -]; +export const manifests: Array = [...detailManifests, ...itemManifests, ...urlManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index e77dac186700..fc5037b92b3e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -10,7 +10,7 @@ import { UMB_DOCUMENT_SAVE_MODAL, UMB_DOCUMENT_SCHEDULE_MODAL, } from '../modals/index.js'; -import { UmbDocumentPublishingRepository } from '../repository/publishing/index.js'; +import { UmbDocumentPublishingRepository } from '../publishing/repository/index.js'; import { UmbUnpublishDocumentEntityAction } from '../entity-actions/unpublish.action.js'; import { UmbDocumentValidationRepository } from '../repository/validation/document-validation.repository.js'; import { From 9a3b5540554d3ab61a1ccb0ddf84c8db746de38a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 3 Dec 2024 15:08:39 +0100 Subject: [PATCH 05/68] port get published methods --- .../document-publishing.repository.ts | 14 ++++- .../document-publishing.server.data-source.ts | 63 ++++++++++++++++++- 2 files changed, 74 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.repository.ts index 02e4e5de8853..8ab30046ed7c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.repository.ts @@ -1,7 +1,7 @@ -import type { UmbDocumentVariantPublishModel } from '../../types.js'; +import type { UmbDocumentDetailModel, UmbDocumentVariantPublishModel } from '../../types.js'; import { UmbDocumentPublishingServerDataSource } from './document-publishing.server.data-source.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; +import { UmbRepositoryBase, type UmbRepositoryResponse } from '@umbraco-cms/backoffice/repository'; import { UMB_NOTIFICATION_CONTEXT, type UmbNotificationContext } from '@umbraco-cms/backoffice/notification'; import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; @@ -93,6 +93,16 @@ export class UmbDocumentPublishingRepository extends UmbRepositoryBase { return { error }; } + + /** + * Get the published data of a document + * @param {string} unique Document unique + * @returns { Promise>} Published document + * @memberof UmbDocumentPublishingRepository + */ + async published(unique: string): Promise> { + return this.#publishingDataSource.published(unique); + } } export { UmbDocumentPublishingRepository as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.ts index e17da4549e75..542d0b4d6841 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.ts @@ -1,4 +1,5 @@ -import type { UmbDocumentVariantPublishModel } from '../../types.js'; +import type { UmbDocumentDetailModel, UmbDocumentVariantPublishModel } from '../../types.js'; +import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; import type { CultureAndScheduleRequestModel, PublishDocumentRequestModel, @@ -9,6 +10,7 @@ import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import type { UmbDataSourceResponse } from '@umbraco-cms/backoffice/repository'; /** * A server data source for Document publishing @@ -109,4 +111,63 @@ export class UmbDocumentPublishingServerDataSource { DocumentService.putDocumentByIdPublishWithDescendants({ id: unique, requestBody }), ); } + + /** + * Get a published Document by its unique identifier + * @param {string} unique - Document unique identifier + * @returns {Promise>} Published document + * @memberof UmbDocumentPublishingServerDataSource + */ + async published(unique: string): Promise> { + if (!unique) throw new Error('Unique is missing'); + + const { data, error } = await tryExecuteAndNotify( + this.#host, + DocumentService.getDocumentByIdPublished({ id: unique }), + ); + + if (error || !data) { + return { error }; + } + + // TODO: make data mapper to prevent errors + const document: UmbDocumentDetailModel = { + entityType: UMB_DOCUMENT_ENTITY_TYPE, + unique: data.id, + values: data.values.map((value) => { + return { + editorAlias: value.editorAlias, + alias: value.alias, + culture: value.culture || null, + segment: value.segment || null, + value: value.value, + }; + }), + variants: data.variants.map((variant) => { + return { + state: variant.state, + culture: variant.culture || null, + segment: variant.segment || null, + name: variant.name, + publishDate: variant.publishDate || null, + createDate: variant.createDate, + updateDate: variant.updateDate, + }; + }), + urls: data.urls.map((url) => { + return { + culture: url.culture || null, + url: url.url, + }; + }), + template: data.template ? { unique: data.template.id } : null, + documentType: { + unique: data.documentType.id, + collection: data.documentType.collection ? { unique: data.documentType.collection.id } : null, + }, + isTrashed: data.isTrashed, + }; + + return { data: document }; + } } From 3528875d3ef3487022308ddd9c4c36bc72e086d2 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 3 Dec 2024 15:29:49 +0100 Subject: [PATCH 06/68] cleanup --- .../publishing/document-publishing.workspace-context.ts | 8 ++++---- .../repository/document-publishing.server.data-source.ts | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts index cb9a0173c6d1..fe4760587fa8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts @@ -13,16 +13,16 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { + this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, async (context) => { // No need to check pending changes for new documents - if (instance.getIsNew()) { + if (context.getIsNew()) { return; } - this.observe(instance.unique, async (unique) => { + this.observe(context.unique, async (unique) => { if (unique) { const { data: publishedData } = await this.#publishingRepository.published(unique); - const currentData = instance.getData(); + const currentData = context.getData(); if (!currentData || !publishedData) { return; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.ts index 542d0b4d6841..5e34a786bebe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.ts @@ -145,9 +145,9 @@ export class UmbDocumentPublishingServerDataSource { }), variants: data.variants.map((variant) => { return { - state: variant.state, culture: variant.culture || null, segment: variant.segment || null, + state: variant.state, name: variant.name, publishDate: variant.publishDate || null, createDate: variant.createDate, @@ -164,6 +164,7 @@ export class UmbDocumentPublishingServerDataSource { documentType: { unique: data.documentType.id, collection: data.documentType.collection ? { unique: data.documentType.collection.id } : null, + icon: data.documentType.icon, }, isTrashed: data.isTrashed, }; From cb6ca57422a4922178f641f4094f7724f9182baf Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 3 Dec 2024 19:15:23 +0100 Subject: [PATCH 07/68] wip render state --- .../documents/documents/publishing/index.ts | 1 + ...ace-split-view-variant-selector.element.ts | 33 +++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts index 3d76f338dddc..74a69e6b88af 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts @@ -1 +1,2 @@ export * from './repository/index.js'; +export * from './document-publishing.workspace-context.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts index f08abb5f61ba..416fb99a8acc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts @@ -1,14 +1,20 @@ import type { UmbDocumentVariantOptionModel } from '../types.js'; import { sortVariants } from '../utils.js'; -import { customElement, html } from '@umbraco-cms/backoffice/external/lit'; +import { customElement, html, nothing, state } from '@umbraco-cms/backoffice/external/lit'; import { DocumentVariantStateModel } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbWorkspaceSplitViewVariantSelectorElement } from '@umbraco-cms/backoffice/workspace'; +import { UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT } from '../publishing/index.js'; const elementName = 'umb-document-workspace-split-view-variant-selector'; @customElement(elementName) export class UmbDocumentWorkspaceSplitViewVariantSelectorElement extends UmbWorkspaceSplitViewVariantSelectorElement { protected override _variantSorter = sortVariants; + @state() + private _variantsWithPendingChanges: Array = []; + + #documentPublishingWorkspaceContext?: typeof UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT.TYPE; + #publishStateLocalizationMap = { [DocumentVariantStateModel.DRAFT]: 'content_unpublished', [DocumentVariantStateModel.PUBLISHED]: 'content_published', @@ -16,8 +22,31 @@ export class UmbDocumentWorkspaceSplitViewVariantSelectorElement extends UmbWork [DocumentVariantStateModel.NOT_CREATED]: 'content_notCreated', }; + constructor() { + super(); + this.consumeContext(UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT, (instance) => { + this.#documentPublishingWorkspaceContext = instance; + this.#observePendingChanges(); + }); + } + + async #observePendingChanges() { + this.observe( + this.#documentPublishingWorkspaceContext?.publishedPendingChanges.variantsWithChanges, + (variants) => { + this._variantsWithPendingChanges = variants || []; + }, + '_observePendingChanges', + ); + } + + #hasPendingChanges(variant: UmbDocumentVariantOptionModel) { + return this._variantsWithPendingChanges.some((x) => x.variantId.compare(variant)); + } + override _renderVariantDetails(variantOption: UmbDocumentVariantOptionModel) { - return html` ${this.localize.term( + return html`${this.#hasPendingChanges(variantOption) ? html`Pending changes` : nothing} + ${this.localize.term( this.#publishStateLocalizationMap[variantOption.variant?.state || DocumentVariantStateModel.NOT_CREATED], )}`; } From c748398a773d056bd2f53fcc2eabdad84195bf3b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 3 Dec 2024 19:28:57 +0100 Subject: [PATCH 08/68] align state UI --- ...ace-split-view-variant-selector.element.ts | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts index 416fb99a8acc..cc984d5e3c53 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts @@ -1,9 +1,9 @@ import type { UmbDocumentVariantOptionModel } from '../types.js'; import { sortVariants } from '../utils.js'; -import { customElement, html, nothing, state } from '@umbraco-cms/backoffice/external/lit'; +import { UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT } from '../publishing/index.js'; +import { customElement, html, state } from '@umbraco-cms/backoffice/external/lit'; import { DocumentVariantStateModel } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbWorkspaceSplitViewVariantSelectorElement } from '@umbraco-cms/backoffice/workspace'; -import { UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT } from '../publishing/index.js'; const elementName = 'umb-document-workspace-split-view-variant-selector'; @customElement(elementName) @@ -18,7 +18,10 @@ export class UmbDocumentWorkspaceSplitViewVariantSelectorElement extends UmbWork #publishStateLocalizationMap = { [DocumentVariantStateModel.DRAFT]: 'content_unpublished', [DocumentVariantStateModel.PUBLISHED]: 'content_published', - [DocumentVariantStateModel.PUBLISHED_PENDING_CHANGES]: 'content_publishedPendingChanges', + // TODO: The pending changes state can be removed once the management Api removes this state + // We only keep it here to make typescript happy + // We should also make our own state model for this + [DocumentVariantStateModel.PUBLISHED_PENDING_CHANGES]: 'content_publishedPending', [DocumentVariantStateModel.NOT_CREATED]: 'content_notCreated', }; @@ -44,11 +47,16 @@ export class UmbDocumentWorkspaceSplitViewVariantSelectorElement extends UmbWork return this._variantsWithPendingChanges.some((x) => x.variantId.compare(variant)); } + #getVariantState(variantOption: UmbDocumentVariantOptionModel) { + const term = this.#hasPendingChanges(variantOption) + ? 'content_publishedPendingChanges' + : this.#publishStateLocalizationMap[variantOption.variant?.state || DocumentVariantStateModel.NOT_CREATED]; + + return this.localize.term(term); + } + override _renderVariantDetails(variantOption: UmbDocumentVariantOptionModel) { - return html`${this.#hasPendingChanges(variantOption) ? html`Pending changes` : nothing} - ${this.localize.term( - this.#publishStateLocalizationMap[variantOption.variant?.state || DocumentVariantStateModel.NOT_CREATED], - )}`; + return html` ${this.#getVariantState(variantOption)}`; } } From b48e5c59f33ccd9a17fff54e7beb3a66c617f235 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 9 Dec 2024 10:45:05 +0100 Subject: [PATCH 09/68] post merge clean up --- .../src/packages/documents/documents/constants.ts | 7 ++++--- .../packages/documents/documents/publishing/constants.ts | 1 + .../packages/documents/documents/repository/constants.ts | 1 - 3 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/constants.ts index 2c9aa4e99b4f..b51328d5925e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/constants.ts @@ -1,15 +1,16 @@ export { UMB_DOCUMENT_ENTITY_TYPE, UMB_DOCUMENT_ROOT_ENTITY_TYPE } from './entity.js'; -export * from './paths.js'; export * from './collection/constants.js'; export * from './entity-actions/constants.js'; export * from './entity-bulk-actions/constants.js'; -export * from './property-dataset-context/constants.js'; export * from './modals/constants.js'; +export * from './paths.js'; +export * from './property-dataset-context/constants.js'; +export * from './publishing/constants.js'; export * from './recycle-bin/constants.js'; export * from './reference/constants.js'; export * from './repository/constants.js'; export * from './rollback/constants.js'; export * from './search/constants.js'; -export * from './workspace/constants.js'; export * from './user-permissions/constants.js'; +export * from './workspace/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts new file mode 100644 index 000000000000..41a409dec1f0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts @@ -0,0 +1 @@ +export * from './repository/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/constants.ts index acb88b44cb98..655e81e66dd1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/constants.ts @@ -1,5 +1,4 @@ export * from './detail/constants.js'; export * from './item/constants.js'; -export * from './publishing/constants.js'; export * from './url/constants.js'; export * from './validation/constants.js'; From 7ed08f3e1a6436ed05b9a30eaa39b3dd6a8b1370 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 9 Dec 2024 11:11:08 +0100 Subject: [PATCH 10/68] move publish modal --- .../documents/entity-actions/publish.action.ts | 2 +- .../packages/documents/documents/modals/constants.ts | 1 - .../packages/documents/documents/modals/manifests.ts | 2 -- .../documents/modals/publish-modal/constants.ts | 2 -- .../documents/modals/publish-modal/manifest.ts | 10 ---------- .../src/packages/documents/documents/modals/types.ts | 2 +- .../documents/documents/publishing/constants.ts | 1 + .../packages/documents/documents/publishing/index.ts | 2 ++ .../documents/documents/publishing/manifests.ts | 4 +++- .../documents/publishing/publish/constants.ts | 1 + .../documents/publishing/publish/manifests.ts | 3 +++ .../documents/publishing/publish/modal/constants.ts | 1 + .../publish/modal}/document-publish-modal.element.ts | 6 +++--- .../publish/modal}/document-publish-modal.stories.ts | 2 +- .../publish/modal}/document-publish-modal.token.ts | 5 +++-- .../documents/publishing/publish/modal/manifests.ts | 10 ++++++++++ .../documents/publishing/publish/modal/types.ts | 1 + .../documents/documents/publishing/publish/types.ts | 1 + .../packages/documents/documents/publishing/types.ts | 1 + 19 files changed, 33 insertions(+), 24 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-modal/constants.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-modal/manifest.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/constants.ts rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{modals/publish-modal => publishing/publish/modal}/document-publish-modal.element.ts (95%) rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{modals/publish-modal => publishing/publish/modal}/document-publish-modal.stories.ts (98%) rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{modals/publish-modal => publishing/publish/modal}/document-publish-modal.token.ts (83%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/publish.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/publish.action.ts index e72bfcaf6b37..29a2721ccd48 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/publish.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/publish.action.ts @@ -1,6 +1,6 @@ import { UmbDocumentDetailRepository } from '../repository/index.js'; import { UmbDocumentPublishingRepository } from '../publishing/index.js'; -import { UMB_DOCUMENT_PUBLISH_MODAL } from '../modals/publish-modal/constants.js'; +import { UMB_DOCUMENT_PUBLISH_MODAL } from '../publishing/publish/modal/constants.js'; import type { UmbDocumentVariantOptionModel } from '../types.js'; import { UMB_APP_LANGUAGE_CONTEXT, UmbLanguageCollectionRepository } from '@umbraco-cms/backoffice/language'; import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/constants.ts index afd26627425a..953299dd1502 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/constants.ts @@ -1,4 +1,3 @@ -export * from './publish-modal/constants.js'; export * from './publish-with-descendants-modal/constants.js'; export * from './save-modal/constants.js'; export * from './unpublish-modal/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/manifests.ts index 9330615f56ce..99f726fc1581 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/manifests.ts @@ -1,11 +1,9 @@ -import { manifest as publishModalManifest } from './publish-modal/manifest.js'; import { manifest as publishWithDescendantsModalManifest } from './publish-with-descendants-modal/manifest.js'; import { manifest as saveModalManifest } from './save-modal/manifest.js'; import { manifest as scheduleModalManifest } from './schedule-modal/manifest.js'; import { manifest as unpublishModalManifest } from './unpublish-modal/manifest.js'; export const manifests: Array = [ - publishModalManifest, publishWithDescendantsModalManifest, saveModalManifest, scheduleModalManifest, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-modal/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-modal/constants.ts deleted file mode 100644 index 0447b921930f..000000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-modal/constants.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './document-publish-modal.token.js'; -export { UMB_DOCUMENT_PUBLISH_MODAL_ALIAS } from './manifest.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-modal/manifest.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-modal/manifest.ts deleted file mode 100644 index 3b206fd39aa5..000000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-modal/manifest.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { ManifestModal } from '@umbraco-cms/backoffice/modal'; - -export const UMB_DOCUMENT_PUBLISH_MODAL_ALIAS = 'Umb.Modal.DocumentPublish'; - -export const manifest: ManifestModal = { - type: 'modal', - alias: UMB_DOCUMENT_PUBLISH_MODAL_ALIAS, - name: 'Document Publish Modal', - element: () => import('./document-publish-modal.element.js'), -}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/types.ts index 161b986caeaf..bfea36e0f3d3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/types.ts @@ -4,7 +4,7 @@ import type { UmbContentVariantPickerData, UmbContentVariantPickerValue } from ' export type UmbDocumentVariantPickerData = UmbContentVariantPickerData; export type UmbDocumentVariantPickerValue = UmbContentVariantPickerValue; -export type * from './publish-modal/constants.js'; +export type * from '../publishing/publish/modal/constants.js'; export type * from './publish-with-descendants-modal/constants.js'; export type * from './save-modal/constants.js'; export type * from './unpublish-modal/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts index 41a409dec1f0..a2632f58ef2d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts @@ -1 +1,2 @@ export * from './repository/constants.js'; +export * from './publish/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts index 74a69e6b88af..8c30b2677a74 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts @@ -1,2 +1,4 @@ export * from './repository/index.js'; export * from './document-publishing.workspace-context.token.js'; +export * from './constants.js'; +export type * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts index c87e9f5885f6..007d531723ff 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts @@ -1,5 +1,6 @@ -import { UMB_DOCUMENT_WORKSPACE_ALIAS } from '../workspace/constants.js'; +import { manifests as publishManifest } from './publish/manifests.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; +import { UMB_DOCUMENT_WORKSPACE_ALIAS } from '../workspace/constants.js'; import { UMB_WORKSPACE_CONDITION_ALIAS } from '@umbraco-cms/backoffice/workspace'; export const manifests: Array = [ @@ -16,4 +17,5 @@ export const manifests: Array = [ ], }, ...repositoryManifests, + ...publishManifest, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/constants.ts new file mode 100644 index 000000000000..26f4f0dd5f39 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/constants.ts @@ -0,0 +1 @@ +export * from './modal/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/manifests.ts new file mode 100644 index 000000000000..fbe10d296426 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/manifests.ts @@ -0,0 +1,3 @@ +import { manifests as modalManifests } from './modal/manifests.js'; + +export const manifests: Array = [...modalManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/constants.ts new file mode 100644 index 000000000000..e2baa59079e1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/constants.ts @@ -0,0 +1 @@ +export * from './document-publish-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-modal/document-publish-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/document-publish-modal.element.ts similarity index 95% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-modal/document-publish-modal.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/document-publish-modal.element.ts index 6fd010b29509..41e1fc7e2461 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-modal/document-publish-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/document-publish-modal.element.ts @@ -1,12 +1,12 @@ -import { UmbDocumentVariantState, type UmbDocumentVariantOptionModel } from '../../types.js'; -import { isNotPublishedMandatory } from '../utils.js'; +import { UmbDocumentVariantState, type UmbDocumentVariantOptionModel } from '../../../types.js'; +import { isNotPublishedMandatory } from '../../../modals/utils.js'; import type { UmbDocumentPublishModalData, UmbDocumentPublishModalValue } from './document-publish-modal.token.js'; import { css, customElement, html, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; -import '../shared/document-variant-language-picker.element.js'; +import '../../../modals/shared/document-variant-language-picker.element.js'; @customElement('umb-document-publish-modal') export class UmbDocumentPublishModalElement extends UmbModalBaseElement< diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-modal/document-publish-modal.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/document-publish-modal.stories.ts similarity index 98% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-modal/document-publish-modal.stories.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/document-publish-modal.stories.ts index a0b1856403db..e01619eb4b8d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-modal/document-publish-modal.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/document-publish-modal.stories.ts @@ -1,6 +1,6 @@ import './document-publish-modal.element.js'; -import { UmbDocumentVariantState } from '../../types.js'; +import { UmbDocumentVariantState } from '../../../types.js'; import type { UmbDocumentPublishModalData, UmbDocumentPublishModalValue } from './document-publish-modal.token.js'; import type { UmbDocumentPublishModalElement } from './document-publish-modal.element.js'; import type { Meta, StoryObj } from '@storybook/web-components'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-modal/document-publish-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/document-publish-modal.token.ts similarity index 83% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-modal/document-publish-modal.token.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/document-publish-modal.token.ts index eac95369149e..9c490c04b67e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-modal/document-publish-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/document-publish-modal.token.ts @@ -1,6 +1,7 @@ -import type { UmbDocumentVariantPickerData, UmbDocumentVariantPickerValue } from '../types.js'; -import { UMB_DOCUMENT_PUBLISH_MODAL_ALIAS } from './manifest.js'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; +import type { UmbDocumentVariantPickerData, UmbDocumentVariantPickerValue } from '../../../modals/types.js'; + +export const UMB_DOCUMENT_PUBLISH_MODAL_ALIAS = 'Umb.Modal.DocumentPublish'; // eslint-disable-next-line @typescript-eslint/no-empty-object-type export interface UmbDocumentPublishModalData extends UmbDocumentVariantPickerData {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/manifests.ts new file mode 100644 index 000000000000..15a3fe254b20 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/manifests.ts @@ -0,0 +1,10 @@ +import { UMB_DOCUMENT_PUBLISH_MODAL_ALIAS } from './constants.js'; + +export const manifests: Array = [ + { + type: 'modal', + alias: UMB_DOCUMENT_PUBLISH_MODAL_ALIAS, + name: 'Document Publish Modal', + element: () => import('./document-publish-modal.element.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/types.ts new file mode 100644 index 000000000000..2741ef483e91 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/types.ts @@ -0,0 +1 @@ +export type * from './document-publish-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/types.ts new file mode 100644 index 000000000000..4aeeacf57dd0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/types.ts @@ -0,0 +1 @@ +export type * from './modal/types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts new file mode 100644 index 000000000000..73a7aa65c3a8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts @@ -0,0 +1 @@ +export type * from './publish/types.js'; From c4c99fb2674f9cbe72057b0c5074caab4d144e8d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 9 Dec 2024 11:26:31 +0100 Subject: [PATCH 11/68] move schedule modal --- .../packages/documents/documents/modals/constants.ts | 1 - .../packages/documents/documents/modals/manifests.ts | 2 -- .../documents/modals/schedule-modal/constants.ts | 2 -- .../documents/modals/schedule-modal/manifest.ts | 10 ---------- .../src/packages/documents/documents/modals/types.ts | 1 - .../documents/documents/publishing/constants.ts | 3 ++- .../packages/documents/documents/publishing/index.ts | 1 + .../documents/documents/publishing/manifests.ts | 4 +++- .../documents/publishing/schedule-publish/constants.ts | 1 + .../documents/publishing/schedule-publish/manifests.ts | 3 +++ .../publishing/schedule-publish/modal/constants.ts | 1 + .../modal}/document-schedule-modal.element.ts | 4 ++-- .../modal}/document-schedule-modal.stories.ts | 2 +- .../modal}/document-schedule-modal.token.ts | 5 +++-- .../publishing/schedule-publish/modal/manifests.ts | 10 ++++++++++ .../publishing/schedule-publish/modal/types.ts | 1 + .../documents/publishing/schedule-publish/types.ts | 1 + .../packages/documents/documents/publishing/types.ts | 1 + 18 files changed, 30 insertions(+), 23 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/schedule-modal/constants.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/schedule-modal/manifest.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/constants.ts rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{modals/schedule-modal => publishing/schedule-publish/modal}/document-schedule-modal.element.ts (98%) rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{modals/schedule-modal => publishing/schedule-publish/modal}/document-schedule-modal.stories.ts (98%) rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{modals/schedule-modal => publishing/schedule-publish/modal}/document-schedule-modal.token.ts (82%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/constants.ts index 953299dd1502..6c015b90b18e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/constants.ts @@ -1,5 +1,4 @@ export * from './publish-with-descendants-modal/constants.js'; export * from './save-modal/constants.js'; export * from './unpublish-modal/constants.js'; -export * from './schedule-modal/constants.js'; export * from './document-picker-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/manifests.ts index 99f726fc1581..531b9c42132a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/manifests.ts @@ -1,11 +1,9 @@ import { manifest as publishWithDescendantsModalManifest } from './publish-with-descendants-modal/manifest.js'; import { manifest as saveModalManifest } from './save-modal/manifest.js'; -import { manifest as scheduleModalManifest } from './schedule-modal/manifest.js'; import { manifest as unpublishModalManifest } from './unpublish-modal/manifest.js'; export const manifests: Array = [ publishWithDescendantsModalManifest, saveModalManifest, - scheduleModalManifest, unpublishModalManifest, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/schedule-modal/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/schedule-modal/constants.ts deleted file mode 100644 index 888ebd02cd2b..000000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/schedule-modal/constants.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './document-schedule-modal.token.js'; -export { UMB_DOCUMENT_SCHEDULE_MODAL_ALIAS } from './manifest.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/schedule-modal/manifest.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/schedule-modal/manifest.ts deleted file mode 100644 index 91e46575fca1..000000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/schedule-modal/manifest.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { ManifestModal } from '@umbraco-cms/backoffice/modal'; - -export const UMB_DOCUMENT_SCHEDULE_MODAL_ALIAS = 'Umb.Modal.DocumentSchedule'; - -export const manifest: ManifestModal = { - type: 'modal', - alias: UMB_DOCUMENT_SCHEDULE_MODAL_ALIAS, - name: 'Document Schedule Modal', - element: () => import('./document-schedule-modal.element.js'), -}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/types.ts index bfea36e0f3d3..3115332a334d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/types.ts @@ -8,5 +8,4 @@ export type * from '../publishing/publish/modal/constants.js'; export type * from './publish-with-descendants-modal/constants.js'; export type * from './save-modal/constants.js'; export type * from './unpublish-modal/constants.js'; -export type * from './schedule-modal/constants.js'; export type * from './document-picker-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts index a2632f58ef2d..69a5a137eb1a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts @@ -1,2 +1,3 @@ -export * from './repository/constants.js'; export * from './publish/constants.js'; +export * from './repository/constants.js'; +export * from './schedule-publish/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts index 8c30b2677a74..74ad1f4716df 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts @@ -1,4 +1,5 @@ export * from './repository/index.js'; export * from './document-publishing.workspace-context.token.js'; + export * from './constants.js'; export type * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts index 007d531723ff..358dc25f36fb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts @@ -1,5 +1,6 @@ import { manifests as publishManifest } from './publish/manifests.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; +import { manifests as schedulePublishManifests } from './schedule-publish/manifests.js'; import { UMB_DOCUMENT_WORKSPACE_ALIAS } from '../workspace/constants.js'; import { UMB_WORKSPACE_CONDITION_ALIAS } from '@umbraco-cms/backoffice/workspace'; @@ -16,6 +17,7 @@ export const manifests: Array = [ }, ], }, - ...repositoryManifests, ...publishManifest, + ...repositoryManifests, + ...schedulePublishManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/constants.ts new file mode 100644 index 000000000000..26f4f0dd5f39 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/constants.ts @@ -0,0 +1 @@ +export * from './modal/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/manifests.ts new file mode 100644 index 000000000000..fbe10d296426 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/manifests.ts @@ -0,0 +1,3 @@ +import { manifests as modalManifests } from './modal/manifests.js'; + +export const manifests: Array = [...modalManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/constants.ts new file mode 100644 index 000000000000..0307e54b1733 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/constants.ts @@ -0,0 +1 @@ +export * from './document-schedule-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/document-schedule-modal.element.ts similarity index 98% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/document-schedule-modal.element.ts index 0a5ffe751d48..440951fe53e6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/document-schedule-modal.element.ts @@ -1,5 +1,4 @@ -import { UmbDocumentVariantLanguagePickerElement } from '../shared/document-variant-language-picker.element.js'; -import { UmbDocumentVariantState, type UmbDocumentVariantOptionModel } from '../../types.js'; +import { UmbDocumentVariantState, type UmbDocumentVariantOptionModel } from '../../../types.js'; import type { UmbDocumentScheduleModalData, UmbDocumentScheduleModalValue } from './document-schedule-modal.token.js'; import { css, customElement, html, repeat, state, when } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; @@ -7,6 +6,7 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; import type { UmbInputDateElement } from '@umbraco-cms/backoffice/components'; import type { UUIBooleanInputElement } from '@umbraco-cms/backoffice/external/uui'; +import { UmbDocumentVariantLanguagePickerElement } from '../../../modals/index.js'; @customElement('umb-document-schedule-modal') export class UmbDocumentScheduleModalElement extends UmbModalBaseElement< diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/document-schedule-modal.stories.ts similarity index 98% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.stories.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/document-schedule-modal.stories.ts index 06c55eb87959..de340a17b1d9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/document-schedule-modal.stories.ts @@ -1,6 +1,6 @@ import './document-schedule-modal.element.js'; -import { UmbDocumentVariantState } from '../../types.js'; +import { UmbDocumentVariantState } from '../../../types.js'; import type { UmbDocumentScheduleModalData, UmbDocumentScheduleModalValue } from './document-schedule-modal.token.js'; import type { UmbDocumentScheduleModalElement } from './document-schedule-modal.element.js'; import type { Meta, StoryObj } from '@storybook/web-components'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/document-schedule-modal.token.ts similarity index 82% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.token.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/document-schedule-modal.token.ts index de103d9e54dd..9e3ca3d3a942 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/schedule-modal/document-schedule-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/document-schedule-modal.token.ts @@ -1,7 +1,8 @@ -import type { UmbDocumentVariantPickerData } from '../types.js'; -import { UMB_DOCUMENT_SCHEDULE_MODAL_ALIAS } from './manifest.js'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; import type { ScheduleRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbDocumentVariantPickerData } from '../../../modals/types.js'; + +export const UMB_DOCUMENT_SCHEDULE_MODAL_ALIAS = 'Umb.Modal.DocumentSchedule'; export interface UmbDocumentScheduleSelectionModel { unique: string; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/manifests.ts new file mode 100644 index 000000000000..ad54a2ad7dbe --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/manifests.ts @@ -0,0 +1,10 @@ +import { UMB_DOCUMENT_SCHEDULE_MODAL_ALIAS } from './constants.js'; + +export const manifests: Array = [ + { + type: 'modal', + alias: UMB_DOCUMENT_SCHEDULE_MODAL_ALIAS, + name: 'Document Schedule Modal', + element: () => import('./document-schedule-modal.element.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/types.ts new file mode 100644 index 000000000000..4367880d8c6d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/types.ts @@ -0,0 +1 @@ +export type * from './document-schedule-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/types.ts new file mode 100644 index 000000000000..4aeeacf57dd0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/types.ts @@ -0,0 +1 @@ +export type * from './modal/types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts index 73a7aa65c3a8..c1fb8305c114 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts @@ -1 +1,2 @@ export type * from './publish/types.js'; +export type * from './schedule-publish/types.js'; From 06575072396152f08ae744c8b153e58bd5350cbb Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 9 Dec 2024 11:34:50 +0100 Subject: [PATCH 12/68] move unpublish modal --- .../packages/documents/documents/modals/constants.ts | 1 - .../packages/documents/documents/modals/manifests.ts | 7 +------ .../src/packages/documents/documents/modals/types.ts | 1 - .../documents/modals/unpublish-modal/constants.ts | 2 -- .../documents/modals/unpublish-modal/manifest.ts | 10 ---------- .../documents/documents/publishing/constants.ts | 1 + .../documents/documents/publishing/manifests.ts | 2 ++ .../packages/documents/documents/publishing/types.ts | 1 + .../documents/publishing/unpublish/constants.ts | 1 + .../documents/publishing/unpublish/manifests.ts | 3 +++ .../documents/publishing/unpublish/modal/constants.ts | 1 + .../modal}/document-unpublish-modal.element.ts | 8 ++++---- .../modal}/document-unpublish-modal.stories.ts | 2 +- .../unpublish/modal}/document-unpublish-modal.token.ts | 5 +++-- .../documents/publishing/unpublish/modal/manifests.ts | 10 ++++++++++ .../documents/publishing/unpublish/modal/types.ts | 0 .../documents/documents/publishing/unpublish/types.ts | 1 + 17 files changed, 29 insertions(+), 27 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/unpublish-modal/constants.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/unpublish-modal/manifest.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/constants.ts rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{modals/unpublish-modal => publishing/unpublish/modal}/document-unpublish-modal.element.ts (95%) rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{modals/unpublish-modal => publishing/unpublish/modal}/document-unpublish-modal.stories.ts (98%) rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{modals/unpublish-modal => publishing/unpublish/modal}/document-unpublish-modal.token.ts (82%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/constants.ts index 6c015b90b18e..2551cddb650c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/constants.ts @@ -1,4 +1,3 @@ export * from './publish-with-descendants-modal/constants.js'; export * from './save-modal/constants.js'; -export * from './unpublish-modal/constants.js'; export * from './document-picker-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/manifests.ts index 531b9c42132a..9c797e64d867 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/manifests.ts @@ -1,9 +1,4 @@ import { manifest as publishWithDescendantsModalManifest } from './publish-with-descendants-modal/manifest.js'; import { manifest as saveModalManifest } from './save-modal/manifest.js'; -import { manifest as unpublishModalManifest } from './unpublish-modal/manifest.js'; -export const manifests: Array = [ - publishWithDescendantsModalManifest, - saveModalManifest, - unpublishModalManifest, -]; +export const manifests: Array = [publishWithDescendantsModalManifest, saveModalManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/types.ts index 3115332a334d..6e68b73be44b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/types.ts @@ -7,5 +7,4 @@ export type UmbDocumentVariantPickerValue = UmbContentVariantPickerValue; export type * from '../publishing/publish/modal/constants.js'; export type * from './publish-with-descendants-modal/constants.js'; export type * from './save-modal/constants.js'; -export type * from './unpublish-modal/constants.js'; export type * from './document-picker-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/unpublish-modal/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/unpublish-modal/constants.ts deleted file mode 100644 index 43b40e4c546e..000000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/unpublish-modal/constants.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './document-unpublish-modal.token.js'; -export { UMB_DOCUMENT_UNPUBLISH_MODAL_ALIAS } from './manifest.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/unpublish-modal/manifest.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/unpublish-modal/manifest.ts deleted file mode 100644 index 20004762bfaf..000000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/unpublish-modal/manifest.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { ManifestModal } from '@umbraco-cms/backoffice/modal'; - -export const UMB_DOCUMENT_UNPUBLISH_MODAL_ALIAS = 'Umb.Modal.DocumentUnpublish'; - -export const manifest: ManifestModal = { - type: 'modal', - alias: UMB_DOCUMENT_UNPUBLISH_MODAL_ALIAS, - name: 'Document Unpublish Modal', - element: () => import('./document-unpublish-modal.element.js'), -}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts index 69a5a137eb1a..ac9b012363dc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts @@ -1,3 +1,4 @@ export * from './publish/constants.js'; export * from './repository/constants.js'; export * from './schedule-publish/constants.js'; +export * from './unpublish/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts index 358dc25f36fb..cc1565c0217c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts @@ -1,6 +1,7 @@ import { manifests as publishManifest } from './publish/manifests.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; import { manifests as schedulePublishManifests } from './schedule-publish/manifests.js'; +import { manifests as unpublishManifests } from './unpublish/manifests.js'; import { UMB_DOCUMENT_WORKSPACE_ALIAS } from '../workspace/constants.js'; import { UMB_WORKSPACE_CONDITION_ALIAS } from '@umbraco-cms/backoffice/workspace'; @@ -20,4 +21,5 @@ export const manifests: Array = [ ...publishManifest, ...repositoryManifests, ...schedulePublishManifests, + ...unpublishManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts index c1fb8305c114..7936b9fee676 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts @@ -1,2 +1,3 @@ export type * from './publish/types.js'; export type * from './schedule-publish/types.js'; +export type * from './unpublish/types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/constants.ts new file mode 100644 index 000000000000..26f4f0dd5f39 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/constants.ts @@ -0,0 +1 @@ +export * from './modal/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/manifests.ts new file mode 100644 index 000000000000..fbe10d296426 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/manifests.ts @@ -0,0 +1,3 @@ +import { manifests as modalManifests } from './modal/manifests.js'; + +export const manifests: Array = [...modalManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/constants.ts new file mode 100644 index 000000000000..1d9210a7a55f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/constants.ts @@ -0,0 +1 @@ +export * from './document-unpublish-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/unpublish-modal/document-unpublish-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/document-unpublish-modal.element.ts similarity index 95% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/unpublish-modal/document-unpublish-modal.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/document-unpublish-modal.element.ts index e9a32c905c54..aa49be745535 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/unpublish-modal/document-unpublish-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/document-unpublish-modal.element.ts @@ -1,6 +1,6 @@ -import { UmbDocumentVariantState, type UmbDocumentVariantOptionModel } from '../../types.js'; -import { UmbDocumentReferenceRepository } from '../../reference/index.js'; -import { UMB_DOCUMENT_CONFIGURATION_CONTEXT } from '../../global-contexts/index.js'; +import { UmbDocumentVariantState, type UmbDocumentVariantOptionModel } from '../../../types.js'; +import { UmbDocumentReferenceRepository } from '../../../reference/index.js'; +import { UMB_DOCUMENT_CONFIGURATION_CONTEXT } from '../../../global-contexts/index.js'; import type { UmbDocumentUnpublishModalData, UmbDocumentUnpublishModalValue, @@ -10,7 +10,7 @@ import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; -import '../shared/document-variant-language-picker.element.js'; +import '../../../modals/shared/document-variant-language-picker.element.js'; /** * @function isPublished diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/unpublish-modal/document-unpublish-modal.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/document-unpublish-modal.stories.ts similarity index 98% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/unpublish-modal/document-unpublish-modal.stories.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/document-unpublish-modal.stories.ts index 258c2b8c99a5..39edb84b3753 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/unpublish-modal/document-unpublish-modal.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/document-unpublish-modal.stories.ts @@ -1,6 +1,6 @@ import './document-unpublish-modal.element.js'; -import { UmbDocumentVariantState } from '../../types.js'; +import { UmbDocumentVariantState } from '../../../types.js'; import type { UmbDocumentUnpublishModalData, UmbDocumentUnpublishModalValue, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/unpublish-modal/document-unpublish-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/document-unpublish-modal.token.ts similarity index 82% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/unpublish-modal/document-unpublish-modal.token.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/document-unpublish-modal.token.ts index 35ca5fef5cd2..305923083406 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/unpublish-modal/document-unpublish-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/document-unpublish-modal.token.ts @@ -1,7 +1,8 @@ -import type { UmbDocumentVariantPickerData, UmbDocumentVariantPickerValue } from '../types.js'; -import { UMB_DOCUMENT_UNPUBLISH_MODAL_ALIAS } from './manifest.js'; +import type { UmbDocumentVariantPickerData, UmbDocumentVariantPickerValue } from '../../../modals/types.js'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; +export const UMB_DOCUMENT_UNPUBLISH_MODAL_ALIAS = 'Umb.Modal.DocumentUnpublish'; + export interface UmbDocumentUnpublishModalData extends UmbDocumentVariantPickerData { documentUnique?: string; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/manifests.ts new file mode 100644 index 000000000000..5aeea96318d2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/manifests.ts @@ -0,0 +1,10 @@ +import { UMB_DOCUMENT_UNPUBLISH_MODAL_ALIAS } from './constants.js'; + +export const manifests: Array = [ + { + type: 'modal', + alias: UMB_DOCUMENT_UNPUBLISH_MODAL_ALIAS, + name: 'Document Unpublish Modal', + element: () => import('./document-unpublish-modal.element.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/modal/types.ts new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/types.ts new file mode 100644 index 000000000000..4aeeacf57dd0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/types.ts @@ -0,0 +1 @@ +export type * from './modal/types.js'; From c6e7b7a04b38ef530f11c208682f7ad8b522b04c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 9 Dec 2024 12:18:07 +0100 Subject: [PATCH 13/68] move publish action and bulk action --- .../documents/entity-actions/manifests.ts | 24 --------------- .../entity-bulk-actions/manifests.ts | 23 -------------- .../publishing/publish/entity-action/index.ts | 1 + .../publish/entity-action/manifests.ts | 29 ++++++++++++++++++ .../publish/entity-action}/publish.action.ts | 8 ++--- .../publish/entity-bulk-action/manifests.ts | 30 +++++++++++++++++++ .../publish.bulk-action.ts} | 10 +++---- .../documents/publishing/publish/manifests.ts | 8 ++++- 8 files changed, 76 insertions(+), 57 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-action/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-action/manifests.ts rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{entity-actions => publishing/publish/entity-action}/publish.action.ts (94%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-bulk-action/manifests.ts rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{entity-bulk-actions/publish/publish.action.ts => publishing/publish/entity-bulk-action/publish.bulk-action.ts} (92%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts index 38252454235e..74159861da6a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts @@ -2,7 +2,6 @@ import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, UMB_DOCUMENT_ITEM_REPOSITORY_ALIA import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; import { UMB_USER_PERMISSION_DOCUMENT_DELETE, - UMB_USER_PERMISSION_DOCUMENT_PUBLISH, UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH, } from '../user-permissions/constants.js'; import { manifests as createBlueprintManifests } from './create-blueprint/manifests.js'; @@ -40,29 +39,6 @@ const entityActions: Array = [ }, ], }, - { - type: 'entityAction', - kind: 'default', - alias: 'Umb.EntityAction.Document.Publish', - name: 'Publish Document Entity Action', - weight: 600, - api: () => import('./publish.action.js'), - forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], - meta: { - icon: 'icon-globe', - label: '#actions_publish', - additionalOptions: true, - }, - conditions: [ - { - alias: 'Umb.Condition.UserPermission.Document', - allOf: [UMB_USER_PERMISSION_DOCUMENT_PUBLISH], - }, - { - alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, - }, - ], - }, { type: 'entityAction', kind: 'default', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/manifests.ts index 986f5405bfae..4fed5774b190 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/manifests.ts @@ -11,29 +11,6 @@ import { UMB_COLLECTION_ALIAS_CONDITION } from '@umbraco-cms/backoffice/collecti import type { ManifestEntityBulkAction } from '@umbraco-cms/backoffice/extension-registry'; export const entityBulkActions: Array = [ - { - type: 'entityBulkAction', - kind: 'default', - alias: 'Umb.EntityBulkAction.Document.Publish', - name: 'Publish Document Entity Bulk Action', - weight: 50, - api: () => import('./publish/publish.action.js'), - meta: { - icon: 'icon-globe', - label: '#actions_publish', - }, - forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], - conditions: [ - { - alias: UMB_COLLECTION_ALIAS_CONDITION, - match: UMB_DOCUMENT_COLLECTION_ALIAS, - }, - { - alias: 'Umb.Condition.UserPermission.Document', - allOf: [UMB_USER_PERMISSION_DOCUMENT_PUBLISH], - }, - ], - }, { type: 'entityBulkAction', kind: 'default', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-action/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-action/index.ts new file mode 100644 index 000000000000..91e19bc73546 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-action/index.ts @@ -0,0 +1 @@ +export * from './publish.action.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-action/manifests.ts new file mode 100644 index 000000000000..f3c3d022c73a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-action/manifests.ts @@ -0,0 +1,29 @@ +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; +import { UMB_DOCUMENT_ENTITY_TYPE } from '../../../entity.js'; +import { UMB_USER_PERMISSION_DOCUMENT_PUBLISH } from '../../../user-permissions/constants.js'; + +export const manifests: Array = [ + { + type: 'entityAction', + kind: 'default', + alias: 'Umb.EntityAction.Document.Publish', + name: 'Publish Document Entity Action', + weight: 600, + api: () => import('./publish.action.js'), + forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], + meta: { + icon: 'icon-globe', + label: '#actions_publish', + additionalOptions: true, + }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + allOf: [UMB_USER_PERMISSION_DOCUMENT_PUBLISH], + }, + { + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, + }, + ], + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/publish.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-action/publish.action.ts similarity index 94% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/publish.action.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-action/publish.action.ts index 29a2721ccd48..cc66d403b252 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/publish.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-action/publish.action.ts @@ -1,7 +1,5 @@ -import { UmbDocumentDetailRepository } from '../repository/index.js'; -import { UmbDocumentPublishingRepository } from '../publishing/index.js'; -import { UMB_DOCUMENT_PUBLISH_MODAL } from '../publishing/publish/modal/constants.js'; -import type { UmbDocumentVariantOptionModel } from '../types.js'; +import { type UmbDocumentVariantOptionModel } from '../../../types.js'; +import { UMB_DOCUMENT_PUBLISH_MODAL } from '../modal/constants.js'; import { UMB_APP_LANGUAGE_CONTEXT, UmbLanguageCollectionRepository } from '@umbraco-cms/backoffice/language'; import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action'; import { UmbEntityActionBase, UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice/entity-action'; @@ -10,6 +8,8 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { UMB_CURRENT_USER_CONTEXT } from '@umbraco-cms/backoffice/current-user'; +import { UmbDocumentDetailRepository } from '../../../repository/index.js'; +import { UmbDocumentPublishingRepository } from '../../repository/index.js'; export class UmbPublishDocumentEntityAction extends UmbEntityActionBase { constructor(host: UmbControllerHost, args: UmbEntityActionArgs) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-bulk-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-bulk-action/manifests.ts new file mode 100644 index 000000000000..57126facea00 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-bulk-action/manifests.ts @@ -0,0 +1,30 @@ +import { UMB_COLLECTION_ALIAS_CONDITION } from '@umbraco-cms/backoffice/collection'; +import { UMB_DOCUMENT_ENTITY_TYPE } from '../../../entity.js'; +import { UMB_DOCUMENT_COLLECTION_ALIAS } from '../../../collection/constants.js'; +import { UMB_USER_PERMISSION_DOCUMENT_PUBLISH } from '../../../user-permissions/constants.js'; + +export const manifests: Array = [ + { + type: 'entityBulkAction', + kind: 'default', + alias: 'Umb.EntityBulkAction.Document.Publish', + name: 'Publish Document Entity Bulk Action', + weight: 50, + api: () => import('./publish.bulk-action.js'), + meta: { + icon: 'icon-globe', + label: '#actions_publish', + }, + forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], + conditions: [ + { + alias: UMB_COLLECTION_ALIAS_CONDITION, + match: UMB_DOCUMENT_COLLECTION_ALIAS, + }, + { + alias: 'Umb.Condition.UserPermission.Document', + allOf: [UMB_USER_PERMISSION_DOCUMENT_PUBLISH], + }, + ], + }, +]; 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/publishing/publish/entity-bulk-action/publish.bulk-action.ts similarity index 92% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/publish/publish.action.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-bulk-action/publish.bulk-action.ts index a0597b604fd5..5c98204814c3 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/publishing/publish/entity-bulk-action/publish.bulk-action.ts @@ -1,8 +1,7 @@ -import { UmbDocumentPublishingRepository } from '../../publishing/index.js'; -import { UmbPublishDocumentEntityAction } from '../../entity-actions/publish.action.js'; -import type { UmbDocumentVariantOptionModel } from '../../types.js'; -import { UMB_DOCUMENT_PUBLISH_MODAL } from '../../constants.js'; -import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; +import { UmbDocumentPublishingRepository } from '../../index.js'; +import type { UmbDocumentVariantOptionModel } from '../../../types.js'; +import { UMB_DOCUMENT_PUBLISH_MODAL } from '../../../constants.js'; +import { UMB_DOCUMENT_ENTITY_TYPE } from '../../../entity.js'; import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-bulk-action'; import { UMB_APP_LANGUAGE_CONTEXT, UmbLanguageCollectionRepository } from '@umbraco-cms/backoffice/language'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; @@ -11,6 +10,7 @@ import { UmbLocalizationController } from '@umbraco-cms/backoffice/localization- import { UMB_ENTITY_CONTEXT } from '@umbraco-cms/backoffice/entity'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { UmbRequestReloadChildrenOfEntityEvent } from '@umbraco-cms/backoffice/entity-action'; +import { UmbPublishDocumentEntityAction } from '../entity-action/index.js'; export class UmbDocumentPublishEntityBulkAction extends UmbEntityBulkActionBase { async execute() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/manifests.ts index fbe10d296426..07f6b45e865e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/manifests.ts @@ -1,3 +1,9 @@ +import { manifests as entityActionManifests } from './entity-action/manifests.js'; +import { manifests as entityBulkActionManifests } from './entity-bulk-action/manifests.js'; import { manifests as modalManifests } from './modal/manifests.js'; -export const manifests: Array = [...modalManifests]; +export const manifests: Array = [ + ...entityActionManifests, + ...entityBulkActionManifests, + ...modalManifests, +]; From 503755fd291ad1f6ab79fae8cdf427badbdb2a33 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 9 Dec 2024 12:27:25 +0100 Subject: [PATCH 14/68] move unpublish action + bulk action --- .../documents/entity-actions/manifests.ts | 34 +-------------- .../entity-bulk-actions/manifests.ts | 41 +------------------ .../unpublish/entity-action/manifests.ts | 29 +++++++++++++ .../entity-action}/unpublish.action.ts | 6 +-- .../unpublish/entity-bulk-action/manifests.ts | 30 ++++++++++++++ .../unpublish.bulk-action.ts} | 6 +-- .../publishing/unpublish/manifests.ts | 8 +++- 7 files changed, 75 insertions(+), 79 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-action/manifests.ts rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{entity-actions => publishing/unpublish/entity-action}/unpublish.action.ts (95%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-bulk-action/manifests.ts rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{entity-bulk-actions/unpublish/unpublish.action.ts => publishing/unpublish/entity-bulk-action/unpublish.bulk-action.ts} (96%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts index 74159861da6a..8caa4a29f5c1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts @@ -1,9 +1,6 @@ import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../repository/index.js'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; -import { - UMB_USER_PERMISSION_DOCUMENT_DELETE, - UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH, -} from '../user-permissions/constants.js'; +import { UMB_USER_PERMISSION_DOCUMENT_DELETE } from '../user-permissions/constants.js'; import { manifests as createBlueprintManifests } from './create-blueprint/manifests.js'; import { manifests as createManifests } from './create/manifests.js'; import { manifests as cultureAndHostnamesManifests } from './culture-and-hostnames/manifests.js'; @@ -12,11 +9,7 @@ import { manifests as moveManifests } from './move-to/manifests.js'; import { manifests as publicAccessManifests } from './public-access/manifests.js'; import { manifests as sortChildrenOfManifests } from './sort-children-of/manifests.js'; import { manifests as notificationManifests } from './notifications/manifests.js'; - -import { - UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, - UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS, -} from '@umbraco-cms/backoffice/recycle-bin'; +import { UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; const entityActions: Array = [ { @@ -39,29 +32,6 @@ const entityActions: Array = [ }, ], }, - { - type: 'entityAction', - kind: 'default', - alias: 'Umb.EntityAction.Document.Unpublish', - name: 'Unpublish Document Entity Action', - weight: 500, - api: () => import('./unpublish.action.js'), - forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], - meta: { - icon: 'icon-globe', - label: '#actions_unpublish', - additionalOptions: true, - }, - conditions: [ - { - alias: 'Umb.Condition.UserPermission.Document', - allOf: [UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH], - }, - { - alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, - }, - ], - }, /* TODO: Implement Permissions Entity Action { type: 'entityAction', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/manifests.ts index 4fed5774b190..65ee8658fc9a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/manifests.ts @@ -1,44 +1,5 @@ -import { UMB_DOCUMENT_COLLECTION_ALIAS } from '../collection/constants.js'; -import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; -import { - UMB_USER_PERMISSION_DOCUMENT_PUBLISH, - UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH, -} from '../user-permissions/constants.js'; import { manifests as duplicateToManifests } from './duplicate-to/manifests.js'; import { manifests as moveToManifests } from './move-to/manifests.js'; import { manifests as trashManifests } from './trash/manifests.js'; -import { UMB_COLLECTION_ALIAS_CONDITION } from '@umbraco-cms/backoffice/collection'; -import type { ManifestEntityBulkAction } from '@umbraco-cms/backoffice/extension-registry'; -export const entityBulkActions: Array = [ - { - type: 'entityBulkAction', - kind: 'default', - alias: 'Umb.EntityBulkAction.Document.Unpublish', - name: 'Unpublish Document Entity Bulk Action', - weight: 40, - api: () => import('./unpublish/unpublish.action.js'), - meta: { - icon: 'icon-globe', - label: '#actions_unpublish', - }, - forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], - conditions: [ - { - alias: UMB_COLLECTION_ALIAS_CONDITION, - match: UMB_DOCUMENT_COLLECTION_ALIAS, - }, - { - alias: 'Umb.Condition.UserPermission.Document', - allOf: [UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH], - }, - ], - }, -]; - -export const manifests: Array = [ - ...entityBulkActions, - ...duplicateToManifests, - ...moveToManifests, - ...trashManifests, -]; +export const manifests: Array = [...duplicateToManifests, ...moveToManifests, ...trashManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-action/manifests.ts new file mode 100644 index 000000000000..e349770e636d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-action/manifests.ts @@ -0,0 +1,29 @@ +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; +import { UMB_DOCUMENT_ENTITY_TYPE } from '../../../entity.js'; +import { UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH } from '../../../user-permissions/constants.js'; + +export const manifests: Array = [ + { + type: 'entityAction', + kind: 'default', + alias: 'Umb.EntityAction.Document.Unpublish', + name: 'Unpublish Document Entity Action', + weight: 500, + api: () => import('./unpublish.action.js'), + forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], + meta: { + icon: 'icon-globe', + label: '#actions_unpublish', + additionalOptions: true, + }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + allOf: [UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH], + }, + { + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, + }, + ], + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/unpublish.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-action/unpublish.action.ts similarity index 95% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/unpublish.action.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-action/unpublish.action.ts index 50a0cdc9bb38..557639ab6bd3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/unpublish.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-action/unpublish.action.ts @@ -1,6 +1,4 @@ -import { UmbDocumentDetailRepository } from '../repository/index.js'; -import { UmbDocumentPublishingRepository } from '../publishing/repository/index.js'; -import type { UmbDocumentVariantOptionModel } from '../types.js'; +import type { UmbDocumentVariantOptionModel } from '../../../types.js'; import { UMB_DOCUMENT_UNPUBLISH_MODAL } from '../constants.js'; import { UMB_APP_LANGUAGE_CONTEXT, UmbLanguageCollectionRepository } from '@umbraco-cms/backoffice/language'; import { @@ -13,6 +11,8 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { UMB_CURRENT_USER_CONTEXT } from '@umbraco-cms/backoffice/current-user'; +import { UmbDocumentDetailRepository } from '../../../repository/index.js'; +import { UmbDocumentPublishingRepository } from '../../repository/index.js'; export class UmbUnpublishDocumentEntityAction extends UmbEntityActionBase { constructor(host: UmbControllerHost, args: UmbEntityActionArgs) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-bulk-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-bulk-action/manifests.ts new file mode 100644 index 000000000000..0bad25232e8b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-bulk-action/manifests.ts @@ -0,0 +1,30 @@ +import { UMB_COLLECTION_ALIAS_CONDITION } from '@umbraco-cms/backoffice/collection'; +import { UMB_DOCUMENT_ENTITY_TYPE } from '../../../entity.js'; +import { UMB_DOCUMENT_COLLECTION_ALIAS } from '../../../collection/constants.js'; +import { UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH } from '../../../user-permissions/constants.js'; + +export const manifests: Array = [ + { + type: 'entityBulkAction', + kind: 'default', + alias: 'Umb.EntityBulkAction.Document.Unpublish', + name: 'Unpublish Document Entity Bulk Action', + weight: 40, + api: () => import('./unpublish.bulk-action.js'), + meta: { + icon: 'icon-globe', + label: '#actions_unpublish', + }, + forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], + conditions: [ + { + alias: UMB_COLLECTION_ALIAS_CONDITION, + match: UMB_DOCUMENT_COLLECTION_ALIAS, + }, + { + alias: 'Umb.Condition.UserPermission.Document', + allOf: [UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH], + }, + ], + }, +]; 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/publishing/unpublish/entity-bulk-action/unpublish.bulk-action.ts similarity index 96% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-bulk-actions/unpublish/unpublish.action.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-bulk-action/unpublish.bulk-action.ts index 156de111d383..594496a04f61 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/publishing/unpublish/entity-bulk-action/unpublish.bulk-action.ts @@ -1,7 +1,7 @@ import { UmbUnpublishDocumentEntityAction } from '../../entity-actions/unpublish.action.js'; -import { UmbDocumentPublishingRepository } from '../../publishing/index.js'; -import type { UmbDocumentVariantOptionModel } from '../../types.js'; -import { UMB_DOCUMENT_ENTITY_TYPE, UMB_DOCUMENT_UNPUBLISH_MODAL } from '../../constants.js'; +import { UmbDocumentPublishingRepository } from '../../index.js'; +import type { UmbDocumentVariantOptionModel } from '../../../types.js'; +import { UMB_DOCUMENT_ENTITY_TYPE, UMB_DOCUMENT_UNPUBLISH_MODAL } from '../../../constants.js'; import { UMB_CONFIRM_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-bulk-action'; import { UMB_APP_LANGUAGE_CONTEXT, UmbLanguageCollectionRepository } from '@umbraco-cms/backoffice/language'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/manifests.ts index fbe10d296426..07f6b45e865e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/manifests.ts @@ -1,3 +1,9 @@ +import { manifests as entityActionManifests } from './entity-action/manifests.js'; +import { manifests as entityBulkActionManifests } from './entity-bulk-action/manifests.js'; import { manifests as modalManifests } from './modal/manifests.js'; -export const manifests: Array = [...modalManifests]; +export const manifests: Array = [ + ...entityActionManifests, + ...entityBulkActionManifests, + ...modalManifests, +]; From abfd6f52cdb4f8f97826fac2dca579955369c4b6 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 9 Dec 2024 12:29:03 +0100 Subject: [PATCH 15/68] lint fix --- .../packages/documents/documents/publishing/manifests.ts | 2 +- .../documents/publishing/publish/entity-action/manifests.ts | 2 +- .../publishing/publish/entity-action/publish.action.ts | 6 +++--- .../publishing/publish/entity-bulk-action/manifests.ts | 2 +- .../publish/entity-bulk-action/publish.bulk-action.ts | 2 +- .../publish/modal/document-publish-modal.token.ts | 2 +- .../modal/document-schedule-modal.element.ts | 2 +- .../schedule-publish/modal/document-schedule-modal.token.ts | 2 +- .../publishing/unpublish/entity-action/manifests.ts | 2 +- .../publishing/unpublish/entity-action/unpublish.action.ts | 4 ++-- .../publishing/unpublish/entity-bulk-action/manifests.ts | 2 +- 11 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts index cc1565c0217c..c6da30e99e27 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts @@ -1,8 +1,8 @@ +import { UMB_DOCUMENT_WORKSPACE_ALIAS } from '../workspace/constants.js'; import { manifests as publishManifest } from './publish/manifests.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; import { manifests as schedulePublishManifests } from './schedule-publish/manifests.js'; import { manifests as unpublishManifests } from './unpublish/manifests.js'; -import { UMB_DOCUMENT_WORKSPACE_ALIAS } from '../workspace/constants.js'; import { UMB_WORKSPACE_CONDITION_ALIAS } from '@umbraco-cms/backoffice/workspace'; export const manifests: Array = [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-action/manifests.ts index f3c3d022c73a..f501f4a7f9a5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-action/manifests.ts @@ -1,6 +1,6 @@ -import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../../../entity.js'; import { UMB_USER_PERMISSION_DOCUMENT_PUBLISH } from '../../../user-permissions/constants.js'; +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; export const manifests: Array = [ { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-action/publish.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-action/publish.action.ts index cc66d403b252..e74be197226a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-action/publish.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-action/publish.action.ts @@ -1,5 +1,7 @@ -import { type UmbDocumentVariantOptionModel } from '../../../types.js'; +import type { UmbDocumentVariantOptionModel } from '../../../types.js'; import { UMB_DOCUMENT_PUBLISH_MODAL } from '../modal/constants.js'; +import { UmbDocumentDetailRepository } from '../../../repository/index.js'; +import { UmbDocumentPublishingRepository } from '../../repository/index.js'; import { UMB_APP_LANGUAGE_CONTEXT, UmbLanguageCollectionRepository } from '@umbraco-cms/backoffice/language'; import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action'; import { UmbEntityActionBase, UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice/entity-action'; @@ -8,8 +10,6 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { UMB_CURRENT_USER_CONTEXT } from '@umbraco-cms/backoffice/current-user'; -import { UmbDocumentDetailRepository } from '../../../repository/index.js'; -import { UmbDocumentPublishingRepository } from '../../repository/index.js'; export class UmbPublishDocumentEntityAction extends UmbEntityActionBase { constructor(host: UmbControllerHost, args: UmbEntityActionArgs) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-bulk-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-bulk-action/manifests.ts index 57126facea00..9b50bc1ed379 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-bulk-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-bulk-action/manifests.ts @@ -1,7 +1,7 @@ -import { UMB_COLLECTION_ALIAS_CONDITION } from '@umbraco-cms/backoffice/collection'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../../../entity.js'; import { UMB_DOCUMENT_COLLECTION_ALIAS } from '../../../collection/constants.js'; import { UMB_USER_PERMISSION_DOCUMENT_PUBLISH } from '../../../user-permissions/constants.js'; +import { UMB_COLLECTION_ALIAS_CONDITION } from '@umbraco-cms/backoffice/collection'; export const manifests: Array = [ { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-bulk-action/publish.bulk-action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-bulk-action/publish.bulk-action.ts index 5c98204814c3..541d693ae630 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-bulk-action/publish.bulk-action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/entity-bulk-action/publish.bulk-action.ts @@ -2,6 +2,7 @@ import { UmbDocumentPublishingRepository } from '../../index.js'; import type { UmbDocumentVariantOptionModel } from '../../../types.js'; import { UMB_DOCUMENT_PUBLISH_MODAL } from '../../../constants.js'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../../../entity.js'; +import { UmbPublishDocumentEntityAction } from '../entity-action/index.js'; import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-bulk-action'; import { UMB_APP_LANGUAGE_CONTEXT, UmbLanguageCollectionRepository } from '@umbraco-cms/backoffice/language'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; @@ -10,7 +11,6 @@ import { UmbLocalizationController } from '@umbraco-cms/backoffice/localization- import { UMB_ENTITY_CONTEXT } from '@umbraco-cms/backoffice/entity'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { UmbRequestReloadChildrenOfEntityEvent } from '@umbraco-cms/backoffice/entity-action'; -import { UmbPublishDocumentEntityAction } from '../entity-action/index.js'; export class UmbDocumentPublishEntityBulkAction extends UmbEntityBulkActionBase { async execute() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/document-publish-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/document-publish-modal.token.ts index 9c490c04b67e..39382f14fd7c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/document-publish-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/document-publish-modal.token.ts @@ -1,5 +1,5 @@ -import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; import type { UmbDocumentVariantPickerData, UmbDocumentVariantPickerValue } from '../../../modals/types.js'; +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; export const UMB_DOCUMENT_PUBLISH_MODAL_ALIAS = 'Umb.Modal.DocumentPublish'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/document-schedule-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/document-schedule-modal.element.ts index 440951fe53e6..9779a0f3092a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/document-schedule-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/document-schedule-modal.element.ts @@ -1,4 +1,5 @@ import { UmbDocumentVariantState, type UmbDocumentVariantOptionModel } from '../../../types.js'; +import { UmbDocumentVariantLanguagePickerElement } from '../../../modals/index.js'; import type { UmbDocumentScheduleModalData, UmbDocumentScheduleModalValue } from './document-schedule-modal.token.js'; import { css, customElement, html, repeat, state, when } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; @@ -6,7 +7,6 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; import type { UmbInputDateElement } from '@umbraco-cms/backoffice/components'; import type { UUIBooleanInputElement } from '@umbraco-cms/backoffice/external/uui'; -import { UmbDocumentVariantLanguagePickerElement } from '../../../modals/index.js'; @customElement('umb-document-schedule-modal') export class UmbDocumentScheduleModalElement extends UmbModalBaseElement< diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/document-schedule-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/document-schedule-modal.token.ts index 9e3ca3d3a942..fed3dcfb50bc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/document-schedule-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/modal/document-schedule-modal.token.ts @@ -1,6 +1,6 @@ +import type { UmbDocumentVariantPickerData } from '../../../modals/types.js'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; import type { ScheduleRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; -import type { UmbDocumentVariantPickerData } from '../../../modals/types.js'; export const UMB_DOCUMENT_SCHEDULE_MODAL_ALIAS = 'Umb.Modal.DocumentSchedule'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-action/manifests.ts index e349770e636d..436dff320a34 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-action/manifests.ts @@ -1,6 +1,6 @@ -import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../../../entity.js'; import { UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH } from '../../../user-permissions/constants.js'; +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; export const manifests: Array = [ { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-action/unpublish.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-action/unpublish.action.ts index 557639ab6bd3..5aa6e4125d15 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-action/unpublish.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-action/unpublish.action.ts @@ -1,5 +1,7 @@ import type { UmbDocumentVariantOptionModel } from '../../../types.js'; import { UMB_DOCUMENT_UNPUBLISH_MODAL } from '../constants.js'; +import { UmbDocumentDetailRepository } from '../../../repository/index.js'; +import { UmbDocumentPublishingRepository } from '../../repository/index.js'; import { UMB_APP_LANGUAGE_CONTEXT, UmbLanguageCollectionRepository } from '@umbraco-cms/backoffice/language'; import { type UmbEntityActionArgs, @@ -11,8 +13,6 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { UMB_CURRENT_USER_CONTEXT } from '@umbraco-cms/backoffice/current-user'; -import { UmbDocumentDetailRepository } from '../../../repository/index.js'; -import { UmbDocumentPublishingRepository } from '../../repository/index.js'; export class UmbUnpublishDocumentEntityAction extends UmbEntityActionBase { constructor(host: UmbControllerHost, args: UmbEntityActionArgs) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-bulk-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-bulk-action/manifests.ts index 0bad25232e8b..e473c143633d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-bulk-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-bulk-action/manifests.ts @@ -1,7 +1,7 @@ -import { UMB_COLLECTION_ALIAS_CONDITION } from '@umbraco-cms/backoffice/collection'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../../../entity.js'; import { UMB_DOCUMENT_COLLECTION_ALIAS } from '../../../collection/constants.js'; import { UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH } from '../../../user-permissions/constants.js'; +import { UMB_COLLECTION_ALIAS_CONDITION } from '@umbraco-cms/backoffice/collection'; export const manifests: Array = [ { From 27c368f1fd729d80d2374192deb0dfe018e86abb Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 9 Dec 2024 12:36:38 +0100 Subject: [PATCH 16/68] Update document-workspace.context.ts --- .../documents/documents/workspace/document-workspace.context.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index 76b2c220fc58..776384fd4dee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -4,7 +4,6 @@ import type { UmbDocumentDetailRepository } from '../repository/index.js'; import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS } from '../repository/index.js'; import type { UmbDocumentVariantPublishModel, UmbDocumentDetailModel, UmbDocumentVariantModel } from '../types.js'; import { UmbDocumentPublishingRepository } from '../publishing/index.js'; -import { UmbUnpublishDocumentEntityAction } from '../entity-actions/unpublish.action.js'; import { UMB_CREATE_DOCUMENT_WORKSPACE_PATH_PATTERN, UMB_CREATE_FROM_BLUEPRINT_DOCUMENT_WORKSPACE_PATH_PATTERN, @@ -44,6 +43,7 @@ import { import type { UmbDocumentTypeDetailModel } from '@umbraco-cms/backoffice/document-type'; import { UmbIsTrashedEntityContext } from '@umbraco-cms/backoffice/recycle-bin'; import { UMB_APP_CONTEXT } from '@umbraco-cms/backoffice/app'; +import UmbUnpublishDocumentEntityAction from '../publishing/unpublish/entity-action/unpublish.action.js'; type ContentModel = UmbDocumentDetailModel; type ContentTypeModel = UmbDocumentTypeDetailModel; From e6f51582979f5c00e2f4df897bf3058df390dadf Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 9 Dec 2024 13:11:11 +0100 Subject: [PATCH 17/68] wip move publishing methods to publishing context --- .../document-publishing.workspace-context.ts | 259 +++++++++++++++++- .../workspace/document-workspace.context.ts | 248 +++-------------- 2 files changed, 281 insertions(+), 226 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts index fe4760587fa8..e486dc69959a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts @@ -4,34 +4,265 @@ import { UmbDocumentPublishedPendingChangesManager } from './document-published- import { UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT } from './document-publishing.workspace-context.token.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; +import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; +import type { UmbDocumentDetailModel, UmbDocumentVariantPublishModel } from '../types.js'; +import { UmbServerModelValidatorContext } from '@umbraco-cms/backoffice/validation'; +import { + UmbRequestReloadChildrenOfEntityEvent, + UmbRequestReloadStructureForEntityEvent, +} from '@umbraco-cms/backoffice/entity-action'; +import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; +import type { UmbDocumentValidationRepository } from '../repository/validation/index.js'; +import { UMB_DOCUMENT_SCHEDULE_MODAL } from './schedule-publish/constants.js'; +import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import { UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL } from './publish-with-descendants/constants.js'; export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { public readonly publishedPendingChanges = new UmbDocumentPublishedPendingChangesManager(this); + #init: Promise; + #documentWorkspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; #publishingRepository = new UmbDocumentPublishingRepository(this); + #serverValidation = new UmbServerModelValidatorContext(this); + #validationRepository?: UmbDocumentValidationRepository; constructor(host: UmbControllerHost) { super(host, UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT); - this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, async (context) => { - // No need to check pending changes for new documents - if (context.getIsNew()) { - return; - } + this.#init = Promise.all([ + this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, async (context) => { + this.#documentWorkspaceContext = context; - this.observe(context.unique, async (unique) => { - if (unique) { - const { data: publishedData } = await this.#publishingRepository.published(unique); - const currentData = context.getData(); + // No need to check pending changes for new documents + if (context.getIsNew()) { + return; + } + + this.observe(context.unique, async (unique) => { + if (unique) { + const { data: publishedData } = await this.#publishingRepository.published(unique); + const currentData = context.getData(); - if (!currentData || !publishedData) { - return; + if (!currentData || !publishedData) { + return; + } + + this.publishedPendingChanges.process({ currentData, publishedData }); } + }); + }).asPromise(), + ]); + } - this.publishedPendingChanges.process({ currentData, publishedData }); - } + public async saveAndPublish(): Promise { + return this.#handleSaveAndPublish(); + } + + public async schedule() { + const { options, selected } = await this._determineVariantOptions(); + + const modalManagerContext = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + const result = await modalManagerContext + .open(this, UMB_DOCUMENT_SCHEDULE_MODAL, { + data: { + options, + pickableFilter: this._readOnlyLanguageVariantsFilter, + }, + value: { selection: selected.map((unique) => ({ unique, schedule: {} })) }, + }) + .onSubmit() + .catch(() => undefined); + + if (!result?.selection.length) return; + + // Map to the correct format for the API (UmbDocumentVariantPublishModel) + const variants = + result?.selection.map((x) => ({ + variantId: UmbVariantId.FromString(x.unique), + schedule: x.schedule, + })) ?? []; + + if (!variants.length) return; + + // TODO: Validate content & Save changes for the selected variants — This was how it worked in v.13 [NL] + + const unique = this.getUnique(); + if (!unique) throw new Error('Unique is missing'); + await this.#publishingRepository.publish(unique, variants); + } + + public async publishWithDescendants() { + await this.#init; + if (!this.#documentWorkspaceContext) throw new Error('Document workspace context is missing'); + + const unique = this.#documentWorkspaceContext.getUnique(); + if (!unique) throw new Error('Unique is missing'); + + const entityType = this.#documentWorkspaceContext.getEntityType(); + if (!entityType) throw new Error('Entity type is missing'); + + const { options, selected } = await this._determineVariantOptions(); + + const modalManagerContext = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + const result = await modalManagerContext + .open(this, UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL, { + data: { + options, + pickableFilter: this._readOnlyLanguageVariantsFilter, + }, + value: { selection: selected }, + }) + .onSubmit() + .catch(() => undefined); + + if (!result?.selection.length) return; + + // Map to variantIds + const variantIds = result?.selection.map((x) => UmbVariantId.FromString(x)) ?? []; + + if (!variantIds.length) return; + + const { error } = await this.#publishingRepository.publishWithDescendants( + unique, + variantIds, + result.includeUnpublishedDescendants ?? false, + ); + + if (!error) { + const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); + + // request reload of this entity + const structureEvent = new UmbRequestReloadStructureForEntityEvent({ + entityType, + unique, + }); + + // request reload of the children + const childrenEvent = new UmbRequestReloadChildrenOfEntityEvent({ + entityType, + unique, }); - }); + + eventContext.dispatchEvent(structureEvent); + eventContext.dispatchEvent(childrenEvent); + } + } + + public async unpublish() { + await this.#init; + if (!this.#documentWorkspaceContext) throw new Error('Document workspace context is missing'); + + const unique = this.#documentWorkspaceContext.getUnique(); + if (!unique) throw new Error('Unique is missing'); + + const entityType = this.#documentWorkspaceContext.getEntityType(); + if (!entityType) throw new Error('Entity type is missing'); + + // TODO: remove meta + new UmbUnpublishDocumentEntityAction(this, { unique, entityType, meta: {} as never }).execute(); + } + + async #handleSaveAndPublish() { + await this.#init; + if (!this.#documentWorkspaceContext) throw new Error('Document workspace context is missing'); + + const unique = this.#documentWorkspaceContext.getUnique(); + if (!unique) throw new Error('Unique is missing'); + + let variantIds: Array = []; + + const { options, selected } = await this._determineVariantOptions(); + + // If there is only one variant, we don't need to open the modal. + if (options.length === 0) { + throw new Error('No variants are available'); + } else if (options.length === 1) { + // If only one option we will skip ahead and save the document with the only variant available: + variantIds.push(UmbVariantId.Create(options[0])); + } else { + // If there are multiple variants, we will open the modal to let the user pick which variants to publish. + const modalManagerContext = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + const result = await modalManagerContext + .open(this, UMB_DOCUMENT_PUBLISH_MODAL, { + data: { + options, + pickableFilter: this._readOnlyLanguageVariantsFilter, + }, + value: { selection: selected }, + }) + .onSubmit() + .catch(() => undefined); + + if (!result?.selection.length || !unique) return; + + variantIds = result?.selection.map((x) => UmbVariantId.FromString(x)) ?? []; + } + + const saveData = await this._data.constructData(variantIds); + await this._runMandatoryValidationForSaveData(saveData); + + // Create the validation repository if it does not exist. (we first create this here when we need it) [NL] + this.#validationRepository ??= new UmbDocumentValidationRepository(this); + + // We ask the server first to get a concatenated set of validation messages. So we see both front-end and back-end validation messages [NL] + if (this.getIsNew()) { + const parent = this.getParent(); + if (!parent) throw new Error('Parent is not set'); + this.#serverValidation.askServerForValidation( + saveData, + this.#validationRepository.validateCreate(saveData, parent.unique), + ); + } else { + this.#serverValidation.askServerForValidation( + saveData, + this.#validationRepository.validateSave(saveData, variantIds), + ); + } + + // TODO: Only validate the specified selection.. [NL] + return this.validateAndSubmit( + async () => { + return this.#performSaveAndPublish(variantIds, saveData); + }, + async () => { + // If data of the selection is not valid Then just save: + await this._performCreateOrUpdate(variantIds, saveData); + // Notifying that the save was successful, but we did not publish, which is what we want to symbolize here. [NL] + const notificationContext = await this.getContext(UMB_NOTIFICATION_CONTEXT); + // TODO: Get rid of the save notification. + // TODO: Translate this message [NL] + notificationContext.peek('danger', { + data: { message: 'Document was not published, but we saved it for you.' }, + }); + // Reject even thought the save was successful, but we did not publish, which is what we want to symbolize here. [NL] + return await Promise.reject(); + }, + ); + } + + async #performSaveAndPublish(variantIds: Array, saveData: UmbDocumentDetailModel): Promise { + await this.#init; + if (!this.#documentWorkspaceContext) throw new Error('Document workspace context is missing'); + + const unique = this.#documentWorkspaceContext.getUnique(); + if (!unique) throw new Error('Unique is missing'); + + const entityType = this.#documentWorkspaceContext.getEntityType(); + if (!entityType) throw new Error('Entity type is missing'); + + await this._performCreateOrUpdate(variantIds, saveData); + + const { error } = await this.#publishingRepository.publish( + unique, + variantIds.map((variantId) => ({ variantId })), + ); + + if (!error) { + const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); + const event = new UmbRequestReloadStructureForEntityEvent({ unique, entityType }); + eventContext.dispatchEvent(event); + this._closeModal(); + } } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index 776384fd4dee..64615e53083d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -2,20 +2,15 @@ import { UmbDocumentTypeDetailRepository } from '../../document-types/repository import { UmbDocumentPropertyDatasetContext } from '../property-dataset-context/document-property-dataset.context.js'; import type { UmbDocumentDetailRepository } from '../repository/index.js'; import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS } from '../repository/index.js'; -import type { UmbDocumentVariantPublishModel, UmbDocumentDetailModel, UmbDocumentVariantModel } from '../types.js'; -import { UmbDocumentPublishingRepository } from '../publishing/index.js'; +import type { UmbDocumentDetailModel, UmbDocumentVariantModel } from '../types.js'; import { UMB_CREATE_DOCUMENT_WORKSPACE_PATH_PATTERN, UMB_CREATE_FROM_BLUEPRINT_DOCUMENT_WORKSPACE_PATH_PATTERN, UMB_DOCUMENT_COLLECTION_ALIAS, UMB_DOCUMENT_ENTITY_TYPE, - UMB_DOCUMENT_PUBLISH_MODAL, - UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL, UMB_DOCUMENT_SAVE_MODAL, - UMB_DOCUMENT_SCHEDULE_MODAL, UMB_EDIT_DOCUMENT_WORKSPACE_PATH_PATTERN, } from '../constants.js'; -import { UmbDocumentValidationRepository } from '../repository/validation/document-validation.repository.js'; import { UmbDocumentPreviewRepository } from '../repository/preview/index.js'; import { UMB_DOCUMENT_DETAIL_MODEL_VARIANT_SCAFFOLD, UMB_DOCUMENT_WORKSPACE_ALIAS } from './constants.js'; import type { UmbEntityModel } from '@umbraco-cms/backoffice/entity'; @@ -26,15 +21,7 @@ import { UmbWorkspaceIsNewRedirectControllerAlias, } from '@umbraco-cms/backoffice/workspace'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; -import { - UmbRequestReloadChildrenOfEntityEvent, - UmbRequestReloadStructureForEntityEvent, -} from '@umbraco-cms/backoffice/entity-action'; -import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; -import { UmbServerModelValidatorContext } from '@umbraco-cms/backoffice/validation'; import { UmbDocumentBlueprintDetailRepository } from '@umbraco-cms/backoffice/document-blueprint'; -import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; import { UmbContentDetailWorkspaceContextBase, type UmbContentCollectionWorkspaceContext, @@ -43,7 +30,7 @@ import { import type { UmbDocumentTypeDetailModel } from '@umbraco-cms/backoffice/document-type'; import { UmbIsTrashedEntityContext } from '@umbraco-cms/backoffice/recycle-bin'; import { UMB_APP_CONTEXT } from '@umbraco-cms/backoffice/app'; -import UmbUnpublishDocumentEntityAction from '../publishing/unpublish/entity-action/unpublish.action.js'; +import { UmbDocumentPublishingRepository } from '../publishing/index.js'; type ContentModel = UmbDocumentDetailModel; type ContentTypeModel = UmbDocumentTypeDetailModel; @@ -60,11 +47,13 @@ export class UmbDocumentWorkspaceContext UmbPublishableWorkspaceContext, UmbContentCollectionWorkspaceContext { + /** + * The publishing repository for the document workspace. + * @deprecated Will be removed in v17. Use the methods on the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead. + * @memberof UmbDocumentWorkspaceContext + */ public readonly publishingRepository = new UmbDocumentPublishingRepository(this); - #serverValidation = new UmbServerModelValidatorContext(this); - #validationRepository?: UmbDocumentValidationRepository; - readonly isTrashed = this._data.createObservablePartOfCurrent((data) => data?.isTrashed); readonly contentTypeUnique = this._data.createObservablePartOfCurrent((data) => data?.documentType.unique); readonly contentTypeHasCollection = this._data.createObservablePartOfCurrent( @@ -219,6 +208,10 @@ export class UmbDocumentWorkspaceContext return this._handleSubmit(); } + public async saveAndPreview(): Promise { + return this.#handleSaveAndPreview(); + } + async #handleSaveAndPreview() { const unique = this.getUnique(); if (!unique) throw new Error('Unique is missing'); @@ -251,212 +244,43 @@ export class UmbDocumentWorkspaceContext previewWindow?.focus(); } - async #handleSaveAndPublish() { - const unique = this.getUnique(); - if (!unique) throw new Error('Unique is missing'); - - let variantIds: Array = []; - - const { options, selected } = await this._determineVariantOptions(); - - // If there is only one variant, we don't need to open the modal. - if (options.length === 0) { - throw new Error('No variants are available'); - } else if (options.length === 1) { - // If only one option we will skip ahead and save the document with the only variant available: - variantIds.push(UmbVariantId.Create(options[0])); - } else { - // If there are multiple variants, we will open the modal to let the user pick which variants to publish. - const modalManagerContext = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); - const result = await modalManagerContext - .open(this, UMB_DOCUMENT_PUBLISH_MODAL, { - data: { - options, - pickableFilter: this._readOnlyLanguageVariantsFilter, - }, - value: { selection: selected }, - }) - .onSubmit() - .catch(() => undefined); - - if (!result?.selection.length || !unique) return; - - variantIds = result?.selection.map((x) => UmbVariantId.FromString(x)) ?? []; - } - - const saveData = await this._data.constructData(variantIds); - await this._runMandatoryValidationForSaveData(saveData); - - // Create the validation repository if it does not exist. (we first create this here when we need it) [NL] - this.#validationRepository ??= new UmbDocumentValidationRepository(this); - - // We ask the server first to get a concatenated set of validation messages. So we see both front-end and back-end validation messages [NL] - if (this.getIsNew()) { - const parent = this.getParent(); - if (!parent) throw new Error('Parent is not set'); - this.#serverValidation.askServerForValidation( - saveData, - this.#validationRepository.validateCreate(saveData, parent.unique), - ); - } else { - this.#serverValidation.askServerForValidation( - saveData, - this.#validationRepository.validateSave(saveData, variantIds), - ); - } - - // TODO: Only validate the specified selection.. [NL] - return this.validateAndSubmit( - async () => { - return this.#performSaveAndPublish(variantIds, saveData); - }, - async () => { - // If data of the selection is not valid Then just save: - await this._performCreateOrUpdate(variantIds, saveData); - // Notifying that the save was successful, but we did not publish, which is what we want to symbolize here. [NL] - const notificationContext = await this.getContext(UMB_NOTIFICATION_CONTEXT); - // TODO: Get rid of the save notification. - // TODO: Translate this message [NL] - notificationContext.peek('danger', { - data: { message: 'Document was not published, but we saved it for you.' }, - }); - // Reject even thought the save was successful, but we did not publish, which is what we want to symbolize here. [NL] - return await Promise.reject(); - }, - ); - } - - async #performSaveAndPublish(variantIds: Array, saveData: UmbDocumentDetailModel): Promise { - const unique = this.getUnique(); - if (!unique) throw new Error('Unique is missing'); - - await this._performCreateOrUpdate(variantIds, saveData); - - const { error } = await this.publishingRepository.publish( - unique, - variantIds.map((variantId) => ({ variantId })), - ); - - if (!error) { - const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); - const event = new UmbRequestReloadStructureForEntityEvent({ - unique: this.getUnique()!, - entityType: this.getEntityType(), - }); - - eventContext.dispatchEvent(event); - - this._closeModal(); - } - } - - public async publish() { + /** + * @deprecated Will be removed in v17. + */ + async publish() { throw new Error('Method not implemented.'); } - public async saveAndPreview(): Promise { - return this.#handleSaveAndPreview(); - } - - public async saveAndPublish(): Promise { - return this.#handleSaveAndPublish(); + /** + * Save the document and publish it. + * @deprecated Will be removed in v17. Use the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead. + */ + async saveAndPublish(): Promise { + alert('WRONG METHOD'); } + /** + * Schedule the document to be published at a later date. + * @deprecated Will be removed in v17. Use the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead. + */ public async schedule() { - const { options, selected } = await this._determineVariantOptions(); - - const modalManagerContext = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); - const result = await modalManagerContext - .open(this, UMB_DOCUMENT_SCHEDULE_MODAL, { - data: { - options, - pickableFilter: this._readOnlyLanguageVariantsFilter, - }, - value: { selection: selected.map((unique) => ({ unique, schedule: {} })) }, - }) - .onSubmit() - .catch(() => undefined); - - if (!result?.selection.length) return; - - // Map to the correct format for the API (UmbDocumentVariantPublishModel) - const variants = - result?.selection.map((x) => ({ - variantId: UmbVariantId.FromString(x.unique), - schedule: x.schedule, - })) ?? []; - - if (!variants.length) return; - - // TODO: Validate content & Save changes for the selected variants — This was how it worked in v.13 [NL] - - const unique = this.getUnique(); - if (!unique) throw new Error('Unique is missing'); - await this.publishingRepository.publish(unique, variants); + alert('WRONG METHOD'); } + /** + * Unpublish the document. + * @deprecated Will be removed in v17. Use the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead. + */ public async unpublish() { - const unique = this.getUnique(); - const entityType = this.getEntityType(); - if (!unique) throw new Error('Unique is missing'); - if (!entityType) throw new Error('Entity type is missing'); - - // TODO: remove meta - new UmbUnpublishDocumentEntityAction(this, { unique, entityType, meta: {} as never }).execute(); + alert('WRONG METHOD'); } + /** + * Publish the document and all its descendants. + * @deprecated Will be removed in v17. Use the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead. + */ public async publishWithDescendants() { - const unique = this.getUnique(); - if (!unique) throw new Error('Unique is missing'); - - const entityType = this.getEntityType(); - if (!entityType) throw new Error('Entity type is missing'); - - const { options, selected } = await this._determineVariantOptions(); - - const modalManagerContext = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); - const result = await modalManagerContext - .open(this, UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL, { - data: { - options, - pickableFilter: this._readOnlyLanguageVariantsFilter, - }, - value: { selection: selected }, - }) - .onSubmit() - .catch(() => undefined); - - if (!result?.selection.length) return; - - // Map to variantIds - const variantIds = result?.selection.map((x) => UmbVariantId.FromString(x)) ?? []; - - if (!variantIds.length) return; - - const { error } = await this.publishingRepository.publishWithDescendants( - unique, - variantIds, - result.includeUnpublishedDescendants ?? false, - ); - - if (!error) { - const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); - - // request reload of this entity - const structureEvent = new UmbRequestReloadStructureForEntityEvent({ - entityType, - unique, - }); - - // request reload of the children - const childrenEvent = new UmbRequestReloadChildrenOfEntityEvent({ - entityType, - unique, - }); - - eventContext.dispatchEvent(structureEvent); - eventContext.dispatchEvent(childrenEvent); - } + alert('WRONG METHOD'); } public createPropertyDatasetContext( From 3f8407e578f1ee3d6e2d087f8b2c219fe3eef823 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 9 Dec 2024 13:41:42 +0100 Subject: [PATCH 18/68] move publish with descendants --- .../packages/documents/documents/modals/constants.ts | 1 - .../packages/documents/documents/modals/manifests.ts | 3 +-- .../modals/publish-with-descendants-modal/constants.ts | 2 -- .../modals/publish-with-descendants-modal/manifest.ts | 10 ---------- .../src/packages/documents/documents/modals/types.ts | 2 -- .../documents/documents/publishing/constants.ts | 1 + .../documents/documents/publishing/manifests.ts | 2 ++ .../publishing/publish-with-descendants/constants.ts | 1 + .../publishing/publish-with-descendants/manifests.ts | 3 +++ .../publish-with-descendants/modal/constants.ts | 1 + .../document-publish-with-descendants-modal.element.ts | 4 ++-- .../document-publish-with-descendants-modal.stories.ts | 0 .../document-publish-with-descendants-modal.token.ts | 5 +++-- .../publish-with-descendants/modal/manifests.ts | 10 ++++++++++ .../publishing/publish-with-descendants/modal/types.ts | 1 + .../publishing/publish-with-descendants/types.ts | 1 + .../publish/modal/document-publish-modal.element.ts | 2 +- .../packages/documents/documents/publishing/types.ts | 1 + .../publishing/unpublish/entity-action/index.ts | 1 + .../entity-bulk-action/unpublish.bulk-action.ts | 4 ++-- .../documents/{modals => publishing}/utils.ts | 0 .../src/packages/documents/documents/types.ts | 1 + 22 files changed, 32 insertions(+), 24 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-with-descendants-modal/constants.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-with-descendants-modal/manifest.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/constants.ts rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{modals/publish-with-descendants-modal => publishing/publish-with-descendants/modal}/document-publish-with-descendants-modal.element.ts (98%) rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{modals/publish-with-descendants-modal => publishing/publish-with-descendants/modal}/document-publish-with-descendants-modal.stories.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{modals/publish-with-descendants-modal => publishing/publish-with-descendants/modal}/document-publish-with-descendants-modal.token.ts (82%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-action/index.ts rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{modals => publishing}/utils.ts (100%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/constants.ts index 2551cddb650c..9f9e2d7731b2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/constants.ts @@ -1,3 +1,2 @@ -export * from './publish-with-descendants-modal/constants.js'; export * from './save-modal/constants.js'; export * from './document-picker-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/manifests.ts index 9c797e64d867..ceb3f5196883 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/manifests.ts @@ -1,4 +1,3 @@ -import { manifest as publishWithDescendantsModalManifest } from './publish-with-descendants-modal/manifest.js'; import { manifest as saveModalManifest } from './save-modal/manifest.js'; -export const manifests: Array = [publishWithDescendantsModalManifest, saveModalManifest]; +export const manifests: Array = [saveModalManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-with-descendants-modal/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-with-descendants-modal/constants.ts deleted file mode 100644 index 4e75826676ff..000000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-with-descendants-modal/constants.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './document-publish-with-descendants-modal.token.js'; -export { UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL_ALIAS } from './manifest.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-with-descendants-modal/manifest.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-with-descendants-modal/manifest.ts deleted file mode 100644 index 31480cf8e254..000000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-with-descendants-modal/manifest.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { ManifestModal } from '@umbraco-cms/backoffice/modal'; - -export const UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL_ALIAS = 'Umb.Modal.DocumentPublishWithDescendants'; - -export const manifest: ManifestModal = { - type: 'modal', - alias: UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL_ALIAS, - name: 'Document Publish With Descendants Modal', - element: () => import('./document-publish-with-descendants-modal.element.js'), -}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/types.ts index 6e68b73be44b..98ad1aeb5014 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/types.ts @@ -4,7 +4,5 @@ import type { UmbContentVariantPickerData, UmbContentVariantPickerValue } from ' export type UmbDocumentVariantPickerData = UmbContentVariantPickerData; export type UmbDocumentVariantPickerValue = UmbContentVariantPickerValue; -export type * from '../publishing/publish/modal/constants.js'; -export type * from './publish-with-descendants-modal/constants.js'; export type * from './save-modal/constants.js'; export type * from './document-picker-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts index ac9b012363dc..d7349eb8b83d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts @@ -2,3 +2,4 @@ export * from './publish/constants.js'; export * from './repository/constants.js'; export * from './schedule-publish/constants.js'; export * from './unpublish/constants.js'; +export * from './publish-with-descendants/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts index c6da30e99e27..67072dda89f1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts @@ -3,6 +3,7 @@ import { manifests as publishManifest } from './publish/manifests.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; import { manifests as schedulePublishManifests } from './schedule-publish/manifests.js'; import { manifests as unpublishManifests } from './unpublish/manifests.js'; +import { manifests as publishWithDescendantsManifest } from './publish-with-descendants/manifests.js'; import { UMB_WORKSPACE_CONDITION_ALIAS } from '@umbraco-cms/backoffice/workspace'; export const manifests: Array = [ @@ -19,6 +20,7 @@ export const manifests: Array = [ ], }, ...publishManifest, + ...publishWithDescendantsManifest, ...repositoryManifests, ...schedulePublishManifests, ...unpublishManifests, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/constants.ts new file mode 100644 index 000000000000..26f4f0dd5f39 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/constants.ts @@ -0,0 +1 @@ +export * from './modal/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/manifests.ts new file mode 100644 index 000000000000..fbe10d296426 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/manifests.ts @@ -0,0 +1,3 @@ +import { manifests as modalManifests } from './modal/manifests.js'; + +export const manifests: Array = [...modalManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/constants.ts new file mode 100644 index 000000000000..310db622dc29 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/constants.ts @@ -0,0 +1 @@ +export * from './document-publish-with-descendants-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-with-descendants-modal/document-publish-with-descendants-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/document-publish-with-descendants-modal.element.ts similarity index 98% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-with-descendants-modal/document-publish-with-descendants-modal.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/document-publish-with-descendants-modal.element.ts index c9cb75c085a1..ada41bb6340b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-with-descendants-modal/document-publish-with-descendants-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/document-publish-with-descendants-modal.element.ts @@ -1,5 +1,3 @@ -import { UmbDocumentVariantState, type UmbDocumentVariantOptionModel } from '../../types.js'; -import { isNotPublishedMandatory } from '../utils.js'; import type { UmbDocumentPublishWithDescendantsModalData, UmbDocumentPublishWithDescendantsModalValue, @@ -8,6 +6,8 @@ import { css, customElement, html, state } from '@umbraco-cms/backoffice/externa import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; +import { UmbDocumentVariantState, type UmbDocumentVariantOptionModel } from '../../../types.js'; +import { isNotPublishedMandatory } from '../../utils.js'; import '../shared/document-variant-language-picker.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-with-descendants-modal/document-publish-with-descendants-modal.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/document-publish-with-descendants-modal.stories.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-with-descendants-modal/document-publish-with-descendants-modal.stories.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/document-publish-with-descendants-modal.stories.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-with-descendants-modal/document-publish-with-descendants-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/document-publish-with-descendants-modal.token.ts similarity index 82% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-with-descendants-modal/document-publish-with-descendants-modal.token.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/document-publish-with-descendants-modal.token.ts index 75b7729a5aee..3e25770093df 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/publish-with-descendants-modal/document-publish-with-descendants-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/document-publish-with-descendants-modal.token.ts @@ -1,7 +1,8 @@ -import type { UmbDocumentVariantPickerData, UmbDocumentVariantPickerValue } from '../types.js'; -import { UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL_ALIAS } from './manifest.js'; +import type { UmbDocumentVariantPickerData, UmbDocumentVariantPickerValue } from '../../../types.js'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; +export const UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL_ALIAS = 'Umb.Modal.DocumentPublishWithDescendants'; + // eslint-disable-next-line @typescript-eslint/no-empty-object-type export interface UmbDocumentPublishWithDescendantsModalData extends UmbDocumentVariantPickerData {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/manifests.ts new file mode 100644 index 000000000000..48f49f173344 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/manifests.ts @@ -0,0 +1,10 @@ +import { UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL_ALIAS } from './constants.js'; + +export const manifests: Array = [ + { + type: 'modal', + alias: UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL_ALIAS, + name: 'Document Publish With Descendants Modal', + element: () => import('./document-publish-with-descendants-modal.element.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/types.ts new file mode 100644 index 000000000000..310db622dc29 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/types.ts @@ -0,0 +1 @@ +export * from './document-publish-with-descendants-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/types.ts new file mode 100644 index 000000000000..4aeeacf57dd0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/types.ts @@ -0,0 +1 @@ +export type * from './modal/types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/document-publish-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/document-publish-modal.element.ts index 41e1fc7e2461..17429a0c989a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/document-publish-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/modal/document-publish-modal.element.ts @@ -1,5 +1,5 @@ import { UmbDocumentVariantState, type UmbDocumentVariantOptionModel } from '../../../types.js'; -import { isNotPublishedMandatory } from '../../../modals/utils.js'; +import { isNotPublishedMandatory } from '../../utils.js'; import type { UmbDocumentPublishModalData, UmbDocumentPublishModalValue } from './document-publish-modal.token.js'; import { css, customElement, html, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts index 7936b9fee676..a9bc738b552b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts @@ -1,3 +1,4 @@ export type * from './publish/types.js'; export type * from './schedule-publish/types.js'; export type * from './unpublish/types.js'; +export type * from './publish-with-descendants/types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-action/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-action/index.ts new file mode 100644 index 000000000000..4993625d1f29 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-action/index.ts @@ -0,0 +1 @@ +export * from './unpublish.action.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-bulk-action/unpublish.bulk-action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-bulk-action/unpublish.bulk-action.ts index 594496a04f61..bb4dd51260c7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-bulk-action/unpublish.bulk-action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-bulk-action/unpublish.bulk-action.ts @@ -1,5 +1,4 @@ -import { UmbUnpublishDocumentEntityAction } from '../../entity-actions/unpublish.action.js'; -import { UmbDocumentPublishingRepository } from '../../index.js'; +import { UmbUnpublishDocumentEntityAction } from '../entity-action/index.js'; import type { UmbDocumentVariantOptionModel } from '../../../types.js'; import { UMB_DOCUMENT_ENTITY_TYPE, UMB_DOCUMENT_UNPUBLISH_MODAL } from '../../../constants.js'; import { UMB_CONFIRM_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; @@ -10,6 +9,7 @@ import { UmbLocalizationController } from '@umbraco-cms/backoffice/localization- import { UMB_ENTITY_CONTEXT } from '@umbraco-cms/backoffice/entity'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { UmbRequestReloadChildrenOfEntityEvent } from '@umbraco-cms/backoffice/entity-action'; +import { UmbDocumentPublishingRepository } from '../../repository/index.js'; export class UmbDocumentUnpublishEntityBulkAction extends UmbEntityBulkActionBase { async execute() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/utils.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/utils.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/utils.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/utils.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/types.ts index f3f882e74a61..a3407cf5aa4a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/types.ts @@ -18,6 +18,7 @@ export type * from './tree/types.js'; export type * from './user-permissions/types.js'; export type * from './entity.js'; export type * from './workspace/types.js'; +export type * from './publishing/types.js'; export interface UmbDocumentDetailModel extends UmbContentDetailModel { documentType: { From d6ff2b6f2b6eb650fe1ee4b3fa953296cd66eaeb Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 9 Dec 2024 13:47:08 +0100 Subject: [PATCH 19/68] fix more references --- .../submittable-workspace-context-base.ts | 8 ++++---- .../document-publishing.workspace-context.ts | 17 +++++++++++------ ...nt-publish-with-descendants-modal.stories.ts | 6 +++--- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/submittable/submittable-workspace-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/submittable/submittable-workspace-context-base.ts index 1293abbc46cc..a641f1088768 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/submittable/submittable-workspace-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/submittable/submittable-workspace-context-base.ts @@ -63,7 +63,7 @@ export abstract class UmbSubmittableWorkspaceContextBase this.#isNew.setValue(undefined); } - getIsNew() { + public getIsNew() { return this.#isNew.getValue(); } @@ -75,19 +75,19 @@ export abstract class UmbSubmittableWorkspaceContextBase * If a Workspace has multiple validation contexts, then this method can be overwritten to return the correct one. * @returns Promise that resolves to void when the validation is complete. */ - async validate(): Promise> { + public async validate(): Promise> { //return this.validation.validate(); return Promise.all(this.#validationContexts.map((context) => context.validate())); } - async requestSubmit(): Promise { + public async requestSubmit(): Promise { return this.validateAndSubmit( () => this.submit(), () => this.invalidSubmit(), ); } - protected async validateAndSubmit(onValid: () => Promise, onInvalid: () => Promise): Promise { + public async validateAndSubmit(onValid: () => Promise, onInvalid: () => Promise): Promise { if (this.#submitPromise) { return this.#submitPromise; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts index e486dc69959a..c9582c2426d5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts @@ -16,6 +16,8 @@ import type { UmbDocumentValidationRepository } from '../repository/validation/i import { UMB_DOCUMENT_SCHEDULE_MODAL } from './schedule-publish/constants.js'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL } from './publish-with-descendants/constants.js'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; +import { UMB_DOCUMENT_PUBLISH_MODAL } from './publish/constants.js'; export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { public readonly publishedPendingChanges = new UmbDocumentPublishedPendingChangesManager(this); @@ -59,6 +61,12 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { return this.#performSaveAndPublish(variantIds, saveData); }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/document-publish-with-descendants-modal.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/document-publish-with-descendants-modal.stories.ts index fa89fc495ac4..225dba77eacb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/document-publish-with-descendants-modal.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/document-publish-with-descendants-modal.stories.ts @@ -1,6 +1,4 @@ -import './document-publish-with-descendants-modal.element.js'; - -import { UmbDocumentVariantState } from '../../types.js'; +import { UmbDocumentVariantState } from '../../../types.js'; import type { UmbDocumentPublishWithDescendantsModalData, UmbDocumentPublishWithDescendantsModalValue, @@ -9,6 +7,8 @@ import type { UmbDocumentPublishWithDescendantsModalElement } from './document-p import type { Meta, StoryObj } from '@storybook/web-components'; import { html } from '@umbraco-cms/backoffice/external/lit'; +import './document-publish-with-descendants-modal.element.js'; + const modalData: UmbDocumentPublishWithDescendantsModalData = { options: [ { From c5f319e1e5173536769eb9382fa4dec9dec03515 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 9 Dec 2024 14:02:54 +0100 Subject: [PATCH 20/68] Update document-publishing.workspace-context.ts --- .../publishing/document-publishing.workspace-context.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts index c9582c2426d5..b2810485f4f0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts @@ -12,7 +12,7 @@ import { UmbRequestReloadStructureForEntityEvent, } from '@umbraco-cms/backoffice/entity-action'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; -import type { UmbDocumentValidationRepository } from '../repository/validation/index.js'; +import { UmbDocumentValidationRepository } from '../repository/validation/index.js'; import { UMB_DOCUMENT_SCHEDULE_MODAL } from './schedule-publish/constants.js'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL } from './publish-with-descendants/constants.js'; From cf680fe6de4a27633d0de7c8f76cab7ad0de7377 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 9 Dec 2024 14:29:23 +0100 Subject: [PATCH 21/68] export entity action --- .../packages/documents/documents/publishing/unpublish/index.ts | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/index.ts new file mode 100644 index 000000000000..67d897c5ab4b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/index.ts @@ -0,0 +1 @@ +export * from './entity-action/index.js'; From 830b354bd7770cfdf6fbc8bb5cf9e27da4b2cab5 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 9 Dec 2024 14:29:37 +0100 Subject: [PATCH 22/68] add return type --- .../core/content/workspace/content-detail-workspace-base.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts index 814ffafd884c..52330af23ab5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts @@ -428,7 +428,10 @@ export abstract class UmbContentDetailWorkspaceContextBase< this._data.finishPropertyValueChange(); }; - protected async _determineVariantOptions() { + protected async _determineVariantOptions(): Promise<{ + options: VariantOptionModelType[]; + selected: string[]; + }> { const options = await firstValueFrom(this.variantOptions); const activeVariants = this.splitView.getActiveVariants(); From 0ac74fd8c8d31eb40b187935fde3527d90db3650 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 9 Dec 2024 14:29:59 +0100 Subject: [PATCH 23/68] temp internal methods --- .../document-publishing.workspace-context.ts | 55 ++++++++++++++++--- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts index b2810485f4f0..e85517ba8ac3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts @@ -5,7 +5,11 @@ import { UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT } from './document-publishing import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; -import type { UmbDocumentDetailModel, UmbDocumentVariantPublishModel } from '../types.js'; +import type { + UmbDocumentDetailModel, + UmbDocumentVariantOptionModel, + UmbDocumentVariantPublishModel, +} from '../types.js'; import { UmbServerModelValidatorContext } from '@umbraco-cms/backoffice/validation'; import { UmbRequestReloadChildrenOfEntityEvent, @@ -18,6 +22,8 @@ import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL } from './publish-with-descendants/constants.js'; import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; import { UMB_DOCUMENT_PUBLISH_MODAL } from './publish/constants.js'; +import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; +import { UmbUnpublishDocumentEntityAction } from './unpublish/index.js'; export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { public readonly publishedPendingChanges = new UmbDocumentPublishedPendingChangesManager(this); @@ -67,14 +73,14 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase ({ unique, schedule: {} })) }, }) @@ -106,14 +112,14 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase = []; - const { options, selected } = await this._determineVariantOptions(); + const { options, selected } = await this.#determineVariantOptions(); // If there is only one variant, we don't need to open the modal. if (options.length === 0) { @@ -191,7 +197,7 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { + const readOnlyCultures = + this.#documentWorkspaceContext?.readOnlyState.getStates().map((s) => s.variantId.culture) ?? []; + return readOnlyCultures.includes(option.culture) === false; + }; + + async #determineVariantOptions(): Promise<{ + options: UmbDocumentVariantOptionModel[]; + selected: string[]; + }> { + await this.#init; + if (!this.#documentWorkspaceContext) throw new Error('Document workspace context is missing'); + + const options = await firstValueFrom(this.#documentWorkspaceContext.variantOptions); + + //const activeVariants = this.splitView.getActiveVariants(); + //const activeVariantIds = activeVariants.map((activeVariant) => UmbVariantId.Create(activeVariant)); + //const changedVariantIds = this._data.getChangedVariants(); + //const selectedVariantIds = activeVariantIds.concat(changedVariantIds); + + // Selected can contain entries that are not part of the options, therefor the modal filters selection based on options. + /* + const readOnlyCultures = this.readOnlyState.getStates().map((s) => s.variantId.culture); + let selected = selectedVariantIds.map((x) => x.toString()).filter((v, i, a) => a.indexOf(v) === i); + selected = selected.filter((x) => readOnlyCultures.includes(x) === false); + */ + + const selected: Array = []; + + return { + options, + selected, + }; + } } export { UmbDocumentPublishingWorkspaceContext as api }; From 937de3aca981022b411338c4fe0c7b4336616de5 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 9 Dec 2024 20:08:58 +0100 Subject: [PATCH 24/68] use repository response type --- .../repository/content-validation-repository.interface.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content/repository/content-validation-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content/repository/content-validation-repository.interface.ts index f9630705e441..43c58b8fe928 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content/repository/content-validation-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content/repository/content-validation-repository.interface.ts @@ -1,8 +1,8 @@ import type { UmbContentDetailModel } from '../types.js'; import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; -import type { UmbDataSourceResponse } from '@umbraco-cms/backoffice/repository'; +import type { UmbRepositoryResponse } from '@umbraco-cms/backoffice/repository'; export interface UmbContentValidationRepository { - validateCreate(model: DetailModelType, parentUnique: string | null): Promise>; - validateSave(model: DetailModelType, variantIds: Array): Promise>; + validateCreate(model: DetailModelType, parentUnique: string | null): Promise>; + validateSave(model: DetailModelType, variantIds: Array): Promise>; } From 133292bc550cd8e9aefcbba3a68c32cba308d19e Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 09:44:41 +0100 Subject: [PATCH 25/68] expose methods for other contexts to use --- .../content-detail-workspace-base.ts | 62 ++++++++++++++-- .../document-publishing.workspace-context.ts | 74 +++++++++---------- 2 files changed, 93 insertions(+), 43 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts index a344d3cb83cc..93cc6ef13e24 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts @@ -468,7 +468,23 @@ export abstract class UmbContentDetailWorkspaceContextBase< }; /* validation */ + /** + * Run the mandatory validation for the save data + * @deprecated Use the public runMandatoryValidationForSaveData instead. Will be removed in v. 17. + * @protected + * @param {DetailModelType} saveData - The data to validate + * @memberof UmbContentDetailWorkspaceContextBase + */ protected async _runMandatoryValidationForSaveData(saveData: DetailModelType) { + this.runMandatoryValidationForSaveData(saveData); + } + + /** + * Run the mandatory validation for the save data + * @param {DetailModelType} saveData - The data to validate + * @memberof UmbContentDetailWorkspaceContextBase + */ + public async runMandatoryValidationForSaveData(saveData: DetailModelType) { // Check that the data is valid before we save it. // Check variants have a name: const variantsWithoutAName = saveData.variants.filter((x) => !x.name); @@ -485,7 +501,13 @@ export abstract class UmbContentDetailWorkspaceContextBase< } } - protected async _askServerToValidate(saveData: DetailModelType, variantIds: Array) { + /** + * Ask the server to validate the save data + * @param {DetailModelType} saveData - The data to validate + * @param {Array} variantIds - The variant ids to validate + * @memberof UmbContentDetailWorkspaceContextBase + */ + public async askServerToValidate(saveData: DetailModelType, variantIds: Array) { if (this.#validationRepositoryClass) { // Create the validation repository if it does not exist. (we first create this here when we need it) [NL] this.#validationRepository ??= new this.#validationRepositoryClass(this); @@ -519,6 +541,16 @@ export abstract class UmbContentDetailWorkspaceContextBase< return this._handleSubmit(); } + /** + * Get the data to save + * @param {Array} variantIds - The variant ids to save + * @returns {Promise} {Promise} + * @memberof UmbContentDetailWorkspaceContextBase + */ + public constructSaveData(variantIds: Array): Promise { + return this._data.constructData(variantIds); + } + protected async _handleSubmit() { const data = this.getData(); if (!data) { @@ -556,24 +588,42 @@ export abstract class UmbContentDetailWorkspaceContextBase< throw new Error('No variant picker modal token is set. There are multiple variants to save. Cannot proceed.'); } - const saveData = await this._data.constructData(variantIds); - await this._runMandatoryValidationForSaveData(saveData); + const saveData = await this.constructSaveData(variantIds); + await this.runMandatoryValidationForSaveData(saveData); if (this.#validateOnSubmit) { - await this._askServerToValidate(saveData, variantIds); + await this.askServerToValidate(saveData, variantIds); return this.validateAndSubmit( async () => { - return this._performCreateOrUpdate(variantIds, saveData); + return this.performCreateOrUpdate(variantIds, saveData); }, async () => { return this.invalidSubmit(); }, ); } else { - await this._performCreateOrUpdate(variantIds, saveData); + await this.performCreateOrUpdate(variantIds, saveData); } } + /** + * Perform the create or update of the content + * @deprecated Use the public performCreateOrUpdate instead. Will be removed in v. 17. + * @protected + * @param {Array} variantIds + * @param {DetailModelType} saveData + * @memberof UmbContentDetailWorkspaceContextBase + */ protected async _performCreateOrUpdate(variantIds: Array, saveData: DetailModelType) { + await this.performCreateOrUpdate(variantIds, saveData); + } + + /** + * Perform the create or update of the content + * @param {Array} variantIds - The variant ids to save + * @param {DetailModelType} saveData - The data to save + * @memberof UmbContentDetailWorkspaceContextBase + */ + public async performCreateOrUpdate(variantIds: Array, saveData: DetailModelType) { if (this.getIsNew()) { await this.#create(variantIds, saveData); } else { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts index e85517ba8ac3..0084f231de37 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts @@ -1,29 +1,27 @@ import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../workspace/document-workspace.context-token.js'; +import type { + UmbDocumentDetailModel, + UmbDocumentVariantOptionModel, + UmbDocumentVariantPublishModel, +} from '../types.js'; import { UmbDocumentPublishingRepository } from './repository/index.js'; import { UmbDocumentPublishedPendingChangesManager } from './document-published-pending-changes.manager.js'; import { UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT } from './document-publishing.workspace-context.token.js'; +import { UMB_DOCUMENT_SCHEDULE_MODAL } from './schedule-publish/constants.js'; +import { UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL } from './publish-with-descendants/constants.js'; +import { UMB_DOCUMENT_PUBLISH_MODAL } from './publish/constants.js'; +import { UmbUnpublishDocumentEntityAction } from './unpublish/index.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; -import type { - UmbDocumentDetailModel, - UmbDocumentVariantOptionModel, - UmbDocumentVariantPublishModel, -} from '../types.js'; -import { UmbServerModelValidatorContext } from '@umbraco-cms/backoffice/validation'; import { UmbRequestReloadChildrenOfEntityEvent, UmbRequestReloadStructureForEntityEvent, } from '@umbraco-cms/backoffice/entity-action'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; -import { UmbDocumentValidationRepository } from '../repository/validation/index.js'; -import { UMB_DOCUMENT_SCHEDULE_MODAL } from './schedule-publish/constants.js'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; -import { UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL } from './publish-with-descendants/constants.js'; import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; -import { UMB_DOCUMENT_PUBLISH_MODAL } from './publish/constants.js'; import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; -import { UmbUnpublishDocumentEntityAction } from './unpublish/index.js'; export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { public readonly publishedPendingChanges = new UmbDocumentPublishedPendingChangesManager(this); @@ -31,8 +29,6 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase; #documentWorkspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; #publishingRepository = new UmbDocumentPublishingRepository(this); - #serverValidation = new UmbServerModelValidatorContext(this); - #validationRepository?: UmbDocumentValidationRepository; constructor(host: UmbControllerHost) { super(host, UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT); @@ -62,11 +58,21 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase} + * @memberof UmbDocumentPublishingWorkspaceContext + */ public async saveAndPublish(): Promise { return this.#handleSaveAndPublish(); } - public async schedule() { + /** + * Schedule the document for publishing + * @returns {Promise} + * @memberof UmbDocumentPublishingWorkspaceContext + */ + public async schedule(): Promise { await this.#init; if (!this.#documentWorkspaceContext) throw new Error('Document workspace context is missing'); @@ -102,7 +108,12 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase} + * @memberof UmbDocumentPublishingWorkspaceContext + */ + public async publishWithDescendants(): Promise { await this.#init; if (!this.#documentWorkspaceContext) throw new Error('Document workspace context is missing'); @@ -159,7 +170,12 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase} + * @memberof UmbDocumentPublishingWorkspaceContext + */ + public async unpublish(): Promise { await this.#init; if (!this.#documentWorkspaceContext) throw new Error('Document workspace context is missing'); @@ -209,26 +225,10 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase UmbVariantId.FromString(x)) ?? []; } - const saveData = await this._data.constructData(variantIds); - await this._runMandatoryValidationForSaveData(saveData); - - // Create the validation repository if it does not exist. (we first create this here when we need it) [NL] - this.#validationRepository ??= new UmbDocumentValidationRepository(this); + const saveData = await this.#documentWorkspaceContext.constructSaveData(variantIds); + await this.#documentWorkspaceContext.runMandatoryValidationForSaveData(saveData); - // We ask the server first to get a concatenated set of validation messages. So we see both front-end and back-end validation messages [NL] - if (this.#documentWorkspaceContext.getIsNew()) { - const parent = this.#documentWorkspaceContext.getParent(); - if (!parent) throw new Error('Parent is not set'); - this.#serverValidation.askServerForValidation( - saveData, - this.#validationRepository.validateCreate(saveData, parent.unique), - ); - } else { - this.#serverValidation.askServerForValidation( - saveData, - this.#validationRepository.validateSave(saveData, variantIds), - ); - } + await this.#documentWorkspaceContext.askServerToValidate(saveData, variantIds); // TODO: Only validate the specified selection.. [NL] return this.#documentWorkspaceContext.validateAndSubmit( @@ -237,7 +237,7 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { // If data of the selection is not valid Then just save: - await this._performCreateOrUpdate(variantIds, saveData); + await this.#documentWorkspaceContext!.performCreateOrUpdate(variantIds, saveData); // Notifying that the save was successful, but we did not publish, which is what we want to symbolize here. [NL] const notificationContext = await this.getContext(UMB_NOTIFICATION_CONTEXT); // TODO: Get rid of the save notification. @@ -261,7 +261,7 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase Date: Tue, 10 Dec 2024 10:06:35 +0100 Subject: [PATCH 26/68] use public methods --- .../documents/workspace/document-workspace.context.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index 60889848fb9b..00e63edc2725 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -227,8 +227,8 @@ export class UmbDocumentWorkspaceContext culture = selected[0]; const variantIds = [UmbVariantId.FromString(culture)]; const saveData = await this._data.constructData(variantIds); - await this._runMandatoryValidationForSaveData(saveData); - await this._performCreateOrUpdate(variantIds, saveData); + await this.runMandatoryValidationForSaveData(saveData); + await this.performCreateOrUpdate(variantIds, saveData); } // Tell the server that we're entering preview mode. From c2b25b6b6e7c966721936ac00f6d499bfa0f803e Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 10:13:49 +0100 Subject: [PATCH 27/68] call publishing context methods --- .../workspace/document-workspace.context.ts | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index 00e63edc2725..5268c8614ac9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -12,7 +12,7 @@ import { UMB_EDIT_DOCUMENT_WORKSPACE_PATH_PATTERN, } from '../constants.js'; import { UmbDocumentPreviewRepository } from '../repository/preview/index.js'; -import { UmbDocumentPublishingRepository } from '../publishing/index.js'; +import { UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT, UmbDocumentPublishingRepository } from '../publishing/index.js'; import { UmbDocumentValidationRepository } from '../repository/validation/index.js'; import { UMB_DOCUMENT_DETAIL_MODEL_VARIANT_SCAFFOLD, UMB_DOCUMENT_WORKSPACE_ALIAS } from './constants.js'; import type { UmbEntityModel } from '@umbraco-cms/backoffice/entity'; @@ -64,6 +64,7 @@ export class UmbDocumentWorkspaceContext readonly templateId = this._data.createObservablePartOfCurrent((data) => data?.template?.unique || null); #isTrashedContext = new UmbIsTrashedEntityContext(this); + #publishingContext?: typeof UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT.TYPE; constructor(host: UmbControllerHost) { super(host, { @@ -79,6 +80,11 @@ export class UmbDocumentWorkspaceContext this.observe(this.contentTypeUnique, (unique) => this.structure.loadType(unique), null); + // TODO: Remove this in v17 as we have moved the publishing methods to the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT. + this.consumeContext(UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT, (context) => { + this.#publishingContext = context; + }); + this.routes.setRoutes([ { path: UMB_CREATE_FROM_BLUEPRINT_DOCUMENT_WORKSPACE_PATH_PATTERN.toString(), @@ -259,7 +265,8 @@ export class UmbDocumentWorkspaceContext * @deprecated Will be removed in v17. Use the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead. */ public async saveAndPublish(): Promise { - alert('WRONG METHOD'); + if (!this.#publishingContext) throw new Error('Publishing context is missing'); + this.#publishingContext.saveAndPublish(); } /** @@ -267,7 +274,8 @@ export class UmbDocumentWorkspaceContext * @deprecated Will be removed in v17. Use the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead. */ public async schedule() { - alert('WRONG METHOD'); + if (!this.#publishingContext) throw new Error('Publishing context is missing'); + this.#publishingContext.schedule(); } /** @@ -275,7 +283,8 @@ export class UmbDocumentWorkspaceContext * @deprecated Will be removed in v17. Use the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead. */ public async unpublish() { - alert('WRONG METHOD'); + if (!this.#publishingContext) throw new Error('Publishing context is missing'); + this.#publishingContext.unpublish(); } /** @@ -283,7 +292,8 @@ export class UmbDocumentWorkspaceContext * @deprecated Will be removed in v17. Use the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead. */ public async publishWithDescendants() { - alert('WRONG METHOD'); + if (!this.#publishingContext) throw new Error('Publishing context is missing'); + this.#publishingContext.publishWithDescendants(); } public createPropertyDatasetContext( From a5e546669700d733856f49bd3e8d39355dea4fea Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 10:17:38 +0100 Subject: [PATCH 28/68] fix import --- .../document-publish-with-descendants-modal.element.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/document-publish-with-descendants-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/document-publish-with-descendants-modal.element.ts index ada41bb6340b..032ac944e523 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/document-publish-with-descendants-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/modal/document-publish-with-descendants-modal.element.ts @@ -1,3 +1,5 @@ +import { UmbDocumentVariantState, type UmbDocumentVariantOptionModel } from '../../../types.js'; +import { isNotPublishedMandatory } from '../../utils.js'; import type { UmbDocumentPublishWithDescendantsModalData, UmbDocumentPublishWithDescendantsModalValue, @@ -6,10 +8,8 @@ import { css, customElement, html, state } from '@umbraco-cms/backoffice/externa import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; -import { UmbDocumentVariantState, type UmbDocumentVariantOptionModel } from '../../../types.js'; -import { isNotPublishedMandatory } from '../../utils.js'; -import '../shared/document-variant-language-picker.element.js'; +import '../../../modals/shared/document-variant-language-picker.element.js'; @customElement('umb-document-publish-with-descendants-modal') export class UmbDocumentPublishWithDescendantsModalElement extends UmbModalBaseElement< From da3977158bd4775be29b003ae0cf73db6d35ede0 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 10:19:28 +0100 Subject: [PATCH 29/68] move manager into folder --- .../publishing/document-publishing.workspace-context.ts | 2 +- .../document-published-pending-changes.manager.ts | 0 .../documents/documents/publishing/pending-changes/index.ts | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/{ => pending-changes}/document-published-pending-changes.manager.ts (100%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts index 0084f231de37..dd189bdeacb0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts @@ -5,7 +5,7 @@ import type { UmbDocumentVariantPublishModel, } from '../types.js'; import { UmbDocumentPublishingRepository } from './repository/index.js'; -import { UmbDocumentPublishedPendingChangesManager } from './document-published-pending-changes.manager.js'; +import { UmbDocumentPublishedPendingChangesManager } from './pending-changes/index.js'; import { UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT } from './document-publishing.workspace-context.token.js'; import { UMB_DOCUMENT_SCHEDULE_MODAL } from './schedule-publish/constants.js'; import { UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL } from './publish-with-descendants/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-published-pending-changes.manager.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-published-pending-changes.manager.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/index.ts new file mode 100644 index 000000000000..56fa2950d148 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/index.ts @@ -0,0 +1 @@ +export * from './document-published-pending-changes.manager.js'; From 7dbd93ff391e8d04c9a7e6fd43f0888ee8b9687a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 10:26:09 +0100 Subject: [PATCH 30/68] organise in folders --- .../documents/publishing/constants.ts | 3 ++- .../documents/documents/publishing/index.ts | 3 +-- .../documents/publishing/manifests.ts | 18 +++------------- .../documents/documents/publishing/types.ts | 3 ++- .../publishing/workspace-context/constants.ts | 1 + ...ment-publishing.workspace-context.token.ts | 0 .../document-publishing.workspace-context.ts | 21 ++++++++++--------- .../publishing/workspace-context/manifests.ts | 17 +++++++++++++++ .../publishing/workspace-context/types.ts | 1 + 9 files changed, 38 insertions(+), 29 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/constants.ts rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/{ => workspace-context}/document-publishing.workspace-context.token.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/{ => workspace-context}/document-publishing.workspace-context.ts (93%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts index d7349eb8b83d..bf9ca11c4967 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/constants.ts @@ -1,5 +1,6 @@ +export * from './publish-with-descendants/constants.js'; export * from './publish/constants.js'; export * from './repository/constants.js'; export * from './schedule-publish/constants.js'; export * from './unpublish/constants.js'; -export * from './publish-with-descendants/constants.js'; +export * from './workspace-context/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts index 74ad1f4716df..aa2c6df15201 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/index.ts @@ -1,5 +1,4 @@ export * from './repository/index.js'; -export * from './document-publishing.workspace-context.token.js'; - export * from './constants.js'; + export type * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts index 67072dda89f1..3d67592fff1d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/manifests.ts @@ -1,27 +1,15 @@ -import { UMB_DOCUMENT_WORKSPACE_ALIAS } from '../workspace/constants.js'; import { manifests as publishManifest } from './publish/manifests.js'; +import { manifests as publishWithDescendantsManifest } from './publish-with-descendants/manifests.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; import { manifests as schedulePublishManifests } from './schedule-publish/manifests.js'; import { manifests as unpublishManifests } from './unpublish/manifests.js'; -import { manifests as publishWithDescendantsManifest } from './publish-with-descendants/manifests.js'; -import { UMB_WORKSPACE_CONDITION_ALIAS } from '@umbraco-cms/backoffice/workspace'; +import { manifests as workspaceContextManifests } from './workspace-context/manifests.js'; export const manifests: Array = [ - { - type: 'workspaceContext', - name: 'Document Publishing Workspace Context', - alias: 'Umb.WorkspaceContext.Document.Publishing', - api: () => import('./document-publishing.workspace-context.js'), - conditions: [ - { - alias: UMB_WORKSPACE_CONDITION_ALIAS, - match: UMB_DOCUMENT_WORKSPACE_ALIAS, - }, - ], - }, ...publishManifest, ...publishWithDescendantsManifest, ...repositoryManifests, ...schedulePublishManifests, ...unpublishManifests, + ...workspaceContextManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts index a9bc738b552b..895cefd24991 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/types.ts @@ -1,4 +1,5 @@ +export type * from './publish-with-descendants/types.js'; export type * from './publish/types.js'; export type * from './schedule-publish/types.js'; export type * from './unpublish/types.js'; -export type * from './publish-with-descendants/types.js'; +export type * from './workspace-context/types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/constants.ts new file mode 100644 index 000000000000..fe7ae40fcab1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/constants.ts @@ -0,0 +1 @@ +export * from './document-publishing.workspace-context.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.token.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.token.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts similarity index 93% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts index dd189bdeacb0..54aa67c9a45b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts @@ -1,16 +1,16 @@ -import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../workspace/document-workspace.context-token.js'; +import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../workspace/document-workspace.context-token.js'; import type { UmbDocumentDetailModel, UmbDocumentVariantOptionModel, UmbDocumentVariantPublishModel, -} from '../types.js'; -import { UmbDocumentPublishingRepository } from './repository/index.js'; -import { UmbDocumentPublishedPendingChangesManager } from './pending-changes/index.js'; +} from '../../types.js'; +import { UmbDocumentPublishingRepository } from '../repository/index.js'; +import { UmbDocumentPublishedPendingChangesManager } from '../pending-changes/index.js'; +import { UMB_DOCUMENT_SCHEDULE_MODAL } from '../schedule-publish/constants.js'; +import { UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL } from '../publish-with-descendants/constants.js'; +import { UMB_DOCUMENT_PUBLISH_MODAL } from '../publish/constants.js'; +import { UmbUnpublishDocumentEntityAction } from '../unpublish/index.js'; import { UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT } from './document-publishing.workspace-context.token.js'; -import { UMB_DOCUMENT_SCHEDULE_MODAL } from './schedule-publish/constants.js'; -import { UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL } from './publish-with-descendants/constants.js'; -import { UMB_DOCUMENT_PUBLISH_MODAL } from './publish/constants.js'; -import { UmbUnpublishDocumentEntityAction } from './unpublish/index.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; @@ -227,7 +227,6 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase UmbVariantId.Create(activeVariant)); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/manifests.ts new file mode 100644 index 000000000000..2dc258192b5d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/manifests.ts @@ -0,0 +1,17 @@ +import { UMB_DOCUMENT_WORKSPACE_ALIAS } from '../../workspace/constants.js'; +import { UMB_WORKSPACE_CONDITION_ALIAS } from '@umbraco-cms/backoffice/workspace'; + +export const manifests: Array = [ + { + type: 'workspaceContext', + name: 'Document Publishing Workspace Context', + alias: 'Umb.WorkspaceContext.Document.Publishing', + api: () => import('./document-publishing.workspace-context.js'), + conditions: [ + { + alias: UMB_WORKSPACE_CONDITION_ALIAS, + match: UMB_DOCUMENT_WORKSPACE_ALIAS, + }, + ], + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/types.ts new file mode 100644 index 000000000000..ec3287a56802 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/types.ts @@ -0,0 +1 @@ +export type * from './document-publishing.workspace-context.js'; From 875fd9b36202f6665369104a641a76784c80e2ef Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 11:09:07 +0100 Subject: [PATCH 31/68] add get method to get variants with changes --- .../document-published-pending-changes.manager.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts index 2949363a93c1..46cd098e2aee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts @@ -1,4 +1,4 @@ -import type { UmbDocumentDetailModel } from '../types.js'; +import type { UmbDocumentDetailModel } from '../../types.js'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import { UmbMergeContentVariantDataController } from '@umbraco-cms/backoffice/content'; @@ -9,12 +9,12 @@ interface UmbDocumentPublishedPendingChangesManagerProcessArgs { publishedData: UmbDocumentDetailModel; } -interface UmbVariantWithChanges { +interface UmbPublishedVariantWithPendingChanges { variantId: UmbVariantId; } export class UmbDocumentPublishedPendingChangesManager extends UmbControllerBase { - #variantsWithChanges = new UmbArrayState([], (x) => x.variantId.toString()); + #variantsWithChanges = new UmbArrayState([], (x) => x.variantId.toString()); public readonly variantsWithChanges = this.#variantsWithChanges.asObservable(); /** @@ -50,4 +50,13 @@ export class UmbDocumentPublishedPendingChangesManager extends UmbControllerBase this.#variantsWithChanges.setValue(variantsWithPendingChanges); } + + /** + * Gets the variants with changes. + * @returns {Array} {Array} + * @memberof UmbDocumentPublishedPendingChangesManager + */ + getVariantsWithChanges(): Array { + return this.#variantsWithChanges.getValue(); + } } From eb071105cf74e48b2f4e097efcc39edcb0952b5d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 11:10:53 +0100 Subject: [PATCH 32/68] preselect variants with pending changes --- .../document-publishing.workspace-context.ts | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts index 54aa67c9a45b..86d4f3366f82 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts @@ -24,6 +24,10 @@ import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { + /** + * Manages the pending changes for the published document. + * @memberof UmbDocumentPublishingWorkspaceContext + */ public readonly publishedPendingChanges = new UmbDocumentPublishedPendingChangesManager(this); #init: Promise; @@ -290,21 +294,15 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase UmbVariantId.Create(activeVariant)); - //const changedVariantIds = this._data.getChangedVariants(); - //const selectedVariantIds = activeVariantIds.concat(changedVariantIds); + const variantsWithPendingChanges = this.publishedPendingChanges.getVariantsWithChanges(); + let selected = variantsWithPendingChanges.map((x) => x.variantId.toString()); // Selected can contain entries that are not part of the options, therefor the modal filters selection based on options. - /* - const readOnlyCultures = this.readOnlyState.getStates().map((s) => s.variantId.culture); - let selected = selectedVariantIds.map((x) => x.toString()).filter((v, i, a) => a.indexOf(v) === i); - selected = selected.filter((x) => readOnlyCultures.includes(x) === false); - */ + selected = selected.filter((x) => options.some((o) => o.unique === x)); - const selected: Array = []; + // Filter out read-only variants + const readOnlyCultures = this.#documentWorkspaceContext.readOnlyState.getStates().map((s) => s.variantId.culture); + selected = selected.filter((x) => readOnlyCultures.includes(x) === false); return { options, From 7e731dcb404e644caa1eb138f7c585e8cfcf103a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 12:10:55 +0100 Subject: [PATCH 33/68] observe data changes --- .../document-publishing.workspace-context.ts | 52 ++++++++++++------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts index 86d4f3366f82..736dc1f2b5a0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts @@ -22,6 +22,7 @@ import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; +import { observeMultiple } from '@umbraco-cms/backoffice/observable-api'; export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { /** @@ -33,6 +34,7 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase; #documentWorkspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; #publishingRepository = new UmbDocumentPublishingRepository(this); + #publishedDocumentData?: UmbDocumentDetailModel; constructor(host: UmbControllerHost) { super(host, UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT); @@ -40,24 +42,7 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { this.#documentWorkspaceContext = context; - - // No need to check pending changes for new documents - if (context.getIsNew()) { - return; - } - - this.observe(context.unique, async (unique) => { - if (unique) { - const { data: publishedData } = await this.#publishingRepository.published(unique); - const currentData = context.getData(); - - if (!currentData || !publishedData) { - return; - } - - this.publishedPendingChanges.process({ currentData, publishedData }); - } - }); + this.#initPendingChanges(); }).asPromise(), ]); } @@ -309,6 +294,37 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { + if (!variants || !values) return; + + const currentData = this.#documentWorkspaceContext!.getData(); + const publishedData = this.#publishedDocumentData; + if (!currentData || !publishedData) return; + + this.publishedPendingChanges.process({ currentData, publishedData }); + }, + ); + } } export { UmbDocumentPublishingWorkspaceContext as api }; From 1991609a8b662b97fd53165b013d4d08fb6b0e6e Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 12:38:57 +0100 Subject: [PATCH 34/68] render pending changes client state --- ...ace-split-view-variant-selector.element.ts | 2 +- .../document-workspace-view-info.element.ts | 42 ++++++++++++++----- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts index cc984d5e3c53..2ce6b6b5d232 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts @@ -33,7 +33,7 @@ export class UmbDocumentWorkspaceSplitViewVariantSelectorElement extends UmbWork }); } - async #observePendingChanges() { + #observePendingChanges() { this.observe( this.#documentPublishingWorkspaceContext?.publishedPendingChanges.variantsWithChanges, (variants) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info.element.ts index 33e90e5cb99a..3f5b381e45dc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info.element.ts @@ -1,5 +1,6 @@ import { UMB_DOCUMENT_PROPERTY_DATASET_CONTEXT, UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../../constants.js'; -import type { UmbDocumentVariantModel } from '../../../types.js'; +import type { UmbDocumentVariantModel, UmbDocumentVariantOptionModel } from '../../../types.js'; +import { UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT } from '../../../publishing/index.js'; import { TimeOptions } from './utils.js'; import { css, customElement, html, ifDefined, nothing, state } from '@umbraco-cms/backoffice/external/lit'; import { DocumentVariantStateModel } from '@umbraco-cms/backoffice/external/backend-api'; @@ -44,9 +45,12 @@ export class UmbDocumentWorkspaceViewInfoElement extends UmbLitElement { @state() private _variant?: UmbDocumentVariantModel; - #workspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; + @state() + private _variantsWithPendingChanges: Array = []; + #workspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; #templateRepository = new UmbTemplateItemRepository(this); + #documentPublishingWorkspaceContext?: typeof UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT.TYPE; @state() private _routeBuilder?: UmbModalRouteBuilder; @@ -74,6 +78,11 @@ export class UmbDocumentWorkspaceViewInfoElement extends UmbLitElement { this._variant = currentVariant; }); }); + + this.consumeContext(UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT, (instance) => { + this.#documentPublishingWorkspaceContext = instance; + this.#observePendingChanges(); + }); } #observeContent() { @@ -111,6 +120,20 @@ export class UmbDocumentWorkspaceViewInfoElement extends UmbLitElement { ); } + #observePendingChanges() { + this.observe( + this.#documentPublishingWorkspaceContext?.publishedPendingChanges.variantsWithChanges, + (variants) => { + this._variantsWithPendingChanges = variants || []; + }, + '_observePendingChanges', + ); + } + + #hasPendingChanges(variant: UmbDocumentVariantModel) { + return this._variantsWithPendingChanges.some((x) => x.variantId.compare(variant)); + } + #renderStateTag() { switch (this._variant?.state) { case DocumentVariantStateModel.DRAFT: @@ -119,18 +142,17 @@ export class UmbDocumentWorkspaceViewInfoElement extends UmbLitElement { ${this.localize.term('content_unpublished')} `; + // TODO: The pending changes state can be removed once the management Api removes this state + // We should also make our own state model for this case DocumentVariantStateModel.PUBLISHED: + case DocumentVariantStateModel.PUBLISHED_PENDING_CHANGES: { + const term = this.#hasPendingChanges(this._variant) ? 'content_publishedPendingChanges' : 'content_published'; return html` - - ${this.localize.term('content_published')} - - `; - case DocumentVariantStateModel.PUBLISHED_PENDING_CHANGES: - return html` - - ${this.localize.term('content_publishedPendingChanges')} + + ${this.localize.term(term)} `; + } default: return html` From 95d86491e3a72f5f5731ebc6753694f97b9c1dce Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 12:39:04 +0100 Subject: [PATCH 35/68] observe unique --- .../document-publishing.workspace-context.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts index 736dc1f2b5a0..43fad68744d5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts @@ -260,8 +260,6 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { + if (!unique) return; + const { data } = await this.#publishingRepository.published(unique); + this.#publishedDocumentData = data; + this.#observeDocumentDataChanges(); + }, + 'umbUniqueObserver', + ); } #observeDocumentDataChanges() { From 622255a17589c3379d49ecaa97efd96d284fda45 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 12:45:25 +0100 Subject: [PATCH 36/68] Update document-publishing.server.data-source.ts --- .../repository/document-publishing.server.data-source.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.ts index 5e34a786bebe..9c8d088d7f8c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.ts @@ -113,8 +113,8 @@ export class UmbDocumentPublishingServerDataSource { } /** - * Get a published Document by its unique identifier - * @param {string} unique - Document unique identifier + * Get the published Document by its unique + * @param {string} unique - Document unique * @returns {Promise>} Published document * @memberof UmbDocumentPublishingServerDataSource */ From fc309f68581c3853e332bbf9c991ef3b26382ff4 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 14:00:10 +0100 Subject: [PATCH 37/68] use correct key --- .../document-workspace-split-view-variant-selector.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts index 2ce6b6b5d232..ed7c00d56a54 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts @@ -21,7 +21,7 @@ export class UmbDocumentWorkspaceSplitViewVariantSelectorElement extends UmbWork // TODO: The pending changes state can be removed once the management Api removes this state // We only keep it here to make typescript happy // We should also make our own state model for this - [DocumentVariantStateModel.PUBLISHED_PENDING_CHANGES]: 'content_publishedPending', + [DocumentVariantStateModel.PUBLISHED_PENDING_CHANGES]: 'content_publishedPendingChanges', [DocumentVariantStateModel.NOT_CREATED]: 'content_notCreated', }; From 318dc1ded5b854c85849d9852e27c4fc1b10a8d6 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 14:13:31 +0100 Subject: [PATCH 38/68] clean up --- .../document-publishing.workspace-context.ts | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts index 43fad68744d5..95cca7512732 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts @@ -296,13 +296,14 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { if (!unique) return; + + // No need to check pending changes for new documents + if (this.#documentWorkspaceContext!.getIsNew()) return; + const { data } = await this.#publishingRepository.published(unique); this.#publishedDocumentData = data; this.#observeDocumentDataChanges(); @@ -318,15 +319,20 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { if (!variants || !values) return; - - const currentData = this.#documentWorkspaceContext!.getData(); - const publishedData = this.#publishedDocumentData; - if (!currentData || !publishedData) return; - - this.publishedPendingChanges.process({ currentData, publishedData }); + this.#processPendingChanges(); }, ); } + + #processPendingChanges() { + if (!this.#documentWorkspaceContext) throw new Error('Document workspace context is missing'); + + const currentData = this.#documentWorkspaceContext.getData(); + const publishedData = this.#publishedDocumentData; + if (!currentData || !publishedData) return; + + this.publishedPendingChanges.process({ currentData, publishedData }); + } } export { UmbDocumentPublishingWorkspaceContext as api }; From e1d93b848d9dfbaf0c23e8aa102d4464d650dc60 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 15:04:58 +0100 Subject: [PATCH 39/68] expose persisted data --- .../entity-detail/entity-detail-workspace-base.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts index 02198025a8d3..f5a23e87e444 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts @@ -85,6 +85,14 @@ export abstract class UmbEntityDetailWorkspaceContextBase< return this._data.getCurrent(); } + /** + * Get the persisted data + * @returns { DetailModelType | undefined } The persisted data + */ + public getPersistedData(): DetailModelType | undefined { + return this._data.getPersisted(); + } + /** * Get the unique * @returns { string | undefined } The unique identifier From 4b09170d042b38062604be5d3fc9cd80a8406e31 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 15:05:08 +0100 Subject: [PATCH 40/68] rename arg --- .../document-published-pending-changes.manager.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts index 46cd098e2aee..cf83aa136fa6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts @@ -5,7 +5,7 @@ import { UmbMergeContentVariantDataController } from '@umbraco-cms/backoffice/co import { jsonStringComparison, UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; interface UmbDocumentPublishedPendingChangesManagerProcessArgs { - currentData: UmbDocumentDetailModel; + persistedData: UmbDocumentDetailModel; publishedData: UmbDocumentDetailModel; } @@ -26,15 +26,15 @@ export class UmbDocumentPublishedPendingChangesManager extends UmbControllerBase * @memberof UmbPublishedPendingChangesManager */ async process(args: UmbDocumentPublishedPendingChangesManagerProcessArgs): Promise { - if (!args.currentData) throw new Error('Current Data is missing'); + if (!args.persistedData) throw new Error('Current Data is missing'); if (!args.publishedData) throw new Error('Published Data is missing'); - const variantIds = args.currentData.variants?.map((x) => UmbVariantId.Create(x)) ?? []; + const variantIds = args.persistedData.variants?.map((x) => UmbVariantId.Create(x)) ?? []; const pendingChangesPromises = variantIds.map(async (variantId) => { const mergedData = await new UmbMergeContentVariantDataController(this).process( args.publishedData, - args.currentData, + args.persistedData, [variantId], [variantId], ); From 011dceb30a16a8206696a529e4a85a45b7770063 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 15:05:28 +0100 Subject: [PATCH 41/68] use persisted data instead of current --- .../document-publishing.workspace-context.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts index 95cca7512732..3f821008e7f3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts @@ -306,12 +306,13 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase Date: Tue, 10 Dec 2024 18:17:06 +0100 Subject: [PATCH 42/68] add reload method --- .../entity-detail/entity-detail-workspace-base.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts index f5a23e87e444..af709d3b1ef5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts @@ -155,6 +155,21 @@ export abstract class UmbEntityDetailWorkspaceContextBase< return response; } + /** + * Reload the workspace data + * @returns { Promise } The promise of the reload + */ + public async reload(): Promise { + const unique = this.getUnique(); + if (!unique) throw new Error('Unique is not set'); + const { data } = await this._detailRepository!.requestByUnique(unique); + + if (data) { + this._data.setPersisted(data); + this._data.setCurrent(data); + } + } + /** * Method to check if the workspace data is loaded. * @returns { Promise | undefined } true if the workspace data is loaded. From ffcba322e4e69b671c0c478eaf7e0ba7e35d889d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 18:17:24 +0100 Subject: [PATCH 43/68] reload data after publish --- .../document-publishing.workspace-context.ts | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts index 3f821008e7f3..1371a7a0bab5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts @@ -257,6 +257,10 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { - if (!unique) return; - - // No need to check pending changes for new documents - if (this.#documentWorkspaceContext!.getIsNew()) return; - - const { data } = await this.#publishingRepository.published(unique); - this.#publishedDocumentData = data; - this.#processPendingChanges(); + observeMultiple([this.#documentWorkspaceContext.unique, this.#documentWorkspaceContext.isNew]), + ([unique, isNew]) => { + if (isNew === false && unique) { + this.#loadAndProcessLastPublished(); + } }, - 'umbUniqueObserver', + 'uniqueObserver', ); } - /* - #observeDocumentDataChanges() { + async #loadAndProcessLastPublished() { if (!this.#documentWorkspaceContext) throw new Error('Document workspace context is missing'); - this.observe( - observeMultiple([this.#documentWorkspaceContext.variants, this.#documentWorkspaceContext.values]), - async ([variants, values]) => { - if (!variants || !values) return; - this.#processPendingChanges(); - }, - ); + // No need to check pending changes for new documents + if (this.#documentWorkspaceContext.getIsNew()) return; + + const unique = this.#documentWorkspaceContext.getUnique(); + if (!unique) throw new Error('Unique is missing'); + + const { data } = await this.#publishingRepository.published(unique); + this.#publishedDocumentData = data; + this.#processPendingChanges(); } - */ #processPendingChanges() { if (!this.#documentWorkspaceContext) throw new Error('Document workspace context is missing'); From 78066c0b9ea79524e1208f083f1a1f05a8b96d6e Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 20:14:24 +0100 Subject: [PATCH 44/68] remove headline --- .../views/info/document-workspace-view-info.element.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info.element.ts index 3f5b381e45dc..a069b6b65217 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info.element.ts @@ -182,10 +182,7 @@ export class UmbDocumentWorkspaceViewInfoElement extends UmbLitElement { const editDocumentTypePath = this._routeBuilder?.({ entityType: 'document-type' }) ?? ''; return html` -
- Publication Status - ${this.#renderStateTag()} -
+
${this.#renderStateTag()}
${this.#renderCreateDate()}
From 66fd1ce638b9404883f5cac4832cd7587a2a5e2f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 20:28:06 +0100 Subject: [PATCH 45/68] handle all publish actions the same --- .../document-publishing.workspace-context.ts | 41 ++++++++++++------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts index 1371a7a0bab5..f7a224c41da9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts @@ -33,6 +33,7 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase; #documentWorkspaceContext?: typeof UMB_DOCUMENT_WORKSPACE_CONTEXT.TYPE; + #eventContext?: typeof UMB_ACTION_EVENT_CONTEXT.TYPE; #publishingRepository = new UmbDocumentPublishingRepository(this); #publishedDocumentData?: UmbDocumentDetailModel; @@ -44,6 +45,10 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { + this.#eventContext = context; + }).asPromise(), ]); } @@ -68,6 +73,9 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase Date: Tue, 10 Dec 2024 20:35:32 +0100 Subject: [PATCH 46/68] reset state as the first thing when creating + loading --- .../workspace/entity-detail/entity-detail-workspace-base.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts index af709d3b1ef5..096e0db7d19b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts @@ -130,10 +130,10 @@ export abstract class UmbEntityDetailWorkspaceContextBase< } async load(unique: string) { + this.resetState(); this.#entityContext.setUnique(unique); this.loading.addState({ unique: LOADING_STATE_UNIQUE, message: `Loading ${this.getEntityType()} Details` }); await this.#init; - this.resetState(); this._getDataPromise = this._detailRepository!.requestByUnique(unique); type GetDataType = Awaited['requestByUnique']>>; const response = (await this._getDataPromise) as GetDataType; @@ -189,9 +189,9 @@ export abstract class UmbEntityDetailWorkspaceContextBase< * @returns { Promise | undefined } The data of the scaffold. */ public async createScaffold(args: CreateArgsType) { + this.resetState(); this.loading.addState({ unique: LOADING_STATE_UNIQUE, message: `Creating ${this.getEntityType()} scaffold` }); await this.#init; - this.resetState(); this.setParent(args.parent); const request = this._detailRepository!.createScaffold(args.preset); From bf1e359898eb9d34d70637c676e545f1b159fa38 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 20:35:46 +0100 Subject: [PATCH 47/68] add method to get variants --- .../core/content/workspace/content-detail-workspace-base.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts index 93cc6ef13e24..990e3deca1b1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts @@ -332,6 +332,10 @@ export abstract class UmbContentDetailWorkspaceContextBase< return this._data.getCurrent()?.variants?.find((x) => variantId.compare(x)); } + public getVariants(): Array | undefined { + return this._data.getCurrent()?.variants; + } + /** * Observe the property type * @param {string} propertyId - The id of the property From f84f2a3400bf825b7c4907c6ec4795e391971124 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 10 Dec 2024 20:36:16 +0100 Subject: [PATCH 48/68] only load published if document has a published variant --- .../document-publishing.workspace-context.ts | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts index f7a224c41da9..ba4d19d1614c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts @@ -23,6 +23,7 @@ import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; import { observeMultiple } from '@umbraco-cms/backoffice/observable-api'; +import { DocumentVariantStateModel } from '@umbraco-cms/backoffice/external/backend-api'; export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { /** @@ -311,9 +312,13 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { - if (isNew === false && unique) { + observeMultiple([ + this.#documentWorkspaceContext.unique, + this.#documentWorkspaceContext.isNew, + this.#documentWorkspaceContext.variants, + ]), + ([unique, isNew, variants]) => { + if (isNew === false && unique && variants.length > 0) { this.#loadAndProcessLastPublished(); } }, @@ -321,6 +326,17 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase + variant.state === DocumentVariantStateModel.PUBLISHED || + variant.state === DocumentVariantStateModel.PUBLISHED_PENDING_CHANGES, + ) ?? false + ); + } + async #loadAndProcessLastPublished() { if (!this.#documentWorkspaceContext) throw new Error('Document workspace context is missing'); @@ -330,6 +346,10 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase Date: Wed, 11 Dec 2024 08:13:01 +0100 Subject: [PATCH 49/68] remove variants from observer --- .../document-publishing.workspace-context.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts index ba4d19d1614c..17e6e58e2db9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts @@ -312,13 +312,9 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { - if (isNew === false && unique && variants.length > 0) { + observeMultiple([this.#documentWorkspaceContext.unique, this.#documentWorkspaceContext.isNew]), + ([unique, isNew]) => { + if (isNew === false && unique) { this.#loadAndProcessLastPublished(); } }, From 6ca3c79d07adb41f4a22f681e286d234f3ec7dd8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 11 Dec 2024 09:09:24 +0100 Subject: [PATCH 50/68] add public method to get the changed variants --- .../content-detail-workspace-base.ts | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts index 990e3deca1b1..7dc5c36f701e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts @@ -63,6 +63,20 @@ export interface UmbContentDetailWorkspaceContextArgs< saveModalToken?: UmbModalToken, UmbContentVariantPickerValue>; } +/** + * The base class for a content detail workspace context. + * @exports + * @abstract + * @class UmbContentDetailWorkspaceContextBase + * @augments {UmbEntityDetailWorkspaceContextBase} + * @implements {UmbContentWorkspaceContext} + * @template DetailModelType + * @template DetailRepositoryType + * @template ContentTypeDetailModelType + * @template VariantModelType + * @template VariantOptionModelType + * @template CreateArgsType + */ export abstract class UmbContentDetailWorkspaceContextBase< DetailModelType extends UmbContentDetailModel, DetailRepositoryType extends UmbDetailRepository = UmbDetailRepository, @@ -444,6 +458,15 @@ export abstract class UmbContentDetailWorkspaceContextBase< this._data.finishPropertyValueChange(); }; + /** + * Gets the changed variant ids + * @returns {Array} - The changed variant ids + * @memberof UmbContentDetailWorkspaceContextBase + */ + public getChangedVariants(): Array { + return this._data.getChangedVariants(); + } + protected async _determineVariantOptions(): Promise<{ options: VariantOptionModelType[]; selected: string[]; From 0098218768f112be8dd3388efbba648545b9a06b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 11 Dec 2024 09:13:20 +0100 Subject: [PATCH 51/68] align preselection with current logic --- .../document-publishing.workspace-context.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts index 17e6e58e2db9..94f9e8b0381e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts @@ -293,8 +293,10 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase x.variantId.toString()); + + // TODO: this is a temporary copy of the content-detail workspace context method. + // we need to implement custom selection that makes sense for each the publishing modal. + let selected = this.#getChangedVariantsSelection(); // Selected can contain entries that are not part of the options, therefor the modal filters selection based on options. selected = selected.filter((x) => options.some((o) => o.unique === x)); @@ -309,6 +311,17 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase UmbVariantId.Create(activeVariant)) + .map((x) => x.toString()); + const changedVariants = this.#documentWorkspaceContext.getChangedVariants().map((x) => x.toString()); + const selection = [...activeVariants, ...changedVariants]; + return [...new Set(selection)]; + } + async #initPendingChanges() { if (!this.#documentWorkspaceContext) throw new Error('Document workspace context is missing'); this.observe( From a178a6b481d61b39bcbe1c44afc58483ed6bc76a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 11 Dec 2024 09:51:24 +0100 Subject: [PATCH 52/68] add deprecation util --- .../core/utils/deprecation/deprecation.ts | 29 +++++++++++++++++++ .../packages/core/utils/deprecation/index.ts | 3 ++ .../packages/core/utils/deprecation/types.ts | 5 ++++ .../src/packages/core/utils/index.ts | 1 + 4 files changed, 38 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/utils/deprecation/deprecation.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/utils/deprecation/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/utils/deprecation/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/deprecation/deprecation.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/deprecation/deprecation.ts new file mode 100644 index 000000000000..5c799a3a4257 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/deprecation/deprecation.ts @@ -0,0 +1,29 @@ +import type { UmbDeprecationArgs } from './types.js'; + +/** + * Helper class for deprecation warnings. + * @exports + * @class UmbDeprecation + */ +export class UmbDeprecation { + #messagePrefix: string = 'Umbraco Backoffice:'; + #deprecated: string; + #removeInVersion: string; + #solution: string; + + constructor(args: UmbDeprecationArgs) { + this.#deprecated = args.deprecated; + this.#removeInVersion = args.removeInVersion; + this.#solution = args.solution; + } + + /** + * Logs a warning message to the console. + * @memberof UmbDeprecation + */ + warn() { + console.warn( + `${this.#messagePrefix} ${this.#deprecated} The feature will be removed in version ${this.#removeInVersion}. ${this.#solution}`, + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/deprecation/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/deprecation/index.ts new file mode 100644 index 000000000000..d7fa69c17143 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/deprecation/index.ts @@ -0,0 +1,3 @@ +export * from './deprecation.js'; + +export type * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/deprecation/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/deprecation/types.ts new file mode 100644 index 000000000000..008aa5cd3b94 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/deprecation/types.ts @@ -0,0 +1,5 @@ +export interface UmbDeprecationArgs { + deprecated: string; + removeInVersion: string; + solution: string; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts index 078596afd77e..99441ca9968b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/index.ts @@ -23,4 +23,5 @@ export * from './sanitize/sanitize-html.function.js'; export * from './selection-manager/selection.manager.js'; export * from './state-manager/index.js'; export * from './string/index.js'; +export * from './deprecation/index.js'; export type * from './type/index.js'; From f721aeaed708cc85b104ad8baced9f7efd1f293c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 11 Dec 2024 09:58:28 +0100 Subject: [PATCH 53/68] add method deprecation warnings --- ...publishable-workspace-context.interface.ts | 1 - .../workspace/document-workspace.context.ts | 21 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace-context.interface.ts index 1d0229402fdc..a2a327bf2418 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace-context.interface.ts @@ -2,6 +2,5 @@ import type { UmbSubmittableWorkspaceContext } from './submittable-workspace-con export interface UmbPublishableWorkspaceContext extends UmbSubmittableWorkspaceContext { saveAndPublish(): Promise; - publish(): Promise; unpublish(): Promise; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index 5268c8614ac9..e23afa8ccf8a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -32,6 +32,7 @@ import { import type { UmbDocumentTypeDetailModel } from '@umbraco-cms/backoffice/document-type'; import { UmbIsTrashedEntityContext } from '@umbraco-cms/backoffice/recycle-bin'; import { UMB_APP_CONTEXT } from '@umbraco-cms/backoffice/app'; +import { UmbDeprecation } from '@umbraco-cms/backoffice/utils'; type ContentModel = UmbDocumentDetailModel; type ContentTypeModel = UmbDocumentTypeDetailModel; @@ -265,6 +266,11 @@ export class UmbDocumentWorkspaceContext * @deprecated Will be removed in v17. Use the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead. */ public async saveAndPublish(): Promise { + new UmbDeprecation({ + deprecated: 'The SaveAndPublish method on the UMB_DOCUMENT_WORKSPACE_CONTEXT is deprecated.', + removeInVersion: '17', + solution: 'Use the SaveAndPublish method on the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead.', + }).warn(); if (!this.#publishingContext) throw new Error('Publishing context is missing'); this.#publishingContext.saveAndPublish(); } @@ -274,6 +280,11 @@ export class UmbDocumentWorkspaceContext * @deprecated Will be removed in v17. Use the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead. */ public async schedule() { + new UmbDeprecation({ + deprecated: 'The Schedule method on the UMB_DOCUMENT_WORKSPACE_CONTEXT is deprecated.', + removeInVersion: '17', + solution: 'Use the Schedule method on the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead.', + }).warn(); if (!this.#publishingContext) throw new Error('Publishing context is missing'); this.#publishingContext.schedule(); } @@ -283,6 +294,11 @@ export class UmbDocumentWorkspaceContext * @deprecated Will be removed in v17. Use the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead. */ public async unpublish() { + new UmbDeprecation({ + deprecated: 'The Unpublish method on the UMB_DOCUMENT_WORKSPACE_CONTEXT is deprecated.', + removeInVersion: '17', + solution: 'Use the Unpublish method on the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead.', + }).warn(); if (!this.#publishingContext) throw new Error('Publishing context is missing'); this.#publishingContext.unpublish(); } @@ -292,6 +308,11 @@ export class UmbDocumentWorkspaceContext * @deprecated Will be removed in v17. Use the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead. */ public async publishWithDescendants() { + new UmbDeprecation({ + deprecated: 'The PublishWithDescendants method on the UMB_DOCUMENT_WORKSPACE_CONTEXT is deprecated.', + removeInVersion: '17', + solution: 'Use the PublishWithDescendants method on the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead.', + }).warn(); if (!this.#publishingContext) throw new Error('Publishing context is missing'); this.#publishingContext.publishWithDescendants(); } From f8bfb41ad423c712f9b81d145613e19523b9a199 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 11 Dec 2024 09:58:45 +0100 Subject: [PATCH 54/68] remove unused publish method --- .../documents/workspace/document-workspace.context.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index e23afa8ccf8a..0460446be519 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -254,13 +254,6 @@ export class UmbDocumentWorkspaceContext previewWindow?.focus(); } - /** - * @deprecated Will be removed in v17. - */ - public async publish() { - throw new Error('Method not implemented.'); - } - /** * Save the document and publish it. * @deprecated Will be removed in v17. Use the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead. From e77a0e31db5fbe9865a8593a073f73d8d1ad364f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 11 Dec 2024 10:15:48 +0100 Subject: [PATCH 55/68] move publishing workspace actions into publishing module --- .../publish-with-descendants/manifests.ts | 3 +- .../workspace-action/manifests.ts | 30 ++++++ .../publish-with-descendants.action.ts | 2 +- .../documents/publishing/publish/manifests.ts | 2 + .../publish/workspace-action/manifests.ts | 28 ++++++ .../save-and-publish.action.ts | 8 +- .../publishing/schedule-publish/manifests.ts | 3 +- .../workspace-action/manifests.ts | 30 ++++++ .../save-and-schedule.action.ts | 2 +- .../publishing/unpublish/manifests.ts | 2 + .../unpublish/workspace-action/manifests.ts | 27 ++++++ .../workspace-action}/unpublish.action.ts | 2 +- .../documents/workspace/manifests.ts | 94 +------------------ 13 files changed, 131 insertions(+), 102 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/workspace-action/manifests.ts rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{workspace/actions => publishing/publish-with-descendants/workspace-action}/publish-with-descendants.action.ts (79%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/workspace-action/manifests.ts rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{workspace/actions => publishing/publish/workspace-action}/save-and-publish.action.ts (81%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/workspace-action/manifests.ts rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{workspace/actions => publishing/schedule-publish/workspace-action}/save-and-schedule.action.ts (81%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/workspace-action/manifests.ts rename src/Umbraco.Web.UI.Client/src/packages/documents/documents/{workspace/actions => publishing/unpublish/workspace-action}/unpublish.action.ts (80%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/manifests.ts index fbe10d296426..107aa5246281 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/manifests.ts @@ -1,3 +1,4 @@ import { manifests as modalManifests } from './modal/manifests.js'; +import { manifests as workspaceActionManifests } from './workspace-action/manifests.js'; -export const manifests: Array = [...modalManifests]; +export const manifests: Array = [...modalManifests, ...workspaceActionManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/workspace-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/workspace-action/manifests.ts new file mode 100644 index 000000000000..4f60dd42104c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/workspace-action/manifests.ts @@ -0,0 +1,30 @@ +import { + UMB_USER_PERMISSION_DOCUMENT_PUBLISH, + UMB_USER_PERMISSION_DOCUMENT_UPDATE, +} from '../../../user-permissions/constants.js'; +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; + +export const manifests: Array = [ + { + type: 'workspaceActionMenuItem', + kind: 'default', + alias: 'Umb.Document.WorkspaceActionMenuItem.PublishWithDescendants', + name: 'Publish with descendants', + weight: 10, + api: () => import('./publish-with-descendants.action.js'), + forWorkspaceActions: 'Umb.WorkspaceAction.Document.SaveAndPublish', + meta: { + label: '#buttons_publishDescendants', + icon: 'icon-globe', + }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + allOf: [UMB_USER_PERMISSION_DOCUMENT_UPDATE, UMB_USER_PERMISSION_DOCUMENT_PUBLISH], + }, + { + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, + }, + ], + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/publish-with-descendants.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/workspace-action/publish-with-descendants.action.ts similarity index 79% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/publish-with-descendants.action.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/workspace-action/publish-with-descendants.action.ts index 45badee917c7..1166ebb61d7f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/publish-with-descendants.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/workspace-action/publish-with-descendants.action.ts @@ -1,4 +1,4 @@ -import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../document-workspace.context-token.js'; +import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../../workspace/document-workspace.context-token.js'; import { UmbWorkspaceActionBase } from '@umbraco-cms/backoffice/workspace'; export class UmbDocumentPublishWithDescendantsWorkspaceAction extends UmbWorkspaceActionBase { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/manifests.ts index 07f6b45e865e..5859e55b5533 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/manifests.ts @@ -1,9 +1,11 @@ import { manifests as entityActionManifests } from './entity-action/manifests.js'; import { manifests as entityBulkActionManifests } from './entity-bulk-action/manifests.js'; import { manifests as modalManifests } from './modal/manifests.js'; +import { manifests as workspaceActionManifests } from './workspace-action/manifests.js'; export const manifests: Array = [ ...entityActionManifests, ...entityBulkActionManifests, ...modalManifests, + ...workspaceActionManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/workspace-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/workspace-action/manifests.ts new file mode 100644 index 000000000000..63d88495d95a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/workspace-action/manifests.ts @@ -0,0 +1,28 @@ +import { UMB_DOCUMENT_WORKSPACE_ALIAS } from '../../../workspace/constants.js'; +import { UMB_WORKSPACE_CONDITION_ALIAS } from '@umbraco-cms/backoffice/workspace'; +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; + +export const manifests: Array = [ + { + type: 'workspaceAction', + kind: 'default', + alias: 'Umb.WorkspaceAction.Document.SaveAndPublish', + name: 'Save And Publish Document Workspace Action', + weight: 70, + api: () => import('./save-and-publish.action.js'), + meta: { + label: '#buttons_saveAndPublish', + look: 'primary', + color: 'positive', + }, + conditions: [ + { + alias: UMB_WORKSPACE_CONDITION_ALIAS, + match: UMB_DOCUMENT_WORKSPACE_ALIAS, + }, + { + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, + }, + ], + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-publish.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/workspace-action/save-and-publish.action.ts similarity index 81% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-publish.action.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/workspace-action/save-and-publish.action.ts index a040d57fbc70..cc79fb7fc1f6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-publish.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/workspace-action/save-and-publish.action.ts @@ -1,11 +1,11 @@ -import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../document-workspace.context-token.js'; +import { UmbDocumentUserPermissionCondition } from '../../../user-permissions/conditions/document-user-permission.condition.js'; import { UMB_USER_PERMISSION_DOCUMENT_PUBLISH, UMB_USER_PERMISSION_DOCUMENT_UPDATE, -} from '../../user-permissions/constants.js'; -import { UmbDocumentUserPermissionCondition } from '../../user-permissions/conditions/document-user-permission.condition.js'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +} from '../../../user-permissions/constants.js'; +import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../../workspace/constants.js'; import { UmbWorkspaceActionBase } from '@umbraco-cms/backoffice/workspace'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export class UmbDocumentSaveAndPublishWorkspaceAction extends UmbWorkspaceActionBase { constructor(host: UmbControllerHost, args: any) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/manifests.ts index fbe10d296426..107aa5246281 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/manifests.ts @@ -1,3 +1,4 @@ import { manifests as modalManifests } from './modal/manifests.js'; +import { manifests as workspaceActionManifests } from './workspace-action/manifests.js'; -export const manifests: Array = [...modalManifests]; +export const manifests: Array = [...modalManifests, ...workspaceActionManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/workspace-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/workspace-action/manifests.ts new file mode 100644 index 000000000000..d9697986cabe --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/workspace-action/manifests.ts @@ -0,0 +1,30 @@ +import { + UMB_USER_PERMISSION_DOCUMENT_PUBLISH, + UMB_USER_PERMISSION_DOCUMENT_UPDATE, +} from '../../../user-permissions/constants.js'; +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; + +export const manifests: Array = [ + { + type: 'workspaceActionMenuItem', + kind: 'default', + alias: 'Umb.Document.WorkspaceActionMenuItem.SchedulePublishing', + name: 'Schedule publishing', + weight: 20, + api: () => import('./save-and-schedule.action.js'), + forWorkspaceActions: 'Umb.WorkspaceAction.Document.SaveAndPublish', + meta: { + label: '#buttons_schedulePublish', + icon: 'icon-globe', + }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + allOf: [UMB_USER_PERMISSION_DOCUMENT_UPDATE, UMB_USER_PERMISSION_DOCUMENT_PUBLISH], + }, + { + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, + }, + ], + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-schedule.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/workspace-action/save-and-schedule.action.ts similarity index 81% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-schedule.action.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/workspace-action/save-and-schedule.action.ts index 7ce215746867..5e571d42d919 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-schedule.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/workspace-action/save-and-schedule.action.ts @@ -1,4 +1,4 @@ -import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../document-workspace.context-token.js'; +import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../../workspace/constants.js'; import { UmbWorkspaceActionBase } from '@umbraco-cms/backoffice/workspace'; export class UmbDocumentSaveAndScheduleWorkspaceAction extends UmbWorkspaceActionBase { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/manifests.ts index 07f6b45e865e..5859e55b5533 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/manifests.ts @@ -1,9 +1,11 @@ import { manifests as entityActionManifests } from './entity-action/manifests.js'; import { manifests as entityBulkActionManifests } from './entity-bulk-action/manifests.js'; import { manifests as modalManifests } from './modal/manifests.js'; +import { manifests as workspaceActionManifests } from './workspace-action/manifests.js'; export const manifests: Array = [ ...entityActionManifests, ...entityBulkActionManifests, ...modalManifests, + ...workspaceActionManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/workspace-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/workspace-action/manifests.ts new file mode 100644 index 000000000000..30e257a93ddc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/workspace-action/manifests.ts @@ -0,0 +1,27 @@ +import { UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH } from '../../../user-permissions/constants.js'; +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; + +export const manifests: Array = [ + { + type: 'workspaceActionMenuItem', + kind: 'default', + alias: 'Umb.Document.WorkspaceActionMenuItem.Unpublish', + name: 'Unpublish', + weight: 0, + api: () => import('./unpublish.action.js'), + forWorkspaceActions: 'Umb.WorkspaceAction.Document.SaveAndPublish', + meta: { + label: '#actions_unpublish', + icon: 'icon-globe', + }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + allOf: [UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH], + }, + { + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, + }, + ], + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/unpublish.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/workspace-action/unpublish.action.ts similarity index 80% rename from src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/unpublish.action.ts rename to src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/workspace-action/unpublish.action.ts index 021ee5611be4..830521256ebe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/unpublish.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/workspace-action/unpublish.action.ts @@ -1,4 +1,4 @@ -import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../document-workspace.context-token.js'; +import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../../workspace/constants.js'; import { UmbWorkspaceActionBase } from '@umbraco-cms/backoffice/workspace'; export class UmbDocumentUnpublishWorkspaceAction extends UmbWorkspaceActionBase { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts index a79c270056dc..4132437d96b3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts @@ -1,8 +1,3 @@ -import { - UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH, - UMB_USER_PERMISSION_DOCUMENT_UPDATE, - UMB_USER_PERMISSION_DOCUMENT_PUBLISH, -} from '../user-permissions/index.js'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; import { UMB_DOCUMENT_WORKSPACE_ALIAS } from './constants.js'; import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; @@ -79,28 +74,7 @@ export const manifests: Array = [ }, ], }, - { - type: 'workspaceAction', - kind: 'default', - alias: 'Umb.WorkspaceAction.Document.SaveAndPublish', - name: 'Save And Publish Document Workspace Action', - weight: 70, - api: () => import('./actions/save-and-publish.action.js'), - meta: { - label: '#buttons_saveAndPublish', - look: 'primary', - color: 'positive', - }, - conditions: [ - { - alias: UMB_WORKSPACE_CONDITION_ALIAS, - match: UMB_DOCUMENT_WORKSPACE_ALIAS, - }, - { - alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, - }, - ], - }, + { type: 'workspaceAction', kind: 'default', @@ -143,70 +117,4 @@ export const manifests: Array = [ }, ], }, - { - type: 'workspaceActionMenuItem', - kind: 'default', - alias: 'Umb.Document.WorkspaceActionMenuItem.Unpublish', - name: 'Unpublish', - weight: 0, - api: () => import('./actions/unpublish.action.js'), - forWorkspaceActions: 'Umb.WorkspaceAction.Document.SaveAndPublish', - meta: { - label: '#actions_unpublish', - icon: 'icon-globe', - }, - conditions: [ - { - alias: 'Umb.Condition.UserPermission.Document', - allOf: [UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH], - }, - { - alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, - }, - ], - }, - { - type: 'workspaceActionMenuItem', - kind: 'default', - alias: 'Umb.Document.WorkspaceActionMenuItem.PublishWithDescendants', - name: 'Publish with descendants', - weight: 10, - api: () => import('./actions/publish-with-descendants.action.js'), - forWorkspaceActions: 'Umb.WorkspaceAction.Document.SaveAndPublish', - meta: { - label: '#buttons_publishDescendants', - icon: 'icon-globe', - }, - conditions: [ - { - alias: 'Umb.Condition.UserPermission.Document', - allOf: [UMB_USER_PERMISSION_DOCUMENT_UPDATE, UMB_USER_PERMISSION_DOCUMENT_PUBLISH], - }, - { - alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, - }, - ], - }, - { - type: 'workspaceActionMenuItem', - kind: 'default', - alias: 'Umb.Document.WorkspaceActionMenuItem.SchedulePublishing', - name: 'Schedule publishing', - weight: 20, - api: () => import('./actions/save-and-schedule.action.js'), - forWorkspaceActions: 'Umb.WorkspaceAction.Document.SaveAndPublish', - meta: { - label: '#buttons_schedulePublish', - icon: 'icon-globe', - }, - conditions: [ - { - alias: 'Umb.Condition.UserPermission.Document', - allOf: [UMB_USER_PERMISSION_DOCUMENT_UPDATE, UMB_USER_PERMISSION_DOCUMENT_PUBLISH], - }, - { - alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, - }, - ], - }, ]; From e402c2b650833e2a3efc13e767cad3a351ea6382 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 11 Dec 2024 10:20:10 +0100 Subject: [PATCH 56/68] use publishing context --- .../workspace-action/publish-with-descendants.action.ts | 4 ++-- .../publish/workspace-action/save-and-publish.action.ts | 4 ++-- .../workspace-action/save-and-schedule.action.ts | 4 ++-- .../publishing/unpublish/workspace-action/unpublish.action.ts | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/workspace-action/publish-with-descendants.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/workspace-action/publish-with-descendants.action.ts index 1166ebb61d7f..9e802ab80faa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/workspace-action/publish-with-descendants.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish-with-descendants/workspace-action/publish-with-descendants.action.ts @@ -1,9 +1,9 @@ -import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../../workspace/document-workspace.context-token.js'; +import { UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT } from '../../workspace-context/constants.js'; import { UmbWorkspaceActionBase } from '@umbraco-cms/backoffice/workspace'; export class UmbDocumentPublishWithDescendantsWorkspaceAction extends UmbWorkspaceActionBase { override async execute() { - const workspaceContext = await this.getContext(UMB_DOCUMENT_WORKSPACE_CONTEXT); + const workspaceContext = await this.getContext(UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT); return workspaceContext.publishWithDescendants(); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/workspace-action/save-and-publish.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/workspace-action/save-and-publish.action.ts index cc79fb7fc1f6..23e6e3ab33a3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/workspace-action/save-and-publish.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/publish/workspace-action/save-and-publish.action.ts @@ -3,7 +3,7 @@ import { UMB_USER_PERMISSION_DOCUMENT_PUBLISH, UMB_USER_PERMISSION_DOCUMENT_UPDATE, } from '../../../user-permissions/constants.js'; -import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../../workspace/constants.js'; +import { UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT } from '../../workspace-context/constants.js'; import { UmbWorkspaceActionBase } from '@umbraco-cms/backoffice/workspace'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -32,7 +32,7 @@ export class UmbDocumentSaveAndPublishWorkspaceAction extends UmbWorkspaceAction } override async execute() { - const workspaceContext = await this.getContext(UMB_DOCUMENT_WORKSPACE_CONTEXT); + const workspaceContext = await this.getContext(UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT); return workspaceContext.saveAndPublish(); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/workspace-action/save-and-schedule.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/workspace-action/save-and-schedule.action.ts index 5e571d42d919..14cec080ef5a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/workspace-action/save-and-schedule.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/schedule-publish/workspace-action/save-and-schedule.action.ts @@ -1,9 +1,9 @@ -import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../../workspace/constants.js'; +import { UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT } from '../../workspace-context/constants.js'; import { UmbWorkspaceActionBase } from '@umbraco-cms/backoffice/workspace'; export class UmbDocumentSaveAndScheduleWorkspaceAction extends UmbWorkspaceActionBase { override async execute() { - const workspaceContext = await this.getContext(UMB_DOCUMENT_WORKSPACE_CONTEXT); + const workspaceContext = await this.getContext(UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT); return workspaceContext.schedule(); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/workspace-action/unpublish.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/workspace-action/unpublish.action.ts index 830521256ebe..319d2fa2b612 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/workspace-action/unpublish.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/workspace-action/unpublish.action.ts @@ -1,9 +1,9 @@ -import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../../workspace/constants.js'; +import { UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT } from '../../workspace-context/constants.js'; import { UmbWorkspaceActionBase } from '@umbraco-cms/backoffice/workspace'; export class UmbDocumentUnpublishWorkspaceAction extends UmbWorkspaceActionBase { override async execute() { - const workspaceContext = await this.getContext(UMB_DOCUMENT_WORKSPACE_CONTEXT); + const workspaceContext = await this.getContext(UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT); return workspaceContext.unpublish(); } } From fa89f4b59e24f7df2b7a2a51d8f74621e85f77ac Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 11 Dec 2024 16:28:45 +0100 Subject: [PATCH 57/68] clean up --- ...ument-published-pending-changes.manager.ts | 26 +++++++++---------- .../publishing/pending-changes/types.ts | 11 ++++++++ 2 files changed, 24 insertions(+), 13 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts index cf83aa136fa6..8694da6d6961 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts @@ -1,18 +1,18 @@ -import type { UmbDocumentDetailModel } from '../../types.js'; +import type { + UmbDocumentPublishedPendingChangesManagerProcessArgs, + UmbPublishedVariantWithPendingChanges, +} from './types.js'; import { UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import { UmbMergeContentVariantDataController } from '@umbraco-cms/backoffice/content'; import { jsonStringComparison, UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; -interface UmbDocumentPublishedPendingChangesManagerProcessArgs { - persistedData: UmbDocumentDetailModel; - publishedData: UmbDocumentDetailModel; -} - -interface UmbPublishedVariantWithPendingChanges { - variantId: UmbVariantId; -} - +/** + * Manages the pending changes for a published document. + * @exports + * @class UmbDocumentPublishedPendingChangesManager + * @augments {UmbControllerBase} + */ export class UmbDocumentPublishedPendingChangesManager extends UmbControllerBase { #variantsWithChanges = new UmbArrayState([], (x) => x.variantId.toString()); public readonly variantsWithChanges = this.#variantsWithChanges.asObservable(); @@ -23,11 +23,11 @@ export class UmbDocumentPublishedPendingChangesManager extends UmbControllerBase * @param {string} args.unique - The unique identifier of the document. * @param {UmbDocumentDetailModel} args.currentData - The current document data. * @returns {Promise} - * @memberof UmbPublishedPendingChangesManager + * @memberof UmbDocumentPublishedPendingChangesManager */ async process(args: UmbDocumentPublishedPendingChangesManagerProcessArgs): Promise { - if (!args.persistedData) throw new Error('Current Data is missing'); - if (!args.publishedData) throw new Error('Published Data is missing'); + if (!args.persistedData) throw new Error('Persisted data is missing'); + if (!args.publishedData) throw new Error('Published data is missing'); const variantIds = args.persistedData.variants?.map((x) => UmbVariantId.Create(x)) ?? []; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/types.ts new file mode 100644 index 000000000000..84b75b32a7b0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/types.ts @@ -0,0 +1,11 @@ +import type { UmbDocumentDetailModel } from '../../types.js'; +import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; + +export interface UmbDocumentPublishedPendingChangesManagerProcessArgs { + persistedData: UmbDocumentDetailModel; + publishedData: UmbDocumentDetailModel; +} + +export interface UmbPublishedVariantWithPendingChanges { + variantId: UmbVariantId; +} From 3ae8bfadca66e10d5182d0eaded37d66e58f2721 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 11 Dec 2024 19:11:05 +0100 Subject: [PATCH 58/68] add tests for published pending changes manager --- ...-published-pending-changes.manager.test.ts | 217 ++++++++++++++++++ ...ument-published-pending-changes.manager.ts | 4 +- .../utils/all-umb-consts/index.ts | 2 +- 3 files changed, 220 insertions(+), 3 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.test.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.test.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.test.ts new file mode 100644 index 000000000000..505ca53bc6dd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.test.ts @@ -0,0 +1,217 @@ +import { expect } from '@open-wc/testing'; +import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; +import { customElement } from '@umbraco-cms/backoffice/external/lit'; +import { UmbControllerHostElementMixin } from '@umbraco-cms/backoffice/controller-api'; +import { UmbDocumentPublishedPendingChangesManager } from './document-published-pending-changes.manager.js'; +import { DocumentVariantStateModel } from '@umbraco-cms/backoffice/external/backend-api'; +import { type UmbDocumentDetailModel } from '../../types.js'; +import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; + +@customElement('test-my-controller-host') +class UmbTestControllerHostElement extends UmbControllerHostElementMixin(HTMLElement) {} + +describe('UmbSelectionManager', () => { + let manager: UmbDocumentPublishedPendingChangesManager; + + beforeEach(() => { + const hostElement = new UmbTestControllerHostElement(); + manager = new UmbDocumentPublishedPendingChangesManager(hostElement); + }); + + describe('Public API', () => { + describe('properties', () => { + it('has a variantsWithChanges property', () => { + expect(manager).to.have.property('variantsWithChanges').to.be.an.instanceOf(Observable); + }); + }); + + describe('methods', () => { + it('has a process method', () => { + expect(manager).to.have.property('process').that.is.a('function'); + }); + + it('has a getVariantsWithChanges method', () => { + expect(manager).to.have.property('getVariantsWithChanges').that.is.a('function'); + }); + }); + }); + + describe('process', () => { + beforeEach(() => { + const hostElement = new UmbTestControllerHostElement(); + manager = new UmbDocumentPublishedPendingChangesManager(hostElement); + }); + + describe('invariant data', () => { + let persistedDocument: UmbDocumentDetailModel; + let publishedDocument: UmbDocumentDetailModel; + let documentBase: UmbDocumentDetailModel = { + entityType: UMB_DOCUMENT_ENTITY_TYPE, + urls: [ + { + culture: 'en-US', + url: '/document-1', + }, + ], + template: null, + unique: '1', + documentType: { + unique: 'document-type-1', + icon: 'icon-document', + collection: null, + }, + isTrashed: false, + variants: [ + { + state: DocumentVariantStateModel.PUBLISHED, + publishDate: '2023-02-06T15:32:24.957009', + culture: null, + segment: null, + name: 'Document 1', + createDate: '2023-02-06T15:32:05.350038', + updateDate: '2023-02-06T15:32:24.957009', + }, + ], + values: [ + { + editorAlias: 'Umbraco.TextBox', + alias: 'prop1', + culture: null, + segment: null, + value: '', + }, + ], + }; + + beforeEach(() => { + persistedDocument = structuredClone(documentBase); + publishedDocument = structuredClone(documentBase); + }); + + it('should set variantsWithChanges to an empty array if there are no pending changes', async () => { + await manager.process({ persistedData: persistedDocument, publishedData: publishedDocument }); + expect(manager.getVariantsWithChanges()).to.be.an('array').that.is.empty; + }); + + it('should have variants with changes when value is updated', async () => { + persistedDocument.values[0].value = 'value'; + await manager.process({ persistedData: persistedDocument, publishedData: publishedDocument }); + const variantsWithChanges = manager.getVariantsWithChanges(); + expect(variantsWithChanges).to.have.lengthOf(1); + expect(variantsWithChanges[0].variantId.toString()).to.equal('invariant'); + }); + + it('should have variants with changes when name of variant is updated', async () => { + persistedDocument.variants[0].name = 'Document 1 Updated'; + await manager.process({ persistedData: persistedDocument, publishedData: publishedDocument }); + const variantsWithChanges = manager.getVariantsWithChanges(); + expect(variantsWithChanges).to.have.lengthOf(1); + expect(variantsWithChanges[0].variantId.toString()).to.equal('invariant'); + }); + }); + + describe('variant data', () => { + let persistedDocument: UmbDocumentDetailModel; + let publishedDocument: UmbDocumentDetailModel; + let documentBase: UmbDocumentDetailModel = { + entityType: UMB_DOCUMENT_ENTITY_TYPE, + urls: [ + { + culture: 'en-US', + url: '/document-1', + }, + ], + template: null, + unique: '1', + documentType: { + unique: 'document-type-1', + icon: 'icon-document', + collection: null, + }, + isTrashed: false, + variants: [ + { + state: DocumentVariantStateModel.PUBLISHED, + publishDate: '2023-02-06T15:32:24.957009', + culture: 'en-US', + segment: null, + name: 'Document 1 (en-US)', + createDate: '2023-02-06T15:32:05.350038', + updateDate: '2023-02-06T15:32:24.957009', + }, + { + state: DocumentVariantStateModel.PUBLISHED, + publishDate: '2023-02-06T15:32:24.957009', + culture: 'da-DK', + segment: null, + name: 'Document 1 (da-DK)', + createDate: '2023-02-06T15:32:05.350038', + updateDate: '2023-02-06T15:32:24.957009', + }, + ], + values: [ + { + editorAlias: 'Umbraco.TextBox', + alias: 'prop1', + culture: 'en-US', + segment: null, + value: '', + }, + { + editorAlias: 'Umbraco.TextBox', + alias: 'prop1', + culture: 'da-DK', + segment: null, + value: '', + }, + ], + }; + + beforeEach(() => { + persistedDocument = structuredClone(documentBase); + publishedDocument = structuredClone(documentBase); + }); + + it('should not have variants with changes when there there are no pending changes', async () => { + await manager.process({ persistedData: persistedDocument, publishedData: publishedDocument }); + expect(manager.getVariantsWithChanges()).to.be.an('array').that.is.empty; + }); + + it('should have variants with changes when value is updated', async () => { + persistedDocument.values[0].value = 'value (en-US)'; + await manager.process({ persistedData: persistedDocument, publishedData: publishedDocument }); + const variantsWithChanges = manager.getVariantsWithChanges(); + expect(variantsWithChanges).to.have.lengthOf(1); + expect(variantsWithChanges[0].variantId.toString()).to.equal('en-US'); + }); + + it('should have variants with changes when multiple values are updated', async () => { + persistedDocument.values[0].value = 'value (en-US)'; + persistedDocument.values[1].value = 'value (da-DK)'; + await manager.process({ persistedData: persistedDocument, publishedData: publishedDocument }); + const variantsWithChanges = manager.getVariantsWithChanges(); + expect(variantsWithChanges).to.have.lengthOf(2); + expect(variantsWithChanges[0].variantId.toString()).to.equal('en-US'); + expect(variantsWithChanges[1].variantId.toString()).to.equal('da-DK'); + }); + + it('should have variants with changes when name of variant is updated', async () => { + persistedDocument.variants[0].name = 'Document 1 (en-US) Updated'; + await manager.process({ persistedData: persistedDocument, publishedData: publishedDocument }); + const variantsWithChanges = manager.getVariantsWithChanges(); + expect(variantsWithChanges).to.have.lengthOf(1); + expect(variantsWithChanges[0].variantId.toString()).to.equal('en-US'); + }); + + it('should have variants with changes when name of multiple variants are updated', async () => { + persistedDocument.variants[0].name = 'Document 1 (en-US) Updated'; + persistedDocument.variants[1].name = 'Document 1 (da-DK) Updated'; + await manager.process({ persistedData: persistedDocument, publishedData: publishedDocument }); + const variantsWithChanges = manager.getVariantsWithChanges(); + expect(variantsWithChanges).to.have.lengthOf(2); + expect(variantsWithChanges[0].variantId.toString()).to.equal('en-US'); + expect(variantsWithChanges[1].variantId.toString()).to.equal('da-DK'); + }); + }); + }); +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts index 8694da6d6961..7e78f9130b02 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts @@ -20,8 +20,8 @@ export class UmbDocumentPublishedPendingChangesManager extends UmbControllerBase /** * Checks each variant if there are any pending changes to publish. * @param {UmbDocumentPublishedPendingChangesManagerProcessArgs} args - The arguments for the process. - * @param {string} args.unique - The unique identifier of the document. - * @param {UmbDocumentDetailModel} args.currentData - The current document data. + * @param {UmbDocumentDetailModel} args.persistedData - The persisted document data. + * @param {UmbDocumentDetailModel} args.publishedData - The published document data. * @returns {Promise} * @memberof UmbDocumentPublishedPendingChangesManager */ diff --git a/src/Umbraco.Web.UI.Client/utils/all-umb-consts/index.ts b/src/Umbraco.Web.UI.Client/utils/all-umb-consts/index.ts index 53a950a28e5f..8e6818b1320d 100644 --- a/src/Umbraco.Web.UI.Client/utils/all-umb-consts/index.ts +++ b/src/Umbraco.Web.UI.Client/utils/all-umb-consts/index.ts @@ -132,7 +132,7 @@ export const foundConsts = [{ }, { path: '@umbraco-cms/backoffice/document', - consts: ["UMB_DOCUMENT_COLLECTION_ALIAS","UMB_DOCUMENT_COLLECTION_CONTEXT","UMB_DOCUMENT_COLLECTION_REPOSITORY_ALIAS","UMB_DOCUMENT_GRID_COLLECTION_VIEW_ALIAS","UMB_DOCUMENT_TABLE_COLLECTION_VIEW_ALIAS","UMB_DOCUMENT_CREATE_OPTIONS_MODAL","UMB_CREATE_BLUEPRINT_MODAL","UMB_DOCUMENT_CREATE_BLUEPRINT_REPOSITORY_ALIAS","UMB_CULTURE_AND_HOSTNAMES_MODAL","UMB_DOCUMENT_CULTURE_AND_HOSTNAMES_REPOSITORY_ALIAS","UMB_DUPLICATE_DOCUMENT_MODAL","UMB_DUPLICATE_DOCUMENT_MODAL_ALIAS","UMB_DUPLICATE_DOCUMENT_REPOSITORY_ALIAS","UMB_MOVE_DOCUMENT_REPOSITORY_ALIAS","UMB_DOCUMENT_NOTIFICATIONS_MODAL","UMB_DOCUMENT_NOTIFICATIONS_MODAL_ALIAS","UMB_DOCUMENT_NOTIFICATIONS_REPOSITORY_ALIAS","UMB_PUBLIC_ACCESS_MODAL","UMB_DOCUMENT_PUBLIC_ACCESS_REPOSITORY_ALIAS","UMB_SORT_CHILDREN_OF_DOCUMENT_REPOSITORY_ALIAS","UMB_BULK_DUPLICATE_DOCUMENT_REPOSITORY_ALIAS","UMB_BULK_MOVE_DOCUMENT_REPOSITORY_ALIAS","UMB_BULK_TRASH_DOCUMENT_REPOSITORY_ALIAS","UMB_DOCUMENT_ENTITY_TYPE","UMB_DOCUMENT_ROOT_ENTITY_TYPE","UMB_DOCUMENT_CONFIGURATION_CONTEXT","UMB_CONTENT_MENU_ALIAS","UMB_DOCUMENT_PICKER_MODAL","UMB_DOCUMENT_PUBLISH_MODAL","UMB_DOCUMENT_PUBLISH_MODAL_ALIAS","UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL","UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL_ALIAS","UMB_DOCUMENT_SAVE_MODAL","UMB_DOCUMENT_SAVE_MODAL_ALIAS","UMB_DOCUMENT_SCHEDULE_MODAL","UMB_DOCUMENT_SCHEDULE_MODAL_ALIAS","UMB_DOCUMENT_UNPUBLISH_MODAL","UMB_DOCUMENT_UNPUBLISH_MODAL_ALIAS","UMB_DOCUMENT_WORKSPACE_PATH","UMB_CREATE_FROM_BLUEPRINT_DOCUMENT_WORKSPACE_PATH_PATTERN","UMB_CREATE_DOCUMENT_WORKSPACE_PATH_PATTERN","UMB_EDIT_DOCUMENT_WORKSPACE_PATH_PATTERN","UMB_DOCUMENT_PROPERTY_DATASET_CONTEXT","UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE","UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS","UMB_DOCUMENT_RECYCLE_BIN_TREE_REPOSITORY_ALIAS","UMB_DOCUMENT_RECYCLE_BIN_TREE_STORE_ALIAS","UMB_DOCUMENT_RECYCLE_BIN_TREE_ALIAS","UMB_DOCUMENT_RECYCLE_BIN_TREE_STORE_CONTEXT","UMB_DOCUMENT_REFERENCE_REPOSITORY_ALIAS","UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS","UMB_DOCUMENT_DETAIL_STORE_ALIAS","UMB_DOCUMENT_DETAIL_STORE_CONTEXT","UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS","UMB_DOCUMENT_STORE_ALIAS","UMB_DOCUMENT_ITEM_STORE_CONTEXT","UMB_DOCUMENT_PUBLISHING_REPOSITORY_ALIAS","UMB_DOCUMENT_URL_REPOSITORY_ALIAS","UMB_DOCUMENT_URL_STORE_ALIAS","UMB_DOCUMENT_URL_STORE_CONTEXT","UMB_DOCUMENT_VALIDATION_REPOSITORY_ALIAS","UMB_ROLLBACK_MODAL_ALIAS","UMB_ROLLBACK_MODAL","UMB_ROLLBACK_REPOSITORY_ALIAS","UMB_DOCUMENT_SEARCH_PROVIDER_ALIAS","UMB_DOCUMENT_TREE_STORE_CONTEXT","UMB_DOCUMENT_TREE_REPOSITORY_ALIAS","UMB_DOCUMENT_TREE_STORE_ALIAS","UMB_DOCUMENT_TREE_ALIAS","UMB_DOCUMENT_USER_PERMISSION_CONDITION_ALIAS","UMB_USER_PERMISSION_DOCUMENT_CREATE","UMB_USER_PERMISSION_DOCUMENT_READ","UMB_USER_PERMISSION_DOCUMENT_UPDATE","UMB_USER_PERMISSION_DOCUMENT_DELETE","UMB_USER_PERMISSION_DOCUMENT_CREATE_BLUEPRINT","UMB_USER_PERMISSION_DOCUMENT_NOTIFICATIONS","UMB_USER_PERMISSION_DOCUMENT_PUBLISH","UMB_USER_PERMISSION_DOCUMENT_PERMISSIONS","UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH","UMB_USER_PERMISSION_DOCUMENT_DUPLICATE","UMB_USER_PERMISSION_DOCUMENT_MOVE","UMB_USER_PERMISSION_DOCUMENT_SORT","UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES","UMB_USER_PERMISSION_DOCUMENT_PUBLIC_ACCESS","UMB_USER_PERMISSION_DOCUMENT_ROLLBACK","UMB_DOCUMENT_PERMISSION_REPOSITORY_ALIAS","UMB_DOCUMENT_IS_NOT_TRASHED_CONDITION_ALIAS","UMB_DOCUMENT_IS_TRASHED_CONDITION_ALIAS","UMB_DOCUMENT_WORKSPACE_ALIAS","UMB_DOCUMENT_DETAIL_MODEL_VARIANT_SCAFFOLD","UMB_DOCUMENT_WORKSPACE_CONTEXT"] + consts: ["UMB_DOCUMENT_COLLECTION_ALIAS","UMB_DOCUMENT_COLLECTION_CONTEXT","UMB_DOCUMENT_COLLECTION_REPOSITORY_ALIAS","UMB_DOCUMENT_GRID_COLLECTION_VIEW_ALIAS","UMB_DOCUMENT_TABLE_COLLECTION_VIEW_ALIAS","UMB_DOCUMENT_CREATE_OPTIONS_MODAL","UMB_CREATE_BLUEPRINT_MODAL","UMB_DOCUMENT_CREATE_BLUEPRINT_REPOSITORY_ALIAS","UMB_CULTURE_AND_HOSTNAMES_MODAL","UMB_DOCUMENT_CULTURE_AND_HOSTNAMES_REPOSITORY_ALIAS","UMB_DUPLICATE_DOCUMENT_MODAL","UMB_DUPLICATE_DOCUMENT_MODAL_ALIAS","UMB_DUPLICATE_DOCUMENT_REPOSITORY_ALIAS","UMB_MOVE_DOCUMENT_REPOSITORY_ALIAS","UMB_DOCUMENT_NOTIFICATIONS_MODAL","UMB_DOCUMENT_NOTIFICATIONS_MODAL_ALIAS","UMB_DOCUMENT_NOTIFICATIONS_REPOSITORY_ALIAS","UMB_PUBLIC_ACCESS_MODAL","UMB_DOCUMENT_PUBLIC_ACCESS_REPOSITORY_ALIAS","UMB_SORT_CHILDREN_OF_DOCUMENT_REPOSITORY_ALIAS","UMB_BULK_DUPLICATE_DOCUMENT_REPOSITORY_ALIAS","UMB_BULK_MOVE_DOCUMENT_REPOSITORY_ALIAS","UMB_BULK_TRASH_DOCUMENT_REPOSITORY_ALIAS","UMB_DOCUMENT_ENTITY_TYPE","UMB_DOCUMENT_ROOT_ENTITY_TYPE","UMB_DOCUMENT_CONFIGURATION_CONTEXT","UMB_CONTENT_MENU_ALIAS","UMB_DOCUMENT_PICKER_MODAL","UMB_DOCUMENT_SAVE_MODAL","UMB_DOCUMENT_SAVE_MODAL_ALIAS","UMB_DOCUMENT_WORKSPACE_PATH","UMB_CREATE_FROM_BLUEPRINT_DOCUMENT_WORKSPACE_PATH_PATTERN","UMB_CREATE_DOCUMENT_WORKSPACE_PATH_PATTERN","UMB_EDIT_DOCUMENT_WORKSPACE_PATH_PATTERN","UMB_DOCUMENT_PROPERTY_DATASET_CONTEXT","UMB_DOCUMENT_PUBLISH_MODAL_ALIAS","UMB_DOCUMENT_PUBLISH_MODAL","UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL_ALIAS","UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL","UMB_DOCUMENT_PUBLISHING_REPOSITORY_ALIAS","UMB_DOCUMENT_SCHEDULE_MODAL_ALIAS","UMB_DOCUMENT_SCHEDULE_MODAL","UMB_DOCUMENT_UNPUBLISH_MODAL_ALIAS","UMB_DOCUMENT_UNPUBLISH_MODAL","UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT","UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE","UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS","UMB_DOCUMENT_RECYCLE_BIN_TREE_REPOSITORY_ALIAS","UMB_DOCUMENT_RECYCLE_BIN_TREE_STORE_ALIAS","UMB_DOCUMENT_RECYCLE_BIN_TREE_ALIAS","UMB_DOCUMENT_RECYCLE_BIN_TREE_STORE_CONTEXT","UMB_DOCUMENT_REFERENCE_REPOSITORY_ALIAS","UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS","UMB_DOCUMENT_DETAIL_STORE_ALIAS","UMB_DOCUMENT_DETAIL_STORE_CONTEXT","UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS","UMB_DOCUMENT_STORE_ALIAS","UMB_DOCUMENT_ITEM_STORE_CONTEXT","UMB_DOCUMENT_URL_REPOSITORY_ALIAS","UMB_DOCUMENT_URL_STORE_ALIAS","UMB_DOCUMENT_URL_STORE_CONTEXT","UMB_DOCUMENT_VALIDATION_REPOSITORY_ALIAS","UMB_ROLLBACK_MODAL_ALIAS","UMB_ROLLBACK_MODAL","UMB_ROLLBACK_REPOSITORY_ALIAS","UMB_DOCUMENT_SEARCH_PROVIDER_ALIAS","UMB_DOCUMENT_TREE_STORE_CONTEXT","UMB_DOCUMENT_TREE_REPOSITORY_ALIAS","UMB_DOCUMENT_TREE_STORE_ALIAS","UMB_DOCUMENT_TREE_ALIAS","UMB_DOCUMENT_USER_PERMISSION_CONDITION_ALIAS","UMB_USER_PERMISSION_DOCUMENT_CREATE","UMB_USER_PERMISSION_DOCUMENT_READ","UMB_USER_PERMISSION_DOCUMENT_UPDATE","UMB_USER_PERMISSION_DOCUMENT_DELETE","UMB_USER_PERMISSION_DOCUMENT_CREATE_BLUEPRINT","UMB_USER_PERMISSION_DOCUMENT_NOTIFICATIONS","UMB_USER_PERMISSION_DOCUMENT_PUBLISH","UMB_USER_PERMISSION_DOCUMENT_PERMISSIONS","UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH","UMB_USER_PERMISSION_DOCUMENT_DUPLICATE","UMB_USER_PERMISSION_DOCUMENT_MOVE","UMB_USER_PERMISSION_DOCUMENT_SORT","UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES","UMB_USER_PERMISSION_DOCUMENT_PUBLIC_ACCESS","UMB_USER_PERMISSION_DOCUMENT_ROLLBACK","UMB_DOCUMENT_PERMISSION_REPOSITORY_ALIAS","UMB_DOCUMENT_IS_NOT_TRASHED_CONDITION_ALIAS","UMB_DOCUMENT_IS_TRASHED_CONDITION_ALIAS","UMB_DOCUMENT_WORKSPACE_ALIAS","UMB_DOCUMENT_DETAIL_MODEL_VARIANT_SCAFFOLD","UMB_DOCUMENT_WORKSPACE_CONTEXT"] }, { path: '@umbraco-cms/backoffice/entity-action', From 4e88102146154ab895b24597f61647d67c885d45 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 11 Dec 2024 19:13:53 +0100 Subject: [PATCH 59/68] handle server the same way --- .../document-workspace-split-view-variant-selector.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts index ed7c00d56a54..098aa3c8590a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts @@ -21,7 +21,7 @@ export class UmbDocumentWorkspaceSplitViewVariantSelectorElement extends UmbWork // TODO: The pending changes state can be removed once the management Api removes this state // We only keep it here to make typescript happy // We should also make our own state model for this - [DocumentVariantStateModel.PUBLISHED_PENDING_CHANGES]: 'content_publishedPendingChanges', + [DocumentVariantStateModel.PUBLISHED_PENDING_CHANGES]: 'content_published', [DocumentVariantStateModel.NOT_CREATED]: 'content_notCreated', }; From f1b16a59aaab72977b48e97614ca29dcbe148757 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 13 Dec 2024 09:35:35 +0100 Subject: [PATCH 60/68] process pending changes when persisted data changes --- .../core/content/workspace/content-detail-workspace-base.ts | 3 +++ .../workspace/entity-detail/entity-detail-workspace-base.ts | 1 + .../document-publishing.workspace-context.ts | 6 ++++++ 3 files changed, 10 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts index 7dc5c36f701e..b2731f366c14 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts @@ -97,8 +97,11 @@ export abstract class UmbContentDetailWorkspaceContextBase< /* Content Data */ protected override readonly _data = new UmbContentWorkspaceDataManager(this); + + public override readonly data = this._data.current; public readonly values = this._data.createObservablePartOfCurrent((data) => data?.values); public readonly variants = this._data.createObservablePartOfCurrent((data) => data?.variants ?? []); + public override readonly persistedData = this._data.persisted; /* Content Type (Structure) Data */ public readonly structure; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts index 096e0db7d19b..e6a1dbe4f2d8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts @@ -38,6 +38,7 @@ export abstract class UmbEntityDetailWorkspaceContextBase< public readonly unique = this.#entityContext.unique; public readonly data = this._data.current; + public readonly persistedData = this._data.persisted; public readonly loading = new UmbStateManager(this); protected _getDataPromise?: Promise; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts index 94f9e8b0381e..1030a6dfd5e5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts @@ -333,6 +333,12 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase this.#processPendingChanges(), + 'umbPersistedDataObserver', + ); } #hasPublishedVariant() { From f9a6651b684ee05b49e8813b3f68a9e7e48655cc Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 13 Dec 2024 12:18:01 +0100 Subject: [PATCH 61/68] remove buggy updateDate --- ...ument-published-pending-changes.manager.ts | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts index 7e78f9130b02..07f2fdc79195 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts @@ -1,3 +1,4 @@ +import type { UmbDocumentVariantModel } from '../../types.js'; import type { UmbDocumentPublishedPendingChangesManagerProcessArgs, UmbPublishedVariantWithPendingChanges, @@ -39,7 +40,16 @@ export class UmbDocumentPublishedPendingChangesManager extends UmbControllerBase [variantId], ); - if (jsonStringComparison(mergedData, args.publishedData) === false) { + const mergedDataClone = structuredClone(mergedData); + const publishedDataClone = structuredClone(args.publishedData); + + // remove dates from the comparison + mergedDataClone.variants.forEach((variant) => this.#cleanVariantForComparison(variant)); + publishedDataClone.variants.forEach((variant) => this.#cleanVariantForComparison(variant)); + + const hasChanges = jsonStringComparison(mergedDataClone, publishedDataClone) === false; + + if (hasChanges) { return { variantId }; } else { return null; @@ -59,4 +69,13 @@ export class UmbDocumentPublishedPendingChangesManager extends UmbControllerBase getVariantsWithChanges(): Array { return this.#variantsWithChanges.getValue(); } + + #cleanVariantForComparison = (variant: UmbDocumentVariantModel) => { + // The server seems to have some date mismatches when quickly + // fetching a document after a save and comparing it to the published version. + // This is a temporary workaround to not include these dates in the comparison. + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + delete variant.updateDate; + }; } From 026dcbd46ed3d9b32eb645e3923dc1f3b95cbf40 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 13 Dec 2024 13:23:31 +0100 Subject: [PATCH 62/68] remove unused --- .../views/info/document-workspace-view-info.element.ts | 2 +- src/Umbraco.Web.UI.Client/utils/all-umb-consts/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info.element.ts index a069b6b65217..b75d219adae1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info.element.ts @@ -1,5 +1,5 @@ import { UMB_DOCUMENT_PROPERTY_DATASET_CONTEXT, UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../../constants.js'; -import type { UmbDocumentVariantModel, UmbDocumentVariantOptionModel } from '../../../types.js'; +import type { UmbDocumentVariantModel } from '../../../types.js'; import { UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT } from '../../../publishing/index.js'; import { TimeOptions } from './utils.js'; import { css, customElement, html, ifDefined, nothing, state } from '@umbraco-cms/backoffice/external/lit'; diff --git a/src/Umbraco.Web.UI.Client/utils/all-umb-consts/index.ts b/src/Umbraco.Web.UI.Client/utils/all-umb-consts/index.ts index 887ba8c5a422..8e6818b1320d 100644 --- a/src/Umbraco.Web.UI.Client/utils/all-umb-consts/index.ts +++ b/src/Umbraco.Web.UI.Client/utils/all-umb-consts/index.ts @@ -216,7 +216,7 @@ export const foundConsts = [{ }, { path: '@umbraco-cms/backoffice/member', - consts: ["UMB_MEMBER_COLLECTION_ALIAS","UMB_MEMBER_COLLECTION_CONTEXT","UMB_MEMBER_COLLECTION_REPOSITORY_ALIAS","UMB_MEMBER_TABLE_COLLECTION_VIEW_ALIAS","UMB_MEMBER_PICKER_MODAL","UMB_MEMBER_CREATE_OPTIONS_MODAL","UMB_MEMBER_ENTITY_TYPE","UMB_MEMBER_ROOT_ENTITY_TYPE","UMB_MEMBER_WORKSPACE_PATH","UMB_MEMBER_ROOT_WORKSPACE_PATH","UMB_CREATE_MEMBER_WORKSPACE_PATH_PATTERN","UMB_MEMBER_VARIANT_CONTEXT","UMB_MEMBER_DETAIL_REPOSITORY_ALIAS","UMB_MEMBER_DETAIL_STORE_ALIAS","UMB_MEMBER_DETAIL_STORE_CONTEXT","UMB_MEMBER_ITEM_REPOSITORY_ALIAS","UMB_MEMBER_STORE_ALIAS","UMB_MEMBER_ITEM_STORE_CONTEXT","UMB_MEMBER_SEARCH_PROVIDER_ALIAS","UMB_MEMBER_DETAIL_MODEL_VARIANT_SCAFFOLD","UMB_MEMBER_WORKSPACE_ALIAS","UMB_MEMBER_WORKSPACE_CONTEXT","UMB_MEMBER_ROOT_WORKSPACE_ALIAS"] + consts: ["UMB_MEMBER_COLLECTION_ALIAS","UMB_MEMBER_COLLECTION_CONTEXT","UMB_MEMBER_COLLECTION_REPOSITORY_ALIAS","UMB_MEMBER_TABLE_COLLECTION_VIEW_ALIAS","UMB_MEMBER_PICKER_MODAL","UMB_MEMBER_CREATE_OPTIONS_MODAL","UMB_MEMBER_ENTITY_TYPE","UMB_MEMBER_ROOT_ENTITY_TYPE","UMB_MEMBER_WORKSPACE_PATH","UMB_MEMBER_ROOT_WORKSPACE_PATH","UMB_CREATE_MEMBER_WORKSPACE_PATH_PATTERN","UMB_MEMBER_VARIANT_CONTEXT","UMB_MEMBER_DETAIL_REPOSITORY_ALIAS","UMB_MEMBER_DETAIL_STORE_ALIAS","UMB_MEMBER_DETAIL_STORE_CONTEXT","UMB_MEMBER_ITEM_REPOSITORY_ALIAS","UMB_MEMBER_STORE_ALIAS","UMB_MEMBER_ITEM_STORE_CONTEXT","UMB_MEMBER_VALIDATION_REPOSITORY_ALIAS","UMB_MEMBER_SEARCH_PROVIDER_ALIAS","UMB_MEMBER_DETAIL_MODEL_VARIANT_SCAFFOLD","UMB_MEMBER_WORKSPACE_ALIAS","UMB_MEMBER_WORKSPACE_CONTEXT","UMB_MEMBER_ROOT_WORKSPACE_ALIAS"] }, { path: '@umbraco-cms/backoffice/menu', From de946a9ace7cff287c15b4dccc5c91082db0138d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 13 Dec 2024 13:25:01 +0100 Subject: [PATCH 63/68] lint fix --- src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts | 2 +- .../unpublish/entity-bulk-action/unpublish.bulk-action.ts | 2 +- .../media/media/repository/item/media-item.repository.ts | 4 ++++ .../current-user/utils/is-current-user-an-admin.function.ts | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts index 0f54f27c9fe5..cd9cb0c4794b 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts @@ -654,7 +654,7 @@ export default { indexCannotRebuild: 'This index cannot be rebuilt because it has no assigned', iIndexPopulator: 'IIndexPopulator', corruptStatus: 'Possible corrupt index detected', - corruptErrorDescription: 'Error received when evaluating the index:' + corruptErrorDescription: 'Error received when evaluating the index:', }, placeholders: { username: 'Enter your username', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-bulk-action/unpublish.bulk-action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-bulk-action/unpublish.bulk-action.ts index bb4dd51260c7..77f3f3f87dfd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-bulk-action/unpublish.bulk-action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/unpublish/entity-bulk-action/unpublish.bulk-action.ts @@ -1,6 +1,7 @@ import { UmbUnpublishDocumentEntityAction } from '../entity-action/index.js'; import type { UmbDocumentVariantOptionModel } from '../../../types.js'; import { UMB_DOCUMENT_ENTITY_TYPE, UMB_DOCUMENT_UNPUBLISH_MODAL } from '../../../constants.js'; +import { UmbDocumentPublishingRepository } from '../../repository/index.js'; import { UMB_CONFIRM_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-bulk-action'; import { UMB_APP_LANGUAGE_CONTEXT, UmbLanguageCollectionRepository } from '@umbraco-cms/backoffice/language'; @@ -9,7 +10,6 @@ import { UmbLocalizationController } from '@umbraco-cms/backoffice/localization- import { UMB_ENTITY_CONTEXT } from '@umbraco-cms/backoffice/entity'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { UmbRequestReloadChildrenOfEntityEvent } from '@umbraco-cms/backoffice/entity-action'; -import { UmbDocumentPublishingRepository } from '../../repository/index.js'; export class UmbDocumentUnpublishEntityBulkAction extends UmbEntityBulkActionBase { async execute() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/media-item.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/media-item.repository.ts index 178d7a6e17ff..17082f54ab43 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/media-item.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/media-item.repository.ts @@ -13,6 +13,10 @@ export class UmbMediaItemRepository extends UmbItemRepositoryBase Date: Fri, 13 Dec 2024 15:50:47 +0100 Subject: [PATCH 64/68] add publish method back to avoid a breaking change --- .../tokens/publishable-workspace-context.interface.ts | 1 + .../document-publishing.workspace-context.ts | 4 ++++ .../documents/workspace/document-workspace.context.ts | 10 ++++++++++ 3 files changed, 15 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace-context.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace-context.interface.ts index a2a327bf2418..1d0229402fdc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace-context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/contexts/tokens/publishable-workspace-context.interface.ts @@ -2,5 +2,6 @@ import type { UmbSubmittableWorkspaceContext } from './submittable-workspace-con export interface UmbPublishableWorkspaceContext extends UmbSubmittableWorkspaceContext { saveAndPublish(): Promise; + publish(): Promise; unpublish(): Promise; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts index 1030a6dfd5e5..f9b687f015cc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts @@ -53,6 +53,10 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index 0460446be519..c4eb63ebf779 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -254,6 +254,16 @@ export class UmbDocumentWorkspaceContext previewWindow?.focus(); } + public async publish() { + new UmbDeprecation({ + deprecated: 'The Publish method on the UMB_DOCUMENT_WORKSPACE_CONTEXT is deprecated.', + removeInVersion: '17', + solution: 'Use the Publish method on the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead.', + }).warn(); + if (!this.#publishingContext) throw new Error('Publishing context is missing'); + this.#publishingContext.publish(); + } + /** * Save the document and publish it. * @deprecated Will be removed in v17. Use the UMB_DOCUMENT_PUBLISHING_WORKSPACE_CONTEXT instead. From 567816a7f78fe38fa465042e6c11b69232319a31 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 18 Dec 2024 10:23:50 +0100 Subject: [PATCH 65/68] throw error if we try to compare two different documents --- .../document-published-pending-changes.manager.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts index 07f2fdc79195..ec4ae71a493d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts @@ -29,6 +29,8 @@ export class UmbDocumentPublishedPendingChangesManager extends UmbControllerBase async process(args: UmbDocumentPublishedPendingChangesManagerProcessArgs): Promise { if (!args.persistedData) throw new Error('Persisted data is missing'); if (!args.publishedData) throw new Error('Published data is missing'); + if (args.persistedData.unique !== args.publishedData.unique) + throw new Error('Persisted and published data does not have the same unique'); const variantIds = args.persistedData.variants?.map((x) => UmbVariantId.Create(x)) ?? []; From 1770f80928ec80d972fbf3e4727f740a458b4481 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 18 Dec 2024 10:32:38 +0100 Subject: [PATCH 66/68] clear states if a new document is loaded --- .../document-published-pending-changes.manager.ts | 7 +++++++ .../document-publishing.workspace-context.ts | 14 ++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts index ec4ae71a493d..371fe98a7597 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/pending-changes/document-published-pending-changes.manager.ts @@ -80,4 +80,11 @@ export class UmbDocumentPublishedPendingChangesManager extends UmbControllerBase // @ts-expect-error delete variant.updateDate; }; + + /** + * Clear all states/values, + */ + clear() { + this.#variantsWithChanges.setValue([]); + } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts index f9b687f015cc..3ee552845efb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/workspace-context/document-publishing.workspace-context.ts @@ -24,6 +24,7 @@ import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; import { observeMultiple } from '@umbraco-cms/backoffice/observable-api'; import { DocumentVariantStateModel } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbEntityUnique } from '@umbraco-cms/backoffice/entity'; export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { /** @@ -37,6 +38,7 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase { + // We have loaded in a new document, so we need to clear the states + if (unique !== this.#currentUnique) { + this.#clear(); + } + + this.#currentUnique = unique; + if (isNew === false && unique) { this.#loadAndProcessLastPublished(); } @@ -383,6 +392,11 @@ export class UmbDocumentPublishingWorkspaceContext extends UmbContextBase Date: Wed, 18 Dec 2024 12:28:13 +0100 Subject: [PATCH 67/68] ensure we can only show the pending changes state if variant is published --- ...-workspace-split-view-variant-selector.element.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts index 098aa3c8590a..155dd1ce81f2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace-split-view-variant-selector.element.ts @@ -48,9 +48,15 @@ export class UmbDocumentWorkspaceSplitViewVariantSelectorElement extends UmbWork } #getVariantState(variantOption: UmbDocumentVariantOptionModel) { - const term = this.#hasPendingChanges(variantOption) - ? 'content_publishedPendingChanges' - : this.#publishStateLocalizationMap[variantOption.variant?.state || DocumentVariantStateModel.NOT_CREATED]; + let term = this.#publishStateLocalizationMap[variantOption.variant?.state || DocumentVariantStateModel.NOT_CREATED]; + + if ( + (variantOption.variant?.state === DocumentVariantStateModel.PUBLISHED || + variantOption.variant?.state === DocumentVariantStateModel.PUBLISHED_PENDING_CHANGES) && + this.#hasPendingChanges(variantOption) + ) { + term = 'content_publishedPendingChanges'; + } return this.localize.term(term); } From 545b3c9c5e895930efe627c0423c069f3c33b3a4 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 18 Dec 2024 13:30:18 +0100 Subject: [PATCH 68/68] remove client test thats doesn't do anything but trouble --- .../consent/installer-content.test.ts | 23 ------------------- .../database/installer-database.test.ts | 23 ------------------- .../installer/error/installer-error.test.ts | 23 ------------------- .../installing/installer-installing.test.ts | 23 ------------------- .../shared/layout/installer-layout.test.ts | 23 ------------------- .../installer/user/installer-user.test.ts | 23 ------------------- 6 files changed, 138 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/apps/installer/consent/installer-content.test.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/apps/installer/database/installer-database.test.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/apps/installer/error/installer-error.test.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/apps/installer/installing/installer-installing.test.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/apps/installer/shared/layout/installer-layout.test.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/apps/installer/user/installer-user.test.ts diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/consent/installer-content.test.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/consent/installer-content.test.ts deleted file mode 100644 index 91dc65b90095..000000000000 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/consent/installer-content.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { UmbInstallerConsentElement } from './installer-consent.element.js'; -import { expect, fixture, html } from '@open-wc/testing'; - -import { type UmbTestRunnerWindow, defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; - -// TODO: Write tests -describe('UmbInstallerConsentElement', () => { - let element: UmbInstallerConsentElement; - - beforeEach(async () => { - element = await fixture(html``); - }); - - it('is defined with its own instance', () => { - expect(element).to.be.instanceOf(UmbInstallerConsentElement); - }); - - if ((window as UmbTestRunnerWindow).__UMBRACO_TEST_RUN_A11Y_TEST) { - it('passes the a11y audit', async () => { - await expect(element).to.be.accessible(defaultA11yConfig); - }); - } -}); diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/database/installer-database.test.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/database/installer-database.test.ts deleted file mode 100644 index a27f2cfc2c0d..000000000000 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/database/installer-database.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { UmbInstallerDatabaseElement } from './installer-database.element.js'; -import { expect, fixture, html } from '@open-wc/testing'; - -import { type UmbTestRunnerWindow, defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; - -// TODO: Write tests -describe('UmbInstallerDatabaseElement', () => { - let element: UmbInstallerDatabaseElement; - - beforeEach(async () => { - element = await fixture(html``); - }); - - it('is defined with its own instance', () => { - expect(element).to.be.instanceOf(UmbInstallerDatabaseElement); - }); - - if ((window as UmbTestRunnerWindow).__UMBRACO_TEST_RUN_A11Y_TEST) { - it('passes the a11y audit', async () => { - await expect(element).to.be.accessible(defaultA11yConfig); - }); - } -}); diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/error/installer-error.test.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/error/installer-error.test.ts deleted file mode 100644 index 5993e79ad62d..000000000000 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/error/installer-error.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { UmbInstallerErrorElement } from './installer-error.element.js'; -import { expect, fixture, html } from '@open-wc/testing'; - -import { type UmbTestRunnerWindow, defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; - -// TODO: Write tests -describe('UmbInstallerErrorElement', () => { - let element: UmbInstallerErrorElement; - - beforeEach(async () => { - element = await fixture(html``); - }); - - it('is defined with its own instance', () => { - expect(element).to.be.instanceOf(UmbInstallerErrorElement); - }); - - if ((window as UmbTestRunnerWindow).__UMBRACO_TEST_RUN_A11Y_TEST) { - it('passes the a11y audit', async () => { - await expect(element).to.be.accessible(defaultA11yConfig); - }); - } -}); diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/installing/installer-installing.test.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/installing/installer-installing.test.ts deleted file mode 100644 index a156a0648226..000000000000 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/installing/installer-installing.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { UmbInstallerInstallingElement } from './installer-installing.element.js'; -import { expect, fixture, html } from '@open-wc/testing'; - -import { type UmbTestRunnerWindow, defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; - -// TODO: Write tests -describe('UmbInstallerInstallingElement', () => { - let element: UmbInstallerInstallingElement; - - beforeEach(async () => { - element = await fixture(html``); - }); - - it('is defined with its own instance', () => { - expect(element).to.be.instanceOf(UmbInstallerInstallingElement); - }); - - if ((window as UmbTestRunnerWindow).__UMBRACO_TEST_RUN_A11Y_TEST) { - it('passes the a11y audit', async () => { - await expect(element).to.be.accessible(defaultA11yConfig); - }); - } -}); diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/shared/layout/installer-layout.test.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/shared/layout/installer-layout.test.ts deleted file mode 100644 index 7e38f173e246..000000000000 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/shared/layout/installer-layout.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { UmbInstallerLayoutElement } from './installer-layout.element.js'; -import { expect, fixture, html } from '@open-wc/testing'; - -import { type UmbTestRunnerWindow, defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; - -// TODO: Write tests -describe('UmbInstallerLayoutElement', () => { - let element: UmbInstallerLayoutElement; - - beforeEach(async () => { - element = await fixture(html``); - }); - - it('is defined with its own instance', () => { - expect(element).to.be.instanceOf(UmbInstallerLayoutElement); - }); - - if ((window as UmbTestRunnerWindow).__UMBRACO_TEST_RUN_A11Y_TEST) { - it('passes the a11y audit', async () => { - await expect(element).to.be.accessible(defaultA11yConfig); - }); - } -}); diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/user/installer-user.test.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/user/installer-user.test.ts deleted file mode 100644 index da510d409280..000000000000 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/user/installer-user.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { UmbInstallerUserElement } from './installer-user.element.js'; -import { expect, fixture, html } from '@open-wc/testing'; - -import { type UmbTestRunnerWindow, defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; - -// TODO: Write tests -describe('UmbInstallerUserElement', () => { - let element: UmbInstallerUserElement; - - beforeEach(async () => { - element = await fixture(html``); - }); - - it('is defined with its own instance', () => { - expect(element).to.be.instanceOf(UmbInstallerUserElement); - }); - - if ((window as UmbTestRunnerWindow).__UMBRACO_TEST_RUN_A11Y_TEST) { - it('passes the a11y audit', async () => { - await expect(element).to.be.accessible(defaultA11yConfig); - }); - } -});