wire up the document workspace with the variant manager context to avoid duplication of code

This commit is contained in:
Jacob Overgaard
2024-02-21 10:54:42 +01:00
parent 7537a633c0
commit 9f929ac677

View File

@@ -3,10 +3,11 @@ import { UmbDocumentPropertyDataContext } from '../property-dataset-context/docu
import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js';
import { UmbDocumentDetailRepository } from '../repository/index.js';
import type { UmbDocumentDetailModel } from '../types.js';
import { type UmbDocumentVariantPickerModalData, UMB_DOCUMENT_LANGUAGE_PICKER_MODAL } from '../modals/index.js';
import type { UmbDocumentVariantPickerModalData } from '../modals/index.js';
import { UmbDocumentPublishingRepository } from '../repository/publishing/index.js';
import { UMB_DOCUMENT_VARIANT_MANAGER_CONTEXT } from '../global-contexts/document-variant-manager.context.js';
import { UMB_DOCUMENT_WORKSPACE_ALIAS } from './manifests.js';
import { UmbVariantId } from '@umbraco-cms/backoffice/variant';
import type { UmbVariantId } from '@umbraco-cms/backoffice/variant';
import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type';
import {
UmbEditableWorkspaceContextBase,
@@ -16,7 +17,6 @@ import {
} from '@umbraco-cms/backoffice/workspace';
import { appendToFrozenArray, partialUpdateFrozenArray, UmbObjectState } from '@umbraco-cms/backoffice/observable-api';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal';
type EntityType = UmbDocumentDetailModel;
export class UmbDocumentWorkspaceContext
@@ -48,13 +48,13 @@ export class UmbDocumentWorkspaceContext
readonly structure = new UmbContentTypePropertyStructureManager(this, new UmbDocumentTypeDetailRepository(this));
readonly splitView = new UmbWorkspaceSplitViewManager();
#modalManagerContext?: typeof UMB_MODAL_MANAGER_CONTEXT.TYPE;
#variantManagerContext?: typeof UMB_DOCUMENT_VARIANT_MANAGER_CONTEXT.TYPE;
constructor(host: UmbControllerHost) {
super(host, UMB_DOCUMENT_WORKSPACE_ALIAS);
this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => {
this.#modalManagerContext = instance;
this.consumeContext(UMB_DOCUMENT_VARIANT_MANAGER_CONTEXT, (instance) => {
this.#variantManagerContext = instance;
});
this.observe(this.contentTypeUnique, (unique) => this.structure.loadType(unique));
@@ -185,49 +185,20 @@ export class UmbDocumentWorkspaceContext
}
}
async #selectVariants(type: UmbDocumentVariantPickerModalData['type']): Promise<UmbVariantId[]> {
const currentData = this.getData();
if (!currentData) throw new Error('Data is missing');
const variants = currentData.variants;
// If there is only one variant, we don't need to select anything.
if (variants.length === 1) {
return [UmbVariantId.Create(variants[0])];
}
if (!this.#modalManagerContext) throw new Error('Modal manager context is missing');
const modalData: UmbDocumentVariantPickerModalData = {
type,
variants, // TODO: Filter out variants that do not have any changes unless it is the current variant.
};
const activeVariants = this.splitView.getActiveVariants();
const activeVariant = activeVariants[activeVariants.length - 1];
const modalContext = this.#modalManagerContext.open(UMB_DOCUMENT_LANGUAGE_PICKER_MODAL, {
data: modalData,
value: { selection: activeVariant ? [activeVariant.culture] : [] },
});
const result = await modalContext.onSubmit().catch(() => undefined);
if (!result?.selection.length) return [];
const selectedVariants = result.selection.map((x) => x?.toLowerCase() ?? '');
// Match the result to the available variants.
const variantIds = variants.filter((x) => selectedVariants.includes(x.culture!)).map((x) => UmbVariantId.Create(x));
return variantIds;
}
async #createOrSave(type: UmbDocumentVariantPickerModalData['type']): Promise<UmbVariantId[]> {
const data = this.getData();
if (!data) throw new Error('Data is missing');
if (!data.unique) throw new Error('Unique is missing');
if (!this.#variantManagerContext) throw new Error('Variant manager context is missing');
const selectedVariants = await this.#selectVariants(type);
const activeVariants = this.splitView.getActiveVariants();
const activeVariant = activeVariants.length ? activeVariants[0] : undefined;
const selectedVariants = await this.#variantManagerContext.pickVariants(
data.variants, // TODO: Add a filter function to only show variants that have been changed
type,
activeVariant?.culture ?? undefined,
);
// If no variants are selected, we don't save anything.
if (!selectedVariants.length) return [];
@@ -244,9 +215,9 @@ export class UmbDocumentWorkspaceContext
}
async save() {
await this.#createOrSave('save');
const data = this.getData();
if (!data) throw new Error('Data is missing');
await this.#createOrSave('save');
this.saveComplete(data);
}
@@ -263,11 +234,12 @@ export class UmbDocumentWorkspaceContext
}
public async unpublish() {
const variantIds = await this.#selectVariants('unpublish');
const unique = this.getEntityId();
if (variantIds.length && unique) {
await this.publishingRepository.unpublish(unique, variantIds);
}
if (!unique) throw new Error('Unique is missing');
if (!this.#variantManagerContext) throw new Error('Variant manager context is missing');
this.#variantManagerContext.unpublish(unique);
}
async delete() {