@siliconst/metaui 1.4.13 → 1.4.14

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.
Files changed (92) hide show
  1. package/package.json +1 -1
  2. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js +50 -3
  3. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost-dbg.js.map +1 -1
  4. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts +1 -1
  5. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.d.ts.map +1 -1
  6. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js +1 -1
  7. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.js.map +1 -1
  8. package/src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.ts +57 -4
  9. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js +44 -2
  10. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost-dbg.js.map +1 -1
  11. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts +4 -0
  12. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.d.ts.map +1 -1
  13. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js +1 -1
  14. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.js.map +1 -1
  15. package/src/nz/co/siliconst/ui5/metaui/controls/host/GeneratorHost.ts +51 -4
  16. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate-dbg.js +16 -1
  17. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate-dbg.js.map +1 -1
  18. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.d.ts +6 -0
  19. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.d.ts.map +1 -1
  20. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.js +1 -1
  21. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.js.map +1 -1
  22. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/DialogDelegate.ts +16 -1
  23. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate-dbg.js.map +1 -1
  24. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.js.map +1 -1
  25. package/src/nz/co/siliconst/ui5/metaui/controls/host/delegates/ValidationDelegate.ts +2 -2
  26. package/src/nz/co/siliconst/ui5/metaui/core/SchemaBuilderRegistry-dbg.js +47 -0
  27. package/src/nz/co/siliconst/ui5/metaui/core/SchemaBuilderRegistry-dbg.js.map +1 -0
  28. package/src/nz/co/siliconst/ui5/metaui/core/SchemaBuilderRegistry.d.ts +23 -0
  29. package/src/nz/co/siliconst/ui5/metaui/core/SchemaBuilderRegistry.d.ts.map +1 -0
  30. package/src/nz/co/siliconst/ui5/metaui/core/SchemaBuilderRegistry.js +2 -0
  31. package/src/nz/co/siliconst/ui5/metaui/core/SchemaBuilderRegistry.js.map +1 -0
  32. package/src/nz/co/siliconst/ui5/metaui/core/SchemaBuilderRegistry.ts +45 -0
  33. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js +17 -0
  34. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer-dbg.js.map +1 -1
  35. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts +10 -1
  36. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.d.ts.map +1 -1
  37. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js +1 -1
  38. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.js.map +1 -1
  39. package/src/nz/co/siliconst/ui5/metaui/core/SchemaNormalizer.ts +19 -1
  40. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema-dbg.js.map +1 -1
  41. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.d.ts +7 -0
  42. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.d.ts.map +1 -1
  43. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchema.ts +9 -0
  44. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchemaBuilderPlugin-dbg.js +2 -0
  45. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchemaBuilderPlugin-dbg.js.map +1 -0
  46. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchemaBuilderPlugin.d.ts +23 -0
  47. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchemaBuilderPlugin.d.ts.map +1 -0
  48. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchemaBuilderPlugin.js +2 -0
  49. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchemaBuilderPlugin.js.map +1 -0
  50. package/src/nz/co/siliconst/ui5/metaui/interfaces/ISchemaBuilderPlugin.ts +23 -0
  51. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js +6 -1
  52. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout-dbg.js.map +1 -1
  53. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.d.ts.map +1 -1
  54. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.js +1 -1
  55. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.js.map +1 -1
  56. package/src/nz/co/siliconst/ui5/metaui/layouts/FormLayout.ts +6 -1
  57. package/src/nz/co/siliconst/ui5/metaui/library-preload.js +14 -6
  58. package/src/nz/co/siliconst/ui5/metaui/library-preload.js.map +1 -1
  59. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin-dbg.js +29 -17
  60. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin-dbg.js.map +1 -1
  61. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.d.ts.map +1 -1
  62. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.js +1 -1
  63. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.js.map +1 -1
  64. package/src/nz/co/siliconst/ui5/metaui/plugins/controls/MultiInputPlugin.ts +32 -15
  65. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerBuilder-dbg.js +226 -0
  66. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerBuilder-dbg.js.map +1 -0
  67. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerBuilder.d.ts +63 -0
  68. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerBuilder.d.ts.map +1 -0
  69. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerBuilder.js +2 -0
  70. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerBuilder.js.map +1 -0
  71. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerBuilder.ts +233 -0
  72. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerRefResolver-dbg.js +43 -0
  73. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerRefResolver-dbg.js.map +1 -0
  74. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerRefResolver.d.ts +15 -0
  75. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerRefResolver.d.ts.map +1 -0
  76. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerRefResolver.js +2 -0
  77. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerRefResolver.js.map +1 -0
  78. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerRefResolver.ts +37 -0
  79. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerTypeMapper-dbg.js +37 -0
  80. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerTypeMapper-dbg.js.map +1 -0
  81. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerTypeMapper.d.ts +18 -0
  82. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerTypeMapper.d.ts.map +1 -0
  83. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerTypeMapper.js +2 -0
  84. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerTypeMapper.js.map +1 -0
  85. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerTypeMapper.ts +28 -0
  86. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerUIMapper-dbg.js +84 -0
  87. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerUIMapper-dbg.js.map +1 -0
  88. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerUIMapper.d.ts +27 -0
  89. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerUIMapper.d.ts.map +1 -0
  90. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerUIMapper.js +2 -0
  91. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerUIMapper.js.map +1 -0
  92. package/src/nz/co/siliconst/ui5/metaui/swagger/SwaggerUIMapper.ts +80 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@siliconst/metaui",
3
- "version": "1.4.13",
3
+ "version": "1.4.14",
4
4
  "description": "Dynamic Metadata UI5 Engine",
5
5
  "author": "SiliconStreetDev1",
6
6
  "license": "MIT",
