@acorex/platform 21.0.0-next.39 → 21.0.0-next.41

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 (59) hide show
  1. package/fesm2022/acorex-platform-common.mjs +6 -2
  2. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  3. package/fesm2022/acorex-platform-core.mjs +8 -1
  4. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  5. package/fesm2022/acorex-platform-domain.mjs +3 -0
  6. package/fesm2022/acorex-platform-domain.mjs.map +1 -1
  7. package/fesm2022/acorex-platform-layout-builder.mjs +137 -34
  8. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-layout-components.mjs +25 -13
  10. package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
  11. package/fesm2022/acorex-platform-layout-designer.mjs +261 -58
  12. package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
  13. package/fesm2022/acorex-platform-layout-entity.mjs +1583 -632
  14. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  15. package/fesm2022/acorex-platform-layout-widget-core.mjs +169 -85
  16. package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
  17. package/fesm2022/{acorex-platform-layout-widgets-repeater-widget-column.component-BGQqY5Mw.mjs → acorex-platform-layout-widgets-repeater-widget-column.component-BGO75IMz.mjs} +9 -4
  18. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-BGO75IMz.mjs.map +1 -0
  19. package/fesm2022/acorex-platform-layout-widgets.mjs +1053 -409
  20. package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
  21. package/fesm2022/acorex-platform-runtime.mjs +120 -9
  22. package/fesm2022/acorex-platform-runtime.mjs.map +1 -1
  23. package/fesm2022/{acorex-platform-themes-default-entity-master-create-view.component-Cvvr4HnL.mjs → acorex-platform-themes-default-entity-master-create-view.component-Cx1lLUaR.mjs} +3 -3
  24. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-Cx1lLUaR.mjs.map +1 -0
  25. package/fesm2022/{acorex-platform-themes-default-entity-master-modify-view.component-TYoLN1Jq.mjs → acorex-platform-themes-default-entity-master-modify-view.component-AOrcgjDF.mjs} +3 -3
  26. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-AOrcgjDF.mjs.map +1 -0
  27. package/fesm2022/{acorex-platform-themes-default-entity-master-single-view.component-C2z5Lq9y.mjs → acorex-platform-themes-default-entity-master-single-view.component-BfCeUU5F.mjs} +3 -3
  28. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-BfCeUU5F.mjs.map +1 -0
  29. package/fesm2022/acorex-platform-themes-default.mjs +10 -10
  30. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  31. package/fesm2022/{acorex-platform-themes-shared-settings.provider-DSs1o1M6.mjs → acorex-platform-themes-shared-settings.provider-D13QB3Hr.mjs} +2 -2
  32. package/fesm2022/acorex-platform-themes-shared-settings.provider-D13QB3Hr.mjs.map +1 -0
  33. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-D566Kdvy.mjs +94 -0
  34. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-D566Kdvy.mjs.map +1 -0
  35. package/fesm2022/{acorex-platform-themes-shared-theme-color-chooser-view.component-BSmvnUVq.mjs → acorex-platform-themes-shared-theme-color-chooser-view.component-D7-rCGl7.mjs} +38 -16
  36. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-D7-rCGl7.mjs.map +1 -0
  37. package/fesm2022/acorex-platform-themes-shared.mjs +183 -84
  38. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  39. package/fesm2022/acorex-platform-workflow.mjs +52 -11
  40. package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
  41. package/package.json +1 -1
  42. package/types/acorex-platform-common.d.ts +14 -10
  43. package/types/acorex-platform-core.d.ts +13 -2
  44. package/types/acorex-platform-domain.d.ts +28 -2
  45. package/types/acorex-platform-layout-builder.d.ts +61 -29
  46. package/types/acorex-platform-layout-designer.d.ts +88 -16
  47. package/types/acorex-platform-layout-entity.d.ts +190 -15
  48. package/types/acorex-platform-layout-widget-core.d.ts +81 -71
  49. package/types/acorex-platform-layout-widgets.d.ts +131 -54
  50. package/types/acorex-platform-runtime.d.ts +156 -61
  51. package/types/acorex-platform-workflow.d.ts +37 -2
  52. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-BGQqY5Mw.mjs.map +0 -1
  53. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-Cvvr4HnL.mjs.map +0 -1
  54. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-TYoLN1Jq.mjs.map +0 -1
  55. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-C2z5Lq9y.mjs.map +0 -1
  56. package/fesm2022/acorex-platform-themes-shared-settings.provider-DSs1o1M6.mjs.map +0 -1
  57. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-CHfrTtol.mjs +0 -65
  58. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-CHfrTtol.mjs.map +0 -1
  59. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-BSmvnUVq.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import * as i1$3 from '@acorex/platform/layout/widget-core';
2
- import { createStringProperty, AXPWidgetsCatalog, createBooleanProperty, createSelectProperty, createNumberProperty, cloneProperty, AXPWidgetCoreModule, AXPDataListWidgetComponent, AXPColumnWidgetComponent, AXPLayoutBaseWidgetComponent, AXPWidgetGroupEnum, AXP_WIDGETS_ACTION_CATEGORY, AXP_WIDGETS_AI_CATEGORY, AXP_WIDGETS_EDITOR_CATEGORY, AXPValueWidgetComponent, AXPWidgetStatus, AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_LAYOUT_CATEGORY, AXPWidgetRegistryService, AXPPropertyEditorHelper, AXPBlockBaseLayoutWidgetComponent, AXPFlexBaseLayoutWidgetComponent, AXPFlexItemBaseLayoutWidgetComponent, AXPTableBaseLayoutWidgetComponent, AXPTableItemBaseLayoutWidgetComponent, findNonEmptyBreakpoints, AXPGridItemBaseLayoutWidgetComponent, AXPGridBaseLayoutWidgetComponent, AXP_WIDGET_DEFINITION_PROVIDER, normalizeWidgetCategories, isWidgetAiCatalogIncluded } from '@acorex/platform/layout/widget-core';
2
+ import { createStringProperty, AXPWidgetsCatalog, createBooleanProperty, createSelectProperty, createNumberProperty, cloneProperty, AXPWidgetCoreModule, AXPDataListWidgetComponent, AXPColumnWidgetComponent, AXPLayoutBaseWidgetComponent, AXPWidgetGroupEnum, AXP_WIDGETS_ACTION_SUB_CONTROLS, AXP_WIDGETS_ACTION_CATEGORY, AXP_WIDGETS_EDITOR_CATEGORY, AXPValueWidgetComponent, AXP_WIDGETS_EDITOR_SUB_CHOICE, AXP_WIDGETS_EDITOR_SUB_VISUAL, AXP_WIDGETS_EDITOR_SUB_COMPOSITE, AXP_WIDGETS_EDITOR_SUB_DATETIME, AXP_WIDGETS_EDITOR_SUB_RICH, AXP_WIDGETS_EDITOR_SUB_TEXT_INPUTS, AXP_WIDGETS_EDITOR_SUB_NUMERIC, AXPWidgetStatus, AXP_WIDGETS_ADVANCE_SUB_MEDIA, AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_ADVANCE_SUB_INPUT, AXP_WIDGETS_LAYOUT_SUB_LISTS, AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_ADVANCE_SUB_DATA, AXP_WIDGETS_ADVANCE_SUB_TOOLS, AXP_WIDGETS_EDITOR_SUB_CONFIG, AXPWidgetRegistryService, AXPPropertyEditorHelper, AXP_WIDGETS_LAYOUT_SUB_GRID, AXPBlockBaseLayoutWidgetComponent, AXP_WIDGETS_LAYOUT_SUB_SURFACES, AXPFlexBaseLayoutWidgetComponent, AXPFlexItemBaseLayoutWidgetComponent, AXP_WIDGETS_LAYOUT_SUB_SHELL, AXPTableBaseLayoutWidgetComponent, AXPTableItemBaseLayoutWidgetComponent, findNonEmptyBreakpoints, AXPGridItemBaseLayoutWidgetComponent, AXP_WIDGETS_LAYOUT_SUB_UTILITY, AXPGridBaseLayoutWidgetComponent, AXP_WIDGETS_LAYOUT_SUB_TABS, AXP_WIDGET_DEFINITION_PROVIDER, normalizeDefinitionCategories } from '@acorex/platform/layout/widget-core';
3
3
  import { AX_STYLE_COLOR_TYPES, AX_STYLE_LOOK_TYPES, AXDataSource, convertArrayToDataSource } from '@acorex/cdk/common';
4
4
  import { AXActionSheetService } from '@acorex/components/action-sheet';
5
5
  import * as i1$2 from '@acorex/components/badge';
@@ -119,9 +119,12 @@ import { AXCronJobModule } from '@acorex/components/cron-job';
119
119
  import { AXTimeDurationFormatter, AXCalendarService } from '@acorex/core/date-time';
120
120
  import * as i3$6 from '@acorex/components/time-duration';
121
121
  import { AXTimeDurationModule } from '@acorex/components/time-duration';
122
+ import * as i4$1 from '@acorex/components/tooltip';
123
+ import { AXTooltipModule } from '@acorex/components/tooltip';
122
124
  import * as i1$l from '@acorex/components/alert';
123
125
  import { AXAlertModule } from '@acorex/components/alert';
124
126
  import { DomSanitizer } from '@angular/platform-browser';
127
+ import { AXP_ENTITY_DEFINITION_CRUD_SERVICE } from '@acorex/platform/domain';
125
128
 
126
129
  const AXP_STYLING_PROPERTY_GROUP = {
127
130
  name: 'styling',
@@ -1310,8 +1313,7 @@ class AXPSelectLanguagePopup extends AXBasePageComponent {
1310
1313
  if (this.showOtherLanguages() || !this.hasLanguagesBeyondProfiles()) {
1311
1314
  return list;
1312
1315
  }
1313
- return list.filter((l) => l.isLocaleProfile ||
1314
- this.hasTranslationContent(l.context?.value));
1316
+ return list.filter((l) => l.isLocaleProfile || this.hasTranslationContent(l.context?.value));
1315
1317
  }, ...(ngDevMode ? [{ debugName: "visibleLanguageList" }] : /* istanbul ignore next */ []));
1316
1318
  }
1317
1319
  //#region ---- Lifecycle ----
