@acorex-platform/framework-client 0.0.59 → 0.0.60

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 (38) hide show
  1. package/fesm2022/acorex-platform-framework-client-auth.mjs +397 -93
  2. package/fesm2022/acorex-platform-framework-client-auth.mjs.map +1 -1
  3. package/fesm2022/acorex-platform-framework-client-common.mjs +33 -31
  4. package/fesm2022/acorex-platform-framework-client-common.mjs.map +1 -1
  5. package/fesm2022/acorex-platform-framework-client-layout-components.mjs +12 -4
  6. package/fesm2022/acorex-platform-framework-client-layout-components.mjs.map +1 -1
  7. package/fesm2022/{acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-BBuYugjl.mjs → acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-D0jDsA6M.mjs} +80 -13
  8. package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-D0jDsA6M.mjs.map +1 -0
  9. package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-DZDf_nVq.mjs → acorex-platform-framework-client-layout-entity-attachments-page.component-Bdvd1iYt.mjs} +2 -2
  10. package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-DZDf_nVq.mjs.map → acorex-platform-framework-client-layout-entity-attachments-page.component-Bdvd1iYt.mjs.map} +1 -1
  11. package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-CFFv3jDs.mjs → acorex-platform-framework-client-layout-entity-bulk-entity.command-CsTP8YHv.mjs} +2 -2
  12. package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-CFFv3jDs.mjs.map → acorex-platform-framework-client-layout-entity-bulk-entity.command-CsTP8YHv.mjs.map} +1 -1
  13. package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-BDNPJg_6.mjs → acorex-platform-framework-client-layout-entity-gallery-page.component-UvMk0GbU.mjs} +2 -2
  14. package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-BDNPJg_6.mjs.map → acorex-platform-framework-client-layout-entity-gallery-page.component-UvMk0GbU.mjs.map} +1 -1
  15. package/fesm2022/acorex-platform-framework-client-layout-entity.mjs +1 -1
  16. package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs +165 -28
  17. package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs.map +1 -1
  18. package/fesm2022/{acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-Rv0K9r_e.mjs → acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-KrDsAa3H.mjs} +555 -121
  19. package/fesm2022/acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-KrDsAa3H.mjs.map +1 -0
  20. package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-Dzqn3rGa.mjs → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-BDlo6nTx.mjs} +2 -2
  21. package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-Dzqn3rGa.mjs.map → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-BDlo6nTx.mjs.map} +1 -1
  22. package/fesm2022/{acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-C97rrrmu.mjs → acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-By3wntCB.mjs} +2 -2
  23. package/fesm2022/{acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-C97rrrmu.mjs.map → acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-By3wntCB.mjs.map} +1 -1
  24. package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs +1 -1
  25. package/fesm2022/acorex-platform-framework-client-themes-default.mjs +4 -4
  26. package/fesm2022/acorex-platform-framework-client-themes-default.mjs.map +1 -1
  27. package/layout/builder/README.md +10 -0
  28. package/layout/widget-core/README.md +47 -3
  29. package/layout/widgets/README.md +8 -2
  30. package/package.json +2 -2
  31. package/types/acorex-platform-framework-client-auth.d.ts +60 -1
  32. package/types/acorex-platform-framework-client-common.d.ts +3 -2
  33. package/types/acorex-platform-framework-client-layout-components.d.ts +3 -1
  34. package/types/acorex-platform-framework-client-layout-entity.d.ts +8 -1
  35. package/types/acorex-platform-framework-client-layout-widget-core.d.ts +39 -0
  36. package/types/acorex-platform-framework-client-layout-widgets.d.ts +25 -5
  37. package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-BBuYugjl.mjs.map +0 -1
  38. package/fesm2022/acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-Rv0K9r_e.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import * as i1$4 from '@acorex-platform/framework-client/layout/widget-core';
