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

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 (55) 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 +22 -5
  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 +203 -55
  12. package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
  13. package/fesm2022/acorex-platform-layout-entity.mjs +622 -121
  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.mjs +643 -311
  18. package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
  19. package/fesm2022/acorex-platform-runtime.mjs +120 -9
  20. package/fesm2022/acorex-platform-runtime.mjs.map +1 -1
  21. 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
  22. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-Cx1lLUaR.mjs.map +1 -0
  23. 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
  24. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-AOrcgjDF.mjs.map +1 -0
  25. 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
  26. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-BfCeUU5F.mjs.map +1 -0
  27. package/fesm2022/acorex-platform-themes-default.mjs +10 -10
  28. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  29. package/fesm2022/{acorex-platform-themes-shared-settings.provider-DSs1o1M6.mjs → acorex-platform-themes-shared-settings.provider-D13QB3Hr.mjs} +2 -2
  30. package/fesm2022/acorex-platform-themes-shared-settings.provider-D13QB3Hr.mjs.map +1 -0
  31. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-D566Kdvy.mjs +94 -0
  32. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-D566Kdvy.mjs.map +1 -0
  33. 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
  34. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-D7-rCGl7.mjs.map +1 -0
  35. package/fesm2022/acorex-platform-themes-shared.mjs +183 -84
  36. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  37. package/fesm2022/acorex-platform-workflow.mjs +50 -10
  38. package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
  39. package/package.json +1 -1
  40. package/types/acorex-platform-core.d.ts +13 -2
  41. package/types/acorex-platform-domain.d.ts +28 -2
  42. package/types/acorex-platform-layout-builder.d.ts +41 -27
  43. package/types/acorex-platform-layout-designer.d.ts +55 -15
  44. package/types/acorex-platform-layout-entity.d.ts +145 -11
  45. package/types/acorex-platform-layout-widget-core.d.ts +81 -68
  46. package/types/acorex-platform-layout-widgets.d.ts +25 -5
  47. package/types/acorex-platform-runtime.d.ts +156 -61
  48. package/types/acorex-platform-workflow.d.ts +37 -2
  49. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-Cvvr4HnL.mjs.map +0 -1
  50. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-TYoLN1Jq.mjs.map +0 -1
  51. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-C2z5Lq9y.mjs.map +0 -1
  52. package/fesm2022/acorex-platform-themes-shared-settings.provider-DSs1o1M6.mjs.map +0 -1
  53. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-CHfrTtol.mjs +0 -65
  54. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-CHfrTtol.mjs.map +0 -1
  55. 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,6 +119,8 @@ 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';
@@ -1310,8 +1312,7 @@ class AXPSelectLanguagePopup extends AXBasePageComponent {
1310
1312
  if (this.showOtherLanguages() || !this.hasLanguagesBeyondProfiles()) {
1311
1313
  return list;
1312
1314
  }
1313
- return list.filter((l) => l.isLocaleProfile ||
1314
- this.hasTranslationContent(l.context?.value));
1315
+ return list.filter((l) => l.isLocaleProfile || this.hasTranslationContent(l.context?.value));
1315
1316
  }, ...(ngDevMode ? [{ debugName: "visibleLanguageList" }] : /* istanbul ignore next */ []));
1316
1317
  }
1317
1318
  //#region ---- Lifecycle ----