@@ -1326,6 +1328,7 @@ class AXPSelectLanguagePopup extends AXBasePageComponent {
1326
1328
  handleContextChanged(e, language) {
1327
1329
  language.context = e.data;
1328
1330
  }
1331
+ //TODO NEED TO FIX THOSE HAS NO PROFILE
1329
1332
  onShowOtherLanguagesChanged(event) {
1330
1333
  const next = !!event.value;
1331
1334
  this.showOtherLanguages.set(next);
@@ -1337,8 +1340,7 @@ class AXPSelectLanguagePopup extends AXBasePageComponent {
1337
1340
  if (!current) {
1338
1341
  return list;
1339
1342
  }
1340
- const staysVisible = current.isLocaleProfile ||
1341
- (!current.isLocaleProfile && this.hasTranslationContent(current.context?.value));
1343
+ const staysVisible = current.isLocaleProfile || (!current.isLocaleProfile && this.hasTranslationContent(current.context?.value));
1342
1344
  if (staysVisible) {
1343
1345
  return list;
1344
1346
  }
@@ -1375,7 +1377,9 @@ class AXPSelectLanguagePopup extends AXBasePageComponent {
1375
1377
  async onSaveButtonClick() {
1376
1378
  const merged = { ...this.values };
1377
1379
  this.languageList().forEach((item) => {
1378
- merged[item.code] = item.context.value;
1380
+ if (item.context.value) {
1381
+ merged[item.code] = item.context.value;
1382
+ }
1379
1383
  });
1380
1384
  this.close(merged);
1381
1385
  }
@@ -1984,11 +1988,11 @@ var buttonWidgetView_component = /*#__PURE__*/Object.freeze({
1984
1988
 
1985
1989
  const AXPButtonWidget = {
1986
1990
  name: 'button-action',
1987
- title: 'Button',
1988
- description: 'Triggers customizable actions',
1991
+ title: '@platform-layout-widgets:widgets.button-action.title',
1992
+ description: '@platform-layout-widgets:widgets.button-action.description',
1989
1993
  icon: 'fa-light fa-play',
1990
- categories: [AXP_WIDGETS_ACTION_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
1991
- aiDescription: 'Primary or secondary action button. Use when the answer should offer a clear next step (submit, navigate, run) with label and optional icon.',
1994
+ categories: [AXP_WIDGETS_ACTION_CATEGORY],
1995
+ subCategory: AXP_WIDGETS_ACTION_SUB_CONTROLS,
1992
1996
  groups: [AXPWidgetGroupEnum.FormElement],
1993
1997
  type: 'action',
1994
1998
  properties: [
@@ -2025,7 +2029,7 @@ const AXPConditionBuilderWidget = {
2025
2029
  description: 'Builds filter conditions (field/operator/value) with AND/OR groups',
2026
2030
  icon: 'fa-light fa-filter',
2027
2031
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
2028
- groups: [AXPWidgetGroupEnum.FormElement],
2032
+ groups: [AXPWidgetGroupEnum.BaseWidget],
2029
2033
  type: 'editor',
2030
2034
  properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY],
2031
2035
  components: {
@@ -2549,10 +2553,11 @@ var checkboxWidgetView_component = /*#__PURE__*/Object.freeze({
2549
2553
 
2550
2554
  const AXPCheckBoxWidget = {
2551
2555
  name: 'checkbox-editor',
2552
- title: 'Check Box',
2556
+ title: '@platform-layout-widgets:widgets.checkbox-editor.title',
2553
2557
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
2558
+ subCategory: AXP_WIDGETS_EDITOR_SUB_CHOICE,
2554
2559
  groups: [AXPWidgetGroupEnum.FormElement],
2555
- description: 'Selects multiple options via checkboxes',
2560
+ description: '@platform-layout-widgets:widgets.checkbox-editor.description',
2556
2561
  icon: 'fa-light fa-square-check',
2557
2562
  defaultFilterWidgetName: 'boolean-filter',
2558
2563
  type: 'editor',
@@ -2782,10 +2787,11 @@ var colorBoxWidgetView_component = /*#__PURE__*/Object.freeze({
2782
2787
 
2783
2788
  const AXPColorBoxWidget = {
2784
2789
  name: 'color-editor',
2785
- title: 'Color Box',
2786
- description: 'Picks and applies colors',
2790
+ title: '@platform-layout-widgets:widgets.color-editor.title',
2791
+ description: '@platform-layout-widgets:widgets.color-editor.description',
2787
2792
  icon: 'fa-light fa-palette',
2788
2793
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
2794
+ subCategory: AXP_WIDGETS_EDITOR_SUB_VISUAL,
2789
2795
  groups: [AXPWidgetGroupEnum.FormElement],
2790
2796
  type: 'editor',
2791
2797
  properties: [
@@ -3133,10 +3139,11 @@ var colorPaletteWidgetView_component = /*#__PURE__*/Object.freeze({
3133
3139
 
3134
3140
  const AXPColorPaletteWidget = {
3135
3141
  name: 'color-palette-editor',
3136
- title: 'Color Palette',
3137
- description: 'Selects colors from a predefined palette',
3142
+ title: '@platform-layout-widgets:widgets.color-palette-editor.title',
3143
+ description: '@platform-layout-widgets:widgets.color-palette-editor.description',
3138
3144
  icon: 'fa-light fa-swatchbook',
3139
3145
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
3146
+ subCategory: AXP_WIDGETS_EDITOR_SUB_VISUAL,
3140
3147
  groups: [AXPWidgetGroupEnum.FormElement],
3141
3148
  type: 'editor',
3142
3149
  properties: [
@@ -3362,10 +3369,11 @@ var connectedListsWidgetColumn_component = /*#__PURE__*/Object.freeze({
3362
3369
 
3363
3370
  const AXPConnectedDragDropListsWidget = {
3364
3371
  name: 'connected-lists-editor',
3365
- title: 'Connected Drag & Drop Lists',
3366
- description: 'Two connected lists with drag and drop transfer',
3372
+ title: '@platform-layout-widgets:widgets.connected-lists-editor.title',
3373
+ description: '@platform-layout-widgets:widgets.connected-lists-editor.description',
3367
3374
  icon: 'fa-light fa-arrow-right-arrow-left',
3368
3375
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
3376
+ subCategory: AXP_WIDGETS_EDITOR_SUB_CHOICE,
3369
3377
  groups: [AXPWidgetGroupEnum.UtilityWidget],
3370
3378
  properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY],
3371
3379
  type: 'editor',
@@ -4143,9 +4151,10 @@ var contactWidgetView_component = /*#__PURE__*/Object.freeze({
4143
4151
 
4144
4152
  const AXPContactWidget = {
4145
4153
  name: 'contact-editor',
4146
- title: 'Contact',
4147
- description: 'Inputs contact information',
4154
+ title: '@platform-layout-widgets:widgets.contact-editor.title',
4155
+ description: '@platform-layout-widgets:widgets.contact-editor.description',
4148
4156
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
4157
+ subCategory: AXP_WIDGETS_EDITOR_SUB_COMPOSITE,
4149
4158
  groups: [AXPWidgetGroupEnum.FormElement],
4150
4159
  icon: 'fa-light fa-address-book',
4151
4160
  defaultFilterWidgetName: 'string-filter',
@@ -4195,9 +4204,10 @@ const AXPContactWidget = {
4195
4204
 
4196
4205
  const AXPAddressWidget = {
4197
4206
  name: 'address-editor',
4198
- title: 'Address',
4199
- description: 'Inputs address information',
4207
+ title: '@platform-layout-widgets:widgets.address-editor.title',
4208
+ description: '@platform-layout-widgets:widgets.address-editor.description',
4200
4209
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
4210
+ subCategory: AXP_WIDGETS_EDITOR_SUB_COMPOSITE,
4201
4211
  groups: [AXPWidgetGroupEnum.FormElement],
4202
4212
  icon: 'fa-light fa-location-dot',
4203
4213
  defaultFilterWidgetName: 'string-filter',
@@ -5292,10 +5302,11 @@ var dateTimeBoxWidgetView_component = /*#__PURE__*/Object.freeze({
5292
5302
 
5293
5303
  const AXPDateTimeBoxWidget = {
5294
5304
  name: 'date-time-editor',
5295
- title: 'Date Time Box',
5296
- description: 'Selects date and time',
5305
+ title: '@platform-layout-widgets:widgets.date-time-editor.title',
5306
+ description: '@platform-layout-widgets:widgets.date-time-editor.description',
5297
5307
  icon: 'fa-light fa-calendar',
5298
5308
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
5309
+ subCategory: AXP_WIDGETS_EDITOR_SUB_DATETIME,
5299
5310
  groups: [AXPWidgetGroupEnum.FormElement],
5300
5311
  type: 'editor',
5301
5312
  defaultFilterWidgetName: 'datetime-filter',
@@ -5544,11 +5555,12 @@ var editorJsWidgetView_component = /*#__PURE__*/Object.freeze({
5544
5555
 
5545
5556
  const AXPEditorJsWidget = {
5546
5557
  name: 'editor-js-editor',
5547
- title: 'Editor Js',
5548
- description: 'Formats and edits text',
5558
+ title: '@platform-layout-widgets:widgets.editor-js-editor.title',
5559
+ description: '@platform-layout-widgets:widgets.editor-js-editor.description',
5549
5560
  icon: 'fa-light fa-input-text',
5550
5561
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
5551
- groups: [AXPWidgetGroupEnum.FormElement],
5562
+ subCategory: AXP_WIDGETS_EDITOR_SUB_RICH,
5563
+ groups: [AXPWidgetGroupEnum.BaseWidget],
5552
5564
  defaultFilterWidgetName: 'string-filter',
5553
5565
  type: 'editor',
5554
5566
  properties: [
@@ -5813,10 +5825,11 @@ var largeTextWidgetView_component = /*#__PURE__*/Object.freeze({
5813
5825
 
5814
5826
  const AXPLargeTextWidget = {
5815
5827
  name: 'large-text-editor',
5816
- title: 'Large Text Box',
5817
- description: 'Inputs long text entries',
5828
+ title: '@platform-layout-widgets:widgets.large-text-editor.title',
5829
+ description: '@platform-layout-widgets:widgets.large-text-editor.description',
5818
5830
  icon: 'fa-light fa-input-text',
5819
5831
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
5832
+ subCategory: AXP_WIDGETS_EDITOR_SUB_TEXT_INPUTS,
5820
5833
  groups: [AXPWidgetGroupEnum.FormElement],
5821
5834
  defaultFilterWidgetName: 'string-filter',
5822
5835
  type: 'editor',
@@ -5953,10 +5966,11 @@ var listWidgetColumn_component = /*#__PURE__*/Object.freeze({
5953
5966
 
5954
5967
  const AXPDragDropListWidget = {
5955
5968
  name: 'list-editor',
5956
- title: 'Drag & Drop List',
5957
- description: 'Reorderable list with drag and drop',
5969
+ title: '@platform-layout-widgets:widgets.list-editor.title',
5970
+ description: '@platform-layout-widgets:widgets.list-editor.description',
5958
5971
  icon: 'fa-light fa-list',
5959
5972
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
5973
+ subCategory: AXP_WIDGETS_EDITOR_SUB_CHOICE,
5960
5974
  groups: [AXPWidgetGroupEnum.FormElement],
5961
5975
  properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY],
5962
5976
  type: 'editor',
@@ -6232,10 +6246,11 @@ var numberBoxWidgetView_component = /*#__PURE__*/Object.freeze({
6232
6246
 
6233
6247
  const AXPNumberBoxWidget = {
6234
6248
  name: 'number-editor',
6235
- title: 'Number Box',
6236
- description: 'Inputs numeric values',
6249
+ title: '@platform-layout-widgets:widgets.number-editor.title',
6250
+ description: '@platform-layout-widgets:widgets.number-editor.description',
6237
6251
  icon: 'fa-light fa-input-numeric',
6238
6252
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
6253
+ subCategory: AXP_WIDGETS_EDITOR_SUB_NUMERIC,
6239
6254
  groups: [AXPWidgetGroupEnum.FormElement],
6240
6255
  type: 'editor',
6241
6256
  defaultFilterWidgetName: 'number-filter',
@@ -6481,10 +6496,11 @@ var passwordBoxWidgetView_component = /*#__PURE__*/Object.freeze({
6481
6496
 
6482
6497
  const AXPPasswordBoxWidget = {
6483
6498
  name: 'password-editor',
6484
- title: 'Password Box',
6485
- description: 'Secures password input',
6499
+ title: '@platform-layout-widgets:widgets.password-editor.title',
6500
+ description: '@platform-layout-widgets:widgets.password-editor.description',
6486
6501
  icon: 'fa-light fa-lock',
6487
6502
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
6503
+ subCategory: AXP_WIDGETS_EDITOR_SUB_TEXT_INPUTS,
6488
6504
  type: 'editor',
6489
6505
  properties: [
6490
6506
  AXP_NAME_PROPERTY,
@@ -6844,10 +6860,11 @@ var progressBarWidgetView_component = /*#__PURE__*/Object.freeze({
6844
6860
 
6845
6861
  const AXPProgressBarWidget = {
6846
6862
  name: 'progress-bar-editor',
6847
- title: 'Progress Bar',
6848
- description: 'Displays progress as a value out of a total with visual progress bar',
6863
+ title: '@platform-layout-widgets:widgets.progress-bar-editor.title',
6864
+ description: '@platform-layout-widgets:widgets.progress-bar-editor.description',
6849
6865
  icon: 'fa-light fa-chart-line-up',
6850
6866
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
6867
+ subCategory: AXP_WIDGETS_EDITOR_SUB_NUMERIC,
6851
6868
  groups: [AXPWidgetGroupEnum.FormElement],
6852
6869
  type: 'editor',
6853
6870
  properties: [
@@ -7061,10 +7078,11 @@ var ratePickerWidgetView_component = /*#__PURE__*/Object.freeze({
7061
7078
 
7062
7079
  const AXPRatePickerWidget = {
7063
7080
  name: 'rate-picker-editor',
7064
- title: 'Rate Picker',
7065
- description: 'Allows users to select a rating value',
7081
+ title: '@platform-layout-widgets:widgets.rate-picker-editor.title',
7082
+ description: '@platform-layout-widgets:widgets.rate-picker-editor.description',
7066
7083
  icon: 'fa-light fa-star',
7067
7084
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
7085
+ subCategory: AXP_WIDGETS_EDITOR_SUB_NUMERIC,
7068
7086
  groups: [AXPWidgetGroupEnum.FormElement],
7069
7087
  defaultFilterWidgetName: 'number-filter',
7070
7088
  type: 'editor',
@@ -7106,6 +7124,54 @@ const AXPRatePickerWidget = {
7106
7124
  },
7107
7125
  };
7108
7126
 
7127
+ /** Stable context path for rich-text preview dialogs (layout builder + context store). */
7128
+ const AXP_RICH_TEXT_DIALOG_BODY_PATH = '__axpRichTextDialogBody';
7129
+ /**
7130
+ * Turns camelCase / kebab-case property segments into Title Case words for fallback titles.
7131
+ */
7132
+ function humanizePropertyPath(path) {
7133
+ if (!path) {
7134
+ return '';
7135
+ }
7136
+ const spaced = path.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/[-_]/g, ' ');
7137
+ return spaced.replace(/\b\w/g, (c) => c.toUpperCase());
7138
+ }
7139
+ /**
7140
+ * Resolves dialog title: translated keys (`@...`), humanized identifiers, or plain captions.
7141
+ */
7142
+ async function resolveRichTextPreviewTitle(translation, caption, path) {
7143
+ const raw = caption?.trim() || path?.trim() || '';
7144
+ if (!raw) {
7145
+ return '';
7146
+ }
7147
+ if (raw.startsWith('@')) {
7148
+ return (await translation.translateAsync(raw)) ?? raw;
7149
+ }
7150
+ if (/^[a-z][a-zA-Z0-9]*$/.test(raw)) {
7151
+ return humanizePropertyPath(raw);
7152
+ }
7153
+ return raw;
7154
+ }
7155
+ /**
7156
+ * Approximate visible text length for rich HTML (decides inline vs truncated column cell).
7157
+ */
7158
+ function richTextPlainTextLength(html) {
7159
+ if (!html?.trim()) {
7160
+ return 0;
7161
+ }
7162
+ try {
7163
+ if (typeof DOMParser !== 'undefined') {
7164
+ const doc = new DOMParser().parseFromString(html, 'text/html');
7165
+ const text = doc.body.textContent?.replace(/\s+/g, ' ').trim() ?? '';
7166
+ return text.length;
7167
+ }
7168
+ }
7169
+ catch {
7170
+ /* ignore */
7171
+ }
7172
+ return html.replace(/<[^>]*>/g, ' ').replace(/\s+/g, ' ').trim().length;
7173
+ }
7174
+
7109
7175
  class AXPRichTextWidgetColumnComponent extends AXPColumnWidgetComponent {
7110
7176
  constructor() {
7111
7177
  super(...arguments);
@@ -7113,23 +7179,42 @@ class AXPRichTextWidgetColumnComponent extends AXPColumnWidgetComponent {
7113
7179
  this.layoutBuilder = inject(AXPLayoutBuilderService);
7114
7180
  this.mlResolver = inject(AXTranslationService);
7115
7181
  }
7182
+ /** Plain-text length threshold: above this, cell is clamped and clickable for full preview. */
7183
+ previewMaxChars() {
7184
+ const v = this.options['previewMaxChars'];
7185
+ return typeof v === 'number' && v > 0 ? v : 100;
7186
+ }
7187
+ /** Whether resolved HTML is long enough to warrant truncation + popup. */
7188
+ isTruncatedPreview(resolvedHtml) {
7189
+ return richTextPlainTextLength(resolvedHtml) > this.previewMaxChars();
7190
+ }
7191
+ onExpandClick(event) {
7192
+ event.nativeEvent.preventDefault();
7193
+ event.nativeEvent.stopPropagation();
7194
+ void this.openPopup();
7195
+ }
7116
7196
  async openPopup() {
7117
- const html = this.mlResolver.resolve(this.rawValue);
7197
+ const lang = this.mlResolver.getActiveLang();
7198
+ const resolvedHtml = this.mlResolver.resolve(this.rawValue, lang) ?? '';
7199
+ if (!this.isTruncatedPreview(resolvedHtml)) {
7200
+ return;
7201
+ }
7202
+ const title = await resolveRichTextPreviewTitle(this.mlResolver, this.columnCaption, this.path);
7118
7203
  const size = this.platform.is('Mobile') || this.platform.is('SM') ? 'full' : 'md';
7119
- const ref = await this.layoutBuilder
7204
+ await this.layoutBuilder
7120
7205
  .create()
7121
7206
  .dialog((dialog) => {
7122
7207
  dialog
7123
- .setTitle(this.path ?? '')
7208
+ .setTitle(title)
7124
7209
  .setSize(size)
7210
+ .setContext({ [AXP_RICH_TEXT_DIALOG_BODY_PATH]: resolvedHtml })
7125
7211
  .content((layoutBuilder) => {
7126
7212
  layoutBuilder.flex((flex) => {
7127
- flex.mode('view').formField('Content', (field) => {
7128
- field.readonly(true).customWidget('rich-text-editor', {
7129
- src: html,
7130
- toolbar: [],
7131
- height: 400,
7132
- });
7213
+ flex.mode('view').richText({
7214
+ path: AXP_RICH_TEXT_DIALOG_BODY_PATH,
7215
+ defaultValue: resolvedHtml,
7216
+ showFullContent: true,
7217
+ height: 400,
7133
7218
  });
7134
7219
  });
7135
7220
  })
@@ -7138,22 +7223,36 @@ class AXPRichTextWidgetColumnComponent extends AXPColumnWidgetComponent {
7138
7223
  });
7139
7224
  })
7140
7225
  .show();
7141
- ref.close();
7142
7226
  }
7143
7227
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPRichTextWidgetColumnComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
7144
7228
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPRichTextWidgetColumnComponent, isStandalone: true, selector: "axp-rich-text-widget-column", inputs: { rawValue: "rawValue", rowData: "rowData" }, usesInheritance: true, ngImport: i0, template: `
7145
7229
  @let html = rawValue | translate | async;
7230
+ @let expandHint = '@platform-layout-widgets:widgets.rich-text-editor.column-expand-title' | translate | async;
7146
7231
  @if (html) {
7147
- <span
7148
- class="ax-truncate ax-underline ax-block ax-w-full ax-cursor-pointer"
7149
- (click)="openPopup()"
7150
- [innerHTML]="html | safe: 'html'"
7151
- >
7152
- </span>
7232
+ @if (isTruncatedPreview(html)) {
7233
+ <div class="ax-flex ax-gap-1 ax-items-start ax-min-w-0 ax-max-w-full">
7234
+ <div
7235
+ class="ax-min-w-0 ax-flex-1 ax-line-clamp-3 ax-overflow-hidden ax-break-words"
7236
+ [innerHTML]="html | safe: 'html'"
7237
+ ></div>
7238
+ <ax-button
7239
+ class="ax-xs ax-shrink-0"
7240
+ look="blank"
7241
+ [iconOnly]="true"
7242
+ [text]="expandHint ?? ''"
7243
+ [title]="expandHint ?? ''"
7244
+ (onClick)="onExpandClick($event)"
7245
+ >
7246
+ <ax-icon icon="far fa-expand"></ax-icon>
7247
+ </ax-button>
7248
+ </div>
7249
+ } @else {
7250
+ <div class="ax-min-w-0 ax-max-w-full ax-break-words" [innerHTML]="html | safe: 'html'"></div>
7251
+ }
7153
7252
  } @else {
7154
7253
  <span class="ax-text-muted">---</span>
7155
7254
  }
7156
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: AXSafePipe, name: "safe" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
7255
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: AXSafePipe, name: "safe" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
7157
7256
  }
7158
7257
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPRichTextWidgetColumnComponent, decorators: [{
7159
7258
  type: Component,
@@ -7161,19 +7260,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7161
7260
  selector: 'axp-rich-text-widget-column',
7162
7261
  template: `
7163
7262
  @let html = rawValue | translate | async;
7263
+ @let expandHint = '@platform-layout-widgets:widgets.rich-text-editor.column-expand-title' | translate | async;
7164
7264
  @if (html) {
7165
- <span
7166
- class="ax-truncate ax-underline ax-block ax-w-full ax-cursor-pointer"
7167
- (click)="openPopup()"
7168
- [innerHTML]="html | safe: 'html'"
7169
- >
7170
- </span>
7265
+ @if (isTruncatedPreview(html)) {
7266
+ <div class="ax-flex ax-gap-1 ax-items-start ax-min-w-0 ax-max-w-full">
7267
+ <div
7268
+ class="ax-min-w-0 ax-flex-1 ax-line-clamp-3 ax-overflow-hidden ax-break-words"
7269
+ [innerHTML]="html | safe: 'html'"
7270
+ ></div>
7271
+ <ax-button
7272
+ class="ax-xs ax-shrink-0"
7273
+ look="blank"
7274
+ [iconOnly]="true"
7275
+ [text]="expandHint ?? ''"
7276
+ [title]="expandHint ?? ''"
7277
+ (onClick)="onExpandClick($event)"
7278
+ >
7279
+ <ax-icon icon="far fa-expand"></ax-icon>
7280
+ </ax-button>
7281
+ </div>
7282
+ } @else {
7283
+ <div class="ax-min-w-0 ax-max-w-full ax-break-words" [innerHTML]="html | safe: 'html'"></div>
7284
+ }
7171
7285
  } @else {
7172
7286
  <span class="ax-text-muted">---</span>
7173
7287
  }
7174
7288
  `,
7175
7289
  changeDetection: ChangeDetectionStrategy.OnPush,
7176
- imports: [AXSafePipe, AXTranslationModule, AsyncPipe],
7290
+ imports: [AXButtonModule, AXDecoratorModule, AXSafePipe, AXTranslationModule, AsyncPipe],
7177
7291
  inputs: ['rawValue', 'rowData'],
7178
7292
  }]
7179
7293
  }] });
@@ -7350,28 +7464,39 @@ class AXPRichTextWidgetViewComponent extends AXPValueWidgetComponent {
7350
7464
  this.platform = inject(AXPlatform);
7351
7465
  this.layoutBuilder = inject(AXPLayoutBuilderService);
7352
7466
  this.mlResolver = inject(AXTranslationService);
7353
- /** Resolved HTML for the preview dialog (same rules as the inline snippet). */
7467
+ this.currentLanguage = toSignal(this.mlResolver.langChanges$, {
7468
+ initialValue: this.mlResolver.getActiveLang(),
7469
+ });
7470
+ /** Resolved HTML for inline snippet and preview dialog. */
7354
7471
  this.displayHtml = computed(() => {
7355
7472
  const v = this.getValue();
7356
- return this.mlResolver.resolve(v);
7473
+ return this.mlResolver.resolve(v, this.currentLanguage());
7357
7474
  }, ...(ngDevMode ? [{ debugName: "displayHtml" }] : /* istanbul ignore next */ []));
7475
+ /** Full-body preview (dialogs) vs truncated grid snippet. */
7476
+ this.showFullContent = computed(() => this.options()['showFullContent'] === true, ...(ngDevMode ? [{ debugName: "showFullContent" }] : /* istanbul ignore next */ []));
7477
+ this.previewMaxHeightPx = computed(() => {
7478
+ const h = this.options()['height'];
7479
+ return h != null && h > 0 ? h : 400;
7480
+ }, ...(ngDevMode ? [{ debugName: "previewMaxHeightPx" }] : /* istanbul ignore next */ []));
7358
7481
  }
7359
7482
  async openPopup() {
7483
+ const resolvedHtml = this.displayHtml();
7484
+ const title = await resolveRichTextPreviewTitle(this.mlResolver, undefined, this.path);
7360
7485
  const size = this.platform.is('Mobile') || this.platform.is('SM') ? 'full' : 'md';
7361
- const ref = await this.layoutBuilder
7486
+ await this.layoutBuilder
7362
7487
  .create()
7363
7488
  .dialog((dialog) => {
7364
7489
  dialog
7365
- .setTitle(this.path ?? '')
7490
+ .setTitle(title)
7366
7491
  .setSize(size)
7492
+ .setContext({ [AXP_RICH_TEXT_DIALOG_BODY_PATH]: resolvedHtml })
7367
7493
  .content((layoutBuilder) => {
7368
7494
  layoutBuilder.flex((flex) => {
7369
- flex.mode('view').formField('Content', (field) => {
7370
- field.readonly(true).customWidget('rich-text-editor', {
7371
- src: this.displayHtml(),
7372
- toolbar: [],
7373
- height: 400,
7374
- });
7495
+ flex.mode('view').richText({
7496
+ path: AXP_RICH_TEXT_DIALOG_BODY_PATH,
7497
+ defaultValue: resolvedHtml,
7498
+ showFullContent: true,
7499
+ height: 400,
7375
7500
  });
7376
7501
  });
7377
7502
  })
@@ -7380,20 +7505,31 @@ class AXPRichTextWidgetViewComponent extends AXPValueWidgetComponent {
7380
7505
  });
7381
7506
  })
7382
7507
  .show();
7383
- ref.close();
7384
7508
  }
7385
7509
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPRichTextWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
7386
7510
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPRichTextWidgetViewComponent, isStandalone: true, selector: "axp-rich-text-widget-view", usesInheritance: true, ngImport: i0, template: `
7387
7511
  @let html = getValue() | translate | async;
7388
- @if (html) {
7389
- <span
7390
- class="ax-truncate ax-underline ax-cursor-pointer ax-text-muted"
7391
- (click)="openPopup()"
7392
- [innerHTML]="html | safe: 'html'"
7393
- >
7394
- </span>
7512
+ @if (showFullContent()) {
7513
+ @if (html) {
7514
+ <div
7515
+ class="ax-overflow-auto ax-min-h-0 ax-rich-text-widget-full-preview"
7516
+ [style.max-height.px]="previewMaxHeightPx()"
7517
+ [innerHTML]="html | safe: 'html'"
7518
+ ></div>
7519
+ } @else {
7520
+ <span class="ax-text-muted">---</span>
7521
+ }
7395
7522
  } @else {
7396
- <span class="ax-text-muted">---</span>
7523
+ @if (html) {
7524
+ <span
7525
+ class="ax-truncate ax-underline ax-block ax-w-full ax-cursor-pointer ax-text-muted"
7526
+ (click)="openPopup()"
7527
+ [innerHTML]="html | safe: 'html'"
7528
+ >
7529
+ </span>
7530
+ } @else {
7531
+ <span class="ax-text-muted">---</span>
7532
+ }
7397
7533
  }
7398
7534
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: AXSafePipe, name: "safe" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
7399
7535
  }
@@ -7403,15 +7539,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7403
7539
  selector: 'axp-rich-text-widget-view',
7404
7540
  template: `
7405
7541
  @let html = getValue() | translate | async;
7406
- @if (html) {
7407
- <span
7408
- class="ax-truncate ax-underline ax-cursor-pointer ax-text-muted"
7409
- (click)="openPopup()"
7410
- [innerHTML]="html | safe: 'html'"
7411
- >
7412
- </span>
7542
+ @if (showFullContent()) {
7543
+ @if (html) {
7544
+ <div
7545
+ class="ax-overflow-auto ax-min-h-0 ax-rich-text-widget-full-preview"
7546
+ [style.max-height.px]="previewMaxHeightPx()"
7547
+ [innerHTML]="html | safe: 'html'"
7548
+ ></div>
7549
+ } @else {
7550
+ <span class="ax-text-muted">---</span>
7551
+ }
7413
7552
  } @else {
7414
- <span class="ax-text-muted">---</span>
7553
+ @if (html) {
7554
+ <span
7555
+ class="ax-truncate ax-underline ax-block ax-w-full ax-cursor-pointer ax-text-muted"
7556
+ (click)="openPopup()"
7557
+ [innerHTML]="html | safe: 'html'"
7558
+ >
7559
+ </span>
7560
+ } @else {
7561
+ <span class="ax-text-muted">---</span>
7562
+ }
7415
7563
  }
7416
7564
  `,
7417
7565
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -7426,10 +7574,11 @@ var richTextWidgetView_component = /*#__PURE__*/Object.freeze({
7426
7574
 
7427
7575
  const AXPRichTextWidget = {
7428
7576
  name: 'rich-text-editor',
7429
- title: 'Rich Text',
7430
- description: 'Formats and edits rich text',
7577
+ title: '@platform-layout-widgets:widgets.rich-text-editor.title',
7578
+ description: '@platform-layout-widgets:widgets.rich-text-editor.description',
7431
7579
  icon: 'fa-light fa-input-text',
7432
7580
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
7581
+ subCategory: AXP_WIDGETS_EDITOR_SUB_RICH,
7433
7582
  groups: [AXPWidgetGroupEnum.FormElement],
7434
7583
  defaultFilterWidgetName: 'string-filter',
7435
7584
  type: 'editor',
@@ -7665,35 +7814,36 @@ class AXPSelectBoxWidgetEditComponent extends AXPDataListWidgetComponent {
7665
7814
  this.contextService.patch(itemToExpose, true);
7666
7815
  }
7667
7816
  //#endregion
7668
- //#region ---- Set Value Based on Mode ----
7669
- if (this.filterMode()) {
7670
- // Filter mode: set value with operation structure
7671
- const newValue = e.value;
7672
- const text = this.selectedItems().map((item) => get(item, this.textField()));
7673
- this.setValue({
7674
- value: newValue,
7675
- displayText: text,
7676
- operation: {
7677
- type: this.multiple() ? 'in' : 'equal',
7678
- },
7679
- });
7817
+ }
7818
+ //#region ---- Set Value Based on Mode ----
7819
+ // Apply strategy even when the value comes from outside (isUserInteraction=false).
7820
+ if (this.filterMode()) {
7821
+ // Filter mode: set value with operation structure
7822
+ const newValue = e.value;
7823
+ const text = this.selectedItems().map((item) => get(item, this.textField()));
7824
+ this.setValue({
7825
+ value: newValue,
7826
+ displayText: text,
7827
+ operation: {
7828
+ type: this.multiple() ? 'in' : 'equal',
7829
+ },
7830
+ });
7831
+ }
7832
+ else {
7833
+ // Normal mode: set value directly
7834
+ if (this.widgetsConfigs.selectValueStrategy === 'valueField') {
7835
+ this.setValue(e.value);
7680
7836
  }
7681
7837
  else {
7682
- // Normal mode: set value directly
7683
- if (this.widgetsConfigs.selectValueStrategy === 'valueField') {
7684
- this.setValue(e.value);
7838
+ if (this.multiple()) {
7839
+ this.setValue(this.selectedItems());
7685
7840
  }
7686
7841
  else {
7687
- if (this.multiple()) {
7688
- this.setValue(this.selectedItems());
7689
- }
7690
- else {
7691
- this.setValue(this.selectedItems()[0]);
7692
- }
7842
+ this.setValue(this.selectedItems()[0]);
7693
7843
  }
7694
7844
  }
7695
- //#endregion
7696
7845
  }
7846
+ //#endregion
7697
7847
  }
7698
7848
  handleSearchValueChange(e) {
7699
7849
  if (e.isUserInteraction) {
@@ -7907,10 +8057,11 @@ var selectBoxWidgetView_component = /*#__PURE__*/Object.freeze({
7907
8057
 
7908
8058
  const AXPSelectBoxWidget = {
7909
8059
  name: 'select-editor',
7910
- title: 'Select Box',
7911
- description: 'Chooses from dropdown options',
8060
+ title: '@platform-layout-widgets:widgets.select-editor.title',
8061
+ description: '@platform-layout-widgets:widgets.select-editor.description',
7912
8062
  icon: 'fa-light fa-list-dropdown',
7913
8063
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
8064
+ subCategory: AXP_WIDGETS_EDITOR_SUB_CHOICE,
7914
8065
  groups: [AXPWidgetGroupEnum.FormElement],
7915
8066
  defaultFilterWidgetName: 'select-filter',
7916
8067
  type: 'editor',
@@ -8264,10 +8415,11 @@ var selectionListWidgetView_component = /*#__PURE__*/Object.freeze({
8264
8415
 
8265
8416
  const AXPSelectionListWidget = {
8266
8417
  name: 'selection-list-editor',
8267
- title: 'Selection List',
8268
- description: 'Selects from a list',
8418
+ title: '@platform-layout-widgets:widgets.selection-list-editor.title',
8419
+ description: '@platform-layout-widgets:widgets.selection-list-editor.description',
8269
8420
  icon: 'fa-light fa-list-radio',
8270
8421
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
8422
+ subCategory: AXP_WIDGETS_EDITOR_SUB_CHOICE,
8271
8423
  groups: [AXPWidgetGroupEnum.FormElement],
8272
8424
  defaultFilterWidgetName: 'select-filter',
8273
8425
  properties: [
@@ -8757,10 +8909,11 @@ var tagEditorWidgetView_component = /*#__PURE__*/Object.freeze({
8757
8909
 
8758
8910
  const AXPTagEditorWidget = {
8759
8911
  name: 'tag-editor',
8760
- title: 'Tag Editor',
8912
+ title: '@platform-layout-widgets:widgets.tag-editor.title',
8761
8913
  icon: 'fa-light fa-tags',
8762
- description: 'Input and manage multiple tags',
8914
+ description: '@platform-layout-widgets:widgets.tag-editor.description',
8763
8915
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
8916
+ subCategory: AXP_WIDGETS_EDITOR_SUB_CHOICE,
8764
8917
  groups: [AXPWidgetGroupEnum.FormElement],
8765
8918
  type: 'editor',
8766
8919
  defaultFilterWidgetName: 'string-filter',
@@ -9144,10 +9297,11 @@ var templateBoxWidgetView_component = /*#__PURE__*/Object.freeze({
9144
9297
 
9145
9298
  const AXPTemplateBoxWidget = {
9146
9299
  name: 'template-box-editor',
9147
- title: 'Template Box',
9300
+ title: '@platform-layout-widgets:widgets.template-box-editor.title',
9148
9301
  icon: 'fa-light fa-file-alt',
9149
- description: 'Advanced template text editor with language support',
9302
+ description: '@platform-layout-widgets:widgets.template-box-editor.description',
9150
9303
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
9304
+ subCategory: AXP_WIDGETS_EDITOR_SUB_TEXT_INPUTS,
9151
9305
  type: 'editor',
9152
9306
  defaultFilterWidgetName: 'string-filter',
9153
9307
  properties: [
@@ -9420,10 +9574,11 @@ var textBoxWidgetView_component = /*#__PURE__*/Object.freeze({
9420
9574
 
9421
9575
  const AXPTextBoxWidget = {
9422
9576
  name: 'text-editor',
9423
- title: 'Text Box',
9577
+ title: '@platform-layout-widgets:widgets.text-editor.title',
9424
9578
  icon: 'fa-light fa-input-text',
9425
- description: 'Inputs single-line text',
9579
+ description: '@platform-layout-widgets:widgets.text-editor.description',
9426
9580
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
9581
+ subCategory: AXP_WIDGETS_EDITOR_SUB_TEXT_INPUTS,
9427
9582
  groups: [AXPWidgetGroupEnum.FormElement],
9428
9583
  type: 'editor',
9429
9584
  defaultFilterWidgetName: 'string-filter',
@@ -9765,11 +9920,12 @@ var toggleWidgetView_component = /*#__PURE__*/Object.freeze({
9765
9920
 
9766
9921
  const AXPToggleWidget = {
9767
9922
  name: 'toggle-editor',
9768
- title: 'Toggle',
9769
- description: 'Switches between on/off states',
9923
+ title: '@platform-layout-widgets:widgets.toggle-editor.title',
9924
+ description: '@platform-layout-widgets:widgets.toggle-editor.description',
9770
9925
  icon: 'fa-light fa-toggle-on',
9771
9926
  defaultFilterWidgetName: 'boolean-filter',
9772
9927
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
9928
+ subCategory: AXP_WIDGETS_EDITOR_SUB_CHOICE,
9773
9929
  groups: [AXPWidgetGroupEnum.FormElement],
9774
9930
  type: 'editor',
9775
9931
  properties: [
@@ -10342,11 +10498,11 @@ var avatarWidgetView_component = /*#__PURE__*/Object.freeze({
10342
10498
 
10343
10499
  const AXPAvatarWidget = {
10344
10500
  name: 'avatar',
10345
- title: 'Avatar',
10346
- description: 'Displays an avatar image based on a reference ID and type',
10501
+ title: '@platform-layout-widgets:widgets.avatar.title',
10502
+ description: '@platform-layout-widgets:widgets.avatar.description',
10347
10503
  icon: 'fa-light fa-image-user',
10348
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
10349
- aiDescription: 'User or entity avatar from a reference id/type. Use when the answer should show who or what something belongs to, not a full photo gallery.',
10504
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
10505
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
10350
10506
  groups: [AXPWidgetGroupEnum.EntityWidget],
10351
10507
  type: 'editor',
10352
10508
  properties: [
@@ -10583,11 +10739,11 @@ var codeEditorWidgetColumn_component = /*#__PURE__*/Object.freeze({
10583
10739
  //#region ---- Widget Config ----
10584
10740
  const AXPCodeEditorWidget = {
10585
10741
  name: 'code-editor',
10586
- title: 'Code Editor',
10587
- description: 'A code editor widget for editing code expressions and scripts',
10742
+ title: '@platform-layout-widgets:widgets.code-editor.title',
10743
+ description: '@platform-layout-widgets:widgets.code-editor.description',
10588
10744
  icon: 'fa-light fa-code',
10589
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
10590
- aiDescription: 'Syntax-highlighted code block. Use for snippets, scripts, or configs where line structure and language matter; bind source via data path or options.',
10745
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
10746
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_INPUT,
10591
10747
  groups: [AXPWidgetGroupEnum.FormElement],
10592
10748
  type: 'editor',
10593
10749
  properties: [
@@ -10896,11 +11052,11 @@ var dataListWidgetView_component = /*#__PURE__*/Object.freeze({
10896
11052
 
10897
11053
  const AXPDataListWidget = {
10898
11054
  name: 'data-list',
10899
- title: 'Data List',
10900
- description: 'Displays data in a list like table format with customizable columns',
11055
+ title: '@platform-layout-widgets:widgets.data-list.title',
11056
+ description: '@platform-layout-widgets:widgets.data-list.description',
10901
11057
  icon: 'fa-light fa-table',
10902
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
10903
- aiDescription: 'Use for tabular data: multiple rows with defined columns, paging, and optional row commands. Provide options.dataSource (rows) and options.columns.',
11058
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
11059
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_LISTS,
10904
11060
  groups: [AXPWidgetGroupEnum.FormElement],
10905
11061
  type: 'view',
10906
11062
  properties: [
@@ -12304,11 +12460,11 @@ var fileUploaderWidgetView_component = /*#__PURE__*/Object.freeze({
12304
12460
 
12305
12461
  const AXPFileUploaderWidget = {
12306
12462
  name: 'file-uploader',
12307
- title: 'File Uploader',
12308
- description: 'Uploads and manages files',
12463
+ title: '@platform-layout-widgets:widgets.file-uploader.title',
12464
+ description: '@platform-layout-widgets:widgets.file-uploader.description',
12309
12465
  icon: 'fa-light fa-files',
12310
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
12311
- aiDescription: 'Use when the answer involves file attachments: list, upload, or download. Prefer when the user references documents or media beyond inline text.',
12466
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
12467
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
12312
12468
  groups: ['form-element'],
12313
12469
  type: 'editor',
12314
12470
  properties: [
@@ -13035,11 +13191,11 @@ var galleryWidgetView_component = /*#__PURE__*/Object.freeze({
13035
13191
 
13036
13192
  const AXPGalleryWidget = {
13037
13193
  name: 'gallery',
13038
- title: 'Media Gallery',
13039
- description: 'Shows and edits image galleries',
13194
+ title: '@platform-layout-widgets:widgets.gallery.title',
13195
+ description: '@platform-layout-widgets:widgets.gallery.description',
13040
13196
  icon: 'fa-light fa-images',
13041
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
13042
- aiDescription: 'Image gallery with thumbnails and optional fullscreen. Use for multiple images or a carousel-like browse experience (not a single static image).',
13197
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
13198
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
13043
13199
  groups: [AXPWidgetGroupEnum.FormElement],
13044
13200
  properties: [
13045
13201
  AXP_NAME_PROPERTY,
@@ -13516,13 +13672,12 @@ var imageMarkerWidgetView_component = /*#__PURE__*/Object.freeze({
13516
13672
 
13517
13673
  const AXPImageMarkerWidget = {
13518
13674
  name: 'image-marker',
13519
- title: 'Image Marker',
13520
- description: 'Image Marker Widget to add markers to an image',
13675
+ title: '@platform-layout-widgets:widgets.image-marker.title',
13676
+ description: '@platform-layout-widgets:widgets.image-marker.description',
13521
13677
  icon: 'fa-light fa-map-marker-alt',
13522
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
13523
- aiDescription: 'Use when highlighting points or regions on a base image (annotations, hotspots). Provide base image plus marker coordinates or overlays in options.',
13678
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
13679
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
13524
13680
  groups: [AXPWidgetGroupEnum.FormElement],
13525
- aiCatalog: 'include',
13526
13681
  type: 'editor',
13527
13682
  properties: [
13528
13683
  AXP_NAME_PROPERTY,
@@ -13686,12 +13841,12 @@ var jsonViewerWidgetEdit_component = /*#__PURE__*/Object.freeze({
13686
13841
  //#region ---- Widget Config ----
13687
13842
  const AXPJsonViewerWidget = {
13688
13843
  name: 'json-viewer',
13689
- title: 'JSON Viewer',
13690
- description: 'Displays JSON data in a formatted, collapsible tree view',
13844
+ title: '@platform-layout-widgets:widgets.json-viewer.title',
13845
+ description: '@platform-layout-widgets:widgets.json-viewer.description',
13691
13846
  icon: 'fa-light fa-code',
13692
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
13693
- aiDescription: 'Shows JSON as an expandable tree. Prefer when the payload is structured data (objects/arrays) and hierarchy matters more than plain text.',
13694
- groups: [AXPWidgetGroupEnum.FormElement],
13847
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
13848
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_DATA,
13849
+ groups: [AXPWidgetGroupEnum.BaseWidget],
13695
13850
  type: 'editor',
13696
13851
  properties: [
13697
13852
  AXP_NAME_PROPERTY,
@@ -14154,11 +14309,11 @@ var qrcodeWidgetView_component = /*#__PURE__*/Object.freeze({
14154
14309
 
14155
14310
  const AXPQrcodeWidget = {
14156
14311
  name: 'qrcode',
14157
- title: 'QR Code',
14158
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
14312
+ title: '@platform-layout-widgets:widgets.qrcode.title',
14313
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
14314
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
14159
14315
  icon: 'fa-light fa-qrcode',
14160
- description: 'Display and edit QR Codes',
14161
- aiDescription: 'Renders a scannable QR code from text or URL (options.content). Use when the user should open a link or payload on a phone.',
14316
+ description: '@platform-layout-widgets:widgets.qrcode.description',
14162
14317
  type: 'view',
14163
14318
  properties: [
14164
14319
  AXP_NAME_PROPERTY,
@@ -14447,10 +14602,10 @@ var schedulerPickerWidgetView_component = /*#__PURE__*/Object.freeze({
14447
14602
 
14448
14603
  const AXPSchedulerPickerWidget = {
14449
14604
  name: 'scheduler-picker',
14450
- title: 'Scheduler Picker',
14605
+ title: '@platform-layout-widgets:widgets.scheduler-picker.title',
14451
14606
  icon: 'fa-light fa-calendar-clock',
14452
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
14453
- aiDescription: 'Schedule or calendar picker. Use when the user selects dates, times, or recurring slots; bind value via data path.',
14607
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
14608
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_INPUT,
14454
14609
  type: 'editor',
14455
14610
  groups: [AXPWidgetGroupEnum.FormElement],
14456
14611
  properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY],
@@ -14786,11 +14941,11 @@ var signaturePadWidgetView_component = /*#__PURE__*/Object.freeze({
14786
14941
 
14787
14942
  const AXPSignatureWidget = {
14788
14943
  name: 'signature',
14789
- title: 'Signature',
14790
- description: 'Captures digital signatures',
14944
+ title: '@platform-layout-widgets:widgets.signature.title',
14945
+ description: '@platform-layout-widgets:widgets.signature.description',
14791
14946
  icon: 'fa-light fa-file-signature',
14792
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
14793
- aiDescription: 'Digital signature capture or display. Use when consent, approval, or handwritten input is required instead of typed text.',
14947
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
14948
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_INPUT,
14794
14949
  type: 'editor',
14795
14950
  properties: [
14796
14951
  AXP_NAME_PROPERTY,
@@ -14873,6 +15028,8 @@ class AXPStatusChipComponent {
14873
15028
  this.isPopoverOpen = signal(false, ...(ngDevMode ? [{ debugName: "isPopoverOpen" }] : /* istanbul ignore next */ []));
14874
15029
  this.isUpdating = signal(false, ...(ngDevMode ? [{ debugName: "isUpdating" }] : /* istanbul ignore next */ []));
14875
15030
  this.providerSignal = signal(undefined, ...(ngDevMode ? [{ debugName: "providerSignal" }] : /* istanbul ignore next */ []));
15031
+ /** Native tooltip from translated `AXPStatusDefinition.description` (i18n key). */
15032
+ this.chipTooltip = signal(null, ...(ngDevMode ? [{ debugName: "chipTooltip" }] : /* istanbul ignore next */ []));
14876
15033
  //#endregion
14877
15034
  //#region ---- Computed Properties ----
14878
15035
  this.statuses = computed(() => this.providerSignal()?.statuses ?? [], ...(ngDevMode ? [{ debugName: "statuses" }] : /* istanbul ignore next */ []));
@@ -14912,15 +15069,9 @@ class AXPStatusChipComponent {
14912
15069
  if (!Array.isArray(statuses) || statuses.length === 0) {
14913
15070
  return [];
14914
15071
  }
14915
- // If no transitions defined, show all other statuses as available options
15072
+ // No declared transitions: executeTransition() rejects every path do not offer fake targets
14916
15073
  if (!Array.isArray(transitions) || transitions.length === 0) {
14917
- return statuses
14918
- .filter((s) => s.name !== currentStatus.name)
14919
- .map((s) => ({
14920
- from: currentStatus.name,
14921
- to: s.name,
14922
- toStatus: s,
14923
- }));
15074
+ return [];
14924
15075
  }
14925
15076
  // Filter transitions that start from current status
14926
15077
  const availableTransitions = transitions.filter((t) => t.from === currentStatus.name);
@@ -14956,6 +15107,18 @@ class AXPStatusChipComponent {
14956
15107
  this.providerSignal.set(provider);
14957
15108
  });
14958
15109
  }, ...(ngDevMode ? [{ debugName: "loadProvider" }] : /* istanbul ignore next */ []));
15110
+ this.syncDescriptionTooltip = effect(() => {
15111
+ const def = this.currentStatus();
15112
+ const descKey = def?.description;
15113
+ if (!descKey) {
15114
+ untracked(() => this.chipTooltip.set(null));
15115
+ return;
15116
+ }
15117
+ void this.translationService
15118
+ .translateAsync(descKey)
15119
+ .then((t) => untracked(() => this.chipTooltip.set(t || null)))
15120
+ .catch(() => untracked(() => this.chipTooltip.set(null)));
15121
+ }, ...(ngDevMode ? [{ debugName: "syncDescriptionTooltip" }] : /* istanbul ignore next */ []));
14959
15122
  }
14960
15123
  //#endregion
14961
15124
  //#region ---- Public Methods ----
@@ -15054,8 +15217,12 @@ class AXPStatusChipComponent {
15054
15217
  [class.ax-cursor-pointer]="hasTransitions"
15055
15218
  [class.ax-cursor-default]="!hasTransitions"
15056
15219
  (click)="hasTransitions && openPopover()"
15220
+ [attr.title]="chipTooltip() ?? null"
15057
15221
  #chipElement
15058
15222
  >
15223
+ @if (currentStatusDef.icon) {
15224
+ <i [class]="currentStatusDef.icon + ' ax-text-[0.85em] ax-opacity-90'"></i>
15225
+ }
15059
15226
  <span>{{ currentStatusDef.title | translate | async }}</span>
15060
15227
  @if (hasTransitions) {
15061
15228
  <i class="fa-light fa-chevron-down ax-text-xs"></i>
@@ -15122,8 +15289,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
15122
15289
  [class.ax-cursor-pointer]="hasTransitions"
15123
15290
  [class.ax-cursor-default]="!hasTransitions"
15124
15291
  (click)="hasTransitions && openPopover()"
15292
+ [attr.title]="chipTooltip() ?? null"
15125
15293
  #chipElement
15126
15294
  >
15295
+ @if (currentStatusDef.icon) {
15296
+ <i [class]="currentStatusDef.icon + ' ax-text-[0.85em] ax-opacity-90'"></i>
15297
+ }
15127
15298
  <span>{{ currentStatusDef.title | translate | async }}</span>
15128
15299
  @if (hasTransitions) {
15129
15300
  <i class="fa-light fa-chevron-down ax-text-xs"></i>
@@ -15217,7 +15388,17 @@ class AXPStatusWidgetColumnComponent extends AXPColumnWidgetComponent {
15217
15388
  */
15218
15389
  this.columnReadonly = computed(() => !!this.options['readonly'], ...(ngDevMode ? [{ debugName: "columnReadonly" }] : /* istanbul ignore next */ []));
15219
15390
  this.entityData = computed(() => {
15220
- return this.rowDataSignal();
15391
+ const row = this.rowDataSignal();
15392
+ if (!row || typeof row !== 'object') {
15393
+ return null;
15394
+ }
15395
+ const entityKey = this.options['entity'];
15396
+ const fieldName = this.options['fieldName'];
15397
+ return {
15398
+ ...row,
15399
+ ...(entityKey ? { entity: entityKey, entityName: entityKey } : {}),
15400
+ ...(fieldName ? { statusField: fieldName } : {}),
15401
+ };
15221
15402
  }, ...(ngDevMode ? [{ debugName: "entityData" }] : /* istanbul ignore next */ []));
15222
15403
  this.resolvedStatuses = computed(() => {
15223
15404
  return this.providerSignal()?.statuses ?? [];
@@ -15257,15 +15438,9 @@ class AXPStatusWidgetColumnComponent extends AXPColumnWidgetComponent {
15257
15438
  if (!Array.isArray(statuses) || statuses.length === 0) {
15258
15439
  return [];
15259
15440
  }
15260
- // If no transitions defined, show all other statuses as available options
15441
+ // No declared transitions: executeTransition() rejects every path do not offer fake targets
15261
15442
  if (!Array.isArray(transitions) || transitions.length === 0) {
15262
- return statuses
15263
- .filter((s) => s.name !== currentStatus.name)
15264
- .map((status) => ({
15265
- from: currentStatus.name,
15266
- to: status.name,
15267
- toStatus: status,
15268
- }));
15443
+ return [];
15269
15444
  }
15270
15445
  // Filter transitions that start from current status
15271
15446
  const availableTransitions = transitions.filter((t) => t.from === currentStatus.name);
@@ -15460,15 +15635,9 @@ class AXPStatusWidgetEditComponent extends AXPValueWidgetComponent {
15460
15635
  if (!Array.isArray(statuses) || statuses.length === 0) {
15461
15636
  return [];
15462
15637
  }
15463
- // If no transitions defined, show all other statuses as available options
15638
+ // No declared transitions: executeTransition() rejects every path do not offer fake targets
15464
15639
  if (!Array.isArray(transitions) || transitions.length === 0) {
15465
- return statuses
15466
- .filter((s) => s.name !== currentStatus.name)
15467
- .map((status) => ({
15468
- from: currentStatus.name,
15469
- to: status.name,
15470
- toStatus: status,
15471
- }));
15640
+ return [];
15472
15641
  }
15473
15642
  // Filter transitions that start from current status
15474
15643
  const availableTransitions = transitions.filter((t) => t.from === currentStatus.name);
@@ -15508,13 +15677,35 @@ class AXPStatusWidgetEditComponent extends AXPValueWidgetComponent {
15508
15677
  // Could show a toast notification here if needed
15509
15678
  }
15510
15679
  /**
15511
- * Get entity data for command execution context
15680
+ * Build context for default `Entity:UpdateStatus` (entity key, record id, status field path).
15512
15681
  */
15513
15682
  getEntityData() {
15514
- // Return current entity data if available
15515
- // This could be enhanced to get full entity context
15516
- const value = this.getValue();
15517
- return value ? { value } : null;
15683
+ const opts = this.options();
15684
+ const entityKey = (opts['entityName'] ?? opts['entity']);
15685
+ const statusField = (opts['statusField'] ?? opts['fieldName'] ?? this.path);
15686
+ const parentPath = this.parentPath();
15687
+ const idPathCandidates = [
15688
+ parentPath ? `${parentPath}.id` : null,
15689
+ 'id',
15690
+ parentPath ? `${parentPath}._id` : null,
15691
+ '_id',
15692
+ ].filter((p) => !!p);
15693
+ let id;
15694
+ for (const p of idPathCandidates) {
15695
+ id = this.contextService.getValue(p);
15696
+ if (id != null && String(id).length > 0) {
15697
+ break;
15698
+ }
15699
+ }
15700
+ if (!entityKey || id == null || String(id).length === 0) {
15701
+ return null;
15702
+ }
15703
+ return {
15704
+ entity: entityKey,
15705
+ entityName: entityKey,
15706
+ statusField: statusField ?? 'statusId',
15707
+ id: String(id),
15708
+ };
15518
15709
  }
15519
15710
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPStatusWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
15520
15711
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.9", type: AXPStatusWidgetEditComponent, isStandalone: true, selector: "axp-status-widget-edit", viewQueries: [{ propertyName: "statusChip", first: true, predicate: AXPStatusChipComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
@@ -15630,15 +15821,9 @@ class AXPStatusWidgetViewComponent extends AXPDataListWidgetComponent {
15630
15821
  if (!Array.isArray(statuses) || statuses.length === 0) {
15631
15822
  return [];
15632
15823
  }
15633
- // If no transitions defined, show all other statuses as available options
15824
+ // No declared transitions: executeTransition() rejects every path do not offer fake targets
15634
15825
  if (!Array.isArray(transitions) || transitions.length === 0) {
15635
- return statuses
15636
- .filter((s) => s.name !== currentStatus.name)
15637
- .map((status) => ({
15638
- from: currentStatus.name,
15639
- to: status.name,
15640
- toStatus: status,
15641
- }));
15826
+ return [];
15642
15827
  }
15643
15828
  // Filter transitions that start from current status
15644
15829
  const availableTransitions = transitions.filter((t) => t.from === currentStatus.name);
@@ -15731,11 +15916,11 @@ var statusWidgetView_component = /*#__PURE__*/Object.freeze({
15731
15916
 
15732
15917
  const AXPStatusWidget = {
15733
15918
  name: 'status-widget',
15734
- title: 'Status Widget',
15735
- description: 'Displays and manages entity status with visual indicators',
15919
+ title: '@platform-layout-widgets:widgets.status-widget.title',
15920
+ description: '@platform-layout-widgets:widgets.status-widget.description',
15736
15921
  icon: 'fa-light fa-circle-check',
15737
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
15738
- aiDescription: 'Visual status chip or badge for entity/state. Use when the answer should highlight a single workflow or lifecycle state (e.g. open, approved).',
15922
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
15923
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_DATA,
15739
15924
  groups: [AXPWidgetGroupEnum.EntityWidget],
15740
15925
  defaultFilterWidgetName: 'status-filter',
15741
15926
  type: 'editor',
@@ -15767,11 +15952,11 @@ const AXPStatusWidget = {
15767
15952
  //#region ---- Widget Config ----
15768
15953
  const AXPStopwatchWidget = {
15769
15954
  name: 'stopwatch',
15770
- title: 'Stopwatch',
15771
- description: 'A stopwatch widget that can count up or count down from a time limit',
15955
+ title: '@platform-layout-widgets:widgets.stopwatch.title',
15956
+ description: '@platform-layout-widgets:widgets.stopwatch.description',
15772
15957
  icon: 'fa-light fa-stopwatch',
15773
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
15774
- aiDescription: 'Live stopwatch or countdown. Use when the answer involves elapsed time, deadlines, or timed steps; configure mode (count-up vs count-down) in options.',
15958
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
15959
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_TOOLS,
15775
15960
  groups: [AXPWidgetGroupEnum.UtilityWidget],
15776
15961
  type: 'view',
15777
15962
  properties: [
@@ -15951,10 +16136,11 @@ var stopwatchWidgetView_component = /*#__PURE__*/Object.freeze({
15951
16136
 
15952
16137
  const AXPWidgetFieldConfiguratorWidget = {
15953
16138
  name: 'widget-field-configurator',
15954
- title: 'Widget Field Configurator',
15955
- icon: 'fa-solid fa-puzzle-piece',
15956
- description: 'Configure widget type and options for a single field',
16139
+ title: '@platform-layout-widgets:widgets.widget-field-configurator.title',
16140
+ icon: 'fa-light fa-puzzle-piece',
16141
+ description: '@platform-layout-widgets:widgets.widget-field-configurator.description',
15957
16142
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
16143
+ subCategory: AXP_WIDGETS_EDITOR_SUB_CONFIG,
15958
16144
  groups: [AXPWidgetGroupEnum.UtilityWidget],
15959
16145
  type: 'editor',
15960
16146
  defaultFilterWidgetName: 'string-filter',
@@ -16171,12 +16357,12 @@ class AXPWidgetFieldConfiguratorWidgetColumnComponent extends AXPColumnWidgetCom
16171
16357
  @if (widget()) {
16172
16358
  <i [class]="widget()?.icon" class="fa-fw"></i>&nbsp;
16173
16359
  <span [title]="widget()?.title" class="ax-text-xs ax-font-medium">
16174
- {{ widget()?.title }}
16360
+ {{ widget()?.title | translate | async }}
16175
16361
  </span>
16176
16362
  } @else {
16177
16363
  <span class="ax-text-muted">---</span>
16178
16364
  }
16179
- `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
16365
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
16180
16366
  }
16181
16367
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetFieldConfiguratorWidgetColumnComponent, decorators: [{
16182
16368
  type: Component,
@@ -16186,14 +16372,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
16186
16372
  @if (widget()) {
16187
16373
  <i [class]="widget()?.icon" class="fa-fw"></i>&nbsp;
16188
16374
  <span [title]="widget()?.title" class="ax-text-xs ax-font-medium">
16189
- {{ widget()?.title }}
16375
+ {{ widget()?.title | translate | async }}
16190
16376
  </span>
16191
16377
  } @else {
16192
16378
  <span class="ax-text-muted">---</span>
16193
16379
  }
16194
16380
  `,
16195
16381
  changeDetection: ChangeDetectionStrategy.OnPush,
16196
- imports: [],
16382
+ imports: [AXTranslationModule, AsyncPipe],
16197
16383
  inputs: ['rawValue', 'rowData'],
16198
16384
  }]
16199
16385
  }] });
@@ -16205,10 +16391,11 @@ var widgetFieldConfiguratorWidgetColumn_component = /*#__PURE__*/Object.freeze({
16205
16391
 
16206
16392
  const AXPItemConfiguratorWidget = {
16207
16393
  name: 'item-configurator',
16208
- title: 'Item Configurator',
16209
- icon: 'fa-solid fa-sliders',
16210
- description: 'Select an item and edit settings via the generic property viewer; the form value remains a widget node (type + options) for compatibility.',
16394
+ title: '@platform-layout-widgets:widgets.item-configurator.title',
16395
+ icon: 'fa-light fa-sliders',
16396
+ description: '@platform-layout-widgets:widgets.item-configurator.description',
16211
16397
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
16398
+ subCategory: AXP_WIDGETS_EDITOR_SUB_CONFIG,
16212
16399
  groups: [AXPWidgetGroupEnum.UtilityWidget],
16213
16400
  type: 'editor',
16214
16401
  defaultFilterWidgetName: 'string-filter',
@@ -16382,7 +16569,7 @@ function mapDelegatedParameterDefinitionsToWidgetProperties(defs) {
16382
16569
  const p = createStringProperty({
16383
16570
  name: d.name,
16384
16571
  title: (d.title?.trim() || d.name),
16385
- path: d.name,
16572
+ path: `options.${d.name}`,
16386
16573
  group,
16387
16574
  visible: true,
16388
16575
  defaultValue: defaultStr,
@@ -17204,9 +17391,10 @@ var advancedGridWidgetView_component = /*#__PURE__*/Object.freeze({
17204
17391
 
17205
17392
  const AXPAdvancedGridWidget = {
17206
17393
  name: 'advanced-grid-layout',
17207
- title: 'Advanced Grid Layout',
17394
+ title: '@platform-layout-widgets:widgets.advanced-grid-layout.title',
17208
17395
  type: 'container',
17209
17396
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
17397
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
17210
17398
  icon: 'fa-light fa-grid-2',
17211
17399
  properties: [
17212
17400
  AXP_NAME_PROPERTY,
@@ -17444,9 +17632,10 @@ var advancedGridItemWidgetView_component = /*#__PURE__*/Object.freeze({
17444
17632
 
17445
17633
  const AXPAdvancedGridItemWidget = {
17446
17634
  name: 'advanced-grid-item-layout',
17447
- title: 'Advanced Grid Item',
17635
+ title: '@platform-layout-widgets:widgets.advanced-grid-item-layout.title',
17448
17636
  type: 'container',
17449
17637
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
17638
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
17450
17639
  icon: 'fa-light fa-objects-column',
17451
17640
  properties: [
17452
17641
  AXP_NAME_PROPERTY,
@@ -17589,10 +17778,11 @@ var blockWidgetView_component = /*#__PURE__*/Object.freeze({
17589
17778
  const AXPBlockWidget = {
17590
17779
  name: 'block-layout',
17591
17780
  type: 'container',
17592
- title: 'Block Layout',
17593
- description: 'Organizes content in blocks',
17781
+ title: '@platform-layout-widgets:widgets.block-layout.title',
17782
+ description: '@platform-layout-widgets:widgets.block-layout.description',
17594
17783
  icon: 'fa-light fa-block',
17595
17784
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
17785
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
17596
17786
  groups: [AXPWidgetGroupEnum.FormElement],
17597
17787
  options: {
17598
17788
  canInsert: true,
@@ -17765,10 +17955,11 @@ var fieldsetWidgetView_component = /*#__PURE__*/Object.freeze({
17765
17955
  const AXPFieldsetWidget = {
17766
17956
  name: 'fieldset-layout',
17767
17957
  type: 'container',
17768
- title: 'Fieldset',
17769
- description: 'Organizes content in a fieldset container',
17958
+ title: '@platform-layout-widgets:widgets.fieldset-layout.title',
17959
+ description: '@platform-layout-widgets:widgets.fieldset-layout.description',
17770
17960
  icon: 'fa-light fa-object-group',
17771
17961
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
17962
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SURFACES,
17772
17963
  groups: [AXPWidgetGroupEnum.FormElement],
17773
17964
  properties: [AXP_NAME_PROPERTY, AXP_TITLE_PROPERTY, AXP_ICON_PROPERTY, AXP_LAYOUT_SHOW_HEADER_PROPERTY, AXP_LAYOUT_COLUMNS_PROPERTY],
17774
17965
  components: {
@@ -17869,7 +18060,7 @@ class AXPFlexWidgetViewComponent extends AXPFlexBaseLayoutWidgetComponent {
17869
18060
  [node]="node"
17870
18061
  [index]="index"
17871
18062
  [parentNode]="this"
17872
- [mode]="this.mode"
18063
+ [mode]="node.mode ?? this.mode"
17873
18064
  ></ng-container>
17874
18065
  }
17875
18066
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: i1$3.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
@@ -17885,7 +18076,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
17885
18076
  [node]="node"
17886
18077
  [index]="index"
17887
18078
  [parentNode]="this"
17888
- [mode]="this.mode"
18079
+ [mode]="node.mode ?? this.mode"
17889
18080
  ></ng-container>
17890
18081
  }
17891
18082
  `,
@@ -17908,10 +18099,11 @@ var flexWidgetView_component = /*#__PURE__*/Object.freeze({
17908
18099
  const AXPFlexWidget = {
17909
18100
  name: 'flex-layout',
17910
18101
  type: 'container',
17911
- title: 'Flex Layout',
17912
- description: 'Organizes content in flexible layout',
18102
+ title: '@platform-layout-widgets:widgets.flex-layout.title',
18103
+ description: '@platform-layout-widgets:widgets.flex-layout.description',
17913
18104
  icon: 'fa-light fa-box-taped',
17914
18105
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
18106
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
17915
18107
  groups: [AXPWidgetGroupEnum.FormElement],
17916
18108
  options: {
17917
18109
  canInsert: true,
@@ -18055,11 +18247,12 @@ var flexItemWidgetView_component = /*#__PURE__*/Object.freeze({
18055
18247
 
18056
18248
  const AXPFlexItemWidget = {
18057
18249
  name: 'flex-item-layout',
18058
- title: 'Flex Item',
18250
+ title: '@platform-layout-widgets:widgets.flex-item-layout.title',
18059
18251
  type: 'container',
18060
18252
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
18253
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
18061
18254
  // groups: [AXPWidgetGroupEnum.FormElement],
18062
- description: 'Flex Item Layout',
18255
+ description: '@platform-layout-widgets:widgets.flex-item-layout.description',
18063
18256
  icon: 'fa-light fa-rectangle-vertical-history',
18064
18257
  properties: [
18065
18258
  AXP_NAME_PROPERTY,
@@ -18151,10 +18344,11 @@ var pageWidgetView_component = /*#__PURE__*/Object.freeze({
18151
18344
 
18152
18345
  const AXPPageWidget = {
18153
18346
  name: 'page-layout',
18154
- title: 'Page',
18155
- description: 'Structures the entire page',
18347
+ title: '@platform-layout-widgets:widgets.page-layout.title',
18348
+ description: '@platform-layout-widgets:widgets.page-layout.description',
18156
18349
  icon: 'fa-light fa-page',
18157
18350
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
18351
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SHELL,
18158
18352
  type: 'container',
18159
18353
  properties: [
18160
18354
  AXP_NAME_PROPERTY,
@@ -18478,10 +18672,11 @@ var repeaterWidgetView_component = /*#__PURE__*/Object.freeze({
18478
18672
 
18479
18673
  const AXPRepeaterWidget = {
18480
18674
  name: 'repeater-layout',
18481
- title: 'Repeater',
18482
- description: 'Adds repeating form elements',
18675
+ title: '@platform-layout-widgets:widgets.repeater-layout.title',
18676
+ description: '@platform-layout-widgets:widgets.repeater-layout.description',
18483
18677
  icon: 'fa-light fa-table-list',
18484
18678
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
18679
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SURFACES,
18485
18680
  groups: [AXPWidgetGroupEnum.FormElement],
18486
18681
  type: 'container',
18487
18682
  properties: [
@@ -18506,7 +18701,7 @@ const AXPRepeaterWidget = {
18506
18701
  component: () => Promise.resolve().then(function () { return repeaterWidgetDesigner_component; }).then((c) => c.AXPRepeaterWidgetDesignerComponent),
18507
18702
  },
18508
18703
  column: {
18509
- component: () => import('./acorex-platform-layout-widgets-repeater-widget-column.component-BGQqY5Mw.mjs').then((c) => c.AXPRepeaterWidgetColumnComponent),
18704
+ component: () => import('./acorex-platform-layout-widgets-repeater-widget-column.component-BGO75IMz.mjs').then((c) => c.AXPRepeaterWidgetColumnComponent),
18510
18705
  },
18511
18706
  },
18512
18707
  };
@@ -18667,6 +18862,9 @@ class AXPStepWizardWidgetViewComponent extends AXPLayoutBaseWidgetComponent {
18667
18862
  };
18668
18863
  }
18669
18864
  actions() {
18865
+ if (this.definition().showActions === false) {
18866
+ return [];
18867
+ }
18670
18868
  return [
18671
18869
  {
18672
18870
  title: '@general:actions.previous.title',
@@ -18705,7 +18903,11 @@ class AXPStepWizardWidgetViewComponent extends AXPLayoutBaseWidgetComponent {
18705
18903
  <div class="ax-w-full ax-p-4">
18706
18904
  <ax-step-wizard class="ax-mb-4" [content]="wizardContent" #wizard [look]="definition().look || 'circular'">
18707
18905
  @for (step of steps(); track step.id) {
18708
- <ax-step-wizard-item [label]="step.title" [description]="step.description ?? ''" [id]="step.id">
18906
+ <ax-step-wizard-item
18907
+ [label]="(step.title | translate | async) ?? step.title"
18908
+ [description]="step.description ? ((step.description | translate | async) ?? step.description) : ''"
18909
+ [id]="step.id"
18910
+ >
18709
18911
  @if (step.icon) {
18710
18912
  <ax-icon [class]="step.icon"></ax-icon>
18711
18913
  }
@@ -18728,7 +18930,7 @@ class AXPStepWizardWidgetViewComponent extends AXPLayoutBaseWidgetComponent {
18728
18930
  <ax-button
18729
18931
  look="outline"
18730
18932
  [color]="definition().actions?.previous?.color ?? 'primary'"
18731
- [text]="definition().actions?.previous?.title ?? 'Previous'"
18933
+ [text]="((definition().actions?.previous?.title ?? 'Previous') | translate | async) ?? 'Previous'"
18732
18934
  [disabled]="wizard.isFirst()"
18733
18935
  (onClick)="handlePrevious(wizard)"
18734
18936
  >
@@ -18742,7 +18944,7 @@ class AXPStepWizardWidgetViewComponent extends AXPLayoutBaseWidgetComponent {
18742
18944
  @if (action.visible !== false) {
18743
18945
  <ax-button
18744
18946
  [color]="action.color ?? 'default'"
18745
- [text]="action.title"
18947
+ [text]="(action.title | translate | async) ?? action.title"
18746
18948
  (onClick)="executeStepAction(action)"
18747
18949
  >
18748
18950
  @if (action.icon) {
@@ -18755,7 +18957,7 @@ class AXPStepWizardWidgetViewComponent extends AXPLayoutBaseWidgetComponent {
18755
18957
  @if (!wizard.isLast()) {
18756
18958
  <ax-button
18757
18959
  [color]="definition().actions?.next?.color ?? 'primary'"
18758
- [text]="definition().actions?.next?.title ?? 'Next'"
18960
+ [text]="((definition().actions?.next?.title ?? 'Next') | translate | async) ?? 'Next'"
18759
18961
  (onClick)="handleNext(wizard)"
18760
18962
  >
18761
18963
  @if (definition().actions?.next?.icon) {
@@ -18765,7 +18967,7 @@ class AXPStepWizardWidgetViewComponent extends AXPLayoutBaseWidgetComponent {
18765
18967
  } @else {
18766
18968
  <ax-button
18767
18969
  [color]="definition().actions?.submit?.color ?? 'success'"
18768
- [text]="definition().actions?.submit?.title ?? 'Finish'"
18970
+ [text]="((definition().actions?.submit?.title ?? 'Finish') | translate | async) ?? 'Finish'"
18769
18971
  (onClick)="handleSubmit(wizard)"
18770
18972
  >
18771
18973
  @if (definition().actions?.submit?.icon) {
@@ -18777,17 +18979,19 @@ class AXPStepWizardWidgetViewComponent extends AXPLayoutBaseWidgetComponent {
18777
18979
  </div>
18778
18980
  }
18779
18981
  </div>
18780
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXStepWizardModule }, { kind: "component", type: i1$i.AXStepWizardComponent, selector: "ax-step-wizard", inputs: ["connector", "scrollToStep", "size", "look", "changeStep", "orientation", "content"], outputs: ["stepChanged"] }, { kind: "component", type: i1$i.AXStepWizardItemComponent, selector: "ax-step-wizard-item", inputs: ["disabled", "color", "step", "label", "description", "customTemplate", "active", "passed", "look", "state", "id"], outputs: ["activeChange", "passedChange", "lookChange", "stateChange"] }, { kind: "directive", type: i1$i.AXStepWizardContentDirective, selector: "[axStepWizardContent]", inputs: ["axStepWizardContent"], exportAs: ["axStepWizardContent"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: i1$3.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
18982
+ `, isInline: true, styles: [":host ax-step-wizard-item>ax-content{display:none!important}\n"], dependencies: [{ kind: "ngmodule", type: AXStepWizardModule }, { kind: "component", type: i1$i.AXStepWizardComponent, selector: "ax-step-wizard", inputs: ["connector", "scrollToStep", "size", "look", "changeStep", "orientation", "content"], outputs: ["stepChanged"] }, { kind: "component", type: i1$i.AXStepWizardItemComponent, selector: "ax-step-wizard-item", inputs: ["disabled", "color", "step", "label", "description", "customTemplate", "active", "passed", "look", "state", "id"], outputs: ["activeChange", "passedChange", "lookChange", "stateChange"] }, { kind: "directive", type: i1$i.AXStepWizardContentDirective, selector: "[axStepWizardContent]", inputs: ["axStepWizardContent"], exportAs: ["axStepWizardContent"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: i1$3.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
18781
18983
  }
18782
18984
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPStepWizardWidgetViewComponent, decorators: [{
18783
18985
  type: Component,
18784
- args: [{
18785
- selector: 'axp-step-wizard-widget-view',
18786
- template: `
18986
+ args: [{ selector: 'axp-step-wizard-widget-view', template: `
18787
18987
  <div class="ax-w-full ax-p-4">
18788
18988
  <ax-step-wizard class="ax-mb-4" [content]="wizardContent" #wizard [look]="definition().look || 'circular'">
18789
18989
  @for (step of steps(); track step.id) {
18790
- <ax-step-wizard-item [label]="step.title" [description]="step.description ?? ''" [id]="step.id">
18990
+ <ax-step-wizard-item
18991
+ [label]="(step.title | translate | async) ?? step.title"
18992
+ [description]="step.description ? ((step.description | translate | async) ?? step.description) : ''"
18993
+ [id]="step.id"
18994
+ >
18791
18995
  @if (step.icon) {
18792
18996
  <ax-icon [class]="step.icon"></ax-icon>
18793
18997
  }
@@ -18810,7 +19014,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
18810
19014
  <ax-button
18811
19015
  look="outline"
18812
19016
  [color]="definition().actions?.previous?.color ?? 'primary'"
18813
- [text]="definition().actions?.previous?.title ?? 'Previous'"
19017
+ [text]="((definition().actions?.previous?.title ?? 'Previous') | translate | async) ?? 'Previous'"
18814
19018
  [disabled]="wizard.isFirst()"
18815
19019
  (onClick)="handlePrevious(wizard)"
18816
19020
  >
@@ -18824,7 +19028,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
18824
19028
  @if (action.visible !== false) {
18825
19029
  <ax-button
18826
19030
  [color]="action.color ?? 'default'"
18827
- [text]="action.title"
19031
+ [text]="(action.title | translate | async) ?? action.title"
18828
19032
  (onClick)="executeStepAction(action)"
18829
19033
  >
18830
19034
  @if (action.icon) {
@@ -18837,7 +19041,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
18837
19041
  @if (!wizard.isLast()) {
18838
19042
  <ax-button
18839
19043
  [color]="definition().actions?.next?.color ?? 'primary'"
18840
- [text]="definition().actions?.next?.title ?? 'Next'"
19044
+ [text]="((definition().actions?.next?.title ?? 'Next') | translate | async) ?? 'Next'"
18841
19045
  (onClick)="handleNext(wizard)"
18842
19046
  >
18843
19047
  @if (definition().actions?.next?.icon) {
@@ -18847,7 +19051,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
18847
19051
  } @else {
18848
19052
  <ax-button
18849
19053
  [color]="definition().actions?.submit?.color ?? 'success'"
18850
- [text]="definition().actions?.submit?.title ?? 'Finish'"
19054
+ [text]="((definition().actions?.submit?.title ?? 'Finish') | translate | async) ?? 'Finish'"
18851
19055
  (onClick)="handleSubmit(wizard)"
18852
19056
  >
18853
19057
  @if (definition().actions?.submit?.icon) {
@@ -18859,12 +19063,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
18859
19063
  </div>
18860
19064
  }
18861
19065
  </div>
18862
- `,
18863
- standalone: true,
18864
- changeDetection: ChangeDetectionStrategy.OnPush,
18865
- encapsulation: ViewEncapsulation.None,
18866
- imports: [AXStepWizardModule, AXButtonModule, AXDecoratorModule, AXPWidgetCoreModule],
18867
- }]
19066
+ `, standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [AXStepWizardModule, AXButtonModule, AXDecoratorModule, AXTranslationModule, AsyncPipe, AXPWidgetCoreModule], styles: [":host ax-step-wizard-item>ax-content{display:none!important}\n"] }]
18868
19067
  }], propDecorators: { wizard: [{ type: i0.ViewChild, args: ['wizard', { isSignal: true }] }] } });
18869
19068
 
18870
19069
  var stepWizardWidgetView_component = /*#__PURE__*/Object.freeze({
@@ -18874,10 +19073,10 @@ var stepWizardWidgetView_component = /*#__PURE__*/Object.freeze({
18874
19073
 
18875
19074
  const AXPStepWizardWidget = {
18876
19075
  name: 'step-wizard',
18877
- title: 'Step Wizard',
18878
- icon: 'fa-solid fa-image-user',
18879
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
18880
- aiDescription: 'Use for multi-step flows (wizard). Present when the user should follow ordered steps; children typically hold step content.',
19076
+ title: '@platform-layout-widgets:widgets.step-wizard.title',
19077
+ icon: 'fa-light fa-image-user',
19078
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
19079
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SURFACES,
18881
19080
  groups: [AXPWidgetGroupEnum.FormElement],
18882
19081
  type: 'view',
18883
19082
  properties: [],
@@ -19853,10 +20052,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
19853
20052
  const AXPTableWidget = {
19854
20053
  name: 'table-layout',
19855
20054
  type: 'container',
19856
- title: 'Table Layout',
19857
- description: 'Structures content into rows and cells',
20055
+ title: '@platform-layout-widgets:widgets.table-layout.title',
20056
+ description: '@platform-layout-widgets:widgets.table-layout.description',
19858
20057
  icon: 'fa-light fa-table',
19859
20058
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
20059
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
19860
20060
  groups: [AXPWidgetGroupEnum.FormElement],
19861
20061
  options: {
19862
20062
  canInsert: true,
@@ -20271,10 +20471,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
20271
20471
 
20272
20472
  const AXPTableItemWidget = {
20273
20473
  name: 'table-item-layout',
20274
- title: 'Table Item',
20474
+ title: '@platform-layout-widgets:widgets.table-item-layout.title',
20275
20475
  type: 'container',
20276
20476
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
20277
- description: 'Table Item (row/cell) container',
20477
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
20478
+ description: '@platform-layout-widgets:widgets.table-item-layout.description',
20278
20479
  icon: 'fa-light fa-table-cells',
20279
20480
  properties: [
20280
20481
  AXP_NAME_PROPERTY,
@@ -23950,12 +24151,12 @@ var cronJobWidgetView_component = /*#__PURE__*/Object.freeze({
23950
24151
 
23951
24152
  const AXPCronJobWidget = {
23952
24153
  name: 'cron-job',
23953
- title: 'Cron Job',
24154
+ title: '@platform-layout-widgets:widgets.cron-job.title',
23954
24155
  icon: 'fa-light fa-alarm-clock',
23955
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
23956
- aiDescription: 'Cron expression editor and viewer. Use when the answer involves recurring schedules or job timing (not a one-off date picker).',
24156
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
24157
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_INPUT,
23957
24158
  type: 'editor',
23958
- groups: [AXPWidgetGroupEnum.FormElement],
24159
+ groups: [AXPWidgetGroupEnum.BaseWidget],
23959
24160
  properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY],
23960
24161
  components: {
23961
24162
  view: {
@@ -24099,10 +24300,11 @@ var metaDataWidgetView_component = /*#__PURE__*/Object.freeze({
24099
24300
 
24100
24301
  const AXPMetaDataWidget = {
24101
24302
  name: 'meta-data-editor',
24102
- title: 'Meta Data',
24303
+ title: '@platform-layout-widgets:widgets.meta-data-editor.title',
24103
24304
  icon: 'fa-light fa-input-text',
24104
- description: 'meta data rendered',
24305
+ description: '@platform-layout-widgets:widgets.meta-data-editor.description',
24105
24306
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
24307
+ subCategory: AXP_WIDGETS_EDITOR_SUB_COMPOSITE,
24106
24308
  type: 'editor',
24107
24309
  defaultFilterWidgetName: 'string-filter',
24108
24310
  properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY],
@@ -24410,10 +24612,11 @@ var numberUnitBoxWidgetView_component = /*#__PURE__*/Object.freeze({
24410
24612
 
24411
24613
  const AXPNumberUnitBoxWidget = {
24412
24614
  name: 'number-unit-editor',
24413
- title: 'Number Unit Box',
24414
- description: 'Inputs numeric values',
24615
+ title: '@platform-layout-widgets:widgets.number-unit-editor.title',
24616
+ description: '@platform-layout-widgets:widgets.number-unit-editor.description',
24415
24617
  icon: 'fa-light fa-input-numeric',
24416
24618
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
24619
+ subCategory: AXP_WIDGETS_EDITOR_SUB_NUMERIC,
24417
24620
  groups: [AXPWidgetGroupEnum.FormElement],
24418
24621
  type: 'editor',
24419
24622
  defaultFilterWidgetName: 'number-filter',
@@ -24459,10 +24662,11 @@ const AXPNumberUnitBoxWidget = {
24459
24662
 
24460
24663
  const AXPTableEditorWidget = {
24461
24664
  name: 'table-editor',
24462
- title: 'Table Editor',
24665
+ title: '@platform-layout-widgets:widgets.table-editor.title',
24463
24666
  icon: 'fa-light fa-input-text',
24464
- description: 'Inputs single-line text',
24667
+ description: '@platform-layout-widgets:widgets.table-editor.description',
24465
24668
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
24669
+ subCategory: AXP_WIDGETS_EDITOR_SUB_COMPOSITE,
24466
24670
  type: 'editor',
24467
24671
  defaultFilterWidgetName: 'string-filter',
24468
24672
  properties: [
@@ -25467,13 +25671,12 @@ var imageWidgetView_component = /*#__PURE__*/Object.freeze({
25467
25671
  //#region ---- Image Widget Config ----
25468
25672
  const AXPImageWidget = {
25469
25673
  name: 'image',
25470
- title: 'Image',
25471
- description: 'Simple image viewer/editor that stores a URL or binary',
25674
+ title: '@platform-layout-widgets:widgets.image.title',
25675
+ description: '@platform-layout-widgets:widgets.image.description',
25472
25676
  icon: 'fa-light fa-image',
25473
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
25474
- aiDescription: 'Use for a single image (URL or embedded). Prefer over plain markdown when aspect ratio, sizing, or binary handling matters.',
25677
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
25678
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
25475
25679
  groups: [AXPWidgetGroupEnum.FormElement],
25476
- aiCatalog: 'include',
25477
25680
  type: 'editor',
25478
25681
  properties: [
25479
25682
  AXP_NAME_PROPERTY,
@@ -25645,13 +25848,12 @@ var listToolbarWidgetView_component = /*#__PURE__*/Object.freeze({
25645
25848
 
25646
25849
  const AXPListToolbarWidget = {
25647
25850
  name: 'list-toolbar',
25648
- title: 'List Toolbar',
25649
- description: '',
25851
+ title: '@platform-layout-widgets:widgets.list-toolbar.title',
25650
25852
  type: 'view',
25651
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
25652
- aiDescription: 'Toolbar for list views: sort, filter, and column toggles. Use next to data-list when the user may refine or reorder rows.',
25853
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
25854
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_LISTS,
25653
25855
  groups: [AXPWidgetGroupEnum.UtilityWidget],
25654
- icon: 'fa-solid fa-square',
25856
+ icon: 'fa-light fa-square',
25655
25857
  properties: [
25656
25858
  AXP_NAME_PROPERTY,
25657
25859
  AXP_DATA_PATH_PROPERTY,
@@ -25690,13 +25892,12 @@ const AXPListToolbarWidget = {
25690
25892
 
25691
25893
  const AXPMapWidget = {
25692
25894
  name: 'map',
25693
- title: 'Map',
25694
- description: 'Displays and interacts with maps',
25895
+ title: '@platform-layout-widgets:widgets.map.title',
25896
+ description: '@platform-layout-widgets:widgets.map.description',
25695
25897
  icon: 'fa-light fa-map-location',
25696
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
25697
- aiDescription: 'Use when the answer involves locations, routes, or areas on a map. Pass markers, polygons, or center/zoom via options; suitable for “where”, “near”, or geographic summaries.',
25898
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
25899
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_TOOLS,
25698
25900
  groups: [AXPWidgetGroupEnum.FormElement],
25699
- aiCatalog: 'include',
25700
25901
  type: 'editor',
25701
25902
  properties: [
25702
25903
  AXP_NAME_PROPERTY,
@@ -25851,7 +26052,7 @@ class AXPTimerDurationWidgetEditComponent extends AXPValueWidgetComponent {
25851
26052
  [options]="validation.options"
25852
26053
  ></ax-validation-rule>
25853
26054
  }
25854
- </ax-time-duration>`, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXTimeDurationModule }, { kind: "component", type: i3$6.AXTimeDurationComponent, selector: "ax-time-duration", inputs: ["disabled", "tabIndex", "readonly", "look", "valueStart", "valueEnd", "label", "maskDigits", "minValue", "maxValue"], outputs: ["onValueChanged"] }, { kind: "ngmodule", type: AXValidationModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26055
+ </ax-time-duration>`, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXTimeDurationModule }, { kind: "component", type: i3$6.AXTimeDurationComponent, selector: "ax-time-duration", inputs: ["disabled", "tabIndex", "readonly", "look", "name", "valueStart", "valueEnd", "label", "maskDigits", "minValue", "maxValue"], outputs: ["onValueChanged"] }, { kind: "ngmodule", type: AXValidationModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25855
26056
  }
25856
26057
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTimerDurationWidgetEditComponent, decorators: [{
25857
26058
  type: Component,
@@ -25917,10 +26118,11 @@ var timeDurationWidgetView_component = /*#__PURE__*/Object.freeze({
25917
26118
 
25918
26119
  const AXPTimeDurationWidget = {
25919
26120
  name: 'time-duration',
25920
- title: 'Time Duration',
25921
- description: 'Selects a time duration',
26121
+ title: '@platform-layout-widgets:widgets.time-duration.title',
26122
+ description: '@platform-layout-widgets:widgets.time-duration.description',
25922
26123
  icon: 'fa-light fa-clock',
25923
26124
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
26125
+ subCategory: AXP_WIDGETS_EDITOR_SUB_DATETIME,
25924
26126
  groups: [AXPWidgetGroupEnum.FormElement],
25925
26127
  defaultFilterWidgetName: 'time-duration-filter',
25926
26128
  type: 'editor',
@@ -27191,10 +27393,11 @@ const AXPTimeDurationFilterWidget = {
27191
27393
 
27192
27394
  const AXPDocumentWidget = {
27193
27395
  name: 'document-layout',
27194
- title: 'Document',
27195
- description: 'Structures the entire document',
27396
+ title: '@platform-layout-widgets:widgets.document-layout.title',
27397
+ description: '@platform-layout-widgets:widgets.document-layout.description',
27196
27398
  icon: 'fa-light fa-page',
27197
27399
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
27400
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SHELL,
27198
27401
  type: 'container',
27199
27402
  properties: [],
27200
27403
  components: {},
@@ -27207,6 +27410,24 @@ class AXPFormFieldWidgetViewComponent extends AXPGridItemBaseLayoutWidgetCompone
27207
27410
  this.showLabel = computed(() => this.options()['showLabel'] ?? true, ...(ngDevMode ? [{ debugName: "showLabel" }] : /* istanbul ignore next */ []));
27208
27411
  this.badge = computed(() => this.options()['badge'], ...(ngDevMode ? [{ debugName: "badge" }] : /* istanbul ignore next */ []));
27209
27412
  this.visible = computed(() => this.options()['visible'], ...(ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []));
27413
+ this.hintText = computed(() => this.options()['hint'], ...(ngDevMode ? [{ debugName: "hintText" }] : /* istanbul ignore next */ []));
27414
+ this.hasHint = computed(() => {
27415
+ const h = this.hintText();
27416
+ if (h == null) {
27417
+ return false;
27418
+ }
27419
+ if (typeof h === 'string') {
27420
+ return h.trim().length > 0;
27421
+ }
27422
+ return true;
27423
+ }, ...(ngDevMode ? [{ debugName: "hasHint" }] : /* istanbul ignore next */ []));
27424
+ this.hintDisplayMode = computed(() => this.options()['hintDisplayMode'] === 'icon' ? 'icon' : 'note', ...(ngDevMode ? [{ debugName: "hintDisplayMode" }] : /* istanbul ignore next */ []));
27425
+ /** Info icon with tooltip (typically next to the label when the label is visible). */
27426
+ this.hintAsIcon = computed(() => this.hasHint() && this.hintDisplayMode() === 'icon', ...(ngDevMode ? [{ debugName: "hintAsIcon" }] : /* istanbul ignore next */ []));
27427
+ /** Visible helper copy under the field (inside `ax-form-field`). */
27428
+ this.hintAsNote = computed(() => this.hasHint() && this.hintDisplayMode() === 'note', ...(ngDevMode ? [{ debugName: "hintAsNote" }] : /* istanbul ignore next */ []));
27429
+ /** Label row needs to show even when label is hidden (e.g. icon-only hint with badge layout). */
27430
+ this.showTopRow = computed(() => this.showLabel() || !!this.badge() || this.hintAsIcon(), ...(ngDevMode ? [{ debugName: "showTopRow" }] : /* istanbul ignore next */ []));
27210
27431
  this.isRequired = computed(() => this.children().some((c) => {
27211
27432
  const validations = c.options?.['validations'];
27212
27433
  return Array.isArray(validations) && validations.some((v) => v.rule === 'required');
@@ -27218,14 +27439,25 @@ class AXPFormFieldWidgetViewComponent extends AXPGridItemBaseLayoutWidgetCompone
27218
27439
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFormFieldWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
27219
27440
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPFormFieldWidgetViewComponent, isStandalone: true, selector: "axp-form-field-widget-view", host: { properties: { "class": "this.__class" } }, usesInheritance: true, ngImport: i0, template: `
27220
27441
  <ax-form-field>
27221
- @if (showLabel() || badge()) {
27442
+ @if (showTopRow()) {
27222
27443
  <div class="ax-flex ax-gap-1 ax-items-center ax-justify-between">
27223
- @if (showLabel()) {
27224
- <ax-label [required]="isRequired()">{{ label() | translate | async }}</ax-label>
27225
- }
27444
+ <div class="ax-flex ax-min-w-0 ax-flex-wrap ax-items-center ax-gap-1 ax-leading-none">
27445
+ @if (showLabel()) {
27446
+ <ax-label [required]="isRequired()" class="ax-inline-flex ax-min-w-0 ax-items-center">{{ label() | translate | async }}</ax-label>
27447
+ }
27448
+ @if (hintAsIcon()) {
27449
+ <i
27450
+ role="button"
27451
+ tabindex="0"
27452
+ class="fa-regular fa-circle-info ax-relative ax-top-px ax-inline-flex ax-h-5 ax-w-5 ax-shrink-0 ax-cursor-help ax-items-center ax-justify-center ax-rounded-full ax-text-xs ax-leading-none ax-text-neutral-500 ax-outline-none ax-transition-[color,background-color] hover:ax-bg-neutral-100 hover:ax-text-neutral-800 focus-visible:ax-outline-2 focus-visible:ax-outline-primary-500 focus-visible:ax-outline-offset-1 ax-mt-[-5px]"
27453
+ [axTooltip]="(hintText()! | translate | async) ?? ''"
27454
+ axTooltipPlacement="top"
27455
+ [attr.aria-label]="(hintText()! | translate | async) ?? ''"
27456
+ ></i>
27457
+ }
27458
+ </div>
27226
27459
  @if (badge()) {
27227
- <!-- <ax-badge [text]="(badge() | translate | async) ?? ''" color="primary" class="ax-primary-lightest"></ax-badge> -->
27228
- <span class="ax-text ax-p-1 ax-text-xs ax-rounded-md ">{{ badge() | translate | async }}</span>
27460
+ <span class="ax-text ax-p-1 ax-text-xs ax-rounded-md">{{ badge() | translate | async }}</span>
27229
27461
  }
27230
27462
  </div>
27231
27463
  }
@@ -27239,8 +27471,13 @@ class AXPFormFieldWidgetViewComponent extends AXPGridItemBaseLayoutWidgetCompone
27239
27471
  >
27240
27472
  </ng-container>
27241
27473
  }
27474
+ @if (hintAsNote()) {
27475
+ <p class="ax-text-xs ax-mt-1 ax-font-normal ax-opacity-75">
27476
+ {{ hintText()! | translate | async }}
27477
+ </p>
27478
+ }
27242
27479
  </ax-form-field>
27243
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i3.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "ngmodule", type: AXLabelModule }, { kind: "component", type: i2.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: i1$3.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27480
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i3.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "ngmodule", type: AXLabelModule }, { kind: "component", type: i2.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: i1$3.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXTooltipModule }, { kind: "directive", type: i4$1.AXTooltipDirective, selector: "[axTooltip]", inputs: ["axTooltipDisabled", "axTooltip", "axTooltipContext", "axTooltipPlacement", "axTooltipOffsetX", "axTooltipOffsetY", "axTooltipOpenAfter", "axTooltipCloseAfter"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27244
27481
  }
27245
27482
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFormFieldWidgetViewComponent, decorators: [{
27246
27483
  type: Component,
@@ -27248,14 +27485,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
27248
27485
  selector: 'axp-form-field-widget-view',
27249
27486
  template: `
27250
27487
  <ax-form-field>
27251
- @if (showLabel() || badge()) {
27488
+ @if (showTopRow()) {
27252
27489
  <div class="ax-flex ax-gap-1 ax-items-center ax-justify-between">
27253
- @if (showLabel()) {
27254
- <ax-label [required]="isRequired()">{{ label() | translate | async }}</ax-label>
27255
- }
27490
+ <div class="ax-flex ax-min-w-0 ax-flex-wrap ax-items-center ax-gap-1 ax-leading-none">
27491
+ @if (showLabel()) {
27492
+ <ax-label [required]="isRequired()" class="ax-inline-flex ax-min-w-0 ax-items-center">{{ label() | translate | async }}</ax-label>
27493
+ }
27494
+ @if (hintAsIcon()) {
27495
+ <i
27496
+ role="button"
27497
+ tabindex="0"
27498
+ class="fa-regular fa-circle-info ax-relative ax-top-px ax-inline-flex ax-h-5 ax-w-5 ax-shrink-0 ax-cursor-help ax-items-center ax-justify-center ax-rounded-full ax-text-xs ax-leading-none ax-text-neutral-500 ax-outline-none ax-transition-[color,background-color] hover:ax-bg-neutral-100 hover:ax-text-neutral-800 focus-visible:ax-outline-2 focus-visible:ax-outline-primary-500 focus-visible:ax-outline-offset-1 ax-mt-[-5px]"
27499
+ [axTooltip]="(hintText()! | translate | async) ?? ''"
27500
+ axTooltipPlacement="top"
27501
+ [attr.aria-label]="(hintText()! | translate | async) ?? ''"
27502
+ ></i>
27503
+ }
27504
+ </div>
27256
27505
  @if (badge()) {
27257
- <!-- <ax-badge [text]="(badge() | translate | async) ?? ''" color="primary" class="ax-primary-lightest"></ax-badge> -->
27258
- <span class="ax-text ax-p-1 ax-text-xs ax-rounded-md ">{{ badge() | translate | async }}</span>
27506
+ <span class="ax-text ax-p-1 ax-text-xs ax-rounded-md">{{ badge() | translate | async }}</span>
27259
27507
  }
27260
27508
  </div>
27261
27509
  }
@@ -27269,10 +27517,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
27269
27517
  >
27270
27518
  </ng-container>
27271
27519
  }
27520
+ @if (hintAsNote()) {
27521
+ <p class="ax-text-xs ax-mt-1 ax-font-normal ax-opacity-75">
27522
+ {{ hintText()! | translate | async }}
27523
+ </p>
27524
+ }
27272
27525
  </ax-form-field>
27273
27526
  `,
27274
27527
  changeDetection: ChangeDetectionStrategy.OnPush,
27275
- imports: [CommonModule, AXFormModule, AXLabelModule, AXPWidgetCoreModule, AXTranslationModule, AXBadgeModule],
27528
+ imports: [
27529
+ CommonModule,
27530
+ AXFormModule,
27531
+ AXLabelModule,
27532
+ AXPWidgetCoreModule,
27533
+ AXTranslationModule,
27534
+ AXBadgeModule,
27535
+ AXDecoratorModule,
27536
+ AXTooltipModule,
27537
+ ],
27276
27538
  standalone: true,
27277
27539
  }]
27278
27540
  }], propDecorators: { __class: [{
@@ -27289,6 +27551,20 @@ class AXPFormFieldWidgetDesignerComponent extends AXPGridItemBaseLayoutWidgetCom
27289
27551
  constructor() {
27290
27552
  super(...arguments);
27291
27553
  this.label = computed(() => this.options()['label'], ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
27554
+ this.hint = computed(() => this.options()['hint'], ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
27555
+ this.hasHint = computed(() => {
27556
+ const h = this.hint();
27557
+ if (h == null || h === '') {
27558
+ return false;
27559
+ }
27560
+ if (typeof h === 'string') {
27561
+ return h.trim().length > 0;
27562
+ }
27563
+ return true;
27564
+ }, ...(ngDevMode ? [{ debugName: "hasHint" }] : /* istanbul ignore next */ []));
27565
+ this.hintDisplayMode = computed(() => this.options()['hintDisplayMode'] === 'icon' ? 'icon' : 'note', ...(ngDevMode ? [{ debugName: "hintDisplayMode" }] : /* istanbul ignore next */ []));
27566
+ this.hintAsIcon = computed(() => this.hasHint() && this.hintDisplayMode() === 'icon', ...(ngDevMode ? [{ debugName: "hintAsIcon" }] : /* istanbul ignore next */ []));
27567
+ this.hintAsNote = computed(() => this.hasHint() && this.hintDisplayMode() === 'note', ...(ngDevMode ? [{ debugName: "hintAsNote" }] : /* istanbul ignore next */ []));
27292
27568
  }
27293
27569
  get __class() {
27294
27570
  return this.hostClass();
@@ -27301,7 +27577,12 @@ class AXPFormFieldWidgetDesignerComponent extends AXPGridItemBaseLayoutWidgetCom
27301
27577
  },
27302
27578
  ], usesInheritance: true, ngImport: i0, template: `
27303
27579
  <ax-form-field>
27304
- <ax-label>{{ label() | translate | async }}</ax-label>
27580
+ <div class="ax-flex ax-gap-1 ax-items-center">
27581
+ <ax-label>{{ label() | translate | async }}</ax-label>
27582
+ @if (hintAsIcon()) {
27583
+ <i class="fa-regular fa-circle-info ax-text-sm ax-opacity-75" aria-hidden="true"></i>
27584
+ }
27585
+ </div>
27305
27586
  @for (node of children(); track $index) {
27306
27587
  <ng-container
27307
27588
  axp-widget-designer-renderer
@@ -27314,6 +27595,11 @@ class AXPFormFieldWidgetDesignerComponent extends AXPGridItemBaseLayoutWidgetCom
27314
27595
  } @empty {
27315
27596
  <axp-designer-add-widget-mini-button></axp-designer-add-widget-mini-button>
27316
27597
  }
27598
+ @if (hintAsNote()) {
27599
+ <p class="ax-text-xs ax-mt-1 ax-font-normal ax-opacity-75">
27600
+ {{ hint() | translate | async }}
27601
+ </p>
27602
+ }
27317
27603
  </ax-form-field>
27318
27604
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i3.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "ngmodule", type: AXLabelModule }, { kind: "component", type: i2.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: AXPWidgetDesignerRendererDirective, selector: "[axp-widget-designer-renderer]", inputs: ["parentNode", "parentElement", "parentComponent", "index", "locked", "mode", "node"] }, { kind: "component", type: AXPDesignerAddWidgetMiniButtonComponent, selector: "axp-designer-add-widget-mini-button", outputs: ["onClick"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27319
27605
  }
@@ -27323,7 +27609,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
27323
27609
  selector: 'axp-form-field-widget-designer',
27324
27610
  template: `
27325
27611
  <ax-form-field>
27326
- <ax-label>{{ label() | translate | async }}</ax-label>
27612
+ <div class="ax-flex ax-gap-1 ax-items-center">
27613
+ <ax-label>{{ label() | translate | async }}</ax-label>
27614
+ @if (hintAsIcon()) {
27615
+ <i class="fa-regular fa-circle-info ax-text-sm ax-opacity-75" aria-hidden="true"></i>
27616
+ }
27617
+ </div>
27327
27618
  @for (node of children(); track $index) {
27328
27619
  <ng-container
27329
27620
  axp-widget-designer-renderer
@@ -27336,6 +27627,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
27336
27627
  } @empty {
27337
27628
  <axp-designer-add-widget-mini-button></axp-designer-add-widget-mini-button>
27338
27629
  }
27630
+ @if (hintAsNote()) {
27631
+ <p class="ax-text-xs ax-mt-1 ax-font-normal ax-opacity-75">
27632
+ {{ hint() | translate | async }}
27633
+ </p>
27634
+ }
27339
27635
  </ax-form-field>
27340
27636
  `,
27341
27637
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -27366,14 +27662,37 @@ var formFieldWidgetDesigner_component = /*#__PURE__*/Object.freeze({
27366
27662
  AXPFormFieldWidgetDesignerComponent: AXPFormFieldWidgetDesignerComponent
27367
27663
  });
27368
27664
 
27665
+ const AXP_FORM_FIELD_HINT_PROPERTY = createStringProperty({
27666
+ name: 'hint',
27667
+ title: 'Hint',
27668
+ path: 'options.hint',
27669
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
27670
+ });
27671
+ const AXP_FORM_FIELD_HINT_DISPLAY_MODE_PROPERTY = createSelectProperty({
27672
+ name: 'hintDisplayMode',
27673
+ title: 'Hint display',
27674
+ path: 'options.hintDisplayMode',
27675
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
27676
+ defaultValue: 'note',
27677
+ dataSource: [
27678
+ { id: 'note', title: 'Note (below field)' },
27679
+ { id: 'icon', title: 'Icon (tooltip)' },
27680
+ ],
27681
+ });
27369
27682
  const AXPFormFieldWidget = {
27370
27683
  name: 'form-field',
27371
- title: 'Form Field',
27684
+ title: '@platform-layout-widgets:widgets.form-field.title',
27372
27685
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
27686
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_UTILITY,
27373
27687
  groups: [AXPWidgetGroupEnum.FormElement],
27374
27688
  type: 'container',
27375
27689
  icon: 'fa-light fa-pen-field',
27376
- properties: [AXP_NAME_PROPERTY, cloneProperty(AXP_LABEL_PROPERTY, { schema: { defaultValue: 'Sample Label' } })],
27690
+ properties: [
27691
+ AXP_NAME_PROPERTY,
27692
+ cloneProperty(AXP_LABEL_PROPERTY, { schema: { defaultValue: 'Sample Label' } }),
27693
+ AXP_FORM_FIELD_HINT_PROPERTY,
27694
+ AXP_FORM_FIELD_HINT_DISPLAY_MODE_PROPERTY,
27695
+ ],
27377
27696
  components: {
27378
27697
  view: {
27379
27698
  component: () => Promise.resolve().then(function () { return formFieldWidgetView_component; }).then((c) => c.AXPFormFieldWidgetViewComponent),
@@ -27864,10 +28183,12 @@ var gridWidgetView_component = /*#__PURE__*/Object.freeze({
27864
28183
 
27865
28184
  const AXPGridWidget = {
27866
28185
  name: 'grid-layout',
27867
- title: 'Grid Layout',
28186
+ title: '@platform-layout-widgets:widgets.grid-layout.title',
27868
28187
  type: 'container',
27869
28188
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
28189
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
27870
28190
  groups: [AXPWidgetGroupEnum.FormElement],
28191
+ description: '@platform-layout-widgets:widgets.grid-layout.description',
27871
28192
  icon: 'fa-light fa-grid',
27872
28193
  properties: [
27873
28194
  AXP_NAME_PROPERTY,
@@ -28103,10 +28424,12 @@ var gridItemWidgetView_component = /*#__PURE__*/Object.freeze({
28103
28424
 
28104
28425
  const AXPGridItemWidget = {
28105
28426
  name: 'grid-item-layout',
28106
- title: 'Grid Item',
28427
+ title: '@platform-layout-widgets:widgets.grid-item-layout.title',
28107
28428
  type: 'container',
28108
28429
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
28430
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
28109
28431
  // groups: [AXPWidgetGroupEnum.FormElement],
28432
+ description: '@platform-layout-widgets:widgets.grid-item-layout.description',
28110
28433
  icon: 'fa-light fa-objects-column',
28111
28434
  properties: [
28112
28435
  AXP_NAME_PROPERTY,
@@ -28132,11 +28455,11 @@ const AXPGridItemWidget = {
28132
28455
 
28133
28456
  const AXPAlertBoxWidget = {
28134
28457
  name: 'alert-box-layout',
28135
- title: 'Alert Box',
28136
- description: 'Displays an alert with title and description using ax-alert',
28458
+ title: '@platform-layout-widgets:widgets.alert-box-layout.title',
28459
+ description: '@platform-layout-widgets:widgets.alert-box-layout.description',
28137
28460
  icon: 'fa-light fa-circle-info',
28138
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
28139
- aiDescription: 'Use for notices: success, warning, danger, or info callouts with title and body. Prefer over plain text when severity or emphasis should be visible.',
28461
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
28462
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SURFACES,
28140
28463
  groups: [AXPWidgetGroupEnum.FormElement],
28141
28464
  type: 'view',
28142
28465
  properties: [
@@ -28378,9 +28701,10 @@ var iconWidgetColumn_component = /*#__PURE__*/Object.freeze({
28378
28701
 
28379
28702
  const AXPIconWidget = {
28380
28703
  name: 'icon',
28381
- title: 'Icon',
28704
+ title: '@platform-layout-widgets:widgets.icon.title',
28382
28705
  type: 'view',
28383
28706
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
28707
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_UTILITY,
28384
28708
  // groups: [AXPWidgetGroupEnum.FormElement],
28385
28709
  icon: 'fa-light fa-icons',
28386
28710
  properties: [AXP_NAME_PROPERTY],
@@ -28586,10 +28910,11 @@ var panelWidgetView_component = /*#__PURE__*/Object.freeze({
28586
28910
  const AXPPanelWidget = {
28587
28911
  name: 'panel-layout',
28588
28912
  type: 'container',
28589
- title: 'Panel Layout',
28590
- description: 'Organizes content in a collapsible panel',
28913
+ title: '@platform-layout-widgets:widgets.panel-layout.title',
28914
+ description: '@platform-layout-widgets:widgets.panel-layout.description',
28591
28915
  icon: 'fa-light fa-rectangle-list',
28592
28916
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
28917
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SURFACES,
28593
28918
  groups: [AXPWidgetGroupEnum.FormElement],
28594
28919
  properties: [
28595
28920
  AXP_NAME_PROPERTY,
@@ -28843,13 +29168,13 @@ var tabsetWidgetDesigner_component = /*#__PURE__*/Object.freeze({
28843
29168
 
28844
29169
  const AXPTabSetWidget = {
28845
29170
  name: 'tabset-layout',
28846
- title: 'TabSet Layout',
28847
- description: 'A tab set layout is a widget that displays a tab set',
29171
+ title: '@platform-layout-widgets:widgets.tabset-layout.title',
29172
+ description: '@platform-layout-widgets:widgets.tabset-layout.description',
28848
29173
  type: 'view',
28849
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
28850
- aiDescription: 'Use to split content into labeled tabs. Pair with tabset-item children; each tab should map to one logical section of the answer.',
29174
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
29175
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_TABS,
28851
29176
  groups: [AXPWidgetGroupEnum.FormElement],
28852
- icon: 'fa-solid fa-square',
29177
+ icon: 'fa-light fa-square',
28853
29178
  properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY],
28854
29179
  components: {
28855
29180
  view: {
@@ -28930,13 +29255,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
28930
29255
 
28931
29256
  const AXPTabSetItemWidget = {
28932
29257
  name: 'tabset-item',
28933
- title: 'TabSet Item',
28934
- description: 'A tab set item is a widget that displays a tab set item',
29258
+ title: '@platform-layout-widgets:widgets.tabset-item.title',
29259
+ description: '@platform-layout-widgets:widgets.tabset-item.description',
28935
29260
  type: 'view',
28936
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
28937
- aiDescription: 'Single tab panel inside a tabset. Use one item per tab label; put the tab content in the slot or bound child widgets.',
29261
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
29262
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_TABS,
28938
29263
  groups: [AXPWidgetGroupEnum.FormElement],
28939
- icon: 'fa-solid fa-square',
29264
+ icon: 'fa-light fa-square',
28940
29265
  properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY],
28941
29266
  components: {
28942
29267
  view: {
@@ -28977,11 +29302,11 @@ var textBlockWidgetView_component = /*#__PURE__*/Object.freeze({
28977
29302
 
28978
29303
  const AXPTextBlockWidget = {
28979
29304
  name: 'text-block-layout',
28980
- title: 'Text Block',
28981
- description: 'Displays text blocks',
29305
+ title: '@platform-layout-widgets:widgets.text-block-layout.title',
29306
+ description: '@platform-layout-widgets:widgets.text-block-layout.description',
28982
29307
  icon: 'fa-light fa-text',
28983
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
28984
- aiDescription: 'Use for rich text blocks (options.content) when the answer needs structured prose beyond a single paragraph; supports inline formatting from the rich-text renderer.',
29308
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
29309
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SURFACES,
28985
29310
  groups: [AXPWidgetGroupEnum.FormElement],
28986
29311
  type: 'view',
28987
29312
  properties: [
@@ -29457,6 +29782,7 @@ var triggerExpressionEditorPopup_component = /*#__PURE__*/Object.freeze({
29457
29782
  AXPTriggerExpressionEditorPopupComponent: AXPTriggerExpressionEditorPopupComponent
29458
29783
  });
29459
29784
 
29785
+ //#region ---- Imports ----
29460
29786
  //#endregion
29461
29787
  //#region ---- Widget Lists (single source of truth) ----
29462
29788
  /**
@@ -29573,6 +29899,7 @@ const EXTENDED_WIDGETS = [
29573
29899
  name: 'select-filter',
29574
29900
  title: 'Select Filter',
29575
29901
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
29902
+ groups: [AXPWidgetGroupEnum.BaseWidget],
29576
29903
  type: 'filter',
29577
29904
  components: {},
29578
29905
  options: {
@@ -29645,63 +29972,326 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
29645
29972
  }]
29646
29973
  }] });
29647
29974
 
29975
+ //#region ---- Types ----
29976
+ /** AI agent catalog `name` values that scope {@link AXPGetWidgetsForAIQuery} list/detail rows. */
29977
+ const AXP_WIDGET_AI_AGENT_FORM_LAYOUT = 'widget-form-layout';
29978
+ const AXP_WIDGET_AI_AGENT_CHART_LAYOUT = 'widget-chart-layout';
29979
+ const AXP_WIDGET_AI_AGENT_DASHBOARD_LAYOUT = 'widget-dashboard-layout';
29980
+ const AXP_WIDGET_AI_AGENT_NAMES = [
29981
+ AXP_WIDGET_AI_AGENT_FORM_LAYOUT,
29982
+ AXP_WIDGET_AI_AGENT_CHART_LAYOUT,
29983
+ AXP_WIDGET_AI_AGENT_DASHBOARD_LAYOUT,
29984
+ ];
29985
+ //#endregion
29986
+ //#region ---- Agent scope (catalog filtering) ----
29987
+ const DASHBOARD_WIDGET_NAME_PREFIX = 'DashboardManagement:Widget:Dashboard:';
29988
+ const CHART_BUILDER_SUBCATEGORIES = new Set([
29989
+ 'dashboard-chart-cartesian',
29990
+ 'dashboard-chart-radial',
29991
+ 'dashboard-chart-specialized',
29992
+ ]);
29993
+ function isValidWidgetAiAgent(agent) {
29994
+ return AXP_WIDGET_AI_AGENT_NAMES.includes(agent);
29995
+ }
29996
+ function readSubCategoryNameFromMetadata(metadata) {
29997
+ if (metadata == null) {
29998
+ return undefined;
29999
+ }
30000
+ const raw = metadata['subCategory'];
30001
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
30002
+ return undefined;
30003
+ }
30004
+ const n = raw['name'];
30005
+ return typeof n === 'string' ? n : undefined;
30006
+ }
30007
+ /**
30008
+ * Returns whether a persisted catalog row is visible to the given delegated AI agent.
30009
+ */
30010
+ function matchesWidgetAiAgent(agent, definitionName, metadata) {
30011
+ const isDashboardTile = definitionName.startsWith(DASHBOARD_WIDGET_NAME_PREFIX);
30012
+ const sub = readSubCategoryNameFromMetadata(metadata);
30013
+ const isChartSpecialistSub = sub != null && CHART_BUILDER_SUBCATEGORIES.has(sub);
30014
+ switch (agent) {
30015
+ case AXP_WIDGET_AI_AGENT_FORM_LAYOUT:
30016
+ return !isDashboardTile;
30017
+ case AXP_WIDGET_AI_AGENT_CHART_LAYOUT:
30018
+ return isDashboardTile && isChartSpecialistSub;
30019
+ case AXP_WIDGET_AI_AGENT_DASHBOARD_LAYOUT:
30020
+ return isDashboardTile && !isChartSpecialistSub;
30021
+ default:
30022
+ return false;
30023
+ }
30024
+ }
29648
30025
  //#endregion
29649
30026
  //#region ---- Serialization ----
29650
30027
  const AI_WIDGET_LOCALE = 'en-US';
30028
+ const CATALOG_UNAVAILABLE = 'Widget catalog is not available. Ensure entity definition storage provides AXP_ENTITY_DEFINITION_CRUD_SERVICE.';
30029
+ const AGENT_REQUIRED_ERROR = `Parameter "agent" is required and must be one of: ${AXP_WIDGET_AI_AGENT_NAMES.join(', ')}.`;
30030
+ function invalidAgentErrorMessage(agent) {
30031
+ return `Invalid "agent" value "${agent}". Expected one of: ${AXP_WIDGET_AI_AGENT_NAMES.join(', ')}.`;
30032
+ }
29651
30033
  function resolveWidgetLabelForAi(value) {
29652
30034
  if (value == null || value === '') {
29653
30035
  return '';
29654
30036
  }
29655
30037
  return resolveMultiLanguageString(value, AI_WIDGET_LOCALE);
29656
30038
  }
29657
- function toSerializableComponents(config) {
29658
- const out = {};
29659
- const modes = ['designer', 'view', 'edit', 'print', 'column', 'filter'];
29660
- for (const m of modes) {
29661
- const entry = config.components[m];
29662
- if (entry) {
29663
- out[m] = {
29664
- available: true,
29665
- ...(entry.properties?.length ? { properties: entry.properties } : {}),
29666
- };
30039
+ function parseMetadataJson(metadataJson) {
30040
+ if (metadataJson == null || metadataJson.trim() === '') {
30041
+ return null;
30042
+ }
30043
+ try {
30044
+ const parsed = JSON.parse(metadataJson);
30045
+ return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)
30046
+ ? parsed
30047
+ : null;
30048
+ }
30049
+ catch {
30050
+ return null;
30051
+ }
30052
+ }
30053
+ function readAiTagsFromMetadata(metadata) {
30054
+ if (metadata == null) {
30055
+ return undefined;
30056
+ }
30057
+ const ai = metadata['ai'];
30058
+ if (typeof ai !== 'object' || ai === null) {
30059
+ return undefined;
30060
+ }
30061
+ const tags = ai['tags'];
30062
+ if (!Array.isArray(tags)) {
30063
+ return undefined;
30064
+ }
30065
+ const out = tags.filter((t) => typeof t === 'string');
30066
+ return out.length > 0 ? out : undefined;
30067
+ }
30068
+ function metadataCategoriesToList(metadata) {
30069
+ const raw = metadata?.['categories'];
30070
+ if (raw == null) {
30071
+ return [];
30072
+ }
30073
+ const list = normalizeDefinitionCategories(raw);
30074
+ return list.map((c) => ({
30075
+ name: c.name,
30076
+ title: resolveWidgetLabelForAi(c.title) || c.name,
30077
+ order: c.order,
30078
+ }));
30079
+ }
30080
+ function readInterfaceName(iface) {
30081
+ if (typeof iface !== 'object' || iface === null) {
30082
+ return '';
30083
+ }
30084
+ const n = iface['name'];
30085
+ return typeof n === 'string' ? n : '';
30086
+ }
30087
+ function mapBindingHints(raw) {
30088
+ if (typeof raw !== 'object' || raw === null) {
30089
+ return undefined;
30090
+ }
30091
+ const b = raw;
30092
+ const strategies = Array.isArray(b['strategies'])
30093
+ ? b['strategies'].filter((x) => typeof x === 'string')
30094
+ : undefined;
30095
+ const examples = Array.isArray(b['examples'])
30096
+ ? b['examples'].filter((x) => typeof x === 'string')
30097
+ : undefined;
30098
+ const notes = typeof b['notes'] === 'string' ? b['notes'] : undefined;
30099
+ if (!(strategies?.length ?? 0) && !(examples?.length ?? 0) && notes == null) {
30100
+ return undefined;
30101
+ }
30102
+ return {
30103
+ ...(strategies?.length ? { strategies } : {}),
30104
+ ...(examples?.length ? { examples } : {}),
30105
+ ...(notes != null ? { notes } : {}),
30106
+ };
30107
+ }
30108
+ function mapInputsForAi(rows) {
30109
+ if (!Array.isArray(rows)) {
30110
+ return [];
30111
+ }
30112
+ const out = [];
30113
+ for (const row of rows) {
30114
+ if (typeof row !== 'object' || row === null) {
30115
+ continue;
30116
+ }
30117
+ const r = row;
30118
+ const name = typeof r['name'] === 'string' ? r['name'] : '';
30119
+ if (!name) {
30120
+ continue;
29667
30121
  }
30122
+ const titleRaw = r['title'];
30123
+ const title = typeof titleRaw === 'string' ? resolveWidgetLabelForAi(titleRaw) || titleRaw : name;
30124
+ const descRaw = r['description'];
30125
+ const description = descRaw != null && typeof descRaw === 'string' && descRaw !== ''
30126
+ ? resolveWidgetLabelForAi(descRaw) || descRaw
30127
+ : undefined;
30128
+ const interfaceWidgetName = readInterfaceName(r['interface']);
30129
+ const bindingHints = mapBindingHints(r['bindingHints']);
30130
+ out.push({
30131
+ name,
30132
+ title,
30133
+ ...(description != null ? { description } : {}),
30134
+ interfaceWidgetName,
30135
+ ...(bindingHints != null ? { bindingHints } : {}),
30136
+ });
29668
30137
  }
29669
30138
  return out;
29670
30139
  }
29671
- function toSerializableWidget(config) {
30140
+ function mapOutputsForAi(rows) {
30141
+ if (!Array.isArray(rows)) {
30142
+ return [];
30143
+ }
30144
+ const out = [];
30145
+ for (const row of rows) {
30146
+ if (typeof row !== 'object' || row === null) {
30147
+ continue;
30148
+ }
30149
+ const r = row;
30150
+ const name = typeof r['name'] === 'string' ? r['name'] : '';
30151
+ if (!name) {
30152
+ continue;
30153
+ }
30154
+ const titleRaw = r['title'];
30155
+ const title = typeof titleRaw === 'string' ? resolveWidgetLabelForAi(titleRaw) || titleRaw : name;
30156
+ const descRaw = r['description'];
30157
+ const description = descRaw != null && typeof descRaw === 'string' && descRaw !== ''
30158
+ ? resolveWidgetLabelForAi(descRaw) || descRaw
30159
+ : undefined;
30160
+ const interfaceWidgetName = readInterfaceName(r['interface']);
30161
+ out.push({
30162
+ name,
30163
+ title,
30164
+ ...(description != null ? { description } : {}),
30165
+ interfaceWidgetName,
30166
+ });
30167
+ }
30168
+ return out;
30169
+ }
30170
+ function mapAiBlockForAi(raw) {
30171
+ if (typeof raw !== 'object' || raw === null) {
30172
+ return undefined;
30173
+ }
30174
+ const a = raw;
30175
+ const shortDescription = typeof a['shortDescription'] === 'string'
30176
+ ? resolveWidgetLabelForAi(a['shortDescription']) || a['shortDescription']
30177
+ : undefined;
30178
+ const instruction = typeof a['instruction'] === 'string'
30179
+ ? resolveWidgetLabelForAi(a['instruction']) || a['instruction']
30180
+ : undefined;
30181
+ const tags = Array.isArray(a['tags'])
30182
+ ? a['tags'].filter((t) => typeof t === 'string')
30183
+ : undefined;
30184
+ let usage;
30185
+ const usageRaw = a['usage'];
30186
+ if (typeof usageRaw === 'object' && usageRaw !== null) {
30187
+ const u = usageRaw;
30188
+ const whenToUse = Array.isArray(u['whenToUse'])
30189
+ ? u['whenToUse']
30190
+ .map((x) => (typeof x === 'string' ? resolveWidgetLabelForAi(x) || x : ''))
30191
+ .filter((s) => s !== '')
30192
+ : undefined;
30193
+ const avoidWhen = Array.isArray(u['avoidWhen'])
30194
+ ? u['avoidWhen']
30195
+ .map((x) => (typeof x === 'string' ? resolveWidgetLabelForAi(x) || x : ''))
30196
+ .filter((s) => s !== '')
30197
+ : undefined;
30198
+ const followUpTools = Array.isArray(u['followUpTools'])
30199
+ ? u['followUpTools'].filter((x) => typeof x === 'string')
30200
+ : undefined;
30201
+ if ((whenToUse?.length ?? 0) > 0 || (avoidWhen?.length ?? 0) > 0 || (followUpTools?.length ?? 0) > 0) {
30202
+ usage = {
30203
+ ...(whenToUse?.length ? { whenToUse } : {}),
30204
+ ...(avoidWhen?.length ? { avoidWhen } : {}),
30205
+ ...(followUpTools?.length ? { followUpTools } : {}),
30206
+ };
30207
+ }
30208
+ }
30209
+ let renderSurfaces;
30210
+ const renderSurfacesRaw = a['renderSurfaces'];
30211
+ if (Array.isArray(renderSurfacesRaw)) {
30212
+ const mapped = renderSurfacesRaw
30213
+ .filter((x) => typeof x === 'object' && x !== null)
30214
+ .map((x) => ({
30215
+ mode: typeof x['mode'] === 'string' ? x['mode'] : '',
30216
+ summary: typeof x['summary'] === 'string'
30217
+ ? resolveWidgetLabelForAi(x['summary']) || x['summary']
30218
+ : '',
30219
+ }))
30220
+ .filter((x) => x.mode !== '' && x.summary !== '');
30221
+ renderSurfaces = mapped.length > 0 ? mapped : undefined;
30222
+ }
30223
+ const relatedWidgetNames = Array.isArray(a['relatedWidgetNames'])
30224
+ ? a['relatedWidgetNames'].filter((x) => typeof x === 'string')
30225
+ : undefined;
30226
+ const layoutExamples = Array.isArray(a['layoutExamples'])
30227
+ ? a['layoutExamples'].filter((x) => typeof x === 'string')
30228
+ : undefined;
30229
+ if (shortDescription == null &&
30230
+ instruction == null &&
30231
+ !(tags?.length ?? 0) &&
30232
+ usage == null &&
30233
+ renderSurfaces == null &&
30234
+ !(relatedWidgetNames?.length ?? 0) &&
30235
+ !(layoutExamples?.length ?? 0)) {
30236
+ return undefined;
30237
+ }
30238
+ return {
30239
+ ...(shortDescription != null ? { shortDescription } : {}),
30240
+ ...(instruction != null ? { instruction } : {}),
30241
+ ...(tags?.length ? { tags } : {}),
30242
+ ...(usage != null ? { usage } : {}),
30243
+ ...(renderSurfaces != null ? { renderSurfaces } : {}),
30244
+ ...(relatedWidgetNames?.length ? { relatedWidgetNames } : {}),
30245
+ ...(layoutExamples?.length ? { layoutExamples } : {}),
30246
+ };
30247
+ }
30248
+ function subCategoryToRow(raw) {
30249
+ if (typeof raw !== 'object' || raw === null) {
30250
+ return undefined;
30251
+ }
30252
+ const c = raw;
30253
+ if (typeof c.name !== 'string') {
30254
+ return undefined;
30255
+ }
30256
+ return {
30257
+ name: c.name,
30258
+ title: resolveWidgetLabelForAi(c.title) || c.name,
30259
+ order: c.order,
30260
+ };
30261
+ }
30262
+ function buildStructuredWidgetForAi(raw, ctx) {
30263
+ const name = typeof raw['name'] === 'string' ? raw['name'] : ctx.fallbackName;
30264
+ const icon = typeof raw['icon'] === 'string' ? raw['icon'] : undefined;
30265
+ const type = typeof raw['type'] === 'string' ? raw['type'] : undefined;
30266
+ const capabilities = Array.isArray(raw['capabilities'])
30267
+ ? raw['capabilities'].filter((c) => typeof c === 'string')
30268
+ : undefined;
30269
+ const groups = Array.isArray(raw['groups'])
30270
+ ? raw['groups'].filter((g) => typeof g === 'string')
30271
+ : undefined;
30272
+ const defaultFilterWidgetName = typeof raw['defaultFilterWidgetName'] === 'string' ? raw['defaultFilterWidgetName'] : undefined;
30273
+ const categories = metadataCategoriesToList(raw);
30274
+ const subCategory = subCategoryToRow(raw['subCategory']);
29672
30275
  return {
29673
- name: String(config.name),
29674
- ...(config.alias != null ? { alias: config.alias } : {}),
29675
- title: resolveWidgetLabelForAi(config.title) || String(config.name),
29676
- ...(config.icon != null ? { icon: config.icon } : {}),
29677
- ...(config.description != null ? { description: resolveWidgetLabelForAi(config.description) || undefined } : {}),
29678
- ...(config.aiDescription != null && config.aiDescription !== '' ? { aiDescription: config.aiDescription } : {}),
29679
- categories: normalizeWidgetCategories(config.categories).map((c) => ({
29680
- name: c.name,
29681
- title: resolveWidgetLabelForAi(c.title) || c.name,
29682
- order: c.order,
29683
- })),
29684
- ...(config.groups?.length ? { groups: config.groups } : {}),
29685
- type: config.type,
29686
- ...(config.properties?.length ? { properties: config.properties } : {}),
29687
- components: toSerializableComponents(config),
29688
- ...(config.meta != null ? { meta: config.meta } : {}),
29689
- ...(config.designer != null ? { designer: config.designer } : {}),
29690
- ...(config.options != null ? { options: config.options } : {}),
29691
- ...(config.defaultFilterWidgetName != null ? { defaultFilterWidgetName: config.defaultFilterWidgetName } : {}),
29692
- ...(config.aiCatalog != null ? { aiCatalog: config.aiCatalog } : {}),
30276
+ name,
30277
+ title: ctx.resolvedTitle,
30278
+ ...(ctx.resolvedDescription != null ? { description: ctx.resolvedDescription } : {}),
30279
+ ...(icon != null ? { icon } : {}),
30280
+ ...(type != null ? { type } : {}),
30281
+ ...(capabilities?.length ? { capabilities } : {}),
30282
+ categories,
30283
+ ...(subCategory != null ? { subCategory } : {}),
30284
+ ...(groups?.length ? { groups } : {}),
30285
+ ...(defaultFilterWidgetName != null ? { defaultFilterWidgetName } : {}),
30286
+ inputs: mapInputsForAi(raw['inputs']),
30287
+ outputs: mapOutputsForAi(raw['outputs']),
30288
+ ai: mapAiBlockForAi(raw['ai']),
29693
30289
  };
29694
30290
  }
29695
- function buildUsage(config) {
29696
- const propertyPaths = [
29697
- ...new Set((config.properties ?? [])
29698
- .map((p) => p.schema?.interface?.path)
29699
- .filter((p) => typeof p === 'string' && p.length > 0)),
29700
- ];
29701
- const summary = [
29702
- resolveWidgetLabelForAi(config.title),
29703
- config.aiDescription ?? resolveWidgetLabelForAi(config.description),
29704
- ]
30291
+ function buildUsageFromStructured(structured) {
30292
+ const propertyPaths = [...new Set(structured.inputs.map((i) => i.name).filter((n) => n.length > 0))];
30293
+ const instruction = structured.ai?.instruction ?? '';
30294
+ const summary = [structured.title, structured.description, instruction]
29705
30295
  .filter((s) => s != null && s !== '')
29706
30296
  .join(' — ');
29707
30297
  return {
@@ -29712,44 +30302,93 @@ function buildUsage(config) {
29712
30302
  //#endregion
29713
30303
  //#region ---- Query ----
29714
30304
  /**
29715
- * Read-only catalog of widgets suitable for AI structured rendering (Widgets:GetForAI).
30305
+ * Read-only widget catalog for AI (`Widgets:GetForAI`). Data comes from persisted widget definitions
30306
+ * (Dexie/Firestore via {@link AXPEntityDefinitionCrudService}), not {@link AXPWidgetRegistryService}.
29716
30307
  */
29717
30308
  class AXPGetWidgetsForAIQuery {
29718
30309
  constructor() {
29719
- this.registry = inject(AXPWidgetRegistryService);
30310
+ this.crud = inject(AXP_ENTITY_DEFINITION_CRUD_SERVICE, { optional: true });
29720
30311
  }
29721
30312
  async fetch(input) {
29722
- const name = input?.name?.trim();
29723
- if (!name) {
29724
- const list = this.registry
29725
- .all()
29726
- .filter((w) => isWidgetAiCatalogIncluded(w))
29727
- .map((w) => ({
29728
- name: String(w.name),
29729
- title: resolveWidgetLabelForAi(w.title) || String(w.name),
29730
- ...(w.description != null ? { description: resolveWidgetLabelForAi(w.description) || undefined } : {}),
29731
- ...(w.aiDescription != null && w.aiDescription !== '' ? { aiDescription: w.aiDescription } : {}),
29732
- type: w.type,
29733
- categories: normalizeWidgetCategories(w.categories).map((c) => ({
29734
- name: c.name,
29735
- title: resolveWidgetLabelForAi(c.title) || c.name,
29736
- order: c.order,
29737
- })),
29738
- }));
29739
- return { success: true, widgets: list };
30313
+ if (!this.crud) {
30314
+ return { success: false, error: CATALOG_UNAVAILABLE };
30315
+ }
30316
+ const agentRaw = typeof input?.agent === 'string' ? input.agent.trim() : '';
30317
+ if (!agentRaw) {
30318
+ return { success: false, error: AGENT_REQUIRED_ERROR };
29740
30319
  }
30320
+ if (!isValidWidgetAiAgent(agentRaw)) {
30321
+ return { success: false, error: invalidAgentErrorMessage(agentRaw) };
30322
+ }
30323
+ const agent = agentRaw;
30324
+ const name = input?.name?.trim();
29741
30325
  try {
29742
- const config = this.registry.resolve(name);
29743
- if (!isWidgetAiCatalogIncluded(config)) {
30326
+ const rows = await this.crud.listWidgets();
30327
+ const activeRows = rows.filter((r) => r.definition.active !== false);
30328
+ if (!name) {
30329
+ const scopedRows = activeRows.filter((row) => {
30330
+ const meta = parseMetadataJson(row.definition.metadataJson);
30331
+ return matchesWidgetAiAgent(agent, row.definition.name, meta);
30332
+ });
30333
+ const list = scopedRows.map((row) => {
30334
+ const meta = parseMetadataJson(row.definition.metadataJson);
30335
+ const titleRaw = row.definition.catalogTitle ??
30336
+ (typeof meta?.['title'] === 'string' ? meta['title'] : undefined) ??
30337
+ row.definition.name;
30338
+ const title = resolveWidgetLabelForAi(titleRaw) || row.definition.name;
30339
+ const descRaw = row.definition.description ?? (typeof meta?.['description'] === 'string' ? meta['description'] : undefined);
30340
+ const description = descRaw != null && descRaw !== '' ? resolveWidgetLabelForAi(descRaw) || undefined : undefined;
30341
+ const tags = readAiTagsFromMetadata(meta);
30342
+ return {
30343
+ name: row.definition.name,
30344
+ title,
30345
+ ...(description != null ? { description } : {}),
30346
+ ...(typeof meta?.['type'] === 'string' ? { type: meta['type'] } : {}),
30347
+ ...(tags != null ? { tags } : {}),
30348
+ categories: metadataCategoriesToList(meta),
30349
+ };
30350
+ });
30351
+ return { success: true, widgets: list };
30352
+ }
30353
+ const match = activeRows.find((r) => r.definition.name === name);
30354
+ if (!match) {
29744
30355
  return {
29745
30356
  success: false,
29746
- error: `Widget "${name}" is not available for the AI widget catalog.`,
30357
+ error: `Widget "${name}" was not found in the catalog.`,
29747
30358
  };
29748
30359
  }
30360
+ const meta = parseMetadataJson(match.definition.metadataJson);
30361
+ if (!matchesWidgetAiAgent(agent, match.definition.name, meta)) {
30362
+ return {
30363
+ success: false,
30364
+ error: `Widget "${name}" is not available for agent "${agent}".`,
30365
+ };
30366
+ }
30367
+ const metadata = meta ?? {};
30368
+ const titleRaw = match.definition.catalogTitle ??
30369
+ (typeof metadata['title'] === 'string' ? metadata['title'] : undefined) ??
30370
+ match.definition.name;
30371
+ const title = resolveWidgetLabelForAi(titleRaw) || match.definition.name;
30372
+ const descRaw = match.definition.description ??
30373
+ (typeof metadata['description'] === 'string' ? metadata['description'] : undefined);
30374
+ const description = descRaw != null && descRaw !== '' ? resolveWidgetLabelForAi(descRaw) || undefined : undefined;
30375
+ const structured = buildStructuredWidgetForAi(metadata, {
30376
+ fallbackName: match.definition.name,
30377
+ resolvedTitle: title,
30378
+ resolvedDescription: description,
30379
+ });
30380
+ const detail = {
30381
+ id: match.id,
30382
+ active: match.definition.active,
30383
+ title,
30384
+ ...(description != null ? { description } : {}),
30385
+ ...(match.definition.catalogTitle != null ? { catalogTitle: match.definition.catalogTitle } : {}),
30386
+ structured,
30387
+ };
29749
30388
  return {
29750
30389
  success: true,
29751
- detail: toSerializableWidget(config),
29752
- usage: buildUsage(config),
30390
+ detail,
30391
+ usage: buildUsageFromStructured(structured),
29753
30392
  };
29754
30393
  }
29755
30394
  catch (e) {
@@ -29770,12 +30409,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
29770
30409
 
29771
30410
  var getWidgetsForAi_query = /*#__PURE__*/Object.freeze({
29772
30411
  __proto__: null,
29773
- AXPGetWidgetsForAIQuery: AXPGetWidgetsForAIQuery
30412
+ AXPGetWidgetsForAIQuery: AXPGetWidgetsForAIQuery,
30413
+ AXP_WIDGET_AI_AGENT_CHART_LAYOUT: AXP_WIDGET_AI_AGENT_CHART_LAYOUT,
30414
+ AXP_WIDGET_AI_AGENT_DASHBOARD_LAYOUT: AXP_WIDGET_AI_AGENT_DASHBOARD_LAYOUT,
30415
+ AXP_WIDGET_AI_AGENT_FORM_LAYOUT: AXP_WIDGET_AI_AGENT_FORM_LAYOUT,
30416
+ AXP_WIDGET_AI_AGENT_NAMES: AXP_WIDGET_AI_AGENT_NAMES,
30417
+ matchesWidgetAiAgent: matchesWidgetAiAgent
29774
30418
  });
29775
30419
 
29776
30420
  /**
29777
30421
  * Generated bundle index. Do not edit.
29778
30422
  */
29779
30423
 
29780
- export { AXPAddressWidget, AXPAddressWidgetColumnComponent, AXPAddressWidgetEditComponent, AXPAddressWidgetService, AXPAddressWidgetViewComponent, AXPAdvancedGridItemWidget, AXPAdvancedGridItemWidgetDesignerComponent, AXPAdvancedGridItemWidgetViewComponent, AXPAdvancedGridOptionsWidget, AXPAdvancedGridOptionsWidgetEditComponent, AXPAdvancedGridWidget, AXPAdvancedGridWidgetDesignerComponent, AXPAdvancedGridWidgetViewComponent, AXPAvatarWidget, AXPAvatarWidgetColumnComponent, AXPAvatarWidgetDesignerComponent, AXPAvatarWidgetEditComponent, AXPAvatarWidgetViewComponent, AXPBetweenExpressionValidationWidget, AXPBetweenValidationWidgetEditComponent, AXPBlockWidget, AXPBlockWidgetDesignerComponent, AXPBlockWidgetViewComponent, AXPBorderWidget, AXPBorderWidgetEditComponent, AXPButtonWidget, AXPButtonWidgetColumnComponent, AXPButtonWidgetViewComponent, AXPCallbackValidationWidget, AXPCallbackValidationWidgetEditComponent, AXPCheckBoxWidget, AXPCheckBoxWidgetColumnComponent, AXPCheckBoxWidgetDesignerComponent, AXPCheckBoxWidgetEditComponent, AXPCheckBoxWidgetViewComponent, AXPCodeEditorWidget, AXPCodeEditorWidgetColumnComponent, AXPCodeEditorWidgetEditComponent, AXPCodeEditorWidgetViewComponent, AXPColorBoxWidget, AXPColorBoxWidgetColumnComponent, AXPColorBoxWidgetDesignerComponent, AXPColorBoxWidgetEditComponent, AXPColorBoxWidgetViewComponent, AXPColorPaletteWidget, AXPColorPaletteWidgetColumnComponent, AXPColorPaletteWidgetDesignerComponent, AXPColorPaletteWidgetEditComponent, AXPColorPaletteWidgetViewComponent, AXPConditionBuilderWidget, AXPConditionBuilderWidgetEditComponent, AXPConditionBuilderWidgetViewComponent, AXPConnectedDragDropListsWidget, AXPConnectedListsWidgetColumnComponent, AXPConnectedListsWidgetEditComponent, AXPConnectedListsWidgetViewComponent, AXPContactWidget, AXPContactWidgetColumnComponent, AXPContactWidgetEditComponent, AXPContactWidgetViewComponent, AXPDataListWidget, AXPDataListWidgetViewComponent, AXPDataSourceOptionsWidget, AXPDataSourceOptionsWidgetEditComponent, AXPDateTimeBoxWidget, AXPDateTimeBoxWidgetColumnComponent, AXPDateTimeBoxWidgetEditComponent, AXPDateTimeBoxWidgetViewComponent, AXPDirectionWidget, AXPDirectionWidgetEditComponent, AXPDragDropListWidget, AXPEditFileUploaderCommand, AXPEditorJsWidget, AXPEditorJsWidgetColumnComponent, AXPEditorJsWidgetEditComponent, AXPEditorJsWidgetViewComponent, AXPEqualValidationWidget, AXPEqualValidationWidgetEditComponent, AXPFieldsetWidget, AXPFieldsetWidgetDesignerComponent, AXPFieldsetWidgetViewComponent, AXPFileListComponent, AXPFileUploaderWidget, AXPFileUploaderWidgetColumnComponent, AXPFileUploaderWidgetEditComponent, AXPFileUploaderWidgetService, AXPFileUploaderWidgetViewComponent, AXPFlexItemOptionsWidget, AXPFlexItemOptionsWidgetEditComponent, AXPFlexItemWidget, AXPFlexItemWidgetDesignerComponent, AXPFlexItemWidgetViewComponent, AXPFlexOptionsWidget, AXPFlexOptionsWidgetEditComponent, AXPFlexWidget, AXPFlexWidgetDesignerComponent, AXPFlexWidgetViewComponent, AXPGalleryWidget, AXPGalleryWidgetEditComponent, AXPGalleryWidgetViewComponent, AXPGetWidgetsForAIQuery, AXPGreaterThanExpressionValidationWidget, AXPGreaterThanValidationWidgetEditComponent, AXPGridItemOptionsWidget, AXPGridItemOptionsWidgetEditComponent, AXPGridOptionsWidget, AXPGridOptionsWidgetEditComponent, AXPImageMarkerPopupComponent, AXPImageMarkerWidget, AXPImageMarkerWidgetColumnComponent, AXPImageMarkerWidgetEditComponent, AXPImageMarkerWidgetViewComponent, AXPItemConfiguratorWidget, AXPItemConfiguratorWidgetColumnComponent, AXPItemConfiguratorWidgetEditComponent, AXPJsonViewerWidget, AXPJsonViewerWidgetEditComponent, AXPJsonViewerWidgetViewComponent, AXPLargeTextWidget, AXPLargeTextWidgetColumnComponent, AXPLargeTextWidgetEditComponent, AXPLargeTextWidgetViewComponent, AXPLessThanExpressionValidationWidget, AXPLessThanValidationWidgetEditComponent, AXPListWidgetColumnComponent, AXPListWidgetEditComponent, AXPListWidgetViewComponent, AXPMapWidgetEditComponent, AXPMapWidgetViewComponent, AXPMaxLengthExpressionValidationWidget, AXPMaxLengthValidationWidgetEditComponent, AXPMinLengthExpressionValidationWidget, AXPMinLengthValidationWidgetEditComponent, AXPNumberBoxWidget, AXPNumberBoxWidgetColumnComponent, AXPNumberBoxWidgetEditComponent, AXPNumberBoxWidgetViewComponent, AXPPageWidget, AXPPageWidgetViewComponent, AXPPasswordBoxWidget, AXPPasswordBoxWidgetColumnComponent, AXPPasswordBoxWidgetEditComponent, AXPPasswordBoxWidgetViewComponent, AXPProgressBarWidget, AXPProgressBarWidgetColumnComponent, AXPProgressBarWidgetEditComponent, AXPProgressBarWidgetViewComponent, AXPProviderSelectWidgetColumnComponent, AXPProviderSelectWidgetEditBase, AXPProviderSelectWidgetViewComponent, AXPQrcodeWidget, AXPQrcodeWidgetColumnComponent, AXPQrcodeWidgetEditComponent, AXPQrcodeWidgetViewComponent, AXPRatePickerWidget, AXPRatePickerWidgetColumnComponent, AXPRatePickerWidgetEditComponent, AXPRatePickerWidgetViewComponent, AXPRegularExpressionValidationWidget, AXPRegularExpressionValidationWidgetEditComponent, AXPRepeaterWidget, AXPRepeaterWidgetDesignerComponent, AXPRepeaterWidgetEditComponent, AXPRepeaterWidgetViewComponent, AXPRequiredValidationWidget, AXPRequiredValidationWidgetEditComponent, AXPRichTextWidget, AXPRichTextWidgetColumnComponent, AXPRichTextWidgetEditComponent, AXPRichTextWidgetViewComponent, AXPSchedulerPickerWidget, AXPSchedulerPickerWidgetColumnComponent, AXPSchedulerPickerWidgetEditComponent, AXPSchedulerPickerWidgetViewComponent, AXPSelectBoxWidget, AXPSelectBoxWidgetColumnComponent, AXPSelectBoxWidgetEditComponent, AXPSelectBoxWidgetViewComponent, AXPSelectLanguagePopup, AXPSelectionListWidget, AXPSelectionListWidgetColumnComponent, AXPSelectionListWidgetDesignerComponent, AXPSelectionListWidgetEditComponent, AXPSelectionListWidgetViewComponent, AXPSignatureWidget, AXPSignatureWidgetColumnComponent, AXPSignatureWidgetEditComponent, AXPSignatureWidgetViewComponent, AXPSpacingWidget, AXPSpacingWidgetEditComponent, AXPStatusChipComponent, AXPStatusWidget, AXPStatusWidgetColumnComponent, AXPStatusWidgetEditComponent, AXPStatusWidgetViewComponent, AXPStepWizardWidget, AXPStepWizardWidgetViewComponent, AXPStopwatchWidget, AXPStopwatchWidgetViewComponent, AXPTableItemWidget, AXPTableItemWidgetDesignerComponent, AXPTableItemWidgetViewComponent, AXPTableWidget, AXPTableWidgetDesignerComponent, AXPTableWidgetViewComponent, AXPTagEditorWidget, AXPTagEditorWidgetColumnComponent, AXPTagEditorWidgetEditComponent, AXPTagEditorWidgetViewComponent, AXPTemplateBoxWidget, AXPTemplateBoxWidgetColumnComponent, AXPTemplateBoxWidgetEditComponent, AXPTemplateBoxWidgetPrintComponent, AXPTemplateBoxWidgetViewComponent, AXPTextBoxWidget, AXPTextBoxWidgetColumnComponent, AXPTextBoxWidgetEditComponent, AXPTextBoxWidgetViewComponent, AXPToggleWidget, AXPToggleWidgetColumnComponent, AXPToggleWidgetEditComponent, AXPToggleWidgetViewComponent, AXPWidgetFieldConfiguratorWidget, AXPWidgetFieldConfiguratorWidgetColumnComponent, AXPWidgetFieldConfiguratorWidgetEditComponent, AXPWidgetsModule, AXP_ABSOLUTE_UNITS, AXP_ALLOW_CLEAR_PROPERTY, AXP_ALLOW_MULTIPLE_PROPERTY, AXP_ALLOW_SEARCH_PROPERTY, AXP_ANIMATION_PROPERTY_GROUP, AXP_APPEARANCE_PROPERTY_GROUP, AXP_BEHAVIOR_PROPERTY_GROUP, AXP_BETWEEN_VALIDATION_PROPERTY, AXP_BG_COLOR_PROPERTY, AXP_BORDER_RADIUS_UNITS, AXP_BORDER_WIDTH_UNITS, AXP_BOX_MODEL_PROPERTY_GROUP, AXP_CALLBACK_VALIDATION_PROPERTY, AXP_COLOR_PROPERTY, AXP_CONTENT_PROPERTY, AXP_DATA_LIST_CMD_DELETE, AXP_DATA_LIST_CMD_EDIT, AXP_DATA_LIST_PENDING_DELETE_KEY, AXP_DATA_PATH_PROPERTY, AXP_DATA_PROPERTY_GROUP, AXP_DATA_SOURCE_OPTIONS_PROPERTY, AXP_DATE_FORMAT_PROPERTY, AXP_DEFAULT_ROW_COUNT_PROPERTY, AXP_DESCRIPTION_PROPERTY, AXP_DIRECTION_PROPERTY, AXP_DISABLED_PROPERTY, AXP_DOWNLOADABLE_PROPERTY, AXP_EQUAL_VALIDATION_PROPERTY, AXP_FALSY_TEXT_PROPERTY, AXP_FIT_LINE_COUNT_PROPERTY, AXP_FONT_SIZE_PROPERTY, AXP_Flex_Box_Align_Options, AXP_Flex_Box_Alignments, AXP_Flex_Box_Justify_Options, AXP_GREATER_THAN_VALIDATION_PROPERTY, AXP_Grid_Box_Align_Items_Options, AXP_Grid_Box_Alignments, AXP_Grid_Box_Justify_Items_Options, AXP_HAS_CLEAR_BUTTON_PROPERTY, AXP_HAS_COPY_ICON_PROPERTY, AXP_HAS_EYE_ICON_PROPERTY, AXP_HAS_ICON_PROPERTY, AXP_HAS_LABEL_PROPERTY, AXP_ICON_PROPERTY, AXP_IS_LOADING_PROPERTY, AXP_LABEL_PROPERTY, AXP_LAYOUT_ADVANCED_GRID_PROPERTY, AXP_LAYOUT_BORDER_PROPERTY, AXP_LAYOUT_COLUMNS_PROPERTY, AXP_LAYOUT_DIRECTION_PROPERTY, AXP_LAYOUT_FLEX_ITEM_PROPERTY, AXP_LAYOUT_FLEX_PROPERTY, AXP_LAYOUT_FLEX_PROPERTY_GROUP, AXP_LAYOUT_GAP_PROPERTY, AXP_LAYOUT_GRID_ITEM_PROPERTY, AXP_LAYOUT_GRID_PROPERTIES, AXP_LAYOUT_GRID_PROPERTY, AXP_LAYOUT_GRID_PROPERTY_GROUP, AXP_LAYOUT_GRID_ROW_PROPERTIES, AXP_LAYOUT_ROWS_PROPERTY, AXP_LAYOUT_SHOW_HEADER_PROPERTY, AXP_LAYOUT_SPACING_PROPERTY, AXP_LAYOUT_TABLE_PROPERTY_GROUP, AXP_LESS_THAN_VALIDATION_PROPERTY, AXP_MAX_LENGTH_VALIDATION_PROPERTY, AXP_MAX_LINE_COUNT_PROPERTY, AXP_MIN_LENGTH_VALIDATION_PROPERTY, AXP_MIN_LINE_COUNT_PROPERTY, AXP_MULTI_LANGUAGE_PROPERTY, AXP_NAME_PROPERTY, AXP_NUMBER_SEPARATOR_PROPERTY, AXP_PLACEHOLDER_PROPERTY, AXP_READONLY_PROPERTY, AXP_REGULAR_EXPRESSION_VALIDATION_PROPERTY, AXP_RELATIVE_UNITS, AXP_RELATIVE_UNITS_NO_PERCENT, AXP_REQUIRED_VALIDATION_PROPERTY, AXP_ROW_EXPR_PREFIX, AXP_SHOW_PASSWORD_PROPERTY, AXP_SPACING_UNITS, AXP_SPIN_BUTTON_PROPERTY, AXP_STYLE_COLOR_PROPERTY, AXP_STYLE_LOOK_PROPERTY, AXP_STYLING_PROPERTY_GROUP, AXP_TABLE_COLUMNS_PROPERTY, AXP_TABLE_COLUMN_HEIGHT_PROPERTY, AXP_TABLE_COLUMN_WIDTH_PROPERTY, AXP_TABLE_ITEM_COLSPAN_PROPERTY, AXP_TABLE_ITEM_ROWSPAN_PROPERTY, AXP_TEXT_ALIGN_PROPERTY, AXP_TEXT_FIELD_PROPERTY, AXP_TEXT_PROPERTY, AXP_THEME_PROPERTY, AXP_TITLE_PROPERTY, AXP_TRIGGERS_PROPERTY, AXP_TRIGGERS_PROPERTY_GROUP, AXP_TRULY_TEXT_PROPERTY, AXP_VALIDATION_PROPERTY_GROUP, AXP_VALUE_FIELD_PROPERTY, AXP_VERTICAL_ALIGN_PROPERTY, AXP_WIDGET_PROPERTY_GROUP, AXP_default_Border_Box_Units, AXP_default_Border_Box_Value, AXP_default_Spacing_Box_Units, AXP_default_Spacing_Box_Value, DEFAULT_STRATEGY_CONFIG, STRATEGY_CONFIG_TOKEN, booleanDefaultProperty, largeTextDefaultProperty, numberDefaultProperty, numberMaxValueProperty, numberMinValueProperty, plainTextDefaultProperty, richTextDefaultProperty, selectEditorDefaultValueProperty, selectionListEditorDefaultValueProperty };
30424
+ export { AXPAddressWidget, AXPAddressWidgetColumnComponent, AXPAddressWidgetEditComponent, AXPAddressWidgetService, AXPAddressWidgetViewComponent, AXPAdvancedGridItemWidget, AXPAdvancedGridItemWidgetDesignerComponent, AXPAdvancedGridItemWidgetViewComponent, AXPAdvancedGridOptionsWidget, AXPAdvancedGridOptionsWidgetEditComponent, AXPAdvancedGridWidget, AXPAdvancedGridWidgetDesignerComponent, AXPAdvancedGridWidgetViewComponent, AXPAvatarWidget, AXPAvatarWidgetColumnComponent, AXPAvatarWidgetDesignerComponent, AXPAvatarWidgetEditComponent, AXPAvatarWidgetViewComponent, AXPBetweenExpressionValidationWidget, AXPBetweenValidationWidgetEditComponent, AXPBlockWidget, AXPBlockWidgetDesignerComponent, AXPBlockWidgetViewComponent, AXPBorderWidget, AXPBorderWidgetEditComponent, AXPButtonWidget, AXPButtonWidgetColumnComponent, AXPButtonWidgetViewComponent, AXPCallbackValidationWidget, AXPCallbackValidationWidgetEditComponent, AXPCheckBoxWidget, AXPCheckBoxWidgetColumnComponent, AXPCheckBoxWidgetDesignerComponent, AXPCheckBoxWidgetEditComponent, AXPCheckBoxWidgetViewComponent, AXPCodeEditorWidget, AXPCodeEditorWidgetColumnComponent, AXPCodeEditorWidgetEditComponent, AXPCodeEditorWidgetViewComponent, AXPColorBoxWidget, AXPColorBoxWidgetColumnComponent, AXPColorBoxWidgetDesignerComponent, AXPColorBoxWidgetEditComponent, AXPColorBoxWidgetViewComponent, AXPColorPaletteWidget, AXPColorPaletteWidgetColumnComponent, AXPColorPaletteWidgetDesignerComponent, AXPColorPaletteWidgetEditComponent, AXPColorPaletteWidgetViewComponent, AXPConditionBuilderWidget, AXPConditionBuilderWidgetEditComponent, AXPConditionBuilderWidgetViewComponent, AXPConnectedDragDropListsWidget, AXPConnectedListsWidgetColumnComponent, AXPConnectedListsWidgetEditComponent, AXPConnectedListsWidgetViewComponent, AXPContactWidget, AXPContactWidgetColumnComponent, AXPContactWidgetEditComponent, AXPContactWidgetViewComponent, AXPDataListWidget, AXPDataListWidgetViewComponent, AXPDataSourceOptionsWidget, AXPDataSourceOptionsWidgetEditComponent, AXPDateTimeBoxWidget, AXPDateTimeBoxWidgetColumnComponent, AXPDateTimeBoxWidgetEditComponent, AXPDateTimeBoxWidgetViewComponent, AXPDirectionWidget, AXPDirectionWidgetEditComponent, AXPDragDropListWidget, AXPEditFileUploaderCommand, AXPEditorJsWidget, AXPEditorJsWidgetColumnComponent, AXPEditorJsWidgetEditComponent, AXPEditorJsWidgetViewComponent, AXPEqualValidationWidget, AXPEqualValidationWidgetEditComponent, AXPFieldsetWidget, AXPFieldsetWidgetDesignerComponent, AXPFieldsetWidgetViewComponent, AXPFileListComponent, AXPFileUploaderWidget, AXPFileUploaderWidgetColumnComponent, AXPFileUploaderWidgetEditComponent, AXPFileUploaderWidgetService, AXPFileUploaderWidgetViewComponent, AXPFlexItemOptionsWidget, AXPFlexItemOptionsWidgetEditComponent, AXPFlexItemWidget, AXPFlexItemWidgetDesignerComponent, AXPFlexItemWidgetViewComponent, AXPFlexOptionsWidget, AXPFlexOptionsWidgetEditComponent, AXPFlexWidget, AXPFlexWidgetDesignerComponent, AXPFlexWidgetViewComponent, AXPGalleryWidget, AXPGalleryWidgetEditComponent, AXPGalleryWidgetViewComponent, AXPGetWidgetsForAIQuery, AXPGreaterThanExpressionValidationWidget, AXPGreaterThanValidationWidgetEditComponent, AXPGridItemOptionsWidget, AXPGridItemOptionsWidgetEditComponent, AXPGridOptionsWidget, AXPGridOptionsWidgetEditComponent, AXPImageMarkerPopupComponent, AXPImageMarkerWidget, AXPImageMarkerWidgetColumnComponent, AXPImageMarkerWidgetEditComponent, AXPImageMarkerWidgetViewComponent, AXPItemConfiguratorWidget, AXPItemConfiguratorWidgetColumnComponent, AXPItemConfiguratorWidgetEditComponent, AXPJsonViewerWidget, AXPJsonViewerWidgetEditComponent, AXPJsonViewerWidgetViewComponent, AXPLargeTextWidget, AXPLargeTextWidgetColumnComponent, AXPLargeTextWidgetEditComponent, AXPLargeTextWidgetViewComponent, AXPLessThanExpressionValidationWidget, AXPLessThanValidationWidgetEditComponent, AXPListWidgetColumnComponent, AXPListWidgetEditComponent, AXPListWidgetViewComponent, AXPMapWidgetEditComponent, AXPMapWidgetViewComponent, AXPMaxLengthExpressionValidationWidget, AXPMaxLengthValidationWidgetEditComponent, AXPMinLengthExpressionValidationWidget, AXPMinLengthValidationWidgetEditComponent, AXPNumberBoxWidget, AXPNumberBoxWidgetColumnComponent, AXPNumberBoxWidgetEditComponent, AXPNumberBoxWidgetViewComponent, AXPPageWidget, AXPPageWidgetViewComponent, AXPPasswordBoxWidget, AXPPasswordBoxWidgetColumnComponent, AXPPasswordBoxWidgetEditComponent, AXPPasswordBoxWidgetViewComponent, AXPProgressBarWidget, AXPProgressBarWidgetColumnComponent, AXPProgressBarWidgetEditComponent, AXPProgressBarWidgetViewComponent, AXPProviderSelectWidgetColumnComponent, AXPProviderSelectWidgetEditBase, AXPProviderSelectWidgetViewComponent, AXPQrcodeWidget, AXPQrcodeWidgetColumnComponent, AXPQrcodeWidgetEditComponent, AXPQrcodeWidgetViewComponent, AXPRatePickerWidget, AXPRatePickerWidgetColumnComponent, AXPRatePickerWidgetEditComponent, AXPRatePickerWidgetViewComponent, AXPRegularExpressionValidationWidget, AXPRegularExpressionValidationWidgetEditComponent, AXPRepeaterWidget, AXPRepeaterWidgetDesignerComponent, AXPRepeaterWidgetEditComponent, AXPRepeaterWidgetViewComponent, AXPRequiredValidationWidget, AXPRequiredValidationWidgetEditComponent, AXPRichTextWidget, AXPRichTextWidgetColumnComponent, AXPRichTextWidgetEditComponent, AXPRichTextWidgetViewComponent, AXPSchedulerPickerWidget, AXPSchedulerPickerWidgetColumnComponent, AXPSchedulerPickerWidgetEditComponent, AXPSchedulerPickerWidgetViewComponent, AXPSelectBoxWidget, AXPSelectBoxWidgetColumnComponent, AXPSelectBoxWidgetEditComponent, AXPSelectBoxWidgetViewComponent, AXPSelectLanguagePopup, AXPSelectionListWidget, AXPSelectionListWidgetColumnComponent, AXPSelectionListWidgetDesignerComponent, AXPSelectionListWidgetEditComponent, AXPSelectionListWidgetViewComponent, AXPSignatureWidget, AXPSignatureWidgetColumnComponent, AXPSignatureWidgetEditComponent, AXPSignatureWidgetViewComponent, AXPSpacingWidget, AXPSpacingWidgetEditComponent, AXPStatusChipComponent, AXPStatusWidget, AXPStatusWidgetColumnComponent, AXPStatusWidgetEditComponent, AXPStatusWidgetViewComponent, AXPStepWizardWidget, AXPStepWizardWidgetViewComponent, AXPStopwatchWidget, AXPStopwatchWidgetViewComponent, AXPTableItemWidget, AXPTableItemWidgetDesignerComponent, AXPTableItemWidgetViewComponent, AXPTableWidget, AXPTableWidgetDesignerComponent, AXPTableWidgetViewComponent, AXPTagEditorWidget, AXPTagEditorWidgetColumnComponent, AXPTagEditorWidgetEditComponent, AXPTagEditorWidgetViewComponent, AXPTemplateBoxWidget, AXPTemplateBoxWidgetColumnComponent, AXPTemplateBoxWidgetEditComponent, AXPTemplateBoxWidgetPrintComponent, AXPTemplateBoxWidgetViewComponent, AXPTextBoxWidget, AXPTextBoxWidgetColumnComponent, AXPTextBoxWidgetEditComponent, AXPTextBoxWidgetViewComponent, AXPToggleWidget, AXPToggleWidgetColumnComponent, AXPToggleWidgetEditComponent, AXPToggleWidgetViewComponent, AXPWidgetFieldConfiguratorWidget, AXPWidgetFieldConfiguratorWidgetColumnComponent, AXPWidgetFieldConfiguratorWidgetEditComponent, AXPWidgetsModule, AXP_ABSOLUTE_UNITS, AXP_ALLOW_CLEAR_PROPERTY, AXP_ALLOW_MULTIPLE_PROPERTY, AXP_ALLOW_SEARCH_PROPERTY, AXP_ANIMATION_PROPERTY_GROUP, AXP_APPEARANCE_PROPERTY_GROUP, AXP_BEHAVIOR_PROPERTY_GROUP, AXP_BETWEEN_VALIDATION_PROPERTY, AXP_BG_COLOR_PROPERTY, AXP_BORDER_RADIUS_UNITS, AXP_BORDER_WIDTH_UNITS, AXP_BOX_MODEL_PROPERTY_GROUP, AXP_CALLBACK_VALIDATION_PROPERTY, AXP_COLOR_PROPERTY, AXP_CONTENT_PROPERTY, AXP_DATA_LIST_CMD_DELETE, AXP_DATA_LIST_CMD_EDIT, AXP_DATA_LIST_PENDING_DELETE_KEY, AXP_DATA_PATH_PROPERTY, AXP_DATA_PROPERTY_GROUP, AXP_DATA_SOURCE_OPTIONS_PROPERTY, AXP_DATE_FORMAT_PROPERTY, AXP_DEFAULT_ROW_COUNT_PROPERTY, AXP_DESCRIPTION_PROPERTY, AXP_DIRECTION_PROPERTY, AXP_DISABLED_PROPERTY, AXP_DOWNLOADABLE_PROPERTY, AXP_EQUAL_VALIDATION_PROPERTY, AXP_FALSY_TEXT_PROPERTY, AXP_FIT_LINE_COUNT_PROPERTY, AXP_FONT_SIZE_PROPERTY, AXP_Flex_Box_Align_Options, AXP_Flex_Box_Alignments, AXP_Flex_Box_Justify_Options, AXP_GREATER_THAN_VALIDATION_PROPERTY, AXP_Grid_Box_Align_Items_Options, AXP_Grid_Box_Alignments, AXP_Grid_Box_Justify_Items_Options, AXP_HAS_CLEAR_BUTTON_PROPERTY, AXP_HAS_COPY_ICON_PROPERTY, AXP_HAS_EYE_ICON_PROPERTY, AXP_HAS_ICON_PROPERTY, AXP_HAS_LABEL_PROPERTY, AXP_ICON_PROPERTY, AXP_IS_LOADING_PROPERTY, AXP_LABEL_PROPERTY, AXP_LAYOUT_ADVANCED_GRID_PROPERTY, AXP_LAYOUT_BORDER_PROPERTY, AXP_LAYOUT_COLUMNS_PROPERTY, AXP_LAYOUT_DIRECTION_PROPERTY, AXP_LAYOUT_FLEX_ITEM_PROPERTY, AXP_LAYOUT_FLEX_PROPERTY, AXP_LAYOUT_FLEX_PROPERTY_GROUP, AXP_LAYOUT_GAP_PROPERTY, AXP_LAYOUT_GRID_ITEM_PROPERTY, AXP_LAYOUT_GRID_PROPERTIES, AXP_LAYOUT_GRID_PROPERTY, AXP_LAYOUT_GRID_PROPERTY_GROUP, AXP_LAYOUT_GRID_ROW_PROPERTIES, AXP_LAYOUT_ROWS_PROPERTY, AXP_LAYOUT_SHOW_HEADER_PROPERTY, AXP_LAYOUT_SPACING_PROPERTY, AXP_LAYOUT_TABLE_PROPERTY_GROUP, AXP_LESS_THAN_VALIDATION_PROPERTY, AXP_MAX_LENGTH_VALIDATION_PROPERTY, AXP_MAX_LINE_COUNT_PROPERTY, AXP_MIN_LENGTH_VALIDATION_PROPERTY, AXP_MIN_LINE_COUNT_PROPERTY, AXP_MULTI_LANGUAGE_PROPERTY, AXP_NAME_PROPERTY, AXP_NUMBER_SEPARATOR_PROPERTY, AXP_PLACEHOLDER_PROPERTY, AXP_READONLY_PROPERTY, AXP_REGULAR_EXPRESSION_VALIDATION_PROPERTY, AXP_RELATIVE_UNITS, AXP_RELATIVE_UNITS_NO_PERCENT, AXP_REQUIRED_VALIDATION_PROPERTY, AXP_ROW_EXPR_PREFIX, AXP_SHOW_PASSWORD_PROPERTY, AXP_SPACING_UNITS, AXP_SPIN_BUTTON_PROPERTY, AXP_STYLE_COLOR_PROPERTY, AXP_STYLE_LOOK_PROPERTY, AXP_STYLING_PROPERTY_GROUP, AXP_TABLE_COLUMNS_PROPERTY, AXP_TABLE_COLUMN_HEIGHT_PROPERTY, AXP_TABLE_COLUMN_WIDTH_PROPERTY, AXP_TABLE_ITEM_COLSPAN_PROPERTY, AXP_TABLE_ITEM_ROWSPAN_PROPERTY, AXP_TEXT_ALIGN_PROPERTY, AXP_TEXT_FIELD_PROPERTY, AXP_TEXT_PROPERTY, AXP_THEME_PROPERTY, AXP_TITLE_PROPERTY, AXP_TRIGGERS_PROPERTY, AXP_TRIGGERS_PROPERTY_GROUP, AXP_TRULY_TEXT_PROPERTY, AXP_VALIDATION_PROPERTY_GROUP, AXP_VALUE_FIELD_PROPERTY, AXP_VERTICAL_ALIGN_PROPERTY, AXP_WIDGET_AI_AGENT_CHART_LAYOUT, AXP_WIDGET_AI_AGENT_DASHBOARD_LAYOUT, AXP_WIDGET_AI_AGENT_FORM_LAYOUT, AXP_WIDGET_AI_AGENT_NAMES, AXP_WIDGET_PROPERTY_GROUP, AXP_default_Border_Box_Units, AXP_default_Border_Box_Value, AXP_default_Spacing_Box_Units, AXP_default_Spacing_Box_Value, DEFAULT_STRATEGY_CONFIG, STRATEGY_CONFIG_TOKEN, booleanDefaultProperty, largeTextDefaultProperty, matchesWidgetAiAgent, numberDefaultProperty, numberMaxValueProperty, numberMinValueProperty, plainTextDefaultProperty, richTextDefaultProperty, selectEditorDefaultValueProperty, selectionListEditorDefaultValueProperty };
29781
30425
  //# sourceMappingURL=acorex-platform-layout-widgets.mjs.map