@acorex/platform 21.0.0-next.37 → 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 (64) hide show
  1. package/fesm2022/acorex-platform-common.mjs +25 -3
  2. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  3. package/fesm2022/acorex-platform-core.mjs +18 -172
  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 +29 -13
  8. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-layout-components.mjs +62 -40
  10. package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
  11. package/fesm2022/acorex-platform-layout-designer.mjs +209 -62
  12. package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
  13. package/fesm2022/acorex-platform-layout-entity.mjs +1072 -358
  14. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  15. package/fesm2022/acorex-platform-layout-views.mjs +171 -86
  16. package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
  17. package/fesm2022/acorex-platform-layout-widget-core.mjs +170 -63
  18. package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
  19. package/fesm2022/{acorex-platform-layout-widgets-file-list-popup.component-9uCkMxcc.mjs → acorex-platform-layout-widgets-file-list-popup.component-CDYAGBku.mjs} +5 -60
  20. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-CDYAGBku.mjs.map +1 -0
  21. package/fesm2022/acorex-platform-layout-widgets.mjs +720 -415
  22. package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
  23. package/fesm2022/acorex-platform-runtime.mjs +120 -9
  24. package/fesm2022/acorex-platform-runtime.mjs.map +1 -1
  25. 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
  26. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-Cx1lLUaR.mjs.map +1 -0
  27. 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
  28. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-AOrcgjDF.mjs.map +1 -0
  29. 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
  30. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-BfCeUU5F.mjs.map +1 -0
  31. package/fesm2022/acorex-platform-themes-default.mjs +26 -14
  32. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  33. package/fesm2022/{acorex-platform-themes-shared-settings.provider-DSs1o1M6.mjs → acorex-platform-themes-shared-settings.provider-D13QB3Hr.mjs} +2 -2
  34. package/fesm2022/acorex-platform-themes-shared-settings.provider-D13QB3Hr.mjs.map +1 -0
  35. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-D566Kdvy.mjs +94 -0
  36. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-D566Kdvy.mjs.map +1 -0
  37. 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
  38. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-D7-rCGl7.mjs.map +1 -0
  39. package/fesm2022/acorex-platform-themes-shared.mjs +183 -84
  40. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  41. package/fesm2022/acorex-platform-workflow.mjs +75 -15
  42. package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
  43. package/package.json +1 -1
  44. package/types/acorex-platform-common.d.ts +11 -6
  45. package/types/acorex-platform-core.d.ts +67 -101
  46. package/types/acorex-platform-domain.d.ts +28 -2
  47. package/types/acorex-platform-layout-builder.d.ts +41 -28
  48. package/types/acorex-platform-layout-components.d.ts +4 -3
  49. package/types/acorex-platform-layout-designer.d.ts +56 -16
  50. package/types/acorex-platform-layout-entity.d.ts +180 -40
  51. package/types/acorex-platform-layout-views.d.ts +31 -29
  52. package/types/acorex-platform-layout-widget-core.d.ts +81 -52
  53. package/types/acorex-platform-layout-widgets.d.ts +42 -16
  54. package/types/acorex-platform-runtime.d.ts +156 -61
  55. package/types/acorex-platform-themes-default.d.ts +1 -0
  56. package/types/acorex-platform-workflow.d.ts +64 -52
  57. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-9uCkMxcc.mjs.map +0 -1
  58. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-Cvvr4HnL.mjs.map +0 -1
  59. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-TYoLN1Jq.mjs.map +0 -1
  60. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-C2z5Lq9y.mjs.map +0 -1
  61. package/fesm2022/acorex-platform-themes-shared-settings.provider-DSs1o1M6.mjs.map +0 -1
  62. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-CHfrTtol.mjs +0 -65
  63. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-CHfrTtol.mjs.map +0 -1
  64. 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';
@@ -20,9 +20,9 @@ import { AXTabsModule } from '@acorex/components/tabs';
20
20
  import * as i1$6 from '@acorex/components/text-box';
21
21
  import { AXTextBoxModule } from '@acorex/components/text-box';
22
22
  import * as i6 from '@acorex/core/translation';
