move model mapping

This commit is contained in:
Mads Rasmussen
2024-01-25 20:20:24 +01:00
parent f130347fac
commit ad7083f5d9
27 changed files with 78 additions and 83 deletions

View File

@@ -28,7 +28,7 @@ export class UmbMockDocumentPublishingManager {
const document: UmbMockDocumentModel = this.#documentDb.detail.read(id);
document?.variants?.forEach((variant) => {
const hasCulture = variant.culture && data.cultures?.includes(variant.culture);
const hasCulture = variant.culture && data.culture === variant.culture;
if (hasCulture) {
variant.state = ContentStateModel.DRAFT;

View File

@@ -55,7 +55,7 @@ export class UmbMockEntityFolderManager<MockItemType extends Omit<FolderTreeItem
return {
name: item.name,
id: item.id,
parentId: item.parentId,
parentId: item.parent ? item.parent.id : null,
};
};
}

View File

@@ -1,9 +1,9 @@
import { UmbEntityMockDbBase } from './entity-base.js';
import { UmbMockEntityTreeManager } from './entity-tree.manager.js';
import type { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api';
import type { ContentTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api';
export class UmbEntityRecycleBin<
MockType extends Omit<EntityTreeItemResponseModel, 'type'>,
MockType extends Omit<ContentTreeItemResponseModel, 'type'>,
> extends UmbEntityMockDbBase<MockType> {
tree;

View File

@@ -12,14 +12,14 @@ export class UmbMockEntityTreeManager<T extends Omit<EntityTreeItemResponseModel
}
getRoot() {
const items = this.#db.getData().filter((item) => item.parentId === null);
const items = this.#db.getData().filter((item) => item.parent === null);
const treeItems = items.map((item) => this.#treeItemMapper(item));
const total = items.length;
return { items: treeItems, total };
}
getChildrenOf(parentId: string) {
const items = this.#db.getData().filter((item) => item.parentId === parentId);
const items = this.#db.getData().filter((item) => item.parent?.id === parentId);
const treeItems = items.map((item) => this.#treeItemMapper(item));
const total = items.length;
return { items: treeItems, total };

View File

@@ -14,7 +14,7 @@ export class UmbBlockTypeCardElement extends UmbLitElement {
#itemManager = new UmbRepositoryItemsManager<UmbDocumentTypeItemModel>(
this,
DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS,
(x) => x.id,
(x) => x.unique,
);
@property({ type: String, attribute: false })

View File

@@ -12,7 +12,7 @@ export class UmbBlockTypeWorkspaceEditorElement extends UmbLitElement {
#itemManager = new UmbRepositoryItemsManager<UmbDocumentTypeItemModel>(
this,
DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS,
(x) => x.id,
(x) => x.unique,
);
#workspaceContext?: typeof UMB_BLOCK_TYPE_WORKSPACE_CONTEXT.TYPE;

View File

@@ -1,10 +1,10 @@
import { UmbDataTypeItemServerDataSource } from './data-type-item.server.data.js';
import { UMB_DATA_TYPE_ITEM_STORE_CONTEXT } from './data-type-item.store.js';
import type { UmbDataTypeItemModel } from './types.js';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { UmbItemRepositoryBase } from '@umbraco-cms/backoffice/repository';
import type { DataTypeItemResponseModel } from '@umbraco-cms/backoffice/backend-api';
export class UmbDataTypeItemRepository extends UmbItemRepositoryBase<DataTypeItemResponseModel> {
export class UmbDataTypeItemRepository extends UmbItemRepositoryBase<UmbDataTypeItemModel> {
constructor(host: UmbControllerHost) {
super(host, UmbDataTypeItemServerDataSource, UMB_DATA_TYPE_ITEM_STORE_CONTEXT);
}

View File

@@ -1,2 +1,3 @@
export { UmbDataTypeItemRepository } from './data-type-item.repository.js';
export { UMB_DATA_TYPE_ITEM_REPOSITORY_ALIAS as DATA_TYPE_ITEM_REPOSITORY_ALIAS } from './manifests.js';
export type { UmbDataTypeItemModel } from './types.js';

View File

@@ -0,0 +1,5 @@
export interface UmbDataTypeItemModel {
unique: string;
name: string;
propertyEditorUiAlias: string;
}

View File

@@ -10,8 +10,6 @@ import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffic
import type { UmbPropertySettingsModalValue, UmbPropertySettingsModalData } from '@umbraco-cms/backoffice/modal';
import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal';
import { generateAlias } from '@umbraco-cms/backoffice/utils';
import { DocumentTypeResponseModel } from '@umbraco-cms/backoffice/backend-api';
import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api';
// TODO: Could base take a token to get its types?.
@customElement('umb-property-settings-modal')
export class UmbPropertySettingsModalElement extends UmbModalBaseElement<

View File

@@ -1,3 +1,6 @@
import type { DocumentTypeItemResponseModel } from '@umbraco-cms/backoffice/backend-api';
export type UmbDocumentTypeItemModel = DocumentTypeItemResponseModel;
export type UmbDocumentTypeItemModel = {
unique: string;
name: string;
isElement: boolean;
icon?: string | null;
};

View File

@@ -21,7 +21,6 @@ export class UmbDocumentTypeTreeRepository
name: 'Document Types',
icon: 'icon-folder',
hasChildren: true,
isContainer: false,
isFolder: true,
};

View File

@@ -46,10 +46,9 @@ const getChildrenOf = (parentUnique: string | null) => {
const mapper = (item: DocumentTypeTreeItemResponseModel): UmbDocumentTypeTreeItemModel => {
return {
unique: item.id,
parentUnique: item.parentId || null,
parentUnique: item.parent ? item.parent.id : null,
name: item.name,
entityType: item.isFolder ? UMB_DOCUMENT_TYPE_FOLDER_ENTITY_TYPE : UMB_DOCUMENT_TYPE_ENTITY_TYPE,
isContainer: item.isContainer,
hasChildren: item.hasChildren,
isFolder: item.isFolder,
icon: item.icon,

View File

@@ -39,7 +39,6 @@ export class UmbDocumentTypeTreeStore extends UmbUniqueTreeStore {
entityType: item.entityType,
isElement: item.isElement,
isFolder: false,
isContainer: false,
hasChildren: false,
};

View File

@@ -1,12 +1,9 @@
import { UmbDocumentTypeDetailRepository } from '../repository/detail/document-type-detail.repository.js';
import type { UmbDocumentTypeDetailModel } from '../types.js';
import type { UmbContentTypeCompositionModel, UmbContentTypeSortModel } from '@umbraco-cms/backoffice/content-type';
import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type';
import type {
UmbSaveableWorkspaceContextInterface} from '@umbraco-cms/backoffice/workspace';
import {
UmbEditableWorkspaceContextBase
} from '@umbraco-cms/backoffice/workspace';
import type { ContentTypeCompositionModel, ContentTypeSortModel } from '@umbraco-cms/backoffice/backend-api';
import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace';
import { UmbEditableWorkspaceContextBase } from '@umbraco-cms/backoffice/workspace';
import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api';
import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api';
@@ -60,9 +57,9 @@ export class UmbDocumentTypeWorkspaceContext
this.compositions = this.structure.ownerContentTypeObservablePart((data) => data?.compositions);
// Document type specific:
this.allowedTemplateIds = this.structure.ownerContentTypeObservablePart((data) => data?.allowedTemplateIds);
this.defaultTemplateId = this.structure.ownerContentTypeObservablePart((data) => data?.defaultTemplateId);
this.cleanup = this.structure.ownerContentTypeObservablePart((data) => data?.defaultTemplateId);
this.allowedTemplateIds = this.structure.ownerContentTypeObservablePart((data) => data?.allowedTemplates);
this.defaultTemplateId = this.structure.ownerContentTypeObservablePart((data) => data?.defaultTemplate);
this.cleanup = this.structure.ownerContentTypeObservablePart((data) => data?.defaultTemplate);
}
getIsSorting() {
@@ -112,19 +109,19 @@ export class UmbDocumentTypeWorkspaceContext
setIsElement(isElement: boolean) {
this.structure.updateOwnerContentType({ isElement });
}
setAllowedContentTypes(allowedContentTypes: Array<ContentTypeSortModel>) {
setAllowedContentTypes(allowedContentTypes: Array<UmbContentTypeSortModel>) {
this.structure.updateOwnerContentType({ allowedContentTypes });
}
setCompositions(compositions: Array<ContentTypeCompositionModel>) {
setCompositions(compositions: Array<UmbContentTypeCompositionModel>) {
this.structure.updateOwnerContentType({ compositions });
}
// Document type specific:
setAllowedTemplateIds(allowedTemplateIds: Array<string>) {
this.structure.updateOwnerContentType({ allowedTemplateIds });
setAllowedTemplateIds(allowedTemplates: Array<string>) {
this.structure.updateOwnerContentType({ allowedTemplates });
}
setDefaultTemplateId(defaultTemplateId: string) {
this.structure.updateOwnerContentType({ defaultTemplateId });
setDefaultTemplateId(defaultTemplate: string) {
this.structure.updateOwnerContentType({ defaultTemplate });
}
async create(parentUnique: string | null) {

View File

@@ -31,7 +31,7 @@ export class UmbDocumentTypeWorkspaceViewTemplatesElement extends UmbLitElement
this.#workspaceContext.defaultTemplateId,
(defaultTemplateId) => {
const oldValue = this._defaultTemplateId;
this._defaultTemplateId = defaultTemplateId;
this._defaultTemplate = defaultTemplateId;
this.requestUpdate('_defaultTemplateId', oldValue);
},
'defaultTemplate',

View File

@@ -1,16 +1,11 @@
import { UmbDocumentItemRepository } from '../../repository/index.js';
import type { PropertyValueMap } from '@umbraco-cms/backoffice/external/lit';
import { css, html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit';
import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui';
import type {
UmbModalManagerContext} from '@umbraco-cms/backoffice/modal';
import {
UMB_MODAL_MANAGER_CONTEXT,
UMB_CONFIRM_MODAL,
UMB_DOCUMENT_PICKER_MODAL,
} from '@umbraco-cms/backoffice/modal';
import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal';
import { UMB_MODAL_MANAGER_CONTEXT, UMB_CONFIRM_MODAL, UMB_DOCUMENT_PICKER_MODAL } from '@umbraco-cms/backoffice/modal';
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
import type { DocumentItemResponseModel } from '@umbraco-cms/backoffice/backend-api';
import { UmbDocumentRepository } from '@umbraco-cms/backoffice/document';
import { UmbChangeEvent } from '@umbraco-cms/backoffice/event';
import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api';
import { splitStringToArray } from '@umbraco-cms/backoffice/utils';
@@ -37,7 +32,7 @@ export class UmbInputDocumentGranularPermissionElement extends FormControlMixin(
@state()
private _items?: Array<DocumentItemResponseModel>;
#documentRepository = new UmbDocumentRepository(this);
#documentItemRepository = new UmbDocumentItemRepository(this);
#modalContext?: UmbModalManagerContext;
#pickedItemsObserver?: UmbObserverController<Array<DocumentItemResponseModel>>;
@@ -58,7 +53,7 @@ export class UmbInputDocumentGranularPermissionElement extends FormControlMixin(
async #observePickedDocuments() {
this.#pickedItemsObserver?.destroy();
const { asObservable } = await this.#documentRepository.requestItems(this._selectedIds);
const { asObservable } = await this.#documentItemRepository.requestItems(this._selectedIds);
this.#pickedItemsObserver = this.observe(asObservable(), (items) => (this._items = items));
}

View File

@@ -140,7 +140,7 @@ export class UmbInputDocumentElement extends FormControlMixin(UmbLitElement) {
#pickableFilter: (item: DocumentTreeItemResponseModel) => boolean = (item) => {
if (this.allowedContentTypeIds && this.allowedContentTypeIds.length > 0) {
return this.allowedContentTypeIds.includes(item.contentTypeId);
return this.allowedContentTypeIds.includes(item.documentType.id);
}
return true;
};

View File

@@ -46,19 +46,14 @@ const getChildrenOf = (parentUnique: string | null) => {
const mapper = (item: DocumentTreeItemResponseModel): UmbDocumentTreeItemModel => {
return {
unique: item.id,
parentUnique: item.parentId ? item.parentId : null,
name: item.name,
parentUnique: item.parent ? item.parent.id : null,
entityType: UMB_DOCUMENT_ENTITY_TYPE,
noAccess: item.noAccess,
isTrashed: item.isTrashed,
isContainer: item.isContainer,
hasChildren: item.hasChildren,
isProtected: item.isProtected,
isPublished: item.isPublished,
isEdited: item.isEdited,
contentTypeId: item.contentTypeId,
documentType: item.documentType,
variants: item.variants,
icon: item.icon,
isFolder: false,
};
};

View File

@@ -1,5 +1,5 @@
import { UmbDocumentEntityType } from './entity.js';
import { ContentStateModel, ContentUrlInfoModel, DocumentValueModel } from '@umbraco-cms/backoffice/backend-api';
import type { UmbDocumentEntityType } from './entity.js';
import type { ContentStateModel, ContentUrlInfoModel, DocumentValueModel } from '@umbraco-cms/backoffice/backend-api';
export interface UmbDocumentDetailModel {
contentTypeId: string;

View File

@@ -1,7 +1,7 @@
import { UmbDocumentRepository } from '../repository/document.repository.js';
import { UmbDocumentTypeDetailRepository } from '../../document-types/repository/detail/document-type-detail.repository.js';
import { UmbDocumentPropertyDataContext } from '../property-dataset-context/document-property-dataset-context.js';
import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js';
import { UmbDocumentDetailRepository } from '../repository/index.js';
import { UmbVariantId } from '@umbraco-cms/backoffice/variant';
import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type';
import {
@@ -20,7 +20,7 @@ export class UmbDocumentWorkspaceContext
implements UmbVariantableWorkspaceContextInterface, UmbPublishableWorkspaceContextInterface
{
//
public readonly repository: UmbDocumentRepository = new UmbDocumentRepository(this);
public readonly repository: UmbDocumentDetailRepository = new UmbDocumentDetailRepository(this);
/**
* The document is the current state/draft version of the document.
*/
@@ -31,11 +31,11 @@ export class UmbDocumentWorkspaceContext
}
readonly unique = this.#currentData.asObservablePart((data) => data?.id);
readonly contentTypeId = this.#currentData.asObservablePart((data) => data?.contentTypeId);
readonly contentTypeId = this.#currentData.asObservablePart((data) => data?.documentType.id);
readonly variants = this.#currentData.asObservablePart((data) => data?.variants || []);
readonly urls = this.#currentData.asObservablePart((data) => data?.urls || []);
readonly templateId = this.#currentData.asObservablePart((data) => data?.templateId || null);
readonly templateId = this.#currentData.asObservablePart((data) => data?.template?.id || null);
readonly structure = new UmbContentTypePropertyStructureManager(this, new UmbDocumentTypeDetailRepository(this));
readonly splitView = new UmbWorkspaceSplitViewManager();
@@ -51,8 +51,8 @@ export class UmbDocumentWorkspaceContext
*/
}
async load(entityId: string) {
this.#getDataPromise = this.repository.requestById(entityId);
async load(unique: string) {
this.#getDataPromise = this.repository.requestByUnique(unique);
const { data } = await this.#getDataPromise;
if (!data) return undefined;
@@ -62,8 +62,8 @@ export class UmbDocumentWorkspaceContext
return data || undefined;
}
async create(documentTypeKey: string, parentId: string | null) {
this.#getDataPromise = this.repository.createScaffold(documentTypeKey, { parentId });
async create(unique: string, parentUnique: string | null) {
this.#getDataPromise = this.repository.createScaffold(unique, { parentUnique });
const { data } = await this.#getDataPromise;
if (!data) return undefined;
@@ -91,7 +91,7 @@ export class UmbDocumentWorkspaceContext
}
getContentTypeId() {
return this.getData()?.contentTypeId;
return this.getData()?.documentType.id;
}
variantById(variantId: UmbVariantId) {

View File

@@ -8,7 +8,10 @@ import { UmbContentTypePropertyStructureHelper } from '@umbraco-cms/backoffice/c
import type { UmbSorterConfig } from '@umbraco-cms/backoffice/sorter';
import { UmbSorterController } from '@umbraco-cms/backoffice/sorter';
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
import type { MediaTypePropertyTypeResponseModel, PropertyTypeModelBaseModel } from '@umbraco-cms/backoffice/backend-api';
import type {
MediaTypePropertyTypeResponseModel,
PropertyTypeModelBaseModel,
} from '@umbraco-cms/backoffice/backend-api';
import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace';
import { UMB_PROPERTY_SETTINGS_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal';
@@ -172,18 +175,18 @@ export class UmbMediaTypeWorkspaceViewEditPropertiesElement extends UmbLitElemen
return html`<div id="property-list">
${repeat(
this._propertyStructure,
(property) => property.id ?? '' + property.containerId ?? '' + property.sortOrder ?? '',
(property) => property.id ?? '' + property.container.id ?? '' + property.sortOrder ?? '',
(property) => {
// Note: This piece might be moved into the property component
const inheritedFromMedia = this._ownerMediaTypes?.find(
(types) => types.containers?.find((containers) => containers.id === property.containerId),
(types) => types.containers?.find((containers) => containers.id === property.container.id),
);
return html`<umb-media-type-workspace-view-edit-property
data-umb-property-id=${ifDefined(property.id)}
owner-media-type-id=${ifDefined(inheritedFromMedia?.unique)}
owner-media-type-name=${ifDefined(inheritedFromMedia?.name)}
?inherited=${property.containerId !== this.containerId}
?inherited=${property.container.id !== this.containerId}
?sort-mode-active=${this._sortModeActive}
.property=${property}
@partial-property-update=${(event: CustomEvent) => {

View File

@@ -1,10 +1,9 @@
import { UmbDataTypeDetailRepository } from '@umbraco-cms/backoffice/data-type';
import type { UUIInputElement} from '@umbraco-cms/backoffice/external/uui';
import type { UUIInputElement } from '@umbraco-cms/backoffice/external/uui';
import { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui';
import { css, html, customElement, property, state, ifDefined, nothing } from '@umbraco-cms/backoffice/external/lit';
import type { PropertyTypeModelBaseModel } from '@umbraco-cms/backoffice/backend-api';
import type {
UmbConfirmModalData} from '@umbraco-cms/backoffice/modal';
import type { UmbConfirmModalData } from '@umbraco-cms/backoffice/modal';
import {
UMB_CONFIRM_MODAL,
UMB_MODAL_MANAGER_CONTEXT,
@@ -38,7 +37,7 @@ export class UmbMediaTypeWorkspacePropertyElement extends UmbLitElement {
const oldValue = this._property;
this._property = value;
this.#modalRegistration.setUniquePathValue('propertyId', value?.id?.toString());
this.setDataType(this._property?.dataTypeId);
this.setDataType(this._property?.dataType.id);
this.requestUpdate('property', oldValue);
}

View File

@@ -6,7 +6,7 @@ import { UmbContentTypeContainerStructureHelper } from '@umbraco-cms/backoffice/
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
import type { PropertyTypeContainerModelBaseModel } from '@umbraco-cms/backoffice/backend-api';
import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace';
import type { UmbSorterConfig} from '@umbraco-cms/backoffice/sorter';
import type { UmbSorterConfig } from '@umbraco-cms/backoffice/sorter';
import { UmbSorterController } from '@umbraco-cms/backoffice/sorter';
import './media-type-workspace-view-edit-properties.element.js';
@@ -172,7 +172,11 @@ export class UmbMediaTypeWorkspaceViewEditTabElement extends UmbLitElement {
value=${group.name ?? ''}
@change=${(e: InputEvent) => {
const newName = (e.target as HTMLInputElement).value;
this._groupStructureHelper.updateContainerName(group.id!, group.parentId ?? null, newName);
this._groupStructureHelper.updateContainerName(
group.id!,
group.parent?.id ?? null,
newName,
);
}}>
</uui-input>
</div>

View File

@@ -3,19 +3,18 @@ import { localizePropertyType, localizeSort } from './utils.js';
import type { UmbQueryBuilderFilterElement } from './query-builder-filter.element.js';
import type { UUIComboboxListElement } from '@umbraco-cms/backoffice/external/uui';
import { css, html, customElement, state, query, queryAll, ifDefined } from '@umbraco-cms/backoffice/external/lit';
import type {
UmbModalManagerContext} from '@umbraco-cms/backoffice/modal';
import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal';
import {
UmbModalBaseElement,
UMB_DOCUMENT_PICKER_MODAL,
UMB_MODAL_MANAGER_CONTEXT
UMB_MODAL_MANAGER_CONTEXT,
} from '@umbraco-cms/backoffice/modal';
import type {
TemplateQueryExecuteModel,
TemplateQueryResultResponseModel,
TemplateQuerySettingsResponseModel,
} from '@umbraco-cms/backoffice/backend-api';
import { UmbDocumentRepository } from '@umbraco-cms/backoffice/document';
import { UmbDocumentItemRepository } from '@umbraco-cms/backoffice/document';
import './query-builder-filter.element.js';
export interface TemplateQueryBuilderModalData {
@@ -57,14 +56,14 @@ export default class UmbChooseInsertTypeModalElement extends UmbModalBaseElement
@state()
private _defaultSortDirection: SortOrder = SortOrder.Ascending;
#documentRepository: UmbDocumentRepository;
#documentItemRepository: UmbDocumentItemRepository;
#modalManagerContext?: UmbModalManagerContext;
#templateRepository: UmbTemplateRepository;
constructor() {
super();
this.#templateRepository = new UmbTemplateRepository(this);
this.#documentRepository = new UmbDocumentRepository(this);
this.#documentItemRepository = new UmbDocumentItemRepository(this);
this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => {
this.#modalManagerContext = instance;
@@ -127,7 +126,7 @@ export default class UmbChooseInsertTypeModalElement extends UmbModalBaseElement
};
async #getDocumentItem(ids: string[]) {
const { data, error } = await this.#documentRepository.requestItems(ids);
const { data, error } = await this.#documentItemRepository.requestItems(ids);
if (data) {
this._selectedRootContentName = data[0].name;
}

View File

@@ -21,7 +21,6 @@ export class UmbTemplateTreeRepository
name: 'Templates',
icon: 'icon-folder',
hasChildren: true,
isContainer: false,
isFolder: true,
};

View File

@@ -14,7 +14,7 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
* @implements {UmbTreeDataSource}
*/
export class UmbTemplateTreeServerDataSource extends UmbTreeServerDataSourceBase<
EntityTreeItemResponseModel,
NamedEntityTreeItemResponseModel,
UmbTemplateTreeItemModel
> {
/**