align media

This commit is contained in:
Niels Lyngsø
2024-10-01 11:30:45 +02:00
parent a48cb7d034
commit 3b758bb006
2 changed files with 48 additions and 113 deletions

View File

@@ -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');

View File

@@ -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<PropertyValueType = unknown>(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<ReturnType = unknown>(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<UmbMediaVariantModel>) {
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();
}
}