@@ -1326,6 +1327,7 @@ class AXPSelectLanguagePopup extends AXBasePageComponent {
1326
1327
  handleContextChanged(e, language) {
1327
1328
  language.context = e.data;
1328
1329
  }
1330
+ //TODO NEED TO FIX THOSE HAS NO PROFILE
1329
1331
  onShowOtherLanguagesChanged(event) {
1330
1332
  const next = !!event.value;
1331
1333
  this.showOtherLanguages.set(next);
@@ -1337,8 +1339,7 @@ class AXPSelectLanguagePopup extends AXBasePageComponent {
1337
1339
  if (!current) {
1338
1340
  return list;
1339
1341
  }
1340
- const staysVisible = current.isLocaleProfile ||
1341
- (!current.isLocaleProfile && this.hasTranslationContent(current.context?.value));
1342
+ const staysVisible = current.isLocaleProfile || (!current.isLocaleProfile && this.hasTranslationContent(current.context?.value));
1342
1343
  if (staysVisible) {
1343
1344
  return list;
1344
1345
  }
@@ -1375,7 +1376,9 @@ class AXPSelectLanguagePopup extends AXBasePageComponent {
1375
1376
  async onSaveButtonClick() {
1376
1377
  const merged = { ...this.values };
1377
1378
  this.languageList().forEach((item) => {
1378
- merged[item.code] = item.context.value;
1379
+ if (item.context.value) {
1380
+ merged[item.code] = item.context.value;
1381
+ }
1379
1382
  });
1380
1383
  this.close(merged);
1381
1384
  }
@@ -1984,10 +1987,11 @@ var buttonWidgetView_component = /*#__PURE__*/Object.freeze({
1984
1987
 
1985
1988
  const AXPButtonWidget = {
1986
1989
  name: 'button-action',
1987
- title: 'Button',
1988
- description: 'Triggers customizable actions',
1990
+ title: '@platform-layout-widgets:widgets.button-action.title',
1991
+ description: '@platform-layout-widgets:widgets.button-action.description',
1989
1992
  icon: 'fa-light fa-play',
1990
- categories: [AXP_WIDGETS_ACTION_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
1993
+ categories: [AXP_WIDGETS_ACTION_CATEGORY],
1994
+ subCategory: AXP_WIDGETS_ACTION_SUB_CONTROLS,
1991
1995
  aiDescription: 'Primary or secondary action button. Use when the answer should offer a clear next step (submit, navigate, run) with label and optional icon.',
1992
1996
  groups: [AXPWidgetGroupEnum.FormElement],
1993
1997
  type: 'action',
@@ -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,10 +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],
10504
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
10505
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
10349
10506
  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.',
10350
10507
  groups: [AXPWidgetGroupEnum.EntityWidget],
10351
10508
  type: 'editor',
@@ -10583,10 +10740,11 @@ var codeEditorWidgetColumn_component = /*#__PURE__*/Object.freeze({
10583
10740
  //#region ---- Widget Config ----
10584
10741
  const AXPCodeEditorWidget = {
10585
10742
  name: 'code-editor',
10586
- title: 'Code Editor',
10587
- description: 'A code editor widget for editing code expressions and scripts',
10743
+ title: '@platform-layout-widgets:widgets.code-editor.title',
10744
+ description: '@platform-layout-widgets:widgets.code-editor.description',
10588
10745
  icon: 'fa-light fa-code',
10589
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
10746
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
10747
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_INPUT,
10590
10748
  aiDescription: 'Syntax-highlighted code block. Use for snippets, scripts, or configs where line structure and language matter; bind source via data path or options.',
10591
10749
  groups: [AXPWidgetGroupEnum.FormElement],
10592
10750
  type: 'editor',
@@ -10896,10 +11054,11 @@ var dataListWidgetView_component = /*#__PURE__*/Object.freeze({
10896
11054
 
10897
11055
  const AXPDataListWidget = {
10898
11056
  name: 'data-list',
10899
- title: 'Data List',
10900
- description: 'Displays data in a list like table format with customizable columns',
11057
+ title: '@platform-layout-widgets:widgets.data-list.title',
11058
+ description: '@platform-layout-widgets:widgets.data-list.description',
10901
11059
  icon: 'fa-light fa-table',
10902
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
11060
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
11061
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_LISTS,
10903
11062
  aiDescription: 'Use for tabular data: multiple rows with defined columns, paging, and optional row commands. Provide options.dataSource (rows) and options.columns.',
10904
11063
  groups: [AXPWidgetGroupEnum.FormElement],
10905
11064
  type: 'view',
@@ -12304,10 +12463,11 @@ var fileUploaderWidgetView_component = /*#__PURE__*/Object.freeze({
12304
12463
 
12305
12464
  const AXPFileUploaderWidget = {
12306
12465
  name: 'file-uploader',
12307
- title: 'File Uploader',
12308
- description: 'Uploads and manages files',
12466
+ title: '@platform-layout-widgets:widgets.file-uploader.title',
12467
+ description: '@platform-layout-widgets:widgets.file-uploader.description',
12309
12468
  icon: 'fa-light fa-files',
12310
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
12469
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
12470
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
12311
12471
  aiDescription: 'Use when the answer involves file attachments: list, upload, or download. Prefer when the user references documents or media beyond inline text.',
12312
12472
  groups: ['form-element'],
12313
12473
  type: 'editor',
@@ -13035,10 +13195,11 @@ var galleryWidgetView_component = /*#__PURE__*/Object.freeze({
13035
13195
 
13036
13196
  const AXPGalleryWidget = {
13037
13197
  name: 'gallery',
13038
- title: 'Media Gallery',
13039
- description: 'Shows and edits image galleries',
13198
+ title: '@platform-layout-widgets:widgets.gallery.title',
13199
+ description: '@platform-layout-widgets:widgets.gallery.description',
13040
13200
  icon: 'fa-light fa-images',
13041
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
13201
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
13202
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
13042
13203
  aiDescription: 'Image gallery with thumbnails and optional fullscreen. Use for multiple images or a carousel-like browse experience (not a single static image).',
13043
13204
  groups: [AXPWidgetGroupEnum.FormElement],
13044
13205
  properties: [
@@ -13516,13 +13677,13 @@ var imageMarkerWidgetView_component = /*#__PURE__*/Object.freeze({
13516
13677
 
13517
13678
  const AXPImageMarkerWidget = {
13518
13679
  name: 'image-marker',
13519
- title: 'Image Marker',
13520
- description: 'Image Marker Widget to add markers to an image',
13680
+ title: '@platform-layout-widgets:widgets.image-marker.title',
13681
+ description: '@platform-layout-widgets:widgets.image-marker.description',
13521
13682
  icon: 'fa-light fa-map-marker-alt',
13522
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
13683
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
13684
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
13523
13685
  aiDescription: 'Use when highlighting points or regions on a base image (annotations, hotspots). Provide base image plus marker coordinates or overlays in options.',
13524
13686
  groups: [AXPWidgetGroupEnum.FormElement],
13525
- aiCatalog: 'include',
13526
13687
  type: 'editor',
13527
13688
  properties: [
13528
13689
  AXP_NAME_PROPERTY,
@@ -13686,12 +13847,13 @@ var jsonViewerWidgetEdit_component = /*#__PURE__*/Object.freeze({
13686
13847
  //#region ---- Widget Config ----
13687
13848
  const AXPJsonViewerWidget = {
13688
13849
  name: 'json-viewer',
13689
- title: 'JSON Viewer',
13690
- description: 'Displays JSON data in a formatted, collapsible tree view',
13850
+ title: '@platform-layout-widgets:widgets.json-viewer.title',
13851
+ description: '@platform-layout-widgets:widgets.json-viewer.description',
13691
13852
  icon: 'fa-light fa-code',
13692
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
13853
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
13854
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_DATA,
13693
13855
  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],
13856
+ groups: [AXPWidgetGroupEnum.BaseWidget],
13695
13857
  type: 'editor',
13696
13858
  properties: [
13697
13859
  AXP_NAME_PROPERTY,
@@ -14154,10 +14316,11 @@ var qrcodeWidgetView_component = /*#__PURE__*/Object.freeze({
14154
14316
 
14155
14317
  const AXPQrcodeWidget = {
14156
14318
  name: 'qrcode',
14157
- title: 'QR Code',
14158
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
14319
+ title: '@platform-layout-widgets:widgets.qrcode.title',
14320
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
14321
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
14159
14322
  icon: 'fa-light fa-qrcode',
14160
- description: 'Display and edit QR Codes',
14323
+ description: '@platform-layout-widgets:widgets.qrcode.description',
14161
14324
  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.',
14162
14325
  type: 'view',
14163
14326
  properties: [
@@ -14447,9 +14610,10 @@ var schedulerPickerWidgetView_component = /*#__PURE__*/Object.freeze({
14447
14610
 
14448
14611
  const AXPSchedulerPickerWidget = {
14449
14612
  name: 'scheduler-picker',
14450
- title: 'Scheduler Picker',
14613
+ title: '@platform-layout-widgets:widgets.scheduler-picker.title',
14451
14614
  icon: 'fa-light fa-calendar-clock',
14452
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
14615
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
14616
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_INPUT,
14453
14617
  aiDescription: 'Schedule or calendar picker. Use when the user selects dates, times, or recurring slots; bind value via data path.',
14454
14618
  type: 'editor',
14455
14619
  groups: [AXPWidgetGroupEnum.FormElement],
@@ -14786,10 +14950,11 @@ var signaturePadWidgetView_component = /*#__PURE__*/Object.freeze({
14786
14950
 
14787
14951
  const AXPSignatureWidget = {
14788
14952
  name: 'signature',
14789
- title: 'Signature',
14790
- description: 'Captures digital signatures',
14953
+ title: '@platform-layout-widgets:widgets.signature.title',
14954
+ description: '@platform-layout-widgets:widgets.signature.description',
14791
14955
  icon: 'fa-light fa-file-signature',
14792
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
14956
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
14957
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_INPUT,
14793
14958
  aiDescription: 'Digital signature capture or display. Use when consent, approval, or handwritten input is required instead of typed text.',
14794
14959
  type: 'editor',
14795
14960
  properties: [
@@ -14873,6 +15038,8 @@ class AXPStatusChipComponent {
14873
15038
  this.isPopoverOpen = signal(false, ...(ngDevMode ? [{ debugName: "isPopoverOpen" }] : /* istanbul ignore next */ []));
14874
15039
  this.isUpdating = signal(false, ...(ngDevMode ? [{ debugName: "isUpdating" }] : /* istanbul ignore next */ []));
14875
15040
  this.providerSignal = signal(undefined, ...(ngDevMode ? [{ debugName: "providerSignal" }] : /* istanbul ignore next */ []));
15041
+ /** Native tooltip from translated `AXPStatusDefinition.description` (i18n key). */
15042
+ this.chipTooltip = signal(null, ...(ngDevMode ? [{ debugName: "chipTooltip" }] : /* istanbul ignore next */ []));
14876
15043
  //#endregion
14877
15044
  //#region ---- Computed Properties ----
14878
15045
  this.statuses = computed(() => this.providerSignal()?.statuses ?? [], ...(ngDevMode ? [{ debugName: "statuses" }] : /* istanbul ignore next */ []));
@@ -14912,15 +15079,9 @@ class AXPStatusChipComponent {
14912
15079
  if (!Array.isArray(statuses) || statuses.length === 0) {
14913
15080
  return [];
14914
15081
  }
14915
- // If no transitions defined, show all other statuses as available options
15082
+ // No declared transitions: executeTransition() rejects every path do not offer fake targets
14916
15083
  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
- }));
15084
+ return [];
14924
15085
  }
14925
15086
  // Filter transitions that start from current status
14926
15087
  const availableTransitions = transitions.filter((t) => t.from === currentStatus.name);
@@ -14956,6 +15117,18 @@ class AXPStatusChipComponent {
14956
15117
  this.providerSignal.set(provider);
14957
15118
  });
14958
15119
  }, ...(ngDevMode ? [{ debugName: "loadProvider" }] : /* istanbul ignore next */ []));
15120
+ this.syncDescriptionTooltip = effect(() => {
15121
+ const def = this.currentStatus();
15122
+ const descKey = def?.description;
15123
+ if (!descKey) {
15124
+ untracked(() => this.chipTooltip.set(null));
15125
+ return;
15126
+ }
15127
+ void this.translationService
15128
+ .translateAsync(descKey)
15129
+ .then((t) => untracked(() => this.chipTooltip.set(t || null)))
15130
+ .catch(() => untracked(() => this.chipTooltip.set(null)));
15131
+ }, ...(ngDevMode ? [{ debugName: "syncDescriptionTooltip" }] : /* istanbul ignore next */ []));
14959
15132
  }
14960
15133
  //#endregion
14961
15134
  //#region ---- Public Methods ----
@@ -15054,8 +15227,12 @@ class AXPStatusChipComponent {
15054
15227
  [class.ax-cursor-pointer]="hasTransitions"
15055
15228
  [class.ax-cursor-default]="!hasTransitions"
15056
15229
  (click)="hasTransitions && openPopover()"
15230
+ [attr.title]="chipTooltip() ?? null"
15057
15231
  #chipElement
15058
15232
  >
15233
+ @if (currentStatusDef.icon) {
15234
+ <i [class]="currentStatusDef.icon + ' ax-text-[0.85em] ax-opacity-90'"></i>
15235
+ }
15059
15236
  <span>{{ currentStatusDef.title | translate | async }}</span>
15060
15237
  @if (hasTransitions) {
15061
15238
  <i class="fa-light fa-chevron-down ax-text-xs"></i>
@@ -15122,8 +15299,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
15122
15299
  [class.ax-cursor-pointer]="hasTransitions"
15123
15300
  [class.ax-cursor-default]="!hasTransitions"
15124
15301
  (click)="hasTransitions && openPopover()"
15302
+ [attr.title]="chipTooltip() ?? null"
15125
15303
  #chipElement
15126
15304
  >
15305
+ @if (currentStatusDef.icon) {
15306
+ <i [class]="currentStatusDef.icon + ' ax-text-[0.85em] ax-opacity-90'"></i>
15307
+ }
15127
15308
  <span>{{ currentStatusDef.title | translate | async }}</span>
15128
15309
  @if (hasTransitions) {
15129
15310
  <i class="fa-light fa-chevron-down ax-text-xs"></i>
@@ -15217,7 +15398,17 @@ class AXPStatusWidgetColumnComponent extends AXPColumnWidgetComponent {
15217
15398
  */
15218
15399
  this.columnReadonly = computed(() => !!this.options['readonly'], ...(ngDevMode ? [{ debugName: "columnReadonly" }] : /* istanbul ignore next */ []));
15219
15400
  this.entityData = computed(() => {
15220
- return this.rowDataSignal();
15401
+ const row = this.rowDataSignal();
15402
+ if (!row || typeof row !== 'object') {
15403
+ return null;
15404
+ }
15405
+ const entityKey = this.options['entity'];
15406
+ const fieldName = this.options['fieldName'];
15407
+ return {
15408
+ ...row,
15409
+ ...(entityKey ? { entity: entityKey, entityName: entityKey } : {}),
15410
+ ...(fieldName ? { statusField: fieldName } : {}),
15411
+ };
15221
15412
  }, ...(ngDevMode ? [{ debugName: "entityData" }] : /* istanbul ignore next */ []));
15222
15413
  this.resolvedStatuses = computed(() => {
15223
15414
  return this.providerSignal()?.statuses ?? [];
@@ -15257,15 +15448,9 @@ class AXPStatusWidgetColumnComponent extends AXPColumnWidgetComponent {
15257
15448
  if (!Array.isArray(statuses) || statuses.length === 0) {
15258
15449
  return [];
15259
15450
  }
15260
- // If no transitions defined, show all other statuses as available options
15451
+ // No declared transitions: executeTransition() rejects every path do not offer fake targets
15261
15452
  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
- }));
15453
+ return [];
15269
15454
  }
15270
15455
  // Filter transitions that start from current status
15271
15456
  const availableTransitions = transitions.filter((t) => t.from === currentStatus.name);
@@ -15460,15 +15645,9 @@ class AXPStatusWidgetEditComponent extends AXPValueWidgetComponent {
15460
15645
  if (!Array.isArray(statuses) || statuses.length === 0) {
15461
15646
  return [];
15462
15647
  }
15463
- // If no transitions defined, show all other statuses as available options
15648
+ // No declared transitions: executeTransition() rejects every path do not offer fake targets
15464
15649
  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
- }));
15650
+ return [];
15472
15651
  }
15473
15652
  // Filter transitions that start from current status
15474
15653
  const availableTransitions = transitions.filter((t) => t.from === currentStatus.name);
@@ -15508,13 +15687,35 @@ class AXPStatusWidgetEditComponent extends AXPValueWidgetComponent {
15508
15687
  // Could show a toast notification here if needed
15509
15688
  }
15510
15689
  /**
15511
- * Get entity data for command execution context
15690
+ * Build context for default `Entity:UpdateStatus` (entity key, record id, status field path).
15512
15691
  */
15513
15692
  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;
15693
+ const opts = this.options();
15694
+ const entityKey = (opts['entityName'] ?? opts['entity']);
15695
+ const statusField = (opts['statusField'] ?? opts['fieldName'] ?? this.path);
15696
+ const parentPath = this.parentPath();
15697
+ const idPathCandidates = [
15698
+ parentPath ? `${parentPath}.id` : null,
15699
+ 'id',
15700
+ parentPath ? `${parentPath}._id` : null,
15701
+ '_id',
15702
+ ].filter((p) => !!p);
15703
+ let id;
15704
+ for (const p of idPathCandidates) {
15705
+ id = this.contextService.getValue(p);
15706
+ if (id != null && String(id).length > 0) {
15707
+ break;
15708
+ }
15709
+ }
15710
+ if (!entityKey || id == null || String(id).length === 0) {
15711
+ return null;
15712
+ }
15713
+ return {
15714
+ entity: entityKey,
15715
+ entityName: entityKey,
15716
+ statusField: statusField ?? 'statusId',
15717
+ id: String(id),
15718
+ };
15518
15719
  }
15519
15720
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPStatusWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
15520
15721
  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 +15831,9 @@ class AXPStatusWidgetViewComponent extends AXPDataListWidgetComponent {
15630
15831
  if (!Array.isArray(statuses) || statuses.length === 0) {
15631
15832
  return [];
15632
15833
  }
15633
- // If no transitions defined, show all other statuses as available options
15834
+ // No declared transitions: executeTransition() rejects every path do not offer fake targets
15634
15835
  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
- }));
15836
+ return [];
15642
15837
  }
15643
15838
  // Filter transitions that start from current status
15644
15839
  const availableTransitions = transitions.filter((t) => t.from === currentStatus.name);
@@ -15731,10 +15926,11 @@ var statusWidgetView_component = /*#__PURE__*/Object.freeze({
15731
15926
 
15732
15927
  const AXPStatusWidget = {
15733
15928
  name: 'status-widget',
15734
- title: 'Status Widget',
15735
- description: 'Displays and manages entity status with visual indicators',
15929
+ title: '@platform-layout-widgets:widgets.status-widget.title',
15930
+ description: '@platform-layout-widgets:widgets.status-widget.description',
15736
15931
  icon: 'fa-light fa-circle-check',
15737
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
15932
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
15933
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_DATA,
15738
15934
  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).',
15739
15935
  groups: [AXPWidgetGroupEnum.EntityWidget],
15740
15936
  defaultFilterWidgetName: 'status-filter',
@@ -15767,10 +15963,11 @@ const AXPStatusWidget = {
15767
15963
  //#region ---- Widget Config ----
15768
15964
  const AXPStopwatchWidget = {
15769
15965
  name: 'stopwatch',
15770
- title: 'Stopwatch',
15771
- description: 'A stopwatch widget that can count up or count down from a time limit',
15966
+ title: '@platform-layout-widgets:widgets.stopwatch.title',
15967
+ description: '@platform-layout-widgets:widgets.stopwatch.description',
15772
15968
  icon: 'fa-light fa-stopwatch',
15773
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
15969
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
15970
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_TOOLS,
15774
15971
  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.',
15775
15972
  groups: [AXPWidgetGroupEnum.UtilityWidget],
15776
15973
  type: 'view',
@@ -15951,10 +16148,11 @@ var stopwatchWidgetView_component = /*#__PURE__*/Object.freeze({
15951
16148
 
15952
16149
  const AXPWidgetFieldConfiguratorWidget = {
15953
16150
  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',
16151
+ title: '@platform-layout-widgets:widgets.widget-field-configurator.title',
16152
+ icon: 'fa-light fa-puzzle-piece',
16153
+ description: '@platform-layout-widgets:widgets.widget-field-configurator.description',
15957
16154
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
16155
+ subCategory: AXP_WIDGETS_EDITOR_SUB_CONFIG,
15958
16156
  groups: [AXPWidgetGroupEnum.UtilityWidget],
15959
16157
  type: 'editor',
15960
16158
  defaultFilterWidgetName: 'string-filter',
@@ -16171,12 +16369,12 @@ class AXPWidgetFieldConfiguratorWidgetColumnComponent extends AXPColumnWidgetCom
16171
16369
  @if (widget()) {
16172
16370
  <i [class]="widget()?.icon" class="fa-fw"></i>&nbsp;
16173
16371
  <span [title]="widget()?.title" class="ax-text-xs ax-font-medium">
16174
- {{ widget()?.title }}
16372
+ {{ widget()?.title | translate | async }}
16175
16373
  </span>
16176
16374
  } @else {
16177
16375
  <span class="ax-text-muted">---</span>
16178
16376
  }
16179
- `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
16377
+ `, 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
16378
  }
16181
16379
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetFieldConfiguratorWidgetColumnComponent, decorators: [{
16182
16380
  type: Component,
@@ -16186,14 +16384,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
16186
16384
  @if (widget()) {
16187
16385
  <i [class]="widget()?.icon" class="fa-fw"></i>&nbsp;
16188
16386
  <span [title]="widget()?.title" class="ax-text-xs ax-font-medium">
16189
- {{ widget()?.title }}
16387
+ {{ widget()?.title | translate | async }}
16190
16388
  </span>
16191
16389
  } @else {
16192
16390
  <span class="ax-text-muted">---</span>
16193
16391
  }
16194
16392
  `,
16195
16393
  changeDetection: ChangeDetectionStrategy.OnPush,
16196
- imports: [],
16394
+ imports: [AXTranslationModule, AsyncPipe],
16197
16395
  inputs: ['rawValue', 'rowData'],
16198
16396
  }]
16199
16397
  }] });
@@ -16205,10 +16403,11 @@ var widgetFieldConfiguratorWidgetColumn_component = /*#__PURE__*/Object.freeze({
16205
16403
 
16206
16404
  const AXPItemConfiguratorWidget = {
16207
16405
  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.',
16406
+ title: '@platform-layout-widgets:widgets.item-configurator.title',
16407
+ icon: 'fa-light fa-sliders',
16408
+ description: '@platform-layout-widgets:widgets.item-configurator.description',
16211
16409
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
16410
+ subCategory: AXP_WIDGETS_EDITOR_SUB_CONFIG,
16212
16411
  groups: [AXPWidgetGroupEnum.UtilityWidget],
16213
16412
  type: 'editor',
16214
16413
  defaultFilterWidgetName: 'string-filter',
@@ -17204,9 +17403,10 @@ var advancedGridWidgetView_component = /*#__PURE__*/Object.freeze({
17204
17403
 
17205
17404
  const AXPAdvancedGridWidget = {
17206
17405
  name: 'advanced-grid-layout',
17207
- title: 'Advanced Grid Layout',
17406
+ title: '@platform-layout-widgets:widgets.advanced-grid-layout.title',
17208
17407
  type: 'container',
17209
17408
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
17409
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
17210
17410
  icon: 'fa-light fa-grid-2',
17211
17411
  properties: [
17212
17412
  AXP_NAME_PROPERTY,
@@ -17444,9 +17644,10 @@ var advancedGridItemWidgetView_component = /*#__PURE__*/Object.freeze({
17444
17644
 
17445
17645
  const AXPAdvancedGridItemWidget = {
17446
17646
  name: 'advanced-grid-item-layout',
17447
- title: 'Advanced Grid Item',
17647
+ title: '@platform-layout-widgets:widgets.advanced-grid-item-layout.title',
17448
17648
  type: 'container',
17449
17649
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
17650
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
17450
17651
  icon: 'fa-light fa-objects-column',
17451
17652
  properties: [
17452
17653
  AXP_NAME_PROPERTY,
@@ -17589,10 +17790,11 @@ var blockWidgetView_component = /*#__PURE__*/Object.freeze({
17589
17790
  const AXPBlockWidget = {
17590
17791
  name: 'block-layout',
17591
17792
  type: 'container',
17592
- title: 'Block Layout',
17593
- description: 'Organizes content in blocks',
17793
+ title: '@platform-layout-widgets:widgets.block-layout.title',
17794
+ description: '@platform-layout-widgets:widgets.block-layout.description',
17594
17795
  icon: 'fa-light fa-block',
17595
17796
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
17797
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
17596
17798
  groups: [AXPWidgetGroupEnum.FormElement],
17597
17799
  options: {
17598
17800
  canInsert: true,
@@ -17765,10 +17967,11 @@ var fieldsetWidgetView_component = /*#__PURE__*/Object.freeze({
17765
17967
  const AXPFieldsetWidget = {
17766
17968
  name: 'fieldset-layout',
17767
17969
  type: 'container',
17768
- title: 'Fieldset',
17769
- description: 'Organizes content in a fieldset container',
17970
+ title: '@platform-layout-widgets:widgets.fieldset-layout.title',
17971
+ description: '@platform-layout-widgets:widgets.fieldset-layout.description',
17770
17972
  icon: 'fa-light fa-object-group',
17771
17973
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
17974
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SURFACES,
17772
17975
  groups: [AXPWidgetGroupEnum.FormElement],
17773
17976
  properties: [AXP_NAME_PROPERTY, AXP_TITLE_PROPERTY, AXP_ICON_PROPERTY, AXP_LAYOUT_SHOW_HEADER_PROPERTY, AXP_LAYOUT_COLUMNS_PROPERTY],
17774
17977
  components: {
@@ -17869,7 +18072,7 @@ class AXPFlexWidgetViewComponent extends AXPFlexBaseLayoutWidgetComponent {
17869
18072
  [node]="node"
17870
18073
  [index]="index"
17871
18074
  [parentNode]="this"
17872
- [mode]="this.mode"
18075
+ [mode]="node.mode ?? this.mode"
17873
18076
  ></ng-container>
17874
18077
  }
17875
18078
  `, 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 +18088,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
17885
18088
  [node]="node"
17886
18089
  [index]="index"
17887
18090
  [parentNode]="this"
17888
- [mode]="this.mode"
18091
+ [mode]="node.mode ?? this.mode"
17889
18092
  ></ng-container>
17890
18093
  }
17891
18094
  `,
@@ -17908,10 +18111,11 @@ var flexWidgetView_component = /*#__PURE__*/Object.freeze({
17908
18111
  const AXPFlexWidget = {
17909
18112
  name: 'flex-layout',
17910
18113
  type: 'container',
17911
- title: 'Flex Layout',
17912
- description: 'Organizes content in flexible layout',
18114
+ title: '@platform-layout-widgets:widgets.flex-layout.title',
18115
+ description: '@platform-layout-widgets:widgets.flex-layout.description',
17913
18116
  icon: 'fa-light fa-box-taped',
17914
18117
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
18118
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
17915
18119
  groups: [AXPWidgetGroupEnum.FormElement],
17916
18120
  options: {
17917
18121
  canInsert: true,
@@ -18055,11 +18259,12 @@ var flexItemWidgetView_component = /*#__PURE__*/Object.freeze({
18055
18259
 
18056
18260
  const AXPFlexItemWidget = {
18057
18261
  name: 'flex-item-layout',
18058
- title: 'Flex Item',
18262
+ title: '@platform-layout-widgets:widgets.flex-item-layout.title',
18059
18263
  type: 'container',
18060
18264
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
18265
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
18061
18266
  // groups: [AXPWidgetGroupEnum.FormElement],
18062
- description: 'Flex Item Layout',
18267
+ description: '@platform-layout-widgets:widgets.flex-item-layout.description',
18063
18268
  icon: 'fa-light fa-rectangle-vertical-history',
18064
18269
  properties: [
18065
18270
  AXP_NAME_PROPERTY,
@@ -18151,10 +18356,11 @@ var pageWidgetView_component = /*#__PURE__*/Object.freeze({
18151
18356
 
18152
18357
  const AXPPageWidget = {
18153
18358
  name: 'page-layout',
18154
- title: 'Page',
18155
- description: 'Structures the entire page',
18359
+ title: '@platform-layout-widgets:widgets.page-layout.title',
18360
+ description: '@platform-layout-widgets:widgets.page-layout.description',
18156
18361
  icon: 'fa-light fa-page',
18157
18362
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
18363
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SHELL,
18158
18364
  type: 'container',
18159
18365
  properties: [
18160
18366
  AXP_NAME_PROPERTY,
@@ -18478,10 +18684,11 @@ var repeaterWidgetView_component = /*#__PURE__*/Object.freeze({
18478
18684
 
18479
18685
  const AXPRepeaterWidget = {
18480
18686
  name: 'repeater-layout',
18481
- title: 'Repeater',
18482
- description: 'Adds repeating form elements',
18687
+ title: '@platform-layout-widgets:widgets.repeater-layout.title',
18688
+ description: '@platform-layout-widgets:widgets.repeater-layout.description',
18483
18689
  icon: 'fa-light fa-table-list',
18484
18690
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
18691
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SURFACES,
18485
18692
  groups: [AXPWidgetGroupEnum.FormElement],
18486
18693
  type: 'container',
18487
18694
  properties: [
@@ -18874,9 +19081,10 @@ var stepWizardWidgetView_component = /*#__PURE__*/Object.freeze({
18874
19081
 
18875
19082
  const AXPStepWizardWidget = {
18876
19083
  name: 'step-wizard',
18877
- title: 'Step Wizard',
18878
- icon: 'fa-solid fa-image-user',
18879
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
19084
+ title: '@platform-layout-widgets:widgets.step-wizard.title',
19085
+ icon: 'fa-light fa-image-user',
19086
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
19087
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SURFACES,
18880
19088
  aiDescription: 'Use for multi-step flows (wizard). Present when the user should follow ordered steps; children typically hold step content.',
18881
19089
  groups: [AXPWidgetGroupEnum.FormElement],
18882
19090
  type: 'view',
@@ -19853,10 +20061,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
19853
20061
  const AXPTableWidget = {
19854
20062
  name: 'table-layout',
19855
20063
  type: 'container',
19856
- title: 'Table Layout',
19857
- description: 'Structures content into rows and cells',
20064
+ title: '@platform-layout-widgets:widgets.table-layout.title',
20065
+ description: '@platform-layout-widgets:widgets.table-layout.description',
19858
20066
  icon: 'fa-light fa-table',
19859
20067
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
20068
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
19860
20069
  groups: [AXPWidgetGroupEnum.FormElement],
19861
20070
  options: {
19862
20071
  canInsert: true,
@@ -20271,10 +20480,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
20271
20480
 
20272
20481
  const AXPTableItemWidget = {
20273
20482
  name: 'table-item-layout',
20274
- title: 'Table Item',
20483
+ title: '@platform-layout-widgets:widgets.table-item-layout.title',
20275
20484
  type: 'container',
20276
20485
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
20277
- description: 'Table Item (row/cell) container',
20486
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
20487
+ description: '@platform-layout-widgets:widgets.table-item-layout.description',
20278
20488
  icon: 'fa-light fa-table-cells',
20279
20489
  properties: [
20280
20490
  AXP_NAME_PROPERTY,
@@ -23950,12 +24160,13 @@ var cronJobWidgetView_component = /*#__PURE__*/Object.freeze({
23950
24160
 
23951
24161
  const AXPCronJobWidget = {
23952
24162
  name: 'cron-job',
23953
- title: 'Cron Job',
24163
+ title: '@platform-layout-widgets:widgets.cron-job.title',
23954
24164
  icon: 'fa-light fa-alarm-clock',
23955
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
24165
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
24166
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_INPUT,
23956
24167
  aiDescription: 'Cron expression editor and viewer. Use when the answer involves recurring schedules or job timing (not a one-off date picker).',
23957
24168
  type: 'editor',
23958
- groups: [AXPWidgetGroupEnum.FormElement],
24169
+ groups: [AXPWidgetGroupEnum.BaseWidget],
23959
24170
  properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY],
23960
24171
  components: {
23961
24172
  view: {
@@ -24099,10 +24310,11 @@ var metaDataWidgetView_component = /*#__PURE__*/Object.freeze({
24099
24310
 
24100
24311
  const AXPMetaDataWidget = {
24101
24312
  name: 'meta-data-editor',
24102
- title: 'Meta Data',
24313
+ title: '@platform-layout-widgets:widgets.meta-data-editor.title',
24103
24314
  icon: 'fa-light fa-input-text',
24104
- description: 'meta data rendered',
24315
+ description: '@platform-layout-widgets:widgets.meta-data-editor.description',
24105
24316
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
24317
+ subCategory: AXP_WIDGETS_EDITOR_SUB_COMPOSITE,
24106
24318
  type: 'editor',
24107
24319
  defaultFilterWidgetName: 'string-filter',
24108
24320
  properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY],
@@ -24410,10 +24622,11 @@ var numberUnitBoxWidgetView_component = /*#__PURE__*/Object.freeze({
24410
24622
 
24411
24623
  const AXPNumberUnitBoxWidget = {
24412
24624
  name: 'number-unit-editor',
24413
- title: 'Number Unit Box',
24414
- description: 'Inputs numeric values',
24625
+ title: '@platform-layout-widgets:widgets.number-unit-editor.title',
24626
+ description: '@platform-layout-widgets:widgets.number-unit-editor.description',
24415
24627
  icon: 'fa-light fa-input-numeric',
24416
24628
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
24629
+ subCategory: AXP_WIDGETS_EDITOR_SUB_NUMERIC,
24417
24630
  groups: [AXPWidgetGroupEnum.FormElement],
24418
24631
  type: 'editor',
24419
24632
  defaultFilterWidgetName: 'number-filter',
@@ -24459,10 +24672,11 @@ const AXPNumberUnitBoxWidget = {
24459
24672
 
24460
24673
  const AXPTableEditorWidget = {
24461
24674
  name: 'table-editor',
24462
- title: 'Table Editor',
24675
+ title: '@platform-layout-widgets:widgets.table-editor.title',
24463
24676
  icon: 'fa-light fa-input-text',
24464
- description: 'Inputs single-line text',
24677
+ description: '@platform-layout-widgets:widgets.table-editor.description',
24465
24678
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
24679
+ subCategory: AXP_WIDGETS_EDITOR_SUB_COMPOSITE,
24466
24680
  type: 'editor',
24467
24681
  defaultFilterWidgetName: 'string-filter',
24468
24682
  properties: [
@@ -25467,13 +25681,13 @@ var imageWidgetView_component = /*#__PURE__*/Object.freeze({
25467
25681
  //#region ---- Image Widget Config ----
25468
25682
  const AXPImageWidget = {
25469
25683
  name: 'image',
25470
- title: 'Image',
25471
- description: 'Simple image viewer/editor that stores a URL or binary',
25684
+ title: '@platform-layout-widgets:widgets.image.title',
25685
+ description: '@platform-layout-widgets:widgets.image.description',
25472
25686
  icon: 'fa-light fa-image',
25473
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
25687
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
25688
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
25474
25689
  aiDescription: 'Use for a single image (URL or embedded). Prefer over plain markdown when aspect ratio, sizing, or binary handling matters.',
25475
25690
  groups: [AXPWidgetGroupEnum.FormElement],
25476
- aiCatalog: 'include',
25477
25691
  type: 'editor',
25478
25692
  properties: [
25479
25693
  AXP_NAME_PROPERTY,
@@ -25645,13 +25859,13 @@ var listToolbarWidgetView_component = /*#__PURE__*/Object.freeze({
25645
25859
 
25646
25860
  const AXPListToolbarWidget = {
25647
25861
  name: 'list-toolbar',
25648
- title: 'List Toolbar',
25649
- description: '',
25862
+ title: '@platform-layout-widgets:widgets.list-toolbar.title',
25650
25863
  type: 'view',
25651
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
25864
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
25865
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_LISTS,
25652
25866
  aiDescription: 'Toolbar for list views: sort, filter, and column toggles. Use next to data-list when the user may refine or reorder rows.',
25653
25867
  groups: [AXPWidgetGroupEnum.UtilityWidget],
25654
- icon: 'fa-solid fa-square',
25868
+ icon: 'fa-light fa-square',
25655
25869
  properties: [
25656
25870
  AXP_NAME_PROPERTY,
25657
25871
  AXP_DATA_PATH_PROPERTY,
@@ -25690,13 +25904,13 @@ const AXPListToolbarWidget = {
25690
25904
 
25691
25905
  const AXPMapWidget = {
25692
25906
  name: 'map',
25693
- title: 'Map',
25694
- description: 'Displays and interacts with maps',
25907
+ title: '@platform-layout-widgets:widgets.map.title',
25908
+ description: '@platform-layout-widgets:widgets.map.description',
25695
25909
  icon: 'fa-light fa-map-location',
25696
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
25910
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
25911
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_TOOLS,
25697
25912
  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.',
25698
25913
  groups: [AXPWidgetGroupEnum.FormElement],
25699
- aiCatalog: 'include',
25700
25914
  type: 'editor',
25701
25915
  properties: [
25702
25916
  AXP_NAME_PROPERTY,
@@ -25851,7 +26065,7 @@ class AXPTimerDurationWidgetEditComponent extends AXPValueWidgetComponent {
25851
26065
  [options]="validation.options"
25852
26066
  ></ax-validation-rule>
25853
26067
  }
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 }); }
26068
+ </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
26069
  }
25856
26070
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTimerDurationWidgetEditComponent, decorators: [{
25857
26071
  type: Component,
@@ -25917,10 +26131,11 @@ var timeDurationWidgetView_component = /*#__PURE__*/Object.freeze({
25917
26131
 
25918
26132
  const AXPTimeDurationWidget = {
25919
26133
  name: 'time-duration',
25920
- title: 'Time Duration',
25921
- description: 'Selects a time duration',
26134
+ title: '@platform-layout-widgets:widgets.time-duration.title',
26135
+ description: '@platform-layout-widgets:widgets.time-duration.description',
25922
26136
  icon: 'fa-light fa-clock',
25923
26137
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
26138
+ subCategory: AXP_WIDGETS_EDITOR_SUB_DATETIME,
25924
26139
  groups: [AXPWidgetGroupEnum.FormElement],
25925
26140
  defaultFilterWidgetName: 'time-duration-filter',
25926
26141
  type: 'editor',
@@ -27191,10 +27406,11 @@ const AXPTimeDurationFilterWidget = {
27191
27406
 
27192
27407
  const AXPDocumentWidget = {
27193
27408
  name: 'document-layout',
27194
- title: 'Document',
27195
- description: 'Structures the entire document',
27409
+ title: '@platform-layout-widgets:widgets.document-layout.title',
27410
+ description: '@platform-layout-widgets:widgets.document-layout.description',
27196
27411
  icon: 'fa-light fa-page',
27197
27412
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
27413
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SHELL,
27198
27414
  type: 'container',
27199
27415
  properties: [],
27200
27416
  components: {},
@@ -27207,6 +27423,24 @@ class AXPFormFieldWidgetViewComponent extends AXPGridItemBaseLayoutWidgetCompone
27207
27423
  this.showLabel = computed(() => this.options()['showLabel'] ?? true, ...(ngDevMode ? [{ debugName: "showLabel" }] : /* istanbul ignore next */ []));
27208
27424
  this.badge = computed(() => this.options()['badge'], ...(ngDevMode ? [{ debugName: "badge" }] : /* istanbul ignore next */ []));
27209
27425
  this.visible = computed(() => this.options()['visible'], ...(ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []));
27426
+ this.hintText = computed(() => this.options()['hint'], ...(ngDevMode ? [{ debugName: "hintText" }] : /* istanbul ignore next */ []));
27427
+ this.hasHint = computed(() => {
27428
+ const h = this.hintText();
27429
+ if (h == null) {
27430
+ return false;
27431
+ }
27432
+ if (typeof h === 'string') {
27433
+ return h.trim().length > 0;
27434
+ }
27435
+ return true;
27436
+ }, ...(ngDevMode ? [{ debugName: "hasHint" }] : /* istanbul ignore next */ []));
27437
+ this.hintDisplayMode = computed(() => this.options()['hintDisplayMode'] === 'icon' ? 'icon' : 'note', ...(ngDevMode ? [{ debugName: "hintDisplayMode" }] : /* istanbul ignore next */ []));
27438
+ /** Info icon with tooltip (typically next to the label when the label is visible). */
27439
+ this.hintAsIcon = computed(() => this.hasHint() && this.hintDisplayMode() === 'icon', ...(ngDevMode ? [{ debugName: "hintAsIcon" }] : /* istanbul ignore next */ []));
27440
+ /** Visible helper copy under the field (inside `ax-form-field`). */
27441
+ this.hintAsNote = computed(() => this.hasHint() && this.hintDisplayMode() === 'note', ...(ngDevMode ? [{ debugName: "hintAsNote" }] : /* istanbul ignore next */ []));
27442
+ /** Label row needs to show even when label is hidden (e.g. icon-only hint with badge layout). */
27443
+ this.showTopRow = computed(() => this.showLabel() || !!this.badge() || this.hintAsIcon(), ...(ngDevMode ? [{ debugName: "showTopRow" }] : /* istanbul ignore next */ []));
27210
27444
  this.isRequired = computed(() => this.children().some((c) => {
27211
27445
  const validations = c.options?.['validations'];
27212
27446
  return Array.isArray(validations) && validations.some((v) => v.rule === 'required');
@@ -27218,14 +27452,25 @@ class AXPFormFieldWidgetViewComponent extends AXPGridItemBaseLayoutWidgetCompone
27218
27452
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFormFieldWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
27219
27453
  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
27454
  <ax-form-field>
27221
- @if (showLabel() || badge()) {
27455
+ @if (showTopRow()) {
27222
27456
  <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
- }
27457
+ <div class="ax-flex ax-min-w-0 ax-flex-wrap ax-items-center ax-gap-1 ax-leading-none">
27458
+ @if (showLabel()) {
27459
+ <ax-label [required]="isRequired()" class="ax-inline-flex ax-min-w-0 ax-items-center">{{ label() | translate | async }}</ax-label>
27460
+ }
27461
+ @if (hintAsIcon()) {
27462
+ <i
27463
+ role="button"
27464
+ tabindex="0"
27465
+ 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]"
27466
+ [axTooltip]="(hintText()! | translate | async) ?? ''"
27467
+ axTooltipPlacement="top"
27468
+ [attr.aria-label]="(hintText()! | translate | async) ?? ''"
27469
+ ></i>
27470
+ }
27471
+ </div>
27226
27472
  @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>
27473
+ <span class="ax-text ax-p-1 ax-text-xs ax-rounded-md">{{ badge() | translate | async }}</span>
27229
27474
  }
27230
27475
  </div>
27231
27476
  }
@@ -27239,8 +27484,13 @@ class AXPFormFieldWidgetViewComponent extends AXPGridItemBaseLayoutWidgetCompone
27239
27484
  >
27240
27485
  </ng-container>
27241
27486
  }
27487
+ @if (hintAsNote()) {
27488
+ <p class="ax-text-xs ax-mt-1 ax-font-normal ax-opacity-75">
27489
+ {{ hintText()! | translate | async }}
27490
+ </p>
27491
+ }
27242
27492
  </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 }); }
27493
+ `, 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
27494
  }
27245
27495
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFormFieldWidgetViewComponent, decorators: [{
27246
27496
  type: Component,
@@ -27248,14 +27498,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
27248
27498
  selector: 'axp-form-field-widget-view',
27249
27499
  template: `
27250
27500
  <ax-form-field>
27251
- @if (showLabel() || badge()) {
27501
+ @if (showTopRow()) {
27252
27502
  <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
- }
27503
+ <div class="ax-flex ax-min-w-0 ax-flex-wrap ax-items-center ax-gap-1 ax-leading-none">
27504
+ @if (showLabel()) {
27505
+ <ax-label [required]="isRequired()" class="ax-inline-flex ax-min-w-0 ax-items-center">{{ label() | translate | async }}</ax-label>
27506
+ }
27507
+ @if (hintAsIcon()) {
27508
+ <i
27509
+ role="button"
27510
+ tabindex="0"
27511
+ 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]"
27512
+ [axTooltip]="(hintText()! | translate | async) ?? ''"
27513
+ axTooltipPlacement="top"
27514
+ [attr.aria-label]="(hintText()! | translate | async) ?? ''"
27515
+ ></i>
27516
+ }
27517
+ </div>
27256
27518
  @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>
27519
+ <span class="ax-text ax-p-1 ax-text-xs ax-rounded-md">{{ badge() | translate | async }}</span>
27259
27520
  }
27260
27521
  </div>
27261
27522
  }
@@ -27269,10 +27530,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
27269
27530
  >
27270
27531
  </ng-container>
27271
27532
  }
27533
+ @if (hintAsNote()) {
27534
+ <p class="ax-text-xs ax-mt-1 ax-font-normal ax-opacity-75">
27535
+ {{ hintText()! | translate | async }}
27536
+ </p>
27537
+ }
27272
27538
  </ax-form-field>
27273
27539
  `,
27274
27540
  changeDetection: ChangeDetectionStrategy.OnPush,
27275
- imports: [CommonModule, AXFormModule, AXLabelModule, AXPWidgetCoreModule, AXTranslationModule, AXBadgeModule],
27541
+ imports: [
27542
+ CommonModule,
27543
+ AXFormModule,
27544
+ AXLabelModule,
27545
+ AXPWidgetCoreModule,
27546
+ AXTranslationModule,
27547
+ AXBadgeModule,
27548
+ AXDecoratorModule,
27549
+ AXTooltipModule,
27550
+ ],
27276
27551
  standalone: true,
27277
27552
  }]
27278
27553
  }], propDecorators: { __class: [{
@@ -27289,6 +27564,20 @@ class AXPFormFieldWidgetDesignerComponent extends AXPGridItemBaseLayoutWidgetCom
27289
27564
  constructor() {
27290
27565
  super(...arguments);
27291
27566
  this.label = computed(() => this.options()['label'], ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
27567
+ this.hint = computed(() => this.options()['hint'], ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
27568
+ this.hasHint = computed(() => {
27569
+ const h = this.hint();
27570
+ if (h == null || h === '') {
27571
+ return false;
27572
+ }
27573
+ if (typeof h === 'string') {
27574
+ return h.trim().length > 0;
27575
+ }
27576
+ return true;
27577
+ }, ...(ngDevMode ? [{ debugName: "hasHint" }] : /* istanbul ignore next */ []));
27578
+ this.hintDisplayMode = computed(() => this.options()['hintDisplayMode'] === 'icon' ? 'icon' : 'note', ...(ngDevMode ? [{ debugName: "hintDisplayMode" }] : /* istanbul ignore next */ []));
27579
+ this.hintAsIcon = computed(() => this.hasHint() && this.hintDisplayMode() === 'icon', ...(ngDevMode ? [{ debugName: "hintAsIcon" }] : /* istanbul ignore next */ []));
27580
+ this.hintAsNote = computed(() => this.hasHint() && this.hintDisplayMode() === 'note', ...(ngDevMode ? [{ debugName: "hintAsNote" }] : /* istanbul ignore next */ []));
27292
27581
  }
27293
27582
  get __class() {
27294
27583
  return this.hostClass();
@@ -27301,7 +27590,12 @@ class AXPFormFieldWidgetDesignerComponent extends AXPGridItemBaseLayoutWidgetCom
27301
27590
  },
27302
27591
  ], usesInheritance: true, ngImport: i0, template: `
27303
27592
  <ax-form-field>
27304
- <ax-label>{{ label() | translate | async }}</ax-label>
27593
+ <div class="ax-flex ax-gap-1 ax-items-center">
27594
+ <ax-label>{{ label() | translate | async }}</ax-label>
27595
+ @if (hintAsIcon()) {
27596
+ <i class="fa-regular fa-circle-info ax-text-sm ax-opacity-75" aria-hidden="true"></i>
27597
+ }
27598
+ </div>
27305
27599
  @for (node of children(); track $index) {
27306
27600
  <ng-container
27307
27601
  axp-widget-designer-renderer
@@ -27314,6 +27608,11 @@ class AXPFormFieldWidgetDesignerComponent extends AXPGridItemBaseLayoutWidgetCom
27314
27608
  } @empty {
27315
27609
  <axp-designer-add-widget-mini-button></axp-designer-add-widget-mini-button>
27316
27610
  }
27611
+ @if (hintAsNote()) {
27612
+ <p class="ax-text-xs ax-mt-1 ax-font-normal ax-opacity-75">
27613
+ {{ hint() | translate | async }}
27614
+ </p>
27615
+ }
27317
27616
  </ax-form-field>
27318
27617
  `, 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
27618
  }
@@ -27323,7 +27622,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
27323
27622
  selector: 'axp-form-field-widget-designer',
27324
27623
  template: `
27325
27624
  <ax-form-field>
27326
- <ax-label>{{ label() | translate | async }}</ax-label>
27625
+ <div class="ax-flex ax-gap-1 ax-items-center">
27626
+ <ax-label>{{ label() | translate | async }}</ax-label>
27627
+ @if (hintAsIcon()) {
27628
+ <i class="fa-regular fa-circle-info ax-text-sm ax-opacity-75" aria-hidden="true"></i>
27629
+ }
27630
+ </div>
27327
27631
  @for (node of children(); track $index) {
27328
27632
  <ng-container
27329
27633
  axp-widget-designer-renderer
@@ -27336,6 +27640,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
27336
27640
  } @empty {
27337
27641
  <axp-designer-add-widget-mini-button></axp-designer-add-widget-mini-button>
27338
27642
  }
27643
+ @if (hintAsNote()) {
27644
+ <p class="ax-text-xs ax-mt-1 ax-font-normal ax-opacity-75">
27645
+ {{ hint() | translate | async }}
27646
+ </p>
27647
+ }
27339
27648
  </ax-form-field>
27340
27649
  `,
27341
27650
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -27366,14 +27675,37 @@ var formFieldWidgetDesigner_component = /*#__PURE__*/Object.freeze({
27366
27675
  AXPFormFieldWidgetDesignerComponent: AXPFormFieldWidgetDesignerComponent
27367
27676
  });
27368
27677
 
27678
+ const AXP_FORM_FIELD_HINT_PROPERTY = createStringProperty({
27679
+ name: 'hint',
27680
+ title: 'Hint',
27681
+ path: 'options.hint',
27682
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
27683
+ });
27684
+ const AXP_FORM_FIELD_HINT_DISPLAY_MODE_PROPERTY = createSelectProperty({
27685
+ name: 'hintDisplayMode',
27686
+ title: 'Hint display',
27687
+ path: 'options.hintDisplayMode',
27688
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
27689
+ defaultValue: 'note',
27690
+ dataSource: [
27691
+ { id: 'note', title: 'Note (below field)' },
27692
+ { id: 'icon', title: 'Icon (tooltip)' },
27693
+ ],
27694
+ });
27369
27695
  const AXPFormFieldWidget = {
27370
27696
  name: 'form-field',
27371
- title: 'Form Field',
27697
+ title: '@platform-layout-widgets:widgets.form-field.title',
27372
27698
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
27699
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_UTILITY,
27373
27700
  groups: [AXPWidgetGroupEnum.FormElement],
27374
27701
  type: 'container',
27375
27702
  icon: 'fa-light fa-pen-field',
27376
- properties: [AXP_NAME_PROPERTY, cloneProperty(AXP_LABEL_PROPERTY, { schema: { defaultValue: 'Sample Label' } })],
27703
+ properties: [
27704
+ AXP_NAME_PROPERTY,
27705
+ cloneProperty(AXP_LABEL_PROPERTY, { schema: { defaultValue: 'Sample Label' } }),
27706
+ AXP_FORM_FIELD_HINT_PROPERTY,
27707
+ AXP_FORM_FIELD_HINT_DISPLAY_MODE_PROPERTY,
27708
+ ],
27377
27709
  components: {
27378
27710
  view: {
27379
27711
  component: () => Promise.resolve().then(function () { return formFieldWidgetView_component; }).then((c) => c.AXPFormFieldWidgetViewComponent),
@@ -27864,9 +28196,10 @@ var gridWidgetView_component = /*#__PURE__*/Object.freeze({
27864
28196
 
27865
28197
  const AXPGridWidget = {
27866
28198
  name: 'grid-layout',
27867
- title: 'Grid Layout',
28199
+ title: '@platform-layout-widgets:widgets.grid-layout.title',
27868
28200
  type: 'container',
27869
28201
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
28202
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
27870
28203
  groups: [AXPWidgetGroupEnum.FormElement],
27871
28204
  icon: 'fa-light fa-grid',
27872
28205
  properties: [
@@ -28103,9 +28436,10 @@ var gridItemWidgetView_component = /*#__PURE__*/Object.freeze({
28103
28436
 
28104
28437
  const AXPGridItemWidget = {
28105
28438
  name: 'grid-item-layout',
28106
- title: 'Grid Item',
28439
+ title: '@platform-layout-widgets:widgets.grid-item-layout.title',
28107
28440
  type: 'container',
28108
28441
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
28442
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
28109
28443
  // groups: [AXPWidgetGroupEnum.FormElement],
28110
28444
  icon: 'fa-light fa-objects-column',
28111
28445
  properties: [
@@ -28132,10 +28466,11 @@ const AXPGridItemWidget = {
28132
28466
 
28133
28467
  const AXPAlertBoxWidget = {
28134
28468
  name: 'alert-box-layout',
28135
- title: 'Alert Box',
28136
- description: 'Displays an alert with title and description using ax-alert',
28469
+ title: '@platform-layout-widgets:widgets.alert-box-layout.title',
28470
+ description: '@platform-layout-widgets:widgets.alert-box-layout.description',
28137
28471
  icon: 'fa-light fa-circle-info',
28138
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
28472
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
28473
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SURFACES,
28139
28474
  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.',
28140
28475
  groups: [AXPWidgetGroupEnum.FormElement],
28141
28476
  type: 'view',
@@ -28378,9 +28713,10 @@ var iconWidgetColumn_component = /*#__PURE__*/Object.freeze({
28378
28713
 
28379
28714
  const AXPIconWidget = {
28380
28715
  name: 'icon',
28381
- title: 'Icon',
28716
+ title: '@platform-layout-widgets:widgets.icon.title',
28382
28717
  type: 'view',
28383
28718
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
28719
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_UTILITY,
28384
28720
  // groups: [AXPWidgetGroupEnum.FormElement],
28385
28721
  icon: 'fa-light fa-icons',
28386
28722
  properties: [AXP_NAME_PROPERTY],
@@ -28586,10 +28922,11 @@ var panelWidgetView_component = /*#__PURE__*/Object.freeze({
28586
28922
  const AXPPanelWidget = {
28587
28923
  name: 'panel-layout',
28588
28924
  type: 'container',
28589
- title: 'Panel Layout',
28590
- description: 'Organizes content in a collapsible panel',
28925
+ title: '@platform-layout-widgets:widgets.panel-layout.title',
28926
+ description: '@platform-layout-widgets:widgets.panel-layout.description',
28591
28927
  icon: 'fa-light fa-rectangle-list',
28592
28928
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
28929
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SURFACES,
28593
28930
  groups: [AXPWidgetGroupEnum.FormElement],
28594
28931
  properties: [
28595
28932
  AXP_NAME_PROPERTY,
@@ -28843,13 +29180,14 @@ var tabsetWidgetDesigner_component = /*#__PURE__*/Object.freeze({
28843
29180
 
28844
29181
  const AXPTabSetWidget = {
28845
29182
  name: 'tabset-layout',
28846
- title: 'TabSet Layout',
28847
- description: 'A tab set layout is a widget that displays a tab set',
29183
+ title: '@platform-layout-widgets:widgets.tabset-layout.title',
29184
+ description: '@platform-layout-widgets:widgets.tabset-layout.description',
28848
29185
  type: 'view',
28849
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
29186
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
29187
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_TABS,
28850
29188
  aiDescription: 'Use to split content into labeled tabs. Pair with tabset-item children; each tab should map to one logical section of the answer.',
28851
29189
  groups: [AXPWidgetGroupEnum.FormElement],
28852
- icon: 'fa-solid fa-square',
29190
+ icon: 'fa-light fa-square',
28853
29191
  properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY],
28854
29192
  components: {
28855
29193
  view: {
@@ -28930,13 +29268,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
28930
29268
 
28931
29269
  const AXPTabSetItemWidget = {
28932
29270
  name: 'tabset-item',
28933
- title: 'TabSet Item',
28934
- description: 'A tab set item is a widget that displays a tab set item',
29271
+ title: '@platform-layout-widgets:widgets.tabset-item.title',
29272
+ description: '@platform-layout-widgets:widgets.tabset-item.description',
28935
29273
  type: 'view',
28936
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
29274
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
29275
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_TABS,
28937
29276
  aiDescription: 'Single tab panel inside a tabset. Use one item per tab label; put the tab content in the slot or bound child widgets.',
28938
29277
  groups: [AXPWidgetGroupEnum.FormElement],
28939
- icon: 'fa-solid fa-square',
29278
+ icon: 'fa-light fa-square',
28940
29279
  properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY],
28941
29280
  components: {
28942
29281
  view: {
@@ -28977,10 +29316,11 @@ var textBlockWidgetView_component = /*#__PURE__*/Object.freeze({
28977
29316
 
28978
29317
  const AXPTextBlockWidget = {
28979
29318
  name: 'text-block-layout',
28980
- title: 'Text Block',
28981
- description: 'Displays text blocks',
29319
+ title: '@platform-layout-widgets:widgets.text-block-layout.title',
29320
+ description: '@platform-layout-widgets:widgets.text-block-layout.description',
28982
29321
  icon: 'fa-light fa-text',
28983
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
29322
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
29323
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SURFACES,
28984
29324
  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.',
28985
29325
  groups: [AXPWidgetGroupEnum.FormElement],
28986
29326
  type: 'view',
@@ -29457,6 +29797,7 @@ var triggerExpressionEditorPopup_component = /*#__PURE__*/Object.freeze({
29457
29797
  AXPTriggerExpressionEditorPopupComponent: AXPTriggerExpressionEditorPopupComponent
29458
29798
  });
29459
29799
 
29800
+ //#region ---- Imports ----
29460
29801
  //#endregion
29461
29802
  //#region ---- Widget Lists (single source of truth) ----
29462
29803
  /**
@@ -29573,6 +29914,7 @@ const EXTENDED_WIDGETS = [
29573
29914
  name: 'select-filter',
29574
29915
  title: 'Select Filter',
29575
29916
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
29917
+ groups: [AXPWidgetGroupEnum.BaseWidget],
29576
29918
  type: 'filter',
29577
29919
  components: {},
29578
29920
  options: {
@@ -29676,7 +30018,7 @@ function toSerializableWidget(config) {
29676
30018
  ...(config.icon != null ? { icon: config.icon } : {}),
29677
30019
  ...(config.description != null ? { description: resolveWidgetLabelForAi(config.description) || undefined } : {}),
29678
30020
  ...(config.aiDescription != null && config.aiDescription !== '' ? { aiDescription: config.aiDescription } : {}),
29679
- categories: normalizeWidgetCategories(config.categories).map((c) => ({
30021
+ categories: normalizeDefinitionCategories(config.categories).map((c) => ({
29680
30022
  name: c.name,
29681
30023
  title: resolveWidgetLabelForAi(c.title) || c.name,
29682
30024
  order: c.order,
@@ -29689,7 +30031,6 @@ function toSerializableWidget(config) {
29689
30031
  ...(config.designer != null ? { designer: config.designer } : {}),
29690
30032
  ...(config.options != null ? { options: config.options } : {}),
29691
30033
  ...(config.defaultFilterWidgetName != null ? { defaultFilterWidgetName: config.defaultFilterWidgetName } : {}),
29692
- ...(config.aiCatalog != null ? { aiCatalog: config.aiCatalog } : {}),
29693
30034
  };
29694
30035
  }
29695
30036
  function buildUsage(config) {
@@ -29712,7 +30053,7 @@ function buildUsage(config) {
29712
30053
  //#endregion
29713
30054
  //#region ---- Query ----
29714
30055
  /**
29715
- * Read-only catalog of widgets suitable for AI structured rendering (Widgets:GetForAI).
30056
+ * Read-only full widget registry (Widgets:GetForAI). Lists every registered widget.
29716
30057
  */
29717
30058
  class AXPGetWidgetsForAIQuery {
29718
30059
  constructor() {
@@ -29721,16 +30062,13 @@ class AXPGetWidgetsForAIQuery {
29721
30062
  async fetch(input) {
29722
30063
  const name = input?.name?.trim();
29723
30064
  if (!name) {
29724
- const list = this.registry
29725
- .all()
29726
- .filter((w) => isWidgetAiCatalogIncluded(w))
29727
- .map((w) => ({
30065
+ const list = this.registry.all().map((w) => ({
29728
30066
  name: String(w.name),
29729
30067
  title: resolveWidgetLabelForAi(w.title) || String(w.name),
29730
30068
  ...(w.description != null ? { description: resolveWidgetLabelForAi(w.description) || undefined } : {}),
29731
30069
  ...(w.aiDescription != null && w.aiDescription !== '' ? { aiDescription: w.aiDescription } : {}),
29732
30070
  type: w.type,
29733
- categories: normalizeWidgetCategories(w.categories).map((c) => ({
30071
+ categories: normalizeDefinitionCategories(w.categories).map((c) => ({
29734
30072
  name: c.name,
29735
30073
  title: resolveWidgetLabelForAi(c.title) || c.name,
29736
30074
  order: c.order,
@@ -29740,12 +30078,6 @@ class AXPGetWidgetsForAIQuery {
29740
30078
  }
29741
30079
  try {
29742
30080
  const config = this.registry.resolve(name);
29743
- if (!isWidgetAiCatalogIncluded(config)) {
29744
- return {
29745
- success: false,
29746
- error: `Widget "${name}" is not available for the AI widget catalog.`,
29747
- };
29748
- }
29749
30081
  return {
29750
30082
  success: true,
29751
30083
  detail: toSerializableWidget(config),