2
- import { AXPWidgetCoreModule, AXPDataListWidgetComponent, AXPColumnWidgetComponent, AXPLayoutBaseWidgetComponent, AXP_NAME_PROPERTY, AXP_DISABLED_PROPERTY, AXP_STYLE_COLOR_PROPERTY, AXP_STYLE_LOOK_PROPERTY, AXP_ICON_PROPERTY, AXP_IS_LOADING_PROPERTY, AXP_TEXT_PROPERTY, AXP_WIDGETS_ACTION_SUB_CONTROLS, AXP_WIDGETS_ACTION_CATEGORY, AXP_DATA_PATH_PROPERTY, AXP_WIDGETS_EDITOR_CATEGORY, AXPValueWidgetComponent, AXP_LABEL_PROPERTY, AXP_READONLY_PROPERTY, AXP_TRIGGERS_PROPERTY, booleanDefaultProperty, AXP_WIDGETS_EDITOR_SUB_CHOICE, AXP_PLACEHOLDER_PROPERTY, AXP_HAS_CLEAR_BUTTON_PROPERTY, AXP_WIDGETS_EDITOR_SUB_VISUAL, AXP_DATA_PROPERTY_GROUP, AXP_HAS_LABEL_PROPERTY, AXP_HAS_ICON_PROPERTY, AXP_BEHAVIOR_PROPERTY_GROUP, AXP_WIDGETS_EDITOR_SUB_COMPOSITE, AXP_DATE_FORMAT_PROPERTY, AXP_DATE_DEPTH_PROPERTY, AXP_DATE_RANGE_LIMIT_PROPERTY, AXP_REQUIRED_VALIDATION_PROPERTY, AXP_LESS_THAN_VALIDATION_PROPERTY, AXP_GREATER_THAN_VALIDATION_PROPERTY, AXP_TABLE_COLUMN_WIDTH_PROPERTY, AXP_WIDGETS_EDITOR_SUB_DATETIME, AXPColumnTruncatedTextComponent, AXP_MULTI_LANGUAGE_PROPERTY, AXP_MIN_LENGTH_VALIDATION_PROPERTY, AXP_REGULAR_EXPRESSION_VALIDATION_PROPERTY, AXP_MAX_LENGTH_VALIDATION_PROPERTY, largeTextDefaultProperty, AXP_WIDGETS_EDITOR_SUB_TEXT_INPUTS, AXP_ALLOW_MULTIPLE_PROPERTY, AXP_SPIN_BUTTON_PROPERTY, AXP_NUMBER_SEPARATOR_PROPERTY, numberDefaultProperty, numberMinValueProperty, numberMaxValueProperty, AXP_WIDGETS_EDITOR_SUB_NUMERIC, AXP_HAS_COPY_ICON_PROPERTY, AXP_HAS_EYE_ICON_PROPERTY, AXP_SHOW_PASSWORD_PROPERTY, AXP_MIN_LINE_COUNT_PROPERTY, AXP_MAX_LINE_COUNT_PROPERTY, AXP_FIT_LINE_COUNT_PROPERTY, richTextDefaultProperty, AXP_WIDGETS_EDITOR_SUB_RICH, AXP_DATA_SOURCE_OPTIONS_PROPERTY, AXP_ALLOW_SEARCH_PROPERTY, selectEditorDefaultValueProperty, AXP_DIRECTION_PROPERTY, selectionListEditorDefaultValueProperty, plainTextDefaultProperty, AXP_FALSY_TEXT_PROPERTY, AXP_TRULY_TEXT_PROPERTY, AXP_WIDGETS_ADVANCE_SUB_MEDIA, AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_ADVANCE_SUB_INPUT, AXP_WIDGETS_LAYOUT_SUB_LISTS, AXP_WIDGETS_LAYOUT_CATEGORY, AXP_STYLING_PROPERTY_GROUP, AXP_WIDGETS_ADVANCE_SUB_TOOLS, AXP_WIDGETS_ADVANCE_SUB_DATA, AXP_COLOR_PROPERTY, AXP_CONTENT_PROPERTY, AXP_WIDGETS_EDITOR_SUB_CONFIG, AXPWidgetRegistryService, AXPPropertyEditorHelper, AXP_WIDGETS_LAYOUT_SUB_GRID, AXPBlockBaseLayoutWidgetComponent, AXP_LAYOUT_SPACING_PROPERTY, AXP_LAYOUT_BORDER_PROPERTY, AXP_LAYOUT_DIRECTION_PROPERTY, AXP_TITLE_PROPERTY, AXP_DESCRIPTION_PROPERTY, AXP_LAYOUT_SHOW_HEADER_PROPERTY, AXP_LAYOUT_COLUMNS_PROPERTY, AXP_WIDGETS_LAYOUT_SUB_SURFACES, AXPFlexBaseLayoutWidgetComponent, AXP_LAYOUT_FLEX_PROPERTY, AXPFlexItemBaseLayoutWidgetComponent, AXP_LAYOUT_FLEX_ITEM_PROPERTY, AXP_LAYOUT_PROFILE, layoutSizeFromDevice, AXP_THEME_PROPERTY, AXP_FONT_SIZE_PROPERTY, AXP_BG_COLOR_PROPERTY, AXP_WIDGETS_LAYOUT_SUB_SHELL, AXPTableBaseLayoutWidgetComponent, AXP_TABLE_COLUMNS_PROPERTY, AXP_LAYOUT_TABLE_PROPERTY_GROUP, AXPTableItemBaseLayoutWidgetComponent, AXP_TABLE_ITEM_COLSPAN_PROPERTY, AXP_TABLE_ITEM_ROWSPAN_PROPERTY, AXP_TEXT_ALIGN_PROPERTY, AXP_VERTICAL_ALIGN_PROPERTY, findNonEmptyBreakpoints, AXP_LOCAL_DATA_SOURCE_STORE, isLocalDataSourceRef, parseLocalDataSourceId, buildLocalDataSourceListRows, toLocalDataSourceRef, createDefaultLocalDataSourceColumns, padLocalDataSourceSheetRows, coerceSpacingProfile, spacingBoxOrEmpty, AXP_DEFAULT_ROW_COUNT_PROPERTY, AXP_APPEARANCE_PROPERTY_GROUP, AXP_WIDGETS_LAYOUT_SUB_UTILITY, AXPGridItemBaseLayoutWidgetComponent, AXPGridBaseLayoutWidgetComponent, AXP_LAYOUT_GRID_PROPERTY, AXP_LAYOUT_GRID_ITEM_PROPERTY, AXP_WIDGETS_LAYOUT_SUB_TABS, AXP_WIDGET_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/layout/widget-core';
2
+ import { AXPWidgetCoreModule, AXPDataListWidgetComponent, AXPColumnWidgetComponent, AXPLayoutBaseWidgetComponent, AXP_NAME_PROPERTY, AXP_DISABLED_PROPERTY, AXP_STYLE_COLOR_PROPERTY, AXP_STYLE_LOOK_PROPERTY, AXP_ICON_PROPERTY, AXP_IS_LOADING_PROPERTY, AXP_TEXT_PROPERTY, AXP_WIDGETS_ACTION_SUB_CONTROLS, AXP_WIDGETS_ACTION_CATEGORY, AXP_DATA_PATH_PROPERTY, AXP_WIDGETS_EDITOR_CATEGORY, AXPValueWidgetComponent, AXP_LABEL_PROPERTY, AXP_READONLY_PROPERTY, AXP_TRIGGERS_PROPERTY, booleanDefaultProperty, AXP_WIDGETS_EDITOR_SUB_CHOICE, AXP_PLACEHOLDER_PROPERTY, AXP_HAS_CLEAR_BUTTON_PROPERTY, AXP_WIDGETS_EDITOR_SUB_VISUAL, AXP_DATA_PROPERTY_GROUP, AXP_HAS_LABEL_PROPERTY, AXP_HAS_ICON_PROPERTY, AXP_BEHAVIOR_PROPERTY_GROUP, AXP_WIDGETS_EDITOR_SUB_COMPOSITE, AXP_DATE_FORMAT_PROPERTY, AXP_DATE_DEPTH_PROPERTY, AXP_DATE_RANGE_LIMIT_PROPERTY, AXP_REQUIRED_VALIDATION_PROPERTY, AXP_LESS_THAN_VALIDATION_PROPERTY, AXP_GREATER_THAN_VALIDATION_PROPERTY, AXP_TABLE_COLUMN_WIDTH_PROPERTY, AXP_WIDGETS_EDITOR_SUB_DATETIME, AXPColumnTruncatedTextComponent, AXP_MULTI_LANGUAGE_PROPERTY, AXP_MIN_LENGTH_VALIDATION_PROPERTY, AXP_REGULAR_EXPRESSION_VALIDATION_PROPERTY, AXP_MAX_LENGTH_VALIDATION_PROPERTY, largeTextDefaultProperty, AXP_WIDGETS_EDITOR_SUB_TEXT_INPUTS, AXP_ALLOW_MULTIPLE_PROPERTY, AXP_SPIN_BUTTON_PROPERTY, AXP_NUMBER_SEPARATOR_PROPERTY, numberDefaultProperty, numberMinValueProperty, numberMaxValueProperty, AXP_WIDGETS_EDITOR_SUB_NUMERIC, AXP_HAS_COPY_ICON_PROPERTY, AXP_HAS_EYE_ICON_PROPERTY, AXP_SHOW_PASSWORD_PROPERTY, AXP_MIN_LINE_COUNT_PROPERTY, AXP_MAX_LINE_COUNT_PROPERTY, AXP_FIT_LINE_COUNT_PROPERTY, richTextDefaultProperty, AXP_WIDGETS_EDITOR_SUB_RICH, AXP_LOCAL_DATA_SOURCE_PREFIX, AXP_LOCAL_DATA_SOURCE_STORE, isLocalDataSourceRef, parseLocalDataSourceId, AXP_DATA_SOURCE_OPTIONS_PROPERTY, AXP_ALLOW_SEARCH_PROPERTY, selectEditorDefaultValueProperty, AXP_DIRECTION_PROPERTY, selectionListEditorDefaultValueProperty, plainTextDefaultProperty, AXP_FALSY_TEXT_PROPERTY, AXP_TRULY_TEXT_PROPERTY, AXP_WIDGETS_ADVANCE_SUB_MEDIA, AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_ADVANCE_SUB_INPUT, AXP_WIDGETS_LAYOUT_SUB_LISTS, AXP_WIDGETS_LAYOUT_CATEGORY, AXP_STYLING_PROPERTY_GROUP, AXP_WIDGETS_ADVANCE_SUB_TOOLS, AXP_WIDGETS_ADVANCE_SUB_DATA, AXP_COLOR_PROPERTY, AXP_CONTENT_PROPERTY, AXP_WIDGETS_EDITOR_SUB_CONFIG, AXPWidgetRegistryService, AXPPropertyEditorHelper, AXP_WIDGETS_LAYOUT_SUB_GRID, AXPBlockBaseLayoutWidgetComponent, AXP_LAYOUT_SPACING_PROPERTY, AXP_LAYOUT_BORDER_PROPERTY, AXP_LAYOUT_DIRECTION_PROPERTY, AXP_TITLE_PROPERTY, AXP_DESCRIPTION_PROPERTY, AXP_LAYOUT_SHOW_HEADER_PROPERTY, AXP_LAYOUT_COLUMNS_PROPERTY, AXP_WIDGETS_LAYOUT_SUB_SURFACES, AXPFlexBaseLayoutWidgetComponent, AXP_LAYOUT_FLEX_PROPERTY, AXPFlexItemBaseLayoutWidgetComponent, AXP_LAYOUT_FLEX_ITEM_PROPERTY, AXP_LAYOUT_PROFILE, layoutSizeFromDevice, AXP_THEME_PROPERTY, AXP_FONT_SIZE_PROPERTY, AXP_BG_COLOR_PROPERTY, AXP_WIDGETS_LAYOUT_SUB_SHELL, AXPTableBaseLayoutWidgetComponent, AXP_TABLE_COLUMNS_PROPERTY, AXP_LAYOUT_TABLE_PROPERTY_GROUP, AXPTableItemBaseLayoutWidgetComponent, AXP_TABLE_ITEM_COLSPAN_PROPERTY, AXP_TABLE_ITEM_ROWSPAN_PROPERTY, AXP_TEXT_ALIGN_PROPERTY, AXP_VERTICAL_ALIGN_PROPERTY, findNonEmptyBreakpoints, buildLocalDataSourceListRows, toLocalDataSourceRef, createDefaultLocalDataSourceColumns, padLocalDataSourceSheetRows, coerceSpacingProfile, spacingBoxOrEmpty, AXP_DEFAULT_ROW_COUNT_PROPERTY, AXP_APPEARANCE_PROPERTY_GROUP, AXP_WIDGETS_LAYOUT_SUB_UTILITY, AXPGridItemBaseLayoutWidgetComponent, AXPGridBaseLayoutWidgetComponent, AXP_LAYOUT_GRID_PROPERTY, AXP_LAYOUT_GRID_ITEM_PROPERTY, AXP_WIDGETS_LAYOUT_SUB_TABS, AXP_WIDGET_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/layout/widget-core';
3
3
  import { AXActionSheetService } from '@acorex/components/action-sheet';
4
4
  import * as i1$3 from '@acorex/components/badge';
5
5
  import { AXBadgeModule } from '@acorex/components/badge';
@@ -21,7 +21,7 @@ import { AXTextBoxModule } from '@acorex/components/text-box';
21
21
  import * as i1$6 from '@acorex/core/translation';
22
22
  import { AXTranslationModule, AXTranslationService, resolveMultiLanguageString as resolveMultiLanguageString$1 } from '@acorex/core/translation';
23
23
  import { AXP_LOCALE_MANAGEMENT_PORT, AXPFilterOperatorMiddlewareService, AXPCleanNestedFilters, ALL_DEFAULT_OPERATORS, AXPClipBoardService, AXPSettingsService, DATE_OPERATORS, BOOLEAN_OPERATORS, NUMBER_OPERATORS, STRING_OPERATORS, resolveDateFilterPresets, findManualPresetIdByOperation, applyDateFilterPreset, AXPFileStorageService, resolveStoredImageDisplayUrl, AXP_INTEGRATION_RUNTIME_PROVIDER, commandMessageTextForError, normalizePositiveNumberOption, resolveEntityRowDisplayText, resolveEntityRowDisplayTitle, downloadGraphicFromElement, printGraphicFromElement, AXPStatusDefinitionProviderService, isStoredImageFileId, AXP_ENTITY_LIST_DISPLAY_MODE_DEFAULT, AXPCommonSettings } from '@acorex-platform/framework-client/common';
24
- import { AXPDeviceService, setupPopupFooterKeyboardShortcuts, ensureRuntimeSurfaceClass, AXPColorPaletteService, AXPDebugService, FORM_DIRTY_TRACE_NS, AXPTagService, AXPExpressionEvaluatorService, AXPHookService, AXPDataGenerator, AXPLogoComponent, AXPEntityBroadcastService, applyQueryArray, chordToKbdItemKeys, objectKeyValueTransforms } from '@acorex-platform/framework-client/core';
24
+ import { AXPDeviceService, setupPopupFooterKeyboardShortcuts, ensureRuntimeSurfaceClass, AXPColorPaletteService, AXPDebugService, FORM_DIRTY_TRACE_NS, applyFilterArray, AXPTagService, AXPExpressionEvaluatorService, AXPHookService, AXPDataGenerator, AXPLogoComponent, AXPEntityBroadcastService, applyQueryArray, chordToKbdItemKeys, objectKeyValueTransforms } from '@acorex-platform/framework-client/core';
25
25
  import * as i1$5 from '@angular/common';
26
26
  import { CommonModule, AsyncPipe, NgTemplateOutlet } from '@angular/common';
27
27
  import * as i0 from '@angular/core';
@@ -30,7 +30,7 @@ import * as i1$7 from '@angular/forms';
30
30
  import { FormsModule } from '@angular/forms';
31
31
  import { AXLookupComponent } from '@acorex/components/lookup';
32
32
  import { AXFormatService } from '@acorex/core/format';
33
- import { resolveMultiLanguageString, setSmart, omitFilterClauseIdentity, createRandomUuid, themeSurfaceVariantFromClass, toRuntimeSurfaceClassName, resolveToSurfaceClass, parseRuntimeHexSurface, listThemeSurfaceGroups, normalizeHexColor, extractValue, AXPRegionalSetting, filterOperatorAllowsEmptyValue, shouldUseLocaleMapShape, buildLocaleTextMapValue, isFormValueEqual, isSelectionValueEqual, isLocaleStringMap, AXPWidgetsCatalog, runtimeQueryCollectionData, AXP_INTEGRATION_CONNECTION_STATUS, AXP_INTEGRATION_AUTH_METHOD_TYPE, sortByMultiLanguageString, axpGridItemPlacementClassMap, AXPFileStorageStatus, AXPPlatformScope, flattenQueryFilterUserGroups, isPersistableFilterQuery, axpGridNarrowContainerQueryPrefix, normalizeDefinitionCategories, runtimeQueryFailure, runtimeQuerySuccessObject } from '@acorex-platform/framework-shared/core';
33
+ import { resolveMultiLanguageString, setSmart, omitFilterClauseIdentity, createRandomUuid, themeSurfaceVariantFromClass, toRuntimeSurfaceClassName, resolveToSurfaceClass, parseRuntimeHexSurface, listThemeSurfaceGroups, normalizeHexColor, extractValue, AXPRegionalSetting, filterOperatorAllowsEmptyValue, shouldUseLocaleMapShape, buildLocaleTextMapValue, isFormValueEqual, runtimeQueryPayloadData, runtimeQueryCollectionData, isSelectionValueEqual, isLocaleStringMap, AXPWidgetsCatalog, AXP_INTEGRATION_CONNECTION_STATUS, AXP_INTEGRATION_AUTH_METHOD_TYPE, sortByMultiLanguageString, axpGridItemPlacementClassMap, AXPFileStorageStatus, AXPPlatformScope, flattenQueryFilterUserGroups, isPersistableFilterQuery, AXPWidgetsList, axpGridNarrowContainerQueryPrefix, normalizeDefinitionCategories, runtimeQueryFailure, runtimeQuerySuccessObject } from '@acorex-platform/framework-shared/core';
34
34
  import { get, set, castArray, isNil, cloneDeep, isEqual, isNull, isEmpty, isPlainObject, isString, isNumber, defaultTo, has } from 'lodash-es';
35
35
  import * as i2$2 from '@acorex/components/loading';
36
36
  import { AXLoadingModule } from '@acorex/components/loading';
@@ -68,6 +68,7 @@ import { AXSafePipe } from '@acorex/core/pipes';
68
68
  import { AXPlatform } from '@acorex/core/platform';
69
69
  import * as i2$5 from '@acorex/components/text-editor';
70
70
  import { AXTextEditorModule } from '@acorex/components/text-editor';
71
+ import { ENTITY_GET_BY_ID_DEFAULT, AXP_WIDGET_AI_AGENT_NAMES, parseWidgetCatalogMetadataJson, isValidWidgetAiAgentName, matchesWidgetAiAgent, AXP_WIDGET_AI_AGENT_ASSIST_FOLLOW_UP_CHIPS_LAYOUT, AXP_WIDGET_AI_AGENT_CHART_LAYOUT, AXP_WIDGET_AI_AGENT_FORM_LAYOUT } from '@acorex-platform/framework-shared/runtime';
71
72
  import { AXHighlightTextComponent } from '@acorex/components/highlight';
72
73
  import { AXComboBoxComponent } from '@acorex/components/combo-box';
73
74
  import * as i3$5 from '@acorex/components/skeleton';
@@ -120,7 +121,6 @@ import { AXAlertModule } from '@acorex/components/alert';
120
121
  import { DomSanitizer } from '@angular/platform-browser';
121
122
  import * as i1$k from '@acorex/components/accordion';
122
123
  import { AXAccordionModule } from '@acorex/components/accordion';
123
- import { AXP_WIDGET_AI_AGENT_NAMES, parseWidgetCatalogMetadataJson, isValidWidgetAiAgentName, matchesWidgetAiAgent, AXP_WIDGET_AI_AGENT_ASSIST_FOLLOW_UP_CHIPS_LAYOUT, AXP_WIDGET_AI_AGENT_CHART_LAYOUT, AXP_WIDGET_AI_AGENT_FORM_LAYOUT } from '@acorex-platform/framework-shared/runtime';
124
124
  import { AXP_ENTITY_DEFINITION_CRUD_SERVICE } from '@acorex-platform/framework-client/domain';
125
125
 
126
126
  //#endregion
@@ -7341,15 +7341,17 @@ class AXPRichTextWidgetEditComponent extends AXPValueWidgetComponent {
7341
7341
  (onValueChanged)="onEditorChanged($event)"
7342
7342
  >
7343
7343
  <ax-text-editor-toolbar>
7344
- <ax-prefix>
7345
- <ax-text-editor-history></ax-text-editor-history>
7346
- <ax-text-editor-link></ax-text-editor-link>
7347
- <ax-text-editor-media></ax-text-editor-media>
7348
- <ax-text-editor-font-style></ax-text-editor-font-style>
7349
- <ax-text-editor-colors></ax-text-editor-colors>
7350
- <ax-text-editor-list></ax-text-editor-list>
7351
- <ax-text-editor-alignment></ax-text-editor-alignment>
7352
- </ax-prefix>
7344
+ <ax-text-editor-history></ax-text-editor-history>
7345
+ <ax-divider></ax-divider>
7346
+ <ax-text-editor-link></ax-text-editor-link>
7347
+ <ax-text-editor-media></ax-text-editor-media>
7348
+ <ax-divider></ax-divider>
7349
+ <ax-text-editor-font-style></ax-text-editor-font-style>
7350
+ <ax-text-editor-colors></ax-text-editor-colors>
7351
+ <ax-divider></ax-divider>
7352
+ <ax-text-editor-list></ax-text-editor-list>
7353
+ <ax-divider></ax-divider>
7354
+ <ax-text-editor-alignment></ax-text-editor-alignment>
7353
7355
  @if (effectiveMultiLanguage()) {
7354
7356
  <ax-suffix>
7355
7357
  <ax-button class="ax-sm" (onClick)="openMultiLanguagePopup()" [disabled]="disabled()" look="blank">
@@ -7360,6 +7362,7 @@ class AXPRichTextWidgetEditComponent extends AXPValueWidgetComponent {
7360
7362
  </ax-suffix>
7361
7363
  }
7362
7364
  </ax-text-editor-toolbar>
7365
+ <ax-text-editor-content></ax-text-editor-content>
7363
7366
  @for (validation of validationRules(); track $index) {
7364
7367
  <ax-validation-rule
7365
7368
  [rule]="validation.rule"
@@ -7367,7 +7370,7 @@ class AXPRichTextWidgetEditComponent extends AXPValueWidgetComponent {
7367
7370
  [options]="validation.options"
7368
7371
  ></ax-validation-rule>
7369
7372
  }
7370
- </ax-text-editor>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTextEditorModule }, { kind: "component", type: i2$5.AXTextEditorComponent, selector: "ax-text-editor", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "look", "placeHolder", "outputFormat", "line", "initialLine", "maxLine"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange"] }, { kind: "component", type: i2$5.AXTextEditorToolbarComponent, selector: "ax-text-editor-toolbar", inputs: ["orientation"] }, { kind: "component", type: i2$5.AXTextEditorHistoryComponent, selector: "ax-text-editor-history" }, { kind: "component", type: i2$5.AXTextEditorFontStyleComponent, selector: "ax-text-editor-font-style" }, { kind: "component", type: i2$5.AXTextEditorAlignmentComponent, selector: "ax-text-editor-alignment" }, { kind: "component", type: i2$5.AXTextEditorColorsComponent, selector: "ax-text-editor-colors" }, { kind: "component", type: i2$5.AXTextEditorListComponent, selector: "ax-text-editor-list" }, { kind: "component", type: i2$5.AXTextEditorLinkComponent, selector: "ax-text-editor-link" }, { kind: "component", type: i2$5.AXTextEditorMediaComponent, selector: "ax-text-editor-media" }, { kind: "ngmodule", type: AXValidationModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$6.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
7373
+ </ax-text-editor>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTextEditorModule }, { kind: "component", type: i2$5.AXTextEditorComponent, selector: "ax-text-editor", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "look", "placeHolder", "outputFormat", "line", "initialLine", "maxLine"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange"] }, { kind: "component", type: i2$5.AXTextEditorToolbarComponent, selector: "ax-text-editor-toolbar", inputs: ["orientation"] }, { kind: "component", type: i2$5.AXTextEditorContentComponent, selector: "ax-text-editor-content" }, { kind: "component", type: i2$5.AXTextEditorHistoryComponent, selector: "ax-text-editor-history" }, { kind: "component", type: i2$5.AXTextEditorFontStyleComponent, selector: "ax-text-editor-font-style" }, { kind: "component", type: i2$5.AXTextEditorAlignmentComponent, selector: "ax-text-editor-alignment" }, { kind: "component", type: i2$5.AXTextEditorColorsComponent, selector: "ax-text-editor-colors" }, { kind: "component", type: i2$5.AXTextEditorListComponent, selector: "ax-text-editor-list" }, { kind: "component", type: i2$5.AXTextEditorLinkComponent, selector: "ax-text-editor-link" }, { kind: "component", type: i2$5.AXTextEditorMediaComponent, selector: "ax-text-editor-media" }, { kind: "ngmodule", type: AXValidationModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$6.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
7371
7374
  }
7372
7375
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPRichTextWidgetEditComponent, decorators: [{
7373
7376
  type: Component,
@@ -7385,15 +7388,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
7385
7388
  (onValueChanged)="onEditorChanged($event)"
7386
7389
  >
7387
7390
  <ax-text-editor-toolbar>
7388
- <ax-prefix>
7389
- <ax-text-editor-history></ax-text-editor-history>
7390
- <ax-text-editor-link></ax-text-editor-link>
7391
- <ax-text-editor-media></ax-text-editor-media>
7392
- <ax-text-editor-font-style></ax-text-editor-font-style>
7393
- <ax-text-editor-colors></ax-text-editor-colors>
7394
- <ax-text-editor-list></ax-text-editor-list>
7395
- <ax-text-editor-alignment></ax-text-editor-alignment>
7396
- </ax-prefix>
7391
+ <ax-text-editor-history></ax-text-editor-history>
7392
+ <ax-divider></ax-divider>
7393
+ <ax-text-editor-link></ax-text-editor-link>
7394
+ <ax-text-editor-media></ax-text-editor-media>
7395
+ <ax-divider></ax-divider>
7396
+ <ax-text-editor-font-style></ax-text-editor-font-style>
7397
+ <ax-text-editor-colors></ax-text-editor-colors>
7398
+ <ax-divider></ax-divider>
7399
+ <ax-text-editor-list></ax-text-editor-list>
7400
+ <ax-divider></ax-divider>
7401
+ <ax-text-editor-alignment></ax-text-editor-alignment>
7397
7402
  @if (effectiveMultiLanguage()) {
7398
7403
  <ax-suffix>
7399
7404
  <ax-button class="ax-sm" (onClick)="openMultiLanguagePopup()" [disabled]="disabled()" look="blank">
@@ -7404,6 +7409,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
7404
7409
  </ax-suffix>
7405
7410
  }
7406
7411
  </ax-text-editor-toolbar>
7412
+ <ax-text-editor-content></ax-text-editor-content>
7407
7413
  @for (validation of validationRules(); track $index) {
7408
7414
  <ax-validation-rule
7409
7415
  [rule]="validation.rule"
@@ -7697,29 +7703,245 @@ function resolveSelectBadgeClasses(item, options) {
7697
7703
  }
7698
7704
  //#endregion
7699
7705
 
7706
+ //#endregion
7707
+ //#region ----- Planning -----
7708
+ const QUERY_DEFINITION_ENTITY = 'PlatformManagement.QueryDefinition';
7709
+ const queryDefinitionCache = new Map();
7710
+ /** Both sides are stringified so numeric ids match `"30"` and `30`. */
7711
+ function selectKeysEqual(left, right) {
7712
+ if (Object.is(left, right)) {
7713
+ return true;
7714
+ }
7715
+ if (left == null || right == null || left === '' || right === '') {
7716
+ return false;
7717
+ }
7718
+ return String(left) === String(right);
7719
+ }
7720
+ function readSelectQueryKey(dataSource) {
7721
+ if (typeof dataSource === 'string') {
7722
+ if (dataSource.startsWith(AXP_LOCAL_DATA_SOURCE_PREFIX)) {
7723
+ return null;
7724
+ }
7725
+ const key = dataSource.trim();
7726
+ return key.length > 0 ? key : null;
7727
+ }
7728
+ if (dataSource != null && typeof dataSource === 'object' && !Array.isArray(dataSource) && 'id' in dataSource) {
7729
+ const id = dataSource.id;
7730
+ if (id == null || id === '') {
7731
+ return null;
7732
+ }
7733
+ return String(id);
7734
+ }
7735
+ return null;
7736
+ }
7737
+ /**
7738
+ * Inline and already-labeled values resolve immediately.
7739
+ * Primitive keys backed by a query name stay as `query` slots for byKey.
7740
+ */
7741
+ function planSelectColumnSlots(input) {
7742
+ const queryName = readSelectQueryKey(input.dataSource);
7743
+ const catalog = readCatalogRows(input);
7744
+ const values = castArray(input.rawValue).filter((value) => !isBlankSelectRawValue(value));
7745
+ const slots = [];
7746
+ for (const value of values) {
7747
+ const key = readSelectKey(value, input.valueField);
7748
+ const catalogRow = catalog ? findCatalogRow(catalog, input.valueField, key) : undefined;
7749
+ const storedRow = toStoredRow(value, input.valueField, input.textField, key);
7750
+ if (catalogRow) {
7751
+ slots.push({
7752
+ kind: 'row',
7753
+ row: mergeCatalogRow(storedRow, catalogRow, input.cssClassField, input.textField, input.valueField),
7754
+ });
7755
+ continue;
7756
+ }
7757
+ if (storedRow && hasDistinctSelectLabel(storedRow, input.textField, input.valueField)) {
7758
+ slots.push({ kind: 'row', row: storedRow });
7759
+ continue;
7760
+ }
7761
+ if (queryName && key != null && key !== '') {
7762
+ slots.push({ kind: 'query', key });
7763
+ continue;
7764
+ }
7765
+ if (storedRow) {
7766
+ slots.push({ kind: 'row', row: storedRow });
7767
+ }
7768
+ }
7769
+ return { slots, queryName };
7770
+ }
7771
+ async function resolveSelectQueryRow(queryService, queryName, key, valueField) {
7772
+ const definition = await loadSelectQueryDefinition(queryService, queryName);
7773
+ const resolvedValueField = valueField || definition?.binding?.valueField || 'id';
7774
+ try {
7775
+ if (definition?.byKeyQuery) {
7776
+ const result = await queryService.fetch(definition.byKeyQuery, {
7777
+ [resolvedValueField]: key,
7778
+ });
7779
+ return asRow(runtimeQueryPayloadData(result));
7780
+ }
7781
+ const result = await queryService.fetch(queryName, {
7782
+ skip: 0,
7783
+ take: 1,
7784
+ filter: {
7785
+ field: resolvedValueField,
7786
+ operator: { type: 'equal' },
7787
+ value: key,
7788
+ },
7789
+ });
7790
+ const page = runtimeQueryCollectionData(result);
7791
+ return asRow(page?.items?.[0]);
7792
+ }
7793
+ catch {
7794
+ return null;
7795
+ }
7796
+ }
7797
+ function selectColumnFallbackRow(key, valueField, textField) {
7798
+ return {
7799
+ [valueField]: key,
7800
+ [textField]: key,
7801
+ };
7802
+ }
7803
+ function resolveSelectColumnFields(valueField, textField, definition) {
7804
+ return {
7805
+ valueField: valueField?.trim() || definition?.binding?.valueField || 'id',
7806
+ textField: textField?.trim() || definition?.binding?.textField || 'title',
7807
+ };
7808
+ }
7809
+ //#endregion
7810
+ //#region ----- Query definition -----
7811
+ async function loadSelectQueryDefinition(queryService, queryKey) {
7812
+ const cached = queryDefinitionCache.get(queryKey);
7813
+ if (cached) {
7814
+ return cached;
7815
+ }
7816
+ const pending = fetchSelectQueryDefinition(queryService, queryKey);
7817
+ queryDefinitionCache.set(queryKey, pending);
7818
+ try {
7819
+ return await pending;
7820
+ }
7821
+ catch {
7822
+ queryDefinitionCache.delete(queryKey);
7823
+ return null;
7824
+ }
7825
+ }
7826
+ async function fetchSelectQueryDefinition(queryService, queryKey) {
7827
+ const result = await queryService.fetch(ENTITY_GET_BY_ID_DEFAULT, {
7828
+ entity: QUERY_DEFINITION_ENTITY,
7829
+ id: queryKey,
7830
+ });
7831
+ if (!result?.success) {
7832
+ return null;
7833
+ }
7834
+ return runtimeQueryPayloadData(result) ?? null;
7835
+ }
7836
+ //#endregion
7837
+ //#region ----- Row helpers -----
7838
+ function readCatalogRows(input) {
7839
+ if (Array.isArray(input.dataSource)) {
7840
+ return input.dataSource;
7841
+ }
7842
+ if (input.localItems) {
7843
+ return input.localItems;
7844
+ }
7845
+ return null;
7846
+ }
7847
+ function readSelectKey(value, valueField) {
7848
+ if (value == null || typeof value !== 'object') {
7849
+ return value;
7850
+ }
7851
+ return value[valueField];
7852
+ }
7853
+ function findCatalogRow(rows, valueField, key) {
7854
+ for (const row of rows) {
7855
+ if (row == null || typeof row !== 'object') {
7856
+ continue;
7857
+ }
7858
+ const record = row;
7859
+ if (selectKeysEqual(record[valueField], key)) {
7860
+ return record;
7861
+ }
7862
+ }
7863
+ return undefined;
7864
+ }
7865
+ function toStoredRow(value, valueField, textField, key) {
7866
+ if (value != null && typeof value === 'object') {
7867
+ return { ...value };
7868
+ }
7869
+ if (key == null || key === '') {
7870
+ return null;
7871
+ }
7872
+ return {
7873
+ [valueField]: key,
7874
+ [textField]: key,
7875
+ };
7876
+ }
7877
+ function hasDistinctSelectLabel(row, textField, valueField) {
7878
+ const label = resolveSelectItemLabel(row, textField, valueField);
7879
+ if (label != null && typeof label === 'object') {
7880
+ return true;
7881
+ }
7882
+ const text = String(label ?? '').trim();
7883
+ if (!text) {
7884
+ return false;
7885
+ }
7886
+ return !selectKeysEqual(text, row[valueField]);
7887
+ }
7888
+ function mergeCatalogRow(stored, catalog, cssClassField, textField, valueField) {
7889
+ if (stored && hasDistinctSelectLabel(stored, textField, valueField)) {
7890
+ const cssKey = cssClassField ?? 'cssClass';
7891
+ if (stored[cssKey] == null && catalog[cssKey] != null) {
7892
+ return { ...stored, [cssKey]: catalog[cssKey] };
7893
+ }
7894
+ return stored;
7895
+ }
7896
+ return { ...catalog };
7897
+ }
7898
+ function asRow(value) {
7899
+ if (value == null || typeof value !== 'object' || Array.isArray(value)) {
7900
+ return null;
7901
+ }
7902
+ return value;
7903
+ }
7904
+ //#endregion
7905
+
7700
7906
  //#region ----- Imports -----
7701
7907
  //#endregion
7702
7908
  //#region ----- Component -----
7703
7909
  class AXPSelectBoxWidgetColumnComponent extends AXPColumnWidgetComponent {
7704
7910
  constructor() {
7705
7911
  super(...arguments);
7912
+ //#region ----- Services & Dependencies -----
7913
+ this.queryService = inject(AXPQueryService);
7914
+ this.localStore = inject(AXP_LOCAL_DATA_SOURCE_STORE, { optional: true });
7915
+ this.destroyRef = inject(DestroyRef);
7916
+ //#endregion
7706
7917
  //#region ----- Computed Properties -----
7707
- this.textField = computed(() => this.options['textField'] ?? 'title', /* @ts-ignore */
7918
+ this.activeTextField = signal(this.options['textField'] ?? 'title', /* @ts-ignore */
7919
+ ...(ngDevMode ? [{ debugName: "activeTextField" }] : /* istanbul ignore next */ []));
7920
+ this.activeValueField = signal(this.options['valueField'] ?? 'id', /* @ts-ignore */
7921
+ ...(ngDevMode ? [{ debugName: "activeValueField" }] : /* istanbul ignore next */ []));
7922
+ this.textField = computed(() => this.activeTextField(), /* @ts-ignore */
7708
7923
  ...(ngDevMode ? [{ debugName: "textField" }] : /* istanbul ignore next */ []));
7709
- this.valueField = computed(() => this.options['valueField'] ?? 'id', /* @ts-ignore */
7924
+ this.valueField = computed(() => this.activeValueField(), /* @ts-ignore */
7710
7925
  ...(ngDevMode ? [{ debugName: "valueField" }] : /* istanbul ignore next */ []));
7711
7926
  this.cssClassField = computed(() => this.options['cssClassField'], /* @ts-ignore */
7712
7927
  ...(ngDevMode ? [{ debugName: "cssClassField" }] : /* istanbul ignore next */ []));
7713
7928
  this.badgeClass = computed(() => this.options['badgeClass'], /* @ts-ignore */
7714
7929
  ...(ngDevMode ? [{ debugName: "badgeClass" }] : /* istanbul ignore next */ []));
7715
- this.dataSource = computed(() => this.options['dataSource'] ?? [], /* @ts-ignore */
7716
- ...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
7717
- this.internalValue = computed(() => castArray(this.rawValue)
7718
- .map((item) => this.extractItem(item))
7719
- .filter((item) => item != null && hasSelectItemLabel(item, this.textField(), this.valueField())), /* @ts-ignore */
7930
+ this.displayRows = signal([], /* @ts-ignore */
7931
+ ...(ngDevMode ? [{ debugName: "displayRows" }] : /* istanbul ignore next */ []));
7932
+ this.destroyed = false;
7933
+ this.internalValue = computed(() => this.displayRows().filter((item) => hasSelectItemLabel(item, this.textField(), this.valueField())), /* @ts-ignore */
7720
7934
  ...(ngDevMode ? [{ debugName: "internalValue" }] : /* istanbul ignore next */ []));
7721
7935
  }
7722
7936
  //#endregion
7937
+ //#region ----- Lifecycle -----
7938
+ ngOnInit() {
7939
+ this.destroyRef.onDestroy(() => {
7940
+ this.destroyed = true;
7941
+ });
7942
+ void this.loadRows();
7943
+ }
7944
+ //#endregion
7723
7945
  //#region ----- Rendering Helpers -----
7724
7946
  resolveBadgeClasses(item) {
7725
7947
  const row = item;
@@ -7732,37 +7954,56 @@ class AXPSelectBoxWidgetColumnComponent extends AXPColumnWidgetComponent {
7732
7954
  return resolveSelectItemLabel(item, this.textField(), this.valueField());
7733
7955
  }
7734
7956
  //#endregion
7735
- //#region ----- Private Helpers -----
7736
- extractItem(item) {
7737
- if (isBlankSelectRawValue(item)) {
7738
- return null;
7957
+ //#region ----- Data Loading -----
7958
+ async loadRows() {
7959
+ const dataSource = this.options['dataSource'];
7960
+ const queryName = readSelectQueryKey(dataSource);
7961
+ const definition = queryName ? await loadSelectQueryDefinition(this.queryService, queryName) : null;
7962
+ if (this.destroyed) {
7963
+ return;
7739
7964
  }
7740
- const valueField = this.valueField();
7741
- const textField = this.textField();
7742
- const cssClassField = this.cssClassField();
7743
- const dataSource = this.dataSource();
7744
- const isDataSourceObjects = Array.isArray(dataSource) && dataSource.length > 0 && typeof dataSource[0] === 'object';
7745
- if (typeof item !== 'object') {
7746
- if (isDataSourceObjects) {
7747
- const foundItem = dataSource.find((ds) => ds[valueField] === item);
7748
- if (foundItem) {
7749
- return { ...foundItem };
7750
- }
7751
- }
7752
- return {
7753
- [valueField]: item,
7754
- [textField]: item,
7755
- };
7965
+ const fields = resolveSelectColumnFields(typeof this.options['valueField'] === 'string' ? this.options['valueField'] : undefined, typeof this.options['textField'] === 'string' ? this.options['textField'] : undefined, definition);
7966
+ const planned = planSelectColumnSlots({
7967
+ rawValue: this.rawValue,
7968
+ dataSource,
7969
+ valueField: fields.valueField,
7970
+ textField: fields.textField,
7971
+ cssClassField: this.cssClassField(),
7972
+ localItems: this.readLocalItems(dataSource),
7973
+ });
7974
+ this.activeValueField.set(fields.valueField);
7975
+ this.activeTextField.set(fields.textField);
7976
+ if (planned.slots.every((slot) => slot.kind === 'row')) {
7977
+ this.displayRows.set(planned.slots.flatMap((slot) => (slot.kind === 'row' ? [slot.row] : [])));
7978
+ return;
7756
7979
  }
7757
- const row = item;
7758
- if (!readSelectItemCssClass(row, cssClassField) && isDataSourceObjects && row[valueField] != null) {
7759
- const foundItem = dataSource.find((ds) => ds[valueField] === row[valueField]);
7760
- const cssKey = cssClassField ?? 'cssClass';
7761
- if (foundItem?.[cssKey]) {
7762
- return { ...row, [cssKey]: foundItem[cssKey] };
7980
+ const rows = await this.resolveSlots(planned.slots, planned.queryName, fields.valueField, fields.textField);
7981
+ if (!this.destroyed) {
7982
+ this.displayRows.set(rows);
7983
+ }
7984
+ }
7985
+ async resolveSlots(slots, queryName, valueField, textField) {
7986
+ const resolved = await Promise.all(slots.map(async (slot) => {
7987
+ if (slot.kind === 'row') {
7988
+ return slot.row;
7763
7989
  }
7990
+ if (!queryName) {
7991
+ return selectColumnFallbackRow(slot.key, valueField, textField);
7992
+ }
7993
+ const row = await resolveSelectQueryRow(this.queryService, queryName, slot.key, valueField);
7994
+ return row ?? selectColumnFallbackRow(slot.key, valueField, textField);
7995
+ }));
7996
+ return resolved;
7997
+ }
7998
+ readLocalItems(dataSource) {
7999
+ if (!isLocalDataSourceRef(dataSource)) {
8000
+ return null;
7764
8001
  }
7765
- return { ...row };
8002
+ const id = parseLocalDataSourceId(dataSource);
8003
+ if (!id) {
8004
+ return [];
8005
+ }
8006
+ return this.localStore?.get(id)?.items ?? [];
7766
8007
  }
7767
8008
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPSelectBoxWidgetColumnComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
7768
8009
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPSelectBoxWidgetColumnComponent, isStandalone: true, selector: "axp-select-box-widget-column", inputs: { rawValue: "rawValue", rowData: "rowData" }, host: { classAttribute: "block min-w-0 w-full max-w-full" }, usesInheritance: true, ngImport: i0, template: ` <div class="flex min-w-0 max-w-full gap-2 overflow-hidden">
@@ -7968,6 +8209,8 @@ class AXPSelectBoxWidgetEditComponent extends AXPDataListWidgetComponent {
7968
8209
  /**
7969
8210
  * True when a cascade/parent filter is configured but required values are still empty
7970
8211
  * (e.g. state select before country is chosen).
8212
+ * `not-in` / `nin` are not cascade — treating them as pending disables the control
8213
+ * (not-allowed cursor, empty list). Hide already-picked options with `excludeIds`, not `filter`.
7971
8214
  */
7972
8215
  this.hasPendingCascadeFilter = computed(() => {
7973
8216
  if (this.filterMode()) {
@@ -7977,6 +8220,10 @@ class AXPSelectBoxWidgetEditComponent extends AXPDataListWidgetComponent {
7977
8220
  if (!rawFilter) {
7978
8221
  return false;
7979
8222
  }
8223
+ const operatorType = String(rawFilter.operator?.type ?? '').toLowerCase();
8224
+ if (operatorType === 'not-in' || operatorType === 'nin') {
8225
+ return false;
8226
+ }
7980
8227
  return AXPCleanNestedFilters([rawFilter]).length === 0;
7981
8228
  }, /* @ts-ignore */
7982
8229
  ...(ngDevMode ? [{ debugName: "hasPendingCascadeFilter" }] : /* istanbul ignore next */ []));
@@ -8032,7 +8279,9 @@ class AXPSelectBoxWidgetEditComponent extends AXPDataListWidgetComponent {
8032
8279
  this.valueField();
8033
8280
  this.textField();
8034
8281
  this.hasPendingCascadeFilter();
8282
+ this.filter();
8035
8283
  this.options()['dataSource'];
8284
+ this.options()['excludeIds'];
8036
8285
  if (!this.isArraySource()) {
8037
8286
  return;
8038
8287
  }
@@ -8308,7 +8557,9 @@ class AXPSelectBoxWidgetEditComponent extends AXPDataListWidgetComponent {
8308
8557
  //#region ----- Data Loading -----
8309
8558
  remapComboItems() {
8310
8559
  const raw = this.options()['dataSource'];
8311
- const rows = this.hasPendingCascadeFilter() ? [] : Array.isArray(raw) ? raw : [];
8560
+ const rows = this.hasPendingCascadeFilter()
8561
+ ? []
8562
+ : this.excludeOptionRows(this.applyArrayWidgetFilter(Array.isArray(raw) ? raw : []));
8312
8563
  const locale = this.translationService.getActiveLang();
8313
8564
  const items = mapRowsToComboBoxItems(rows, this.valueField(), this.textField(), locale);
8314
8565
  this.comboItems.set(items.map((item) => ({
@@ -8316,6 +8567,54 @@ class AXPSelectBoxWidgetEditComponent extends AXPDataListWidgetComponent {
8316
8567
  text: this.translationService.translateSync(item.text),
8317
8568
  })));
8318
8569
  }
8570
+ /**
8571
+ * Drop ids in `excludeIds` except this widget's current value so the selected item stays visible.
8572
+ * Do not filter out the current row's own id — the dropdown would go empty after pick.
8573
+ */
8574
+ excludeOptionRows(rows) {
8575
+ const rawExclude = this.options()['excludeIds'];
8576
+ if (rawExclude == null || rawExclude === false) {
8577
+ return rows;
8578
+ }
8579
+ const currentId = String(extractValue(this.getValue(), this.valueField()) ?? '').trim();
8580
+ const taken = new Set(castArray(rawExclude)
8581
+ .map((value) => extractValue(value, this.valueField()) ?? value)
8582
+ .map((value) => String(value ?? '').trim())
8583
+ .filter(Boolean));
8584
+ if (taken.size === 0) {
8585
+ return rows;
8586
+ }
8587
+ return rows.filter((row) => {
8588
+ const rec = unwrapSelectRow(row);
8589
+ const id = rec ? String(extractValue(rec, this.valueField()) ?? '').trim() : '';
8590
+ return !!id && (id === currentId || !taken.has(id));
8591
+ });
8592
+ }
8593
+ applyArrayWidgetFilter(rows) {
8594
+ if (rows.length === 0) {
8595
+ return rows;
8596
+ }
8597
+ const widgetFilter = this.resolveActiveWidgetFilter();
8598
+ if (!widgetFilter) {
8599
+ return rows;
8600
+ }
8601
+ const operatorType = String(widgetFilter.operator?.type ?? '').toLowerCase();
8602
+ if (operatorType === 'not-in' || operatorType === 'nin') {
8603
+ const taken = new Set(castArray(widgetFilter.value)
8604
+ .map((value) => extractValue(value, this.valueField()) ?? value)
8605
+ .map((value) => String(value ?? '').trim())
8606
+ .filter(Boolean));
8607
+ if (taken.size === 0) {
8608
+ return rows;
8609
+ }
8610
+ return rows.filter((row) => {
8611
+ const rec = unwrapSelectRow(row);
8612
+ const id = rec ? String(extractValue(rec, this.valueField()) ?? '').trim() : '';
8613
+ return !!id && !taken.has(id);
8614
+ });
8615
+ }
8616
+ return applyFilterArray(rows, [widgetFilter], widgetFilter.logic ?? 'and');
8617
+ }
8319
8618
  /**
8320
8619
  * Patches lookup `load` so widget/cascade filters are AND-ed with lookup search,
8321
8620
  * and so a pending cascade parent returns an empty page.
@@ -19211,6 +19510,8 @@ class AXPRepeaterWidgetEditComponent extends AXPValueWidgetComponent {
19211
19510
  ...(ngDevMode ? [{ debugName: "hasControls" }] : /* istanbul ignore next */ []));
19212
19511
  this.allowReorder = computed(() => (this.options()['allowReorder'] ?? false), /* @ts-ignore */
19213
19512
  ...(ngDevMode ? [{ debugName: "allowReorder" }] : /* istanbul ignore next */ []));
19513
+ this.inlineAddControl = computed(() => (this.options()['inlineAddControl'] ?? false), /* @ts-ignore */
19514
+ ...(ngDevMode ? [{ debugName: "inlineAddControl" }] : /* istanbul ignore next */ []));
19214
19515
  this.rows = computed(() => {
19215
19516
  return this.convertValueToArray() ?? [];
19216
19517
  }, /* @ts-ignore */
@@ -19261,6 +19562,7 @@ class AXPRepeaterWidgetEditComponent extends AXPValueWidgetComponent {
19261
19562
  [disabled]="disabled()"
19262
19563
  [hasControls]="hasControls()"
19263
19564
  [allowReorder]="allowReorder()"
19565
+ [inlineAddControl]="inlineAddControl()"
19264
19566
  (addClick)="handleAddItemClick()"
19265
19567
  (removeClick)="handleRemoveItemClick($event)"
19266
19568
  (drop)="onDrop($event)"
@@ -19277,7 +19579,7 @@ class AXPRepeaterWidgetEditComponent extends AXPValueWidgetComponent {
19277
19579
  ></ng-container>
19278
19580
  }
19279
19581
  </ng-template>
19280
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: i1$4.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "component", type: AXPRepeaterRowsLayoutComponent, selector: "axp-repeater-rows-layout", inputs: ["count", "disabled", "hasControls", "allowReorder", "rowTemplate", "addItemLabelKey", "emptyTitleKey", "emptyDescriptionKey", "addFirstItemLabelKey"], outputs: ["addClick", "removeClick", "drop"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
19582
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: i1$4.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "component", type: AXPRepeaterRowsLayoutComponent, selector: "axp-repeater-rows-layout", inputs: ["count", "disabled", "hasControls", "allowReorder", "inlineAddControl", "rowTemplate", "addItemLabelKey", "emptyTitleKey", "emptyDescriptionKey", "addFirstItemLabelKey"], outputs: ["addClick", "removeClick", "drop"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
19281
19583
  }
19282
19584
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPRepeaterWidgetEditComponent, decorators: [{
19283
19585
  type: Component,
@@ -19293,6 +19595,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
19293
19595
  [disabled]="disabled()"
19294
19596
  [hasControls]="hasControls()"
19295
19597
  [allowReorder]="allowReorder()"
19598
+ [inlineAddControl]="inlineAddControl()"
19296
19599
  (addClick)="handleAddItemClick()"
19297
19600
  (removeClick)="handleRemoveItemClick($event)"
19298
19601
  (drop)="onDrop($event)"
@@ -19398,6 +19701,13 @@ const AXPRepeaterWidget = {
19398
19701
  defaultValue: false,
19399
19702
  path: 'options.allowReorder',
19400
19703
  }),
19704
+ createBooleanProperty({
19705
+ name: 'inlineAddControl',
19706
+ title: 'Inline Add Control',
19707
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
19708
+ defaultValue: false,
19709
+ path: 'options.inlineAddControl',
19710
+ }),
19401
19711
  ],
19402
19712
  components: {
19403
19713
  view: {
@@ -19410,7 +19720,7 @@ const AXPRepeaterWidget = {
19410
19720
  component: () => Promise.resolve().then(function () { return repeaterWidgetDesigner_component; }).then((c) => c.AXPRepeaterWidgetDesignerComponent),
19411
19721
  },
19412
19722
  column: {
19413
- component: () => import('./acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-Dzqn3rGa.mjs').then((c) => c.AXPRepeaterWidgetColumnComponent),
19723
+ component: () => import('./acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-BDlo6nTx.mjs').then((c) => c.AXPRepeaterWidgetColumnComponent),
19414
19724
  },
19415
19725
  },
19416
19726
  };
@@ -23164,7 +23474,7 @@ class AXPDataSourceOptionsWidgetEditComponent extends AXPValueWidgetComponent {
23164
23474
  //#region ----- Lifecycle -----
23165
23475
  #init;
23166
23476
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDataSourceOptionsWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
23167
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPDataSourceOptionsWidgetEditComponent, isStandalone: true, selector: "axp-data-source-options-widget-editor", usesInheritance: true, ngImport: i0, template: "<div class=\"axp-data-source-options flex flex-col gap-3 py-2\">\n <!-- ----- Mode: exists or list ----- -->\n <div class=\"flex flex-col gap-2\">\n <span class=\"font-medium text-sm\">{{ I18N.source | translate | async }}</span>\n <ax-selection-list [items]=\"modeItems()\" [ngModel]=\"dataSourceMode()\"\n (onValueChanged)=\"setDataSourceMode($event.value)\" direction=\"horizontal\" [multiple]=\"false\" [showControl]=\"true\"\n valueField=\"value\" textField=\"text\" />\n </div>\n\n <!-- ----- Select registered query (only when mode is exists) ----- -->\n @if (dataSourceMode() === 'exists') {\n <div class=\"flex flex-col gap-2\">\n <span class=\"font-medium text-sm\">{{ I18N.dataSource | translate | async }}</span>\n <ax-lookup mode=\"drop-down-list\" [dataSource]=\"queriesDataSource\" [ngModel]=\"getValue()['dataSource']\"\n (onValueChanged)=\"onQueryChange($event)\" valueField=\"name\" textField=\"title\"\n [searchable]=\"true\"\n [placeholder]=\"(I18N.dataSourcePlaceholder | translate | async) ?? ''\">\n <ax-clear-button></ax-clear-button>\n </ax-lookup>\n </div>\n }\n\n <!-- ----- Form-local named list (designer store) ----- -->\n @if (dataSourceMode() === 'local') {\n <div class=\"flex flex-col gap-2\">\n <span class=\"font-medium text-sm\">{{ I18N.dataSource | translate | async }}</span>\n <div class=\"flex items-center gap-2\">\n <ax-lookup\n class=\"flex-1\"\n mode=\"drop-down-list\"\n [dataSource]=\"localSourcesDataSource()\"\n [ngModel]=\"selectedLocalId()\"\n (onValueChanged)=\"onLocalSourceChange($event)\"\n valueField=\"id\"\n textField=\"name\"\n [searchable]=\"true\"\n [placeholder]=\"(I18N.localPlaceholder | translate | async) ?? ''\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-lookup>\n <ax-button\n look=\"blank\"\n class=\"ax-sm\"\n [title]=\"(I18N.addLocal | translate | async) ?? ''\"\n (onClick)=\"handleCreateLocal()\"\n >\n <ax-icon class=\"fa-light fa-plus\"></ax-icon>\n </ax-button>\n <!--->\n <!-- ----- Edit the selected local list ----- -->\n @if (selectedLocalId()) {\n <ax-button\n look=\"blank\"\n class=\"ax-sm\"\n [title]=\"(I18N.editLocal | translate | async) ?? ''\"\n (onClick)=\"handleEditLocal()\"\n >\n <ax-icon class=\"fa-light fa-pen\"></ax-icon>\n </ax-button>\n }\n </div>\n </div>\n }\n\n <!-- ----- Simple list (text rows) when no local store ----- -->\n @if (dataSourceMode() === 'list') {\n <div class=\"flex flex-col gap-2\">\n <span class=\"font-medium text-sm\">{{ I18N.listItems | translate | async }}</span>\n <axp-repeater-rows-layout\n [count]=\"listEntries().length\"\n [rowTemplate]=\"listRowTpl\"\n [hasControls]=\"true\"\n [allowReorder]=\"true\"\n [addItemLabelKey]=\"I18N.addListItem\"\n (addClick)=\"addListEntry()\"\n (removeClick)=\"removeListEntry($event)\"\n (drop)=\"onListDrop($event)\"\n ></axp-repeater-rows-layout>\n <ng-template #listRowTpl let-index=\"index\">\n <ax-text-box\n class=\"w-full\"\n [ngModel]=\"listEntries()[index]\"\n (onValueChanged)=\"onListEntryChange(index, $event)\"\n />\n </ng-template>\n </div>\n }\n\n <!-- ----- valueField / textField (exists only) ----- -->\n @if (fieldSelectsKey() && (dataSourceMode() === 'exists' || dataSourceMode() === 'local')) {\n <div class=\"flex flex-col gap-2\">\n <span class=\"font-medium text-sm\">{{ I18N.valueField | translate | async }}</span>\n <ax-lookup mode=\"drop-down-list\" [dataSource]=\"valueFieldDataSource()\" [ngModel]=\"getValue()['valueField']\"\n (onValueChanged)=\"onValueFieldChange($event)\" valueField=\"value\" textField=\"text\"\n [searchable]=\"false\"\n [disabled]=\"valueTextFieldDisabled()\"\n [placeholder]=\"((valueTextFieldDisabled() ? I18N.valueFieldPlaceholderDisabled : I18N.valueFieldPlaceholder) | translate | async) ?? ''\">\n <ax-clear-button></ax-clear-button>\n </ax-lookup>\n </div>\n\n <!-- ----- textField select ----- -->\n <div class=\"flex flex-col gap-2\">\n <span class=\"font-medium text-sm\">{{ I18N.textField | translate | async }}</span>\n <ax-lookup mode=\"drop-down-list\" [dataSource]=\"textFieldDataSource()\" [ngModel]=\"getValue()['textField']\"\n (onValueChanged)=\"onTextFieldChange($event)\" valueField=\"value\" textField=\"text\"\n [searchable]=\"false\"\n [disabled]=\"valueTextFieldDisabled()\"\n [placeholder]=\"((valueTextFieldDisabled() ? I18N.textFieldPlaceholderDisabled : I18N.textFieldPlaceholder) | translate | async) ?? ''\">\n <ax-clear-button></ax-clear-button>\n </ax-lookup>\n </div>\n }\n</div>\n", styles: [".axp-data-source-options{min-width:0px}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: AXLookupComponent, selector: "ax-lookup", inputs: ["name", "mode", "dataSource", "treeDataSource", "valueField", "textField", "disabledField", "columns", "treeParentField", "hasChildrenField", "searchable", "adaptivityEnabled", "caption", "alternate", "searchPlaceholder", "placeholder", "disabled", "readonly", "look", "itemHeight", "maxVisibleItems", "treeSelectionBehavior", "highlightSearch", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXSelectionListModule }, { kind: "component", type: i2$4.AXSelectionListComponent, selector: "ax-selection-list", inputs: ["id", "name", "disabled", "readonly", "tabIndex", "value", "valueField", "textField", "disabledField", "readonlyField", "multiple", "direction", "customTemplate", "showControl", "items", "look"], outputs: ["onValueChanged", "onBlur", "onFocus"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i1$8.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "component", type: AXPRepeaterRowsLayoutComponent, selector: "axp-repeater-rows-layout", inputs: ["count", "disabled", "hasControls", "allowReorder", "rowTemplate", "addItemLabelKey", "emptyTitleKey", "emptyDescriptionKey", "addFirstItemLabelKey"], outputs: ["addClick", "removeClick", "drop"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: i1$6.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23477
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPDataSourceOptionsWidgetEditComponent, isStandalone: true, selector: "axp-data-source-options-widget-editor", usesInheritance: true, ngImport: i0, template: "<div class=\"axp-data-source-options flex flex-col gap-3 py-2\">\n <!-- ----- Mode: exists or list ----- -->\n <div class=\"flex flex-col gap-2\">\n <span class=\"font-medium text-sm\">{{ I18N.source | translate | async }}</span>\n <ax-selection-list [items]=\"modeItems()\" [ngModel]=\"dataSourceMode()\"\n (onValueChanged)=\"setDataSourceMode($event.value)\" direction=\"horizontal\" [multiple]=\"false\" [showControl]=\"true\"\n valueField=\"value\" textField=\"text\" />\n </div>\n\n <!-- ----- Select registered query (only when mode is exists) ----- -->\n @if (dataSourceMode() === 'exists') {\n <div class=\"flex flex-col gap-2\">\n <span class=\"font-medium text-sm\">{{ I18N.dataSource | translate | async }}</span>\n <ax-lookup mode=\"drop-down-list\" [dataSource]=\"queriesDataSource\" [ngModel]=\"getValue()['dataSource']\"\n (onValueChanged)=\"onQueryChange($event)\" valueField=\"name\" textField=\"title\"\n [searchable]=\"true\"\n [placeholder]=\"(I18N.dataSourcePlaceholder | translate | async) ?? ''\">\n <ax-clear-button></ax-clear-button>\n </ax-lookup>\n </div>\n }\n\n <!-- ----- Form-local named list (designer store) ----- -->\n @if (dataSourceMode() === 'local') {\n <div class=\"flex flex-col gap-2\">\n <span class=\"font-medium text-sm\">{{ I18N.dataSource | translate | async }}</span>\n <div class=\"flex items-center gap-2\">\n <ax-lookup\n class=\"flex-1\"\n mode=\"drop-down-list\"\n [dataSource]=\"localSourcesDataSource()\"\n [ngModel]=\"selectedLocalId()\"\n (onValueChanged)=\"onLocalSourceChange($event)\"\n valueField=\"id\"\n textField=\"name\"\n [searchable]=\"true\"\n [placeholder]=\"(I18N.localPlaceholder | translate | async) ?? ''\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-lookup>\n <ax-button\n look=\"blank\"\n class=\"ax-sm\"\n [title]=\"(I18N.addLocal | translate | async) ?? ''\"\n (onClick)=\"handleCreateLocal()\"\n >\n <ax-icon class=\"fa-light fa-plus\"></ax-icon>\n </ax-button>\n <!--->\n <!-- ----- Edit the selected local list ----- -->\n @if (selectedLocalId()) {\n <ax-button\n look=\"blank\"\n class=\"ax-sm\"\n [title]=\"(I18N.editLocal | translate | async) ?? ''\"\n (onClick)=\"handleEditLocal()\"\n >\n <ax-icon class=\"fa-light fa-pen\"></ax-icon>\n </ax-button>\n }\n </div>\n </div>\n }\n\n <!-- ----- Simple list (text rows) when no local store ----- -->\n @if (dataSourceMode() === 'list') {\n <div class=\"flex flex-col gap-2\">\n <span class=\"font-medium text-sm\">{{ I18N.listItems | translate | async }}</span>\n <axp-repeater-rows-layout\n [count]=\"listEntries().length\"\n [rowTemplate]=\"listRowTpl\"\n [hasControls]=\"true\"\n [allowReorder]=\"true\"\n [addItemLabelKey]=\"I18N.addListItem\"\n (addClick)=\"addListEntry()\"\n (removeClick)=\"removeListEntry($event)\"\n (drop)=\"onListDrop($event)\"\n ></axp-repeater-rows-layout>\n <ng-template #listRowTpl let-index=\"index\">\n <ax-text-box\n class=\"w-full\"\n [ngModel]=\"listEntries()[index]\"\n (onValueChanged)=\"onListEntryChange(index, $event)\"\n />\n </ng-template>\n </div>\n }\n\n <!-- ----- valueField / textField (exists only) ----- -->\n @if (fieldSelectsKey() && (dataSourceMode() === 'exists' || dataSourceMode() === 'local')) {\n <div class=\"flex flex-col gap-2\">\n <span class=\"font-medium text-sm\">{{ I18N.valueField | translate | async }}</span>\n <ax-lookup mode=\"drop-down-list\" [dataSource]=\"valueFieldDataSource()\" [ngModel]=\"getValue()['valueField']\"\n (onValueChanged)=\"onValueFieldChange($event)\" valueField=\"value\" textField=\"text\"\n [searchable]=\"false\"\n [disabled]=\"valueTextFieldDisabled()\"\n [placeholder]=\"((valueTextFieldDisabled() ? I18N.valueFieldPlaceholderDisabled : I18N.valueFieldPlaceholder) | translate | async) ?? ''\">\n <ax-clear-button></ax-clear-button>\n </ax-lookup>\n </div>\n\n <!-- ----- textField select ----- -->\n <div class=\"flex flex-col gap-2\">\n <span class=\"font-medium text-sm\">{{ I18N.textField | translate | async }}</span>\n <ax-lookup mode=\"drop-down-list\" [dataSource]=\"textFieldDataSource()\" [ngModel]=\"getValue()['textField']\"\n (onValueChanged)=\"onTextFieldChange($event)\" valueField=\"value\" textField=\"text\"\n [searchable]=\"false\"\n [disabled]=\"valueTextFieldDisabled()\"\n [placeholder]=\"((valueTextFieldDisabled() ? I18N.textFieldPlaceholderDisabled : I18N.textFieldPlaceholder) | translate | async) ?? ''\">\n <ax-clear-button></ax-clear-button>\n </ax-lookup>\n </div>\n }\n</div>\n", styles: [".axp-data-source-options{min-width:0px}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: AXLookupComponent, selector: "ax-lookup", inputs: ["name", "mode", "dataSource", "treeDataSource", "valueField", "textField", "disabledField", "columns", "treeParentField", "hasChildrenField", "searchable", "adaptivityEnabled", "caption", "alternate", "searchPlaceholder", "placeholder", "disabled", "readonly", "look", "itemHeight", "maxVisibleItems", "treeSelectionBehavior", "highlightSearch", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXSelectionListModule }, { kind: "component", type: i2$4.AXSelectionListComponent, selector: "ax-selection-list", inputs: ["id", "name", "disabled", "readonly", "tabIndex", "value", "valueField", "textField", "disabledField", "readonlyField", "multiple", "direction", "customTemplate", "showControl", "items", "look"], outputs: ["onValueChanged", "onBlur", "onFocus"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i1$8.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "component", type: AXPRepeaterRowsLayoutComponent, selector: "axp-repeater-rows-layout", inputs: ["count", "disabled", "hasControls", "allowReorder", "inlineAddControl", "rowTemplate", "addItemLabelKey", "emptyTitleKey", "emptyDescriptionKey", "addFirstItemLabelKey"], outputs: ["addClick", "removeClick", "drop"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: i1$6.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23168
23478
  }
23169
23479
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDataSourceOptionsWidgetEditComponent, decorators: [{
23170
23480
  type: Component,
@@ -28106,43 +28416,108 @@ var metaDataWidgetColumn_component = /*#__PURE__*/Object.freeze({
28106
28416
  AXPMetaDataWidgetColumnComponent: AXPMetaDataWidgetColumnComponent
28107
28417
  });
28108
28418
 
28419
+ //#endregion
28420
+ //#region ----- Constants -----
28421
+ const DEFAULT_COLUMNS = 2;
28422
+ /** Same 12-column track as entity master forms (Street/Post Code use col-span-6 here). */
28423
+ const ENTITY_GRID_COLUMNS = 12;
28424
+ const ENTITY_GRID_GAP = '20px';
28425
+ //#endregion
28426
+ //#region ----- Component -----
28109
28427
  class AXPMetaDataWidgetEditComponent extends AXPValueWidgetComponent {
28110
28428
  constructor() {
28111
28429
  super(...arguments);
28430
+ //#region ----- Services & Dependencies -----
28431
+ this.translationService = inject(AXTranslationService);
28432
+ //#endregion
28433
+ //#region ----- Computed Properties -----
28112
28434
  this.listMeta = computed(() => this.options()['listMeta'] ?? [], { ...(ngDevMode ? { debugName: "listMeta" } : /* istanbul ignore next */ {}), equal: isEqual });
28113
- this.#effect = effect(async () => {
28114
- const data = this.listMeta().map((c) => {
28115
- const node = JSON.parse(c.interface);
28116
- //TODO change this to get the root node
28117
- const root = node.children?.[0].children?.[0];
28118
- return {
28119
- title: c.title,
28120
- node: root,
28121
- };
28122
- });
28123
- this.items.set(data);
28435
+ /**
28436
+ * Match entity section grid: 12 tracks + form-field `colSpan` (default form-field is
28437
+ * col-span-12, which forced one field per row inside a 2-track fieldset).
28438
+ */
28439
+ this.layoutNode = computed(() => {
28440
+ const items = this.items();
28441
+ if (!items.length) {
28442
+ return null;
28443
+ }
28444
+ const columns = this.resolveColumns();
28445
+ const colSpan = Math.max(1, Math.floor(ENTITY_GRID_COLUMNS / columns));
28446
+ return {
28447
+ type: AXPWidgetsList.Layouts.GridLayout,
28448
+ mode: 'edit',
28449
+ options: {
28450
+ grid: {
28451
+ default: {
28452
+ columns: ENTITY_GRID_COLUMNS,
28453
+ gap: ENTITY_GRID_GAP,
28454
+ },
28455
+ },
28456
+ },
28457
+ children: items.map((item) => ({
28458
+ type: AXPWidgetsList.Layouts.FormField,
28459
+ mode: 'edit',
28460
+ options: {
28461
+ label: item.title,
28462
+ showLabel: true,
28463
+ colSpan,
28464
+ },
28465
+ children: [item.node],
28466
+ })),
28467
+ };
28124
28468
  }, /* @ts-ignore */
28125
- ...(ngDevMode ? [{ debugName: "#effect" }] : /* istanbul ignore next */ []));
28469
+ ...(ngDevMode ? [{ debugName: "layoutNode" }] : /* istanbul ignore next */ []));
28470
+ //#endregion
28471
+ //#region ----- State Signals -----
28126
28472
  this.items = signal([], /* @ts-ignore */
28127
28473
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
28474
+ //#endregion
28475
+ //#region ----- Lifecycle -----
28476
+ this.#effect = effect(() => {
28477
+ const metas = this.listMeta();
28478
+ void (async () => {
28479
+ const data = await Promise.all(metas.map(async (c) => {
28480
+ const node = JSON.parse(c.interface);
28481
+ //TODO change this to get the root node
28482
+ const root = node.children?.[0].children?.[0];
28483
+ const rawTitle = String(c.title ?? '');
28484
+ const title = rawTitle
28485
+ ? await this.translationService.translateAsync(rawTitle)
28486
+ : '';
28487
+ return {
28488
+ title: title || rawTitle,
28489
+ node: root,
28490
+ };
28491
+ }));
28492
+ this.items.set(data);
28493
+ })();
28494
+ }, /* @ts-ignore */
28495
+ ...(ngDevMode ? [{ debugName: "#effect" }] : /* istanbul ignore next */ []));
28128
28496
  }
28497
+ //#endregion
28498
+ //#region ----- Lifecycle -----
28129
28499
  #effect;
28500
+ //#endregion
28501
+ //#region ----- Event Handlers -----
28130
28502
  handleContextChange(e) {
28131
28503
  this.setValue(e.data);
28132
28504
  }
28505
+ //#endregion
28506
+ //#region ----- Private Helpers -----
28507
+ resolveColumns() {
28508
+ const options = this.options();
28509
+ const raw = options['columns'] ?? options['cols'] ?? DEFAULT_COLUMNS;
28510
+ const columns = Number(raw);
28511
+ return Number.isFinite(columns) && columns > 0 ? columns : DEFAULT_COLUMNS;
28512
+ }
28133
28513
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPMetaDataWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
28134
28514
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPMetaDataWidgetEditComponent, isStandalone: true, selector: "axp-meta-data-widget-edit", usesInheritance: true, ngImport: i0, template: `
28135
28515
  <axp-widgets-container [context]="getValue() ?? {}" (onContextChanged)="handleContextChange($event)">
28136
- <div class="flex flex-col">
28137
- @for (item of items(); track $index) {
28138
- <ax-form-field>
28139
- <ax-label>{{ item.title }}</ax-label>
28140
- <ng-container axp-widget-renderer [node]="item.node" [mode]="'edit'"> </ng-container>
28141
- </ax-form-field>
28142
- }
28143
- </div>
28516
+ @if (layoutNode(); as node) {
28517
+ <ng-container axp-widget-renderer [node]="node" [mode]="'edit'"></ng-container>
28518
+ }
28144
28519
  </axp-widgets-container>
28145
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i1$4.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i1$4.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28520
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i1$4.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i1$4.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "ngmodule", type: AXFormModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28146
28521
  }
28147
28522
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPMetaDataWidgetEditComponent, decorators: [{
28148
28523
  type: Component,
@@ -28150,18 +28525,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
28150
28525
  selector: 'axp-meta-data-widget-edit',
28151
28526
  template: `
28152
28527
  <axp-widgets-container [context]="getValue() ?? {}" (onContextChanged)="handleContextChange($event)">
28153
- <div class="flex flex-col">
28154
- @for (item of items(); track $index) {
28155
- <ax-form-field>
28156
- <ax-label>{{ item.title }}</ax-label>
28157
- <ng-container axp-widget-renderer [node]="item.node" [mode]="'edit'"> </ng-container>
28158
- </ax-form-field>
28159
- }
28160
- </div>
28528
+ @if (layoutNode(); as node) {
28529
+ <ng-container axp-widget-renderer [node]="node" [mode]="'edit'"></ng-container>
28530
+ }
28161
28531
  </axp-widgets-container>
28162
28532
  `,
28163
28533
  changeDetection: ChangeDetectionStrategy.OnPush,
28164
- imports: [AXDecoratorModule, AXPWidgetCoreModule, AXFormModule, AXLabelModule],
28534
+ imports: [AXDecoratorModule, AXPWidgetCoreModule, AXFormModule],
28165
28535
  }]
28166
28536
  }] });
28167
28537
 
@@ -29141,52 +29511,102 @@ const AXPBooleanFilterWidget = {
29141
29511
  },
29142
29512
  };
29143
29513
 
29514
+ //#endregion
29515
+ //#region ----- Helpers -----
29516
+ /**
29517
+ * `"false" == false` is false in JavaScript, so a boolean and its string form must both match.
29518
+ * Lookup `byKey` receives the raw boolean; a one-sided `toString()` comparison never hits.
29519
+ */
29520
+ function matchesBooleanFilterValue(itemValue, id) {
29521
+ return itemValue === id || String(itemValue) === String(id);
29522
+ }
29523
+ function readLabelOverride(value) {
29524
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
29525
+ }
29526
+ //#endregion
29527
+ //#region ----- Component -----
29144
29528
  class AXPBooleanFilterWidgetEditComponent extends AXPValueWidgetComponent {
29145
29529
  constructor() {
29146
29530
  super(...arguments);
29531
+ //#region ----- Services & Dependencies -----
29532
+ this.translateService = inject(AXTranslationService);
29533
+ //#endregion
29534
+ //#region ----- View Children -----
29147
29535
  this.lookup = viewChild('lookup', /* @ts-ignore */
29148
29536
  ...(ngDevMode ? [{ debugName: "lookup" }] : /* istanbul ignore next */ []));
29537
+ //#endregion
29538
+ //#region ----- Computed Properties -----
29149
29539
  this.operation = computed(() => this.getValue()?.operation || AXP_BOOLEAN_FILTER_DEFAULT_OPERATOR, /* @ts-ignore */
29150
29540
  ...(ngDevMode ? [{ debugName: "operation" }] : /* istanbul ignore next */ []));
29151
29541
  this.value = computed(() => this.getValue()?.value, /* @ts-ignore */
29152
29542
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
29153
- this.trulyText = computed(() => this.options()['trulyText'], /* @ts-ignore */
29543
+ this.trulyText = computed(() => readLabelOverride(this.options()['trulyText']), /* @ts-ignore */
29154
29544
  ...(ngDevMode ? [{ debugName: "trulyText" }] : /* istanbul ignore next */ []));
29155
- this.falsyText = computed(() => this.options()['falsyText'], /* @ts-ignore */
29545
+ this.falsyText = computed(() => readLabelOverride(this.options()['falsyText']), /* @ts-ignore */
29156
29546
  ...(ngDevMode ? [{ debugName: "falsyText" }] : /* istanbul ignore next */ []));
29157
29547
  this.negative = computed(() => this.options()['negative'], /* @ts-ignore */
29158
29548
  ...(ngDevMode ? [{ debugName: "negative" }] : /* istanbul ignore next */ []));
29159
- this.translateService = inject(AXTranslationService);
29160
- this.items = [];
29549
+ //#endregion
29550
+ //#region ----- State Signals -----
29551
+ this.items = signal([], /* @ts-ignore */
29552
+ ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
29553
+ //#endregion
29554
+ //#region ----- Data Source -----
29161
29555
  this.dataSource = new AXDataSource({
29162
29556
  load: () => {
29557
+ const items = this.items();
29163
29558
  return Promise.resolve({
29164
- items: this.items,
29165
- total: this.items.length,
29559
+ items,
29560
+ total: items.length,
29166
29561
  });
29167
29562
  },
29168
- byKey: (id) => {
29169
- const item = this.items.find((c) => c.value?.toString() == id);
29170
- return Promise.resolve(item);
29171
- },
29563
+ byKey: (id) => Promise.resolve(this.findItem(id)),
29172
29564
  pageSize: 10,
29173
29565
  key: 'value',
29174
29566
  });
29175
- this.#effect = effect(async () => {
29176
- this.items = [
29177
- // { text: await this.translateService.translateAsync('@general:widgets.toggle.unknown'), value: 'unknown' },
29178
- {
29179
- text: this.trulyText() || (await this.translateService.translateAsync('@general:widgets.toggle.yes')),
29180
- value: true,
29181
- },
29182
- {
29183
- text: this.falsyText() || (await this.translateService.translateAsync('@general:widgets.toggle.no')),
29184
- value: false,
29185
- },
29186
- ];
29567
+ //#endregion
29568
+ //#region ----- Effects -----
29569
+ this.#loadItems = effect((onCleanup) => {
29570
+ const trulyText = this.trulyText();
29571
+ const falsyText = this.falsyText();
29572
+ let active = true;
29573
+ onCleanup(() => {
29574
+ active = false;
29575
+ });
29576
+ void this.resolveItems(trulyText, falsyText).then((next) => {
29577
+ if (active) {
29578
+ this.items.set(next);
29579
+ }
29580
+ });
29187
29581
  }, /* @ts-ignore */
29188
- ...(ngDevMode ? [{ debugName: "#effect" }] : /* istanbul ignore next */ []));
29582
+ ...(ngDevMode ? [{ debugName: "#loadItems" }] : /* istanbul ignore next */ []));
29583
+ /**
29584
+ * Labels arrive after translate. Refresh the list cache and re-seed the lookup,
29585
+ * otherwise a value of `false` stays on the fallback text "false".
29586
+ */
29587
+ this.#syncLookupItems = effect(() => {
29588
+ const next = this.items();
29589
+ const lookup = this.lookup();
29590
+ if (next.length === 0) {
29591
+ return;
29592
+ }
29593
+ untracked(() => {
29594
+ this.dataSource.refresh();
29595
+ lookup?.seedItems(next.map((item) => ({ text: item.text, value: item.value })));
29596
+ });
29597
+ }, /* @ts-ignore */
29598
+ ...(ngDevMode ? [{ debugName: "#syncLookupItems" }] : /* istanbul ignore next */ []));
29189
29599
  }
29600
+ //#endregion
29601
+ //#region ----- Effects -----
29602
+ #loadItems;
29603
+ /**
29604
+ * Labels arrive after translate. Refresh the list cache and re-seed the lookup,
29605
+ * otherwise a value of `false` stays on the fallback text "false".
29606
+ */
29607
+ #syncLookupItems;
29608
+ //#endregion
29609
+ //#region ----- Event Handlers -----
29190
29610
  /**
29191
29611
  * Lookup may skip `onValueChanged` on the first pick (`#lastValue === undefined`).
29192
29612
  * `onItemSelected` always fires from `handleSinglePick`.
@@ -29198,21 +29618,35 @@ class AXPBooleanFilterWidgetEditComponent extends AXPValueWidgetComponent {
29198
29618
  handleValueChange(e) {
29199
29619
  this.commitSelection(e.value);
29200
29620
  }
29621
+ focus() {
29622
+ this.lookup()?.focus();
29623
+ }
29624
+ //#endregion
29625
+ //#region ----- Label Loading -----
29626
+ async resolveItems(trulyText, falsyText) {
29627
+ const [yes, no] = await Promise.all([
29628
+ trulyText ? Promise.resolve(trulyText) : this.translateService.translateAsync('@general:widgets.toggle.yes'),
29629
+ falsyText ? Promise.resolve(falsyText) : this.translateService.translateAsync('@general:widgets.toggle.no'),
29630
+ ]);
29631
+ return [
29632
+ { text: yes, value: true },
29633
+ { text: no, value: false },
29634
+ ];
29635
+ }
29636
+ findItem(id) {
29637
+ return this.items().find((item) => matchesBooleanFilterValue(item.value, id));
29638
+ }
29201
29639
  commitSelection(value, displayText) {
29202
29640
  if (typeof value !== 'boolean') {
29203
29641
  return;
29204
29642
  }
29205
- const item = this.items.find((c) => c.value === value);
29643
+ const item = this.findItem(value);
29206
29644
  this.setValue({
29207
29645
  value,
29208
29646
  operation: this.negative() ? { type: 'notEqual' } : { type: AXP_BOOLEAN_FILTER_DEFAULT_OPERATOR },
29209
29647
  displayText: displayText ?? item?.text,
29210
29648
  });
29211
29649
  }
29212
- #effect;
29213
- focus() {
29214
- this.lookup()?.focus();
29215
- }
29216
29650
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPBooleanFilterWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
29217
29651
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.8", type: AXPBooleanFilterWidgetEditComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "lookup", first: true, predicate: ["lookup"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
29218
29652
  <div class="flex items-center">
@@ -32661,7 +33095,7 @@ const AXPTextBlockWidget = {
32661
33095
  component: () => Promise.resolve().then(function () { return textBlockWidgetView_component; }).then((c) => c.AXPTextBlockWidgetViewComponent),
32662
33096
  },
32663
33097
  designer: {
32664
- component: () => import('./acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-C97rrrmu.mjs').then((c) => c.AXPTextBlockWidgetDesignerComponent),
33098
+ component: () => import('./acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-By3wntCB.mjs').then((c) => c.AXPTextBlockWidgetDesignerComponent),
32665
33099
  },
32666
33100
  },
32667
33101
  };
@@ -33445,4 +33879,4 @@ var getWidgetsForAi_query = /*#__PURE__*/Object.freeze({
33445
33879
  */
33446
33880
 
33447
33881
  export { AXPConditionClauseWidget as $, AXP_REPEATER_ENTITY_BY_KEY_LOOKUP as A, AXPCallbackValidationWidgetEditComponent as B, AXPCheckBoxWidget as C, AXPCheckBoxWidgetColumnComponent as D, AXPCheckBoxWidgetDesignerComponent as E, AXPCheckBoxWidgetEditComponent as F, AXPCheckBoxWidgetPrintComponent as G, AXPCheckBoxWidgetViewComponent as H, AXPCodeEditorWidget as I, AXPColorBoxWidget as J, AXPColorBoxWidgetColumnComponent as K, AXPColorBoxWidgetDesignerComponent as L, AXPColorBoxWidgetEditComponent as M, AXPColorBoxWidgetViewComponent as N, AXPColorChooserWidget as O, AXPColorChooserWidgetColumnComponent as P, AXPColorChooserWidgetDesignerComponent as Q, AXPColorChooserWidgetEditComponent as R, AXPColorChooserWidgetViewComponent as S, AXPColorPaletteWidget as T, AXPColorPaletteWidgetColumnComponent as U, AXPColorPaletteWidgetDesignerComponent as V, AXPColorPaletteWidgetEditComponent as W, AXPColorPaletteWidgetViewComponent as X, AXPConditionBuilderWidget as Y, AXPConditionBuilderWidgetEditComponent as Z, AXPConditionBuilderWidgetViewComponent as _, textBlockContentClass as a, AXPLargeTextWidgetPrintComponent as a$, AXPConditionClauseWidgetEditComponent as a0, AXPConnectedDragDropListsWidget as a1, AXPConnectedListsWidgetColumnComponent as a2, AXPConnectedListsWidgetEditComponent as a3, AXPConnectedListsWidgetViewComponent as a4, AXPContactWidget as a5, AXPContactWidgetColumnComponent as a6, AXPContactWidgetEditComponent as a7, AXPContactWidgetViewComponent as a8, AXPDataListColumnFooterComponent as a9, AXPFlexWidget as aA, AXPFlexWidgetDesignerComponent as aB, AXPFlexWidgetViewComponent as aC, AXPGetWidgetsForAIQuery as aD, AXPGreaterThanExpressionValidationWidget as aE, AXPGreaterThanValidationWidgetEditComponent as aF, AXPGridItemOptionsWidget as aG, AXPGridItemOptionsWidgetEditComponent as aH, AXPGridOptionsWidget as aI, AXPGridOptionsWidgetEditComponent as aJ, AXPImageMarkerPopupComponent as aK, AXPImageMarkerWidget as aL, AXPImageMarkerWidgetColumnComponent as aM, AXPImageMarkerWidgetEditComponent as aN, AXPImageMarkerWidgetViewComponent as aO, AXPIntegrationConnectionActionsService as aP, AXPIntegrationConnectionsPanelWidget as aQ, AXPIntegrationConnectionsPanelWidgetEditComponent as aR, AXPItemConfiguratorWidget as aS, AXPItemConfiguratorWidgetColumnComponent as aT, AXPItemConfiguratorWidgetEditComponent as aU, AXPJsonViewerWidget as aV, AXPJsonViewerWidgetEditComponent as aW, AXPJsonViewerWidgetViewComponent as aX, AXPLargeTextWidget as aY, AXPLargeTextWidgetColumnComponent as aZ, AXPLargeTextWidgetEditComponent as a_, AXPDataListWidget as aa, AXPDataListWidgetViewComponent as ab, AXPDataSourceOptionsWidget as ac, AXPDataSourceOptionsWidgetEditComponent as ad, AXPDateTimeBoxWidget as ae, AXPDateTimeBoxWidgetColumnComponent as af, AXPDateTimeBoxWidgetEditComponent as ag, AXPDateTimeBoxWidgetViewComponent as ah, AXPDirectionWidget as ai, AXPDirectionWidgetEditComponent as aj, AXPDragDropListWidget as ak, AXPEqualValidationWidget as al, AXPEqualValidationWidgetEditComponent as am, AXPFieldsetWidget as an, AXPFieldsetWidgetDesignerComponent as ao, AXPFieldsetWidgetViewComponent as ap, AXPFileViewerWidget as aq, AXPFileViewerWidgetEditComponent as ar, AXPFileViewerWidgetViewComponent as as, AXPFlexItemOptionsWidget as at, AXPFlexItemOptionsWidgetEditComponent as au, AXPFlexItemWidget as av, AXPFlexItemWidgetDesignerComponent as aw, AXPFlexItemWidgetViewComponent as ax, AXPFlexOptionsWidget as ay, AXPFlexOptionsWidgetEditComponent as az, AXPAdvancedGridItemWidget as b, AXPSelectBoxWidgetColumnComponent as b$, AXPLargeTextWidgetViewComponent as b0, AXPLessThanExpressionValidationWidget as b1, AXPLessThanValidationWidgetEditComponent as b2, AXPListStylingRulesExtendedWidget as b3, AXPListWidgetColumnComponent as b4, AXPListWidgetEditComponent as b5, AXPListWidgetViewComponent as b6, AXPLocalDataSourceSheetWidget as b7, AXPLocalDataSourceSheetWidgetEditComponent as b8, AXPMapWidgetEditComponent as b9, AXPProviderSelectWidgetColumnComponent as bA, AXPProviderSelectWidgetEditBase as bB, AXPProviderSelectWidgetViewComponent as bC, AXPQrcodeViewerService as bD, AXPQrcodeWidget as bE, AXPQrcodeWidgetColumnComponent as bF, AXPQrcodeWidgetEditComponent as bG, AXPQrcodeWidgetViewComponent as bH, AXPRatePickerWidget as bI, AXPRatePickerWidgetColumnComponent as bJ, AXPRatePickerWidgetEditComponent as bK, AXPRatePickerWidgetViewComponent as bL, AXPRegularExpressionValidationWidget as bM, AXPRegularExpressionValidationWidgetEditComponent as bN, AXPRepeaterWidget as bO, AXPRepeaterWidgetDesignerComponent as bP, AXPRepeaterWidgetEditComponent as bQ, AXPRepeaterWidgetViewComponent as bR, AXPRequiredValidationWidget as bS, AXPRequiredValidationWidgetEditComponent as bT, AXPRichTextWidget as bU, AXPRichTextWidgetColumnComponent as bV, AXPRichTextWidgetEditComponent as bW, AXPRichTextWidgetPrintComponent as bX, AXPRichTextWidgetViewComponent as bY, AXPSchedulerPickerWidget as bZ, AXPSelectBoxWidget as b_, AXPMapWidgetViewComponent as ba, AXPMaxLengthExpressionValidationWidget as bb, AXPMaxLengthValidationWidgetEditComponent as bc, AXPMinLengthExpressionValidationWidget as bd, AXPMinLengthValidationWidgetEditComponent as be, AXPNodeRendererWidget as bf, AXPNodeRendererWidgetDesignerComponent as bg, AXPNodeRendererWidgetEditComponent as bh, AXPNodeRendererWidgetViewComponent as bi, AXPNumberBoxWidget as bj, AXPNumberBoxWidgetColumnComponent as bk, AXPNumberBoxWidgetEditComponent as bl, AXPNumberBoxWidgetPrintComponent as bm, AXPNumberBoxWidgetViewComponent as bn, AXPOutcomeResultsViewerWidget as bo, AXPOutcomeResultsViewerWidgetViewComponent as bp, AXPPageWidget as bq, AXPPageWidgetViewComponent as br, AXPPasswordBoxWidget as bs, AXPPasswordBoxWidgetColumnComponent as bt, AXPPasswordBoxWidgetEditComponent as bu, AXPPasswordBoxWidgetViewComponent as bv, AXPProgressBarWidget as bw, AXPProgressBarWidgetColumnComponent as bx, AXPProgressBarWidgetEditComponent as by, AXPProgressBarWidgetViewComponent as bz, AXPAdvancedGridItemWidgetDesignerComponent as c, AXP_Flex_Box_Justify_Options as c$, AXPSelectBoxWidgetEditComponent as c0, AXPSelectBoxWidgetViewComponent as c1, AXPSelectLanguagePopup as c2, AXPSelectionListWidget as c3, AXPSelectionListWidgetColumnComponent as c4, AXPSelectionListWidgetDesignerComponent as c5, AXPSelectionListWidgetEditComponent as c6, AXPSelectionListWidgetViewComponent as c7, AXPSignatureWidget as c8, AXPSignatureWidgetColumnComponent as c9, AXPTemplateBoxWidgetEditComponent as cA, AXPTemplateBoxWidgetPrintComponent as cB, AXPTemplateBoxWidgetViewComponent as cC, AXPTextBoxWidget as cD, AXPTextBoxWidgetColumnComponent as cE, AXPTextBoxWidgetEditComponent as cF, AXPTextBoxWidgetPrintComponent as cG, AXPTextBoxWidgetViewComponent as cH, AXPToggleWidget as cI, AXPToggleWidgetColumnComponent as cJ, AXPToggleWidgetEditComponent as cK, AXPToggleWidgetPrintComponent as cL, AXPToggleWidgetViewComponent as cM, AXPWidgetFieldConfiguratorWidget as cN, AXPWidgetFieldConfiguratorWidgetColumnComponent as cO, AXPWidgetFieldConfiguratorWidgetEditComponent as cP, AXPWidgetsModule as cQ, AXP_ABSOLUTE_UNITS as cR, AXP_BORDER_RADIUS_UNITS as cS, AXP_BORDER_WIDTH_UNITS as cT, AXP_CONDITION_CLAUSE_WIDGET_NAME as cU, AXP_DATA_LIST_CMD_DELETE as cV, AXP_DATA_LIST_CMD_EDIT as cW, AXP_DATA_LIST_PENDING_DELETE_KEY as cX, AXP_DATETIME_FILTER_DEFAULT_OPERATOR as cY, AXP_Flex_Box_Align_Options as cZ, AXP_Flex_Box_Alignments as c_, AXPSignatureWidgetEditComponent as ca, AXPSignatureWidgetViewComponent as cb, AXPSpacingWidget as cc, AXPSpacingWidgetEditComponent as cd, AXPStatusChipComponent as ce, AXPStatusWidget as cf, AXPStatusWidgetColumnComponent as cg, AXPStatusWidgetEditComponent as ch, AXPStatusWidgetViewComponent as ci, AXPStepWizardWidget as cj, AXPStepWizardWidgetDesignerComponent as ck, AXPStepWizardWidgetViewComponent as cl, AXPStopwatchWidget as cm, AXPStopwatchWidgetViewComponent as cn, AXPTableItemWidget as co, AXPTableItemWidgetDesignerComponent as cp, AXPTableItemWidgetViewComponent as cq, AXPTableWidget as cr, AXPTableWidgetDesignerComponent as cs, AXPTableWidgetViewComponent as ct, AXPTagEditorWidget as cu, AXPTagEditorWidgetColumnComponent as cv, AXPTagEditorWidgetEditComponent as cw, AXPTagEditorWidgetViewComponent as cx, AXPTemplateBoxWidget as cy, AXPTemplateBoxWidgetColumnComponent as cz, AXPAdvancedGridItemWidgetViewComponent as d, AXP_Grid_Box_Align_Items_Options as d0, AXP_Grid_Box_Alignments as d1, AXP_Grid_Box_Justify_Items_Options as d2, AXP_LIST_STYLING_RULES_WIDGET_NAME as d3, AXP_LOCAL_DATA_SOURCE_SHEET_WIDGET_NAME as d4, AXP_RELATIVE_UNITS as d5, AXP_RELATIVE_UNITS_NO_PERCENT as d6, AXP_ROW_EXPR_PREFIX as d7, AXP_SELECT_FILTER_DEFAULT_OPERATOR as d8, AXP_SPACING_UNITS as d9, AXP_default_Border_Box_Units as da, AXP_default_Border_Box_Value as db, AXP_default_Spacing_Box_Units as dc, AXP_default_Spacing_Box_Value as dd, DEFAULT_QRCODE_SIZE as de, DEFAULT_STRATEGY_CONFIG as df, STRATEGY_CONFIG_TOKEN as dg, applyLeafVisibilityToDataListColumnTree as dh, flattenDataListWidgetColumns as di, formatConditionBuilderChip as dj, formatConditionBuilderSentence as dk, isDataListColumnBand as dl, prepareNodeRendererChild as dm, resolveColorChooserGroups as dn, resolveDataListColumnWidth as dp, tokensToPlainText as dq, AXPAdvancedGridOptionsWidget as e, AXPAdvancedGridOptionsWidgetEditComponent as f, AXPAdvancedGridWidget as g, AXPAdvancedGridWidgetDesignerComponent as h, AXPAdvancedGridWidgetViewComponent as i, AXPAvatarWidget as j, AXPAvatarWidgetColumnComponent as k, AXPAvatarWidgetDesignerComponent as l, AXPAvatarWidgetEditComponent as m, AXPAvatarWidgetViewComponent as n, AXPBetweenExpressionValidationWidget as o, AXPBetweenValidationWidgetEditComponent as p, AXPBlockWidget as q, AXPBlockWidgetDesignerComponent as r, AXPBlockWidgetViewComponent as s, textBlockStyleAttribute as t, AXPBorderWidget as u, AXPBorderWidgetEditComponent as v, AXPButtonWidget as w, AXPButtonWidgetColumnComponent as x, AXPButtonWidgetViewComponent as y, AXPCallbackValidationWidget as z };
33448
- //# sourceMappingURL=acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-Rv0K9r_e.mjs.map
33882
+ //# sourceMappingURL=acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-KrDsAa3H.mjs.map