Validation context for Block Workspace

This commit is contained in:
Niels Lyngsø
2024-08-12 14:57:30 +02:00
parent f5ff0bc4ef
commit e5e4877b97
9 changed files with 48 additions and 13 deletions

View File

@@ -22,6 +22,7 @@
"umbraco",
"Uncategorized",
"uninitialize",
"unprovide",
"variantable"
],
"exportall.config.folderListener": [],

View File

@@ -4,8 +4,9 @@ import type { UmbContentTypeModel } from '@umbraco-cms/backoffice/content-type';
import { UmbContentTypeStructureManager } from '@umbraco-cms/backoffice/content-type';
import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
import { type UmbClassInterface, UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
import { UmbDocumentTypeDetailRepository } from '@umbraco-cms/backoffice/document-type';
import { UmbValidationContext } from '@umbraco-cms/backoffice/validation';
export class UmbBlockElementManager extends UmbControllerBase {
//
@@ -24,6 +25,8 @@ export class UmbBlockElementManager extends UmbControllerBase {
new UmbDocumentTypeDetailRepository(this),
);
readonly validation = new UmbValidationContext(this);
constructor(host: UmbControllerHost) {
// TODO: Get Workspace Alias via Manifest.
super(host);
@@ -99,6 +102,13 @@ export class UmbBlockElementManager extends UmbControllerBase {
return new UmbBlockElementPropertyDatasetContext(host, this);
}
public setup(host: UmbClassInterface) {
this.createPropertyDatasetContext(host);
// Provide Validation Context for this view:
this.validation.provideAt(host);
}
public override destroy(): void {
this.#data.destroy();
this.structure.destroy();

View File

@@ -60,6 +60,9 @@ export class UmbBlockWorkspaceContext<LayoutDataType extends UmbBlockLayoutBaseM
const manifest = workspaceArgs.manifest;
this.#entityType = manifest.meta?.entityType;
this.addValidationContext(this.content.validation);
this.addValidationContext(this.settings.validation);
this.#retrieveModalContext = this.consumeContext(UMB_MODAL_CONTEXT, (context) => {
this.#modalContext = context;
context.onSubmit().catch(this.#modalRejected);

View File

@@ -69,8 +69,8 @@ export class UmbBlockWorkspaceViewEditElement extends UmbLitElement implements U
const dataManager = this.#blockWorkspace[this.#managerName];
this.#tabsStructureHelper.setStructureManager(dataManager.structure);
// Create Data Set:
dataManager.createPropertyDatasetContext(this);
// Create Data Set & setup Validation Context:
dataManager.setup(this);
this.observe(
this.#blockWorkspace![this.#managerName!].structure.hasRootContainers('Group'),

View File

@@ -82,9 +82,12 @@ export class UmbValidationMessagesManager {
this.#messages.append(messages.map((message) => ({ type, key: UmbId.new(), path, message })));
}
/*appendMessages(messages: Array<UmbValidationMessage>): void {
this.#messages.append(messages);
}*/
/*
appendMessage(msg: UmbValidationMessage): void {
const path = this.#translatePath(msg.path) ?? msg.path;
this.#messages.appendOne({ ...msg, path });
}
*/
removeMessageByKey(key: string): void {
this.#messages.removeOne(key);

View File

@@ -1,8 +1,8 @@
import { UmbContextProviderController } from '@umbraco-cms/backoffice/context-api';
import type { UmbValidator } from '../interfaces/validator.interface.js';
import { UmbValidationMessage, UmbValidationMessagesManager } from './validation-messages.manager.js';
import { UMB_VALIDATION_CONTEXT } from './validation.context-token.js';
import { UmbContextBase } from '@umbraco-cms/backoffice/class-api';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { type UmbClassInterface, UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
function ReplaceStartOfString(path: string, startFrom: string, startTo: string): string {
if (path.startsWith(startFrom + '.')) {
@@ -11,7 +11,10 @@ function ReplaceStartOfString(path: string, startFrom: string, startTo: string):
return path;
}
export class UmbValidationContext extends UmbContextBase<UmbValidationContext> implements UmbValidator {
export class UmbValidationContext extends UmbControllerBase implements UmbValidator {
// The current provider controller, that is providing this context:
#providerCtrl?: UmbContextProviderController<UmbValidationContext, UmbValidationContext, UmbValidationContext>;
#validators: Array<UmbValidator> = [];
#validationMode: boolean = false;
#isValid: boolean = false;
@@ -23,8 +26,18 @@ export class UmbValidationContext extends UmbContextBase<UmbValidationContext> i
public readonly messages = new UmbValidationMessagesManager();
constructor(host: UmbControllerHost) {
super(host, UMB_VALIDATION_CONTEXT);
/**
* Provides the validation context to the current host, if not already provided to a different host.
* @returns instance {UmbValidationContext} - Returns it self.
*/
provide(): UmbValidationContext {
if (this.#providerCtrl) return this;
this.provideContext(UMB_VALIDATION_CONTEXT, this);
return this;
}
provideAt(controllerHost: UmbClassInterface): void {
this.#providerCtrl?.destroy();
this.#providerCtrl = controllerHost.provideContext(UMB_VALIDATION_CONTEXT, this);
}
setDataPath(dataPath: string): void {

View File

@@ -20,6 +20,11 @@ export abstract class UmbSubmittableWorkspaceContextBase<WorkspaceDataModelType>
//public readonly validation = new UmbValidationContext(this);
#validationContexts: Array<UmbValidationContext> = [];
/**
* Appends a validation context to the workspace.
* @param context
*/
addValidationContext(context: UmbValidationContext) {
this.#validationContexts.push(context);
}

View File

@@ -100,7 +100,7 @@ export class UmbDataTypeWorkspaceContext
constructor(host: UmbControllerHost) {
super(host, 'Umb.Workspace.DataType');
this.addValidationContext(new UmbValidationContext(this));
this.addValidationContext(new UmbValidationContext(this).provide());
this.#observePropertyEditorSchemaAlias();
this.#observePropertyEditorUIAlias();

View File

@@ -163,7 +163,7 @@ export class UmbDocumentWorkspaceContext
constructor(host: UmbControllerHost) {
super(host, UMB_DOCUMENT_WORKSPACE_ALIAS);
this.addValidationContext(new UmbValidationContext(this));
this.addValidationContext(new UmbValidationContext(this).provide());
new UmbVariantValuesValidationPathTranslator(this);