create a blueprint

This commit is contained in:
Lone Iversen
2024-04-11 13:03:15 +02:00
parent 2beec6649e
commit 5b8f61b8d4
8 changed files with 101 additions and 28 deletions

View File

@@ -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<never> {
#repository = new UmbDocumentBlueprintDetailRepository(this);
#repository = new UmbDocumentCreateBlueprintRepository(this);
constructor(host: UmbControllerHost, args: UmbEntityActionArgs<never>) {
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;

View File

@@ -1 +1,2 @@
export * from './modal/index.js';
export * from './repository/index.js';

View File

@@ -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<UmbCreateBlueprintModalData, never> {
#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<UmbCreat
this._blueprintName = data.variants[0].name;
}
#mapDocumentToBlueprintModel() {
if (!this.#document) return;
const variants = this.#document?.variants.map((variant) => ({ ...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();
}

View File

@@ -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<UmbCreateBlueprintModalData, never>(
export interface UmbCreateBlueprintModalValue {
name: string;
parent: ReferenceByIdModel | null;
}
export const UMB_CREATE_BLUEPRINT_MODAL = new UmbModalToken<UmbCreateBlueprintModalData, UmbCreateBlueprintModalValue>(
'Umb.Modal.CreateBlueprint',
{
modal: {

View File

@@ -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 };
}
}

View File

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

View File

@@ -0,0 +1,2 @@
export { UmbDocumentCreateBlueprintRepository } from './document-create-blueprint.repository.js';
export { UMB_DOCUMENT_CREATE_BLUEPRINT_REPOSITORY_ALIAS } from './manifests.js';

View File

@@ -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];