@siliconst/metaui 1.4.44 → 1.4.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js +24 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts +24 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.ts +15 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js +34 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts +34 -0
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.ts +25 -1
- package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js +31 -1
- package/src/nz/co/siliconst/ui5/metaui/core/Engine-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts +2 -0
- package/src/nz/co/siliconst/ui5/metaui/core/Engine.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/Engine.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/Engine.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/Engine.ts +38 -0
- package/src/nz/co/siliconst/ui5/metaui/core/StateManager-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/StateManager.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/core/StateManager.ts +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.d.ts +1 -0
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/interfaces/IPlugin.ts +1 -0
- package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout-dbg.js +327 -67
- package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.d.ts +57 -15
- package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/layouts/WizardLayout.ts +375 -65
- package/src/nz/co/siliconst/ui5/metaui/library-preload.js +5 -5
- package/src/nz/co/siliconst/ui5/metaui/library-preload.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js +10 -15
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin-dbg.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts +4 -0
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.d.ts.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.js.map +1 -1
- package/src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.ts +10 -15
|
@@ -56,6 +56,13 @@ sap.ui.define(["../../core/PipelineManager", "sap/ui/core/library", "../../utils
|
|
|
56
56
|
this.isEditable = editable;
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
+
/**
|
|
60
|
+
* Retrieves the human-readable label for the field from its metadata.
|
|
61
|
+
*/
|
|
62
|
+
getFieldLabel() {
|
|
63
|
+
return this.metadata?.ui?.label || this.fieldKey;
|
|
64
|
+
}
|
|
65
|
+
|
|
59
66
|
/**
|
|
60
67
|
* Injects the global MessageManager context into the plugin.
|
|
61
68
|
* @param useMessageManager True if the MessageManager is handling validation visual states.
|
|
@@ -299,13 +306,7 @@ sap.ui.define(["../../core/PipelineManager", "sap/ui/core/library", "../../utils
|
|
|
299
306
|
ctrl.setEditable(!metadata.ui.readOnly);
|
|
300
307
|
}
|
|
301
308
|
if (metadata.ui?.visibleOn) {
|
|
302
|
-
const
|
|
303
|
-
let expr = "";
|
|
304
|
-
if (ExpressionBuilder) {
|
|
305
|
-
expr = ExpressionBuilder.build(metadata.ui.visibleOn, this.fieldKey, modelName);
|
|
306
|
-
} else {
|
|
307
|
-
expr = `{= ${metadata.ui.visibleOn.replace(/\$root\./g, `${modelName}>/`).replace(/\./g, '/')} }`;
|
|
308
|
-
}
|
|
309
|
+
const expr = `{= ${metadata.ui.visibleOn.replace(/\$root\./g, `${modelName}>/`).replace(/\./g, '/')} }`;
|
|
309
310
|
control.bindProperty("visible", {
|
|
310
311
|
parts: [{
|
|
311
312
|
path: "meta>/"
|
|
@@ -315,17 +316,11 @@ sap.ui.define(["../../core/PipelineManager", "sap/ui/core/library", "../../utils
|
|
|
315
316
|
control.bindProperty("visible", expr);
|
|
316
317
|
}
|
|
317
318
|
if (metadata.ui?.enabledOn && typeof ctrl.setEnabled === "function") {
|
|
318
|
-
const
|
|
319
|
-
let expr = "";
|
|
320
|
-
if (ExpressionBuilder) {
|
|
321
|
-
expr = ExpressionBuilder.build(metadata.ui.enabledOn, this.fieldKey, modelName);
|
|
322
|
-
} else {
|
|
323
|
-
expr = `{= ${metadata.ui.enabledOn.replace(/\$root\./g, `${modelName}>/`).replace(/\./g, '/')} }`;
|
|
324
|
-
}
|
|
319
|
+
const expr = `{= ${metadata.ui.enabledOn.replace(/\$root\./g, `${modelName}>/`).replace(/\./g, '/')} }`;
|
|
325
320
|
control.bindProperty("enabled", expr);
|
|
326
321
|
}
|
|
327
322
|
if (metadata.ui?.controlProps) {
|
|
328
|
-
|
|
323
|
+
Logger.debug(`[BasePlugin] controlProps found for ${this.fieldKey}: ` + JSON.stringify(metadata.ui.controlProps), "BasePlugin");
|
|
329
324
|
const targetControl = this.mainControl || control;
|
|
330
325
|
const target = targetControl;
|
|
331
326
|
if (typeof target.getMetadata === "function") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BasePlugin-dbg.js","names":["GlobalPipeline","____core_PipelineManager","Logger","____utils_Logger","BasePlugin","control","BLOCKED_PROPS","metadata","fieldKey","modelName","isEditable","useMessageManager","policyInvalidMessage","setEditable","editable","setUseMessageManager","generateStableId","engineScopeId","bindingPath","undefined","safePath","replace","generateBindingInfo","typeInstance","additionalOptions","path","model","type","validate","isValid","getVisible","errorMessage","validatorsToRun","argsMap","maxLength","isRequired","_isDynamicallyRequired","required","push","minLength","pattern","minimum","maximum","min","max","format","ui","validators","v","name","args","length","val","getValue","result","executeValidation","fieldLabel","label","setVisualValidationState","ctrl","setValueState","coreLibrary","ValueState","None","Error","setValueStateText","applyError","clearError","applyVisibility","isVisible","setVisible","applyRequired","setRequired","applyEditable","setEnabled","onStateChange","newMetadata","applyState","applyCommonDirectives","readOnly","visibleOn","ExpressionBuilder","sap","require","expr","build","bindProperty","parts","formatter","enabledOn","controlProps","console","error","targetControl","mainControl","target","getMetadata","targetMeta","settings","propName","propValue","Object","entries","includes","warn","hasAggregation","hasEvent","startsWith","endsWith","injectedValue","applySettings","err","getName","message","destroy","__exports","__esModule"],"sources":["BasePlugin.ts"],"sourcesContent":["/**\n * @file BasePlugin.ts\n * @description Abstract foundation for all MetaUI plugins, enforcing lifecycle hooks for v2 Schema.\n */\n\nimport { IPlugin } from \"../../interfaces/IPlugin\";\nimport { IPropertyMetadata } from \"../../interfaces/ISchema\";\nimport Control from \"sap/ui/core/Control\";\nimport { GlobalPipeline } from \"../../core/PipelineManager\";\nimport * as coreLibrary from \"sap/ui/core/library\";\nimport { Logger } from \"../../utils/Logger\";\n\n/**\n * Abstract class representing a standard MetaUI Plugin.\n * Enforces the required rendering, state extraction, and validation contracts.\n * \n * @abstract\n * @public\n */\nexport abstract class BasePlugin implements IPlugin {\n /** The instantiated UI5 control for this plugin. */\n protected control: Control | null = null;\n\n /** Explicit reference to the core data widget when this plugin is wrapped in a layout. */\n protected mainControl?: Control;\n\n /** Properties strictly protected by the Sandbox engine. */\n protected BLOCKED_PROPS = [\"value\", \"text\", \"selectedKey\", \"selected\", \"dateValue\", \"editable\", \"enabled\", \"visible\", \"valueState\", \"valueStateText\", \"items\", \"content\", \"pages\", \"formElements\", \"change\", \"press\", \"select\", \"submit\"];\n\n /** The metadata schema defining the field rules. */\n protected metadata: IPropertyMetadata | null = null;\n\n /** The internal JSON path of the field relative to its parent payload. */\n protected fieldKey: string = \"\";\n\n /** The UI5 JSONModel name used for absolute binding paths. */\n protected modelName: string = \"meta\";\n\n /** Indicates if the engine is enforcing an editable mode. */\n protected isEditable: boolean = true;\n\n /** Indicates if the plugin should delegate visual validation to the MessageManager. */\n protected useMessageManager: boolean = false;\n\n /** Internal callback provided by GeneratorHost to signal validation/data changes upwards */\n protected onChange?: (isValid: boolean, fieldKey?: string, errorMessage?: string, controlId?: string) => void;\n\n /** \n * Tracks explicitly forced invalid states pushed down from the PolicyEngine.\n * When populated, this error takes absolute precedence over static SchemaValidator rules.\n */\n protected policyInvalidMessage: string | null = null;\n\n /** Transient state tracking for PBRE required evaluations to prevent schema clobbering */\n protected _isDynamicallyRequired?: boolean;\n\n /**\n * Injects the global editable mode context into the plugin before rendering.\n * @param editable True if the plugin should render in editable mode.\n */\n public setEditable(editable: boolean): void {\n this.isEditable = editable;\n }\n\n /**\n * Injects the global MessageManager context into the plugin.\n * @param useMessageManager True if the MessageManager is handling validation visual states.\n */\n public setUseMessageManager(useMessageManager: boolean): void {\n this.useMessageManager = useMessageManager;\n }\n\n /**\n * Instantiates the raw UI5 control and binds it to the model.\n * \n * @param fieldMetadata The JSON Schema for the field.\n * @param bindingPath The JSON path to bind to.\n * @param modelName The UI5 model name.\n * @param engineScopeId The deterministic scope ID provided by the Engine to prevent cloning collisions.\n * @param onChange The callback fired natively when a field value blur/change occurs.\n * @returns {Control} The generated UI5 control.\n */\n public abstract render(fieldMetadata: IPropertyMetadata, bindingPath: string, modelName?: string, engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string, errorMessage?: string, controlId?: string) => void, model?: unknown): Control;\n\n /**\n * Generates a deterministic, globally unique ID for this control.\n * Prefixes the sanitized binding path with the Engine's scoped ID.\n */\n protected generateStableId(engineScopeId: string | undefined, bindingPath: string): string | undefined {\n if (!engineScopeId) return undefined;\n // Strip leading slash and replace internal slashes with hyphens\n const safePath = bindingPath.replace(/^\\//, '').replace(/\\//g, '-');\n return `${engineScopeId}--${safePath}`;\n }\n\n /**\n * Extracts the current raw value from the underlying UI5 control.\n */\n protected abstract getValue(): unknown;\n\n /**\n * Generates a standardized programmatic binding configuration object.\n * Ensures perfect architectural consistency across all plugins instead of relying on string parsing.\n * \n * @param bindingPath The relative or absolute path.\n * @param modelName The target model name.\n * @param typeInstance An optional UI5 Type instance (e.g. Integer, Float).\n * @param additionalOptions Optional extra configurations (e.g. formatOptions, constraints).\n * @returns A configuration object ready to be assigned to 'value', 'text', 'state', etc.\n */\n protected generateBindingInfo(bindingPath: string, modelName: string, typeInstance?: unknown, additionalOptions?: Record<string, unknown>): any {\n return {\n path: bindingPath,\n model: modelName,\n ...(typeInstance ? { type: typeInstance } : {}),\n ...(additionalOptions || {})\n };\n }\n\n /**\n * Universal pipeline validation.\n */\n public validate(): import(\"../../interfaces/IPlugin\").IPluginValidationResult {\n if (!this.control || !this.metadata) return { isValid: true };\n\n // Skip validation for hidden fields (e.g. hidden by ConditionEngine visibleOn)\n if (typeof (this.control as Control).getVisible === \"function\") {\n if (!(this.control as Control).getVisible()) {\n return { isValid: true };\n }\n }\n\n if (this.policyInvalidMessage) {\n return { isValid: false, errorMessage: this.policyInvalidMessage, fieldKey: this.fieldKey };\n }\n\n const validatorsToRun: string[] = [];\n const argsMap: Record<string, unknown> = {\n \"maxLength\": this.metadata.maxLength\n };\n\n const isRequired = this._isDynamicallyRequired !== undefined ? this._isDynamicallyRequired : this.metadata.required;\n if (isRequired) {\n validatorsToRun.push(\"required\");\n }\n if (this.metadata.maxLength) validatorsToRun.push(\"maxLength\");\n if (this.metadata.minLength) {\n validatorsToRun.push(\"minLength\");\n argsMap[\"minLength\"] = this.metadata.minLength;\n }\n if (this.metadata.pattern) {\n validatorsToRun.push(\"pattern\");\n argsMap[\"pattern\"] = this.metadata.pattern;\n }\n if (this.metadata.minimum !== undefined || this.metadata.maximum !== undefined) {\n validatorsToRun.push(\"range\");\n argsMap[\"range\"] = { min: this.metadata.minimum, max: this.metadata.maximum };\n }\n\n const format = this.metadata.ui?.format;\n if (format === \"email\" || format === \"url\" || format === \"iban\") {\n validatorsToRun.push(format);\n }\n\n if (this.metadata.ui?.validators) {\n for (const v of this.metadata.ui.validators) {\n if (typeof v === \"string\") {\n validatorsToRun.push(v);\n } else if (v && v.name) {\n validatorsToRun.push(v.name);\n if (v.args !== undefined) {\n argsMap[v.name] = v.args;\n }\n }\n }\n }\n\n if (validatorsToRun.length === 0) {\n return { isValid: true, errorMessage: undefined, fieldKey: this.fieldKey };\n }\n\n const val = this.getValue();\n const result = GlobalPipeline.executeValidation(val, validatorsToRun, argsMap);\n return { isValid: result.isValid, errorMessage: result.errorMessage, fieldKey: this.fieldKey, fieldLabel: this.metadata?.ui?.label };\n }\n\n /**\n * Natively manipulates the UI5 control's valueState if the control supports it.\n * Uses reflection to safely apply styles without crashing on structural controls.\n */\n public setVisualValidationState(isValid: boolean, errorMessage?: string): void {\n if (!this.control) return;\n\n\n // Use reflection to check if the control supports ValueState (e.g. sap.m.Input does, sap.m.Text does not)\n type StateControl = {\n setValueState?: (state: string) => void;\n setValueStateText?: (text: string) => void;\n };\n const ctrl = this.control as unknown as StateControl;\n if (typeof ctrl.setValueState === \"function\") {\n ctrl.setValueState(isValid ? coreLibrary.ValueState.None : coreLibrary.ValueState.Error);\n\n if (typeof ctrl.setValueStateText === \"function\") {\n ctrl.setValueStateText(isValid ? \"\" : (errorMessage || \"\"));\n }\n } else {\n // Quietly ignore. Controls like sap.m.Text natively do not support value states, which is completely valid.\n }\n }\n\n\n\n // --- IPluginStateReceiver Implementation for PBRE ---\n\n /**\n * Natively applies a forced error state from the PolicyEngine.\n * Per MetaUI Architecture Rule 12, this explicitly forces the visual state red \n * independently of the MessageManager auto-sync.\n * \n * @param errorMessage The custom error message to display.\n */\n public applyError(errorMessage: string): void {\n this.policyInvalidMessage = errorMessage;\n this.setVisualValidationState(false, errorMessage);\n }\n\n /**\n * Clears a previously forced error state.\n * Restores the visual boundary to standard (non-error) formatting.\n */\n public clearError(): void {\n this.policyInvalidMessage = null;\n this.setVisualValidationState(true);\n }\n\n /**\n * Dynamically manipulates the visibility state of the control based on PolicyEngine directives.\n * \n * @param isVisible True to display the control, false to hide it.\n */\n public applyVisibility(isVisible: boolean): void {\n const ctrl = this.control as unknown as { setVisible?: (b: boolean) => void };\n if (ctrl && typeof ctrl.setVisible === \"function\") {\n ctrl.setVisible(isVisible);\n }\n }\n\n /**\n * Dynamically alters the mandatory status of the field.\n * Updates internal transient state to ensure the `validate()` pipeline enforces the change,\n * and natively triggers the UI5 required indicator (asterisk) if supported,\n * without permanently corrupting the shared global schema definition.\n * \n * @param isRequired True to make the field mandatory, false to make it optional.\n */\n public applyRequired(isRequired: boolean): void {\n this._isDynamicallyRequired = isRequired;\n const ctrl = this.control as unknown as { setRequired?: (b: boolean) => void };\n if (ctrl && typeof ctrl.setRequired === \"function\") {\n ctrl.setRequired(isRequired);\n }\n }\n\n /**\n * Dynamically alters the editability of the field.\n * Falls back to `setEnabled` if the control is structural rather than purely input-driven.\n * \n * @param isEditable True to allow user input, false to lock it.\n */\n public applyEditable(isEditable: boolean): void {\n const ctrl = this.control as unknown as { setEditable?: (b: boolean) => void, setEnabled?: (b: boolean) => void };\n if (ctrl && typeof ctrl.setEditable === \"function\") {\n ctrl.setEditable(isEditable);\n } else if (ctrl && typeof ctrl.setEnabled === \"function\") {\n ctrl.setEnabled(isEditable);\n }\n }\n\n /**\n * Executes when the condition engine pushes new schema metadata to this field (e.g. readOnly changing).\n * @param newMetadata The mutated schema metadata.\n */\n public onStateChange(newMetadata: IPropertyMetadata): void {\n this.metadata = newMetadata;\n this.applyState();\n }\n\n /**\n * Abstract hook for the plugin to apply state changes to its specific UI5 control (e.g. placeholders, labels).\n */\n protected abstract applyState(): void;\n\n /**\n * Helper to apply common UI directives (like readOnly, visibleOn) directly to any control.\n */\n protected applyCommonDirectives(control: Control, metadata: IPropertyMetadata, modelName: string = \"meta\"): void {\n const ctrl = control as unknown as { setEditable?: (b: boolean) => void, setEnabled?: (b: boolean) => void };\n if (metadata.ui?.readOnly !== undefined && typeof ctrl.setEditable === \"function\") {\n ctrl.setEditable(!metadata.ui.readOnly);\n }\n\n if (metadata.ui?.visibleOn) {\n const ExpressionBuilder = sap.ui.require(\"nz/co/siliconst/ui5/metaui/utils/ExpressionBuilder\")?.ExpressionBuilder;\n let expr = \"\";\n if (ExpressionBuilder) {\n expr = ExpressionBuilder.build(metadata.ui.visibleOn, this.fieldKey, modelName);\n } else {\n expr = `{= ${metadata.ui.visibleOn.replace(/\\$root\\./g, `${modelName}>/`).replace(/\\./g, '/')} }`;\n }\n control.bindProperty(\"visible\", { parts: [{ path: \"meta>/\" }], formatter: () => false });\n control.bindProperty(\"visible\", expr);\n }\n\n if (metadata.ui?.enabledOn && typeof ctrl.setEnabled === \"function\") {\n const ExpressionBuilder = sap.ui.require(\"nz/co/siliconst/ui5/metaui/utils/ExpressionBuilder\")?.ExpressionBuilder;\n let expr = \"\";\n if (ExpressionBuilder) {\n expr = ExpressionBuilder.build(metadata.ui.enabledOn, this.fieldKey, modelName);\n } else {\n expr = `{= ${metadata.ui.enabledOn.replace(/\\$root\\./g, `${modelName}>/`).replace(/\\./g, '/')} }`;\n }\n control.bindProperty(\"enabled\", expr);\n }\n\n if (metadata.ui?.controlProps) {\n console.error(`[DEBUG MetaUI] controlProps found for ${this.fieldKey}`, metadata.ui.controlProps);\n const targetControl = this.mainControl || control;\n const target = targetControl as unknown as {\n getMetadata?: () => { getName(): string },\n applySettings?: (settings: Record<string, any>) => void,\n setProperty?: (p: string, v: unknown) => void,\n bindProperty?: (p: string, v: string) => void\n };\n\n if (typeof target.getMetadata === \"function\") {\n const targetMeta = target.getMetadata();\n const settings: Record<string, any> = {};\n for (const [propName, propValue] of Object.entries(metadata.ui.controlProps)) {\n if (this.BLOCKED_PROPS.includes(propName)) {\n Logger.warn(`[BasePlugin] Cannot apply controlProps '${propName}' for field '${this.fieldKey}' - ILLEGAL OVERRIDE (Property is protected by sandbox)`);\n continue;\n }\n \n // Natively block any aggregations or events to prevent sandbox escapes\n if (typeof (targetMeta as any).hasAggregation === \"function\" && (targetMeta as any).hasAggregation(propName)) {\n Logger.warn(`[BasePlugin] Cannot apply controlProps '${propName}' for field '${this.fieldKey}' - ILLEGAL OVERRIDE (Cannot hijack aggregations)`);\n continue;\n }\n \n if (typeof (targetMeta as any).hasEvent === \"function\" && (targetMeta as any).hasEvent(propName)) {\n Logger.warn(`[BasePlugin] Cannot apply controlProps '${propName}' for field '${this.fieldKey}' - ILLEGAL OVERRIDE (Cannot hijack events)`);\n continue;\n }\n\n if (typeof propValue === \"string\" && propValue.startsWith(\"{\") && propValue.endsWith(\"}\")) {\n // The JSON payloads often hardcode 'metaui>' in raw expression bindings, \n // but the Engine dynamically generates model names like 'metaUI_Host1'. \n // We must inject the actual modelName dynamically into the expression string.\n const injectedValue = propValue.replace(/metaui>/g, `${modelName}>`);\n settings[propName] = injectedValue;\n } else {\n settings[propName] = propValue;\n }\n }\n\n try {\n const target = targetControl as unknown as { applySettings?: (s: Record<string, any>) => void };\n if (typeof target.applySettings === \"function\") {\n target.applySettings(settings);\n }\n } catch (err: unknown) {\n Logger.warn(`[BasePlugin] Failed to apply controlProps for field '${this.fieldKey}' on control ${targetMeta.getName()}: ${(err as Error).message}`);\n }\n }\n }\n }\n\n\n\n /**\n * Natively destroys the instantiated UI5 control to prevent memory leaks.\n * Can be overridden by subclasses if they manage secondary controls or custom models.\n */\n public destroy(): void {\n if (this.control && typeof this.control.destroy === \"function\") {\n this.control.destroy();\n this.control = null;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"BasePlugin-dbg.js","names":["GlobalPipeline","____core_PipelineManager","Logger","____utils_Logger","BasePlugin","control","BLOCKED_PROPS","metadata","fieldKey","modelName","isEditable","useMessageManager","policyInvalidMessage","setEditable","editable","getFieldLabel","ui","label","setUseMessageManager","generateStableId","engineScopeId","bindingPath","undefined","safePath","replace","generateBindingInfo","typeInstance","additionalOptions","path","model","type","validate","isValid","getVisible","errorMessage","validatorsToRun","argsMap","maxLength","isRequired","_isDynamicallyRequired","required","push","minLength","pattern","minimum","maximum","min","max","format","validators","v","name","args","length","val","getValue","result","executeValidation","fieldLabel","setVisualValidationState","ctrl","setValueState","coreLibrary","ValueState","None","Error","setValueStateText","applyError","clearError","applyVisibility","isVisible","setVisible","applyRequired","setRequired","applyEditable","setEnabled","onStateChange","newMetadata","applyState","applyCommonDirectives","readOnly","visibleOn","expr","bindProperty","parts","formatter","enabledOn","controlProps","debug","JSON","stringify","targetControl","mainControl","target","getMetadata","targetMeta","settings","propName","propValue","Object","entries","includes","warn","hasAggregation","hasEvent","startsWith","endsWith","injectedValue","applySettings","err","getName","message","destroy","__exports","__esModule"],"sources":["BasePlugin.ts"],"sourcesContent":["/**\n * @file BasePlugin.ts\n * @description Abstract foundation for all MetaUI plugins, enforcing lifecycle hooks for v2 Schema.\n */\n\nimport { IPlugin } from \"../../interfaces/IPlugin\";\nimport { IPropertyMetadata } from \"../../interfaces/ISchema\";\nimport Control from \"sap/ui/core/Control\";\nimport { GlobalPipeline } from \"../../core/PipelineManager\";\nimport * as coreLibrary from \"sap/ui/core/library\";\nimport { Logger } from \"../../utils/Logger\";\n\n/**\n * Abstract class representing a standard MetaUI Plugin.\n * Enforces the required rendering, state extraction, and validation contracts.\n * \n * @abstract\n * @public\n */\nexport abstract class BasePlugin implements IPlugin {\n /** The instantiated UI5 control for this plugin. */\n protected control: Control | null = null;\n\n /** Explicit reference to the core data widget when this plugin is wrapped in a layout. */\n protected mainControl?: Control;\n\n /** Properties strictly protected by the Sandbox engine. */\n protected BLOCKED_PROPS = [\"value\", \"text\", \"selectedKey\", \"selected\", \"dateValue\", \"editable\", \"enabled\", \"visible\", \"valueState\", \"valueStateText\", \"items\", \"content\", \"pages\", \"formElements\", \"change\", \"press\", \"select\", \"submit\"];\n\n /** The metadata schema defining the field rules. */\n protected metadata: IPropertyMetadata | null = null;\n\n /** The internal JSON path of the field relative to its parent payload. */\n protected fieldKey: string = \"\";\n\n /** The UI5 JSONModel name used for absolute binding paths. */\n protected modelName: string = \"meta\";\n\n /** Indicates if the engine is enforcing an editable mode. */\n protected isEditable: boolean = true;\n\n /** Indicates if the plugin should delegate visual validation to the MessageManager. */\n protected useMessageManager: boolean = false;\n\n /** Internal callback provided by GeneratorHost to signal validation/data changes upwards */\n protected onChange?: (isValid: boolean, fieldKey?: string, errorMessage?: string, controlId?: string) => void;\n\n /** \n * Tracks explicitly forced invalid states pushed down from the PolicyEngine.\n * When populated, this error takes absolute precedence over static SchemaValidator rules.\n */\n protected policyInvalidMessage: string | null = null;\n\n /** Transient state tracking for PBRE required evaluations to prevent schema clobbering */\n protected _isDynamicallyRequired?: boolean;\n\n /**\n * Injects the global editable mode context into the plugin before rendering.\n * @param editable True if the plugin should render in editable mode.\n */\n public setEditable(editable: boolean): void {\n this.isEditable = editable;\n }\n\n /**\n * Retrieves the human-readable label for the field from its metadata.\n */\n public getFieldLabel(): string | undefined {\n return this.metadata?.ui?.label || this.fieldKey;\n }\n\n /**\n * Injects the global MessageManager context into the plugin.\n * @param useMessageManager True if the MessageManager is handling validation visual states.\n */\n public setUseMessageManager(useMessageManager: boolean): void {\n this.useMessageManager = useMessageManager;\n }\n\n /**\n * Instantiates the raw UI5 control and binds it to the model.\n * \n * @param fieldMetadata The JSON Schema for the field.\n * @param bindingPath The JSON path to bind to.\n * @param modelName The UI5 model name.\n * @param engineScopeId The deterministic scope ID provided by the Engine to prevent cloning collisions.\n * @param onChange The callback fired natively when a field value blur/change occurs.\n * @returns {Control} The generated UI5 control.\n */\n public abstract render(fieldMetadata: IPropertyMetadata, bindingPath: string, modelName?: string, engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string, errorMessage?: string, controlId?: string) => void, model?: unknown): Control;\n\n /**\n * Generates a deterministic, globally unique ID for this control.\n * Prefixes the sanitized binding path with the Engine's scoped ID.\n */\n protected generateStableId(engineScopeId: string | undefined, bindingPath: string): string | undefined {\n if (!engineScopeId) return undefined;\n // Strip leading slash and replace internal slashes with hyphens\n const safePath = bindingPath.replace(/^\\//, '').replace(/\\//g, '-');\n return `${engineScopeId}--${safePath}`;\n }\n\n /**\n * Extracts the current raw value from the underlying UI5 control.\n */\n protected abstract getValue(): unknown;\n\n /**\n * Generates a standardized programmatic binding configuration object.\n * Ensures perfect architectural consistency across all plugins instead of relying on string parsing.\n * \n * @param bindingPath The relative or absolute path.\n * @param modelName The target model name.\n * @param typeInstance An optional UI5 Type instance (e.g. Integer, Float).\n * @param additionalOptions Optional extra configurations (e.g. formatOptions, constraints).\n * @returns A configuration object ready to be assigned to 'value', 'text', 'state', etc.\n */\n protected generateBindingInfo(bindingPath: string, modelName: string, typeInstance?: unknown, additionalOptions?: Record<string, unknown>): any {\n return {\n path: bindingPath,\n model: modelName,\n ...(typeInstance ? { type: typeInstance } : {}),\n ...(additionalOptions || {})\n };\n }\n\n /**\n * Universal pipeline validation.\n */\n public validate(): import(\"../../interfaces/IPlugin\").IPluginValidationResult {\n if (!this.control || !this.metadata) return { isValid: true };\n\n // Skip validation for hidden fields (e.g. hidden by ConditionEngine visibleOn)\n if (typeof (this.control as Control).getVisible === \"function\") {\n if (!(this.control as Control).getVisible()) {\n return { isValid: true };\n }\n }\n\n if (this.policyInvalidMessage) {\n return { isValid: false, errorMessage: this.policyInvalidMessage, fieldKey: this.fieldKey };\n }\n\n const validatorsToRun: string[] = [];\n const argsMap: Record<string, unknown> = {\n \"maxLength\": this.metadata.maxLength\n };\n\n const isRequired = this._isDynamicallyRequired !== undefined ? this._isDynamicallyRequired : this.metadata.required;\n if (isRequired) {\n validatorsToRun.push(\"required\");\n }\n if (this.metadata.maxLength) validatorsToRun.push(\"maxLength\");\n if (this.metadata.minLength) {\n validatorsToRun.push(\"minLength\");\n argsMap[\"minLength\"] = this.metadata.minLength;\n }\n if (this.metadata.pattern) {\n validatorsToRun.push(\"pattern\");\n argsMap[\"pattern\"] = this.metadata.pattern;\n }\n if (this.metadata.minimum !== undefined || this.metadata.maximum !== undefined) {\n validatorsToRun.push(\"range\");\n argsMap[\"range\"] = { min: this.metadata.minimum, max: this.metadata.maximum };\n }\n\n const format = this.metadata.ui?.format;\n if (format === \"email\" || format === \"url\" || format === \"iban\") {\n validatorsToRun.push(format);\n }\n\n if (this.metadata.ui?.validators) {\n for (const v of this.metadata.ui.validators) {\n if (typeof v === \"string\") {\n validatorsToRun.push(v);\n } else if (v && v.name) {\n validatorsToRun.push(v.name);\n if (v.args !== undefined) {\n argsMap[v.name] = v.args;\n }\n }\n }\n }\n\n if (validatorsToRun.length === 0) {\n return { isValid: true, errorMessage: undefined, fieldKey: this.fieldKey };\n }\n\n const val = this.getValue();\n const result = GlobalPipeline.executeValidation(val, validatorsToRun, argsMap);\n return { isValid: result.isValid, errorMessage: result.errorMessage, fieldKey: this.fieldKey, fieldLabel: this.metadata?.ui?.label };\n }\n\n /**\n * Natively manipulates the UI5 control's valueState if the control supports it.\n * Uses reflection to safely apply styles without crashing on structural controls.\n */\n public setVisualValidationState(isValid: boolean, errorMessage?: string): void {\n if (!this.control) return;\n\n\n // Use reflection to check if the control supports ValueState (e.g. sap.m.Input does, sap.m.Text does not)\n type StateControl = {\n setValueState?: (state: string) => void;\n setValueStateText?: (text: string) => void;\n };\n const ctrl = this.control as unknown as StateControl;\n if (typeof ctrl.setValueState === \"function\") {\n ctrl.setValueState(isValid ? coreLibrary.ValueState.None : coreLibrary.ValueState.Error);\n\n if (typeof ctrl.setValueStateText === \"function\") {\n ctrl.setValueStateText(isValid ? \"\" : (errorMessage || \"\"));\n }\n } else {\n // Quietly ignore. Controls like sap.m.Text natively do not support value states, which is completely valid.\n }\n }\n\n\n\n // --- IPluginStateReceiver Implementation for PBRE ---\n\n /**\n * Natively applies a forced error state from the PolicyEngine.\n * Per MetaUI Architecture Rule 12, this explicitly forces the visual state red \n * independently of the MessageManager auto-sync.\n * \n * @param errorMessage The custom error message to display.\n */\n public applyError(errorMessage: string): void {\n this.policyInvalidMessage = errorMessage;\n this.setVisualValidationState(false, errorMessage);\n }\n\n /**\n * Clears a previously forced error state.\n * Restores the visual boundary to standard (non-error) formatting.\n */\n public clearError(): void {\n this.policyInvalidMessage = null;\n this.setVisualValidationState(true);\n }\n\n /**\n * Dynamically manipulates the visibility state of the control based on PolicyEngine directives.\n * \n * @param isVisible True to display the control, false to hide it.\n */\n public applyVisibility(isVisible: boolean): void {\n const ctrl = this.control as unknown as { setVisible?: (b: boolean) => void };\n if (ctrl && typeof ctrl.setVisible === \"function\") {\n ctrl.setVisible(isVisible);\n }\n }\n\n /**\n * Dynamically alters the mandatory status of the field.\n * Updates internal transient state to ensure the `validate()` pipeline enforces the change,\n * and natively triggers the UI5 required indicator (asterisk) if supported,\n * without permanently corrupting the shared global schema definition.\n * \n * @param isRequired True to make the field mandatory, false to make it optional.\n */\n public applyRequired(isRequired: boolean): void {\n this._isDynamicallyRequired = isRequired;\n const ctrl = this.control as unknown as { setRequired?: (b: boolean) => void };\n if (ctrl && typeof ctrl.setRequired === \"function\") {\n ctrl.setRequired(isRequired);\n }\n }\n\n /**\n * Dynamically alters the editability of the field.\n * Falls back to `setEnabled` if the control is structural rather than purely input-driven.\n * \n * @param isEditable True to allow user input, false to lock it.\n */\n public applyEditable(isEditable: boolean): void {\n const ctrl = this.control as unknown as { setEditable?: (b: boolean) => void, setEnabled?: (b: boolean) => void };\n if (ctrl && typeof ctrl.setEditable === \"function\") {\n ctrl.setEditable(isEditable);\n } else if (ctrl && typeof ctrl.setEnabled === \"function\") {\n ctrl.setEnabled(isEditable);\n }\n }\n\n /**\n * Executes when the condition engine pushes new schema metadata to this field (e.g. readOnly changing).\n * @param newMetadata The mutated schema metadata.\n */\n public onStateChange(newMetadata: IPropertyMetadata): void {\n this.metadata = newMetadata;\n this.applyState();\n }\n\n /**\n * Abstract hook for the plugin to apply state changes to its specific UI5 control (e.g. placeholders, labels).\n */\n protected abstract applyState(): void;\n\n /**\n * Helper to apply common UI directives (like readOnly, visibleOn) directly to any control.\n */\n protected applyCommonDirectives(control: Control, metadata: IPropertyMetadata, modelName: string = \"meta\"): void {\n const ctrl = control as unknown as { setEditable?: (b: boolean) => void, setEnabled?: (b: boolean) => void };\n if (metadata.ui?.readOnly !== undefined && typeof ctrl.setEditable === \"function\") {\n ctrl.setEditable(!metadata.ui.readOnly);\n }\n\n if (metadata.ui?.visibleOn) {\n const expr = `{= ${metadata.ui.visibleOn.replace(/\\$root\\./g, `${modelName}>/`).replace(/\\./g, '/')} }`;\n control.bindProperty(\"visible\", { parts: [{ path: \"meta>/\" }], formatter: () => false });\n control.bindProperty(\"visible\", expr);\n }\n\n if (metadata.ui?.enabledOn && typeof ctrl.setEnabled === \"function\") {\n const expr = `{= ${metadata.ui.enabledOn.replace(/\\$root\\./g, `${modelName}>/`).replace(/\\./g, '/')} }`;\n control.bindProperty(\"enabled\", expr);\n }\n\n if (metadata.ui?.controlProps) {\n Logger.debug(`[BasePlugin] controlProps found for ${this.fieldKey}: ` + JSON.stringify(metadata.ui.controlProps), \"BasePlugin\");\n const targetControl = this.mainControl || control;\n const target = targetControl as unknown as {\n getMetadata?: () => { getName(): string },\n applySettings?: (settings: Record<string, any>) => void,\n setProperty?: (p: string, v: unknown) => void,\n bindProperty?: (p: string, v: string) => void\n };\n\n if (typeof target.getMetadata === \"function\") {\n const targetMeta = target.getMetadata();\n const settings: Record<string, any> = {};\n for (const [propName, propValue] of Object.entries(metadata.ui.controlProps)) {\n if (this.BLOCKED_PROPS.includes(propName)) {\n Logger.warn(`[BasePlugin] Cannot apply controlProps '${propName}' for field '${this.fieldKey}' - ILLEGAL OVERRIDE (Property is protected by sandbox)`);\n continue;\n }\n \n // Natively block any aggregations or events to prevent sandbox escapes\n if (typeof (targetMeta as any).hasAggregation === \"function\" && (targetMeta as any).hasAggregation(propName)) {\n Logger.warn(`[BasePlugin] Cannot apply controlProps '${propName}' for field '${this.fieldKey}' - ILLEGAL OVERRIDE (Cannot hijack aggregations)`);\n continue;\n }\n \n if (typeof (targetMeta as any).hasEvent === \"function\" && (targetMeta as any).hasEvent(propName)) {\n Logger.warn(`[BasePlugin] Cannot apply controlProps '${propName}' for field '${this.fieldKey}' - ILLEGAL OVERRIDE (Cannot hijack events)`);\n continue;\n }\n\n if (typeof propValue === \"string\" && propValue.startsWith(\"{\") && propValue.endsWith(\"}\")) {\n // The JSON payloads often hardcode 'metaui>' in raw expression bindings, \n // but the Engine dynamically generates model names like 'metaUI_Host1'. \n // We must inject the actual modelName dynamically into the expression string.\n const injectedValue = propValue.replace(/metaui>/g, `${modelName}>`);\n settings[propName] = injectedValue;\n } else {\n settings[propName] = propValue;\n }\n }\n\n try {\n const target = targetControl as unknown as { applySettings?: (s: Record<string, any>) => void };\n if (typeof target.applySettings === \"function\") {\n target.applySettings(settings);\n }\n } catch (err: unknown) {\n Logger.warn(`[BasePlugin] Failed to apply controlProps for field '${this.fieldKey}' on control ${targetMeta.getName()}: ${(err as Error).message}`);\n }\n }\n }\n }\n\n\n\n /**\n * Natively destroys the instantiated UI5 control to prevent memory leaks.\n * Can be overridden by subclasses if they manage secondary controls or custom models.\n */\n public destroy(): void {\n if (this.control && typeof this.control.destroy === \"function\") {\n this.control.destroy();\n this.control = null;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -44,6 +44,10 @@ declare module "nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin" {
|
|
|
44
44
|
* @param editable True if the plugin should render in editable mode.
|
|
45
45
|
*/
|
|
46
46
|
setEditable(editable: boolean): void;
|
|
47
|
+
/**
|
|
48
|
+
* Retrieves the human-readable label for the field from its metadata.
|
|
49
|
+
*/
|
|
50
|
+
getFieldLabel(): string | undefined;
|
|
47
51
|
/**
|
|
48
52
|
* Injects the global MessageManager context into the plugin.
|
|
49
53
|
* @param useMessageManager True if the MessageManager is handling validation visual states.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BasePlugin.d.ts","sourceRoot":"../../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"BasePlugin.d.ts","sourceRoot":"../../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/plugins/controls/BasePlugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
sap.ui.define(["../../core/PipelineManager","sap/ui/core/library","../../utils/Logger"],function(e,t,i){"use strict";const a=e["GlobalPipeline"];const
|
|
1
|
+
sap.ui.define(["../../core/PipelineManager","sap/ui/core/library","../../utils/Logger"],function(e,t,i){"use strict";const a=e["GlobalPipeline"];const n=i["Logger"];class s{control=null;BLOCKED_PROPS=["value","text","selectedKey","selected","dateValue","editable","enabled","visible","valueState","valueStateText","items","content","pages","formElements","change","press","select","submit"];metadata=null;fieldKey="";modelName="meta";isEditable=true;useMessageManager=false;policyInvalidMessage=null;setEditable(e){this.isEditable=e}getFieldLabel(){return this.metadata?.ui?.label||this.fieldKey}setUseMessageManager(e){this.useMessageManager=e}generateStableId(e,t){if(!e)return undefined;const i=t.replace(/^\//,"").replace(/\//g,"-");return`${e}--${i}`}generateBindingInfo(e,t,i,a){return{path:e,model:t,...i?{type:i}:{},...a||{}}}validate(){if(!this.control||!this.metadata)return{isValid:true};if(typeof this.control.getVisible==="function"){if(!this.control.getVisible()){return{isValid:true}}}if(this.policyInvalidMessage){return{isValid:false,errorMessage:this.policyInvalidMessage,fieldKey:this.fieldKey}}const e=[];const t={maxLength:this.metadata.maxLength};const i=this._isDynamicallyRequired!==undefined?this._isDynamicallyRequired:this.metadata.required;if(i){e.push("required")}if(this.metadata.maxLength)e.push("maxLength");if(this.metadata.minLength){e.push("minLength");t["minLength"]=this.metadata.minLength}if(this.metadata.pattern){e.push("pattern");t["pattern"]=this.metadata.pattern}if(this.metadata.minimum!==undefined||this.metadata.maximum!==undefined){e.push("range");t["range"]={min:this.metadata.minimum,max:this.metadata.maximum}}const n=this.metadata.ui?.format;if(n==="email"||n==="url"||n==="iban"){e.push(n)}if(this.metadata.ui?.validators){for(const i of this.metadata.ui.validators){if(typeof i==="string"){e.push(i)}else if(i&&i.name){e.push(i.name);if(i.args!==undefined){t[i.name]=i.args}}}}if(e.length===0){return{isValid:true,errorMessage:undefined,fieldKey:this.fieldKey}}const s=this.getValue();const l=a.executeValidation(s,e,t);return{isValid:l.isValid,errorMessage:l.errorMessage,fieldKey:this.fieldKey,fieldLabel:this.metadata?.ui?.label}}setVisualValidationState(e,i){if(!this.control)return;const a=this.control;if(typeof a.setValueState==="function"){a.setValueState(e?t.ValueState.None:t.ValueState.Error);if(typeof a.setValueStateText==="function"){a.setValueStateText(e?"":i||"")}}else{}}applyError(e){this.policyInvalidMessage=e;this.setVisualValidationState(false,e)}clearError(){this.policyInvalidMessage=null;this.setVisualValidationState(true)}applyVisibility(e){const t=this.control;if(t&&typeof t.setVisible==="function"){t.setVisible(e)}}applyRequired(e){this._isDynamicallyRequired=e;const t=this.control;if(t&&typeof t.setRequired==="function"){t.setRequired(e)}}applyEditable(e){const t=this.control;if(t&&typeof t.setEditable==="function"){t.setEditable(e)}else if(t&&typeof t.setEnabled==="function"){t.setEnabled(e)}}onStateChange(e){this.metadata=e;this.applyState()}applyCommonDirectives(e,t,i="meta"){const a=e;if(t.ui?.readOnly!==undefined&&typeof a.setEditable==="function"){a.setEditable(!t.ui.readOnly)}if(t.ui?.visibleOn){const a=`{= ${t.ui.visibleOn.replace(/\$root\./g,`${i}>/`).replace(/\./g,"/")} }`;e.bindProperty("visible",{parts:[{path:"meta>/"}],formatter:()=>false});e.bindProperty("visible",a)}if(t.ui?.enabledOn&&typeof a.setEnabled==="function"){const a=`{= ${t.ui.enabledOn.replace(/\$root\./g,`${i}>/`).replace(/\./g,"/")} }`;e.bindProperty("enabled",a)}if(t.ui?.controlProps){n.debug(`[BasePlugin] controlProps found for ${this.fieldKey}: `+JSON.stringify(t.ui.controlProps),"BasePlugin");const a=this.mainControl||e;const s=a;if(typeof s.getMetadata==="function"){const e=s.getMetadata();const l={};for(const[a,s]of Object.entries(t.ui.controlProps)){if(this.BLOCKED_PROPS.includes(a)){n.warn(`[BasePlugin] Cannot apply controlProps '${a}' for field '${this.fieldKey}' - ILLEGAL OVERRIDE (Property is protected by sandbox)`);continue}if(typeof e.hasAggregation==="function"&&e.hasAggregation(a)){n.warn(`[BasePlugin] Cannot apply controlProps '${a}' for field '${this.fieldKey}' - ILLEGAL OVERRIDE (Cannot hijack aggregations)`);continue}if(typeof e.hasEvent==="function"&&e.hasEvent(a)){n.warn(`[BasePlugin] Cannot apply controlProps '${a}' for field '${this.fieldKey}' - ILLEGAL OVERRIDE (Cannot hijack events)`);continue}if(typeof s==="string"&&s.startsWith("{")&&s.endsWith("}")){const e=s.replace(/metaui>/g,`${i}>`);l[a]=e}else{l[a]=s}}try{const e=a;if(typeof e.applySettings==="function"){e.applySettings(l)}}catch(t){n.warn(`[BasePlugin] Failed to apply controlProps for field '${this.fieldKey}' on control ${e.getName()}: ${t.message}`)}}}}destroy(){if(this.control&&typeof this.control.destroy==="function"){this.control.destroy();this.control=null}}}var l={__esModule:true};l.BasePlugin=s;return l});
|
|
2
2
|
//# sourceMappingURL=BasePlugin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BasePlugin.js","names":["GlobalPipeline","____core_PipelineManager","Logger","____utils_Logger","BasePlugin","control","BLOCKED_PROPS","metadata","fieldKey","modelName","isEditable","useMessageManager","policyInvalidMessage","setEditable","editable","this","setUseMessageManager","generateStableId","engineScopeId","bindingPath","undefined","safePath","replace","generateBindingInfo","typeInstance","additionalOptions","path","model","type","validate","isValid","getVisible","errorMessage","validatorsToRun","argsMap","maxLength","isRequired","_isDynamicallyRequired","required","push","minLength","pattern","minimum","maximum","min","max","format","ui","validators","v","name","args","length","val","getValue","result","executeValidation","fieldLabel","label","setVisualValidationState","ctrl","setValueState","coreLibrary","ValueState","None","Error","setValueStateText","applyError","clearError","applyVisibility","isVisible","setVisible","applyRequired","setRequired","applyEditable","setEnabled","onStateChange","newMetadata","applyState","applyCommonDirectives","readOnly","visibleOn","ExpressionBuilder","sap","require","expr","build","bindProperty","parts","formatter","enabledOn","controlProps","console","error","targetControl","mainControl","target","getMetadata","targetMeta","settings","propName","propValue","Object","entries","includes","warn","hasAggregation","hasEvent","startsWith","endsWith","injectedValue","applySettings","err","getName","message","destroy","__exports","__esModule"],"sources":["BasePlugin.ts"],"sourcesContent":["/**\n * @file BasePlugin.ts\n * @description Abstract foundation for all MetaUI plugins, enforcing lifecycle hooks for v2 Schema.\n */\n\nimport { IPlugin } from \"../../interfaces/IPlugin\";\nimport { IPropertyMetadata } from \"../../interfaces/ISchema\";\nimport Control from \"sap/ui/core/Control\";\nimport { GlobalPipeline } from \"../../core/PipelineManager\";\nimport * as coreLibrary from \"sap/ui/core/library\";\nimport { Logger } from \"../../utils/Logger\";\n\n/**\n * Abstract class representing a standard MetaUI Plugin.\n * Enforces the required rendering, state extraction, and validation contracts.\n * \n * @abstract\n * @public\n */\nexport abstract class BasePlugin implements IPlugin {\n /** The instantiated UI5 control for this plugin. */\n protected control: Control | null = null;\n\n /** Explicit reference to the core data widget when this plugin is wrapped in a layout. */\n protected mainControl?: Control;\n\n /** Properties strictly protected by the Sandbox engine. */\n protected BLOCKED_PROPS = [\"value\", \"text\", \"selectedKey\", \"selected\", \"dateValue\", \"editable\", \"enabled\", \"visible\", \"valueState\", \"valueStateText\", \"items\", \"content\", \"pages\", \"formElements\", \"change\", \"press\", \"select\", \"submit\"];\n\n /** The metadata schema defining the field rules. */\n protected metadata: IPropertyMetadata | null = null;\n\n /** The internal JSON path of the field relative to its parent payload. */\n protected fieldKey: string = \"\";\n\n /** The UI5 JSONModel name used for absolute binding paths. */\n protected modelName: string = \"meta\";\n\n /** Indicates if the engine is enforcing an editable mode. */\n protected isEditable: boolean = true;\n\n /** Indicates if the plugin should delegate visual validation to the MessageManager. */\n protected useMessageManager: boolean = false;\n\n /** Internal callback provided by GeneratorHost to signal validation/data changes upwards */\n protected onChange?: (isValid: boolean, fieldKey?: string, errorMessage?: string, controlId?: string) => void;\n\n /** \n * Tracks explicitly forced invalid states pushed down from the PolicyEngine.\n * When populated, this error takes absolute precedence over static SchemaValidator rules.\n */\n protected policyInvalidMessage: string | null = null;\n\n /** Transient state tracking for PBRE required evaluations to prevent schema clobbering */\n protected _isDynamicallyRequired?: boolean;\n\n /**\n * Injects the global editable mode context into the plugin before rendering.\n * @param editable True if the plugin should render in editable mode.\n */\n public setEditable(editable: boolean): void {\n this.isEditable = editable;\n }\n\n /**\n * Injects the global MessageManager context into the plugin.\n * @param useMessageManager True if the MessageManager is handling validation visual states.\n */\n public setUseMessageManager(useMessageManager: boolean): void {\n this.useMessageManager = useMessageManager;\n }\n\n /**\n * Instantiates the raw UI5 control and binds it to the model.\n * \n * @param fieldMetadata The JSON Schema for the field.\n * @param bindingPath The JSON path to bind to.\n * @param modelName The UI5 model name.\n * @param engineScopeId The deterministic scope ID provided by the Engine to prevent cloning collisions.\n * @param onChange The callback fired natively when a field value blur/change occurs.\n * @returns {Control} The generated UI5 control.\n */\n public abstract render(fieldMetadata: IPropertyMetadata, bindingPath: string, modelName?: string, engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string, errorMessage?: string, controlId?: string) => void, model?: unknown): Control;\n\n /**\n * Generates a deterministic, globally unique ID for this control.\n * Prefixes the sanitized binding path with the Engine's scoped ID.\n */\n protected generateStableId(engineScopeId: string | undefined, bindingPath: string): string | undefined {\n if (!engineScopeId) return undefined;\n // Strip leading slash and replace internal slashes with hyphens\n const safePath = bindingPath.replace(/^\\//, '').replace(/\\//g, '-');\n return `${engineScopeId}--${safePath}`;\n }\n\n /**\n * Extracts the current raw value from the underlying UI5 control.\n */\n protected abstract getValue(): unknown;\n\n /**\n * Generates a standardized programmatic binding configuration object.\n * Ensures perfect architectural consistency across all plugins instead of relying on string parsing.\n * \n * @param bindingPath The relative or absolute path.\n * @param modelName The target model name.\n * @param typeInstance An optional UI5 Type instance (e.g. Integer, Float).\n * @param additionalOptions Optional extra configurations (e.g. formatOptions, constraints).\n * @returns A configuration object ready to be assigned to 'value', 'text', 'state', etc.\n */\n protected generateBindingInfo(bindingPath: string, modelName: string, typeInstance?: unknown, additionalOptions?: Record<string, unknown>): any {\n return {\n path: bindingPath,\n model: modelName,\n ...(typeInstance ? { type: typeInstance } : {}),\n ...(additionalOptions || {})\n };\n }\n\n /**\n * Universal pipeline validation.\n */\n public validate(): import(\"../../interfaces/IPlugin\").IPluginValidationResult {\n if (!this.control || !this.metadata) return { isValid: true };\n\n // Skip validation for hidden fields (e.g. hidden by ConditionEngine visibleOn)\n if (typeof (this.control as Control).getVisible === \"function\") {\n if (!(this.control as Control).getVisible()) {\n return { isValid: true };\n }\n }\n\n if (this.policyInvalidMessage) {\n return { isValid: false, errorMessage: this.policyInvalidMessage, fieldKey: this.fieldKey };\n }\n\n const validatorsToRun: string[] = [];\n const argsMap: Record<string, unknown> = {\n \"maxLength\": this.metadata.maxLength\n };\n\n const isRequired = this._isDynamicallyRequired !== undefined ? this._isDynamicallyRequired : this.metadata.required;\n if (isRequired) {\n validatorsToRun.push(\"required\");\n }\n if (this.metadata.maxLength) validatorsToRun.push(\"maxLength\");\n if (this.metadata.minLength) {\n validatorsToRun.push(\"minLength\");\n argsMap[\"minLength\"] = this.metadata.minLength;\n }\n if (this.metadata.pattern) {\n validatorsToRun.push(\"pattern\");\n argsMap[\"pattern\"] = this.metadata.pattern;\n }\n if (this.metadata.minimum !== undefined || this.metadata.maximum !== undefined) {\n validatorsToRun.push(\"range\");\n argsMap[\"range\"] = { min: this.metadata.minimum, max: this.metadata.maximum };\n }\n\n const format = this.metadata.ui?.format;\n if (format === \"email\" || format === \"url\" || format === \"iban\") {\n validatorsToRun.push(format);\n }\n\n if (this.metadata.ui?.validators) {\n for (const v of this.metadata.ui.validators) {\n if (typeof v === \"string\") {\n validatorsToRun.push(v);\n } else if (v && v.name) {\n validatorsToRun.push(v.name);\n if (v.args !== undefined) {\n argsMap[v.name] = v.args;\n }\n }\n }\n }\n\n if (validatorsToRun.length === 0) {\n return { isValid: true, errorMessage: undefined, fieldKey: this.fieldKey };\n }\n\n const val = this.getValue();\n const result = GlobalPipeline.executeValidation(val, validatorsToRun, argsMap);\n return { isValid: result.isValid, errorMessage: result.errorMessage, fieldKey: this.fieldKey, fieldLabel: this.metadata?.ui?.label };\n }\n\n /**\n * Natively manipulates the UI5 control's valueState if the control supports it.\n * Uses reflection to safely apply styles without crashing on structural controls.\n */\n public setVisualValidationState(isValid: boolean, errorMessage?: string): void {\n if (!this.control) return;\n\n\n // Use reflection to check if the control supports ValueState (e.g. sap.m.Input does, sap.m.Text does not)\n type StateControl = {\n setValueState?: (state: string) => void;\n setValueStateText?: (text: string) => void;\n };\n const ctrl = this.control as unknown as StateControl;\n if (typeof ctrl.setValueState === \"function\") {\n ctrl.setValueState(isValid ? coreLibrary.ValueState.None : coreLibrary.ValueState.Error);\n\n if (typeof ctrl.setValueStateText === \"function\") {\n ctrl.setValueStateText(isValid ? \"\" : (errorMessage || \"\"));\n }\n } else {\n // Quietly ignore. Controls like sap.m.Text natively do not support value states, which is completely valid.\n }\n }\n\n\n\n // --- IPluginStateReceiver Implementation for PBRE ---\n\n /**\n * Natively applies a forced error state from the PolicyEngine.\n * Per MetaUI Architecture Rule 12, this explicitly forces the visual state red \n * independently of the MessageManager auto-sync.\n * \n * @param errorMessage The custom error message to display.\n */\n public applyError(errorMessage: string): void {\n this.policyInvalidMessage = errorMessage;\n this.setVisualValidationState(false, errorMessage);\n }\n\n /**\n * Clears a previously forced error state.\n * Restores the visual boundary to standard (non-error) formatting.\n */\n public clearError(): void {\n this.policyInvalidMessage = null;\n this.setVisualValidationState(true);\n }\n\n /**\n * Dynamically manipulates the visibility state of the control based on PolicyEngine directives.\n * \n * @param isVisible True to display the control, false to hide it.\n */\n public applyVisibility(isVisible: boolean): void {\n const ctrl = this.control as unknown as { setVisible?: (b: boolean) => void };\n if (ctrl && typeof ctrl.setVisible === \"function\") {\n ctrl.setVisible(isVisible);\n }\n }\n\n /**\n * Dynamically alters the mandatory status of the field.\n * Updates internal transient state to ensure the `validate()` pipeline enforces the change,\n * and natively triggers the UI5 required indicator (asterisk) if supported,\n * without permanently corrupting the shared global schema definition.\n * \n * @param isRequired True to make the field mandatory, false to make it optional.\n */\n public applyRequired(isRequired: boolean): void {\n this._isDynamicallyRequired = isRequired;\n const ctrl = this.control as unknown as { setRequired?: (b: boolean) => void };\n if (ctrl && typeof ctrl.setRequired === \"function\") {\n ctrl.setRequired(isRequired);\n }\n }\n\n /**\n * Dynamically alters the editability of the field.\n * Falls back to `setEnabled` if the control is structural rather than purely input-driven.\n * \n * @param isEditable True to allow user input, false to lock it.\n */\n public applyEditable(isEditable: boolean): void {\n const ctrl = this.control as unknown as { setEditable?: (b: boolean) => void, setEnabled?: (b: boolean) => void };\n if (ctrl && typeof ctrl.setEditable === \"function\") {\n ctrl.setEditable(isEditable);\n } else if (ctrl && typeof ctrl.setEnabled === \"function\") {\n ctrl.setEnabled(isEditable);\n }\n }\n\n /**\n * Executes when the condition engine pushes new schema metadata to this field (e.g. readOnly changing).\n * @param newMetadata The mutated schema metadata.\n */\n public onStateChange(newMetadata: IPropertyMetadata): void {\n this.metadata = newMetadata;\n this.applyState();\n }\n\n /**\n * Abstract hook for the plugin to apply state changes to its specific UI5 control (e.g. placeholders, labels).\n */\n protected abstract applyState(): void;\n\n /**\n * Helper to apply common UI directives (like readOnly, visibleOn) directly to any control.\n */\n protected applyCommonDirectives(control: Control, metadata: IPropertyMetadata, modelName: string = \"meta\"): void {\n const ctrl = control as unknown as { setEditable?: (b: boolean) => void, setEnabled?: (b: boolean) => void };\n if (metadata.ui?.readOnly !== undefined && typeof ctrl.setEditable === \"function\") {\n ctrl.setEditable(!metadata.ui.readOnly);\n }\n\n if (metadata.ui?.visibleOn) {\n const ExpressionBuilder = sap.ui.require(\"nz/co/siliconst/ui5/metaui/utils/ExpressionBuilder\")?.ExpressionBuilder;\n let expr = \"\";\n if (ExpressionBuilder) {\n expr = ExpressionBuilder.build(metadata.ui.visibleOn, this.fieldKey, modelName);\n } else {\n expr = `{= ${metadata.ui.visibleOn.replace(/\\$root\\./g, `${modelName}>/`).replace(/\\./g, '/')} }`;\n }\n control.bindProperty(\"visible\", { parts: [{ path: \"meta>/\" }], formatter: () => false });\n control.bindProperty(\"visible\", expr);\n }\n\n if (metadata.ui?.enabledOn && typeof ctrl.setEnabled === \"function\") {\n const ExpressionBuilder = sap.ui.require(\"nz/co/siliconst/ui5/metaui/utils/ExpressionBuilder\")?.ExpressionBuilder;\n let expr = \"\";\n if (ExpressionBuilder) {\n expr = ExpressionBuilder.build(metadata.ui.enabledOn, this.fieldKey, modelName);\n } else {\n expr = `{= ${metadata.ui.enabledOn.replace(/\\$root\\./g, `${modelName}>/`).replace(/\\./g, '/')} }`;\n }\n control.bindProperty(\"enabled\", expr);\n }\n\n if (metadata.ui?.controlProps) {\n console.error(`[DEBUG MetaUI] controlProps found for ${this.fieldKey}`, metadata.ui.controlProps);\n const targetControl = this.mainControl || control;\n const target = targetControl as unknown as {\n getMetadata?: () => { getName(): string },\n applySettings?: (settings: Record<string, any>) => void,\n setProperty?: (p: string, v: unknown) => void,\n bindProperty?: (p: string, v: string) => void\n };\n\n if (typeof target.getMetadata === \"function\") {\n const targetMeta = target.getMetadata();\n const settings: Record<string, any> = {};\n for (const [propName, propValue] of Object.entries(metadata.ui.controlProps)) {\n if (this.BLOCKED_PROPS.includes(propName)) {\n Logger.warn(`[BasePlugin] Cannot apply controlProps '${propName}' for field '${this.fieldKey}' - ILLEGAL OVERRIDE (Property is protected by sandbox)`);\n continue;\n }\n \n // Natively block any aggregations or events to prevent sandbox escapes\n if (typeof (targetMeta as any).hasAggregation === \"function\" && (targetMeta as any).hasAggregation(propName)) {\n Logger.warn(`[BasePlugin] Cannot apply controlProps '${propName}' for field '${this.fieldKey}' - ILLEGAL OVERRIDE (Cannot hijack aggregations)`);\n continue;\n }\n \n if (typeof (targetMeta as any).hasEvent === \"function\" && (targetMeta as any).hasEvent(propName)) {\n Logger.warn(`[BasePlugin] Cannot apply controlProps '${propName}' for field '${this.fieldKey}' - ILLEGAL OVERRIDE (Cannot hijack events)`);\n continue;\n }\n\n if (typeof propValue === \"string\" && propValue.startsWith(\"{\") && propValue.endsWith(\"}\")) {\n // The JSON payloads often hardcode 'metaui>' in raw expression bindings, \n // but the Engine dynamically generates model names like 'metaUI_Host1'. \n // We must inject the actual modelName dynamically into the expression string.\n const injectedValue = propValue.replace(/metaui>/g, `${modelName}>`);\n settings[propName] = injectedValue;\n } else {\n settings[propName] = propValue;\n }\n }\n\n try {\n const target = targetControl as unknown as { applySettings?: (s: Record<string, any>) => void };\n if (typeof target.applySettings === \"function\") {\n target.applySettings(settings);\n }\n } catch (err: unknown) {\n Logger.warn(`[BasePlugin] Failed to apply controlProps for field '${this.fieldKey}' on control ${targetMeta.getName()}: ${(err as Error).message}`);\n }\n }\n }\n }\n\n\n\n /**\n * Natively destroys the instantiated UI5 control to prevent memory leaks.\n * Can be overridden by subclasses if they manage secondary controls or custom models.\n */\n public destroy(): void {\n if (this.control && typeof this.control.destroy === \"function\") {\n this.control.destroy();\n this.control = null;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"BasePlugin.js","names":["GlobalPipeline","____core_PipelineManager","Logger","____utils_Logger","BasePlugin","control","BLOCKED_PROPS","metadata","fieldKey","modelName","isEditable","useMessageManager","policyInvalidMessage","setEditable","editable","this","getFieldLabel","ui","label","setUseMessageManager","generateStableId","engineScopeId","bindingPath","undefined","safePath","replace","generateBindingInfo","typeInstance","additionalOptions","path","model","type","validate","isValid","getVisible","errorMessage","validatorsToRun","argsMap","maxLength","isRequired","_isDynamicallyRequired","required","push","minLength","pattern","minimum","maximum","min","max","format","validators","v","name","args","length","val","getValue","result","executeValidation","fieldLabel","setVisualValidationState","ctrl","setValueState","coreLibrary","ValueState","None","Error","setValueStateText","applyError","clearError","applyVisibility","isVisible","setVisible","applyRequired","setRequired","applyEditable","setEnabled","onStateChange","newMetadata","applyState","applyCommonDirectives","readOnly","visibleOn","expr","bindProperty","parts","formatter","enabledOn","controlProps","debug","JSON","stringify","targetControl","mainControl","target","getMetadata","targetMeta","settings","propName","propValue","Object","entries","includes","warn","hasAggregation","hasEvent","startsWith","endsWith","injectedValue","applySettings","err","getName","message","destroy","__exports","__esModule"],"sources":["BasePlugin.ts"],"sourcesContent":["/**\n * @file BasePlugin.ts\n * @description Abstract foundation for all MetaUI plugins, enforcing lifecycle hooks for v2 Schema.\n */\n\nimport { IPlugin } from \"../../interfaces/IPlugin\";\nimport { IPropertyMetadata } from \"../../interfaces/ISchema\";\nimport Control from \"sap/ui/core/Control\";\nimport { GlobalPipeline } from \"../../core/PipelineManager\";\nimport * as coreLibrary from \"sap/ui/core/library\";\nimport { Logger } from \"../../utils/Logger\";\n\n/**\n * Abstract class representing a standard MetaUI Plugin.\n * Enforces the required rendering, state extraction, and validation contracts.\n * \n * @abstract\n * @public\n */\nexport abstract class BasePlugin implements IPlugin {\n /** The instantiated UI5 control for this plugin. */\n protected control: Control | null = null;\n\n /** Explicit reference to the core data widget when this plugin is wrapped in a layout. */\n protected mainControl?: Control;\n\n /** Properties strictly protected by the Sandbox engine. */\n protected BLOCKED_PROPS = [\"value\", \"text\", \"selectedKey\", \"selected\", \"dateValue\", \"editable\", \"enabled\", \"visible\", \"valueState\", \"valueStateText\", \"items\", \"content\", \"pages\", \"formElements\", \"change\", \"press\", \"select\", \"submit\"];\n\n /** The metadata schema defining the field rules. */\n protected metadata: IPropertyMetadata | null = null;\n\n /** The internal JSON path of the field relative to its parent payload. */\n protected fieldKey: string = \"\";\n\n /** The UI5 JSONModel name used for absolute binding paths. */\n protected modelName: string = \"meta\";\n\n /** Indicates if the engine is enforcing an editable mode. */\n protected isEditable: boolean = true;\n\n /** Indicates if the plugin should delegate visual validation to the MessageManager. */\n protected useMessageManager: boolean = false;\n\n /** Internal callback provided by GeneratorHost to signal validation/data changes upwards */\n protected onChange?: (isValid: boolean, fieldKey?: string, errorMessage?: string, controlId?: string) => void;\n\n /** \n * Tracks explicitly forced invalid states pushed down from the PolicyEngine.\n * When populated, this error takes absolute precedence over static SchemaValidator rules.\n */\n protected policyInvalidMessage: string | null = null;\n\n /** Transient state tracking for PBRE required evaluations to prevent schema clobbering */\n protected _isDynamicallyRequired?: boolean;\n\n /**\n * Injects the global editable mode context into the plugin before rendering.\n * @param editable True if the plugin should render in editable mode.\n */\n public setEditable(editable: boolean): void {\n this.isEditable = editable;\n }\n\n /**\n * Retrieves the human-readable label for the field from its metadata.\n */\n public getFieldLabel(): string | undefined {\n return this.metadata?.ui?.label || this.fieldKey;\n }\n\n /**\n * Injects the global MessageManager context into the plugin.\n * @param useMessageManager True if the MessageManager is handling validation visual states.\n */\n public setUseMessageManager(useMessageManager: boolean): void {\n this.useMessageManager = useMessageManager;\n }\n\n /**\n * Instantiates the raw UI5 control and binds it to the model.\n * \n * @param fieldMetadata The JSON Schema for the field.\n * @param bindingPath The JSON path to bind to.\n * @param modelName The UI5 model name.\n * @param engineScopeId The deterministic scope ID provided by the Engine to prevent cloning collisions.\n * @param onChange The callback fired natively when a field value blur/change occurs.\n * @returns {Control} The generated UI5 control.\n */\n public abstract render(fieldMetadata: IPropertyMetadata, bindingPath: string, modelName?: string, engineScopeId?: string, onChange?: (isValid: boolean, fieldKey?: string, errorMessage?: string, controlId?: string) => void, model?: unknown): Control;\n\n /**\n * Generates a deterministic, globally unique ID for this control.\n * Prefixes the sanitized binding path with the Engine's scoped ID.\n */\n protected generateStableId(engineScopeId: string | undefined, bindingPath: string): string | undefined {\n if (!engineScopeId) return undefined;\n // Strip leading slash and replace internal slashes with hyphens\n const safePath = bindingPath.replace(/^\\//, '').replace(/\\//g, '-');\n return `${engineScopeId}--${safePath}`;\n }\n\n /**\n * Extracts the current raw value from the underlying UI5 control.\n */\n protected abstract getValue(): unknown;\n\n /**\n * Generates a standardized programmatic binding configuration object.\n * Ensures perfect architectural consistency across all plugins instead of relying on string parsing.\n * \n * @param bindingPath The relative or absolute path.\n * @param modelName The target model name.\n * @param typeInstance An optional UI5 Type instance (e.g. Integer, Float).\n * @param additionalOptions Optional extra configurations (e.g. formatOptions, constraints).\n * @returns A configuration object ready to be assigned to 'value', 'text', 'state', etc.\n */\n protected generateBindingInfo(bindingPath: string, modelName: string, typeInstance?: unknown, additionalOptions?: Record<string, unknown>): any {\n return {\n path: bindingPath,\n model: modelName,\n ...(typeInstance ? { type: typeInstance } : {}),\n ...(additionalOptions || {})\n };\n }\n\n /**\n * Universal pipeline validation.\n */\n public validate(): import(\"../../interfaces/IPlugin\").IPluginValidationResult {\n if (!this.control || !this.metadata) return { isValid: true };\n\n // Skip validation for hidden fields (e.g. hidden by ConditionEngine visibleOn)\n if (typeof (this.control as Control).getVisible === \"function\") {\n if (!(this.control as Control).getVisible()) {\n return { isValid: true };\n }\n }\n\n if (this.policyInvalidMessage) {\n return { isValid: false, errorMessage: this.policyInvalidMessage, fieldKey: this.fieldKey };\n }\n\n const validatorsToRun: string[] = [];\n const argsMap: Record<string, unknown> = {\n \"maxLength\": this.metadata.maxLength\n };\n\n const isRequired = this._isDynamicallyRequired !== undefined ? this._isDynamicallyRequired : this.metadata.required;\n if (isRequired) {\n validatorsToRun.push(\"required\");\n }\n if (this.metadata.maxLength) validatorsToRun.push(\"maxLength\");\n if (this.metadata.minLength) {\n validatorsToRun.push(\"minLength\");\n argsMap[\"minLength\"] = this.metadata.minLength;\n }\n if (this.metadata.pattern) {\n validatorsToRun.push(\"pattern\");\n argsMap[\"pattern\"] = this.metadata.pattern;\n }\n if (this.metadata.minimum !== undefined || this.metadata.maximum !== undefined) {\n validatorsToRun.push(\"range\");\n argsMap[\"range\"] = { min: this.metadata.minimum, max: this.metadata.maximum };\n }\n\n const format = this.metadata.ui?.format;\n if (format === \"email\" || format === \"url\" || format === \"iban\") {\n validatorsToRun.push(format);\n }\n\n if (this.metadata.ui?.validators) {\n for (const v of this.metadata.ui.validators) {\n if (typeof v === \"string\") {\n validatorsToRun.push(v);\n } else if (v && v.name) {\n validatorsToRun.push(v.name);\n if (v.args !== undefined) {\n argsMap[v.name] = v.args;\n }\n }\n }\n }\n\n if (validatorsToRun.length === 0) {\n return { isValid: true, errorMessage: undefined, fieldKey: this.fieldKey };\n }\n\n const val = this.getValue();\n const result = GlobalPipeline.executeValidation(val, validatorsToRun, argsMap);\n return { isValid: result.isValid, errorMessage: result.errorMessage, fieldKey: this.fieldKey, fieldLabel: this.metadata?.ui?.label };\n }\n\n /**\n * Natively manipulates the UI5 control's valueState if the control supports it.\n * Uses reflection to safely apply styles without crashing on structural controls.\n */\n public setVisualValidationState(isValid: boolean, errorMessage?: string): void {\n if (!this.control) return;\n\n\n // Use reflection to check if the control supports ValueState (e.g. sap.m.Input does, sap.m.Text does not)\n type StateControl = {\n setValueState?: (state: string) => void;\n setValueStateText?: (text: string) => void;\n };\n const ctrl = this.control as unknown as StateControl;\n if (typeof ctrl.setValueState === \"function\") {\n ctrl.setValueState(isValid ? coreLibrary.ValueState.None : coreLibrary.ValueState.Error);\n\n if (typeof ctrl.setValueStateText === \"function\") {\n ctrl.setValueStateText(isValid ? \"\" : (errorMessage || \"\"));\n }\n } else {\n // Quietly ignore. Controls like sap.m.Text natively do not support value states, which is completely valid.\n }\n }\n\n\n\n // --- IPluginStateReceiver Implementation for PBRE ---\n\n /**\n * Natively applies a forced error state from the PolicyEngine.\n * Per MetaUI Architecture Rule 12, this explicitly forces the visual state red \n * independently of the MessageManager auto-sync.\n * \n * @param errorMessage The custom error message to display.\n */\n public applyError(errorMessage: string): void {\n this.policyInvalidMessage = errorMessage;\n this.setVisualValidationState(false, errorMessage);\n }\n\n /**\n * Clears a previously forced error state.\n * Restores the visual boundary to standard (non-error) formatting.\n */\n public clearError(): void {\n this.policyInvalidMessage = null;\n this.setVisualValidationState(true);\n }\n\n /**\n * Dynamically manipulates the visibility state of the control based on PolicyEngine directives.\n * \n * @param isVisible True to display the control, false to hide it.\n */\n public applyVisibility(isVisible: boolean): void {\n const ctrl = this.control as unknown as { setVisible?: (b: boolean) => void };\n if (ctrl && typeof ctrl.setVisible === \"function\") {\n ctrl.setVisible(isVisible);\n }\n }\n\n /**\n * Dynamically alters the mandatory status of the field.\n * Updates internal transient state to ensure the `validate()` pipeline enforces the change,\n * and natively triggers the UI5 required indicator (asterisk) if supported,\n * without permanently corrupting the shared global schema definition.\n * \n * @param isRequired True to make the field mandatory, false to make it optional.\n */\n public applyRequired(isRequired: boolean): void {\n this._isDynamicallyRequired = isRequired;\n const ctrl = this.control as unknown as { setRequired?: (b: boolean) => void };\n if (ctrl && typeof ctrl.setRequired === \"function\") {\n ctrl.setRequired(isRequired);\n }\n }\n\n /**\n * Dynamically alters the editability of the field.\n * Falls back to `setEnabled` if the control is structural rather than purely input-driven.\n * \n * @param isEditable True to allow user input, false to lock it.\n */\n public applyEditable(isEditable: boolean): void {\n const ctrl = this.control as unknown as { setEditable?: (b: boolean) => void, setEnabled?: (b: boolean) => void };\n if (ctrl && typeof ctrl.setEditable === \"function\") {\n ctrl.setEditable(isEditable);\n } else if (ctrl && typeof ctrl.setEnabled === \"function\") {\n ctrl.setEnabled(isEditable);\n }\n }\n\n /**\n * Executes when the condition engine pushes new schema metadata to this field (e.g. readOnly changing).\n * @param newMetadata The mutated schema metadata.\n */\n public onStateChange(newMetadata: IPropertyMetadata): void {\n this.metadata = newMetadata;\n this.applyState();\n }\n\n /**\n * Abstract hook for the plugin to apply state changes to its specific UI5 control (e.g. placeholders, labels).\n */\n protected abstract applyState(): void;\n\n /**\n * Helper to apply common UI directives (like readOnly, visibleOn) directly to any control.\n */\n protected applyCommonDirectives(control: Control, metadata: IPropertyMetadata, modelName: string = \"meta\"): void {\n const ctrl = control as unknown as { setEditable?: (b: boolean) => void, setEnabled?: (b: boolean) => void };\n if (metadata.ui?.readOnly !== undefined && typeof ctrl.setEditable === \"function\") {\n ctrl.setEditable(!metadata.ui.readOnly);\n }\n\n if (metadata.ui?.visibleOn) {\n const expr = `{= ${metadata.ui.visibleOn.replace(/\\$root\\./g, `${modelName}>/`).replace(/\\./g, '/')} }`;\n control.bindProperty(\"visible\", { parts: [{ path: \"meta>/\" }], formatter: () => false });\n control.bindProperty(\"visible\", expr);\n }\n\n if (metadata.ui?.enabledOn && typeof ctrl.setEnabled === \"function\") {\n const expr = `{= ${metadata.ui.enabledOn.replace(/\\$root\\./g, `${modelName}>/`).replace(/\\./g, '/')} }`;\n control.bindProperty(\"enabled\", expr);\n }\n\n if (metadata.ui?.controlProps) {\n Logger.debug(`[BasePlugin] controlProps found for ${this.fieldKey}: ` + JSON.stringify(metadata.ui.controlProps), \"BasePlugin\");\n const targetControl = this.mainControl || control;\n const target = targetControl as unknown as {\n getMetadata?: () => { getName(): string },\n applySettings?: (settings: Record<string, any>) => void,\n setProperty?: (p: string, v: unknown) => void,\n bindProperty?: (p: string, v: string) => void\n };\n\n if (typeof target.getMetadata === \"function\") {\n const targetMeta = target.getMetadata();\n const settings: Record<string, any> = {};\n for (const [propName, propValue] of Object.entries(metadata.ui.controlProps)) {\n if (this.BLOCKED_PROPS.includes(propName)) {\n Logger.warn(`[BasePlugin] Cannot apply controlProps '${propName}' for field '${this.fieldKey}' - ILLEGAL OVERRIDE (Property is protected by sandbox)`);\n continue;\n }\n \n // Natively block any aggregations or events to prevent sandbox escapes\n if (typeof (targetMeta as any).hasAggregation === \"function\" && (targetMeta as any).hasAggregation(propName)) {\n Logger.warn(`[BasePlugin] Cannot apply controlProps '${propName}' for field '${this.fieldKey}' - ILLEGAL OVERRIDE (Cannot hijack aggregations)`);\n continue;\n }\n \n if (typeof (targetMeta as any).hasEvent === \"function\" && (targetMeta as any).hasEvent(propName)) {\n Logger.warn(`[BasePlugin] Cannot apply controlProps '${propName}' for field '${this.fieldKey}' - ILLEGAL OVERRIDE (Cannot hijack events)`);\n continue;\n }\n\n if (typeof propValue === \"string\" && propValue.startsWith(\"{\") && propValue.endsWith(\"}\")) {\n // The JSON payloads often hardcode 'metaui>' in raw expression bindings, \n // but the Engine dynamically generates model names like 'metaUI_Host1'. \n // We must inject the actual modelName dynamically into the expression string.\n const injectedValue = propValue.replace(/metaui>/g, `${modelName}>`);\n settings[propName] = injectedValue;\n } else {\n settings[propName] = propValue;\n }\n }\n\n try {\n const target = targetControl as unknown as { applySettings?: (s: Record<string, any>) => void };\n if (typeof target.applySettings === \"function\") {\n target.applySettings(settings);\n }\n } catch (err: unknown) {\n Logger.warn(`[BasePlugin] Failed to apply controlProps for field '${this.fieldKey}' on control ${targetMeta.getName()}: ${(err as Error).message}`);\n }\n }\n }\n }\n\n\n\n /**\n * Natively destroys the instantiated UI5 control to prevent memory leaks.\n * Can be overridden by subclasses if they manage secondary controls or custom models.\n */\n public destroy(): void {\n if (this.control && typeof this.control.destroy === \"function\") {\n this.control.destroy();\n this.control = null;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -62,6 +62,13 @@ export abstract class BasePlugin implements IPlugin {
|
|
|
62
62
|
this.isEditable = editable;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
/**
|
|
66
|
+
* Retrieves the human-readable label for the field from its metadata.
|
|
67
|
+
*/
|
|
68
|
+
public getFieldLabel(): string | undefined {
|
|
69
|
+
return this.metadata?.ui?.label || this.fieldKey;
|
|
70
|
+
}
|
|
71
|
+
|
|
65
72
|
/**
|
|
66
73
|
* Injects the global MessageManager context into the plugin.
|
|
67
74
|
* @param useMessageManager True if the MessageManager is handling validation visual states.
|
|
@@ -301,30 +308,18 @@ export abstract class BasePlugin implements IPlugin {
|
|
|
301
308
|
}
|
|
302
309
|
|
|
303
310
|
if (metadata.ui?.visibleOn) {
|
|
304
|
-
const
|
|
305
|
-
let expr = "";
|
|
306
|
-
if (ExpressionBuilder) {
|
|
307
|
-
expr = ExpressionBuilder.build(metadata.ui.visibleOn, this.fieldKey, modelName);
|
|
308
|
-
} else {
|
|
309
|
-
expr = `{= ${metadata.ui.visibleOn.replace(/\$root\./g, `${modelName}>/`).replace(/\./g, '/')} }`;
|
|
310
|
-
}
|
|
311
|
+
const expr = `{= ${metadata.ui.visibleOn.replace(/\$root\./g, `${modelName}>/`).replace(/\./g, '/')} }`;
|
|
311
312
|
control.bindProperty("visible", { parts: [{ path: "meta>/" }], formatter: () => false });
|
|
312
313
|
control.bindProperty("visible", expr);
|
|
313
314
|
}
|
|
314
315
|
|
|
315
316
|
if (metadata.ui?.enabledOn && typeof ctrl.setEnabled === "function") {
|
|
316
|
-
const
|
|
317
|
-
let expr = "";
|
|
318
|
-
if (ExpressionBuilder) {
|
|
319
|
-
expr = ExpressionBuilder.build(metadata.ui.enabledOn, this.fieldKey, modelName);
|
|
320
|
-
} else {
|
|
321
|
-
expr = `{= ${metadata.ui.enabledOn.replace(/\$root\./g, `${modelName}>/`).replace(/\./g, '/')} }`;
|
|
322
|
-
}
|
|
317
|
+
const expr = `{= ${metadata.ui.enabledOn.replace(/\$root\./g, `${modelName}>/`).replace(/\./g, '/')} }`;
|
|
323
318
|
control.bindProperty("enabled", expr);
|
|
324
319
|
}
|
|
325
320
|
|
|
326
321
|
if (metadata.ui?.controlProps) {
|
|
327
|
-
|
|
322
|
+
Logger.debug(`[BasePlugin] controlProps found for ${this.fieldKey}: ` + JSON.stringify(metadata.ui.controlProps), "BasePlugin");
|
|
328
323
|
const targetControl = this.mainControl || control;
|
|
329
324
|
const target = targetControl as unknown as {
|
|
330
325
|
getMetadata?: () => { getName(): string },
|