23
- import { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';
23
+ import { AXTranslationModule, AXTranslationService, resolveMultiLanguageString } from '@acorex/core/translation';
24
24
  import { AXP_LOCALE_MANAGEMENT_PORT, AXPFilterOperatorMiddlewareService, AXPCleanNestedFilters, AXPClipBoardService, AXPSettingsService, AXPRegionalSetting, AXPFileStorageService, AXPFileTypeProviderService, AXPFileActionsService, AXPStatusDefinitionProviderService, AXPRefreshEvent, AXPCommonSettings, ALL_DEFAULT_OPERATORS, DATE_OPERATORS, BOOLEAN_OPERATORS, NUMBER_OPERATORS, STRING_OPERATORS } from '@acorex/platform/common';
25
- import { AXPDeviceService, setSmart, AXPColorPaletteService, extractValue, AXPResolveMultiLanguageStringPipe, AXPMultiLanguageStringResolverService, AXPTagService, AXPExpressionEvaluatorService, AXPHookService, AXPDataGenerator, AXPComponentSlotModule, AXPDataSourceDefinitionProviderService, sortByMultiLanguageString, applyQueryArray, objectKeyValueTransforms, resolveMultiLanguageString } from '@acorex/platform/core';
25
+ import { AXPDeviceService, setSmart, AXPColorPaletteService, extractValue, AXPTagService, AXPExpressionEvaluatorService, AXPHookService, AXPDataGenerator, AXPComponentSlotModule, AXPDataSourceDefinitionProviderService, sortByMultiLanguageString, applyQueryArray, objectKeyValueTransforms } from '@acorex/platform/core';
26
26
  import * as i1$4 from '@angular/common';
27
27
  import { CommonModule, AsyncPipe } from '@angular/common';
28
28
  import * as i0 from '@angular/core';
@@ -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: [
@@ -5577,20 +5589,20 @@ const AXPEditorJsWidget = {
5577
5589
  class AXPLargeTextWidgetColumnComponent extends AXPColumnWidgetComponent {
5578
5590
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPLargeTextWidgetColumnComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
5579
5591
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPLargeTextWidgetColumnComponent, isStandalone: true, selector: "axp-large-text-widget-column", inputs: { rawValue: "rawValue", rowData: "rowData" }, usesInheritance: true, ngImport: i0, template: `
5580
- @let text = rawValue | axpResolveMultiLanguageString;
5592
+ @let text = rawValue | translate | async;
5581
5593
  @if (text) {
5582
5594
  <span class="ax-truncate"> {{ text }} </span>
5583
5595
  } @else {
5584
5596
  <span class="ax-text-muted">---</span>
5585
5597
  }
5586
- `, isInline: true, dependencies: [{ kind: "pipe", type: AXPResolveMultiLanguageStringPipe, name: "axpResolveMultiLanguageString" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5598
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5587
5599
  }
5588
5600
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPLargeTextWidgetColumnComponent, decorators: [{
5589
5601
  type: Component,
5590
5602
  args: [{
5591
5603
  selector: 'axp-large-text-widget-column',
5592
5604
  template: `
5593
- @let text = rawValue | axpResolveMultiLanguageString;
5605
+ @let text = rawValue | translate | async;
5594
5606
  @if (text) {
5595
5607
  <span class="ax-truncate"> {{ text }} </span>
5596
5608
  } @else {
@@ -5598,7 +5610,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
5598
5610
  }
5599
5611
  `,
5600
5612
  changeDetection: ChangeDetectionStrategy.OnPush,
5601
- imports: [AXPResolveMultiLanguageStringPipe],
5613
+ imports: [AXTranslationModule, AsyncPipe],
5602
5614
  inputs: ['rawValue', 'rowData'],
5603
5615
  }]
5604
5616
  }] });
@@ -5620,11 +5632,10 @@ class AXPLargeTextWidgetEditComponent extends AXPValueWidgetComponent {
5620
5632
  this.rows = computed(() => this.options()['rows'], ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
5621
5633
  this.popupService = inject(AXPopupService);
5622
5634
  this.translationService = inject(AXTranslationService);
5623
- this.mlResolver = inject(AXPMultiLanguageStringResolverService);
5624
5635
  this.currentLanguage = toSignal(this.translationService.langChanges$, {
5625
5636
  initialValue: this.translationService.getActiveLang(),
5626
5637
  });
5627
- this.getCurrentText = computed(() => this.mlResolver.resolve(this.getValue(), this.currentLanguage()), ...(ngDevMode ? [{ debugName: "getCurrentText" }] : /* istanbul ignore next */ []));
5638
+ this.getCurrentText = computed(() => this.translationService.resolve(this.getValue(), this.currentLanguage()), ...(ngDevMode ? [{ debugName: "getCurrentText" }] : /* istanbul ignore next */ []));
5628
5639
  }
5629
5640
  ngOnInit() {
5630
5641
  super.ngOnInit();
@@ -5658,7 +5669,7 @@ class AXPLargeTextWidgetEditComponent extends AXPValueWidgetComponent {
5658
5669
  title: 'Select Language',
5659
5670
  size: 'md',
5660
5671
  data: {
5661
- values: this.mlResolver.toLocaleMap(this.getValue(), this.currentLanguage()),
5672
+ values: this.translationService.toLocaleMap(this.getValue(), this.currentLanguage()),
5662
5673
  currentLanguage: this.currentLanguage(),
5663
5674
  node: node,
5664
5675
  mode: 'edit',
@@ -5776,50 +5787,34 @@ var largeTextWidgetEdit_component = /*#__PURE__*/Object.freeze({
5776
5787
  class AXPLargeTextWidgetViewComponent extends AXPValueWidgetComponent {
5777
5788
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPLargeTextWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
5778
5789
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPLargeTextWidgetViewComponent, isStandalone: true, selector: "axp-large-text-widget-view", usesInheritance: true, ngImport: i0, template: `
5779
-
5780
5790
  <div class="ax-max-w-full ax-text-muted">
5781
-
5782
- @let text = getValue() | axpResolveMultiLanguageString;
5791
+ @let text = getValue() | translate | async;
5783
5792
 
5784
5793
  @if (text) {
5785
-
5786
5794
  <span> {{ text }} </span>
5787
-
5788
5795
  } @else {
5789
-
5790
5796
  <span class="ax-text-muted">---</span>
5791
-
5792
5797
  }
5793
-
5794
5798
  </div>
5795
-
5796
- `, isInline: true, dependencies: [{ kind: "pipe", type: AXPResolveMultiLanguageStringPipe, name: "axpResolveMultiLanguageString" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5799
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5797
5800
  }
5798
5801
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPLargeTextWidgetViewComponent, decorators: [{
5799
5802
  type: Component,
5800
5803
  args: [{
5801
5804
  selector: 'axp-large-text-widget-view',
5802
5805
  template: `
5803
-
5804
5806
  <div class="ax-max-w-full ax-text-muted">
5805
-
5806
- @let text = getValue() | axpResolveMultiLanguageString;
5807
+ @let text = getValue() | translate | async;
5807
5808
 
5808
5809
  @if (text) {
5809
-
5810
5810
  <span> {{ text }} </span>
5811
-
5812
5811
  } @else {
5813
-
5814
5812
  <span class="ax-text-muted">---</span>
5815
-
5816
5813
  }
5817
-
5818
5814
  </div>
5819
-
5820
5815
  `,
5821
5816
  changeDetection: ChangeDetectionStrategy.OnPush,
5822
- imports: [AXPResolveMultiLanguageStringPipe],
5817
+ imports: [AXTranslationModule, AsyncPipe],
5823
5818
  }]
5824
5819
  }] });
5825
5820
 
@@ -5830,10 +5825,11 @@ var largeTextWidgetView_component = /*#__PURE__*/Object.freeze({
5830
5825
 
5831
5826
  const AXPLargeTextWidget = {
5832
5827
  name: 'large-text-editor',
5833
- title: 'Large Text Box',
5834
- 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',
5835
5830
  icon: 'fa-light fa-input-text',
5836
5831
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
5832
+ subCategory: AXP_WIDGETS_EDITOR_SUB_TEXT_INPUTS,
5837
5833
  groups: [AXPWidgetGroupEnum.FormElement],
5838
5834
  defaultFilterWidgetName: 'string-filter',
5839
5835
  type: 'editor',
@@ -5970,10 +5966,11 @@ var listWidgetColumn_component = /*#__PURE__*/Object.freeze({
5970
5966
 
5971
5967
  const AXPDragDropListWidget = {
5972
5968
  name: 'list-editor',
5973
- title: 'Drag & Drop List',
5974
- 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',
5975
5971
  icon: 'fa-light fa-list',
5976
5972
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
5973
+ subCategory: AXP_WIDGETS_EDITOR_SUB_CHOICE,
5977
5974
  groups: [AXPWidgetGroupEnum.FormElement],
5978
5975
  properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY],
5979
5976
  type: 'editor',
@@ -6249,10 +6246,11 @@ var numberBoxWidgetView_component = /*#__PURE__*/Object.freeze({
6249
6246
 
6250
6247
  const AXPNumberBoxWidget = {
6251
6248
  name: 'number-editor',
6252
- title: 'Number Box',
6253
- description: 'Inputs numeric values',
6249
+ title: '@platform-layout-widgets:widgets.number-editor.title',
6250
+ description: '@platform-layout-widgets:widgets.number-editor.description',
6254
6251
  icon: 'fa-light fa-input-numeric',
6255
6252
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
6253
+ subCategory: AXP_WIDGETS_EDITOR_SUB_NUMERIC,
6256
6254
  groups: [AXPWidgetGroupEnum.FormElement],
6257
6255
  type: 'editor',
6258
6256
  defaultFilterWidgetName: 'number-filter',
@@ -6498,10 +6496,11 @@ var passwordBoxWidgetView_component = /*#__PURE__*/Object.freeze({
6498
6496
 
6499
6497
  const AXPPasswordBoxWidget = {
6500
6498
  name: 'password-editor',
6501
- title: 'Password Box',
6502
- description: 'Secures password input',
6499
+ title: '@platform-layout-widgets:widgets.password-editor.title',
6500
+ description: '@platform-layout-widgets:widgets.password-editor.description',
6503
6501
  icon: 'fa-light fa-lock',
6504
6502
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
6503
+ subCategory: AXP_WIDGETS_EDITOR_SUB_TEXT_INPUTS,
6505
6504
  type: 'editor',
6506
6505
  properties: [
6507
6506
  AXP_NAME_PROPERTY,
@@ -6861,10 +6860,11 @@ var progressBarWidgetView_component = /*#__PURE__*/Object.freeze({
6861
6860
 
6862
6861
  const AXPProgressBarWidget = {
6863
6862
  name: 'progress-bar-editor',
6864
- title: 'Progress Bar',
6865
- 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',
6866
6865
  icon: 'fa-light fa-chart-line-up',
6867
6866
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
6867
+ subCategory: AXP_WIDGETS_EDITOR_SUB_NUMERIC,
6868
6868
  groups: [AXPWidgetGroupEnum.FormElement],
6869
6869
  type: 'editor',
6870
6870
  properties: [
@@ -7078,10 +7078,11 @@ var ratePickerWidgetView_component = /*#__PURE__*/Object.freeze({
7078
7078
 
7079
7079
  const AXPRatePickerWidget = {
7080
7080
  name: 'rate-picker-editor',
7081
- title: 'Rate Picker',
7082
- 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',
7083
7083
  icon: 'fa-light fa-star',
7084
7084
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
7085
+ subCategory: AXP_WIDGETS_EDITOR_SUB_NUMERIC,
7085
7086
  groups: [AXPWidgetGroupEnum.FormElement],
7086
7087
  defaultFilterWidgetName: 'number-filter',
7087
7088
  type: 'editor',
@@ -7123,30 +7124,97 @@ const AXPRatePickerWidget = {
7123
7124
  },
7124
7125
  };
7125
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
+
7126
7175
  class AXPRichTextWidgetColumnComponent extends AXPColumnWidgetComponent {
7127
7176
  constructor() {
7128
7177
  super(...arguments);
7129
7178
  this.platform = inject(AXPlatform);
7130
7179
  this.layoutBuilder = inject(AXPLayoutBuilderService);
7131
- this.mlResolver = inject(AXPMultiLanguageStringResolverService);
7180
+ this.mlResolver = inject(AXTranslationService);
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();
7132
7195
  }
7133
7196
  async openPopup() {
7134
- 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);
7135
7203
  const size = this.platform.is('Mobile') || this.platform.is('SM') ? 'full' : 'md';
7136
- const ref = await this.layoutBuilder
7204
+ await this.layoutBuilder
7137
7205
  .create()
7138
7206
  .dialog((dialog) => {
7139
7207
  dialog
7140
- .setTitle(this.path ?? '')
7208
+ .setTitle(title)
7141
7209
  .setSize(size)
7210
+ .setContext({ [AXP_RICH_TEXT_DIALOG_BODY_PATH]: resolvedHtml })
7142
7211
  .content((layoutBuilder) => {
7143
7212
  layoutBuilder.flex((flex) => {
7144
- flex.mode('view').formField('Content', (field) => {
7145
- field.readonly(true).customWidget('rich-text-editor', {
7146
- src: html,
7147
- toolbar: [],
7148
- height: 400,
7149
- });
7213
+ flex.mode('view').richText({
7214
+ path: AXP_RICH_TEXT_DIALOG_BODY_PATH,
7215
+ defaultValue: resolvedHtml,
7216
+ showFullContent: true,
7217
+ height: 400,
7150
7218
  });
7151
7219
  });
7152
7220
  })
@@ -7155,42 +7223,71 @@ class AXPRichTextWidgetColumnComponent extends AXPColumnWidgetComponent {
7155
7223
  });
7156
7224
  })
7157
7225
  .show();
7158
- ref.close();
7159
7226
  }
7160
7227
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPRichTextWidgetColumnComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
7161
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: `
7162
- @let html = rawValue | axpResolveMultiLanguageString;
7229
+ @let html = rawValue | translate | async;
7230
+ @let expandHint = '@platform-layout-widgets:widgets.rich-text-editor.column-expand-title' | translate | async;
7163
7231
  @if (html) {
7164
- <span
7165
- class="ax-truncate ax-underline ax-block ax-w-full ax-cursor-pointer"
7166
- (click)="openPopup()"
7167
- [innerHTML]="html | safe: 'html'"
7168
- >
7169
- </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
+ }
7170
7252
  } @else {
7171
7253
  <span class="ax-text-muted">---</span>
7172
7254
  }
7173
- `, isInline: true, dependencies: [{ kind: "pipe", type: AXSafePipe, name: "safe" }, { kind: "pipe", type: AXPResolveMultiLanguageStringPipe, name: "axpResolveMultiLanguageString" }], 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 }); }
7174
7256
  }
7175
7257
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPRichTextWidgetColumnComponent, decorators: [{
7176
7258
  type: Component,
7177
7259
  args: [{
7178
7260
  selector: 'axp-rich-text-widget-column',
7179
7261
  template: `
7180
- @let html = rawValue | axpResolveMultiLanguageString;
7262
+ @let html = rawValue | translate | async;
7263
+ @let expandHint = '@platform-layout-widgets:widgets.rich-text-editor.column-expand-title' | translate | async;
7181
7264
  @if (html) {
7182
- <span
7183
- class="ax-truncate ax-underline ax-block ax-w-full ax-cursor-pointer"
7184
- (click)="openPopup()"
7185
- [innerHTML]="html | safe: 'html'"
7186
- >
7187
- </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
+ }
7188
7285
  } @else {
7189
7286
  <span class="ax-text-muted">---</span>
7190
7287
  }
7191
7288
  `,
7192
7289
  changeDetection: ChangeDetectionStrategy.OnPush,
7193
- imports: [AXSafePipe, AXPResolveMultiLanguageStringPipe],
7290
+ imports: [AXButtonModule, AXDecoratorModule, AXSafePipe, AXTranslationModule, AsyncPipe],
7194
7291
  inputs: ['rawValue', 'rowData'],
7195
7292
  }]
7196
7293
  }] });
@@ -7211,11 +7308,10 @@ class AXPRichTextWidgetEditComponent extends AXPValueWidgetComponent {
7211
7308
  this.maxLineCount = computed(() => this.options()['maxLineCount'] ?? this.options()['minLineCount'] ?? 3, ...(ngDevMode ? [{ debugName: "maxLineCount" }] : /* istanbul ignore next */ []));
7212
7309
  this.popupService = inject(AXPopupService);
7213
7310
  this.translationService = inject(AXTranslationService);
7214
- this.mlResolver = inject(AXPMultiLanguageStringResolverService);
7215
7311
  this.currentLanguage = toSignal(this.translationService.langChanges$, {
7216
7312
  initialValue: this.translationService.getActiveLang(),
7217
7313
  });
7218
- this.getCurrentText = computed(() => this.mlResolver.resolve(this.getValue(), this.currentLanguage()), ...(ngDevMode ? [{ debugName: "getCurrentText" }] : /* istanbul ignore next */ []));
7314
+ this.getCurrentText = computed(() => this.translationService.resolve(this.getValue(), this.currentLanguage()), ...(ngDevMode ? [{ debugName: "getCurrentText" }] : /* istanbul ignore next */ []));
7219
7315
  }
7220
7316
  onWysiwygChanged(e) {
7221
7317
  if (!e.isUserInteraction)
@@ -7250,7 +7346,7 @@ class AXPRichTextWidgetEditComponent extends AXPValueWidgetComponent {
7250
7346
  title: 'Select Language',
7251
7347
  size: 'lg',
7252
7348
  data: {
7253
- values: this.mlResolver.toLocaleMap(this.getValue(), this.currentLanguage()),
7349
+ values: this.translationService.toLocaleMap(this.getValue(), this.currentLanguage()),
7254
7350
  currentLanguage: this.currentLanguage(),
7255
7351
  node: node,
7256
7352
  mode: 'edit',
@@ -7367,29 +7463,40 @@ class AXPRichTextWidgetViewComponent extends AXPValueWidgetComponent {
7367
7463
  super(...arguments);
7368
7464
  this.platform = inject(AXPlatform);
7369
7465
  this.layoutBuilder = inject(AXPLayoutBuilderService);
7370
- this.mlResolver = inject(AXPMultiLanguageStringResolverService);
7371
- /** Resolved HTML for the preview dialog (same rules as the inline snippet). */
7466
+ this.mlResolver = inject(AXTranslationService);
7467
+ this.currentLanguage = toSignal(this.mlResolver.langChanges$, {
7468
+ initialValue: this.mlResolver.getActiveLang(),
7469
+ });
7470
+ /** Resolved HTML for inline snippet and preview dialog. */
7372
7471
  this.displayHtml = computed(() => {
7373
7472
  const v = this.getValue();
7374
- return this.mlResolver.resolve(v);
7473
+ return this.mlResolver.resolve(v, this.currentLanguage());
7375
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 */ []));
7376
7481
  }
7377
7482
  async openPopup() {
7483
+ const resolvedHtml = this.displayHtml();
7484
+ const title = await resolveRichTextPreviewTitle(this.mlResolver, undefined, this.path);
7378
7485
  const size = this.platform.is('Mobile') || this.platform.is('SM') ? 'full' : 'md';
7379
- const ref = await this.layoutBuilder
7486
+ await this.layoutBuilder
7380
7487
  .create()
7381
7488
  .dialog((dialog) => {
7382
7489
  dialog
7383
- .setTitle(this.path ?? '')
7490
+ .setTitle(title)
7384
7491
  .setSize(size)
7492
+ .setContext({ [AXP_RICH_TEXT_DIALOG_BODY_PATH]: resolvedHtml })
7385
7493
  .content((layoutBuilder) => {
7386
7494
  layoutBuilder.flex((flex) => {
7387
- flex.mode('view').formField('Content', (field) => {
7388
- field.readonly(true).customWidget('rich-text-editor', {
7389
- src: this.displayHtml(),
7390
- toolbar: [],
7391
- height: 400,
7392
- });
7495
+ flex.mode('view').richText({
7496
+ path: AXP_RICH_TEXT_DIALOG_BODY_PATH,
7497
+ defaultValue: resolvedHtml,
7498
+ showFullContent: true,
7499
+ height: 400,
7393
7500
  });
7394
7501
  });
7395
7502
  })
@@ -7398,42 +7505,65 @@ class AXPRichTextWidgetViewComponent extends AXPValueWidgetComponent {
7398
7505
  });
7399
7506
  })
7400
7507
  .show();
7401
- ref.close();
7402
7508
  }
7403
7509
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPRichTextWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
7404
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: `
7405
- @let html = getValue() | axpResolveMultiLanguageString;
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>
7511
+ @let html = getValue() | translate | async;
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
+ }
7413
7522
  } @else {
7414
- <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
+ }
7415
7533
  }
7416
- `, isInline: true, dependencies: [{ kind: "pipe", type: AXSafePipe, name: "safe" }, { kind: "pipe", type: AXPResolveMultiLanguageStringPipe, name: "axpResolveMultiLanguageString" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
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 }); }
7417
7535
  }
7418
7536
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPRichTextWidgetViewComponent, decorators: [{
7419
7537
  type: Component,
7420
7538
  args: [{
7421
7539
  selector: 'axp-rich-text-widget-view',
7422
7540
  template: `
7423
- @let html = getValue() | axpResolveMultiLanguageString;
7424
- @if (html) {
7425
- <span
7426
- class="ax-truncate ax-underline ax-cursor-pointer ax-text-muted"
7427
- (click)="openPopup()"
7428
- [innerHTML]="html | safe: 'html'"
7429
- >
7430
- </span>
7541
+ @let html = getValue() | translate | async;
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
+ }
7431
7552
  } @else {
7432
- <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
+ }
7433
7563
  }
7434
7564
  `,
7435
7565
  changeDetection: ChangeDetectionStrategy.OnPush,
7436
- imports: [AXSafePipe, AXPResolveMultiLanguageStringPipe],
7566
+ imports: [AXSafePipe, AXTranslationModule, AsyncPipe],
7437
7567
  }]
7438
7568
  }] });
7439
7569
 
@@ -7444,10 +7574,11 @@ var richTextWidgetView_component = /*#__PURE__*/Object.freeze({
7444
7574
 
7445
7575
  const AXPRichTextWidget = {
7446
7576
  name: 'rich-text-editor',
7447
- title: 'Rich Text',
7448
- 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',
7449
7579
  icon: 'fa-light fa-input-text',
7450
7580
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
7581
+ subCategory: AXP_WIDGETS_EDITOR_SUB_RICH,
7451
7582
  groups: [AXPWidgetGroupEnum.FormElement],
7452
7583
  defaultFilterWidgetName: 'string-filter',
7453
7584
  type: 'editor',
@@ -7683,35 +7814,36 @@ class AXPSelectBoxWidgetEditComponent extends AXPDataListWidgetComponent {
7683
7814
  this.contextService.patch(itemToExpose, true);
7684
7815
  }
7685
7816
  //#endregion
7686
- //#region ---- Set Value Based on Mode ----
7687
- if (this.filterMode()) {
7688
- // Filter mode: set value with operation structure
7689
- const newValue = e.value;
7690
- const text = this.selectedItems().map((item) => get(item, this.textField()));
7691
- this.setValue({
7692
- value: newValue,
7693
- displayText: text,
7694
- operation: {
7695
- type: this.multiple() ? 'in' : 'equal',
7696
- },
7697
- });
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);
7698
7836
  }
7699
7837
  else {
7700
- // Normal mode: set value directly
7701
- if (this.widgetsConfigs.selectValueStrategy === 'valueField') {
7702
- this.setValue(e.value);
7838
+ if (this.multiple()) {
7839
+ this.setValue(this.selectedItems());
7703
7840
  }
7704
7841
  else {
7705
- if (this.multiple()) {
7706
- this.setValue(this.selectedItems());
7707
- }
7708
- else {
7709
- this.setValue(this.selectedItems()[0]);
7710
- }
7842
+ this.setValue(this.selectedItems()[0]);
7711
7843
  }
7712
7844
  }
7713
- //#endregion
7714
7845
  }
7846
+ //#endregion
7715
7847
  }
7716
7848
  handleSearchValueChange(e) {
7717
7849
  if (e.isUserInteraction) {
@@ -7925,10 +8057,11 @@ var selectBoxWidgetView_component = /*#__PURE__*/Object.freeze({
7925
8057
 
7926
8058
  const AXPSelectBoxWidget = {
7927
8059
  name: 'select-editor',
7928
- title: 'Select Box',
7929
- description: 'Chooses from dropdown options',
8060
+ title: '@platform-layout-widgets:widgets.select-editor.title',
8061
+ description: '@platform-layout-widgets:widgets.select-editor.description',
7930
8062
  icon: 'fa-light fa-list-dropdown',
7931
8063
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
8064
+ subCategory: AXP_WIDGETS_EDITOR_SUB_CHOICE,
7932
8065
  groups: [AXPWidgetGroupEnum.FormElement],
7933
8066
  defaultFilterWidgetName: 'select-filter',
7934
8067
  type: 'editor',
@@ -8282,10 +8415,11 @@ var selectionListWidgetView_component = /*#__PURE__*/Object.freeze({
8282
8415
 
8283
8416
  const AXPSelectionListWidget = {
8284
8417
  name: 'selection-list-editor',
8285
- title: 'Selection List',
8286
- 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',
8287
8420
  icon: 'fa-light fa-list-radio',
8288
8421
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
8422
+ subCategory: AXP_WIDGETS_EDITOR_SUB_CHOICE,
8289
8423
  groups: [AXPWidgetGroupEnum.FormElement],
8290
8424
  defaultFilterWidgetName: 'select-filter',
8291
8425
  properties: [
@@ -8775,10 +8909,11 @@ var tagEditorWidgetView_component = /*#__PURE__*/Object.freeze({
8775
8909
 
8776
8910
  const AXPTagEditorWidget = {
8777
8911
  name: 'tag-editor',
8778
- title: 'Tag Editor',
8912
+ title: '@platform-layout-widgets:widgets.tag-editor.title',
8779
8913
  icon: 'fa-light fa-tags',
8780
- description: 'Input and manage multiple tags',
8914
+ description: '@platform-layout-widgets:widgets.tag-editor.description',
8781
8915
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
8916
+ subCategory: AXP_WIDGETS_EDITOR_SUB_CHOICE,
8782
8917
  groups: [AXPWidgetGroupEnum.FormElement],
8783
8918
  type: 'editor',
8784
8919
  defaultFilterWidgetName: 'string-filter',
@@ -9162,10 +9297,11 @@ var templateBoxWidgetView_component = /*#__PURE__*/Object.freeze({
9162
9297
 
9163
9298
  const AXPTemplateBoxWidget = {
9164
9299
  name: 'template-box-editor',
9165
- title: 'Template Box',
9300
+ title: '@platform-layout-widgets:widgets.template-box-editor.title',
9166
9301
  icon: 'fa-light fa-file-alt',
9167
- description: 'Advanced template text editor with language support',
9302
+ description: '@platform-layout-widgets:widgets.template-box-editor.description',
9168
9303
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
9304
+ subCategory: AXP_WIDGETS_EDITOR_SUB_TEXT_INPUTS,
9169
9305
  type: 'editor',
9170
9306
  defaultFilterWidgetName: 'string-filter',
9171
9307
  properties: [
@@ -9198,20 +9334,20 @@ const AXPTemplateBoxWidget = {
9198
9334
  class AXPTextBoxWidgetColumnComponent extends AXPColumnWidgetComponent {
9199
9335
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTextBoxWidgetColumnComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
9200
9336
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPTextBoxWidgetColumnComponent, isStandalone: true, selector: "axp-text-box-widget-column", inputs: { rawValue: "rawValue", rowData: "rowData" }, usesInheritance: true, ngImport: i0, template: `
9201
- @let text = rawValue | axpResolveMultiLanguageString;
9337
+ @let text = rawValue | translate | async;
9202
9338
  @if (text) {
9203
9339
  {{ text }}
9204
9340
  } @else {
9205
9341
  <span class="ax-text-muted">---</span>
9206
9342
  }
9207
- `, isInline: true, dependencies: [{ kind: "pipe", type: AXPResolveMultiLanguageStringPipe, name: "axpResolveMultiLanguageString" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9343
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9208
9344
  }
9209
9345
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTextBoxWidgetColumnComponent, decorators: [{
9210
9346
  type: Component,
9211
9347
  args: [{
9212
9348
  selector: 'axp-text-box-widget-column',
9213
9349
  template: `
9214
- @let text = rawValue | axpResolveMultiLanguageString;
9350
+ @let text = rawValue | translate | async;
9215
9351
  @if (text) {
9216
9352
  {{ text }}
9217
9353
  } @else {
@@ -9219,7 +9355,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
9219
9355
  }
9220
9356
  `,
9221
9357
  changeDetection: ChangeDetectionStrategy.OnPush,
9222
- imports: [AXPResolveMultiLanguageStringPipe],
9358
+ imports: [AXTranslationModule, AsyncPipe],
9223
9359
  inputs: ['rawValue', 'rowData'],
9224
9360
  }]
9225
9361
  }] });
@@ -9234,7 +9370,6 @@ class AXPTextBoxWidgetEditComponent extends AXPValueWidgetComponent {
9234
9370
  super(...arguments);
9235
9371
  this.popupService = inject(AXPopupService);
9236
9372
  this.translationService = inject(AXTranslationService);
9237
- this.mlResolver = inject(AXPMultiLanguageStringResolverService);
9238
9373
  this.multiLanguage = computed(() => this.options()['multiLanguage'], ...(ngDevMode ? [{ debugName: "multiLanguage" }] : /* istanbul ignore next */ []));
9239
9374
  this.hasClearButton = computed(() => this.options()['hasClearButton'], ...(ngDevMode ? [{ debugName: "hasClearButton" }] : /* istanbul ignore next */ []));
9240
9375
  this.disabled = computed(() => this.options()['disabled'], ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
@@ -9258,7 +9393,6 @@ class AXPTextBoxWidgetEditComponent extends AXPValueWidgetComponent {
9258
9393
  if (!e.isUserInteraction) {
9259
9394
  return;
9260
9395
  }
9261
- ;
9262
9396
  if (this.multiLanguage()) {
9263
9397
  const v = this.getValue();
9264
9398
  const obj = v && typeof v === 'object' && !Array.isArray(v) ? { ...v } : {};
@@ -9270,7 +9404,7 @@ class AXPTextBoxWidgetEditComponent extends AXPValueWidgetComponent {
9270
9404
  }
9271
9405
  }
9272
9406
  getCurrentText() {
9273
- return this.mlResolver.resolve(this.getValue(), this.currentLanguage());
9407
+ return this.translationService.resolve(this.getValue(), this.currentLanguage());
9274
9408
  }
9275
9409
  async openMultiLanguagePopup() {
9276
9410
  const node = {
@@ -9285,7 +9419,7 @@ class AXPTextBoxWidgetEditComponent extends AXPValueWidgetComponent {
9285
9419
  title: 'Multi-language Text',
9286
9420
  size: 'md',
9287
9421
  data: {
9288
- values: this.mlResolver.toLocaleMap(this.getValue(), this.currentLanguage()),
9422
+ values: this.translationService.toLocaleMap(this.getValue(), this.currentLanguage()),
9289
9423
  currentLanguage: this.currentLanguage(),
9290
9424
  node: node,
9291
9425
  mode: 'edit',
@@ -9401,33 +9535,35 @@ var textBoxWidgetEdit_component = /*#__PURE__*/Object.freeze({
9401
9535
 
9402
9536
  class AXPTextBoxWidgetViewComponent extends AXPValueWidgetComponent {
9403
9537
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTextBoxWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
9404
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPTextBoxWidgetViewComponent, isStandalone: true, selector: "axp-text-box-widget-view", usesInheritance: true, ngImport: i0, template: `
9405
- <div class="ax-text-muted">
9406
- @let text = getValue() | axpResolveMultiLanguageString;
9407
- @if (text) {
9408
- <p>{{ text }}</p>
9409
- } @else {
9410
- <p class="ax-text-muted">---</p>
9411
- }
9412
- </div>
9413
- `, isInline: true, dependencies: [{ kind: "pipe", type: AXPResolveMultiLanguageStringPipe, name: "axpResolveMultiLanguageString" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9538
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPTextBoxWidgetViewComponent, isStandalone: true, selector: "axp-text-box-widget-view", usesInheritance: true, ngImport: i0, template: `
9539
+ <div class="ax-text-muted">
9540
+ @let text = getValue() | translate | async;
9541
+
9542
+ @if (text) {
9543
+ <p>{{ text }}</p>
9544
+ } @else {
9545
+ <p class="ax-text-muted">---</p>
9546
+ }
9547
+ </div>
9548
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9414
9549
  }
9415
9550
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTextBoxWidgetViewComponent, decorators: [{
9416
9551
  type: Component,
9417
9552
  args: [{
9418
9553
  selector: 'axp-text-box-widget-view',
9419
- template: `
9420
- <div class="ax-text-muted">
9421
- @let text = getValue() | axpResolveMultiLanguageString;
9422
- @if (text) {
9423
- <p>{{ text }}</p>
9424
- } @else {
9425
- <p class="ax-text-muted">---</p>
9426
- }
9427
- </div>
9554
+ template: `
9555
+ <div class="ax-text-muted">
9556
+ @let text = getValue() | translate | async;
9557
+
9558
+ @if (text) {
9559
+ <p>{{ text }}</p>
9560
+ } @else {
9561
+ <p class="ax-text-muted">---</p>
9562
+ }
9563
+ </div>
9428
9564
  `,
9429
9565
  changeDetection: ChangeDetectionStrategy.OnPush,
9430
- imports: [AXPResolveMultiLanguageStringPipe],
9566
+ imports: [AXTranslationModule, AsyncPipe],
9431
9567
  }]
9432
9568
  }] });
9433
9569
 
@@ -9438,10 +9574,11 @@ var textBoxWidgetView_component = /*#__PURE__*/Object.freeze({
9438
9574
 
9439
9575
  const AXPTextBoxWidget = {
9440
9576
  name: 'text-editor',
9441
- title: 'Text Box',
9577
+ title: '@platform-layout-widgets:widgets.text-editor.title',
9442
9578
  icon: 'fa-light fa-input-text',
9443
- description: 'Inputs single-line text',
9579
+ description: '@platform-layout-widgets:widgets.text-editor.description',
9444
9580
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
9581
+ subCategory: AXP_WIDGETS_EDITOR_SUB_TEXT_INPUTS,
9445
9582
  groups: [AXPWidgetGroupEnum.FormElement],
9446
9583
  type: 'editor',
9447
9584
  defaultFilterWidgetName: 'string-filter',
@@ -9783,11 +9920,12 @@ var toggleWidgetView_component = /*#__PURE__*/Object.freeze({
9783
9920
 
9784
9921
  const AXPToggleWidget = {
9785
9922
  name: 'toggle-editor',
9786
- title: 'Toggle',
9787
- description: 'Switches between on/off states',
9923
+ title: '@platform-layout-widgets:widgets.toggle-editor.title',
9924
+ description: '@platform-layout-widgets:widgets.toggle-editor.description',
9788
9925
  icon: 'fa-light fa-toggle-on',
9789
9926
  defaultFilterWidgetName: 'boolean-filter',
9790
9927
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
9928
+ subCategory: AXP_WIDGETS_EDITOR_SUB_CHOICE,
9791
9929
  groups: [AXPWidgetGroupEnum.FormElement],
9792
9930
  type: 'editor',
9793
9931
  properties: [
@@ -10360,10 +10498,11 @@ var avatarWidgetView_component = /*#__PURE__*/Object.freeze({
10360
10498
 
10361
10499
  const AXPAvatarWidget = {
10362
10500
  name: 'avatar',
10363
- title: 'Avatar',
10364
- 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',
10365
10503
  icon: 'fa-light fa-image-user',
10366
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
10504
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
10505
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
10367
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.',
10368
10507
  groups: [AXPWidgetGroupEnum.EntityWidget],
10369
10508
  type: 'editor',
@@ -10601,10 +10740,11 @@ var codeEditorWidgetColumn_component = /*#__PURE__*/Object.freeze({
10601
10740
  //#region ---- Widget Config ----
10602
10741
  const AXPCodeEditorWidget = {
10603
10742
  name: 'code-editor',
10604
- title: 'Code Editor',
10605
- 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',
10606
10745
  icon: 'fa-light fa-code',
10607
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
10746
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
10747
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_INPUT,
10608
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.',
10609
10749
  groups: [AXPWidgetGroupEnum.FormElement],
10610
10750
  type: 'editor',
@@ -10914,10 +11054,11 @@ var dataListWidgetView_component = /*#__PURE__*/Object.freeze({
10914
11054
 
10915
11055
  const AXPDataListWidget = {
10916
11056
  name: 'data-list',
10917
- title: 'Data List',
10918
- 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',
10919
11059
  icon: 'fa-light fa-table',
10920
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
11060
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
11061
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_LISTS,
10921
11062
  aiDescription: 'Use for tabular data: multiple rows with defined columns, paging, and optional row commands. Provide options.dataSource (rows) and options.columns.',
10922
11063
  groups: [AXPWidgetGroupEnum.FormElement],
10923
11064
  type: 'view',
@@ -11824,7 +11965,7 @@ class AXPFileUploaderWidgetService {
11824
11965
  showEditDialogAfterSelect: false,
11825
11966
  };
11826
11967
  options = { ...defaultOptions, ...options };
11827
- const component = await import('./acorex-platform-layout-widgets-file-list-popup.component-9uCkMxcc.mjs').then((m) => m.AXPFileListPopupComponent);
11968
+ const component = await import('./acorex-platform-layout-widgets-file-list-popup.component-CDYAGBku.mjs').then((m) => m.AXPFileListPopupComponent);
11828
11969
  const result = await this.popupService.open(component, {
11829
11970
  title: await this.translate.translateAsync('@document-management:terms.common.file'),
11830
11971
  data: {
@@ -11862,9 +12003,9 @@ class AXPFileUploaderWidgetColumnComponent extends AXPColumnWidgetComponent {
11862
12003
  this.fileService = inject(AXPFileUploaderWidgetService);
11863
12004
  }
11864
12005
  async openFileList() {
11865
- console.log(this.rawValue);
11866
- this.fileService.showFileList({
11867
- files: castArray(this.rawValue ?? []),
12006
+ const files = castArray(this.rawValue ?? []).filter((item) => item != null && typeof item === 'object' && typeof item.name === 'string');
12007
+ await this.fileService.showFileList({
12008
+ files,
11868
12009
  readonly: true,
11869
12010
  });
11870
12011
  }
@@ -12322,10 +12463,11 @@ var fileUploaderWidgetView_component = /*#__PURE__*/Object.freeze({
12322
12463
 
12323
12464
  const AXPFileUploaderWidget = {
12324
12465
  name: 'file-uploader',
12325
- title: 'File Uploader',
12326
- description: 'Uploads and manages files',
12466
+ title: '@platform-layout-widgets:widgets.file-uploader.title',
12467
+ description: '@platform-layout-widgets:widgets.file-uploader.description',
12327
12468
  icon: 'fa-light fa-files',
12328
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
12469
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
12470
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
12329
12471
  aiDescription: 'Use when the answer involves file attachments: list, upload, or download. Prefer when the user references documents or media beyond inline text.',
12330
12472
  groups: ['form-element'],
12331
12473
  type: 'editor',
@@ -13053,10 +13195,11 @@ var galleryWidgetView_component = /*#__PURE__*/Object.freeze({
13053
13195
 
13054
13196
  const AXPGalleryWidget = {
13055
13197
  name: 'gallery',
13056
- title: 'Media Gallery',
13057
- description: 'Shows and edits image galleries',
13198
+ title: '@platform-layout-widgets:widgets.gallery.title',
13199
+ description: '@platform-layout-widgets:widgets.gallery.description',
13058
13200
  icon: 'fa-light fa-images',
13059
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
13201
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
13202
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
13060
13203
  aiDescription: 'Image gallery with thumbnails and optional fullscreen. Use for multiple images or a carousel-like browse experience (not a single static image).',
13061
13204
  groups: [AXPWidgetGroupEnum.FormElement],
13062
13205
  properties: [
@@ -13534,13 +13677,13 @@ var imageMarkerWidgetView_component = /*#__PURE__*/Object.freeze({
13534
13677
 
13535
13678
  const AXPImageMarkerWidget = {
13536
13679
  name: 'image-marker',
13537
- title: 'Image Marker',
13538
- 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',
13539
13682
  icon: 'fa-light fa-map-marker-alt',
13540
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
13683
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
13684
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
13541
13685
  aiDescription: 'Use when highlighting points or regions on a base image (annotations, hotspots). Provide base image plus marker coordinates or overlays in options.',
13542
13686
  groups: [AXPWidgetGroupEnum.FormElement],
13543
- aiCatalog: 'include',
13544
13687
  type: 'editor',
13545
13688
  properties: [
13546
13689
  AXP_NAME_PROPERTY,
@@ -13704,12 +13847,13 @@ var jsonViewerWidgetEdit_component = /*#__PURE__*/Object.freeze({
13704
13847
  //#region ---- Widget Config ----
13705
13848
  const AXPJsonViewerWidget = {
13706
13849
  name: 'json-viewer',
13707
- title: 'JSON Viewer',
13708
- 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',
13709
13852
  icon: 'fa-light fa-code',
13710
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
13853
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
13854
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_DATA,
13711
13855
  aiDescription: 'Shows JSON as an expandable tree. Prefer when the payload is structured data (objects/arrays) and hierarchy matters more than plain text.',
13712
- groups: [AXPWidgetGroupEnum.FormElement],
13856
+ groups: [AXPWidgetGroupEnum.BaseWidget],
13713
13857
  type: 'editor',
13714
13858
  properties: [
13715
13859
  AXP_NAME_PROPERTY,
@@ -14172,10 +14316,11 @@ var qrcodeWidgetView_component = /*#__PURE__*/Object.freeze({
14172
14316
 
14173
14317
  const AXPQrcodeWidget = {
14174
14318
  name: 'qrcode',
14175
- title: 'QR Code',
14176
- 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,
14177
14322
  icon: 'fa-light fa-qrcode',
14178
- description: 'Display and edit QR Codes',
14323
+ description: '@platform-layout-widgets:widgets.qrcode.description',
14179
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.',
14180
14325
  type: 'view',
14181
14326
  properties: [
@@ -14465,9 +14610,10 @@ var schedulerPickerWidgetView_component = /*#__PURE__*/Object.freeze({
14465
14610
 
14466
14611
  const AXPSchedulerPickerWidget = {
14467
14612
  name: 'scheduler-picker',
14468
- title: 'Scheduler Picker',
14613
+ title: '@platform-layout-widgets:widgets.scheduler-picker.title',
14469
14614
  icon: 'fa-light fa-calendar-clock',
14470
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
14615
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
14616
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_INPUT,
14471
14617
  aiDescription: 'Schedule or calendar picker. Use when the user selects dates, times, or recurring slots; bind value via data path.',
14472
14618
  type: 'editor',
14473
14619
  groups: [AXPWidgetGroupEnum.FormElement],
@@ -14804,10 +14950,11 @@ var signaturePadWidgetView_component = /*#__PURE__*/Object.freeze({
14804
14950
 
14805
14951
  const AXPSignatureWidget = {
14806
14952
  name: 'signature',
14807
- title: 'Signature',
14808
- description: 'Captures digital signatures',
14953
+ title: '@platform-layout-widgets:widgets.signature.title',
14954
+ description: '@platform-layout-widgets:widgets.signature.description',
14809
14955
  icon: 'fa-light fa-file-signature',
14810
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
14956
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
14957
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_INPUT,
14811
14958
  aiDescription: 'Digital signature capture or display. Use when consent, approval, or handwritten input is required instead of typed text.',
14812
14959
  type: 'editor',
14813
14960
  properties: [
@@ -14891,6 +15038,8 @@ class AXPStatusChipComponent {
14891
15038
  this.isPopoverOpen = signal(false, ...(ngDevMode ? [{ debugName: "isPopoverOpen" }] : /* istanbul ignore next */ []));
14892
15039
  this.isUpdating = signal(false, ...(ngDevMode ? [{ debugName: "isUpdating" }] : /* istanbul ignore next */ []));
14893
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 */ []));
14894
15043
  //#endregion
14895
15044
  //#region ---- Computed Properties ----
14896
15045
  this.statuses = computed(() => this.providerSignal()?.statuses ?? [], ...(ngDevMode ? [{ debugName: "statuses" }] : /* istanbul ignore next */ []));
@@ -14930,15 +15079,9 @@ class AXPStatusChipComponent {
14930
15079
  if (!Array.isArray(statuses) || statuses.length === 0) {
14931
15080
  return [];
14932
15081
  }
14933
- // If no transitions defined, show all other statuses as available options
15082
+ // No declared transitions: executeTransition() rejects every path do not offer fake targets
14934
15083
  if (!Array.isArray(transitions) || transitions.length === 0) {
14935
- return statuses
14936
- .filter((s) => s.name !== currentStatus.name)
14937
- .map((s) => ({
14938
- from: currentStatus.name,
14939
- to: s.name,
14940
- toStatus: s,
14941
- }));
15084
+ return [];
14942
15085
  }
14943
15086
  // Filter transitions that start from current status
14944
15087
  const availableTransitions = transitions.filter((t) => t.from === currentStatus.name);
@@ -14974,6 +15117,18 @@ class AXPStatusChipComponent {
14974
15117
  this.providerSignal.set(provider);
14975
15118
  });
14976
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 */ []));
14977
15132
  }
14978
15133
  //#endregion
14979
15134
  //#region ---- Public Methods ----
@@ -15072,8 +15227,12 @@ class AXPStatusChipComponent {
15072
15227
  [class.ax-cursor-pointer]="hasTransitions"
15073
15228
  [class.ax-cursor-default]="!hasTransitions"
15074
15229
  (click)="hasTransitions && openPopover()"
15230
+ [attr.title]="chipTooltip() ?? null"
15075
15231
  #chipElement
15076
15232
  >
15233
+ @if (currentStatusDef.icon) {
15234
+ <i [class]="currentStatusDef.icon + ' ax-text-[0.85em] ax-opacity-90'"></i>
15235
+ }
15077
15236
  <span>{{ currentStatusDef.title | translate | async }}</span>
15078
15237
  @if (hasTransitions) {
15079
15238
  <i class="fa-light fa-chevron-down ax-text-xs"></i>
@@ -15140,8 +15299,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
15140
15299
  [class.ax-cursor-pointer]="hasTransitions"
15141
15300
  [class.ax-cursor-default]="!hasTransitions"
15142
15301
  (click)="hasTransitions && openPopover()"
15302
+ [attr.title]="chipTooltip() ?? null"
15143
15303
  #chipElement
15144
15304
  >
15305
+ @if (currentStatusDef.icon) {
15306
+ <i [class]="currentStatusDef.icon + ' ax-text-[0.85em] ax-opacity-90'"></i>
15307
+ }
15145
15308
  <span>{{ currentStatusDef.title | translate | async }}</span>
15146
15309
  @if (hasTransitions) {
15147
15310
  <i class="fa-light fa-chevron-down ax-text-xs"></i>
@@ -15230,8 +15393,22 @@ class AXPStatusWidgetColumnComponent extends AXPColumnWidgetComponent {
15230
15393
  this.definitionKey = computed(() => {
15231
15394
  return this.options['definitionKey'] ?? null;
15232
15395
  }, ...(ngDevMode ? [{ debugName: "definitionKey" }] : /* istanbul ignore next */ []));
15396
+ /**
15397
+ * When true, the grid cell is display-only (no transition popover). Default false preserves existing grids.
15398
+ */
15399
+ this.columnReadonly = computed(() => !!this.options['readonly'], ...(ngDevMode ? [{ debugName: "columnReadonly" }] : /* istanbul ignore next */ []));
15233
15400
  this.entityData = computed(() => {
15234
- 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
+ };
15235
15412
  }, ...(ngDevMode ? [{ debugName: "entityData" }] : /* istanbul ignore next */ []));
15236
15413
  this.resolvedStatuses = computed(() => {
15237
15414
  return this.providerSignal()?.statuses ?? [];
@@ -15271,15 +15448,9 @@ class AXPStatusWidgetColumnComponent extends AXPColumnWidgetComponent {
15271
15448
  if (!Array.isArray(statuses) || statuses.length === 0) {
15272
15449
  return [];
15273
15450
  }
15274
- // If no transitions defined, show all other statuses as available options
15451
+ // No declared transitions: executeTransition() rejects every path do not offer fake targets
15275
15452
  if (!Array.isArray(transitions) || transitions.length === 0) {
15276
- return statuses
15277
- .filter((s) => s.name !== currentStatus.name)
15278
- .map((status) => ({
15279
- from: currentStatus.name,
15280
- to: status.name,
15281
- toStatus: status,
15282
- }));
15453
+ return [];
15283
15454
  }
15284
15455
  // Filter transitions that start from current status
15285
15456
  const availableTransitions = transitions.filter((t) => t.from === currentStatus.name);
@@ -15330,7 +15501,7 @@ class AXPStatusWidgetColumnComponent extends AXPColumnWidgetComponent {
15330
15501
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.9", type: AXPStatusWidgetColumnComponent, isStandalone: true, selector: "axp-status-widget-column", inputs: { rawValue: "rawValue", rowData: "rowData", rawValueInput: ["rawValue", "rawValueInput"], rowDataInput: ["rowData", "rowDataInput"] }, viewQueries: [{ propertyName: "statusChip", first: true, predicate: AXPStatusChipComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
15331
15502
  <axp-status-chip
15332
15503
  [status]="statusItem()"
15333
- [readonly]="false"
15504
+ [readonly]="columnReadonly()"
15334
15505
  [availableTransitions]="getAvailableTransitions()"
15335
15506
  [definitionKey]="definitionKey()"
15336
15507
  [entityData]="entityData()"
@@ -15348,7 +15519,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
15348
15519
  template: `
15349
15520
  <axp-status-chip
15350
15521
  [status]="statusItem()"
15351
- [readonly]="false"
15522
+ [readonly]="columnReadonly()"
15352
15523
  [availableTransitions]="getAvailableTransitions()"
15353
15524
  [definitionKey]="definitionKey()"
15354
15525
  [entityData]="entityData()"
@@ -15385,6 +15556,8 @@ class AXPStatusWidgetEditComponent extends AXPValueWidgetComponent {
15385
15556
  //#region ---- Properties ----
15386
15557
  this.statusService = inject(AXPStatusDefinitionProviderService);
15387
15558
  this.definitionKey = computed(() => this.options()['definitionKey'] ?? null, ...(ngDevMode ? [{ debugName: "definitionKey" }] : /* istanbul ignore next */ []));
15559
+ /** When true, the chip is display-only (no transition popover). Set via interface options. */
15560
+ this.isReadonly = computed(() => !!this.options()['readonly'] || !!this.options()['disabled'], ...(ngDevMode ? [{ debugName: "isReadonly" }] : /* istanbul ignore next */ []));
15388
15561
  this.providerSignal = signal(undefined, ...(ngDevMode ? [{ debugName: "providerSignal" }] : /* istanbul ignore next */ []));
15389
15562
  this.statuses = computed(() => this.providerSignal()?.statuses ?? [], ...(ngDevMode ? [{ debugName: "statuses" }] : /* istanbul ignore next */ []));
15390
15563
  this.transitions = computed(() => this.providerSignal()?.transitions ?? [], ...(ngDevMode ? [{ debugName: "transitions" }] : /* istanbul ignore next */ []));
@@ -15472,15 +15645,9 @@ class AXPStatusWidgetEditComponent extends AXPValueWidgetComponent {
15472
15645
  if (!Array.isArray(statuses) || statuses.length === 0) {
15473
15646
  return [];
15474
15647
  }
15475
- // If no transitions defined, show all other statuses as available options
15648
+ // No declared transitions: executeTransition() rejects every path do not offer fake targets
15476
15649
  if (!Array.isArray(transitions) || transitions.length === 0) {
15477
- return statuses
15478
- .filter((s) => s.name !== currentStatus.name)
15479
- .map((status) => ({
15480
- from: currentStatus.name,
15481
- to: status.name,
15482
- toStatus: status,
15483
- }));
15650
+ return [];
15484
15651
  }
15485
15652
  // Filter transitions that start from current status
15486
15653
  const availableTransitions = transitions.filter((t) => t.from === currentStatus.name);
@@ -15520,19 +15687,41 @@ class AXPStatusWidgetEditComponent extends AXPValueWidgetComponent {
15520
15687
  // Could show a toast notification here if needed
15521
15688
  }
15522
15689
  /**
15523
- * Get entity data for command execution context
15690
+ * Build context for default `Entity:UpdateStatus` (entity key, record id, status field path).
15524
15691
  */
15525
15692
  getEntityData() {
15526
- // Return current entity data if available
15527
- // This could be enhanced to get full entity context
15528
- const value = this.getValue();
15529
- 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
+ };
15530
15719
  }
15531
15720
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPStatusWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
15532
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: `
15533
15722
  <axp-status-chip
15534
15723
  [status]="currentStatus()"
15535
- [readonly]="false"
15724
+ [readonly]="isReadonly()"
15536
15725
  [availableTransitions]="getAvailableTransitions()"
15537
15726
  [definitionKey]="definitionKey()"
15538
15727
  [entityData]="getEntityData()"
@@ -15550,7 +15739,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
15550
15739
  template: `
15551
15740
  <axp-status-chip
15552
15741
  [status]="currentStatus()"
15553
- [readonly]="false"
15742
+ [readonly]="isReadonly()"
15554
15743
  [availableTransitions]="getAvailableTransitions()"
15555
15744
  [definitionKey]="definitionKey()"
15556
15745
  [entityData]="getEntityData()"
@@ -15580,11 +15769,12 @@ class AXPStatusWidgetViewComponent extends AXPDataListWidgetComponent {
15580
15769
  //#region ---- Properties ----
15581
15770
  this.statusService = inject(AXPStatusDefinitionProviderService);
15582
15771
  this.definitionKey = computed(() => this.options()['definitionKey'] ?? null, ...(ngDevMode ? [{ debugName: "definitionKey" }] : /* istanbul ignore next */ []));
15772
+ /** When true, the chip is display-only (no transition popover). Set via interface options. */
15773
+ this.isReadonly = computed(() => !!this.options()['readonly'] || !!this.options()['disabled'], ...(ngDevMode ? [{ debugName: "isReadonly" }] : /* istanbul ignore next */ []));
15583
15774
  this.providerSignal = signal(undefined, ...(ngDevMode ? [{ debugName: "providerSignal" }] : /* istanbul ignore next */ []));
15584
15775
  this.resolvedStatuses = computed(() => this.providerSignal()?.statuses ?? [], ...(ngDevMode ? [{ debugName: "resolvedStatuses" }] : /* istanbul ignore next */ []));
15585
15776
  this.resolvedTransitions = computed(() => this.providerSignal()?.transitions ?? [], ...(ngDevMode ? [{ debugName: "resolvedTransitions" }] : /* istanbul ignore next */ []));
15586
15777
  //#endregion
15587
- //#endregion
15588
15778
  //#region ---- Effects ----
15589
15779
  this.loadProvider = effect(async () => {
15590
15780
  const key = this.definitionKey();
@@ -15641,15 +15831,9 @@ class AXPStatusWidgetViewComponent extends AXPDataListWidgetComponent {
15641
15831
  if (!Array.isArray(statuses) || statuses.length === 0) {
15642
15832
  return [];
15643
15833
  }
15644
- // If no transitions defined, show all other statuses as available options
15834
+ // No declared transitions: executeTransition() rejects every path do not offer fake targets
15645
15835
  if (!Array.isArray(transitions) || transitions.length === 0) {
15646
- return statuses
15647
- .filter((s) => s.name !== currentStatus.name)
15648
- .map((status) => ({
15649
- from: currentStatus.name,
15650
- to: status.name,
15651
- toStatus: status,
15652
- }));
15836
+ return [];
15653
15837
  }
15654
15838
  // Filter transitions that start from current status
15655
15839
  const availableTransitions = transitions.filter((t) => t.from === currentStatus.name);
@@ -15702,7 +15886,7 @@ class AXPStatusWidgetViewComponent extends AXPDataListWidgetComponent {
15702
15886
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.9", type: AXPStatusWidgetViewComponent, isStandalone: true, selector: "axp-status-widget-view", viewQueries: [{ propertyName: "statusChip", first: true, predicate: AXPStatusChipComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
15703
15887
  <axp-status-chip
15704
15888
  [status]="currentStatus()"
15705
- [readonly]="false"
15889
+ [readonly]="isReadonly()"
15706
15890
  [availableTransitions]="getAvailableTransitions()"
15707
15891
  [definitionKey]="definitionKey()"
15708
15892
  [entityData]="getEntityData()"
@@ -15720,7 +15904,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
15720
15904
  template: `
15721
15905
  <axp-status-chip
15722
15906
  [status]="currentStatus()"
15723
- [readonly]="false"
15907
+ [readonly]="isReadonly()"
15724
15908
  [availableTransitions]="getAvailableTransitions()"
15725
15909
  [definitionKey]="definitionKey()"
15726
15910
  [entityData]="getEntityData()"
@@ -15742,10 +15926,11 @@ var statusWidgetView_component = /*#__PURE__*/Object.freeze({
15742
15926
 
15743
15927
  const AXPStatusWidget = {
15744
15928
  name: 'status-widget',
15745
- title: 'Status Widget',
15746
- 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',
15747
15931
  icon: 'fa-light fa-circle-check',
15748
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
15932
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
15933
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_DATA,
15749
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).',
15750
15935
  groups: [AXPWidgetGroupEnum.EntityWidget],
15751
15936
  defaultFilterWidgetName: 'status-filter',
@@ -15778,10 +15963,11 @@ const AXPStatusWidget = {
15778
15963
  //#region ---- Widget Config ----
15779
15964
  const AXPStopwatchWidget = {
15780
15965
  name: 'stopwatch',
15781
- title: 'Stopwatch',
15782
- 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',
15783
15968
  icon: 'fa-light fa-stopwatch',
15784
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
15969
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
15970
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_TOOLS,
15785
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.',
15786
15972
  groups: [AXPWidgetGroupEnum.UtilityWidget],
15787
15973
  type: 'view',
@@ -15962,10 +16148,11 @@ var stopwatchWidgetView_component = /*#__PURE__*/Object.freeze({
15962
16148
 
15963
16149
  const AXPWidgetFieldConfiguratorWidget = {
15964
16150
  name: 'widget-field-configurator',
15965
- title: 'Widget Field Configurator',
15966
- icon: 'fa-solid fa-puzzle-piece',
15967
- 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',
15968
16154
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
16155
+ subCategory: AXP_WIDGETS_EDITOR_SUB_CONFIG,
15969
16156
  groups: [AXPWidgetGroupEnum.UtilityWidget],
15970
16157
  type: 'editor',
15971
16158
  defaultFilterWidgetName: 'string-filter',
@@ -16182,12 +16369,12 @@ class AXPWidgetFieldConfiguratorWidgetColumnComponent extends AXPColumnWidgetCom
16182
16369
  @if (widget()) {
16183
16370
  <i [class]="widget()?.icon" class="fa-fw"></i>&nbsp;
16184
16371
  <span [title]="widget()?.title" class="ax-text-xs ax-font-medium">
16185
- {{ widget()?.title }}
16372
+ {{ widget()?.title | translate | async }}
16186
16373
  </span>
16187
16374
  } @else {
16188
16375
  <span class="ax-text-muted">---</span>
16189
16376
  }
16190
- `, 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 }); }
16191
16378
  }
16192
16379
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetFieldConfiguratorWidgetColumnComponent, decorators: [{
16193
16380
  type: Component,
@@ -16197,14 +16384,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
16197
16384
  @if (widget()) {
16198
16385
  <i [class]="widget()?.icon" class="fa-fw"></i>&nbsp;
16199
16386
  <span [title]="widget()?.title" class="ax-text-xs ax-font-medium">
16200
- {{ widget()?.title }}
16387
+ {{ widget()?.title | translate | async }}
16201
16388
  </span>
16202
16389
  } @else {
16203
16390
  <span class="ax-text-muted">---</span>
16204
16391
  }
16205
16392
  `,
16206
16393
  changeDetection: ChangeDetectionStrategy.OnPush,
16207
- imports: [],
16394
+ imports: [AXTranslationModule, AsyncPipe],
16208
16395
  inputs: ['rawValue', 'rowData'],
16209
16396
  }]
16210
16397
  }] });
@@ -16216,10 +16403,11 @@ var widgetFieldConfiguratorWidgetColumn_component = /*#__PURE__*/Object.freeze({
16216
16403
 
16217
16404
  const AXPItemConfiguratorWidget = {
16218
16405
  name: 'item-configurator',
16219
- title: 'Item Configurator',
16220
- icon: 'fa-solid fa-sliders',
16221
- 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',
16222
16409
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
16410
+ subCategory: AXP_WIDGETS_EDITOR_SUB_CONFIG,
16223
16411
  groups: [AXPWidgetGroupEnum.UtilityWidget],
16224
16412
  type: 'editor',
16225
16413
  defaultFilterWidgetName: 'string-filter',
@@ -17215,9 +17403,10 @@ var advancedGridWidgetView_component = /*#__PURE__*/Object.freeze({
17215
17403
 
17216
17404
  const AXPAdvancedGridWidget = {
17217
17405
  name: 'advanced-grid-layout',
17218
- title: 'Advanced Grid Layout',
17406
+ title: '@platform-layout-widgets:widgets.advanced-grid-layout.title',
17219
17407
  type: 'container',
17220
17408
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
17409
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
17221
17410
  icon: 'fa-light fa-grid-2',
17222
17411
  properties: [
17223
17412
  AXP_NAME_PROPERTY,
@@ -17455,9 +17644,10 @@ var advancedGridItemWidgetView_component = /*#__PURE__*/Object.freeze({
17455
17644
 
17456
17645
  const AXPAdvancedGridItemWidget = {
17457
17646
  name: 'advanced-grid-item-layout',
17458
- title: 'Advanced Grid Item',
17647
+ title: '@platform-layout-widgets:widgets.advanced-grid-item-layout.title',
17459
17648
  type: 'container',
17460
17649
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
17650
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
17461
17651
  icon: 'fa-light fa-objects-column',
17462
17652
  properties: [
17463
17653
  AXP_NAME_PROPERTY,
@@ -17600,10 +17790,11 @@ var blockWidgetView_component = /*#__PURE__*/Object.freeze({
17600
17790
  const AXPBlockWidget = {
17601
17791
  name: 'block-layout',
17602
17792
  type: 'container',
17603
- title: 'Block Layout',
17604
- description: 'Organizes content in blocks',
17793
+ title: '@platform-layout-widgets:widgets.block-layout.title',
17794
+ description: '@platform-layout-widgets:widgets.block-layout.description',
17605
17795
  icon: 'fa-light fa-block',
17606
17796
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
17797
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
17607
17798
  groups: [AXPWidgetGroupEnum.FormElement],
17608
17799
  options: {
17609
17800
  canInsert: true,
@@ -17661,7 +17852,7 @@ class AXPFieldsetWidgetDesignerComponent extends AXPLayoutBaseWidgetComponent {
17661
17852
  @if (icon()) {
17662
17853
  <i [class]="icon()" style="margin-inline-end: 0.5em;"></i>
17663
17854
  }
17664
- {{ title() | axpResolveMultiLanguageString | translate | async }}
17855
+ {{ title() | translate | async }}
17665
17856
  </legend>
17666
17857
  }
17667
17858
  <div class="axp-fieldset-content">
@@ -17680,7 +17871,7 @@ class AXPFieldsetWidgetDesignerComponent extends AXPLayoutBaseWidgetComponent {
17680
17871
  }
17681
17872
  </div>
17682
17873
  </fieldset>
17683
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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" }, { kind: "pipe", type: AXPResolveMultiLanguageStringPipe, name: "axpResolveMultiLanguageString" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17874
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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 }); }
17684
17875
  }
17685
17876
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFieldsetWidgetDesignerComponent, decorators: [{
17686
17877
  type: Component,
@@ -17693,7 +17884,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
17693
17884
  @if (icon()) {
17694
17885
  <i [class]="icon()" style="margin-inline-end: 0.5em;"></i>
17695
17886
  }
17696
- {{ title() | axpResolveMultiLanguageString | translate | async }}
17887
+ {{ title() | translate | async }}
17697
17888
  </legend>
17698
17889
  }
17699
17890
  <div class="axp-fieldset-content">
@@ -17720,7 +17911,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
17720
17911
  AXPWidgetCoreModule,
17721
17912
  AXPWidgetDesignerRendererDirective,
17722
17913
  AXPDesignerAddWidgetMiniButtonComponent,
17723
- AXPResolveMultiLanguageStringPipe,
17724
17914
  ],
17725
17915
  providers: [
17726
17916
  {
@@ -17762,11 +17952,11 @@ class AXPFieldsetWidgetViewComponent extends AXPLayoutBaseWidgetComponent {
17762
17952
  }
17763
17953
  }
17764
17954
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFieldsetWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
17765
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPFieldsetWidgetViewComponent, isStandalone: true, selector: "axp-fieldset-widget-view", usesInheritance: true, ngImport: i0, template: "@switch (look()) {\n<!-- fieldset Style -->\n@case ('fieldset') {\n<fieldset class=\"fieldset\">\n @if (shouldShowTitle()) {\n <legend class=\"legend\" (click)=\"toggleCollapse()\">\n @if (icon()) {\n <i [class]=\"icon()\" class=\"ax-text-sm\"></i>\n }\n {{ title() | axpResolveMultiLanguageString | translate | async }}\n </legend>\n }\n @if (!collapsible() || isOpen()) {\n <div class=\"content\" [style.grid-template-columns]=\"'repeat(' + cols() + ', 1fr)'\">\n @if (description()) {\n <p class=\"description\" [style.grid-column]=\"'1 / -1'\">\n {{ description() | axpResolveMultiLanguageString | translate | async }}\n </p>\n }\n <!-- render widgets -->\n @for (node of children(); track $index) {\n <ng-container axp-widget-renderer [node]=\"node\" [index]=\"index\" [parentNode]=\"this\"\n [mode]=\"node.mode ?? this.mode\"></ng-container>\n }\n </div>\n }\n</fieldset>\n}\n<!-- Card Style -->\n@case ('card') {\n<div class=\"card\">\n @if (shouldShowTitle()) {\n <div class=\"legend\" (click)=\"toggleCollapse()\">\n <div class=\"caption\">\n @if (icon()) {\n <i [class]=\"icon()\" class=\"ax-text-md\"></i>\n }\n <div class=\"text-content\">\n <h3 class=\"title\">{{ title() | axpResolveMultiLanguageString | translate | async }}</h3>\n @if (description()) {\n <p class=\"description\">{{ description() | axpResolveMultiLanguageString | translate | async }}</p>\n }\n </div>\n </div>\n <div class=\"icon\" [ngClass]=\"{ 'ax-transform ax-rotate-180': isOpen() }\">\n @if (collapsible()) {\n <i class=\"fa-solid fa-chevron-down\"></i>\n }\n </div>\n </div>\n }\n\n @if (!collapsible() || isOpen()) {\n <div class=\"content\" [style.grid-template-columns]=\"'repeat(' + cols() + ', 1fr)'\">\n @for (node of children(); track $index) {\n <ng-container axp-widget-renderer [node]=\"node\" [index]=\"index\" [parentNode]=\"this\"\n [mode]=\"node.mode ?? this.mode\"></ng-container>\n }\n </div>\n }\n</div>\n}\n<!-- Group Line style -->\n@case ('group') {\n<fieldset class=\"group\">\n @if (shouldShowTitle()) {\n <legend class=\"legend\">\n @if (icon()) {\n <i [class]=\"icon()\" class=\"ax-text-sm\"></i>\n }\n <h3 class=\"title\">{{ title() | axpResolveMultiLanguageString | translate | async }}</h3>\n <div class=\"title-line\"></div>\n </legend>\n }\n @if (!collapsible() || isOpen()) {\n <div class=\"content\" [style.grid-template-columns]=\"'repeat(' + cols() + ', 1fr)'\">\n @if (description()) {\n <p class=\"description\" [style.grid-column]=\"'1 / -1'\">\n {{ description() | axpResolveMultiLanguageString | translate | async }}\n </p>\n }\n <!-- render widgets -->\n @for (node of children(); track $index) {\n <ng-container axp-widget-renderer [node]=\"node\" [index]=\"index\" [parentNode]=\"this\"\n [mode]=\"node.mode ?? this.mode\"></ng-container>\n }\n </div>\n }\n</fieldset>\n}\n<!-- Container Style -->\n@case ('container') {\n<div class=\"container\">\n @for (node of children(); track $index) {\n <ng-container axp-widget-renderer [node]=\"node\" [index]=\"index\" [parentNode]=\"this\"\n [mode]=\"node.mode ?? this.mode\"></ng-container>\n }\n</div>\n}\n<!-- End of switch-->\n}", styles: [":host{display:block;height:100%;width:100%}:host>.fieldset{border-radius:.375rem;border-width:1px;padding:.5rem 1.5rem 1.5rem;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}:host>.fieldset>.legend{display:inline-flex;min-width:0px;cursor:pointer;align-items:center;gap:.5rem;padding-left:.5rem;padding-right:.5rem;font-size:1rem;line-height:1.5rem;font-weight:600}:host>.fieldset>.legend .title{margin:0;flex-shrink:0;white-space:nowrap;padding:0}:host>.fieldset>.content{display:grid;gap:1rem}:host>.fieldset>.content .description{padding-top:.25rem;padding-bottom:.75rem;font-size:.875rem;line-height:1.25rem;opacity:.65}:host>.group{padding:0}:host>.group>.legend{margin-bottom:1rem;display:flex;width:100%;flex-direction:column;gap:.25rem;padding:0}:host>.group>.legend .title{margin:0;width:fit-content;white-space:nowrap;padding:0;font-size:1rem;line-height:1.5rem;font-weight:500}:host>.group>.legend .title-line{margin-top:.25rem;height:1px;width:100%;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1))}:host>.group>.content{display:grid;gap:1rem}:host>.group>.content .description{padding-top:.25rem;padding-bottom:1.5rem;font-size:.875rem;line-height:1.25rem;opacity:.65}:host>.card{height:100%;overflow:hidden;border-radius:.375rem;border-width:1px;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}:host>.card>.legend{display:flex;width:100%;cursor:pointer;flex-direction:row;align-items:center;justify-content:space-between;padding:.625rem 1.25rem;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}:host>.card>.legend .caption{display:flex;flex-direction:row;align-items:center;gap:.5rem}:host>.card>.legend .caption .title{width:fit-content;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;line-height:1.625}:host>.card>.legend .caption .description{width:100%;font-size:.75rem;line-height:1rem;opacity:.65}:host>.card>.legend .caption .icon{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}:host>.card>.content{display:grid;gap:1rem;border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem;border-top-width:1px;padding:1.25rem}:host>.container{display:grid;gap:1rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AXPResolveMultiLanguageStringPipe, name: "axpResolveMultiLanguageString" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17955
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPFieldsetWidgetViewComponent, isStandalone: true, selector: "axp-fieldset-widget-view", usesInheritance: true, ngImport: i0, template: "@switch (look()) {\n <!-- fieldset Style -->\n @case ('fieldset') {\n <fieldset class=\"fieldset\">\n @if (shouldShowTitle()) {\n <legend class=\"legend\" (click)=\"toggleCollapse()\">\n @if (icon()) {\n <i [class]=\"icon()\" class=\"ax-text-sm\"></i>\n }\n {{ title() | translate | async }}\n </legend>\n }\n @if (!collapsible() || isOpen()) {\n <div class=\"content\" [style.grid-template-columns]=\"'repeat(' + cols() + ', 1fr)'\">\n @if (description()) {\n <p class=\"description\" [style.grid-column]=\"'1 / -1'\">\n {{ description() | translate | async }}\n </p>\n }\n <!-- render widgets -->\n @for (node of children(); track $index) {\n <ng-container\n axp-widget-renderer\n [node]=\"node\"\n [index]=\"index\"\n [parentNode]=\"this\"\n [mode]=\"node.mode ?? this.mode\"\n ></ng-container>\n }\n </div>\n }\n </fieldset>\n }\n <!-- Card Style -->\n @case ('card') {\n <div class=\"card\">\n @if (shouldShowTitle()) {\n <div class=\"legend\" (click)=\"toggleCollapse()\">\n <div class=\"caption\">\n @if (icon()) {\n <i [class]=\"icon()\" class=\"ax-text-md\"></i>\n }\n <div class=\"text-content\">\n <h3 class=\"title\">{{ title() | translate | async }}</h3>\n @if (description()) {\n <p class=\"description\">{{ description() | translate | async }}</p>\n }\n </div>\n </div>\n <div class=\"icon\" [ngClass]=\"{ 'ax-transform ax-rotate-180': isOpen() }\">\n @if (collapsible()) {\n <i class=\"fa-solid fa-chevron-down\"></i>\n }\n </div>\n </div>\n }\n\n @if (!collapsible() || isOpen()) {\n <div class=\"content\" [style.grid-template-columns]=\"'repeat(' + cols() + ', 1fr)'\">\n @for (node of children(); track $index) {\n <ng-container\n axp-widget-renderer\n [node]=\"node\"\n [index]=\"index\"\n [parentNode]=\"this\"\n [mode]=\"node.mode ?? this.mode\"\n ></ng-container>\n }\n </div>\n }\n </div>\n }\n <!-- Group Line style -->\n @case ('group') {\n <fieldset class=\"group\">\n @if (shouldShowTitle()) {\n <legend class=\"legend\">\n @if (icon()) {\n <i [class]=\"icon()\" class=\"ax-text-sm\"></i>\n }\n <h3 class=\"title\">{{ title() | translate | async }}</h3>\n <div class=\"title-line\"></div>\n </legend>\n }\n @if (!collapsible() || isOpen()) {\n <div class=\"content\" [style.grid-template-columns]=\"'repeat(' + cols() + ', 1fr)'\">\n @if (description()) {\n <p class=\"description\" [style.grid-column]=\"'1 / -1'\">\n {{ description() | translate | async }}\n </p>\n }\n <!-- render widgets -->\n @for (node of children(); track $index) {\n <ng-container\n axp-widget-renderer\n [node]=\"node\"\n [index]=\"index\"\n [parentNode]=\"this\"\n [mode]=\"node.mode ?? this.mode\"\n ></ng-container>\n }\n </div>\n }\n </fieldset>\n }\n <!-- Container Style -->\n @case ('container') {\n <div class=\"container\">\n @for (node of children(); track $index) {\n <ng-container\n axp-widget-renderer\n [node]=\"node\"\n [index]=\"index\"\n [parentNode]=\"this\"\n [mode]=\"node.mode ?? this.mode\"\n ></ng-container>\n }\n </div>\n }\n <!-- End of switch-->\n}\n", styles: [":host{display:block;height:100%;width:100%}:host>.fieldset{border-radius:.375rem;border-width:1px;padding:.5rem 1.5rem 1.5rem;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}:host>.fieldset>.legend{display:inline-flex;min-width:0px;cursor:pointer;align-items:center;gap:.5rem;padding-left:.5rem;padding-right:.5rem;font-size:1rem;line-height:1.5rem;font-weight:600}:host>.fieldset>.legend .title{margin:0;flex-shrink:0;white-space:nowrap;padding:0}:host>.fieldset>.content{display:grid;gap:1rem}:host>.fieldset>.content .description{padding-top:.25rem;padding-bottom:.75rem;font-size:.875rem;line-height:1.25rem;opacity:.65}:host>.group{padding:0}:host>.group>.legend{margin-bottom:1rem;display:flex;width:100%;flex-direction:column;gap:.25rem;padding:0}:host>.group>.legend .title{margin:0;width:fit-content;white-space:nowrap;padding:0;font-size:1rem;line-height:1.5rem;font-weight:500}:host>.group>.legend .title-line{margin-top:.25rem;height:1px;width:100%;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1))}:host>.group>.content{display:grid;gap:1rem}:host>.group>.content .description{padding-top:.25rem;padding-bottom:1.5rem;font-size:.875rem;line-height:1.25rem;opacity:.65}:host>.card{height:100%;overflow:hidden;border-radius:.375rem;border-width:1px;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}:host>.card>.legend{display:flex;width:100%;cursor:pointer;flex-direction:row;align-items:center;justify-content:space-between;padding:.625rem 1.25rem;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}:host>.card>.legend .caption{display:flex;flex-direction:row;align-items:center;gap:.5rem}:host>.card>.legend .caption .title{width:fit-content;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;line-height:1.625}:host>.card>.legend .caption .description{width:100%;font-size:.75rem;line-height:1rem;opacity:.65}:host>.card>.legend .caption .icon{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}:host>.card>.content{display:grid;gap:1rem;border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem;border-top-width:1px;padding:1.25rem}:host>.container{display:grid;gap:1rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17766
17956
  }
17767
17957
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFieldsetWidgetViewComponent, decorators: [{
17768
17958
  type: Component,
17769
- args: [{ selector: 'axp-fieldset-widget-view', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, AXPWidgetCoreModule, AXTranslationModule, AXPResolveMultiLanguageStringPipe], standalone: true, template: "@switch (look()) {\n<!-- fieldset Style -->\n@case ('fieldset') {\n<fieldset class=\"fieldset\">\n @if (shouldShowTitle()) {\n <legend class=\"legend\" (click)=\"toggleCollapse()\">\n @if (icon()) {\n <i [class]=\"icon()\" class=\"ax-text-sm\"></i>\n }\n {{ title() | axpResolveMultiLanguageString | translate | async }}\n </legend>\n }\n @if (!collapsible() || isOpen()) {\n <div class=\"content\" [style.grid-template-columns]=\"'repeat(' + cols() + ', 1fr)'\">\n @if (description()) {\n <p class=\"description\" [style.grid-column]=\"'1 / -1'\">\n {{ description() | axpResolveMultiLanguageString | translate | async }}\n </p>\n }\n <!-- render widgets -->\n @for (node of children(); track $index) {\n <ng-container axp-widget-renderer [node]=\"node\" [index]=\"index\" [parentNode]=\"this\"\n [mode]=\"node.mode ?? this.mode\"></ng-container>\n }\n </div>\n }\n</fieldset>\n}\n<!-- Card Style -->\n@case ('card') {\n<div class=\"card\">\n @if (shouldShowTitle()) {\n <div class=\"legend\" (click)=\"toggleCollapse()\">\n <div class=\"caption\">\n @if (icon()) {\n <i [class]=\"icon()\" class=\"ax-text-md\"></i>\n }\n <div class=\"text-content\">\n <h3 class=\"title\">{{ title() | axpResolveMultiLanguageString | translate | async }}</h3>\n @if (description()) {\n <p class=\"description\">{{ description() | axpResolveMultiLanguageString | translate | async }}</p>\n }\n </div>\n </div>\n <div class=\"icon\" [ngClass]=\"{ 'ax-transform ax-rotate-180': isOpen() }\">\n @if (collapsible()) {\n <i class=\"fa-solid fa-chevron-down\"></i>\n }\n </div>\n </div>\n }\n\n @if (!collapsible() || isOpen()) {\n <div class=\"content\" [style.grid-template-columns]=\"'repeat(' + cols() + ', 1fr)'\">\n @for (node of children(); track $index) {\n <ng-container axp-widget-renderer [node]=\"node\" [index]=\"index\" [parentNode]=\"this\"\n [mode]=\"node.mode ?? this.mode\"></ng-container>\n }\n </div>\n }\n</div>\n}\n<!-- Group Line style -->\n@case ('group') {\n<fieldset class=\"group\">\n @if (shouldShowTitle()) {\n <legend class=\"legend\">\n @if (icon()) {\n <i [class]=\"icon()\" class=\"ax-text-sm\"></i>\n }\n <h3 class=\"title\">{{ title() | axpResolveMultiLanguageString | translate | async }}</h3>\n <div class=\"title-line\"></div>\n </legend>\n }\n @if (!collapsible() || isOpen()) {\n <div class=\"content\" [style.grid-template-columns]=\"'repeat(' + cols() + ', 1fr)'\">\n @if (description()) {\n <p class=\"description\" [style.grid-column]=\"'1 / -1'\">\n {{ description() | axpResolveMultiLanguageString | translate | async }}\n </p>\n }\n <!-- render widgets -->\n @for (node of children(); track $index) {\n <ng-container axp-widget-renderer [node]=\"node\" [index]=\"index\" [parentNode]=\"this\"\n [mode]=\"node.mode ?? this.mode\"></ng-container>\n }\n </div>\n }\n</fieldset>\n}\n<!-- Container Style -->\n@case ('container') {\n<div class=\"container\">\n @for (node of children(); track $index) {\n <ng-container axp-widget-renderer [node]=\"node\" [index]=\"index\" [parentNode]=\"this\"\n [mode]=\"node.mode ?? this.mode\"></ng-container>\n }\n</div>\n}\n<!-- End of switch-->\n}", styles: [":host{display:block;height:100%;width:100%}:host>.fieldset{border-radius:.375rem;border-width:1px;padding:.5rem 1.5rem 1.5rem;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}:host>.fieldset>.legend{display:inline-flex;min-width:0px;cursor:pointer;align-items:center;gap:.5rem;padding-left:.5rem;padding-right:.5rem;font-size:1rem;line-height:1.5rem;font-weight:600}:host>.fieldset>.legend .title{margin:0;flex-shrink:0;white-space:nowrap;padding:0}:host>.fieldset>.content{display:grid;gap:1rem}:host>.fieldset>.content .description{padding-top:.25rem;padding-bottom:.75rem;font-size:.875rem;line-height:1.25rem;opacity:.65}:host>.group{padding:0}:host>.group>.legend{margin-bottom:1rem;display:flex;width:100%;flex-direction:column;gap:.25rem;padding:0}:host>.group>.legend .title{margin:0;width:fit-content;white-space:nowrap;padding:0;font-size:1rem;line-height:1.5rem;font-weight:500}:host>.group>.legend .title-line{margin-top:.25rem;height:1px;width:100%;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1))}:host>.group>.content{display:grid;gap:1rem}:host>.group>.content .description{padding-top:.25rem;padding-bottom:1.5rem;font-size:.875rem;line-height:1.25rem;opacity:.65}:host>.card{height:100%;overflow:hidden;border-radius:.375rem;border-width:1px;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}:host>.card>.legend{display:flex;width:100%;cursor:pointer;flex-direction:row;align-items:center;justify-content:space-between;padding:.625rem 1.25rem;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}:host>.card>.legend .caption{display:flex;flex-direction:row;align-items:center;gap:.5rem}:host>.card>.legend .caption .title{width:fit-content;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;line-height:1.625}:host>.card>.legend .caption .description{width:100%;font-size:.75rem;line-height:1rem;opacity:.65}:host>.card>.legend .caption .icon{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}:host>.card>.content{display:grid;gap:1rem;border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem;border-top-width:1px;padding:1.25rem}:host>.container{display:grid;gap:1rem}\n"] }]
17959
+ args: [{ selector: 'axp-fieldset-widget-view', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, AXPWidgetCoreModule, AXTranslationModule], standalone: true, template: "@switch (look()) {\n <!-- fieldset Style -->\n @case ('fieldset') {\n <fieldset class=\"fieldset\">\n @if (shouldShowTitle()) {\n <legend class=\"legend\" (click)=\"toggleCollapse()\">\n @if (icon()) {\n <i [class]=\"icon()\" class=\"ax-text-sm\"></i>\n }\n {{ title() | translate | async }}\n </legend>\n }\n @if (!collapsible() || isOpen()) {\n <div class=\"content\" [style.grid-template-columns]=\"'repeat(' + cols() + ', 1fr)'\">\n @if (description()) {\n <p class=\"description\" [style.grid-column]=\"'1 / -1'\">\n {{ description() | translate | async }}\n </p>\n }\n <!-- render widgets -->\n @for (node of children(); track $index) {\n <ng-container\n axp-widget-renderer\n [node]=\"node\"\n [index]=\"index\"\n [parentNode]=\"this\"\n [mode]=\"node.mode ?? this.mode\"\n ></ng-container>\n }\n </div>\n }\n </fieldset>\n }\n <!-- Card Style -->\n @case ('card') {\n <div class=\"card\">\n @if (shouldShowTitle()) {\n <div class=\"legend\" (click)=\"toggleCollapse()\">\n <div class=\"caption\">\n @if (icon()) {\n <i [class]=\"icon()\" class=\"ax-text-md\"></i>\n }\n <div class=\"text-content\">\n <h3 class=\"title\">{{ title() | translate | async }}</h3>\n @if (description()) {\n <p class=\"description\">{{ description() | translate | async }}</p>\n }\n </div>\n </div>\n <div class=\"icon\" [ngClass]=\"{ 'ax-transform ax-rotate-180': isOpen() }\">\n @if (collapsible()) {\n <i class=\"fa-solid fa-chevron-down\"></i>\n }\n </div>\n </div>\n }\n\n @if (!collapsible() || isOpen()) {\n <div class=\"content\" [style.grid-template-columns]=\"'repeat(' + cols() + ', 1fr)'\">\n @for (node of children(); track $index) {\n <ng-container\n axp-widget-renderer\n [node]=\"node\"\n [index]=\"index\"\n [parentNode]=\"this\"\n [mode]=\"node.mode ?? this.mode\"\n ></ng-container>\n }\n </div>\n }\n </div>\n }\n <!-- Group Line style -->\n @case ('group') {\n <fieldset class=\"group\">\n @if (shouldShowTitle()) {\n <legend class=\"legend\">\n @if (icon()) {\n <i [class]=\"icon()\" class=\"ax-text-sm\"></i>\n }\n <h3 class=\"title\">{{ title() | translate | async }}</h3>\n <div class=\"title-line\"></div>\n </legend>\n }\n @if (!collapsible() || isOpen()) {\n <div class=\"content\" [style.grid-template-columns]=\"'repeat(' + cols() + ', 1fr)'\">\n @if (description()) {\n <p class=\"description\" [style.grid-column]=\"'1 / -1'\">\n {{ description() | translate | async }}\n </p>\n }\n <!-- render widgets -->\n @for (node of children(); track $index) {\n <ng-container\n axp-widget-renderer\n [node]=\"node\"\n [index]=\"index\"\n [parentNode]=\"this\"\n [mode]=\"node.mode ?? this.mode\"\n ></ng-container>\n }\n </div>\n }\n </fieldset>\n }\n <!-- Container Style -->\n @case ('container') {\n <div class=\"container\">\n @for (node of children(); track $index) {\n <ng-container\n axp-widget-renderer\n [node]=\"node\"\n [index]=\"index\"\n [parentNode]=\"this\"\n [mode]=\"node.mode ?? this.mode\"\n ></ng-container>\n }\n </div>\n }\n <!-- End of switch-->\n}\n", styles: [":host{display:block;height:100%;width:100%}:host>.fieldset{border-radius:.375rem;border-width:1px;padding:.5rem 1.5rem 1.5rem;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}:host>.fieldset>.legend{display:inline-flex;min-width:0px;cursor:pointer;align-items:center;gap:.5rem;padding-left:.5rem;padding-right:.5rem;font-size:1rem;line-height:1.5rem;font-weight:600}:host>.fieldset>.legend .title{margin:0;flex-shrink:0;white-space:nowrap;padding:0}:host>.fieldset>.content{display:grid;gap:1rem}:host>.fieldset>.content .description{padding-top:.25rem;padding-bottom:.75rem;font-size:.875rem;line-height:1.25rem;opacity:.65}:host>.group{padding:0}:host>.group>.legend{margin-bottom:1rem;display:flex;width:100%;flex-direction:column;gap:.25rem;padding:0}:host>.group>.legend .title{margin:0;width:fit-content;white-space:nowrap;padding:0;font-size:1rem;line-height:1.5rem;font-weight:500}:host>.group>.legend .title-line{margin-top:.25rem;height:1px;width:100%;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1))}:host>.group>.content{display:grid;gap:1rem}:host>.group>.content .description{padding-top:.25rem;padding-bottom:1.5rem;font-size:.875rem;line-height:1.25rem;opacity:.65}:host>.card{height:100%;overflow:hidden;border-radius:.375rem;border-width:1px;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}:host>.card>.legend{display:flex;width:100%;cursor:pointer;flex-direction:row;align-items:center;justify-content:space-between;padding:.625rem 1.25rem;background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}:host>.card>.legend .caption{display:flex;flex-direction:row;align-items:center;gap:.5rem}:host>.card>.legend .caption .title{width:fit-content;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;line-height:1.625}:host>.card>.legend .caption .description{width:100%;font-size:.75rem;line-height:1rem;opacity:.65}:host>.card>.legend .caption .icon{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}:host>.card>.content{display:grid;gap:1rem;border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem;border-top-width:1px;padding:1.25rem}:host>.container{display:grid;gap:1rem}\n"] }]
17770
17960
  }] });
17771
17961
 
17772
17962
  var fieldsetWidgetView_component = /*#__PURE__*/Object.freeze({
@@ -17777,10 +17967,11 @@ var fieldsetWidgetView_component = /*#__PURE__*/Object.freeze({
17777
17967
  const AXPFieldsetWidget = {
17778
17968
  name: 'fieldset-layout',
17779
17969
  type: 'container',
17780
- title: 'Fieldset',
17781
- 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',
17782
17972
  icon: 'fa-light fa-object-group',
17783
17973
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
17974
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SURFACES,
17784
17975
  groups: [AXPWidgetGroupEnum.FormElement],
17785
17976
  properties: [AXP_NAME_PROPERTY, AXP_TITLE_PROPERTY, AXP_ICON_PROPERTY, AXP_LAYOUT_SHOW_HEADER_PROPERTY, AXP_LAYOUT_COLUMNS_PROPERTY],
17786
17977
  components: {
@@ -17881,7 +18072,7 @@ class AXPFlexWidgetViewComponent extends AXPFlexBaseLayoutWidgetComponent {
17881
18072
  [node]="node"
17882
18073
  [index]="index"
17883
18074
  [parentNode]="this"
17884
- [mode]="this.mode"
18075
+ [mode]="node.mode ?? this.mode"
17885
18076
  ></ng-container>
17886
18077
  }
17887
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 }); }
@@ -17897,7 +18088,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
17897
18088
  [node]="node"
17898
18089
  [index]="index"
17899
18090
  [parentNode]="this"
17900
- [mode]="this.mode"
18091
+ [mode]="node.mode ?? this.mode"
17901
18092
  ></ng-container>
17902
18093
  }
17903
18094
  `,
@@ -17920,10 +18111,11 @@ var flexWidgetView_component = /*#__PURE__*/Object.freeze({
17920
18111
  const AXPFlexWidget = {
17921
18112
  name: 'flex-layout',
17922
18113
  type: 'container',
17923
- title: 'Flex Layout',
17924
- description: 'Organizes content in flexible layout',
18114
+ title: '@platform-layout-widgets:widgets.flex-layout.title',
18115
+ description: '@platform-layout-widgets:widgets.flex-layout.description',
17925
18116
  icon: 'fa-light fa-box-taped',
17926
18117
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
18118
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
17927
18119
  groups: [AXPWidgetGroupEnum.FormElement],
17928
18120
  options: {
17929
18121
  canInsert: true,
@@ -18067,11 +18259,12 @@ var flexItemWidgetView_component = /*#__PURE__*/Object.freeze({
18067
18259
 
18068
18260
  const AXPFlexItemWidget = {
18069
18261
  name: 'flex-item-layout',
18070
- title: 'Flex Item',
18262
+ title: '@platform-layout-widgets:widgets.flex-item-layout.title',
18071
18263
  type: 'container',
18072
18264
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
18265
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
18073
18266
  // groups: [AXPWidgetGroupEnum.FormElement],
18074
- description: 'Flex Item Layout',
18267
+ description: '@platform-layout-widgets:widgets.flex-item-layout.description',
18075
18268
  icon: 'fa-light fa-rectangle-vertical-history',
18076
18269
  properties: [
18077
18270
  AXP_NAME_PROPERTY,
@@ -18163,10 +18356,11 @@ var pageWidgetView_component = /*#__PURE__*/Object.freeze({
18163
18356
 
18164
18357
  const AXPPageWidget = {
18165
18358
  name: 'page-layout',
18166
- title: 'Page',
18167
- description: 'Structures the entire page',
18359
+ title: '@platform-layout-widgets:widgets.page-layout.title',
18360
+ description: '@platform-layout-widgets:widgets.page-layout.description',
18168
18361
  icon: 'fa-light fa-page',
18169
18362
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
18363
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SHELL,
18170
18364
  type: 'container',
18171
18365
  properties: [
18172
18366
  AXP_NAME_PROPERTY,
@@ -18490,10 +18684,11 @@ var repeaterWidgetView_component = /*#__PURE__*/Object.freeze({
18490
18684
 
18491
18685
  const AXPRepeaterWidget = {
18492
18686
  name: 'repeater-layout',
18493
- title: 'Repeater',
18494
- description: 'Adds repeating form elements',
18687
+ title: '@platform-layout-widgets:widgets.repeater-layout.title',
18688
+ description: '@platform-layout-widgets:widgets.repeater-layout.description',
18495
18689
  icon: 'fa-light fa-table-list',
18496
18690
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
18691
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SURFACES,
18497
18692
  groups: [AXPWidgetGroupEnum.FormElement],
18498
18693
  type: 'container',
18499
18694
  properties: [
@@ -18886,9 +19081,10 @@ var stepWizardWidgetView_component = /*#__PURE__*/Object.freeze({
18886
19081
 
18887
19082
  const AXPStepWizardWidget = {
18888
19083
  name: 'step-wizard',
18889
- title: 'Step Wizard',
18890
- icon: 'fa-solid fa-image-user',
18891
- 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,
18892
19088
  aiDescription: 'Use for multi-step flows (wizard). Present when the user should follow ordered steps; children typically hold step content.',
18893
19089
  groups: [AXPWidgetGroupEnum.FormElement],
18894
19090
  type: 'view',
@@ -19865,10 +20061,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
19865
20061
  const AXPTableWidget = {
19866
20062
  name: 'table-layout',
19867
20063
  type: 'container',
19868
- title: 'Table Layout',
19869
- 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',
19870
20066
  icon: 'fa-light fa-table',
19871
20067
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
20068
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
19872
20069
  groups: [AXPWidgetGroupEnum.FormElement],
19873
20070
  options: {
19874
20071
  canInsert: true,
@@ -20283,10 +20480,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
20283
20480
 
20284
20481
  const AXPTableItemWidget = {
20285
20482
  name: 'table-item-layout',
20286
- title: 'Table Item',
20483
+ title: '@platform-layout-widgets:widgets.table-item-layout.title',
20287
20484
  type: 'container',
20288
20485
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
20289
- description: 'Table Item (row/cell) container',
20486
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
20487
+ description: '@platform-layout-widgets:widgets.table-item-layout.description',
20290
20488
  icon: 'fa-light fa-table-cells',
20291
20489
  properties: [
20292
20490
  AXP_NAME_PROPERTY,
@@ -23962,12 +24160,13 @@ var cronJobWidgetView_component = /*#__PURE__*/Object.freeze({
23962
24160
 
23963
24161
  const AXPCronJobWidget = {
23964
24162
  name: 'cron-job',
23965
- title: 'Cron Job',
24163
+ title: '@platform-layout-widgets:widgets.cron-job.title',
23966
24164
  icon: 'fa-light fa-alarm-clock',
23967
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
24165
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
24166
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_INPUT,
23968
24167
  aiDescription: 'Cron expression editor and viewer. Use when the answer involves recurring schedules or job timing (not a one-off date picker).',
23969
24168
  type: 'editor',
23970
- groups: [AXPWidgetGroupEnum.FormElement],
24169
+ groups: [AXPWidgetGroupEnum.BaseWidget],
23971
24170
  properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY],
23972
24171
  components: {
23973
24172
  view: {
@@ -24111,10 +24310,11 @@ var metaDataWidgetView_component = /*#__PURE__*/Object.freeze({
24111
24310
 
24112
24311
  const AXPMetaDataWidget = {
24113
24312
  name: 'meta-data-editor',
24114
- title: 'Meta Data',
24313
+ title: '@platform-layout-widgets:widgets.meta-data-editor.title',
24115
24314
  icon: 'fa-light fa-input-text',
24116
- description: 'meta data rendered',
24315
+ description: '@platform-layout-widgets:widgets.meta-data-editor.description',
24117
24316
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
24317
+ subCategory: AXP_WIDGETS_EDITOR_SUB_COMPOSITE,
24118
24318
  type: 'editor',
24119
24319
  defaultFilterWidgetName: 'string-filter',
24120
24320
  properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY],
@@ -24422,10 +24622,11 @@ var numberUnitBoxWidgetView_component = /*#__PURE__*/Object.freeze({
24422
24622
 
24423
24623
  const AXPNumberUnitBoxWidget = {
24424
24624
  name: 'number-unit-editor',
24425
- title: 'Number Unit Box',
24426
- description: 'Inputs numeric values',
24625
+ title: '@platform-layout-widgets:widgets.number-unit-editor.title',
24626
+ description: '@platform-layout-widgets:widgets.number-unit-editor.description',
24427
24627
  icon: 'fa-light fa-input-numeric',
24428
24628
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
24629
+ subCategory: AXP_WIDGETS_EDITOR_SUB_NUMERIC,
24429
24630
  groups: [AXPWidgetGroupEnum.FormElement],
24430
24631
  type: 'editor',
24431
24632
  defaultFilterWidgetName: 'number-filter',
@@ -24471,10 +24672,11 @@ const AXPNumberUnitBoxWidget = {
24471
24672
 
24472
24673
  const AXPTableEditorWidget = {
24473
24674
  name: 'table-editor',
24474
- title: 'Table Editor',
24675
+ title: '@platform-layout-widgets:widgets.table-editor.title',
24475
24676
  icon: 'fa-light fa-input-text',
24476
- description: 'Inputs single-line text',
24677
+ description: '@platform-layout-widgets:widgets.table-editor.description',
24477
24678
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
24679
+ subCategory: AXP_WIDGETS_EDITOR_SUB_COMPOSITE,
24478
24680
  type: 'editor',
24479
24681
  defaultFilterWidgetName: 'string-filter',
24480
24682
  properties: [
@@ -25479,13 +25681,13 @@ var imageWidgetView_component = /*#__PURE__*/Object.freeze({
25479
25681
  //#region ---- Image Widget Config ----
25480
25682
  const AXPImageWidget = {
25481
25683
  name: 'image',
25482
- title: 'Image',
25483
- 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',
25484
25686
  icon: 'fa-light fa-image',
25485
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
25687
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
25688
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
25486
25689
  aiDescription: 'Use for a single image (URL or embedded). Prefer over plain markdown when aspect ratio, sizing, or binary handling matters.',
25487
25690
  groups: [AXPWidgetGroupEnum.FormElement],
25488
- aiCatalog: 'include',
25489
25691
  type: 'editor',
25490
25692
  properties: [
25491
25693
  AXP_NAME_PROPERTY,
@@ -25657,13 +25859,13 @@ var listToolbarWidgetView_component = /*#__PURE__*/Object.freeze({
25657
25859
 
25658
25860
  const AXPListToolbarWidget = {
25659
25861
  name: 'list-toolbar',
25660
- title: 'List Toolbar',
25661
- description: '',
25862
+ title: '@platform-layout-widgets:widgets.list-toolbar.title',
25662
25863
  type: 'view',
25663
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
25864
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
25865
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_LISTS,
25664
25866
  aiDescription: 'Toolbar for list views: sort, filter, and column toggles. Use next to data-list when the user may refine or reorder rows.',
25665
25867
  groups: [AXPWidgetGroupEnum.UtilityWidget],
25666
- icon: 'fa-solid fa-square',
25868
+ icon: 'fa-light fa-square',
25667
25869
  properties: [
25668
25870
  AXP_NAME_PROPERTY,
25669
25871
  AXP_DATA_PATH_PROPERTY,
@@ -25702,13 +25904,13 @@ const AXPListToolbarWidget = {
25702
25904
 
25703
25905
  const AXPMapWidget = {
25704
25906
  name: 'map',
25705
- title: 'Map',
25706
- description: 'Displays and interacts with maps',
25907
+ title: '@platform-layout-widgets:widgets.map.title',
25908
+ description: '@platform-layout-widgets:widgets.map.description',
25707
25909
  icon: 'fa-light fa-map-location',
25708
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
25910
+ categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
25911
+ subCategory: AXP_WIDGETS_ADVANCE_SUB_TOOLS,
25709
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.',
25710
25913
  groups: [AXPWidgetGroupEnum.FormElement],
25711
- aiCatalog: 'include',
25712
25914
  type: 'editor',
25713
25915
  properties: [
25714
25916
  AXP_NAME_PROPERTY,
@@ -25863,7 +26065,7 @@ class AXPTimerDurationWidgetEditComponent extends AXPValueWidgetComponent {
25863
26065
  [options]="validation.options"
25864
26066
  ></ax-validation-rule>
25865
26067
  }
25866
- </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 }); }
25867
26069
  }
25868
26070
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTimerDurationWidgetEditComponent, decorators: [{
25869
26071
  type: Component,
@@ -25929,10 +26131,11 @@ var timeDurationWidgetView_component = /*#__PURE__*/Object.freeze({
25929
26131
 
25930
26132
  const AXPTimeDurationWidget = {
25931
26133
  name: 'time-duration',
25932
- title: 'Time Duration',
25933
- description: 'Selects a time duration',
26134
+ title: '@platform-layout-widgets:widgets.time-duration.title',
26135
+ description: '@platform-layout-widgets:widgets.time-duration.description',
25934
26136
  icon: 'fa-light fa-clock',
25935
26137
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
26138
+ subCategory: AXP_WIDGETS_EDITOR_SUB_DATETIME,
25936
26139
  groups: [AXPWidgetGroupEnum.FormElement],
25937
26140
  defaultFilterWidgetName: 'time-duration-filter',
25938
26141
  type: 'editor',
@@ -27203,10 +27406,11 @@ const AXPTimeDurationFilterWidget = {
27203
27406
 
27204
27407
  const AXPDocumentWidget = {
27205
27408
  name: 'document-layout',
27206
- title: 'Document',
27207
- description: 'Structures the entire document',
27409
+ title: '@platform-layout-widgets:widgets.document-layout.title',
27410
+ description: '@platform-layout-widgets:widgets.document-layout.description',
27208
27411
  icon: 'fa-light fa-page',
27209
27412
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
27413
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SHELL,
27210
27414
  type: 'container',
27211
27415
  properties: [],
27212
27416
  components: {},
@@ -27219,6 +27423,24 @@ class AXPFormFieldWidgetViewComponent extends AXPGridItemBaseLayoutWidgetCompone
27219
27423
  this.showLabel = computed(() => this.options()['showLabel'] ?? true, ...(ngDevMode ? [{ debugName: "showLabel" }] : /* istanbul ignore next */ []));
27220
27424
  this.badge = computed(() => this.options()['badge'], ...(ngDevMode ? [{ debugName: "badge" }] : /* istanbul ignore next */ []));
27221
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 */ []));
27222
27444
  this.isRequired = computed(() => this.children().some((c) => {
27223
27445
  const validations = c.options?.['validations'];
27224
27446
  return Array.isArray(validations) && validations.some((v) => v.rule === 'required');
@@ -27230,16 +27452,27 @@ class AXPFormFieldWidgetViewComponent extends AXPGridItemBaseLayoutWidgetCompone
27230
27452
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFormFieldWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
27231
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: `
27232
27454
  <ax-form-field>
27233
- @if (showLabel() || badge()) {
27234
- <div class="ax-flex ax-gap-1 ax-items-center ax-justify-between">
27235
- @if (showLabel()) {
27236
- <ax-label [required]="isRequired()">{{ label() | axpResolveMultiLanguageString | translate | async }}</ax-label>
27237
- }
27238
- @if (badge()) {
27239
- <!-- <ax-badge [text]="(badge() | translate | async) ?? ''" color="primary" class="ax-primary-lightest"></ax-badge> -->
27240
- <span class="ax-text ax-p-1 ax-text-xs ax-rounded-md ">{{ badge() | axpResolveMultiLanguageString | translate | async }}</span>
27241
- }
27242
- </div>
27455
+ @if (showTopRow()) {
27456
+ <div class="ax-flex ax-gap-1 ax-items-center ax-justify-between">
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>
27472
+ @if (badge()) {
27473
+ <span class="ax-text ax-p-1 ax-text-xs ax-rounded-md">{{ badge() | translate | async }}</span>
27474
+ }
27475
+ </div>
27243
27476
  }
27244
27477
  @for (node of children(); track $index) {
27245
27478
  <ng-container
@@ -27251,8 +27484,13 @@ class AXPFormFieldWidgetViewComponent extends AXPGridItemBaseLayoutWidgetCompone
27251
27484
  >
27252
27485
  </ng-container>
27253
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
+ }
27254
27492
  </ax-form-field>
27255
- `, 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" }, { kind: "pipe", type: AXPResolveMultiLanguageStringPipe, name: "axpResolveMultiLanguageString" }], 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 }); }
27256
27494
  }
27257
27495
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFormFieldWidgetViewComponent, decorators: [{
27258
27496
  type: Component,
@@ -27260,16 +27498,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
27260
27498
  selector: 'axp-form-field-widget-view',
27261
27499
  template: `
27262
27500
  <ax-form-field>
27263
- @if (showLabel() || badge()) {
27264
- <div class="ax-flex ax-gap-1 ax-items-center ax-justify-between">
27265
- @if (showLabel()) {
27266
- <ax-label [required]="isRequired()">{{ label() | axpResolveMultiLanguageString | translate | async }}</ax-label>
27267
- }
27268
- @if (badge()) {
27269
- <!-- <ax-badge [text]="(badge() | translate | async) ?? ''" color="primary" class="ax-primary-lightest"></ax-badge> -->
27270
- <span class="ax-text ax-p-1 ax-text-xs ax-rounded-md ">{{ badge() | axpResolveMultiLanguageString | translate | async }}</span>
27271
- }
27272
- </div>
27501
+ @if (showTopRow()) {
27502
+ <div class="ax-flex ax-gap-1 ax-items-center ax-justify-between">
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>
27518
+ @if (badge()) {
27519
+ <span class="ax-text ax-p-1 ax-text-xs ax-rounded-md">{{ badge() | translate | async }}</span>
27520
+ }
27521
+ </div>
27273
27522
  }
27274
27523
  @for (node of children(); track $index) {
27275
27524
  <ng-container
@@ -27281,6 +27530,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
27281
27530
  >
27282
27531
  </ng-container>
27283
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
+ }
27284
27538
  </ax-form-field>
27285
27539
  `,
27286
27540
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -27291,7 +27545,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
27291
27545
  AXPWidgetCoreModule,
27292
27546
  AXTranslationModule,
27293
27547
  AXBadgeModule,
27294
- AXPResolveMultiLanguageStringPipe,
27548
+ AXDecoratorModule,
27549
+ AXTooltipModule,
27295
27550
  ],
27296
27551
  standalone: true,
27297
27552
  }]
@@ -27309,6 +27564,20 @@ class AXPFormFieldWidgetDesignerComponent extends AXPGridItemBaseLayoutWidgetCom
27309
27564
  constructor() {
27310
27565
  super(...arguments);
27311
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 */ []));
27312
27581
  }
27313
27582
  get __class() {
27314
27583
  return this.hostClass();
@@ -27321,7 +27590,12 @@ class AXPFormFieldWidgetDesignerComponent extends AXPGridItemBaseLayoutWidgetCom
27321
27590
  },
27322
27591
  ], usesInheritance: true, ngImport: i0, template: `
27323
27592
  <ax-form-field>
27324
- <ax-label>{{ label() | axpResolveMultiLanguageString | 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>
27325
27599
  @for (node of children(); track $index) {
27326
27600
  <ng-container
27327
27601
  axp-widget-designer-renderer
@@ -27334,8 +27608,13 @@ class AXPFormFieldWidgetDesignerComponent extends AXPGridItemBaseLayoutWidgetCom
27334
27608
  } @empty {
27335
27609
  <axp-designer-add-widget-mini-button></axp-designer-add-widget-mini-button>
27336
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
+ }
27337
27616
  </ax-form-field>
27338
- `, 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" }, { kind: "pipe", type: AXPResolveMultiLanguageStringPipe, name: "axpResolveMultiLanguageString" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
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 }); }
27339
27618
  }
27340
27619
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFormFieldWidgetDesignerComponent, decorators: [{
27341
27620
  type: Component,
@@ -27343,7 +27622,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
27343
27622
  selector: 'axp-form-field-widget-designer',
27344
27623
  template: `
27345
27624
  <ax-form-field>
27346
- <ax-label>{{ label() | axpResolveMultiLanguageString | 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>
27347
27631
  @for (node of children(); track $index) {
27348
27632
  <ng-container
27349
27633
  axp-widget-designer-renderer
@@ -27356,6 +27640,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
27356
27640
  } @empty {
27357
27641
  <axp-designer-add-widget-mini-button></axp-designer-add-widget-mini-button>
27358
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
+ }
27359
27648
  </ax-form-field>
27360
27649
  `,
27361
27650
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -27367,7 +27656,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
27367
27656
  AXPWidgetCoreModule,
27368
27657
  AXPWidgetDesignerRendererDirective,
27369
27658
  AXPDesignerAddWidgetMiniButtonComponent,
27370
- AXPResolveMultiLanguageStringPipe,
27371
27659
  ],
27372
27660
  providers: [
27373
27661
  {
@@ -27387,14 +27675,37 @@ var formFieldWidgetDesigner_component = /*#__PURE__*/Object.freeze({
27387
27675
  AXPFormFieldWidgetDesignerComponent: AXPFormFieldWidgetDesignerComponent
27388
27676
  });
27389
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
+ });
27390
27695
  const AXPFormFieldWidget = {
27391
27696
  name: 'form-field',
27392
- title: 'Form Field',
27697
+ title: '@platform-layout-widgets:widgets.form-field.title',
27393
27698
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
27699
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_UTILITY,
27394
27700
  groups: [AXPWidgetGroupEnum.FormElement],
27395
27701
  type: 'container',
27396
27702
  icon: 'fa-light fa-pen-field',
27397
- 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
+ ],
27398
27709
  components: {
27399
27710
  view: {
27400
27711
  component: () => Promise.resolve().then(function () { return formFieldWidgetView_component; }).then((c) => c.AXPFormFieldWidgetViewComponent),
@@ -27885,9 +28196,10 @@ var gridWidgetView_component = /*#__PURE__*/Object.freeze({
27885
28196
 
27886
28197
  const AXPGridWidget = {
27887
28198
  name: 'grid-layout',
27888
- title: 'Grid Layout',
28199
+ title: '@platform-layout-widgets:widgets.grid-layout.title',
27889
28200
  type: 'container',
27890
28201
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
28202
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
27891
28203
  groups: [AXPWidgetGroupEnum.FormElement],
27892
28204
  icon: 'fa-light fa-grid',
27893
28205
  properties: [
@@ -28124,9 +28436,10 @@ var gridItemWidgetView_component = /*#__PURE__*/Object.freeze({
28124
28436
 
28125
28437
  const AXPGridItemWidget = {
28126
28438
  name: 'grid-item-layout',
28127
- title: 'Grid Item',
28439
+ title: '@platform-layout-widgets:widgets.grid-item-layout.title',
28128
28440
  type: 'container',
28129
28441
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
28442
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_GRID,
28130
28443
  // groups: [AXPWidgetGroupEnum.FormElement],
28131
28444
  icon: 'fa-light fa-objects-column',
28132
28445
  properties: [
@@ -28153,10 +28466,11 @@ const AXPGridItemWidget = {
28153
28466
 
28154
28467
  const AXPAlertBoxWidget = {
28155
28468
  name: 'alert-box-layout',
28156
- title: 'Alert Box',
28157
- 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',
28158
28471
  icon: 'fa-light fa-circle-info',
28159
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
28472
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
28473
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SURFACES,
28160
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.',
28161
28475
  groups: [AXPWidgetGroupEnum.FormElement],
28162
28476
  type: 'view',
@@ -28399,9 +28713,10 @@ var iconWidgetColumn_component = /*#__PURE__*/Object.freeze({
28399
28713
 
28400
28714
  const AXPIconWidget = {
28401
28715
  name: 'icon',
28402
- title: 'Icon',
28716
+ title: '@platform-layout-widgets:widgets.icon.title',
28403
28717
  type: 'view',
28404
28718
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
28719
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_UTILITY,
28405
28720
  // groups: [AXPWidgetGroupEnum.FormElement],
28406
28721
  icon: 'fa-light fa-icons',
28407
28722
  properties: [AXP_NAME_PROPERTY],
@@ -28607,10 +28922,11 @@ var panelWidgetView_component = /*#__PURE__*/Object.freeze({
28607
28922
  const AXPPanelWidget = {
28608
28923
  name: 'panel-layout',
28609
28924
  type: 'container',
28610
- title: 'Panel Layout',
28611
- 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',
28612
28927
  icon: 'fa-light fa-rectangle-list',
28613
28928
  categories: AXP_WIDGETS_LAYOUT_CATEGORY,
28929
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SURFACES,
28614
28930
  groups: [AXPWidgetGroupEnum.FormElement],
28615
28931
  properties: [
28616
28932
  AXP_NAME_PROPERTY,
@@ -28864,13 +29180,14 @@ var tabsetWidgetDesigner_component = /*#__PURE__*/Object.freeze({
28864
29180
 
28865
29181
  const AXPTabSetWidget = {
28866
29182
  name: 'tabset-layout',
28867
- title: 'TabSet Layout',
28868
- 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',
28869
29185
  type: 'view',
28870
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
29186
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
29187
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_TABS,
28871
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.',
28872
29189
  groups: [AXPWidgetGroupEnum.FormElement],
28873
- icon: 'fa-solid fa-square',
29190
+ icon: 'fa-light fa-square',
28874
29191
  properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY],
28875
29192
  components: {
28876
29193
  view: {
@@ -28951,13 +29268,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
28951
29268
 
28952
29269
  const AXPTabSetItemWidget = {
28953
29270
  name: 'tabset-item',
28954
- title: 'TabSet Item',
28955
- 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',
28956
29273
  type: 'view',
28957
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
29274
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
29275
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_TABS,
28958
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.',
28959
29277
  groups: [AXPWidgetGroupEnum.FormElement],
28960
- icon: 'fa-solid fa-square',
29278
+ icon: 'fa-light fa-square',
28961
29279
  properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY],
28962
29280
  components: {
28963
29281
  view: {
@@ -28998,10 +29316,11 @@ var textBlockWidgetView_component = /*#__PURE__*/Object.freeze({
28998
29316
 
28999
29317
  const AXPTextBlockWidget = {
29000
29318
  name: 'text-block-layout',
29001
- title: 'Text Block',
29002
- description: 'Displays text blocks',
29319
+ title: '@platform-layout-widgets:widgets.text-block-layout.title',
29320
+ description: '@platform-layout-widgets:widgets.text-block-layout.description',
29003
29321
  icon: 'fa-light fa-text',
29004
- categories: [AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_AI_CATEGORY],
29322
+ categories: [AXP_WIDGETS_LAYOUT_CATEGORY],
29323
+ subCategory: AXP_WIDGETS_LAYOUT_SUB_SURFACES,
29005
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.',
29006
29325
  groups: [AXPWidgetGroupEnum.FormElement],
29007
29326
  type: 'view',
@@ -29478,6 +29797,7 @@ var triggerExpressionEditorPopup_component = /*#__PURE__*/Object.freeze({
29478
29797
  AXPTriggerExpressionEditorPopupComponent: AXPTriggerExpressionEditorPopupComponent
29479
29798
  });
29480
29799
 
29800
+ //#region ---- Imports ----
29481
29801
  //#endregion
29482
29802
  //#region ---- Widget Lists (single source of truth) ----
29483
29803
  /**
@@ -29594,6 +29914,7 @@ const EXTENDED_WIDGETS = [
29594
29914
  name: 'select-filter',
29595
29915
  title: 'Select Filter',
29596
29916
  categories: AXP_WIDGETS_EDITOR_CATEGORY,
29917
+ groups: [AXPWidgetGroupEnum.BaseWidget],
29597
29918
  type: 'filter',
29598
29919
  components: {},
29599
29920
  options: {
@@ -29695,13 +30016,9 @@ function toSerializableWidget(config) {
29695
30016
  ...(config.alias != null ? { alias: config.alias } : {}),
29696
30017
  title: resolveWidgetLabelForAi(config.title) || String(config.name),
29697
30018
  ...(config.icon != null ? { icon: config.icon } : {}),
29698
- ...(config.description != null
29699
- ? { description: resolveWidgetLabelForAi(config.description) || undefined }
29700
- : {}),
29701
- ...(config.aiDescription != null && config.aiDescription !== ''
29702
- ? { aiDescription: config.aiDescription }
29703
- : {}),
29704
- categories: normalizeWidgetCategories(config.categories).map((c) => ({
30019
+ ...(config.description != null ? { description: resolveWidgetLabelForAi(config.description) || undefined } : {}),
30020
+ ...(config.aiDescription != null && config.aiDescription !== '' ? { aiDescription: config.aiDescription } : {}),
30021
+ categories: normalizeDefinitionCategories(config.categories).map((c) => ({
29705
30022
  name: c.name,
29706
30023
  title: resolveWidgetLabelForAi(c.title) || c.name,
29707
30024
  order: c.order,
@@ -29714,7 +30031,6 @@ function toSerializableWidget(config) {
29714
30031
  ...(config.designer != null ? { designer: config.designer } : {}),
29715
30032
  ...(config.options != null ? { options: config.options } : {}),
29716
30033
  ...(config.defaultFilterWidgetName != null ? { defaultFilterWidgetName: config.defaultFilterWidgetName } : {}),
29717
- ...(config.aiCatalog != null ? { aiCatalog: config.aiCatalog } : {}),
29718
30034
  };
29719
30035
  }
29720
30036
  function buildUsage(config) {
@@ -29737,7 +30053,7 @@ function buildUsage(config) {
29737
30053
  //#endregion
29738
30054
  //#region ---- Query ----
29739
30055
  /**
29740
- * Read-only catalog of widgets suitable for AI structured rendering (Widgets:GetForAI).
30056
+ * Read-only full widget registry (Widgets:GetForAI). Lists every registered widget.
29741
30057
  */
29742
30058
  class AXPGetWidgetsForAIQuery {
29743
30059
  constructor() {
@@ -29746,18 +30062,13 @@ class AXPGetWidgetsForAIQuery {
29746
30062
  async fetch(input) {
29747
30063
  const name = input?.name?.trim();
29748
30064
  if (!name) {
29749
- const list = this.registry
29750
- .all()
29751
- .filter((w) => isWidgetAiCatalogIncluded(w))
29752
- .map((w) => ({
30065
+ const list = this.registry.all().map((w) => ({
29753
30066
  name: String(w.name),
29754
30067
  title: resolveWidgetLabelForAi(w.title) || String(w.name),
29755
- ...(w.description != null
29756
- ? { description: resolveWidgetLabelForAi(w.description) || undefined }
29757
- : {}),
30068
+ ...(w.description != null ? { description: resolveWidgetLabelForAi(w.description) || undefined } : {}),
29758
30069
  ...(w.aiDescription != null && w.aiDescription !== '' ? { aiDescription: w.aiDescription } : {}),
29759
30070
  type: w.type,
29760
- categories: normalizeWidgetCategories(w.categories).map((c) => ({
30071
+ categories: normalizeDefinitionCategories(w.categories).map((c) => ({
29761
30072
  name: c.name,
29762
30073
  title: resolveWidgetLabelForAi(c.title) || c.name,
29763
30074
  order: c.order,
@@ -29767,12 +30078,6 @@ class AXPGetWidgetsForAIQuery {
29767
30078
  }
29768
30079
  try {
29769
30080
  const config = this.registry.resolve(name);
29770
- if (!isWidgetAiCatalogIncluded(config)) {
29771
- return {
29772
- success: false,
29773
- error: `Widget "${name}" is not available for the AI widget catalog.`,
29774
- };
29775
- }
29776
30081
  return {
29777
30082
  success: true,
29778
30083
  detail: toSerializableWidget(config),