diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/paths.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/paths.ts index f1e66dce97..82939b2b4d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/paths.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/paths.ts @@ -11,7 +11,7 @@ export const UMB_MEDIA_WORKSPACE_PATH = UMB_WORKSPACE_PATH_PATTERN.generateAbsol export const UMB_CREATE_MEDIA_WORKSPACE_PATH_PATTERN = new UmbPathPattern<{ parentEntityType: UmbMediaEntityTypeUnion; parentUnique?: string | null; - documentTypeUnique: string; -}>('create/parent/:parentEntityType/:parentUnique/:documentTypeUnique', UMB_MEDIA_WORKSPACE_PATH); + mediaTypeUnique: string; +}>('create/parent/:parentEntityType/:parentUnique/:mediaTypeUnique', UMB_MEDIA_WORKSPACE_PATH); export const UMB_EDIT_MEDIA_WORKSPACE_PATH_PATTERN = new UmbPathPattern<{ unique: string }>('edit/:unique'); 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 1818c7b126..dab4a14ab6 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 @@ -8,12 +8,15 @@ import type { UmbMediaVariantModel, UmbMediaVariantOptionModel, } from '../types.js'; +import { UMB_CREATE_MEDIA_WORKSPACE_PATH_PATTERN, UMB_EDIT_MEDIA_WORKSPACE_PATH_PATTERN } from '../paths.js'; +import { UMB_MEDIA_SECTION_PATH } from '../../media-section/paths.js'; import { UMB_MEMBER_DETAIL_MODEL_VARIANT_SCAFFOLD } from './constants.js'; import { UMB_INVARIANT_CULTURE, UmbVariantId } from '@umbraco-cms/backoffice/variant'; import { UmbContentTypeStructureManager } from '@umbraco-cms/backoffice/content-type'; import { UmbSubmittableWorkspaceContextBase, UmbWorkspaceIsNewRedirectController, + UmbWorkspaceIsNewRedirectControllerAlias, UmbWorkspaceSplitViewManager, } from '@umbraco-cms/backoffice/workspace'; import { @@ -39,6 +42,7 @@ import { UmbEntityContext } from '@umbraco-cms/backoffice/entity'; import { UmbIsTrashedEntityContext } from '@umbraco-cms/backoffice/recycle-bin'; import { UmbReadOnlyVariantStateManager } from '@umbraco-cms/backoffice/utils'; import { UmbDataTypeItemRepositoryManager } from '@umbraco-cms/backoffice/data-type'; +import { UMB_MEDIA_COLLECTION_ALIAS } from '../collection/index.js'; type ContentModel = UmbMediaDetailModel; type ContentTypeModel = UmbMediaTypeDetailModel; @@ -181,7 +185,7 @@ export class UmbMediaWorkspaceContext this.routes.setRoutes([ { - path: 'create/parent/:entityType/:parentUnique/:mediaTypeUnique', + path: UMB_CREATE_MEDIA_WORKSPACE_PATH_PATTERN.toString(), component: () => import('./media-workspace-editor.element.js'), setup: async (_component, info) => { const parentEntityType = info.match.params.entityType; @@ -197,9 +201,10 @@ export class UmbMediaWorkspaceContext }, }, { - path: 'edit/:unique', + path: UMB_EDIT_MEDIA_WORKSPACE_PATH_PATTERN.toString(), component: () => import('./media-workspace-editor.element.js'), setup: (_component, info) => { + this.removeUmbControllerByAlias(UmbWorkspaceIsNewRedirectControllerAlias); const unique = info.match.params.unique; this.load(unique); }, @@ -209,8 +214,7 @@ export class UmbMediaWorkspaceContext override resetState() { super.resetState(); - this.#data.setPersisted(undefined); - this.#data.setCurrent(undefined); + this.#data.clear(); } async loadLanguages() { @@ -240,7 +244,7 @@ export class UmbMediaWorkspaceContext #onStoreChange(entity: ContentModel | undefined) { if (!entity) { //TODO: This solution is alright for now. But reconsider when we introduce signal-r - history.pushState(null, '', 'section/media'); + history.pushState(null, '', UMB_MEDIA_SECTION_PATH); } } @@ -260,7 +264,7 @@ export class UmbMediaWorkspaceContext } getCollectionAlias() { - return 'Umb.Collection.Media'; + return UMB_MEDIA_COLLECTION_ALIAS; } getData() { @@ -308,7 +312,7 @@ export class UmbMediaWorkspaceContext } setName(name: string, variantId?: UmbVariantId) { - this.#updateVariantData(variantId ?? UmbVariantId.CreateInvariant(), { name }); + this.#data.updateVariantData(variantId ?? UmbVariantId.CreateInvariant(), { name }); } name(variantId?: UmbVariantId) { @@ -330,22 +334,22 @@ export class UmbMediaWorkspaceContext async propertyValueByAlias(propertyAlias: string, variantId?: UmbVariantId) { return this.#data.createObservablePartOfCurrent( (data) => - data?.values?.find((x) => x?.alias === propertyAlias && (variantId ? variantId.compare(x as any) : true)) + data?.values?.find((x) => x?.alias === propertyAlias && (variantId ? variantId.compare(x) : true)) ?.value as PropertyValueType, ); } /** * Get the current value of the property with the given alias and variantId. - * @param alias - * @param variantId + * @param {string} alias + * @param {UmbVariantId} variantId * @returns The value or undefined if not set or found. */ getPropertyValue(alias: string, variantId?: UmbVariantId) { const currentData = this.#data.getCurrent(); if (currentData) { const newDataSet = currentData.values?.find( - (x) => x.alias === alias && (variantId ? variantId.compare(x as any) : true), + (x) => x.alias === alias && (variantId ? variantId.compare(x) : true), ); return newDataSet?.value as ReturnType; } @@ -390,108 +394,47 @@ export class UmbMediaWorkspaceContext this.#data.finishPropertyValueChange(); }; - /* #calculateChangedVariants() { - const persisted = this.#persistedData.getValue(); - const current = this.#data.current.getValue(); - if (!current) throw new Error('Current data is missing'); - - const changedVariants = current?.variants.map((variant) => { - const persistedVariant = persisted?.variants.find((x) => UmbVariantId.Create(variant).compare(x)); - return { - culture: variant.culture, - segment: variant.segment, - equal: persistedVariant ? jsonStringComparison(variant, persistedVariant) : false, - }; - }); - - const changedProperties = current?.values.map((value) => { - const persistedValues = persisted?.values.find((x) => UmbVariantId.Create(value).compare(x)); - return { - culture: value.culture, - segment: value.segment, - equal: persistedValues ? jsonStringComparison(value, persistedValues) : false, - }; - }); - - // calculate the variantIds of those who either have a change in properties or in variants: - return ( - changedVariants - ?.concat(changedProperties ?? []) - .filter((x) => x.equal === false) - .map((x) => new UmbVariantId(x.culture, x.segment)) ?? [] - ); - } */ - - #updateVariantData(variantId: UmbVariantId, update?: Partial) { - const currentData = this.getData(); - if (!currentData) throw new Error('Data is missing'); - if (this.#varies === true) { - // If variant Id is invariant, we don't to have the variant appended to our data. - if (variantId.isInvariant()) return; - const variant = currentData.variants.find((x) => variantId.compare(x)); - const newVariants = appendToFrozenArray( - currentData.variants, - { - name: '', - createDate: null, - updateDate: null, - ...variantId.toObject(), - ...variant, - ...update, - }, - (x) => variantId.compare(x), - ); - this.#data.updateCurrent({ variants: newVariants }); - } else if (this.#varies === false) { - // TODO: Beware about segments, in this case we need to also consider segments, if its allowed to vary by segments. - const invariantVariantId = UmbVariantId.CreateInvariant(); - const variant = currentData.variants.find((x) => invariantVariantId.compare(x)); - // Cause we are invariant, we will just overwrite all variants with this one: - const newVariants = [ - { - name: '', - createDate: null, - updateDate: null, - ...invariantVariantId.toObject(), - ...variant, - ...update, - }, - ]; - this.#data.updateCurrent({ variants: newVariants }); - } else { - throw new Error('Varies by culture is missing'); - } - } - - async #createOrSave() { - const data = this.#data.getCurrent(); - if (!data?.unique) throw new Error('Unique is missing'); + async #handleSave() { + const saveData = this.#data.getCurrent(); + if (!saveData?.unique) throw new Error('Unique is missing'); if (this.getIsNew()) { const parent = this.#parent.getValue(); if (!parent) throw new Error('Parent is not set'); - if ((await this.repository.create(data, parent.unique)).data !== undefined) { - this.setIsNew(false); - - // TODO: this might not be the right place to alert the tree, but it works for now - const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); - const event = new UmbRequestReloadChildrenOfEntityEvent({ - entityType: parent.entityType, - unique: parent.unique, - }); - eventContext.dispatchEvent(event); + const { data, error } = await this.repository.create(saveData, parent.unique); + if (!data || error) { + throw new Error('Error creating document'); } - } else { - await this.repository.save(data); - const actionEventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); + this.setIsNew(false); + this.#data.setPersisted(data); + this.#data.setCurrent(data); + + // TODO: this might not be the right place to alert the tree, but it works for now + const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); + const event = new UmbRequestReloadChildrenOfEntityEvent({ + entityType: parent.entityType, + unique: parent.unique, + }); + eventContext.dispatchEvent(event); + } else { + // Save: + const { data, error } = await this.repository.save(saveData); + if (!data || error) { + throw new Error('Error saving document'); + } + + this.#data.setPersisted(data); + this.#data.setCurrent(data); + + const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); const event = new UmbRequestReloadStructureForEntityEvent({ unique: this.getUnique()!, entityType: this.getEntityType(), }); - actionEventContext.dispatchEvent(event); + eventContext.dispatchEvent(event); } } @@ -500,8 +443,7 @@ export class UmbMediaWorkspaceContext if (!data) { throw new Error('Data is missing'); } - await this.#createOrSave(); - this.setIsNew(false); + await this.#handleSave(); } async delete() { @@ -511,14 +453,6 @@ export class UmbMediaWorkspaceContext } } - /* - concept notes: - - public saveAndPreview() { - - } - */ - public createPropertyDatasetContext( host: UmbControllerHost, variantId: UmbVariantId, @@ -529,6 +463,7 @@ export class UmbMediaWorkspaceContext public override destroy(): void { this.#data.destroy(); this.structure.destroy(); + this.#languageRepository.destroy(); super.destroy(); } }