From f6c72a99eb7c33bc9b22f612b015da208a3c64b7 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Tue, 9 Apr 2024 12:36:45 +0200 Subject: [PATCH] document blueprint action, use documentblueprintresource --- ...ent-blueprint-detail.server.data-source.ts | 29 ++--- .../documents/document-blueprints/types.ts | 3 - .../entity-actions/create-blueprint.action.ts | 15 --- .../create-blueprint.action.ts | 23 ++++ .../entity-actions/create-blueprint/index.ts | 1 + .../create-blueprint/manifests.ts | 29 +++++ .../modal/create-blueprint-modal.element.ts | 114 ++++++++++++++++++ .../modal/create-blueprint-modal.token.ts | 15 +++ .../create-blueprint/modal/index.ts | 2 + .../documents/entity-actions/manifests.ts | 15 +-- 10 files changed, 196 insertions(+), 50 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint.action.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/create-blueprint.action.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.server.data-source.ts index 3cfc56e569..13671e4eb2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.server.data-source.ts @@ -1,4 +1,4 @@ -import type { UmbDocumentBlueprintDetailModel, UmbDocumentBlueprintVariantModel } from '../../types.js'; +import type { UmbDocumentBlueprintDetailModel } from '../../types.js'; import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../../entity.js'; import { UmbId } from '@umbraco-cms/backoffice/id'; import type { UmbDetailDataSource } from '@umbraco-cms/backoffice/repository'; @@ -6,7 +6,7 @@ import type { CreateDocumentRequestModel, UpdateDocumentRequestModel, } from '@umbraco-cms/backoffice/external/backend-api'; -import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentBlueprintResource } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -37,13 +37,10 @@ export class UmbDocumentBlueprintServerDataSource implements UmbDetailDataSource const data: UmbDocumentBlueprintDetailModel = { entityType: UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, unique: UmbId.new(), - urls: [], - template: null, documentType: { unique: '', collection: null, }, - isTrashed: false, values: [], variants: [], ...preset, @@ -80,7 +77,10 @@ export class UmbDocumentBlueprintServerDataSource implements UmbDetailDataSource async read(unique: string) { if (!unique) throw new Error('Unique is missing'); - const { data, error } = await tryExecuteAndNotify(this.#host, DocumentResource.getDocumentById({ id: unique })); + const { data, error } = await tryExecuteAndNotify( + this.#host, + DocumentBlueprintResource.getDocumentBlueprintById({ id: unique }), + ); if (error || !data) { return { error }; @@ -109,18 +109,10 @@ export class UmbDocumentBlueprintServerDataSource implements UmbDetailDataSource updateDate: variant.updateDate, }; }), - urls: data.urls.map((url) => { - return { - culture: url.culture || null, - url: url.url, - }; - }), - template: data.template ? { unique: data.template.id } : null, documentType: { unique: data.documentType.id, collection: data.documentType.collection ? { unique: data.documentType.collection.id } : null, }, - isTrashed: data.isTrashed, }; return { data: document }; @@ -141,14 +133,14 @@ export class UmbDocumentBlueprintServerDataSource implements UmbDetailDataSource id: model.unique, parent: parentUnique ? { id: parentUnique } : null, documentType: { id: model.documentType.unique }, - template: model.template ? { id: model.template.unique } : null, + values: model.values, variants: model.variants, }; const { data, error } = await tryExecuteAndNotify( this.#host, - DocumentResource.postDocument({ + DocumentBlueprintResource.postDocumentBlueprint({ requestBody, }), ); @@ -171,14 +163,13 @@ export class UmbDocumentBlueprintServerDataSource implements UmbDetailDataSource // TODO: make data mapper to prevent errors const requestBody: UpdateDocumentRequestModel = { - template: model.template ? { id: model.template.unique } : null, values: model.values, variants: model.variants, }; const { error } = await tryExecuteAndNotify( this.#host, - DocumentResource.putDocumentById({ + DocumentBlueprintResource.putDocumentBlueprintById({ id: model.unique, requestBody, }), @@ -201,6 +192,6 @@ export class UmbDocumentBlueprintServerDataSource implements UmbDetailDataSource if (!unique) throw new Error('Unique is missing'); // TODO: update to delete when implemented - return tryExecuteAndNotify(this.#host, DocumentResource.putDocumentByIdMoveToRecycleBin({ id: unique })); + return tryExecuteAndNotify(this.#host, DocumentBlueprintResource.deleteDocumentBlueprintById({ id: unique })); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/types.ts index 4cb2c496f1..09965e112f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/types.ts @@ -10,10 +10,7 @@ export interface UmbDocumentBlueprintDetailModel { collection: UmbReferenceByUnique | null; }; entityType: UmbDocumentBlueprintEntityType; - isTrashed: boolean; - template: { unique: string } | null; unique: string; - urls: Array; values: Array; variants: Array; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint.action.ts deleted file mode 100644 index dac438922f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint.action.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action'; -import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; - -export class UmbCreateDocumentBlueprintEntityAction extends UmbEntityActionBase { - constructor(host: UmbControllerHost, args: UmbEntityActionArgs) { - super(host, args); - } - - async execute() { - console.log(`execute for: ${this.args.unique}`); - //await this.repository?.createBlueprint(); - } -} -export default UmbCreateDocumentBlueprintEntityAction; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/create-blueprint.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/create-blueprint.action.ts new file mode 100644 index 0000000000..6bf9bec25d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/create-blueprint.action.ts @@ -0,0 +1,23 @@ +import { UMB_CREATE_BLUEPRINT_MODAL } from './modal/create-blueprint-modal.token.js'; +import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action'; +import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; +import { UmbDocumentBlueprintDetailRepository } from '@umbraco-cms/backoffice/document-blueprint'; + +export class UmbCreateDocumentBlueprintEntityAction extends UmbEntityActionBase { + #repository = new UmbDocumentBlueprintDetailRepository(this); + + constructor(host: UmbControllerHost, args: UmbEntityActionArgs) { + super(host, args); + } + + async execute() { + const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + const modalContext = modalManager.open(this, UMB_CREATE_BLUEPRINT_MODAL, { + data: { unique: this.args.unique }, + }); + await modalContext.onSubmit().catch(() => undefined); + } +} +export default UmbCreateDocumentBlueprintEntityAction; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/index.ts new file mode 100644 index 0000000000..28d9f38fba --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/index.ts @@ -0,0 +1 @@ +export * from './modal/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts new file mode 100644 index 0000000000..3de8559c0a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts @@ -0,0 +1,29 @@ +import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +const entityActions: Array = [ + { + type: 'entityAction', + kind: 'default', + alias: 'Umb.EntityAction.Document.CreateBlueprint', + name: 'Create Document Blueprint Entity Action', + weight: 1000, + api: () => import('./create-blueprint.action.js'), + forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], + meta: { + icon: 'icon-blueprint', + label: 'Create Content Template', + }, + }, +]; + +const manifestModals: Array = [ + { + type: 'modal', + alias: 'Umb.Modal.CreateBlueprint', + name: 'Create Blueprint Modal', + js: () => import('./modal/create-blueprint-modal.element.js'), + }, +]; + +export const manifests = [...entityActions, ...manifestModals]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.element.ts new file mode 100644 index 0000000000..b4e55bb144 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.element.ts @@ -0,0 +1,114 @@ +import { UmbDocumentDetailRepository } from '../../../repository/index.js'; +import type { UmbCreateBlueprintModalData } from './create-blueprint-modal.token.js'; +import { html, customElement, css, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; +import type { UmbDocumentDetailModel } from '@umbraco-cms/backoffice/document'; +import { + type UmbDocumentBlueprintDetailModel, + UmbDocumentBlueprintDetailRepository, +} from '@umbraco-cms/backoffice/document-blueprint'; +import type { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; + +@customElement('umb-create-blueprint-modal') +export class UmbCreateBlueprintModalElement extends UmbModalBaseElement { + #blueprintRepository = new UmbDocumentBlueprintDetailRepository(this); + #documentRepository = new UmbDocumentDetailRepository(this); + + #documentUnique = ''; + #document?: UmbDocumentDetailModel; + + @state() + private _documentName = ''; + + @state() + private _blueprintName = ''; + + firstUpdated() { + this.#documentUnique = this.data?.unique ?? ''; + this.#getDocumentData(); + } + + async #getDocumentData() { + const { data } = await this.#documentRepository.requestByUnique(this.#documentUnique); + if (!data) return; + + this.#document = data; + this._documentName = data.variants[0].name; + this._blueprintName = data.variants[0].name; + } + + #mapDocumentToBlueprintModel() { + if (!this.#document) return; + const variants = { ...this.#document?.variants, name: this._blueprintName }; + const model: UmbDocumentBlueprintDetailModel = { ...this.#document, entityType: 'document-blueprint', variants }; + + return model; + } + + async #handleSave() { + const model = this.#mapDocumentToBlueprintModel(); + if (!model) return; + const { error } = await this.#blueprintRepository.create(model, null); + console.log('error', error); + this.modalContext?.submit(); + } + + #renderBlueprintName() { + return html`Create a new Content Template from ${this._documentName} + A Content Template is predefined content that an editor can select to use as the basis for creating new content . + Name + (this._blueprintName = e.target.value as string)}>`; + } + + render() { + return html` + + ${this.#renderBlueprintName()} + + + + `; + } + + #handleClose() { + this.modalContext?.reject(); + } + + static styles = [ + UmbTextStyles, + css` + strong, + uui-label, + uui-input { + display: block; + } + + uui-label { + margin-top: var(--uui-size-space-6); + } + `, + ]; +} + +export default UmbCreateBlueprintModalElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-create-blueprint-modal': UmbCreateBlueprintModalElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.token.ts new file mode 100644 index 0000000000..dbd009afca --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.token.ts @@ -0,0 +1,15 @@ +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export interface UmbCreateBlueprintModalData { + unique: string | null; +} + +export const UMB_CREATE_BLUEPRINT_MODAL = new UmbModalToken( + 'Umb.Modal.CreateBlueprint', + { + modal: { + type: 'sidebar', + size: 'small', + }, + }, +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/index.ts new file mode 100644 index 0000000000..9f1d8090a6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/index.ts @@ -0,0 +1,2 @@ +export * from './create-blueprint-modal.token.js'; +export * from './create-blueprint-modal.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts index 3d5c84ca4c..8de4f5b9f6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts @@ -2,6 +2,7 @@ import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS } from '../repository/index.js'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; import { UMB_DOCUMENT_PICKER_MODAL } from '../modals/index.js'; import { manifests as createManifests } from './create/manifests.js'; +import { manifests as createBlueprintManifests } from './create-blueprint/manifests.js'; import { manifests as publicAccessManifests } from './public-access/manifests.js'; import { manifests as cultureAndHostnamesManifests } from './culture-and-hostnames/manifests.js'; import { manifests as sortChildrenOfManifests } from './sort-children-of/manifests.js'; @@ -21,19 +22,6 @@ const entityActions: Array = [ pickerModalAlias: UMB_DOCUMENT_PICKER_MODAL, }, }, - { - type: 'entityAction', - kind: 'default', - alias: 'Umb.EntityAction.Document.CreateBlueprint', - name: 'Create Document Blueprint Entity Action', - weight: 1000, - api: () => import('./create-blueprint.action.js'), - forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], - meta: { - icon: 'icon-blueprint', - label: 'Create Document Blueprint (TBD)', - }, - }, { type: 'entityAction', alias: 'Umb.EntityAction.Document.Move', @@ -116,6 +104,7 @@ const entityActions: Array = [ export const manifests = [ ...createManifests, + ...createBlueprintManifests, ...publicAccessManifests, ...cultureAndHostnamesManifests, ...sortChildrenOfManifests,