Merge remote-tracking branch 'origin/release/15.4' into v15/dev

This commit is contained in:
Jacob Overgaard
2025-04-16 14:47:02 +02:00
12 changed files with 280 additions and 38 deletions

File diff suppressed because one or more lines are too long

View File

@@ -3523,6 +3523,12 @@ export type PutDocumentBlueprintByIdMoveData = {
export type PutDocumentBlueprintByIdMoveResponse = (string);
export type GetDocumentBlueprintByIdScaffoldData = {
id: string;
};
export type GetDocumentBlueprintByIdScaffoldResponse = ((DocumentBlueprintResponseModel));
export type PostDocumentBlueprintFolderData = {
requestBody?: (CreateFolderRequestModel);
};

View File

@@ -4,10 +4,23 @@ import { UMB_DOCUMENT_BLUEPRINT_DETAIL_STORE_CONTEXT } from './document-blueprin
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { UmbDetailRepositoryBase } from '@umbraco-cms/backoffice/repository';
export class UmbDocumentBlueprintDetailRepository extends UmbDetailRepositoryBase<UmbDocumentBlueprintDetailModel> {
export class UmbDocumentBlueprintDetailRepository extends UmbDetailRepositoryBase<
UmbDocumentBlueprintDetailModel,
UmbDocumentBlueprintServerDataSource
> {
constructor(host: UmbControllerHost) {
super(host, UmbDocumentBlueprintServerDataSource, UMB_DOCUMENT_BLUEPRINT_DETAIL_STORE_CONTEXT);
}
/**
* Gets an existing document blueprint by its unique identifier for scaffolding purposes, i.e. to create a new document based on an existing blueprint.
* @param {string} unique - The unique identifier of the document blueprint.
* @returns {UmbRepositoryResponse<UmbDocumentBlueprintDetailModel>} - The document blueprint data.
* @memberof UmbDocumentBlueprintDetailRepository
*/
scaffoldByUnique(unique: string) {
return this.detailDataSource.scaffoldByUnique(unique);
}
}
export { UmbDocumentBlueprintDetailRepository as api };

View File

@@ -1,9 +1,10 @@
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';
import type { UmbDataSourceResponse, UmbDetailDataSource } from '@umbraco-cms/backoffice/repository';
import type {
CreateDocumentBlueprintRequestModel,
DocumentBlueprintResponseModel,
UpdateDocumentBlueprintRequestModel,
} from '@umbraco-cms/backoffice/external/backend-api';
import { DocumentBlueprintService } from '@umbraco-cms/backoffice/external/backend-api';
@@ -74,7 +75,7 @@ export class UmbDocumentBlueprintServerDataSource implements UmbDetailDataSource
* @returns {*}
* @memberof UmbDocumentBlueprintServerDataSource
*/
async read(unique: string) {
async read(unique: string): Promise<UmbDataSourceResponse<UmbDocumentBlueprintDetailModel>> {
if (!unique) throw new Error('Unique is missing');
const { data, error } = await tryExecuteAndNotify(
@@ -86,35 +87,24 @@ export class UmbDocumentBlueprintServerDataSource implements UmbDetailDataSource
return { error };
}
// TODO: make data mapper to prevent errors
const document: UmbDocumentBlueprintDetailModel = {
entityType: UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE,
unique: data.id,
values: data.values.map((value) => {
return {
editorAlias: value.editorAlias,
culture: value.culture || null,
segment: value.segment || null,
alias: value.alias,
value: value.value,
};
}),
variants: data.variants.map((variant) => {
return {
state: variant.state,
culture: variant.culture || null,
segment: variant.segment || null,
name: variant.name,
publishDate: variant.publishDate || null,
createDate: variant.createDate,
updateDate: variant.updateDate,
};
}),
documentType: {
unique: data.documentType.id,
collection: data.documentType.collection ? { unique: data.documentType.collection.id } : null,
},
};
const document = this.#createDocumentBlueprintDetailModel(data);
return { data: document };
}
async scaffoldByUnique(unique: string): Promise<UmbDataSourceResponse<UmbDocumentBlueprintDetailModel>> {
if (!unique) throw new Error('Unique is missing');
const { data, error } = await tryExecuteAndNotify(
this.#host,
DocumentBlueprintService.getDocumentBlueprintByIdScaffold({ id: unique }),
);
if (error || !data) {
return { error };
}
const document = this.#createDocumentBlueprintDetailModel(data);
return { data: document };
}
@@ -196,4 +186,35 @@ export class UmbDocumentBlueprintServerDataSource implements UmbDetailDataSource
// TODO: update to delete when implemented
return tryExecuteAndNotify(this.#host, DocumentBlueprintService.deleteDocumentBlueprintById({ id: unique }));
}
#createDocumentBlueprintDetailModel(data: DocumentBlueprintResponseModel): UmbDocumentBlueprintDetailModel {
return {
entityType: UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE,
unique: data.id,
values: data.values.map((value) => {
return {
editorAlias: value.editorAlias,
culture: value.culture || null,
segment: value.segment || null,
alias: value.alias,
value: value.value,
};
}),
variants: data.variants.map((variant) => {
return {
state: variant.state,
culture: variant.culture || null,
segment: variant.segment || null,
name: variant.name,
publishDate: variant.publishDate || null,
createDate: variant.createDate,
updateDate: variant.updateDate,
};
}),
documentType: {
unique: data.documentType.id,
collection: data.documentType.collection ? { unique: data.documentType.collection.id } : null,
},
};
}
}

View File

@@ -211,14 +211,16 @@ export class UmbDocumentWorkspaceContext
async create(parent: UmbEntityModel, documentTypeUnique: string, blueprintUnique?: string) {
if (blueprintUnique) {
const blueprintRepository = new UmbDocumentBlueprintDetailRepository(this);
const { data } = await blueprintRepository.requestByUnique(blueprintUnique);
const { data } = await blueprintRepository.scaffoldByUnique(blueprintUnique);
if (!data) throw new Error('Blueprint data is missing');
return this.createScaffold({
parent,
preset: {
documentType: data?.documentType,
values: data?.values,
variants: data?.variants as Array<UmbDocumentVariantModel>,
documentType: data.documentType,
values: data.values,
variants: data.variants as Array<UmbDocumentVariantModel>,
},
});
}