@@ -1,4 +1,4 @@
1
- sap.ui.define(["sap/ui/core/Control", "./host/GeneratorHost", "../utils/Logger", "./host/delegates/ODataDelegate"], function (Control, __GeneratorHost, ___utils_Logger, ___host_delegates_ODataDelegate) {
1
+ sap.ui.define(["sap/ui/core/Control", "./host/GeneratorHost", "../utils/Logger", "./host/delegates/ODataDelegate", "../core/SchemaBuilderRegistry"], function (Control, __GeneratorHost, ___utils_Logger, ___host_delegates_ODataDelegate, ___core_SchemaBuilderRegistry) {
2
2
  "use strict";
3
3
 
4
4
  function _interopRequireDefault(obj) {
@@ -7,6 +7,7 @@ sap.ui.define(["sap/ui/core/Control", "./host/GeneratorHost", "../utils/Logger",
7
7
  const GeneratorHost = _interopRequireDefault(__GeneratorHost);
8
8
  const Logger = ___utils_Logger["Logger"];
9
9
  const ODataDelegate = ___host_delegates_ODataDelegate["ODataDelegate"];
10
+ const SchemaBuilderRegistry = ___core_SchemaBuilderRegistry["SchemaBuilderRegistry"];
10
11
  /**
11
12
  * A transparent wrapper control (Facade) that automatically chooses between Explicit Schema Mode
12
13
  * and Inference Mode based on the presence of a 'schemaDefinition'.
@@ -244,7 +245,53 @@ sap.ui.define(["sap/ui/core/Control", "./host/GeneratorHost", "../utils/Logger",
244
245
  Logger.debug("[MetaUI DynamicHost]", `onBeforeRendering called. _initializedInner: ${this._initializedInner}`, "DynamicHost");
245
246
  this.initODataDelegate();
246
247
  if (!this._initializedInner) {
247
- const schema = this.getProperty("schemaDefinition");
248
+ let schemaRaw = this.getProperty("schemaDefinition");
249
+
250
+ // 1. URL Detection & Fetching
251
+ if (typeof schemaRaw === "string" && (schemaRaw.startsWith("http://") || schemaRaw.startsWith("https://"))) {
252
+ if (this._fetchingSchema) return; // Prevent re-entry
253
+ this._fetchingSchema = true;
254
+ sap.ui.require(["sap/ui/core/BusyIndicator", "sap/m/MessageToast"], (BusyIndicator, MessageToast) => {
255
+ BusyIndicator.show(0);
256
+ fetch(schemaRaw).then(res => {
257
+ if (!res.ok) throw new Error("HTTP " + res.status);
258
+ return res.json();
259
+ }).then(json => {
260
+ const plugin = SchemaBuilderRegistry.getBuilderFor(json);
261
+ const finalSchema = plugin ? plugin.build(json) : json;
262
+ Control.prototype.setProperty.call(this, "schemaDefinition", finalSchema, true);
263
+ this._fetchingSchema = false;
264
+ BusyIndicator.hide();
265
+ this.invalidate(); // Force re-render with resolved schema
266
+ }).catch(err => {
267
+ Logger.warn("[MetaUI DynamicHost]", "Failed to fetch remote schema: " + err, "DynamicHost");
268
+ if (MessageToast) MessageToast.show("Failed to fetch remote schema");
269
+ Control.prototype.setProperty.call(this, "schemaDefinition", null, true); // Fallback to full inference
270
+ this._fetchingSchema = false;
271
+ BusyIndicator.hide();
272
+ this.invalidate();
273
+ });
274
+ });
275
+ return; // Abort this render cycle until fetch completes
276
+ }
277
+
278
+ // 2. Local Plugin Detection (Stringified JSON or Raw Object)
279
+ let schema = schemaRaw;
280
+ if (schema && typeof schema === "string" && schema.trim().startsWith("{")) {
281
+ try {
282
+ schema = JSON.parse(schema);
283
+ } catch (e) {
284
+ // Ignore, let standard validation catch it
285
+ }
286
+ }
287
+ if (schema && typeof schema === "object") {
288
+ const plugin = SchemaBuilderRegistry.getBuilderFor(schema);
289
+ if (plugin) {
290
+ schema = plugin.build(schema);
291
+ // Silently update the wrapper property so the inner host gets the final parsed MetaUI format
292
+ Control.prototype.setProperty.call(this, "schemaDefinition", schema, true);
293
+ }
294
+ }
248
295
  const dataJson = this.getProperty("dataJson");
249
296
  const data = this.getProperty("data");
250
297
  let hasSchema = !!schema;
@@ -334,7 +381,7 @@ sap.ui.define(["sap/ui/core/Control", "./host/GeneratorHost", "../utils/Logger",
334
381
  * @param {string} [title="Form"] The title of the dialog
335
382
  * @param {string} [submitButtonText="OK"] The text for the primary action button
336
383
  * @param {string} [cancelButtonText="Cancel"] The text for the cancel button
337
- * @param {string} [dialogWidth="800px"] The width of the dialog
384
+ * @param {string} [dialogWidth="auto"] The width of the dialog
338
385
  * @param {sap.ui.core.Control} [parentView] The parent view to attach the dialog to for model inheritance.
339
386
  */
340
387
  openInDialog: function _openInDialog(title, submitButtonText, cancelButtonText, dialogWidth, parentView) {
@@ -1 +1 @@
1
- {"version":3,"file":"DynamicHost-dbg.js","names":["GeneratorHost","_interopRequireDefault","__GeneratorHost","Logger","___utils_Logger","ODataDelegate","___host_delegates_ODataDelegate","DynamicHost","Control","extend","constructor","prototype","apply","arguments","odataDelegate","_innerHost","_initializedInner","renderer","apiVersion","render","rm","control","openStart","style","openEnd","content","getAggregation","renderControl","close","metadata","properties","schemaDefinition","type","defaultValue","data","bindable","dataJson","liveUpdate","isValid","useMessageManager","modelName","debugMode","editable","aggregations","_content","multiple","visibility","events","beforeSubmit","parameters","payload","addError","preventDefault","submit","payloadJson","cancel","fieldChange","fieldPath","value","validationStateChanged","validationError","message","validationSuccess","error","exception","initODataDelegate","_initODataDelegate","getBindingInfo","dataBinding","path","oContext","getBindingContext","debug","getPath","requestObject","syncToEngine","Object","keys","setBindingContext","_setBindingContext","sModelName","Control.prototype.setBindingContext.call","bindElement","_bindElement","vPath","mParameters","Control.prototype.bindElement.call","model","undefined","oBinding","getElementBinding","attachChange","onBeforeRendering","_onBeforeRendering","schema","getProperty","hasSchema","length","hasData","props","getMetadata","getProperties","propName","val","Control.prototype.getProperty.call","setProperty","setAggregation","getEvents","eventName","attachEvent","oEvent","params","getParameters","isLive","Control.prototype.setProperty.call","str","JSON","stringify","handleFieldChange","fireEvent","_setProperty","propertyName","suppressInvalidate","openInDialog","_openInDialog","title","submitButtonText","cancelButtonText","dialogWidth","parentView","triggerSubmit","_triggerSubmit","addCustomError","_addCustomError","clearCustomError","_clearCustomError","_getProperty"],"sources":["DynamicHost.ts"],"sourcesContent":["import Control from \"sap/ui/core/Control\";\nimport RenderManager from \"sap/ui/core/RenderManager\";\nimport GeneratorHost from \"./host/GeneratorHost\";\nimport { Logger } from \"../utils/Logger\";\nimport { ODataDelegate } from \"./host/delegates/ODataDelegate\";\nimport ODataV4Context from \"sap/ui/model/odata/v4/Context\";\n\n/**\n * A transparent wrapper control (Facade) that automatically chooses between Explicit Schema Mode \n * and Inference Mode based on the presence of a 'schemaDefinition'.\n * \n * This maintains total architectural separation of the modes without forcing developers to \n * use different XML tags.\n * \n * @namespace nz.co.siliconst.ui5.metaui.controls\n */\nexport default class DynamicHost extends Control {\n private odataDelegate: ODataDelegate | null = null;\n\n static readonly metadata = {\n properties: {\n schemaDefinition: { type: \"any\", defaultValue: null },\n data: { type: \"object\", defaultValue: null, bindable: \"bindable\" },\n dataJson: { type: \"string\", defaultValue: null, bindable: \"bindable\" },\n liveUpdate: { type: \"boolean\", defaultValue: false },\n isValid: { type: \"boolean\", defaultValue: true },\n useMessageManager: { type: \"boolean\", defaultValue: false },\n modelName: { type: \"string\", defaultValue: \"meta\" },\n debugMode: { type: \"boolean\", defaultValue: false },\n editable: { type: \"boolean\", defaultValue: true }\n },\n aggregations: {\n _content: { type: \"sap.ui.core.Control\", multiple: false, visibility: \"hidden\" }\n },\n events: {\n beforeSubmit: {\n parameters: {\n payload: { type: \"object\" },\n addError: { type: \"function\" },\n preventDefault: { type: \"function\" }\n }\n },\n submit: {\n parameters: {\n payload: { type: \"object\" },\n payloadJson: { type: \"string\" }\n }\n },\n cancel: {},\n fieldChange: {\n parameters: {\n fieldPath: { type: \"string\" },\n value: { type: \"any\" },\n payload: { type: \"object\" },\n isValid: { type: \"boolean\" }\n }\n },\n validationStateChanged: { parameters: { isValid: { type: \"boolean\" } } },\n validationError: { parameters: { fieldPath: { type: \"string\" }, message: { type: \"string\" } } },\n validationSuccess: { parameters: { fieldPath: { type: \"string\" } } },\n error: { parameters: { message: { type: \"string\" }, exception: { type: \"object\" } } }\n }\n };\n\n static renderer = {\n apiVersion: 2,\n render(rm: RenderManager, control: DynamicHost) {\n rm.openStart(\"div\", control);\n rm.style(\"width\", \"100%\");\n rm.style(\"height\", \"100%\");\n rm.openEnd();\n\n const content = control.getAggregation(\"_content\") as Control;\n if (content) {\n rm.renderControl(content);\n }\n\n rm.close(\"div\");\n }\n };\n\n /**\n * Internal reference to the generated inner host instance.\n * @private\n */\n private _innerHost: GeneratorHost | null = null;\n \n /**\n * Flag indicating if the inner host has been initialized.\n * @private\n */\n private _initializedInner: boolean = false;\n\n /**\n * Initializes the OData Delegate if an OData context is detected.\n * This allows DynamicHost to seamlessly synchronize metadata and properties from an OData model.\n * @private\n */\n private initODataDelegate(): void {\n if (!this.odataDelegate) {\n // Guard: If the user explicitly bound dataJson, do not steal the context.\n if (this.getBindingInfo(\"dataJson\")) {\n return;\n }\n\n // Guard: If the user explicitly bound 'data' to a specific property path, do not steal the context.\n const dataBinding = this.getBindingInfo(\"data\") as any;\n if (dataBinding && dataBinding.path && dataBinding.path !== \"\") {\n return;\n }\n\n const oContext = this.getBindingContext(\"odata\") || this.getBindingContext();\n if (oContext) {\n Logger.debug(\"[MetaUI DynamicHost]\", `Context found for delegate initialization: ${oContext.getPath()}`, \"DynamicHost\");\n if (oContext && (oContext as ODataV4Context).requestObject && typeof (oContext as ODataV4Context).requestObject === \"function\") {\n Logger.debug(\"[MetaUI DynamicHost]\", `Context supports requestObject/getObject. Instantiating ODataDelegate.`, \"DynamicHost\");\n this.odataDelegate = new ODataDelegate(this, oContext as ODataV4Context);\n this.odataDelegate.syncToEngine();\n } else {\n Logger.debug(\"[MetaUI DynamicHost]\", `Context does NOT support requestObject/getObject! Keys: ${Object.keys(oContext)}`, \"DynamicHost\");\n }\n }\n }\n }\n\n /**\n * Standard UI5 method override.\n * Sets the binding context for the control and attempts to initialize the OData delegate\n * if the context points to an OData model.\n * \n * @param {sap.ui.model.Context | null | undefined} oContext The binding context object\n * @param {string} [sModelName] Optional model name\n * @returns {this} The control instance for chaining\n */\n public setBindingContext(oContext: sap.ui.model.Context | null | undefined, sModelName?: string): this {\n super.setBindingContext(oContext, sModelName);\n this.initODataDelegate();\n return this;\n }\n\n /**\n * Standard UI5 method override.\n * Binds the element to the given path and attaches a change listener to re-evaluate\n * the OData delegate when the element binding resolves.\n * \n * @param {string | Record<string, unknown>} vPath The binding path or configuration object\n * @param {object} [mParameters] Optional mapping parameters\n * @returns {this} Reference to this instance for chaining\n */\n public bindElement(vPath: string | Record<string, unknown>, mParameters?: object): this {\n super.bindElement(vPath, mParameters);\n const sModelName = typeof vPath === \"object\" ? vPath.model : undefined;\n const oBinding = this.getElementBinding(sModelName);\n if (oBinding) {\n oBinding.attachChange(() => {\n this.initODataDelegate();\n });\n }\n return this;\n }\n\n /**\n * Standard UI5 Lifecycle Hook.\n * Evaluates the initial properties and spawns the GeneratorHost.\n * It handles the complex lifecycle task of copying all bindings, raw properties, and event listeners \n * down to the inner host perfectly transparently.\n */\n public onBeforeRendering(): void {\n Logger.debug(\"[MetaUI DynamicHost]\", `onBeforeRendering called. _initializedInner: ${this._initializedInner}`, \"DynamicHost\");\n\n this.initODataDelegate();\n\n if (!this._initializedInner) {\n const schema = this.getProperty(\"schemaDefinition\");\n const dataJson = this.getProperty(\"dataJson\");\n const data = this.getProperty(\"data\");\n\n let hasSchema = !!schema;\n if (hasSchema && typeof schema === \"object\" && Object.keys(schema).length === 0) {\n hasSchema = false; // Treat empty object as no schema\n }\n \n const hasData = !!dataJson || !!data;\n\n Logger.debug(\"[MetaUI DynamicHost]\", `Evaluating boot. hasSchema: ${hasSchema}, hasData: ${hasData}`, \"DynamicHost\");\n\n // Only boot if we have either a schema or some data to infer from\n if (hasSchema || hasData) {\n if (this.getProperty(\"debugMode\")) {\n Logger.debug(\"[MetaUI DynamicHost]\", `Booting inner host. hasSchema: ${hasSchema}, hasData: ${hasData}`, \"DynamicHost\");\n }\n // The architectural Facade router logic:\n // We've simplified this! We no longer use HostFactory or separate subclasses.\n // GeneratorHost is fully capable of inferring the schema if none is provided.\n this._innerHost = new GeneratorHost();\n\n // 1. Forward all static values to the spawned host BEFORE mounting.\n // Since we no longer use bindProperty, it's perfectly safe to set raw properties before mounting.\n const props = this.getMetadata().getProperties();\n for (const propName in props) {\n const val = super.getProperty(propName);\n if (val !== null && val !== undefined) {\n this._innerHost.setProperty(propName, val);\n }\n }\n\n // 2. Mount so it inherits models and triggers lifecycle.\n this.setAggregation(\"_content\", this._innerHost);\n\n // 3. Forward all event subscriptions.\n // By proxying the events upwards, the developer can subscribe to `<meta:DynamicHost submit=\"...\">` \n // and perfectly receive the inner host's submission event.\n const events = this.getMetadata().getEvents();\n for (const eventName in events) {\n this._innerHost.attachEvent(eventName, (oEvent: sap.ui.base.Event) => {\n // Natively push updated payload out to any bound Fiori Element properties.\n // Using super.setProperty prevents an infinite loop back down to _innerHost.\n if (eventName === \"submit\" || eventName === \"fieldChange\") {\n const params = oEvent.getParameters();\n if (params.payload) {\n const isLive = this.getProperty(\"liveUpdate\") === true;\n if (eventName === \"submit\" || isLive) {\n super.setProperty(\"data\", params.payload, true);\n\n const str = params.payloadJson || JSON.stringify(params.payload, null, 2);\n super.setProperty(\"dataJson\", str, true);\n }\n }\n if (eventName === \"fieldChange\" && this.odataDelegate) {\n this.odataDelegate.handleFieldChange(params.fieldPath, params.value);\n }\n }\n this.fireEvent(eventName, oEvent.getParameters());\n });\n }\n\n this._initializedInner = true;\n }\n }\n }\n\n /**\n * Overrides standard UI5 setProperty to act as a transparent proxy.\n * When a property is updated on the wrapper (either programmatically or via a binding update),\n * it instantly mirrors that value down to the inner instantiated host.\n */\n public setProperty(propertyName: string, value: unknown, suppressInvalidate?: boolean): this {\n if (propertyName === \"data\" || propertyName === \"dataJson\" || propertyName === \"schemaDefinition\") {\n if (this.getProperty(\"debugMode\")) {\n Logger.debug(\"[MetaUI DynamicHost]\", `Wrapper received setProperty: ${propertyName}`, \"DynamicHost\");\n }\n }\n super.setProperty(propertyName, value, suppressInvalidate);\n if (this._innerHost) {\n this._innerHost.setProperty(propertyName, value, suppressInvalidate);\n } else if (propertyName === \"data\" || propertyName === \"dataJson\" || propertyName === \"schemaDefinition\") {\n if (this.getProperty(\"debugMode\")) {\n Logger.debug(\"[MetaUI DynamicHost]\", `_innerHost not yet initialized when ${propertyName} was set. Booting will happen on next render.`, \"DynamicHost\");\n }\n }\n return this;\n }\n\n\n\n\n\n /**\n * Programmatic API support. Routes dialog commands down to the spawned inner host.\n * If the inner host has not booted yet, it forces initialization immediately.\n * \n * @param {string} [title=\"Form\"] The title of the dialog\n * @param {string} [submitButtonText=\"OK\"] The text for the primary action button\n * @param {string} [cancelButtonText=\"Cancel\"] The text for the cancel button\n * @param {string} [dialogWidth=\"800px\"] The width of the dialog\n * @param {sap.ui.core.Control} [parentView] The parent view to attach the dialog to for model inheritance.\n */\n public openInDialog(title?: string, submitButtonText?: string, cancelButtonText?: string, dialogWidth?: string, parentView?: Control): void {\n if (!this._innerHost) {\n this.onBeforeRendering(); // Force init if they bypassed UI5 rendering\n }\n this._innerHost?.openInDialog(title, submitButtonText, cancelButtonText, dialogWidth, parentView);\n }\n\n /**\n * Proxies submission triggering down to the instantiated generator host.\n * Evaluates the internal Engine validation suite and returns true if structurally sound.\n * \n * @returns {boolean} True if the internal payload passes schema validation, false otherwise.\n */\n public triggerSubmit(): boolean {\n if (!this._innerHost) {\n return false;\n }\n return this._innerHost.triggerSubmit();\n }\n\n /**\n * Injects a custom error message onto a specific field.\n * Useful for injecting custom backend validation errors.\n * \n * @param {string} fieldPath The schema key path to target.\n * @param {string} message The custom error message to display.\n */\n public addCustomError(fieldPath: string, message: string): void {\n if (this._innerHost && typeof (this._innerHost as any).addCustomError === \"function\") {\n (this._innerHost as any).addCustomError(fieldPath, message);\n }\n }\n\n /**\n * Clears a custom error message from a specific field.\n * \n * @param {string} fieldPath The schema key path to target.\n */\n public clearCustomError(fieldPath: string): void {\n if (this._innerHost && typeof (this._innerHost as any).clearCustomError === \"function\") {\n (this._innerHost as any).clearCustomError(fieldPath);\n }\n }\n\n /**\n * Overrides standard UI5 getProperty to transparently pull extracted data from the inner host.\n * Ensures that querying the DynamicHost facade for `data` always yields the freshest payload.\n * \n * @param {string} propertyName The name of the property to retrieve\n * @returns {unknown} The property value\n */\n public getProperty(propertyName: string): unknown {\n if (propertyName === \"outputData\") {\n propertyName = \"data\"; // Forward deprecated outputData to data\n }\n if (this._innerHost && (propertyName === \"data\" || propertyName === \"dataJson\")) {\n return this._innerHost.getProperty(propertyName);\n }\n return super.getProperty(propertyName);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"DynamicHost-dbg.js","names":["GeneratorHost","_interopRequireDefault","__GeneratorHost","Logger","___utils_Logger","ODataDelegate","___host_delegates_ODataDelegate","SchemaBuilderRegistry","___core_SchemaBuilderRegistry","DynamicHost","Control","extend","constructor","prototype","apply","arguments","odataDelegate","_innerHost","_initializedInner","renderer","apiVersion","render","rm","control","openStart","style","openEnd","content","getAggregation","renderControl","close","metadata","properties","schemaDefinition","type","defaultValue","data","bindable","dataJson","liveUpdate","isValid","useMessageManager","modelName","debugMode","editable","aggregations","_content","multiple","visibility","events","beforeSubmit","parameters","payload","addError","preventDefault","submit","payloadJson","cancel","fieldChange","fieldPath","value","validationStateChanged","validationError","message","validationSuccess","error","exception","initODataDelegate","_initODataDelegate","getBindingInfo","dataBinding","path","oContext","getBindingContext","debug","getPath","requestObject","syncToEngine","Object","keys","setBindingContext","_setBindingContext","sModelName","Control.prototype.setBindingContext.call","bindElement","_bindElement","vPath","mParameters","Control.prototype.bindElement.call","model","undefined","oBinding","getElementBinding","attachChange","onBeforeRendering","_onBeforeRendering","schemaRaw","getProperty","startsWith","_fetchingSchema","sap","ui","require","BusyIndicator","MessageToast","show","fetch","then","res","ok","Error","status","json","plugin","getBuilderFor","finalSchema","build","Control.prototype.setProperty.call","hide","invalidate","catch","err","warn","schema","trim","JSON","parse","e","hasSchema","length","hasData","props","getMetadata","getProperties","propName","val","Control.prototype.getProperty.call","setProperty","setAggregation","getEvents","eventName","attachEvent","oEvent","params","getParameters","isLive","str","stringify","handleFieldChange","fireEvent","_setProperty","propertyName","suppressInvalidate","openInDialog","_openInDialog","title","submitButtonText","cancelButtonText","dialogWidth","parentView","triggerSubmit","_triggerSubmit","addCustomError","_addCustomError","clearCustomError","_clearCustomError","_getProperty"],"sources":["DynamicHost.ts"],"sourcesContent":["import Control from \"sap/ui/core/Control\";\nimport RenderManager from \"sap/ui/core/RenderManager\";\nimport GeneratorHost from \"./host/GeneratorHost\";\nimport { Logger } from \"../utils/Logger\";\nimport { ODataDelegate } from \"./host/delegates/ODataDelegate\";\nimport ODataV4Context from \"sap/ui/model/odata/v4/Context\";\nimport { SchemaBuilderRegistry } from \"../core/SchemaBuilderRegistry\";\n\n/**\n * A transparent wrapper control (Facade) that automatically chooses between Explicit Schema Mode \n * and Inference Mode based on the presence of a 'schemaDefinition'.\n * \n * This maintains total architectural separation of the modes without forcing developers to \n * use different XML tags.\n * \n * @namespace nz.co.siliconst.ui5.metaui.controls\n */\nexport default class DynamicHost extends Control {\n private odataDelegate: ODataDelegate | null = null;\n\n static readonly metadata = {\n properties: {\n schemaDefinition: { type: \"any\", defaultValue: null },\n data: { type: \"object\", defaultValue: null, bindable: \"bindable\" },\n dataJson: { type: \"string\", defaultValue: null, bindable: \"bindable\" },\n liveUpdate: { type: \"boolean\", defaultValue: false },\n isValid: { type: \"boolean\", defaultValue: true },\n useMessageManager: { type: \"boolean\", defaultValue: false },\n modelName: { type: \"string\", defaultValue: \"meta\" },\n debugMode: { type: \"boolean\", defaultValue: false },\n editable: { type: \"boolean\", defaultValue: true }\n },\n aggregations: {\n _content: { type: \"sap.ui.core.Control\", multiple: false, visibility: \"hidden\" }\n },\n events: {\n beforeSubmit: {\n parameters: {\n payload: { type: \"object\" },\n addError: { type: \"function\" },\n preventDefault: { type: \"function\" }\n }\n },\n submit: {\n parameters: {\n payload: { type: \"object\" },\n payloadJson: { type: \"string\" }\n }\n },\n cancel: {},\n fieldChange: {\n parameters: {\n fieldPath: { type: \"string\" },\n value: { type: \"any\" },\n payload: { type: \"object\" },\n isValid: { type: \"boolean\" }\n }\n },\n validationStateChanged: { parameters: { isValid: { type: \"boolean\" } } },\n validationError: { parameters: { fieldPath: { type: \"string\" }, message: { type: \"string\" } } },\n validationSuccess: { parameters: { fieldPath: { type: \"string\" } } },\n error: { parameters: { message: { type: \"string\" }, exception: { type: \"object\" } } }\n }\n };\n\n static renderer = {\n apiVersion: 2,\n render(rm: RenderManager, control: DynamicHost) {\n rm.openStart(\"div\", control);\n rm.style(\"width\", \"100%\");\n rm.style(\"height\", \"100%\");\n rm.openEnd();\n\n const content = control.getAggregation(\"_content\") as Control;\n if (content) {\n rm.renderControl(content);\n }\n\n rm.close(\"div\");\n }\n };\n\n /**\n * Internal reference to the generated inner host instance.\n * @private\n */\n private _innerHost: GeneratorHost | null = null;\n\n /**\n * Flag indicating if the inner host has been initialized.\n * @private\n */\n private _initializedInner: boolean = false;\n\n /**\n * Initializes the OData Delegate if an OData context is detected.\n * This allows DynamicHost to seamlessly synchronize metadata and properties from an OData model.\n * @private\n */\n private initODataDelegate(): void {\n if (!this.odataDelegate) {\n // Guard: If the user explicitly bound dataJson, do not steal the context.\n if (this.getBindingInfo(\"dataJson\")) {\n return;\n }\n\n // Guard: If the user explicitly bound 'data' to a specific property path, do not steal the context.\n const dataBinding = this.getBindingInfo(\"data\") as any;\n if (dataBinding && dataBinding.path && dataBinding.path !== \"\") {\n return;\n }\n\n const oContext = this.getBindingContext(\"odata\") || this.getBindingContext();\n if (oContext) {\n Logger.debug(\"[MetaUI DynamicHost]\", `Context found for delegate initialization: ${oContext.getPath()}`, \"DynamicHost\");\n if (oContext && (oContext as ODataV4Context).requestObject && typeof (oContext as ODataV4Context).requestObject === \"function\") {\n Logger.debug(\"[MetaUI DynamicHost]\", `Context supports requestObject/getObject. Instantiating ODataDelegate.`, \"DynamicHost\");\n this.odataDelegate = new ODataDelegate(this, oContext as ODataV4Context);\n this.odataDelegate.syncToEngine();\n } else {\n Logger.debug(\"[MetaUI DynamicHost]\", `Context does NOT support requestObject/getObject! Keys: ${Object.keys(oContext)}`, \"DynamicHost\");\n }\n }\n }\n }\n\n /**\n * Standard UI5 method override.\n * Sets the binding context for the control and attempts to initialize the OData delegate\n * if the context points to an OData model.\n * \n * @param {sap.ui.model.Context | null | undefined} oContext The binding context object\n * @param {string} [sModelName] Optional model name\n * @returns {this} The control instance for chaining\n */\n public setBindingContext(oContext: sap.ui.model.Context | null | undefined, sModelName?: string): this {\n super.setBindingContext(oContext, sModelName);\n this.initODataDelegate();\n return this;\n }\n\n /**\n * Standard UI5 method override.\n * Binds the element to the given path and attaches a change listener to re-evaluate\n * the OData delegate when the element binding resolves.\n * \n * @param {string | Record<string, unknown>} vPath The binding path or configuration object\n * @param {object} [mParameters] Optional mapping parameters\n * @returns {this} Reference to this instance for chaining\n */\n public bindElement(vPath: string | Record<string, unknown>, mParameters?: object): this {\n super.bindElement(vPath, mParameters);\n const sModelName = typeof vPath === \"object\" ? vPath.model : undefined;\n const oBinding = this.getElementBinding(sModelName);\n if (oBinding) {\n oBinding.attachChange(() => {\n this.initODataDelegate();\n });\n }\n return this;\n }\n\n /**\n * Standard UI5 Lifecycle Hook.\n * Evaluates the initial properties and spawns the GeneratorHost.\n * It handles the complex lifecycle task of copying all bindings, raw properties, and event listeners \n * down to the inner host perfectly transparently.\n */\n public onBeforeRendering(): void {\n Logger.debug(\"[MetaUI DynamicHost]\", `onBeforeRendering called. _initializedInner: ${this._initializedInner}`, \"DynamicHost\");\n\n this.initODataDelegate();\n\n if (!this._initializedInner) {\n let schemaRaw = this.getProperty(\"schemaDefinition\");\n\n // 1. URL Detection & Fetching\n if (typeof schemaRaw === \"string\" && (schemaRaw.startsWith(\"http://\") || schemaRaw.startsWith(\"https://\"))) {\n if ((this as any)._fetchingSchema) return; // Prevent re-entry\n (this as any)._fetchingSchema = true;\n \n sap.ui.require([\"sap/ui/core/BusyIndicator\", \"sap/m/MessageToast\"], (BusyIndicator: any, MessageToast: any) => {\n BusyIndicator.show(0);\n fetch(schemaRaw as string)\n .then(res => {\n if (!res.ok) throw new Error(\"HTTP \" + res.status);\n return res.json();\n })\n .then(json => {\n const plugin = SchemaBuilderRegistry.getBuilderFor(json);\n const finalSchema = plugin ? plugin.build(json) : json;\n super.setProperty(\"schemaDefinition\", finalSchema, true);\n (this as any)._fetchingSchema = false;\n BusyIndicator.hide();\n this.invalidate(); // Force re-render with resolved schema\n })\n .catch(err => {\n Logger.warn(\"[MetaUI DynamicHost]\", \"Failed to fetch remote schema: \" + err, \"DynamicHost\");\n if (MessageToast) MessageToast.show(\"Failed to fetch remote schema\");\n super.setProperty(\"schemaDefinition\", null, true); // Fallback to full inference\n (this as any)._fetchingSchema = false;\n BusyIndicator.hide();\n this.invalidate();\n });\n });\n return; // Abort this render cycle until fetch completes\n }\n\n // 2. Local Plugin Detection (Stringified JSON or Raw Object)\n let schema = schemaRaw;\n if (schema && typeof schema === \"string\" && (schema as string).trim().startsWith(\"{\")) {\n try {\n schema = JSON.parse(schema);\n } catch (e) {\n // Ignore, let standard validation catch it\n }\n }\n\n if (schema && typeof schema === \"object\") {\n const plugin = SchemaBuilderRegistry.getBuilderFor(schema);\n if (plugin) {\n schema = plugin.build(schema);\n // Silently update the wrapper property so the inner host gets the final parsed MetaUI format\n super.setProperty(\"schemaDefinition\", schema, true);\n }\n }\n\n const dataJson = this.getProperty(\"dataJson\");\n const data = this.getProperty(\"data\");\n\n let hasSchema = !!schema;\n if (hasSchema && typeof schema === \"object\" && Object.keys(schema).length === 0) {\n hasSchema = false; // Treat empty object as no schema\n }\n\n const hasData = !!dataJson || !!data;\n\n Logger.debug(\"[MetaUI DynamicHost]\", `Evaluating boot. hasSchema: ${hasSchema}, hasData: ${hasData}`, \"DynamicHost\");\n\n // Only boot if we have either a schema or some data to infer from\n if (hasSchema || hasData) {\n if (this.getProperty(\"debugMode\")) {\n Logger.debug(\"[MetaUI DynamicHost]\", `Booting inner host. hasSchema: ${hasSchema}, hasData: ${hasData}`, \"DynamicHost\");\n }\n // The architectural Facade router logic:\n // We've simplified this! We no longer use HostFactory or separate subclasses.\n // GeneratorHost is fully capable of inferring the schema if none is provided.\n this._innerHost = new GeneratorHost();\n\n // 1. Forward all static values to the spawned host BEFORE mounting.\n // Since we no longer use bindProperty, it's perfectly safe to set raw properties before mounting.\n const props = this.getMetadata().getProperties();\n for (const propName in props) {\n const val = super.getProperty(propName);\n if (val !== null && val !== undefined) {\n this._innerHost.setProperty(propName, val);\n }\n }\n\n // 2. Mount so it inherits models and triggers lifecycle.\n this.setAggregation(\"_content\", this._innerHost);\n\n // 3. Forward all event subscriptions.\n // By proxying the events upwards, the developer can subscribe to `<meta:DynamicHost submit=\"...\">` \n // and perfectly receive the inner host's submission event.\n const events = this.getMetadata().getEvents();\n for (const eventName in events) {\n this._innerHost.attachEvent(eventName, (oEvent: sap.ui.base.Event) => {\n // Natively push updated payload out to any bound Fiori Element properties.\n // Using super.setProperty prevents an infinite loop back down to _innerHost.\n if (eventName === \"submit\" || eventName === \"fieldChange\") {\n const params = oEvent.getParameters();\n if (params.payload) {\n const isLive = this.getProperty(\"liveUpdate\") === true;\n if (eventName === \"submit\" || isLive) {\n super.setProperty(\"data\", params.payload, true);\n\n const str = params.payloadJson || JSON.stringify(params.payload, null, 2);\n super.setProperty(\"dataJson\", str, true);\n }\n }\n if (eventName === \"fieldChange\" && this.odataDelegate) {\n this.odataDelegate.handleFieldChange(params.fieldPath, params.value);\n }\n }\n this.fireEvent(eventName, oEvent.getParameters());\n });\n }\n\n this._initializedInner = true;\n }\n }\n }\n\n /**\n * Overrides standard UI5 setProperty to act as a transparent proxy.\n * When a property is updated on the wrapper (either programmatically or via a binding update),\n * it instantly mirrors that value down to the inner instantiated host.\n */\n public setProperty(propertyName: string, value: unknown, suppressInvalidate?: boolean): this {\n if (propertyName === \"data\" || propertyName === \"dataJson\" || propertyName === \"schemaDefinition\") {\n if (this.getProperty(\"debugMode\")) {\n Logger.debug(\"[MetaUI DynamicHost]\", `Wrapper received setProperty: ${propertyName}`, \"DynamicHost\");\n }\n }\n super.setProperty(propertyName, value, suppressInvalidate);\n if (this._innerHost) {\n this._innerHost.setProperty(propertyName, value, suppressInvalidate);\n } else if (propertyName === \"data\" || propertyName === \"dataJson\" || propertyName === \"schemaDefinition\") {\n if (this.getProperty(\"debugMode\")) {\n Logger.debug(\"[MetaUI DynamicHost]\", `_innerHost not yet initialized when ${propertyName} was set. Booting will happen on next render.`, \"DynamicHost\");\n }\n }\n return this;\n }\n\n\n\n\n\n /**\n * Programmatic API support. Routes dialog commands down to the spawned inner host.\n * If the inner host has not booted yet, it forces initialization immediately.\n * \n * @param {string} [title=\"Form\"] The title of the dialog\n * @param {string} [submitButtonText=\"OK\"] The text for the primary action button\n * @param {string} [cancelButtonText=\"Cancel\"] The text for the cancel button\n * @param {string} [dialogWidth=\"auto\"] The width of the dialog\n * @param {sap.ui.core.Control} [parentView] The parent view to attach the dialog to for model inheritance.\n */\n public openInDialog(title?: string, submitButtonText?: string, cancelButtonText?: string, dialogWidth?: string, parentView?: Control): void {\n if (!this._innerHost) {\n this.onBeforeRendering(); // Force init if they bypassed UI5 rendering\n }\n this._innerHost?.openInDialog(title, submitButtonText, cancelButtonText, dialogWidth, parentView);\n }\n\n /**\n * Proxies submission triggering down to the instantiated generator host.\n * Evaluates the internal Engine validation suite and returns true if structurally sound.\n * \n * @returns {boolean} True if the internal payload passes schema validation, false otherwise.\n */\n public triggerSubmit(): boolean {\n if (!this._innerHost) {\n return false;\n }\n return this._innerHost.triggerSubmit();\n }\n\n /**\n * Injects a custom error message onto a specific field.\n * Useful for injecting custom backend validation errors.\n * \n * @param {string} fieldPath The schema key path to target.\n * @param {string} message The custom error message to display.\n */\n public addCustomError(fieldPath: string, message: string): void {\n if (this._innerHost && typeof (this._innerHost as any).addCustomError === \"function\") {\n (this._innerHost as any).addCustomError(fieldPath, message);\n }\n }\n\n /**\n * Clears a custom error message from a specific field.\n * \n * @param {string} fieldPath The schema key path to target.\n */\n public clearCustomError(fieldPath: string): void {\n if (this._innerHost && typeof (this._innerHost as any).clearCustomError === \"function\") {\n (this._innerHost as any).clearCustomError(fieldPath);\n }\n }\n\n /**\n * Overrides standard UI5 getProperty to transparently pull extracted data from the inner host.\n * Ensures that querying the DynamicHost facade for `data` always yields the freshest payload.\n * \n * @param {string} propertyName The name of the property to retrieve\n * @returns {unknown} The property value\n */\n public getProperty(propertyName: string): unknown {\n if (propertyName === \"outputData\") {\n propertyName = \"data\"; // Forward deprecated outputData to data\n }\n if (this._innerHost && (propertyName === \"data\" || propertyName === \"dataJson\")) {\n return this._innerHost.getProperty(propertyName);\n }\n return super.getProperty(propertyName);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -197,7 +197,7 @@ declare module "nz/co/siliconst/ui5/metaui/controls/DynamicHost" {
197
197
  * @param {string} [title="Form"] The title of the dialog
198
198
  * @param {string} [submitButtonText="OK"] The text for the primary action button
199
199
  * @param {string} [cancelButtonText="Cancel"] The text for the cancel button
200
- * @param {string} [dialogWidth="800px"] The width of the dialog
200
+ * @param {string} [dialogWidth="auto"] The width of the dialog
201
201
  * @param {sap.ui.core.Control} [parentView] The parent view to attach the dialog to for model inheritance.
202
202
  */
203
203
  openInDialog(title?: string, submitButtonText?: string, cancelButtonText?: string, dialogWidth?: string, parentView?: Control): void;
@@ -1 +1 @@
1
- {"version":3,"file":"DynamicHost.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,iDAAiD,CAAC;IACjE,OAAO,OAAO,MAAM,qBAAqB,CAAC;IAC1C,OAAO,aAAa,MAAM,2BAA2B,CAAC;IAMtD;;;;;;;;OAQG;IACH,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;QAC5C,OAAO,CAAC,aAAa,CAA8B;QAEnD,MAAM,CAAC,QAAQ,CAAC,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA2CtB;QAEF,MAAM,CAAC,QAAQ;;uBAEA,aAAa,WAAW,WAAW;UAahD;QAEF;;;WAGG;QACH,OAAO,CAAC,UAAU,CAA8B;QAEhD;;;WAGG;QACH,OAAO,CAAC,iBAAiB,CAAkB;QAE3C;;;;WAIG;QACH,OAAO,CAAC,iBAAiB;QA2BzB;;;;;;;;WAQG;QACI,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;QAMtG;;;;;;;;WAQG;QACI,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;QAYvF;;;;;WAKG;QACI,iBAAiB,IAAI,IAAI;QA0EhC;;;;WAIG;QACI,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,CAAC,EAAE,OAAO,GAAG,IAAI;QAqB5F;;;;;;;;;WASG;QACI,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI;QAO3I;;;;;WAKG;QACI,aAAa,IAAI,OAAO;QAO/B;;;;;;WAMG;QACI,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;QAM/D;;;;WAIG;QACI,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;QAMhD;;;;;;WAMG;QACI,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;KASpD;CAEA"}
1
+ {"version":3,"file":"DynamicHost.d.ts","sourceRoot":"../../../../../../../..","sources":["src/nz/co/siliconst/ui5/metaui/controls/DynamicHost.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,iDAAiD,CAAC;IACjE,OAAO,OAAO,MAAM,qBAAqB,CAAC;IAC1C,OAAO,aAAa,MAAM,2BAA2B,CAAC;IAOtD;;;;;;;;OAQG;IACH,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;QAC5C,OAAO,CAAC,aAAa,CAA8B;QAEnD,MAAM,CAAC,QAAQ,CAAC,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA2CtB;QAEF,MAAM,CAAC,QAAQ;;uBAEA,aAAa,WAAW,WAAW;UAahD;QAEF;;;WAGG;QACH,OAAO,CAAC,UAAU,CAA8B;QAEhD;;;WAGG;QACH,OAAO,CAAC,iBAAiB,CAAkB;QAE3C;;;;WAIG;QACH,OAAO,CAAC,iBAAiB;QA2BzB;;;;;;;;WAQG;QACI,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;QAMtG;;;;;;;;WAQG;QACI,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;QAYvF;;;;;WAKG;QACI,iBAAiB,IAAI,IAAI;QA8HhC;;;;WAIG;QACI,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,CAAC,EAAE,OAAO,GAAG,IAAI;QAqB5F;;;;;;;;;WASG;QACI,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI;QAO3I;;;;;WAKG;QACI,aAAa,IAAI,OAAO;QAO/B;;;;;;WAMG;QACI,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;QAM/D;;;;WAIG;QACI,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;QAMhD;;;;;;WAMG;QACI,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;KASpD;CAEA"}
@@ -1,2 +1,2 @@
1
- sap.ui.define(["sap/ui/core/Control","./host/GeneratorHost","../utils/Logger","./host/delegates/ODataDelegate"],function(t,e,n,i){"use strict";function a(t){return t&&t.__esModule&&typeof t.default!=="undefined"?t.default:t}const o=a(e);const s=n["Logger"];const r=i["ODataDelegate"];const l=t.extend("nz.co.siliconst.ui5.metaui.controls.DynamicHost",{constructor:function e(){t.prototype.constructor.apply(this,arguments);this.odataDelegate=null;this._innerHost=null;this._initializedInner=false},renderer:{apiVersion:2,render(t,e){t.openStart("div",e);t.style("width","100%");t.style("height","100%");t.openEnd();const n=e.getAggregation("_content");if(n){t.renderControl(n)}t.close("div")}},metadata:{properties:{schemaDefinition:{type:"any",defaultValue:null},data:{type:"object",defaultValue:null,bindable:"bindable"},dataJson:{type:"string",defaultValue:null,bindable:"bindable"},liveUpdate:{type:"boolean",defaultValue:false},isValid:{type:"boolean",defaultValue:true},useMessageManager:{type:"boolean",defaultValue:false},modelName:{type:"string",defaultValue:"meta"},debugMode:{type:"boolean",defaultValue:false},editable:{type:"boolean",defaultValue:true}},aggregations:{_content:{type:"sap.ui.core.Control",multiple:false,visibility:"hidden"}},events:{beforeSubmit:{parameters:{payload:{type:"object"},addError:{type:"function"},preventDefault:{type:"function"}}},submit:{parameters:{payload:{type:"object"},payloadJson:{type:"string"}}},cancel:{},fieldChange:{parameters:{fieldPath:{type:"string"},value:{type:"any"},payload:{type:"object"},isValid:{type:"boolean"}}},validationStateChanged:{parameters:{isValid:{type:"boolean"}}},validationError:{parameters:{fieldPath:{type:"string"},message:{type:"string"}}},validationSuccess:{parameters:{fieldPath:{type:"string"}}},error:{parameters:{message:{type:"string"},exception:{type:"object"}}}}},initODataDelegate:function t(){if(!this.odataDelegate){if(this.getBindingInfo("dataJson")){return}const t=this.getBindingInfo("data");if(t&&t.path&&t.path!==""){return}const e=this.getBindingContext("odata")||this.getBindingContext();if(e){s.debug("[MetaUI DynamicHost]",`Context found for delegate initialization: ${e.getPath()}`,"DynamicHost");if(e&&e.requestObject&&typeof e.requestObject==="function"){s.debug("[MetaUI DynamicHost]",`Context supports requestObject/getObject. Instantiating ODataDelegate.`,"DynamicHost");this.odataDelegate=new r(this,e);this.odataDelegate.syncToEngine()}else{s.debug("[MetaUI DynamicHost]",`Context does NOT support requestObject/getObject! Keys: ${Object.keys(e)}`,"DynamicHost")}}}},setBindingContext:function e(n,i){t.prototype.setBindingContext.call(this,n,i);this.initODataDelegate();return this},bindElement:function e(n,i){t.prototype.bindElement.call(this,n,i);const a=typeof n==="object"?n.model:undefined;const o=this.getElementBinding(a);if(o){o.attachChange(()=>{this.initODataDelegate()})}return this},onBeforeRendering:function e(){s.debug("[MetaUI DynamicHost]",`onBeforeRendering called. _initializedInner: ${this._initializedInner}`,"DynamicHost");this.initODataDelegate();if(!this._initializedInner){const e=this.getProperty("schemaDefinition");const n=this.getProperty("dataJson");const i=this.getProperty("data");let a=!!e;if(a&&typeof e==="object"&&Object.keys(e).length===0){a=false}const r=!!n||!!i;s.debug("[MetaUI DynamicHost]",`Evaluating boot. hasSchema: ${a}, hasData: ${r}`,"DynamicHost");if(a||r){if(this.getProperty("debugMode")){s.debug("[MetaUI DynamicHost]",`Booting inner host. hasSchema: ${a}, hasData: ${r}`,"DynamicHost")}this._innerHost=new o;const e=this.getMetadata().getProperties();for(const n in e){const e=t.prototype.getProperty.call(this,n);if(e!==null&&e!==undefined){this._innerHost.setProperty(n,e)}}this.setAggregation("_content",this._innerHost);const n=this.getMetadata().getEvents();for(const e in n){this._innerHost.attachEvent(e,n=>{if(e==="submit"||e==="fieldChange"){const i=n.getParameters();if(i.payload){const n=this.getProperty("liveUpdate")===true;if(e==="submit"||n){t.prototype.setProperty.call(this,"data",i.payload,true);const e=i.payloadJson||JSON.stringify(i.payload,null,2);t.prototype.setProperty.call(this,"dataJson",e,true)}}if(e==="fieldChange"&&this.odataDelegate){this.odataDelegate.handleFieldChange(i.fieldPath,i.value)}}this.fireEvent(e,n.getParameters())})}this._initializedInner=true}}},setProperty:function e(n,i,a){if(n==="data"||n==="dataJson"||n==="schemaDefinition"){if(this.getProperty("debugMode")){s.debug("[MetaUI DynamicHost]",`Wrapper received setProperty: ${n}`,"DynamicHost")}}t.prototype.setProperty.call(this,n,i,a);if(this._innerHost){this._innerHost.setProperty(n,i,a)}else if(n==="data"||n==="dataJson"||n==="schemaDefinition"){if(this.getProperty("debugMode")){s.debug("[MetaUI DynamicHost]",`_innerHost not yet initialized when ${n} was set. Booting will happen on next render.`,"DynamicHost")}}return this},openInDialog:function t(e,n,i,a,o){if(!this._innerHost){this.onBeforeRendering()}this._innerHost?.openInDialog(e,n,i,a,o)},triggerSubmit:function t(){if(!this._innerHost){return false}return this._innerHost.triggerSubmit()},addCustomError:function t(e,n){if(this._innerHost&&typeof this._innerHost.addCustomError==="function"){this._innerHost.addCustomError(e,n)}},clearCustomError:function t(e){if(this._innerHost&&typeof this._innerHost.clearCustomError==="function"){this._innerHost.clearCustomError(e)}},getProperty:function e(n){if(n==="outputData"){n="data"}if(this._innerHost&&(n==="data"||n==="dataJson")){return this._innerHost.getProperty(n)}return t.prototype.getProperty.call(this,n)}});return l});
1
+ sap.ui.define(["sap/ui/core/Control","./host/GeneratorHost","../utils/Logger","./host/delegates/ODataDelegate","../core/SchemaBuilderRegistry"],function(t,e,i,n,a){"use strict";function o(t){return t&&t.__esModule&&typeof t.default!=="undefined"?t.default:t}const s=o(e);const r=i["Logger"];const l=n["ODataDelegate"];const d=a["SchemaBuilderRegistry"];const c=t.extend("nz.co.siliconst.ui5.metaui.controls.DynamicHost",{constructor:function e(){t.prototype.constructor.apply(this,arguments);this.odataDelegate=null;this._innerHost=null;this._initializedInner=false},renderer:{apiVersion:2,render(t,e){t.openStart("div",e);t.style("width","100%");t.style("height","100%");t.openEnd();const i=e.getAggregation("_content");if(i){t.renderControl(i)}t.close("div")}},metadata:{properties:{schemaDefinition:{type:"any",defaultValue:null},data:{type:"object",defaultValue:null,bindable:"bindable"},dataJson:{type:"string",defaultValue:null,bindable:"bindable"},liveUpdate:{type:"boolean",defaultValue:false},isValid:{type:"boolean",defaultValue:true},useMessageManager:{type:"boolean",defaultValue:false},modelName:{type:"string",defaultValue:"meta"},debugMode:{type:"boolean",defaultValue:false},editable:{type:"boolean",defaultValue:true}},aggregations:{_content:{type:"sap.ui.core.Control",multiple:false,visibility:"hidden"}},events:{beforeSubmit:{parameters:{payload:{type:"object"},addError:{type:"function"},preventDefault:{type:"function"}}},submit:{parameters:{payload:{type:"object"},payloadJson:{type:"string"}}},cancel:{},fieldChange:{parameters:{fieldPath:{type:"string"},value:{type:"any"},payload:{type:"object"},isValid:{type:"boolean"}}},validationStateChanged:{parameters:{isValid:{type:"boolean"}}},validationError:{parameters:{fieldPath:{type:"string"},message:{type:"string"}}},validationSuccess:{parameters:{fieldPath:{type:"string"}}},error:{parameters:{message:{type:"string"},exception:{type:"object"}}}}},initODataDelegate:function t(){if(!this.odataDelegate){if(this.getBindingInfo("dataJson")){return}const t=this.getBindingInfo("data");if(t&&t.path&&t.path!==""){return}const e=this.getBindingContext("odata")||this.getBindingContext();if(e){r.debug("[MetaUI DynamicHost]",`Context found for delegate initialization: ${e.getPath()}`,"DynamicHost");if(e&&e.requestObject&&typeof e.requestObject==="function"){r.debug("[MetaUI DynamicHost]",`Context supports requestObject/getObject. Instantiating ODataDelegate.`,"DynamicHost");this.odataDelegate=new l(this,e);this.odataDelegate.syncToEngine()}else{r.debug("[MetaUI DynamicHost]",`Context does NOT support requestObject/getObject! Keys: ${Object.keys(e)}`,"DynamicHost")}}}},setBindingContext:function e(i,n){t.prototype.setBindingContext.call(this,i,n);this.initODataDelegate();return this},bindElement:function e(i,n){t.prototype.bindElement.call(this,i,n);const a=typeof i==="object"?i.model:undefined;const o=this.getElementBinding(a);if(o){o.attachChange(()=>{this.initODataDelegate()})}return this},onBeforeRendering:function e(){r.debug("[MetaUI DynamicHost]",`onBeforeRendering called. _initializedInner: ${this._initializedInner}`,"DynamicHost");this.initODataDelegate();if(!this._initializedInner){let e=this.getProperty("schemaDefinition");if(typeof e==="string"&&(e.startsWith("http://")||e.startsWith("https://"))){if(this._fetchingSchema)return;this._fetchingSchema=true;sap.ui.require(["sap/ui/core/BusyIndicator","sap/m/MessageToast"],(i,n)=>{i.show(0);fetch(e).then(t=>{if(!t.ok)throw new Error("HTTP "+t.status);return t.json()}).then(e=>{const n=d.getBuilderFor(e);const a=n?n.build(e):e;t.prototype.setProperty.call(this,"schemaDefinition",a,true);this._fetchingSchema=false;i.hide();this.invalidate()}).catch(e=>{r.warn("[MetaUI DynamicHost]","Failed to fetch remote schema: "+e,"DynamicHost");if(n)n.show("Failed to fetch remote schema");t.prototype.setProperty.call(this,"schemaDefinition",null,true);this._fetchingSchema=false;i.hide();this.invalidate()})});return}let i=e;if(i&&typeof i==="string"&&i.trim().startsWith("{")){try{i=JSON.parse(i)}catch(t){}}if(i&&typeof i==="object"){const e=d.getBuilderFor(i);if(e){i=e.build(i);t.prototype.setProperty.call(this,"schemaDefinition",i,true)}}const n=this.getProperty("dataJson");const a=this.getProperty("data");let o=!!i;if(o&&typeof i==="object"&&Object.keys(i).length===0){o=false}const l=!!n||!!a;r.debug("[MetaUI DynamicHost]",`Evaluating boot. hasSchema: ${o}, hasData: ${l}`,"DynamicHost");if(o||l){if(this.getProperty("debugMode")){r.debug("[MetaUI DynamicHost]",`Booting inner host. hasSchema: ${o}, hasData: ${l}`,"DynamicHost")}this._innerHost=new s;const e=this.getMetadata().getProperties();for(const i in e){const e=t.prototype.getProperty.call(this,i);if(e!==null&&e!==undefined){this._innerHost.setProperty(i,e)}}this.setAggregation("_content",this._innerHost);const i=this.getMetadata().getEvents();for(const e in i){this._innerHost.attachEvent(e,i=>{if(e==="submit"||e==="fieldChange"){const n=i.getParameters();if(n.payload){const i=this.getProperty("liveUpdate")===true;if(e==="submit"||i){t.prototype.setProperty.call(this,"data",n.payload,true);const e=n.payloadJson||JSON.stringify(n.payload,null,2);t.prototype.setProperty.call(this,"dataJson",e,true)}}if(e==="fieldChange"&&this.odataDelegate){this.odataDelegate.handleFieldChange(n.fieldPath,n.value)}}this.fireEvent(e,i.getParameters())})}this._initializedInner=true}}},setProperty:function e(i,n,a){if(i==="data"||i==="dataJson"||i==="schemaDefinition"){if(this.getProperty("debugMode")){r.debug("[MetaUI DynamicHost]",`Wrapper received setProperty: ${i}`,"DynamicHost")}}t.prototype.setProperty.call(this,i,n,a);if(this._innerHost){this._innerHost.setProperty(i,n,a)}else if(i==="data"||i==="dataJson"||i==="schemaDefinition"){if(this.getProperty("debugMode")){r.debug("[MetaUI DynamicHost]",`_innerHost not yet initialized when ${i} was set. Booting will happen on next render.`,"DynamicHost")}}return this},openInDialog:function t(e,i,n,a,o){if(!this._innerHost){this.onBeforeRendering()}this._innerHost?.openInDialog(e,i,n,a,o)},triggerSubmit:function t(){if(!this._innerHost){return false}return this._innerHost.triggerSubmit()},addCustomError:function t(e,i){if(this._innerHost&&typeof this._innerHost.addCustomError==="function"){this._innerHost.addCustomError(e,i)}},clearCustomError:function t(e){if(this._innerHost&&typeof this._innerHost.clearCustomError==="function"){this._innerHost.clearCustomError(e)}},getProperty:function e(i){if(i==="outputData"){i="data"}if(this._innerHost&&(i==="data"||i==="dataJson")){return this._innerHost.getProperty(i)}return t.prototype.getProperty.call(this,i)}});return c});
2
2
  //# sourceMappingURL=DynamicHost.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DynamicHost.js","names":["GeneratorHost","_interopRequireDefault","__GeneratorHost","Logger","___utils_Logger","ODataDelegate","___host_delegates_ODataDelegate","DynamicHost","Control","extend","constructor","prototype","apply","this","arguments","odataDelegate","_innerHost","_initializedInner","renderer","apiVersion","render","rm","control","openStart","style","openEnd","content","getAggregation","renderControl","close","metadata","properties","schemaDefinition","type","defaultValue","data","bindable","dataJson","liveUpdate","isValid","useMessageManager","modelName","debugMode","editable","aggregations","_content","multiple","visibility","events","beforeSubmit","parameters","payload","addError","preventDefault","submit","payloadJson","cancel","fieldChange","fieldPath","value","validationStateChanged","validationError","message","validationSuccess","error","exception","initODataDelegate","_initODataDelegate","getBindingInfo","dataBinding","path","oContext","getBindingContext","debug","getPath","requestObject","syncToEngine","Object","keys","setBindingContext","_setBindingContext","sModelName","Control.prototype.setBindingContext.call","bindElement","_bindElement","vPath","mParameters","Control.prototype.bindElement.call","model","undefined","oBinding","getElementBinding","attachChange","onBeforeRendering","_onBeforeRendering","schema","getProperty","hasSchema","length","hasData","props","getMetadata","getProperties","propName","val","Control.prototype.getProperty.call","setProperty","setAggregation","getEvents","eventName","attachEvent","oEvent","params","getParameters","isLive","Control.prototype.setProperty.call","str","JSON","stringify","handleFieldChange","fireEvent","_setProperty","propertyName","suppressInvalidate","openInDialog","_openInDialog","title","submitButtonText","cancelButtonText","dialogWidth","parentView","triggerSubmit","_triggerSubmit","addCustomError","_addCustomError","clearCustomError","_clearCustomError","_getProperty"],"sources":["DynamicHost.ts"],"sourcesContent":["import Control from \"sap/ui/core/Control\";\nimport RenderManager from \"sap/ui/core/RenderManager\";\nimport GeneratorHost from \"./host/GeneratorHost\";\nimport { Logger } from \"../utils/Logger\";\nimport { ODataDelegate } from \"./host/delegates/ODataDelegate\";\nimport ODataV4Context from \"sap/ui/model/odata/v4/Context\";\n\n/**\n * A transparent wrapper control (Facade) that automatically chooses between Explicit Schema Mode \n * and Inference Mode based on the presence of a 'schemaDefinition'.\n * \n * This maintains total architectural separation of the modes without forcing developers to \n * use different XML tags.\n * \n * @namespace nz.co.siliconst.ui5.metaui.controls\n */\nexport default class DynamicHost extends Control {\n private odataDelegate: ODataDelegate | null = null;\n\n static readonly metadata = {\n properties: {\n schemaDefinition: { type: \"any\", defaultValue: null },\n data: { type: \"object\", defaultValue: null, bindable: \"bindable\" },\n dataJson: { type: \"string\", defaultValue: null, bindable: \"bindable\" },\n liveUpdate: { type: \"boolean\", defaultValue: false },\n isValid: { type: \"boolean\", defaultValue: true },\n useMessageManager: { type: \"boolean\", defaultValue: false },\n modelName: { type: \"string\", defaultValue: \"meta\" },\n debugMode: { type: \"boolean\", defaultValue: false },\n editable: { type: \"boolean\", defaultValue: true }\n },\n aggregations: {\n _content: { type: \"sap.ui.core.Control\", multiple: false, visibility: \"hidden\" }\n },\n events: {\n beforeSubmit: {\n parameters: {\n payload: { type: \"object\" },\n addError: { type: \"function\" },\n preventDefault: { type: \"function\" }\n }\n },\n submit: {\n parameters: {\n payload: { type: \"object\" },\n payloadJson: { type: \"string\" }\n }\n },\n cancel: {},\n fieldChange: {\n parameters: {\n fieldPath: { type: \"string\" },\n value: { type: \"any\" },\n payload: { type: \"object\" },\n isValid: { type: \"boolean\" }\n }\n },\n validationStateChanged: { parameters: { isValid: { type: \"boolean\" } } },\n validationError: { parameters: { fieldPath: { type: \"string\" }, message: { type: \"string\" } } },\n validationSuccess: { parameters: { fieldPath: { type: \"string\" } } },\n error: { parameters: { message: { type: \"string\" }, exception: { type: \"object\" } } }\n }\n };\n\n static renderer = {\n apiVersion: 2,\n render(rm: RenderManager, control: DynamicHost) {\n rm.openStart(\"div\", control);\n rm.style(\"width\", \"100%\");\n rm.style(\"height\", \"100%\");\n rm.openEnd();\n\n const content = control.getAggregation(\"_content\") as Control;\n if (content) {\n rm.renderControl(content);\n }\n\n rm.close(\"div\");\n }\n };\n\n /**\n * Internal reference to the generated inner host instance.\n * @private\n */\n private _innerHost: GeneratorHost | null = null;\n \n /**\n * Flag indicating if the inner host has been initialized.\n * @private\n */\n private _initializedInner: boolean = false;\n\n /**\n * Initializes the OData Delegate if an OData context is detected.\n * This allows DynamicHost to seamlessly synchronize metadata and properties from an OData model.\n * @private\n */\n private initODataDelegate(): void {\n if (!this.odataDelegate) {\n // Guard: If the user explicitly bound dataJson, do not steal the context.\n if (this.getBindingInfo(\"dataJson\")) {\n return;\n }\n\n // Guard: If the user explicitly bound 'data' to a specific property path, do not steal the context.\n const dataBinding = this.getBindingInfo(\"data\") as any;\n if (dataBinding && dataBinding.path && dataBinding.path !== \"\") {\n return;\n }\n\n const oContext = this.getBindingContext(\"odata\") || this.getBindingContext();\n if (oContext) {\n Logger.debug(\"[MetaUI DynamicHost]\", `Context found for delegate initialization: ${oContext.getPath()}`, \"DynamicHost\");\n if (oContext && (oContext as ODataV4Context).requestObject && typeof (oContext as ODataV4Context).requestObject === \"function\") {\n Logger.debug(\"[MetaUI DynamicHost]\", `Context supports requestObject/getObject. Instantiating ODataDelegate.`, \"DynamicHost\");\n this.odataDelegate = new ODataDelegate(this, oContext as ODataV4Context);\n this.odataDelegate.syncToEngine();\n } else {\n Logger.debug(\"[MetaUI DynamicHost]\", `Context does NOT support requestObject/getObject! Keys: ${Object.keys(oContext)}`, \"DynamicHost\");\n }\n }\n }\n }\n\n /**\n * Standard UI5 method override.\n * Sets the binding context for the control and attempts to initialize the OData delegate\n * if the context points to an OData model.\n * \n * @param {sap.ui.model.Context | null | undefined} oContext The binding context object\n * @param {string} [sModelName] Optional model name\n * @returns {this} The control instance for chaining\n */\n public setBindingContext(oContext: sap.ui.model.Context | null | undefined, sModelName?: string): this {\n super.setBindingContext(oContext, sModelName);\n this.initODataDelegate();\n return this;\n }\n\n /**\n * Standard UI5 method override.\n * Binds the element to the given path and attaches a change listener to re-evaluate\n * the OData delegate when the element binding resolves.\n * \n * @param {string | Record<string, unknown>} vPath The binding path or configuration object\n * @param {object} [mParameters] Optional mapping parameters\n * @returns {this} Reference to this instance for chaining\n */\n public bindElement(vPath: string | Record<string, unknown>, mParameters?: object): this {\n super.bindElement(vPath, mParameters);\n const sModelName = typeof vPath === \"object\" ? vPath.model : undefined;\n const oBinding = this.getElementBinding(sModelName);\n if (oBinding) {\n oBinding.attachChange(() => {\n this.initODataDelegate();\n });\n }\n return this;\n }\n\n /**\n * Standard UI5 Lifecycle Hook.\n * Evaluates the initial properties and spawns the GeneratorHost.\n * It handles the complex lifecycle task of copying all bindings, raw properties, and event listeners \n * down to the inner host perfectly transparently.\n */\n public onBeforeRendering(): void {\n Logger.debug(\"[MetaUI DynamicHost]\", `onBeforeRendering called. _initializedInner: ${this._initializedInner}`, \"DynamicHost\");\n\n this.initODataDelegate();\n\n if (!this._initializedInner) {\n const schema = this.getProperty(\"schemaDefinition\");\n const dataJson = this.getProperty(\"dataJson\");\n const data = this.getProperty(\"data\");\n\n let hasSchema = !!schema;\n if (hasSchema && typeof schema === \"object\" && Object.keys(schema).length === 0) {\n hasSchema = false; // Treat empty object as no schema\n }\n \n const hasData = !!dataJson || !!data;\n\n Logger.debug(\"[MetaUI DynamicHost]\", `Evaluating boot. hasSchema: ${hasSchema}, hasData: ${hasData}`, \"DynamicHost\");\n\n // Only boot if we have either a schema or some data to infer from\n if (hasSchema || hasData) {\n if (this.getProperty(\"debugMode\")) {\n Logger.debug(\"[MetaUI DynamicHost]\", `Booting inner host. hasSchema: ${hasSchema}, hasData: ${hasData}`, \"DynamicHost\");\n }\n // The architectural Facade router logic:\n // We've simplified this! We no longer use HostFactory or separate subclasses.\n // GeneratorHost is fully capable of inferring the schema if none is provided.\n this._innerHost = new GeneratorHost();\n\n // 1. Forward all static values to the spawned host BEFORE mounting.\n // Since we no longer use bindProperty, it's perfectly safe to set raw properties before mounting.\n const props = this.getMetadata().getProperties();\n for (const propName in props) {\n const val = super.getProperty(propName);\n if (val !== null && val !== undefined) {\n this._innerHost.setProperty(propName, val);\n }\n }\n\n // 2. Mount so it inherits models and triggers lifecycle.\n this.setAggregation(\"_content\", this._innerHost);\n\n // 3. Forward all event subscriptions.\n // By proxying the events upwards, the developer can subscribe to `<meta:DynamicHost submit=\"...\">` \n // and perfectly receive the inner host's submission event.\n const events = this.getMetadata().getEvents();\n for (const eventName in events) {\n this._innerHost.attachEvent(eventName, (oEvent: sap.ui.base.Event) => {\n // Natively push updated payload out to any bound Fiori Element properties.\n // Using super.setProperty prevents an infinite loop back down to _innerHost.\n if (eventName === \"submit\" || eventName === \"fieldChange\") {\n const params = oEvent.getParameters();\n if (params.payload) {\n const isLive = this.getProperty(\"liveUpdate\") === true;\n if (eventName === \"submit\" || isLive) {\n super.setProperty(\"data\", params.payload, true);\n\n const str = params.payloadJson || JSON.stringify(params.payload, null, 2);\n super.setProperty(\"dataJson\", str, true);\n }\n }\n if (eventName === \"fieldChange\" && this.odataDelegate) {\n this.odataDelegate.handleFieldChange(params.fieldPath, params.value);\n }\n }\n this.fireEvent(eventName, oEvent.getParameters());\n });\n }\n\n this._initializedInner = true;\n }\n }\n }\n\n /**\n * Overrides standard UI5 setProperty to act as a transparent proxy.\n * When a property is updated on the wrapper (either programmatically or via a binding update),\n * it instantly mirrors that value down to the inner instantiated host.\n */\n public setProperty(propertyName: string, value: unknown, suppressInvalidate?: boolean): this {\n if (propertyName === \"data\" || propertyName === \"dataJson\" || propertyName === \"schemaDefinition\") {\n if (this.getProperty(\"debugMode\")) {\n Logger.debug(\"[MetaUI DynamicHost]\", `Wrapper received setProperty: ${propertyName}`, \"DynamicHost\");\n }\n }\n super.setProperty(propertyName, value, suppressInvalidate);\n if (this._innerHost) {\n this._innerHost.setProperty(propertyName, value, suppressInvalidate);\n } else if (propertyName === \"data\" || propertyName === \"dataJson\" || propertyName === \"schemaDefinition\") {\n if (this.getProperty(\"debugMode\")) {\n Logger.debug(\"[MetaUI DynamicHost]\", `_innerHost not yet initialized when ${propertyName} was set. Booting will happen on next render.`, \"DynamicHost\");\n }\n }\n return this;\n }\n\n\n\n\n\n /**\n * Programmatic API support. Routes dialog commands down to the spawned inner host.\n * If the inner host has not booted yet, it forces initialization immediately.\n * \n * @param {string} [title=\"Form\"] The title of the dialog\n * @param {string} [submitButtonText=\"OK\"] The text for the primary action button\n * @param {string} [cancelButtonText=\"Cancel\"] The text for the cancel button\n * @param {string} [dialogWidth=\"800px\"] The width of the dialog\n * @param {sap.ui.core.Control} [parentView] The parent view to attach the dialog to for model inheritance.\n */\n public openInDialog(title?: string, submitButtonText?: string, cancelButtonText?: string, dialogWidth?: string, parentView?: Control): void {\n if (!this._innerHost) {\n this.onBeforeRendering(); // Force init if they bypassed UI5 rendering\n }\n this._innerHost?.openInDialog(title, submitButtonText, cancelButtonText, dialogWidth, parentView);\n }\n\n /**\n * Proxies submission triggering down to the instantiated generator host.\n * Evaluates the internal Engine validation suite and returns true if structurally sound.\n * \n * @returns {boolean} True if the internal payload passes schema validation, false otherwise.\n */\n public triggerSubmit(): boolean {\n if (!this._innerHost) {\n return false;\n }\n return this._innerHost.triggerSubmit();\n }\n\n /**\n * Injects a custom error message onto a specific field.\n * Useful for injecting custom backend validation errors.\n * \n * @param {string} fieldPath The schema key path to target.\n * @param {string} message The custom error message to display.\n */\n public addCustomError(fieldPath: string, message: string): void {\n if (this._innerHost && typeof (this._innerHost as any).addCustomError === \"function\") {\n (this._innerHost as any).addCustomError(fieldPath, message);\n }\n }\n\n /**\n * Clears a custom error message from a specific field.\n * \n * @param {string} fieldPath The schema key path to target.\n */\n public clearCustomError(fieldPath: string): void {\n if (this._innerHost && typeof (this._innerHost as any).clearCustomError === \"function\") {\n (this._innerHost as any).clearCustomError(fieldPath);\n }\n }\n\n /**\n * Overrides standard UI5 getProperty to transparently pull extracted data from the inner host.\n * Ensures that querying the DynamicHost facade for `data` always yields the freshest payload.\n * \n * @param {string} propertyName The name of the property to retrieve\n * @returns {unknown} The property value\n */\n public getProperty(propertyName: string): unknown {\n if (propertyName === \"outputData\") {\n propertyName = \"data\"; // Forward deprecated outputData to data\n }\n if (this._innerHost && (propertyName === \"data\" || propertyName === \"dataJson\")) {\n return this._innerHost.getProperty(propertyName);\n }\n return super.getProperty(propertyName);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"DynamicHost.js","names":["GeneratorHost","_interopRequireDefault","__GeneratorHost","Logger","___utils_Logger","ODataDelegate","___host_delegates_ODataDelegate","SchemaBuilderRegistry","___core_SchemaBuilderRegistry","DynamicHost","Control","extend","constructor","prototype","apply","this","arguments","odataDelegate","_innerHost","_initializedInner","renderer","apiVersion","render","rm","control","openStart","style","openEnd","content","getAggregation","renderControl","close","metadata","properties","schemaDefinition","type","defaultValue","data","bindable","dataJson","liveUpdate","isValid","useMessageManager","modelName","debugMode","editable","aggregations","_content","multiple","visibility","events","beforeSubmit","parameters","payload","addError","preventDefault","submit","payloadJson","cancel","fieldChange","fieldPath","value","validationStateChanged","validationError","message","validationSuccess","error","exception","initODataDelegate","_initODataDelegate","getBindingInfo","dataBinding","path","oContext","getBindingContext","debug","getPath","requestObject","syncToEngine","Object","keys","setBindingContext","_setBindingContext","sModelName","Control.prototype.setBindingContext.call","bindElement","_bindElement","vPath","mParameters","Control.prototype.bindElement.call","model","undefined","oBinding","getElementBinding","attachChange","onBeforeRendering","_onBeforeRendering","schemaRaw","getProperty","startsWith","_fetchingSchema","sap","ui","require","BusyIndicator","MessageToast","show","fetch","then","res","ok","Error","status","json","plugin","getBuilderFor","finalSchema","build","Control.prototype.setProperty.call","hide","invalidate","catch","err","warn","schema","trim","JSON","parse","e","hasSchema","length","hasData","props","getMetadata","getProperties","propName","val","Control.prototype.getProperty.call","setProperty","setAggregation","getEvents","eventName","attachEvent","oEvent","params","getParameters","isLive","str","stringify","handleFieldChange","fireEvent","_setProperty","propertyName","suppressInvalidate","openInDialog","_openInDialog","title","submitButtonText","cancelButtonText","dialogWidth","parentView","triggerSubmit","_triggerSubmit","addCustomError","_addCustomError","clearCustomError","_clearCustomError","_getProperty"],"sources":["DynamicHost.ts"],"sourcesContent":["import Control from \"sap/ui/core/Control\";\nimport RenderManager from \"sap/ui/core/RenderManager\";\nimport GeneratorHost from \"./host/GeneratorHost\";\nimport { Logger } from \"../utils/Logger\";\nimport { ODataDelegate } from \"./host/delegates/ODataDelegate\";\nimport ODataV4Context from \"sap/ui/model/odata/v4/Context\";\nimport { SchemaBuilderRegistry } from \"../core/SchemaBuilderRegistry\";\n\n/**\n * A transparent wrapper control (Facade) that automatically chooses between Explicit Schema Mode \n * and Inference Mode based on the presence of a 'schemaDefinition'.\n * \n * This maintains total architectural separation of the modes without forcing developers to \n * use different XML tags.\n * \n * @namespace nz.co.siliconst.ui5.metaui.controls\n */\nexport default class DynamicHost extends Control {\n private odataDelegate: ODataDelegate | null = null;\n\n static readonly metadata = {\n properties: {\n schemaDefinition: { type: \"any\", defaultValue: null },\n data: { type: \"object\", defaultValue: null, bindable: \"bindable\" },\n dataJson: { type: \"string\", defaultValue: null, bindable: \"bindable\" },\n liveUpdate: { type: \"boolean\", defaultValue: false },\n isValid: { type: \"boolean\", defaultValue: true },\n useMessageManager: { type: \"boolean\", defaultValue: false },\n modelName: { type: \"string\", defaultValue: \"meta\" },\n debugMode: { type: \"boolean\", defaultValue: false },\n editable: { type: \"boolean\", defaultValue: true }\n },\n aggregations: {\n _content: { type: \"sap.ui.core.Control\", multiple: false, visibility: \"hidden\" }\n },\n events: {\n beforeSubmit: {\n parameters: {\n payload: { type: \"object\" },\n addError: { type: \"function\" },\n preventDefault: { type: \"function\" }\n }\n },\n submit: {\n parameters: {\n payload: { type: \"object\" },\n payloadJson: { type: \"string\" }\n }\n },\n cancel: {},\n fieldChange: {\n parameters: {\n fieldPath: { type: \"string\" },\n value: { type: \"any\" },\n payload: { type: \"object\" },\n isValid: { type: \"boolean\" }\n }\n },\n validationStateChanged: { parameters: { isValid: { type: \"boolean\" } } },\n validationError: { parameters: { fieldPath: { type: \"string\" }, message: { type: \"string\" } } },\n validationSuccess: { parameters: { fieldPath: { type: \"string\" } } },\n error: { parameters: { message: { type: \"string\" }, exception: { type: \"object\" } } }\n }\n };\n\n static renderer = {\n apiVersion: 2,\n render(rm: RenderManager, control: DynamicHost) {\n rm.openStart(\"div\", control);\n rm.style(\"width\", \"100%\");\n rm.style(\"height\", \"100%\");\n rm.openEnd();\n\n const content = control.getAggregation(\"_content\") as Control;\n if (content) {\n rm.renderControl(content);\n }\n\n rm.close(\"div\");\n }\n };\n\n /**\n * Internal reference to the generated inner host instance.\n * @private\n */\n private _innerHost: GeneratorHost | null = null;\n\n /**\n * Flag indicating if the inner host has been initialized.\n * @private\n */\n private _initializedInner: boolean = false;\n\n /**\n * Initializes the OData Delegate if an OData context is detected.\n * This allows DynamicHost to seamlessly synchronize metadata and properties from an OData model.\n * @private\n */\n private initODataDelegate(): void {\n if (!this.odataDelegate) {\n // Guard: If the user explicitly bound dataJson, do not steal the context.\n if (this.getBindingInfo(\"dataJson\")) {\n return;\n }\n\n // Guard: If the user explicitly bound 'data' to a specific property path, do not steal the context.\n const dataBinding = this.getBindingInfo(\"data\") as any;\n if (dataBinding && dataBinding.path && dataBinding.path !== \"\") {\n return;\n }\n\n const oContext = this.getBindingContext(\"odata\") || this.getBindingContext();\n if (oContext) {\n Logger.debug(\"[MetaUI DynamicHost]\", `Context found for delegate initialization: ${oContext.getPath()}`, \"DynamicHost\");\n if (oContext && (oContext as ODataV4Context).requestObject && typeof (oContext as ODataV4Context).requestObject === \"function\") {\n Logger.debug(\"[MetaUI DynamicHost]\", `Context supports requestObject/getObject. Instantiating ODataDelegate.`, \"DynamicHost\");\n this.odataDelegate = new ODataDelegate(this, oContext as ODataV4Context);\n this.odataDelegate.syncToEngine();\n } else {\n Logger.debug(\"[MetaUI DynamicHost]\", `Context does NOT support requestObject/getObject! Keys: ${Object.keys(oContext)}`, \"DynamicHost\");\n }\n }\n }\n }\n\n /**\n * Standard UI5 method override.\n * Sets the binding context for the control and attempts to initialize the OData delegate\n * if the context points to an OData model.\n * \n * @param {sap.ui.model.Context | null | undefined} oContext The binding context object\n * @param {string} [sModelName] Optional model name\n * @returns {this} The control instance for chaining\n */\n public setBindingContext(oContext: sap.ui.model.Context | null | undefined, sModelName?: string): this {\n super.setBindingContext(oContext, sModelName);\n this.initODataDelegate();\n return this;\n }\n\n /**\n * Standard UI5 method override.\n * Binds the element to the given path and attaches a change listener to re-evaluate\n * the OData delegate when the element binding resolves.\n * \n * @param {string | Record<string, unknown>} vPath The binding path or configuration object\n * @param {object} [mParameters] Optional mapping parameters\n * @returns {this} Reference to this instance for chaining\n */\n public bindElement(vPath: string | Record<string, unknown>, mParameters?: object): this {\n super.bindElement(vPath, mParameters);\n const sModelName = typeof vPath === \"object\" ? vPath.model : undefined;\n const oBinding = this.getElementBinding(sModelName);\n if (oBinding) {\n oBinding.attachChange(() => {\n this.initODataDelegate();\n });\n }\n return this;\n }\n\n /**\n * Standard UI5 Lifecycle Hook.\n * Evaluates the initial properties and spawns the GeneratorHost.\n * It handles the complex lifecycle task of copying all bindings, raw properties, and event listeners \n * down to the inner host perfectly transparently.\n */\n public onBeforeRendering(): void {\n Logger.debug(\"[MetaUI DynamicHost]\", `onBeforeRendering called. _initializedInner: ${this._initializedInner}`, \"DynamicHost\");\n\n this.initODataDelegate();\n\n if (!this._initializedInner) {\n let schemaRaw = this.getProperty(\"schemaDefinition\");\n\n // 1. URL Detection & Fetching\n if (typeof schemaRaw === \"string\" && (schemaRaw.startsWith(\"http://\") || schemaRaw.startsWith(\"https://\"))) {\n if ((this as any)._fetchingSchema) return; // Prevent re-entry\n (this as any)._fetchingSchema = true;\n \n sap.ui.require([\"sap/ui/core/BusyIndicator\", \"sap/m/MessageToast\"], (BusyIndicator: any, MessageToast: any) => {\n BusyIndicator.show(0);\n fetch(schemaRaw as string)\n .then(res => {\n if (!res.ok) throw new Error(\"HTTP \" + res.status);\n return res.json();\n })\n .then(json => {\n const plugin = SchemaBuilderRegistry.getBuilderFor(json);\n const finalSchema = plugin ? plugin.build(json) : json;\n super.setProperty(\"schemaDefinition\", finalSchema, true);\n (this as any)._fetchingSchema = false;\n BusyIndicator.hide();\n this.invalidate(); // Force re-render with resolved schema\n })\n .catch(err => {\n Logger.warn(\"[MetaUI DynamicHost]\", \"Failed to fetch remote schema: \" + err, \"DynamicHost\");\n if (MessageToast) MessageToast.show(\"Failed to fetch remote schema\");\n super.setProperty(\"schemaDefinition\", null, true); // Fallback to full inference\n (this as any)._fetchingSchema = false;\n BusyIndicator.hide();\n this.invalidate();\n });\n });\n return; // Abort this render cycle until fetch completes\n }\n\n // 2. Local Plugin Detection (Stringified JSON or Raw Object)\n let schema = schemaRaw;\n if (schema && typeof schema === \"string\" && (schema as string).trim().startsWith(\"{\")) {\n try {\n schema = JSON.parse(schema);\n } catch (e) {\n // Ignore, let standard validation catch it\n }\n }\n\n if (schema && typeof schema === \"object\") {\n const plugin = SchemaBuilderRegistry.getBuilderFor(schema);\n if (plugin) {\n schema = plugin.build(schema);\n // Silently update the wrapper property so the inner host gets the final parsed MetaUI format\n super.setProperty(\"schemaDefinition\", schema, true);\n }\n }\n\n const dataJson = this.getProperty(\"dataJson\");\n const data = this.getProperty(\"data\");\n\n let hasSchema = !!schema;\n if (hasSchema && typeof schema === \"object\" && Object.keys(schema).length === 0) {\n hasSchema = false; // Treat empty object as no schema\n }\n\n const hasData = !!dataJson || !!data;\n\n Logger.debug(\"[MetaUI DynamicHost]\", `Evaluating boot. hasSchema: ${hasSchema}, hasData: ${hasData}`, \"DynamicHost\");\n\n // Only boot if we have either a schema or some data to infer from\n if (hasSchema || hasData) {\n if (this.getProperty(\"debugMode\")) {\n Logger.debug(\"[MetaUI DynamicHost]\", `Booting inner host. hasSchema: ${hasSchema}, hasData: ${hasData}`, \"DynamicHost\");\n }\n // The architectural Facade router logic:\n // We've simplified this! We no longer use HostFactory or separate subclasses.\n // GeneratorHost is fully capable of inferring the schema if none is provided.\n this._innerHost = new GeneratorHost();\n\n // 1. Forward all static values to the spawned host BEFORE mounting.\n // Since we no longer use bindProperty, it's perfectly safe to set raw properties before mounting.\n const props = this.getMetadata().getProperties();\n for (const propName in props) {\n const val = super.getProperty(propName);\n if (val !== null && val !== undefined) {\n this._innerHost.setProperty(propName, val);\n }\n }\n\n // 2. Mount so it inherits models and triggers lifecycle.\n this.setAggregation(\"_content\", this._innerHost);\n\n // 3. Forward all event subscriptions.\n // By proxying the events upwards, the developer can subscribe to `<meta:DynamicHost submit=\"...\">` \n // and perfectly receive the inner host's submission event.\n const events = this.getMetadata().getEvents();\n for (const eventName in events) {\n this._innerHost.attachEvent(eventName, (oEvent: sap.ui.base.Event) => {\n // Natively push updated payload out to any bound Fiori Element properties.\n // Using super.setProperty prevents an infinite loop back down to _innerHost.\n if (eventName === \"submit\" || eventName === \"fieldChange\") {\n const params = oEvent.getParameters();\n if (params.payload) {\n const isLive = this.getProperty(\"liveUpdate\") === true;\n if (eventName === \"submit\" || isLive) {\n super.setProperty(\"data\", params.payload, true);\n\n const str = params.payloadJson || JSON.stringify(params.payload, null, 2);\n super.setProperty(\"dataJson\", str, true);\n }\n }\n if (eventName === \"fieldChange\" && this.odataDelegate) {\n this.odataDelegate.handleFieldChange(params.fieldPath, params.value);\n }\n }\n this.fireEvent(eventName, oEvent.getParameters());\n });\n }\n\n this._initializedInner = true;\n }\n }\n }\n\n /**\n * Overrides standard UI5 setProperty to act as a transparent proxy.\n * When a property is updated on the wrapper (either programmatically or via a binding update),\n * it instantly mirrors that value down to the inner instantiated host.\n */\n public setProperty(propertyName: string, value: unknown, suppressInvalidate?: boolean): this {\n if (propertyName === \"data\" || propertyName === \"dataJson\" || propertyName === \"schemaDefinition\") {\n if (this.getProperty(\"debugMode\")) {\n Logger.debug(\"[MetaUI DynamicHost]\", `Wrapper received setProperty: ${propertyName}`, \"DynamicHost\");\n }\n }\n super.setProperty(propertyName, value, suppressInvalidate);\n if (this._innerHost) {\n this._innerHost.setProperty(propertyName, value, suppressInvalidate);\n } else if (propertyName === \"data\" || propertyName === \"dataJson\" || propertyName === \"schemaDefinition\") {\n if (this.getProperty(\"debugMode\")) {\n Logger.debug(\"[MetaUI DynamicHost]\", `_innerHost not yet initialized when ${propertyName} was set. Booting will happen on next render.`, \"DynamicHost\");\n }\n }\n return this;\n }\n\n\n\n\n\n /**\n * Programmatic API support. Routes dialog commands down to the spawned inner host.\n * If the inner host has not booted yet, it forces initialization immediately.\n * \n * @param {string} [title=\"Form\"] The title of the dialog\n * @param {string} [submitButtonText=\"OK\"] The text for the primary action button\n * @param {string} [cancelButtonText=\"Cancel\"] The text for the cancel button\n * @param {string} [dialogWidth=\"auto\"] The width of the dialog\n * @param {sap.ui.core.Control} [parentView] The parent view to attach the dialog to for model inheritance.\n */\n public openInDialog(title?: string, submitButtonText?: string, cancelButtonText?: string, dialogWidth?: string, parentView?: Control): void {\n if (!this._innerHost) {\n this.onBeforeRendering(); // Force init if they bypassed UI5 rendering\n }\n this._innerHost?.openInDialog(title, submitButtonText, cancelButtonText, dialogWidth, parentView);\n }\n\n /**\n * Proxies submission triggering down to the instantiated generator host.\n * Evaluates the internal Engine validation suite and returns true if structurally sound.\n * \n * @returns {boolean} True if the internal payload passes schema validation, false otherwise.\n */\n public triggerSubmit(): boolean {\n if (!this._innerHost) {\n return false;\n }\n return this._innerHost.triggerSubmit();\n }\n\n /**\n * Injects a custom error message onto a specific field.\n * Useful for injecting custom backend validation errors.\n * \n * @param {string} fieldPath The schema key path to target.\n * @param {string} message The custom error message to display.\n */\n public addCustomError(fieldPath: string, message: string): void {\n if (this._innerHost && typeof (this._innerHost as any).addCustomError === \"function\") {\n (this._innerHost as any).addCustomError(fieldPath, message);\n }\n }\n\n /**\n * Clears a custom error message from a specific field.\n * \n * @param {string} fieldPath The schema key path to target.\n */\n public clearCustomError(fieldPath: string): void {\n if (this._innerHost && typeof (this._innerHost as any).clearCustomError === \"function\") {\n (this._innerHost as any).clearCustomError(fieldPath);\n }\n }\n\n /**\n * Overrides standard UI5 getProperty to transparently pull extracted data from the inner host.\n * Ensures that querying the DynamicHost facade for `data` always yields the freshest payload.\n * \n * @param {string} propertyName The name of the property to retrieve\n * @returns {unknown} The property value\n */\n public getProperty(propertyName: string): unknown {\n if (propertyName === \"outputData\") {\n propertyName = \"data\"; // Forward deprecated outputData to data\n }\n if (this._innerHost && (propertyName === \"data\" || propertyName === \"dataJson\")) {\n return this._innerHost.getProperty(propertyName);\n }\n return super.getProperty(propertyName);\n }\n}\n"],"mappings":"wQAEOA,EAAaC,EAAAC,GAAA,MACXC,EAAMC,EAAA,gBACNC,EAAaC,EAAA,uBAEbC,EAAqBC,EAAA,yBAE9B,MASqBC,EAAoBC,EAAOC,OAAA,mDAAAC,YAAA,SAAAA,IAAAF,EAAAG,UAAAD,YAAAE,MAAAC,KAAAC,WAAAD,KACpCE,cAAsC,KAgE9CF,KAIQG,WAAmC,KAE3CH,KAIQI,kBAA6B,KAAK,EA3BnCC,SAAW,CACdC,WAAY,EACZC,OAAOC,EAAmBC,GACtBD,EAAGE,UAAU,MAAOD,GACpBD,EAAGG,MAAM,QAAS,QAClBH,EAAGG,MAAM,SAAU,QACnBH,EAAGI,UAEH,MAAMC,EAAUJ,EAAQK,eAAe,YACvC,GAAID,EAAS,CACTL,EAAGO,cAAcF,EACrB,CAEAL,EAAGQ,MAAM,MACb,GA3DYC,SAAW,CACvBC,WAAY,CACRC,iBAAkB,CAAEC,KAAM,MAAOC,aAAc,MAC/CC,KAAM,CAAEF,KAAM,SAAUC,aAAc,KAAME,SAAU,YACtDC,SAAU,CAAEJ,KAAM,SAAUC,aAAc,KAAME,SAAU,YAC1DE,WAAY,CAAEL,KAAM,UAAWC,aAAc,OAC7CK,QAAS,CAAEN,KAAM,UAAWC,aAAc,MAC1CM,kBAAmB,CAAEP,KAAM,UAAWC,aAAc,OACpDO,UAAW,CAAER,KAAM,SAAUC,aAAc,QAC3CQ,UAAW,CAAET,KAAM,UAAWC,aAAc,OAC5CS,SAAU,CAAEV,KAAM,UAAWC,aAAc,OAE/CU,aAAc,CACVC,SAAU,CAAEZ,KAAM,sBAAuBa,SAAU,MAAOC,WAAY,WAE1EC,OAAQ,CACJC,aAAc,CACVC,WAAY,CACRC,QAAS,CAAElB,KAAM,UACjBmB,SAAU,CAAEnB,KAAM,YAClBoB,eAAgB,CAAEpB,KAAM,cAGhCqB,OAAQ,CACJJ,WAAY,CACRC,QAAS,CAAElB,KAAM,UACjBsB,YAAa,CAAEtB,KAAM,YAG7BuB,OAAQ,CAAC,EACTC,YAAa,CACTP,WAAY,CACRQ,UAAW,CAAEzB,KAAM,UACnB0B,MAAO,CAAE1B,KAAM,OACfkB,QAAS,CAAElB,KAAM,UACjBM,QAAS,CAAEN,KAAM,aAGzB2B,uBAAwB,CAAEV,WAAY,CAAEX,QAAS,CAAEN,KAAM,aACzD4B,gBAAiB,CAAEX,WAAY,CAAEQ,UAAW,CAAEzB,KAAM,UAAY6B,QAAS,CAAE7B,KAAM,YACjF8B,kBAAmB,CAAEb,WAAY,CAAEQ,UAAW,CAAEzB,KAAM,YACtD+B,MAAO,CAAEd,WAAY,CAAEY,QAAS,CAAE7B,KAAM,UAAYgC,UAAW,CAAEhC,KAAM,cAsCvEiC,kBAAiB,SAAAC,IACrB,IAAKtD,KAAKE,cAAe,CAErB,GAAIF,KAAKuD,eAAe,YAAa,CACjC,MACJ,CAGA,MAAMC,EAAcxD,KAAKuD,eAAe,QACxC,GAAIC,GAAeA,EAAYC,MAAQD,EAAYC,OAAS,GAAI,CAC5D,MACJ,CAEA,MAAMC,EAAW1D,KAAK2D,kBAAkB,UAAY3D,KAAK2D,oBACzD,GAAID,EAAU,CACVtE,EAAOwE,MAAM,uBAAwB,8CAA8CF,EAASG,YAAa,eACzG,GAAIH,GAAaA,EAA4BI,sBAAyBJ,EAA4BI,gBAAkB,WAAY,CAC5H1E,EAAOwE,MAAM,uBAAwB,yEAA0E,eAC/G5D,KAAKE,cAAgB,IAAIZ,EAAcU,KAAM0D,GAC7C1D,KAAKE,cAAc6D,cACvB,KAAO,CACH3E,EAAOwE,MAAM,uBAAwB,2DAA2DI,OAAOC,KAAKP,KAAa,cAC7H,CACJ,CACJ,CACJ,EAWOQ,kBAAiB,SAAAC,EAACT,EAAmDU,GACxEC,mCAAArE,KAAwB0D,EAAUU,GAClCpE,KAAKqD,oBACL,OAAOrD,IACX,EAWOsE,YAAW,SAAAC,EAACC,EAAyCC,GACxDC,6BAAA1E,KAAkBwE,EAAOC,GACzB,MAAML,SAAoBI,IAAU,SAAWA,EAAMG,MAAQC,UAC7D,MAAMC,EAAW7E,KAAK8E,kBAAkBV,GACxC,GAAIS,EAAU,CACVA,EAASE,aAAa,KAClB/E,KAAKqD,qBAEb,CACA,OAAOrD,IACX,EAQOgF,kBAAiB,SAAAC,IACpB7F,EAAOwE,MAAM,uBAAwB,gDAAgD5D,KAAKI,oBAAqB,eAE/GJ,KAAKqD,oBAEL,IAAKrD,KAAKI,kBAAmB,CACzB,IAAI8E,EAAYlF,KAAKmF,YAAY,oBAGjC,UAAWD,IAAc,WAAaA,EAAUE,WAAW,YAAcF,EAAUE,WAAW,aAAc,CACxG,GAAKpF,KAAaqF,gBAAiB,OAClCrF,KAAaqF,gBAAkB,KAEhCC,IAAIC,GAAGC,QAAQ,CAAC,4BAA6B,sBAAuB,CAACC,EAAoBC,KACrFD,EAAcE,KAAK,GACnBC,MAAMV,GACDW,KAAKC,IACF,IAAKA,EAAIC,GAAI,MAAM,IAAIC,MAAM,QAAUF,EAAIG,QAC3C,OAAOH,EAAII,SAEdL,KAAKK,IACF,MAAMC,EAAS3G,EAAsB4G,cAAcF,GACnD,MAAMG,EAAcF,EAASA,EAAOG,MAAMJ,GAAQA,EAClDK,6BAAAvG,KAAkB,mBAAoBqG,EAAa,MAClDrG,KAAaqF,gBAAkB,MAChCI,EAAce,OACdxG,KAAKyG,eAERC,MAAMC,IACHvH,EAAOwH,KAAK,uBAAwB,kCAAoCD,EAAK,eAC7E,GAAIjB,EAAcA,EAAaC,KAAK,iCACpCY,6BAAAvG,KAAkB,mBAAoB,KAAM,MAC3CA,KAAaqF,gBAAkB,MAChCI,EAAce,OACdxG,KAAKyG,iBAGjB,MACJ,CAGA,IAAII,EAAS3B,EACb,GAAI2B,UAAiBA,IAAW,UAAaA,EAAkBC,OAAO1B,WAAW,KAAM,CACnF,IACIyB,EAASE,KAAKC,MAAMH,EACxB,CAAE,MAAOI,GACL,CAER,CAEA,GAAIJ,UAAiBA,IAAW,SAAU,CACtC,MAAMV,EAAS3G,EAAsB4G,cAAcS,GACnD,GAAIV,EAAQ,CACRU,EAASV,EAAOG,MAAMO,GAEtBN,6BAAAvG,KAAkB,mBAAoB6G,EAAQ,KAClD,CACJ,CAEA,MAAMrF,EAAWxB,KAAKmF,YAAY,YAClC,MAAM7D,EAAOtB,KAAKmF,YAAY,QAE9B,IAAI+B,IAAcL,EAClB,GAAIK,UAAoBL,IAAW,UAAY7C,OAAOC,KAAK4C,GAAQM,SAAW,EAAG,CAC7ED,EAAY,KAChB,CAEA,MAAME,IAAY5F,KAAcF,EAEhClC,EAAOwE,MAAM,uBAAwB,+BAA+BsD,eAAuBE,IAAW,eAGtG,GAAIF,GAAaE,EAAS,CACtB,GAAIpH,KAAKmF,YAAY,aAAc,CAC/B/F,EAAOwE,MAAM,uBAAwB,kCAAkCsD,eAAuBE,IAAW,cAC7G,CAIApH,KAAKG,WAAa,IAAIlB,EAItB,MAAMoI,EAAQrH,KAAKsH,cAAcC,gBACjC,IAAK,MAAMC,KAAYH,EAAO,CAC1B,MAAMI,EAAGC,6BAAA1H,KAAqBwH,GAC9B,GAAIC,IAAQ,MAAQA,IAAQ7C,UAAW,CACnC5E,KAAKG,WAAWwH,YAAYH,EAAUC,EAC1C,CACJ,CAGAzH,KAAK4H,eAAe,WAAY5H,KAAKG,YAKrC,MAAMgC,EAASnC,KAAKsH,cAAcO,YAClC,IAAK,MAAMC,KAAa3F,EAAQ,CAC5BnC,KAAKG,WAAW4H,YAAYD,EAAYE,IAGpC,GAAIF,IAAc,UAAYA,IAAc,cAAe,CACvD,MAAMG,EAASD,EAAOE,gBACtB,GAAID,EAAO3F,QAAS,CAChB,MAAM6F,EAASnI,KAAKmF,YAAY,gBAAkB,KAClD,GAAI2C,IAAc,UAAYK,EAAQ,CAClC5B,6BAAAvG,KAAkB,OAAQiI,EAAO3F,QAAS,MAE1C,MAAM8F,EAAMH,EAAOvF,aAAeqE,KAAKsB,UAAUJ,EAAO3F,QAAS,KAAM,GACvEiE,6BAAAvG,KAAkB,WAAYoI,EAAK,KACvC,CACJ,CACA,GAAIN,IAAc,eAAiB9H,KAAKE,cAAe,CACnDF,KAAKE,cAAcoI,kBAAkBL,EAAOpF,UAAWoF,EAAOnF,MAClE,CACJ,CACA9C,KAAKuI,UAAUT,EAAWE,EAAOE,kBAEzC,CAEAlI,KAAKI,kBAAoB,IAC7B,CACJ,CACJ,EAOOuH,YAAW,SAAAa,EAACC,EAAsB3F,EAAgB4F,GACrD,GAAID,IAAiB,QAAUA,IAAiB,YAAcA,IAAiB,mBAAoB,CAC/F,GAAIzI,KAAKmF,YAAY,aAAc,CAC/B/F,EAAOwE,MAAM,uBAAwB,iCAAiC6E,IAAgB,cAC1F,CACJ,CACAlC,6BAAAvG,KAAkByI,EAAc3F,EAAO4F,GACvC,GAAI1I,KAAKG,WAAY,CACjBH,KAAKG,WAAWwH,YAAYc,EAAc3F,EAAO4F,EACrD,MAAO,GAAID,IAAiB,QAAUA,IAAiB,YAAcA,IAAiB,mBAAoB,CACtG,GAAIzI,KAAKmF,YAAY,aAAc,CAC/B/F,EAAOwE,MAAM,uBAAwB,uCAAuC6E,iDAA6D,cAC7I,CACJ,CACA,OAAOzI,IACX,EAgBO2I,aAAY,SAAAC,EAACC,EAAgBC,EAA2BC,EAA2BC,EAAsBC,GAC5G,IAAKjJ,KAAKG,WAAY,CAClBH,KAAKgF,mBACT,CACAhF,KAAKG,YAAYwI,aAAaE,EAAOC,EAAkBC,EAAkBC,EAAaC,EAC1F,EAQOC,cAAa,SAAAC,IAChB,IAAKnJ,KAAKG,WAAY,CAClB,OAAO,KACX,CACA,OAAOH,KAAKG,WAAW+I,eAC3B,EASOE,eAAc,SAAAC,EAACxG,EAAmBI,GACrC,GAAIjD,KAAKG,mBAAsBH,KAAKG,WAAmBiJ,iBAAmB,WAAY,CACjFpJ,KAAKG,WAAmBiJ,eAAevG,EAAWI,EACvD,CACJ,EAOOqG,iBAAgB,SAAAC,EAAC1G,GACpB,GAAI7C,KAAKG,mBAAsBH,KAAKG,WAAmBmJ,mBAAqB,WAAY,CACnFtJ,KAAKG,WAAmBmJ,iBAAiBzG,EAC9C,CACJ,EASOsC,YAAW,SAAAqE,EAACf,GACf,GAAIA,IAAiB,aAAc,CAC/BA,EAAe,MACnB,CACA,GAAIzI,KAAKG,aAAesI,IAAiB,QAAUA,IAAiB,YAAa,CAC7E,OAAOzI,KAAKG,WAAWgF,YAAYsD,EACvC,CACA,OAAAf,6BAAA1H,KAAyByI,EAC7B,IAAC,OApXgB/I,CAAW","ignoreList":[]}
@@ -4,6 +4,7 @@ import GeneratorHost from "./host/GeneratorHost";
4
4
  import { Logger } from "../utils/Logger";
5
5
  import { ODataDelegate } from "./host/delegates/ODataDelegate";
6
6
  import ODataV4Context from "sap/ui/model/odata/v4/Context";
7
+ import { SchemaBuilderRegistry } from "../core/SchemaBuilderRegistry";
7
8
 
8
9
  /**
9
10
  * A transparent wrapper control (Facade) that automatically chooses between Explicit Schema Mode
@@ -84,7 +85,7 @@ export default class DynamicHost extends Control {
84
85
  * @private
85
86
  */
86
87
  private _innerHost: GeneratorHost | null = null;
87
-
88
+
88
89
  /**
89
90
  * Flag indicating if the inner host has been initialized.
90
91
  * @private
@@ -171,7 +172,59 @@ export default class DynamicHost extends Control {
171
172
  this.initODataDelegate();
172
173
 
173
174
  if (!this._initializedInner) {
174
- const schema = this.getProperty("schemaDefinition");
175
+ let schemaRaw = this.getProperty("schemaDefinition");
176
+
177
+ // 1. URL Detection & Fetching
178
+ if (typeof schemaRaw === "string" && (schemaRaw.startsWith("http://") || schemaRaw.startsWith("https://"))) {
179
+ if ((this as any)._fetchingSchema) return; // Prevent re-entry
180
+ (this as any)._fetchingSchema = true;
181
+
182
+ sap.ui.require(["sap/ui/core/BusyIndicator", "sap/m/MessageToast"], (BusyIndicator: any, MessageToast: any) => {
183
+ BusyIndicator.show(0);
184
+ fetch(schemaRaw as string)
185
+ .then(res => {
186
+ if (!res.ok) throw new Error("HTTP " + res.status);
187
+ return res.json();
188
+ })
189
+ .then(json => {
190
+ const plugin = SchemaBuilderRegistry.getBuilderFor(json);
191
+ const finalSchema = plugin ? plugin.build(json) : json;
192
+ super.setProperty("schemaDefinition", finalSchema, true);
193
+ (this as any)._fetchingSchema = false;
194
+ BusyIndicator.hide();
195
+ this.invalidate(); // Force re-render with resolved schema
196
+ })
197
+ .catch(err => {
198
+ Logger.warn("[MetaUI DynamicHost]", "Failed to fetch remote schema: " + err, "DynamicHost");
199
+ if (MessageToast) MessageToast.show("Failed to fetch remote schema");
200
+ super.setProperty("schemaDefinition", null, true); // Fallback to full inference
201
+ (this as any)._fetchingSchema = false;
202
+ BusyIndicator.hide();
203
+ this.invalidate();
204
+ });
205
+ });
206
+ return; // Abort this render cycle until fetch completes
207
+ }
208
+
209
+ // 2. Local Plugin Detection (Stringified JSON or Raw Object)
210
+ let schema = schemaRaw;
211
+ if (schema && typeof schema === "string" && (schema as string).trim().startsWith("{")) {
212
+ try {
213
+ schema = JSON.parse(schema);
214
+ } catch (e) {
215
+ // Ignore, let standard validation catch it
216
+ }
217
+ }
218
+
219
+ if (schema && typeof schema === "object") {
220
+ const plugin = SchemaBuilderRegistry.getBuilderFor(schema);
221
+ if (plugin) {
222
+ schema = plugin.build(schema);
223
+ // Silently update the wrapper property so the inner host gets the final parsed MetaUI format
224
+ super.setProperty("schemaDefinition", schema, true);
225
+ }
226
+ }
227
+
175
228
  const dataJson = this.getProperty("dataJson");
176
229
  const data = this.getProperty("data");
177
230
 
@@ -179,7 +232,7 @@ export default class DynamicHost extends Control {
179
232
  if (hasSchema && typeof schema === "object" && Object.keys(schema).length === 0) {
180
233
  hasSchema = false; // Treat empty object as no schema
181
234
  }
182
-
235
+
183
236
  const hasData = !!dataJson || !!data;
184
237
 
185
238
  Logger.debug("[MetaUI DynamicHost]", `Evaluating boot. hasSchema: ${hasSchema}, hasData: ${hasData}`, "DynamicHost");
@@ -272,7 +325,7 @@ export default class DynamicHost extends Control {
272
325
  * @param {string} [title="Form"] The title of the dialog
273
326
  * @param {string} [submitButtonText="OK"] The text for the primary action button
274
327
  * @param {string} [cancelButtonText="Cancel"] The text for the cancel button
275
- * @param {string} [dialogWidth="800px"] The width of the dialog
328
+ * @param {string} [dialogWidth="auto"] The width of the dialog
276
329
  * @param {sap.ui.core.Control} [parentView] The parent view to attach the dialog to for model inheritance.
277
330
  */
278
331
  public openInDialog(title?: string, submitButtonText?: string, cancelButtonText?: string, dialogWidth?: string, parentView?: Control): void {
@@ -560,6 +560,10 @@ sap.ui.define(["sap/ui/core/Control", "../../utils/Logger", "../../core/SchemaNo
560
560
  this.validationDelegate.registerObject(this.generatedContent);
561
561
  const payload = this.stateManager.extractPayload();
562
562
  this.dataSyncDelegate.pushToBindings(payload);
563
+
564
+ // Retroactively expand the dialog if the heuristic determines it needs more space
565
+ const optimalWidth = this.calculateOptimalDialogWidth(this.parsedSchema);
566
+ this.dialogDelegate.updateDialogWidthDynamically(optimalWidth);
563
567
  } catch (error) {
564
568
  this.setBusy(false);
565
569
  const msg = "Fatal crash during layout generation: " + error.message;
@@ -572,12 +576,50 @@ sap.ui.define(["sap/ui/core/Control", "../../utils/Logger", "../../core/SchemaNo
572
576
  throw error; // Completely eliminate silent error swallowing
573
577
  }
574
578
  },
579
+ /**
580
+ * Helper to heuristically calculate optimal dialog width based on schema content.
581
+ */
582
+ calculateOptimalDialogWidth: function _calculateOptimalDialogWidth(schema) {
583
+ if (!schema) return "auto";
584
+ let requiresWideDialog = false;
585
+ const scanProperties = props => {
586
+ if (requiresWideDialog) return;
587
+ for (const key in props) {
588
+ const prop = props[key];
589
+ if (prop.type === "array") {
590
+ requiresWideDialog = true;
591
+ return;
592
+ }
593
+ if (prop.ui?.fullWidth === true) {
594
+ requiresWideDialog = true;
595
+ return;
596
+ }
597
+ if (prop.ui?.widget === "codeEditor" || prop.ui?.widget === "textArea" || prop.ui?.widget === "richText") {
598
+ requiresWideDialog = true;
599
+ return;
600
+ }
601
+ if (prop.properties) scanProperties(prop.properties);
602
+ if (prop.items && prop.items.properties) scanProperties(prop.items.properties);
603
+ }
604
+ };
605
+ if (schema.type === "array") return "80vw";
606
+ if (schema.properties) {
607
+ scanProperties(schema.properties);
608
+ }
609
+ return requiresWideDialog ? "80vw" : "auto";
610
+ },
575
611
  /**
576
612
  * Programmatic API. Re-parents the generated content into a dialog and opens it.
577
613
  */
578
- openInDialog: function _openInDialog(title = "Form", submitButtonText = "OK", cancelButtonText = "Cancel", dialogWidth = "800px", parentView) {
614
+ openInDialog: function _openInDialog(title = "Form", submitButtonText = "OK", cancelButtonText = "Cancel", dialogWidth = "auto", parentView) {
579
615
  const isGenerated = !!this.generatedContent;
580
- this.dialogDelegate.openInDialog(title, submitButtonText, isGenerated, cancelButtonText, dialogWidth, parentView);
616
+
617
+ // If we already have the schema parsed, we can calculate it instantly to prevent flicker
618
+ let finalWidth = dialogWidth;
619
+ if (finalWidth === "auto" && this.parsedSchema) {
620
+ finalWidth = this.calculateOptimalDialogWidth(this.parsedSchema);
621
+ }
622
+ this.dialogDelegate.openInDialog(title, submitButtonText, isGenerated, cancelButtonText, finalWidth, parentView);
581
623
  }
582
624
  });
583
625
  return GeneratorHost;