From dfe0f52965fa2a1809e6bd6c308351fb929b15c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20M=C3=B8ller=20Jensen?= <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 20 Nov 2023 22:20:13 +1300 Subject: [PATCH] fix merge --- .../entity-actions/create/manifests.ts | 10 +- .../detail/media-type-detail.repository.ts | 11 +- .../detail/media-type.server.data.ts | 147 ++++++++++++++++++ .../tree/media-type-tree.repository.ts | 4 +- .../media/media-types/workspace/manifests.ts | 4 +- .../workspace/media-type-workspace.context.ts | 16 +- 6 files changed, 166 insertions(+), 26 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/detail/media-type.server.data.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/create/manifests.ts index cb4410d7e5..f8af53e68f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/create/manifests.ts @@ -1,4 +1,8 @@ -import { MEDIA_TYPE_ENTITY_TYPE, MEDIA_TYPE_FOLDER_ENTITY_TYPE, MEDIA_TYPE_ROOT_ENTITY_TYPE } from '../../index.js'; +import { + UMB_MEDIA_TYPE_ENTITY_TYPE, + MEDIA_TYPE_FOLDER_ENTITY_TYPE, + UMB_MEDIA_TYPE_ROOT_ENTITY_TYPE, +} from '../../index.js'; import { MEDIA_TYPE_DETAIL_REPOSITORY_ALIAS } from '../../repository/index.js'; import { UmbCreateMediaTypeEntityAction } from './create.action.js'; import { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; @@ -14,14 +18,14 @@ const entityActions: Array = [ icon: 'icon-add', label: 'Create...', repositoryAlias: MEDIA_TYPE_DETAIL_REPOSITORY_ALIAS, - entityTypes: [MEDIA_TYPE_ENTITY_TYPE, MEDIA_TYPE_ROOT_ENTITY_TYPE, MEDIA_TYPE_FOLDER_ENTITY_TYPE], + entityTypes: [UMB_MEDIA_TYPE_ENTITY_TYPE, UMB_MEDIA_TYPE_ROOT_ENTITY_TYPE, MEDIA_TYPE_FOLDER_ENTITY_TYPE], }, }, { type: 'modal', alias: 'Umb.Modal.MediaTypeCreateOptions', name: 'Media Type Create Options Modal', - loader: () => import('./modal/media-type-create-options-modal.element.js'), + js: () => import('./modal/media-type-create-options-modal.element.js'), }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/detail/media-type-detail.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/detail/media-type-detail.repository.ts index 11f09fa0ed..987ad2957f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/detail/media-type-detail.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/detail/media-type-detail.repository.ts @@ -76,7 +76,7 @@ export class UmbMediaTypeDetailRepository if (!id) throw new Error('Id is missing'); await this.#init; - const { data, error } = await this.#detailDataSource.get(id); + const { data, error } = await this.#detailDataSource.read(id); if (data) { this.#detailStore?.append(data); @@ -91,20 +91,13 @@ export class UmbMediaTypeDetailRepository return this.#detailStore!.byId(id); } - // TODO: we need to figure out where to put this - async requestAllowedChildTypesOf(id: string) { - if (!id) throw new Error('Id is missing'); - await this.#init; - return this.#detailDataSource.getAllowedChildrenOf(id); - } - // Could potentially be general methods: async create(mediaType: ItemType) { if (!mediaType || !mediaType.id) throw new Error('Media Type is missing'); await this.#init; - const { error } = await this.#detailDataSource.insert(mediaType); + const { error } = await this.#detailDataSource.create(mediaType); if (!error) { this.#detailStore?.append(mediaType); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/detail/media-type.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/detail/media-type.server.data.ts new file mode 100644 index 0000000000..0e4d12fe2c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/detail/media-type.server.data.ts @@ -0,0 +1,147 @@ +import type { UmbDataSource } from '@umbraco-cms/backoffice/repository'; +import { + CreateMediaTypeRequestModel, + MediaTypeResource, + MediaTypeResponseModel, + UpdateMediaTypeRequestModel, +} from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; +import { UmbId } from '@umbraco-cms/backoffice/id'; + +/** + * A data source for the Media Type that fetches data from the server + * @export + * @class UmbMediaTypeServerDataSource + * @implements {RepositoryDetailDataSource} + */ +export class UmbMediaTypeServerDataSource + implements UmbDataSource +{ + #host: UmbControllerHost; + + /** + * Creates an instance of UmbMediaServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbMediaServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Fetches a Media with the given id from the server + * @param {string} id + * @return {*} + * @memberof UmbMediaTypeServerDataSource + */ + async read(id: string) { + if (!id) { + throw new Error('Id is missing'); + } + + return tryExecuteAndNotify( + this.#host, + MediaTypeResource.getMediaTypeById({ + id: id, + }), + ); + } + + /** + * Creates a new Media scaffold + * @param {(string | null)} parentId + * @return {*} + * @memberof UmbMediaTypeServerDataSource + */ + async createScaffold(parentId: string | null) { + //, parentId: string | null + const data: MediaTypeResponseModel = { + id: UmbId.new(), + //parentId: parentId, + name: '', + alias: '', + description: '', + icon: 'icon-picture', + allowedAsRoot: false, + variesByCulture: false, + variesBySegment: false, + isElement: false, + allowedContentTypes: [], + compositions: [], + properties: [], + containers: [], + }; + + return { data }; + } + + /** + * Creates a new Media Type on the server + * @param {CreateMediaTypeRequestModel} mediaType + * @return {*} + * @memberof UmbMediaTypeServerDataSource + */ + async create(mediaType: CreateMediaTypeRequestModel) { + if (!mediaType) throw new Error('Media Type is missing'); + return tryExecuteAndNotify( + this.#host, + MediaTypeResource.postMediaType({ + requestBody: mediaType, + }), + ); + } + + /** + * Updates a Media Type on the server + * @param {string} id + * @param {Media} mediaType + * @return {*} + * @memberof UmbMediaTypeServerDataSource + */ + async update(id: string, mediaType: UpdateMediaTypeRequestModel) { + if (!id) throw new Error('Id is missing'); + + mediaType = { ...mediaType }; + + // TODO: Hack to remove some props that ruins the media-type post end-point. + (mediaType as any).id = undefined; + + return tryExecuteAndNotify(this.#host, MediaTypeResource.putMediaTypeById({ id, requestBody: mediaType })); + } + + /** + * Deletes a Template on the server + * @param {string} id + * @return {*} + * @memberof UmbMediaTypeServerDataSource + */ + async delete(id: string) { + if (!id) { + throw new Error('Id is missing'); + } + + // TODO: Hack the type to avoid type-error here: + return tryExecuteAndNotify(this.#host, MediaTypeResource.deleteMediaTypeById({ id })) as any; + } + + /** + * Get the allowed media types for a given parent id + * @param {string} id + * @return {*} + * @memberof UmbMediaTypeServerDataSource + */ + async getAllowedChildrenOf(id: string) { + if (!id) throw new Error('Id is missing'); + + return tryExecuteAndNotify( + this.#host, + fetch(`/umbraco/management/api/v1/media-type/allowed-children-of/${id}`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }).then((res) => res.json()), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.repository.ts index 8096edbcf6..68258e60f7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.repository.ts @@ -1,4 +1,4 @@ -import { MEDIA_TYPE_ROOT_ENTITY_TYPE } from '../index.js'; +import { UMB_MEDIA_TYPE_ROOT_ENTITY_TYPE } from '../index.js'; import { UmbMediaTypeTreeServerDataSource } from './media-type.tree.server.data-source.js'; import { UMB_MEDIA_TYPE_TREE_STORE_CONTEXT } from './media-type.tree.store.js'; import { UmbMediaTypeTreeItemModel, UmbMediaTypeTreeRootModel } from './types.js'; @@ -17,7 +17,7 @@ export class UmbMediaTypeTreeRepository async requestTreeRoot() { const data = { id: null, - type: MEDIA_TYPE_ROOT_ENTITY_TYPE, + type: UMB_MEDIA_TYPE_ROOT_ENTITY_TYPE, name: 'Media Types', icon: 'icon-folder', hasChildren: true, diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/manifests.ts index f4533f6825..729234545a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/manifests.ts @@ -22,7 +22,7 @@ const workspaceEditorViews: Array = [ type: 'workspaceEditorView', alias: 'Umb.WorkspaceView.MediaType.Design', name: 'Media Type Workspace Design View', - loader: () => import('./views/design/media-type-workspace-view-edit.element.js'), + js: () => import('./views/design/media-type-workspace-view-edit.element.js'), weight: 1000, meta: { label: 'Design', @@ -40,7 +40,7 @@ const workspaceEditorViews: Array = [ type: 'workspaceEditorView', alias: 'Umb.WorkspaceView.MediaType.Structure', name: 'Media Type Workspace Structure View', - loader: () => import('./views/structure/media-type-workspace-view-structure.element.js'), + js: () => import('./views/structure/media-type-workspace-view-structure.element.js'), weight: 800, meta: { label: 'Structure', diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts index 253f4b18a2..650b0eb401 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace.context.ts @@ -1,21 +1,17 @@ -import { UmbMediaTypeRepository } from '../repository/media-type.repository.js'; -import { UmbSaveableWorkspaceContextInterface, UmbEditableWorkspaceContextBase } from '@umbraco-cms/backoffice/workspace'; import { UmbMediaTypeDetailRepository } from '../repository/detail/media-type-detail.repository.js'; +import { + UmbSaveableWorkspaceContextInterface, + UmbEditableWorkspaceContextBase, +} from '@umbraco-cms/backoffice/workspace'; import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type'; -import { UmbWorkspaceContext, UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; -import type { - ContentTypeCompositionModel, - ContentTypeSortModel, - MediaTypeResponseModel, -} from '@umbraco-cms/backoffice/backend-api'; +import { type MediaTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; type EntityType = MediaTypeResponseModel; export class UmbMediaTypeWorkspaceContext - extends UmbEditableWorkspaceContextBase - extends UmbWorkspaceContext + extends UmbEditableWorkspaceContextBase implements UmbSaveableWorkspaceContextInterface { // Draft is located in structure manager