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 index 6bf9bec25d..8ae2d675ef 100644 --- 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 @@ -1,23 +1,31 @@ +import { UmbDocumentCreateBlueprintRepository } from './repository/document-create-blueprint.repository.js'; 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); + #repository = new UmbDocumentCreateBlueprintRepository(this); constructor(host: UmbControllerHost, args: UmbEntityActionArgs) { super(host, args); } async execute() { + if (!this.args.unique) throw new Error('Unique is required'); + 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); + + const { name, parent } = modalContext.getValue(); + if (!name) return; + + // TODO: Doesn't show the green popup on success? tryExecuteAndNotify is used in the repository. + await this.#repository.create({ name, parent, document: { id: this.args.unique } }); } } 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 index 28d9f38fba..e130217e61 100644 --- 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 @@ -1 +1,2 @@ export * from './modal/index.js'; +export * from './repository/index.js'; 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 index b099cb20af..8b7aa230a5 100644 --- 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 @@ -1,19 +1,16 @@ import { UmbDocumentDetailRepository } from '../../../repository/index.js'; -import type { UmbCreateBlueprintModalData } from './create-blueprint-modal.token.js'; +import type { UmbCreateBlueprintModalData, UmbCreateBlueprintModalValue } 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'; -import { UmbId } from '@umbraco-cms/backoffice/id'; @customElement('umb-create-blueprint-modal') -export class UmbCreateBlueprintModalElement extends UmbModalBaseElement { - #blueprintRepository = new UmbDocumentBlueprintDetailRepository(this); +export class UmbCreateBlueprintModalElement extends UmbModalBaseElement< + UmbCreateBlueprintModalData, + UmbCreateBlueprintModalValue +> { #documentRepository = new UmbDocumentDetailRepository(this); #documentUnique = ''; @@ -39,24 +36,8 @@ export class UmbCreateBlueprintModalElement extends UmbModalBaseElement ({ ...variant, name: this._blueprintName })); - const model: UmbDocumentBlueprintDetailModel = { - ...this.#document, - entityType: 'document-blueprint', - variants, - unique: UmbId.new(), - }; - - return model; - } - async #handleSave() { - const model = this.#mapDocumentToBlueprintModel(); - if (!model) return; - const { error } = await this.#blueprintRepository.create(model, null); - console.log('error', error); + this.value = { name: this._blueprintName, parent: null }; this.modalContext?.submit(); } 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 index dbd009afca..2001558eb1 100644 --- 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 @@ -1,10 +1,16 @@ +import type { ReferenceByIdModel } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; export interface UmbCreateBlueprintModalData { unique: string | null; } -export const UMB_CREATE_BLUEPRINT_MODAL = new UmbModalToken( +export interface UmbCreateBlueprintModalValue { + name: string; + parent: ReferenceByIdModel | null; +} + +export const UMB_CREATE_BLUEPRINT_MODAL = new UmbModalToken( 'Umb.Modal.CreateBlueprint', { modal: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/document-create-blueprint.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/document-create-blueprint.repository.ts new file mode 100644 index 0000000000..4169d61278 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/document-create-blueprint.repository.ts @@ -0,0 +1,28 @@ +import { UmbDocumentCreateBlueprintServerDataSource } from './document-create-blueprint.server.data-source.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; +import type { CreateDocumentBlueprintFromDocumentRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; + +export class UmbDocumentCreateBlueprintRepository extends UmbControllerBase implements UmbApi { + #dataSource = new UmbDocumentCreateBlueprintServerDataSource(this); + + #notificationContext?: typeof UMB_NOTIFICATION_CONTEXT.TYPE; + + constructor(host: UmbControllerHost) { + super(host); + + this.consumeContext(UMB_NOTIFICATION_CONTEXT, (instance) => { + this.#notificationContext = instance; + }); + } + + async create(requestBody: CreateDocumentBlueprintFromDocumentRequestModel) { + const { data, error } = await this.#dataSource.create(requestBody); + if (!error) { + return { data }; + } + return { error }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/document-create-blueprint.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/document-create-blueprint.server.data-source.ts new file mode 100644 index 0000000000..9d5ecff75f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/document-create-blueprint.server.data-source.ts @@ -0,0 +1,34 @@ +import { + DocumentBlueprintService, + type CreateDocumentBlueprintFromDocumentRequestModel, +} from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +/** + * A data source for the Document Create Blueprint that fetches data from the server + * @export + * @class UmbDocumentCreateBlueprintServerDataSource + * @implements {RepositoryDetailDataSource} + */ +export class UmbDocumentCreateBlueprintServerDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbDocumentCreateBlueprintServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbDocumentCreateBlueprintServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Fetches the Culture and Hostnames for the given Document unique + * @param {string} unique + * @memberof UmbDocumentCreateBlueprintServerDataSource + */ + async create(requestBody: CreateDocumentBlueprintFromDocumentRequestModel) { + return tryExecuteAndNotify(this.#host, DocumentBlueprintService.postDocumentBlueprintFromDocument({ requestBody })); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/index.ts new file mode 100644 index 0000000000..7e8dcb93a2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/index.ts @@ -0,0 +1,2 @@ +export { UmbDocumentCreateBlueprintRepository } from './document-create-blueprint.repository.js'; +export { UMB_DOCUMENT_CREATE_BLUEPRINT_REPOSITORY_ALIAS } from './manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/manifests.ts new file mode 100644 index 0000000000..f5635547e6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/repository/manifests.ts @@ -0,0 +1,13 @@ +import { UmbDocumentCreateBlueprintRepository } from './document-create-blueprint.repository.js'; +import type { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; + +export const UMB_DOCUMENT_CREATE_BLUEPRINT_REPOSITORY_ALIAS = 'Umb.Repository.Document.CreateBlueprint'; + +const repository: ManifestRepository = { + type: 'repository', + alias: UMB_DOCUMENT_CREATE_BLUEPRINT_REPOSITORY_ALIAS, + name: 'Document Create Blueprint Repository', + api: UmbDocumentCreateBlueprintRepository, +}; + +export const manifests = [repository];