From 49896e5885b8095dd6dd657fb473dfda144f26e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 25 Sep 2024 21:05:01 +0200 Subject: [PATCH] keep none saved data when saving --- .../merge-content-variant-data.controller.ts | 0 .../src/packages/core/content/index.ts | 1 + .../content/manager/content-data-manager.ts | 7 +-- .../workspace/document-workspace.context.ts | 50 ++++++++++++++----- 4 files changed, 40 insertions(+), 18 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/core/content/{manager => controller}/merge-content-variant-data.controller.ts (100%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content/manager/merge-content-variant-data.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content/controller/merge-content-variant-data.controller.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/content/manager/merge-content-variant-data.controller.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/content/controller/merge-content-variant-data.controller.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 78f9cc415a..0143c4ebe5 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 @@ -1,6 +1,7 @@ export { UMB_CONTENT_PROPERTY_CONTEXT } from './content-property.context-token.js'; export { UmbContentPropertyContext } from './content-property.context.js'; export * from './manager/content-data-manager.js'; +export * from './controller/merge-content-variant-data.controller.js'; export * from './property-dataset-context/content-property-dataset.context.js'; export * from './workspace/index.js'; export type * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content/manager/content-data-manager.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content/manager/content-data-manager.ts index 2b034434ea..1bfc73f315 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content/manager/content-data-manager.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content/manager/content-data-manager.ts @@ -1,4 +1,4 @@ -import { UmbMergeContentVariantDataController } from './merge-content-variant-data.controller.js'; +import { UmbMergeContentVariantDataController } from '../controller/merge-content-variant-data.controller.js'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbContentDetailModel } from '@umbraco-cms/backoffice/content'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -31,11 +31,6 @@ export class UmbContentWorkspaceDataManager< this.#variantScaffold = variantScaffold; } - setData(incomingData: ModelType | undefined) { - this.#persisted.setValue(incomingData); - this.current.setValue(incomingData); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars setVariesByCulture(vary: boolean | undefined) { //this.#variesByCulture = vary; 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 f20dc3bb4f..2c0a634284 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 @@ -63,7 +63,11 @@ import { } from '@umbraco-cms/backoffice/validation'; import { UmbDocumentBlueprintDetailRepository } from '@umbraco-cms/backoffice/document-blueprint'; import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; -import { UmbContentWorkspaceDataManager, type UmbContentWorkspaceContext } from '@umbraco-cms/backoffice/content'; +import { + UmbContentWorkspaceDataManager, + UmbMergeContentVariantDataController, + type UmbContentWorkspaceContext, +} from '@umbraco-cms/backoffice/content'; import type { UmbDocumentTypeDetailModel } from '@umbraco-cms/backoffice/document-type'; import { UmbIsTrashedEntityContext } from '@umbraco-cms/backoffice/recycle-bin'; import { UmbReadOnlyVariantStateManager } from '@umbraco-cms/backoffice/utils'; @@ -255,7 +259,8 @@ export class UmbDocumentWorkspaceContext override resetState() { super.resetState(); - this.#data.setData(undefined); + this.#data.setPersistedData(undefined); + this.#data.setCurrentData(undefined); } async loadLanguages() { @@ -275,7 +280,8 @@ export class UmbDocumentWorkspaceContext this.#entityContext.setUnique(unique); this.#isTrashedContext.setIsTrashed(data.isTrashed); this.setIsNew(false); - this.#data.setData(data); + this.#data.setPersistedData(data); + this.#data.setCurrentData(data); } this.observe(asObservable(), (entity) => this.#onStoreChange(entity), 'umbDocumentStoreObserver'); @@ -509,7 +515,7 @@ export class UmbDocumentWorkspaceContext }; } - async #performSaveOrCreate(saveData: UmbDocumentDetailModel): Promise { + async #performSaveOrCreate(variantIds: Array, saveData: UmbDocumentDetailModel): Promise { if (this.getIsNew()) { // Create: const parent = this.#parent.getValue(); @@ -524,7 +530,17 @@ export class UmbDocumentWorkspaceContext this.setIsNew(false); this.#data.setPersistedData(data); // TODO: Only update the variants that was chosen to be saved: - this.#data.setCurrentData(data); + const currentData = this.#data.getCurrentData(); + + const variantIdsIncludingInvariant = [...variantIds, UmbVariantId.CreateInvariant()]; + + const newCurrentData = await new UmbMergeContentVariantDataController(this).process( + currentData, + data, + variantIds, + variantIdsIncludingInvariant, + ); + this.#data.setCurrentData(newCurrentData); const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); const event = new UmbRequestReloadChildrenOfEntityEvent({ @@ -542,7 +558,17 @@ export class UmbDocumentWorkspaceContext this.#data.setPersistedData(data); // TODO: Only update the variants that was chosen to be saved: - this.#data.setCurrentData(data); + const currentData = this.#data.getCurrentData(); + + const variantIdsIncludingInvariant = [...variantIds, UmbVariantId.CreateInvariant()]; + + const newCurrentData = await new UmbMergeContentVariantDataController(this).process( + currentData, + data, + variantIds, + variantIdsIncludingInvariant, + ); + this.#data.setCurrentData(newCurrentData); const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); const event = new UmbRequestReloadStructureForEntityEvent({ @@ -569,10 +595,10 @@ export class UmbDocumentWorkspaceContext const { selected } = await this.#determineVariantOptions(); if (selected.length > 0) { culture = selected[0]; - const variantId = UmbVariantId.FromString(culture); - const saveData = await this.#data.constructData([variantId]); + const variantIds = [UmbVariantId.FromString(culture)]; + const saveData = await this.#data.constructData(variantIds); await this.#runMandatoryValidationForSaveData(saveData); - await this.#performSaveOrCreate(saveData); + await this.#performSaveOrCreate(variantIds, saveData); } // Tell the server that we're entering preview mode. @@ -640,7 +666,7 @@ export class UmbDocumentWorkspaceContext }, async () => { // If data of the selection is not valid Then just save: - await this.#performSaveOrCreate(saveData); + await this.#performSaveOrCreate(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. @@ -675,7 +701,7 @@ export class UmbDocumentWorkspaceContext const unique = this.getUnique(); if (!unique) throw new Error('Unique is missing'); - await this.#performSaveOrCreate(saveData); + await this.#performSaveOrCreate(variantIds, saveData); await this.publishingRepository.publish( unique, @@ -723,7 +749,7 @@ export class UmbDocumentWorkspaceContext const saveData = await this.#data.constructData(variantIds); await this.#runMandatoryValidationForSaveData(saveData); - return await this.#performSaveOrCreate(saveData); + return await this.#performSaveOrCreate(variantIds, saveData); } public override requestSubmit() {