@acorex-platform/framework-client 0.0.33 → 0.0.38

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 (85) hide show
  1. package/fesm2022/acorex-platform-framework-client-auth.mjs +172 -17
  2. package/fesm2022/acorex-platform-framework-client-auth.mjs.map +1 -1
  3. package/fesm2022/acorex-platform-framework-client-common-common-settings.provider-CzBr0cRi.mjs.map +1 -1
  4. package/fesm2022/acorex-platform-framework-client-common-settings-dialog.helper-DQNOCRL6.mjs.map +1 -1
  5. package/fesm2022/acorex-platform-framework-client-common.mjs +41 -38
  6. package/fesm2022/acorex-platform-framework-client-common.mjs.map +1 -1
  7. package/fesm2022/acorex-platform-framework-client-core.mjs +62 -3
  8. package/fesm2022/acorex-platform-framework-client-core.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-framework-client-domain.mjs.map +1 -1
  10. package/fesm2022/acorex-platform-framework-client-layout-builder.mjs +1 -1
  11. package/fesm2022/acorex-platform-framework-client-layout-builder.mjs.map +1 -1
  12. package/fesm2022/{acorex-platform-framework-client-layout-components-binding-expression-editor-popup.component-oE8CeLE8.mjs → acorex-platform-framework-client-layout-components-binding-expression-editor-popup.component-Bp2cNCPO.mjs} +2 -2
  13. package/fesm2022/{acorex-platform-framework-client-layout-components-binding-expression-editor-popup.component-oE8CeLE8.mjs.map → acorex-platform-framework-client-layout-components-binding-expression-editor-popup.component-Bp2cNCPO.mjs.map} +1 -1
  14. package/fesm2022/acorex-platform-framework-client-layout-components-file-provider-picker.popup.component-BtLEUWAA.mjs.map +1 -1
  15. package/fesm2022/acorex-platform-framework-client-layout-components.mjs +54 -43
  16. package/fesm2022/acorex-platform-framework-client-layout-components.mjs.map +1 -1
  17. package/fesm2022/acorex-platform-framework-client-layout-designer.mjs +8 -8
  18. package/fesm2022/acorex-platform-framework-client-layout-designer.mjs.map +1 -1
  19. package/fesm2022/{acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-D1prdDvf.mjs → acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-CvaOWbJx.mjs} +763 -246
  20. package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-CvaOWbJx.mjs.map +1 -0
  21. package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-CeVGNzup.mjs → acorex-platform-framework-client-layout-entity-attachments-page.component-Ds63Rt2n.mjs} +2 -2
  22. package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-CeVGNzup.mjs.map → acorex-platform-framework-client-layout-entity-attachments-page.component-Ds63Rt2n.mjs.map} +1 -1
  23. package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-CFScb-L4.mjs → acorex-platform-framework-client-layout-entity-bulk-entity.command-C0pohwdo.mjs} +2 -2
  24. package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-CFScb-L4.mjs.map → acorex-platform-framework-client-layout-entity-bulk-entity.command-C0pohwdo.mjs.map} +1 -1
  25. package/fesm2022/{acorex-platform-framework-client-layout-entity-file-list-popup.component-B3__csKW.mjs → acorex-platform-framework-client-layout-entity-file-list-popup.component-C0LgUzzv.mjs} +2 -2
  26. package/fesm2022/{acorex-platform-framework-client-layout-entity-file-list-popup.component-B3__csKW.mjs.map → acorex-platform-framework-client-layout-entity-file-list-popup.component-C0LgUzzv.mjs.map} +1 -1
  27. package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-B17l6mbm.mjs → acorex-platform-framework-client-layout-entity-gallery-page.component-o2HuZrDN.mjs} +3 -3
  28. package/fesm2022/acorex-platform-framework-client-layout-entity-gallery-page.component-o2HuZrDN.mjs.map +1 -0
  29. package/fesm2022/acorex-platform-framework-client-layout-entity.mjs +1 -1
  30. package/fesm2022/acorex-platform-framework-client-layout-views.mjs +3 -3
  31. package/fesm2022/acorex-platform-framework-client-layout-views.mjs.map +1 -1
  32. package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs +16 -10
  33. package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs.map +1 -1
  34. package/fesm2022/{acorex-platform-framework-client-layout-widgets-button-widget-designer.component-BiWerYcu.mjs → acorex-platform-framework-client-layout-widgets-button-widget-designer.component-BDOdcoyN.mjs} +2 -2
  35. package/fesm2022/{acorex-platform-framework-client-layout-widgets-button-widget-designer.component-BiWerYcu.mjs.map → acorex-platform-framework-client-layout-widgets-button-widget-designer.component-BDOdcoyN.mjs.map} +1 -1
  36. package/fesm2022/acorex-platform-framework-client-layout-widgets-image-preview.popup-BOrrMm3U.mjs.map +1 -1
  37. package/fesm2022/acorex-platform-framework-client-layout-widgets-page-widget-designer.component-WzIiwnGC.mjs.map +1 -1
  38. package/fesm2022/acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-4mX8aYzA.mjs.map +1 -1
  39. package/fesm2022/{acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-CRST84ou.mjs → acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-TWxthl21.mjs} +2 -2
  40. package/fesm2022/{acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-CRST84ou.mjs.map → acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-TWxthl21.mjs.map} +1 -1
  41. package/fesm2022/{acorex-platform-framework-client-layout-widgets-tabular-data-view-popup.component-FjtSRxIX.mjs → acorex-platform-framework-client-layout-widgets-tabular-data-view-popup.component-D7P08nHH.mjs} +2 -2
  42. package/fesm2022/{acorex-platform-framework-client-layout-widgets-tabular-data-view-popup.component-FjtSRxIX.mjs.map → acorex-platform-framework-client-layout-widgets-tabular-data-view-popup.component-D7P08nHH.mjs.map} +1 -1
  43. package/fesm2022/acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-D6HFPmGC.mjs.map +1 -1
  44. package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs +1121 -1107
  45. package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs.map +1 -1
  46. package/fesm2022/acorex-platform-framework-client-native.mjs.map +1 -1
  47. package/fesm2022/acorex-platform-framework-client-realtime-set-presence-availability.command-CetlUjnM.mjs.map +1 -1
  48. package/fesm2022/acorex-platform-framework-client-realtime.mjs +2 -1
  49. package/fesm2022/acorex-platform-framework-client-realtime.mjs.map +1 -1
  50. package/fesm2022/acorex-platform-framework-client-runtime.mjs +46 -2
  51. package/fesm2022/acorex-platform-framework-client-runtime.mjs.map +1 -1
  52. package/fesm2022/{acorex-platform-framework-client-themes-default-entity-master-create-view.component-yeftgJ_K.mjs → acorex-platform-framework-client-themes-default-entity-master-create-view.component-CT7WWWG0.mjs} +2 -2
  53. package/fesm2022/{acorex-platform-framework-client-themes-default-entity-master-create-view.component-yeftgJ_K.mjs.map → acorex-platform-framework-client-themes-default-entity-master-create-view.component-CT7WWWG0.mjs.map} +1 -1
  54. package/fesm2022/{acorex-platform-framework-client-themes-default-entity-master-modify-view.component-DWE3OWGm.mjs → acorex-platform-framework-client-themes-default-entity-master-modify-view.component-DienTcPE.mjs} +2 -2
  55. package/fesm2022/{acorex-platform-framework-client-themes-default-entity-master-modify-view.component-DWE3OWGm.mjs.map → acorex-platform-framework-client-themes-default-entity-master-modify-view.component-DienTcPE.mjs.map} +1 -1
  56. package/fesm2022/{acorex-platform-framework-client-themes-default-entity-master-single-view.component-DCpl6AXq.mjs → acorex-platform-framework-client-themes-default-entity-master-single-view.component-DBUwSzvg.mjs} +2 -2
  57. package/fesm2022/{acorex-platform-framework-client-themes-default-entity-master-single-view.component-DCpl6AXq.mjs.map → acorex-platform-framework-client-themes-default-entity-master-single-view.component-DBUwSzvg.mjs.map} +1 -1
  58. package/fesm2022/{acorex-platform-framework-client-themes-default-error-401.component-BrTotLx1.mjs → acorex-platform-framework-client-themes-default-error-401.component-CaV3MdRr.mjs} +2 -2
  59. package/fesm2022/{acorex-platform-framework-client-themes-default-error-401.component-BrTotLx1.mjs.map → acorex-platform-framework-client-themes-default-error-401.component-CaV3MdRr.mjs.map} +1 -1
  60. package/fesm2022/{acorex-platform-framework-client-themes-default-error-404.component-DsC7_s59.mjs → acorex-platform-framework-client-themes-default-error-404.component-CTA-lxYp.mjs} +2 -2
  61. package/fesm2022/{acorex-platform-framework-client-themes-default-error-404.component-DsC7_s59.mjs.map → acorex-platform-framework-client-themes-default-error-404.component-CTA-lxYp.mjs.map} +1 -1
  62. package/fesm2022/{acorex-platform-framework-client-themes-default-error-offline.component-CngiQycG.mjs → acorex-platform-framework-client-themes-default-error-offline.component-B85b0lsa.mjs} +2 -2
  63. package/fesm2022/{acorex-platform-framework-client-themes-default-error-offline.component-CngiQycG.mjs.map → acorex-platform-framework-client-themes-default-error-offline.component-B85b0lsa.mjs.map} +1 -1
  64. package/fesm2022/acorex-platform-framework-client-themes-default.mjs +21 -21
  65. package/fesm2022/acorex-platform-framework-client-themes-default.mjs.map +1 -1
  66. package/fesm2022/acorex-platform-framework-client-themes-shared-icon-chooser-column.component-CbZALjB5.mjs.map +1 -1
  67. package/fesm2022/acorex-platform-framework-client-themes-shared-icon-chooser-view.component-BRrNT6x2.mjs.map +1 -1
  68. package/fesm2022/acorex-platform-framework-client-themes-shared-settings.provider-CpsAIsxj.mjs.map +1 -1
  69. package/fesm2022/acorex-platform-framework-client-themes-shared-theme-color-chooser-column.component-BIsQTr6B.mjs.map +1 -1
  70. package/fesm2022/acorex-platform-framework-client-themes-shared-theme-color-chooser-view.component-ZclmSbt9.mjs.map +1 -1
  71. package/fesm2022/acorex-platform-framework-client-themes-shared.mjs +3 -3
  72. package/fesm2022/acorex-platform-framework-client-themes-shared.mjs.map +1 -1
  73. package/fesm2022/acorex-platform-framework-client-workflow.mjs.map +1 -1
  74. package/package.json +2 -2
  75. package/types/acorex-platform-framework-client-auth.d.ts +56 -10
  76. package/types/acorex-platform-framework-client-common.d.ts +16 -9
  77. package/types/acorex-platform-framework-client-core.d.ts +19 -9
  78. package/types/acorex-platform-framework-client-layout-components.d.ts +26 -7
  79. package/types/acorex-platform-framework-client-layout-entity.d.ts +38 -16
  80. package/types/acorex-platform-framework-client-layout-widgets.d.ts +29 -139
  81. package/types/acorex-platform-framework-client-realtime.d.ts +20 -2
  82. package/types/acorex-platform-framework-client-runtime.d.ts +8 -0
  83. package/types/acorex-platform-framework-client-themes-default.d.ts +1 -1
  84. package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-D1prdDvf.mjs.map +0 -1
  85. package/fesm2022/acorex-platform-framework-client-layout-entity-gallery-page.component-B17l6mbm.mjs.map +0 -1
@@ -21,12 +21,12 @@ import * as i1$7 from '@acorex/components/text-box';
21
21
  import { AXTextBoxModule } from '@acorex/components/text-box';
22
22
  import * as i1$5 from '@acorex/core/translation';
23
23
  import { AXTranslationModule, AXTranslationService, resolveMultiLanguageString as resolveMultiLanguageString$1 } from '@acorex/core/translation';
24
- import { AXP_LOCALE_MANAGEMENT_PORT, AXPFilterOperatorMiddlewareService, AXPCleanNestedFilters, AXPClipBoardService, AXPSettingsService, ALL_DEFAULT_OPERATORS, DATE_OPERATORS, BOOLEAN_OPERATORS, NUMBER_OPERATORS, STRING_OPERATORS, resolveDateFilterPresets, findManualPresetIdByOperation, applyDateFilterPreset, AXPFileStorageService, resolveStoredImageDisplayUrl, resolveMediaViewerType, normalizeStoredImageRef, 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 { AXP_LOCALE_MANAGEMENT_PORT, AXPFilterOperatorMiddlewareService, AXPCleanNestedFilters, AXPClipBoardService, AXPSettingsService, ALL_DEFAULT_OPERATORS, 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';
25
25
  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';
26
26
  import * as i1$4 from '@angular/common';
27
- import { CommonModule, AsyncPipe } from '@angular/common';
27
+ import { CommonModule, AsyncPipe, NgClass } from '@angular/common';
28
28
  import * as i0 from '@angular/core';
29
- import { inject, signal, computed, ChangeDetectionStrategy, Component, InjectionToken, viewChild, effect, untracked, HostBinding, Directive, EventEmitter, linkedSignal, Injectable, model, input, ViewEncapsulation, DestroyRef, afterNextRender, ChangeDetectorRef, output, Input, ElementRef, afterEveryRender, NgZone, importProvidersFrom, NgModule } from '@angular/core';
29
+ import { inject, signal, computed, ChangeDetectionStrategy, Component, InjectionToken, viewChild, effect, untracked, HostBinding, Directive, EventEmitter, linkedSignal, Injectable, model, input, ViewEncapsulation, DestroyRef, EnvironmentInjector, ApplicationRef, afterNextRender, ChangeDetectorRef, output, Input, ElementRef, afterEveryRender, NgZone, NgModule } from '@angular/core';
30
30
  import * as i1$6 from '@angular/forms';
31
31
  import { FormsModule } from '@angular/forms';
32
32
  import { AXLookupComponent } from '@acorex/components/lookup';
@@ -37,7 +37,7 @@ import * as i2$2 from '@acorex/components/loading';
37
37
  import { AXLoadingModule } from '@acorex/components/loading';
38
38
  import { AXPCommandService, AXPQueryService, provideQuerySetups } from '@acorex-platform/framework-client/runtime';
39
39
  import { cloneProperty, AXPWidgetGroupEnum, createSelectProperty, createStringProperty, createNumberProperty, createBooleanProperty, AXPWidgetStatus } from '@acorex-platform/framework-shared/widget-core';
40
- import { AXPConditionBuilderComponent, AXPColorChooserComponent, AXPColorPalettePickerComponent, AXPDragDropListComponent, AXPColumnItemListComponent, AXPImageEditorService, AXPFileViewerComponent, AXPFileChooserDirective, normalizeFileViewerBoundValue, AXPStateMessageComponent, AXPOutcomeResultsViewerComponent, AXPSignatureEditorService, AXPStopwatchComponent, AXPWidgetFieldConfiguratorComponent, AXPItemConfiguratorComponent, AXPRepeaterRowsLayoutComponent, AXPQueryFiltersComponent, AXPQuerySortsComponent, AXPQueryColumnsComponent } from '@acorex-platform/framework-client/layout/components';
40
+ import { AXPConditionBuilderComponent, AXPColorChooserComponent, AXPColorPalettePickerComponent, AXPDragDropListComponent, AXPColumnItemListComponent, AXPImageEditorService, AXPFileChooserService, createAttachedFileProviderMenu, AXPFileViewerComponent, AXPStateMessageComponent, normalizeFileViewerBoundValue, AXPOutcomeResultsViewerComponent, AXPSignatureEditorService, AXPStopwatchComponent, AXPWidgetFieldConfiguratorComponent, AXPItemConfiguratorComponent, AXPRepeaterRowsLayoutComponent, AXPQueryFiltersComponent, AXPQuerySortsComponent, AXPQueryColumnsComponent } from '@acorex-platform/framework-client/layout/components';
41
41
  import { AXValidationModule, AXValidationService } from '@acorex/core/validation';
42
42
  import { AXColorUtil } from '@acorex/core/utils';
43
43
  import * as i2$3 from '@acorex/components/color-box';
@@ -69,6 +69,7 @@ import { AXRangeSliderModule } from '@acorex/components/range-slider';
69
69
  import { AXRatePickerComponent } from '@acorex/components/rate-picker';
70
70
  import * as i2$5 from '@acorex/components/wysiwyg';
71
71
  import { AXWysiwygModule } from '@acorex/components/wysiwyg';
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';
74
75
  import { AXSkeletonModule } from '@acorex/components/skeleton';
@@ -89,45 +90,40 @@ import * as i1$c from '@acorex/components/code-editor';
89
90
  import { AXCodeEditorModule } from '@acorex/components/code-editor';
90
91
  import * as i1$d from '@acorex/components/data-table';
91
92
  import { AXDataTableModule } from '@acorex/components/data-table';
92
- import { AXLoadingDialogService } from '@acorex/components/loading-dialog';
93
- import * as i1$e from '@acorex/components/media-viewer';
94
- import { AXMediaViewerModule } from '@acorex/components/media-viewer';
95
- import * as i1$f from '@acorex/components/image';
96
- import { AXImageModule } from '@acorex/components/image';
97
93
  import { AXDialogService } from '@acorex/components/dialog';
98
94
  import { AXToastService } from '@acorex/components/toast';
99
95
  import * as i6 from '@acorex/components/dropdown-button';
100
96
  import { AXDropdownButtonModule } from '@acorex/components/dropdown-button';
101
97
  import * as i6$1 from '@acorex/components/tooltip';
102
98
  import { AXTooltipModule } from '@acorex/components/tooltip';
103
- import * as i1$g from '@acorex/components/json-viewer';
99
+ import * as i1$e from '@acorex/components/json-viewer';
104
100
  import { AXJsonViewerModule } from '@acorex/components/json-viewer';
105
- import * as i1$h from '@acorex/components/map';
101
+ import * as i1$f from '@acorex/components/map';
106
102
  import { AXMapModule } from '@acorex/components/map';
107
103
  import * as i5$2 from '@acorex/components/qrcode';
108
104
  import { AXQrcodeModule } from '@acorex/components/qrcode';
109
105
  import { AXSchedulerPickerService, AXSchedulerPickerComponent } from '@acorex/components/scheduler-picker';
106
+ import * as i3$6 from '@acorex/components/image';
107
+ import { AXImageModule } from '@acorex/components/image';
110
108
  import * as i2$8 from '@acorex/components/paint';
111
109
  import { AXPaintModule } from '@acorex/components/paint';
112
- import * as i1$i from '@acorex/components/grid-layout-builder';
110
+ import * as i1$g from '@acorex/components/grid-layout-builder';
113
111
  import { AXGridLayoutContainerComponent, AXGridLayoutBuilderModule } from '@acorex/components/grid-layout-builder';
114
112
  import { AXPDesignerService, AXPWidgetDesignerRendererDirective, AXPDesignerGridDrawerComponent, AXPDesignerAddWidgetMiniButtonComponent, AXPDesignerFlexDrawerComponent } from '@acorex-platform/framework-client/layout/designer';
115
113
  import { moveItemInArray } from '@acorex/cdk/drag-drop';
116
- import * as i1$j from '@acorex/components/step-wizard';
114
+ import * as i1$h from '@acorex/components/step-wizard';
117
115
  import { AXStepWizardModule } from '@acorex/components/step-wizard';
118
- import * as i1$k from '@acorex/components/button-group';
116
+ import * as i1$i from '@acorex/components/button-group';
119
117
  import { AXButtonGroupModule } from '@acorex/components/button-group';
120
118
  import { AXKBDComponent, AXKBDItemComponent } from '@acorex/components/kbd';
121
119
  import { provideFileViewer } from '@acorex/components/file-viewer';
122
- import * as i1$l from '@acorex/components/cron-job';
123
- import { AXCronJobModule } from '@acorex/components/cron-job';
124
120
  import { normalizeEntityMasterListLayoutType } from '@acorex-platform/framework-shared/entity';
125
- import * as i3$6 from '@acorex/components/time-duration';
121
+ import * as i3$7 from '@acorex/components/time-duration';
126
122
  import { AXTimeDurationModule } from '@acorex/components/time-duration';
127
- import * as i1$m from '@acorex/components/alert';
123
+ import * as i1$j from '@acorex/components/alert';
128
124
  import { AXAlertModule } from '@acorex/components/alert';
129
125
  import { DomSanitizer } from '@angular/platform-browser';
130
- import * as i1$n from '@acorex/components/accordion';
126
+ import * as i1$k from '@acorex/components/accordion';
131
127
  import { AXAccordionModule } from '@acorex/components/accordion';
132
128
  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';
133
129
  export { AXP_WIDGET_AI_AGENT_ASSIST_FOLLOW_UP_CHIPS_LAYOUT, AXP_WIDGET_AI_AGENT_CHART_LAYOUT, AXP_WIDGET_AI_AGENT_FORM_LAYOUT, AXP_WIDGET_AI_AGENT_NAMES, matchesWidgetAiAgent } from '@acorex-platform/framework-shared/runtime';
@@ -386,7 +382,7 @@ class AXPSelectLanguagePopup extends AXBasePageComponent {
386
382
  });
387
383
  }
388
384
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPSelectLanguagePopup, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
389
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPSelectLanguagePopup, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "@if (isMobile()) {\n<div class=\"flex flex-col w-full\">\n <div class=\"flex items-center justify-between gap-2 px-3 py-2 border-b border-gray-200\">\n <span class=\"font-semibold truncate\">{{ currentLanguageTitle() || (\"@general:fields.language.title\" |\n translate | async) }}</span>\n @if (visibleLanguageList().length > 1) {\n <ax-button (onClick)=\"openLanguagePicker()\" color=\"primary\"\n [text]=\"('@general:actions.change.title' | translate | async)\"></ax-button>\n }\n </div>\n <div class=\"flex-1 min-w-0 overflow-auto p-3\">\n @if (activeLanguage(); as lang) {\n <div class=\"flex flex-grow items-center justify-center\">\n <axp-widgets-container class=\"flex flex-col gap-2 p-4\" [context]=\"lang.context\"\n (onContextChanged)=\"handleContextChanged($event, lang)\">\n <ng-container axp-widget-renderer [node]=\"lang.node\" [mode]=\"'edit'\"> </ng-container>\n </axp-widgets-container>\n </div>\n }\n </div>\n</div>\n} @else {\n<div class=\"flex h-[max(70vh,20rem)]\">\n <aside class=\"overflow-auto flex-shrink-0 min-w-[12rem] border-e border-neutral-200\">\n <ax-tabs [content]=\"content\" location=\"end\" look=\"with-line-color\" [fitParent]=\"true\">\n @for (language of visibleLanguageList(); track language.code) {\n <ax-tab-item [text]=\"language.title\" [key]=\"language.code\" [(active)]=\"language.active\">\n <ax-suffix>\n <ax-badge [color]=\"hasTranslationContent(language.context.value) ? 'success' : 'ghost'\"></ax-badge>\n </ax-suffix>\n <ax-content>\n <p class=\"font-semibold self-start mb-4\">{{ language.title }}</p>\n <div class=\"flex flex-grow items-center justify-center\">\n <axp-widgets-container class=\"flex flex-col gap-2 p-4\" [context]=\"language.context\"\n (onContextChanged)=\"handleContextChanged($event, language)\">\n <ng-container axp-widget-renderer [node]=\"language.node\" [mode]=\"'edit'\"> </ng-container>\n </axp-widgets-container>\n </div>\n </ax-content>\n </ax-tab-item>\n }\n </ax-tabs>\n </aside>\n <div class=\"flex-1 min-w-0 p-4 flex flex-col\">\n <ng-template [axTabContent] #content=\"axTabContent\"> </ng-template>\n </div>\n</div>\n}\n<ax-footer class=\"flex items-center justify-between gap-4\">\n <ax-prefix class=\"flex items-center min-w-0\">\n @if (hasLanguagesBeyondProfiles()) {\n <ax-check-box [value]=\"showOtherLanguages()\" (onValueChanged)=\"onShowOtherLanguagesChanged($event)\">\n <ax-label>{{ ('@general:widgets.multi-language-select.show-other-languages' | translate | async) }}</ax-label>\n </ax-check-box>\n }\n </ax-prefix>\n <ax-suffix>\n <ax-button [text]=\"('@general:actions.cancel.title' | translate | async)\" (onClick)=\"close()\"></ax-button>\n <ax-button color=\"primary\" [text]=\"('@general:actions.save.title' | translate | async)\"\n (onClick)=\"onSaveButtonClick()\"></ax-button>\n </ax-suffix>\n</ax-footer>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXLabelModule }, { kind: "component", type: i2.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXCheckBoxModule }, { kind: "component", type: i1$2.AXCheckBoxComponent, selector: "ax-check-box", inputs: ["disabled", "tabIndex", "readonly", "color", "value", "name", "id", "isLoading", "indeterminate"], outputs: ["onBlur", "onFocus", "valueChange", "onValueChanged"] }, { kind: "ngmodule", type: AXDecoratorModule }, { 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: AXTabsModule }, { kind: "component", type: i5.AXTabsComponent, selector: "ax-tabs", inputs: ["look", "location", "fitParent", "minWidth", "content"], outputs: ["onActiveTabChanged"] }, { kind: "component", type: i5.AXTabItemComponent, selector: "ax-tab-item", inputs: ["disabled", "text", "key", "headerTemplate", "active"], outputs: ["disabledChange", "onClick", "onBlur", "onFocus", "activeChange"] }, { kind: "directive", type: i5.AXTabContentDirective, selector: "[axTabContent]", inputs: ["axTabContent"], exportAs: ["axTabContent"] }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "component", type: i1$3.AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i1.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
385
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPSelectLanguagePopup, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "@if (isMobile()) {\n<div class=\"flex flex-col w-full\">\n <div class=\"flex items-center justify-between gap-2 px-3 py-2 border-b border-gray-200\">\n <span class=\"font-semibold truncate\">{{ currentLanguageTitle() || (\"@general:fields.language.title\" |\n translate | async) }}</span>\n @if (visibleLanguageList().length > 1) {\n <ax-button (onClick)=\"openLanguagePicker()\" color=\"primary\"\n [text]=\"('@general:actions.change.title' | translate | async)\"></ax-button>\n }\n </div>\n <div class=\"flex-1 min-w-0 overflow-auto p-3\">\n @if (activeLanguage(); as lang) {\n <div class=\"flex flex-grow items-center justify-center\">\n <axp-widgets-container class=\"flex flex-col gap-2 p-4\" [context]=\"lang.context\"\n (onContextChanged)=\"handleContextChanged($event, lang)\">\n <ng-container axp-widget-renderer [node]=\"lang.node\" [mode]=\"'edit'\"> </ng-container>\n </axp-widgets-container>\n </div>\n }\n </div>\n</div>\n} @else {\n<div class=\"flex h-[max(70vh,20rem)]\">\n <aside class=\"overflow-auto flex-shrink-0 min-w-[12rem] border-e border-neutral-200\">\n <ax-tabs [content]=\"content\" location=\"end\" look=\"with-line-color\" [fitParent]=\"true\">\n @for (language of visibleLanguageList(); track language.code) {\n <ax-tab-item [text]=\"language.title\" [key]=\"language.code\" [(active)]=\"language.active\">\n <ax-suffix>\n <ax-badge [color]=\"hasTranslationContent(language.context.value) ? 'success' : 'ghost'\"></ax-badge>\n </ax-suffix>\n <ax-content>\n <p class=\"font-semibold self-start mb-4\">{{ language.title }}</p>\n <div class=\"flex flex-grow items-center justify-center\">\n <axp-widgets-container class=\"flex flex-col gap-2 p-4\" [context]=\"language.context\"\n (onContextChanged)=\"handleContextChanged($event, language)\">\n <ng-container axp-widget-renderer [node]=\"language.node\" [mode]=\"'edit'\"> </ng-container>\n </axp-widgets-container>\n </div>\n </ax-content>\n </ax-tab-item>\n }\n </ax-tabs>\n </aside>\n <div class=\"flex-1 min-w-0 p-4 flex flex-col\">\n <ng-template [axTabContent] #content=\"axTabContent\"> </ng-template>\n </div>\n</div>\n}\n<ax-footer class=\"flex items-center justify-between gap-4\">\n <ax-prefix class=\"flex items-center min-w-0\">\n @if (hasLanguagesBeyondProfiles()) {\n <ax-check-box [value]=\"showOtherLanguages()\" (onValueChanged)=\"onShowOtherLanguagesChanged($event)\">\n <ax-label>{{ ('@general:widgets.multi-language-select.show-other-languages' | translate | async) }}</ax-label>\n </ax-check-box>\n }\n </ax-prefix>\n <ax-suffix>\n <ax-button [text]=\"('@general:actions.cancel.title' | translate | async)\" (onClick)=\"close()\"></ax-button>\n <ax-button color=\"primary\" [text]=\"('@general:actions.save.title' | translate | async)\"\n (onClick)=\"onSaveButtonClick()\"></ax-button>\n </ax-suffix>\n</ax-footer>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: AXLabelModule }, { kind: "component", type: i2.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXCheckBoxModule }, { kind: "component", type: i1$2.AXCheckBoxComponent, selector: "ax-check-box", inputs: ["disabled", "tabIndex", "readonly", "color", "value", "name", "id", "isLoading", "indeterminate"], outputs: ["onBlur", "onFocus", "valueChange", "onValueChanged"] }, { kind: "ngmodule", type: AXDecoratorModule }, { 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: AXTabsModule }, { kind: "component", type: i5.AXTabsComponent, selector: "ax-tabs", inputs: ["look", "location", "reorderable", "reorderDelay", "fitParent", "minWidth", "content"], outputs: ["onActiveTabChanged", "onTabsReordered"] }, { kind: "component", type: i5.AXTabItemComponent, selector: "ax-tab-item", inputs: ["disabled", "text", "key", "headerTemplate", "active"], outputs: ["disabledChange", "onClick", "onBlur", "onFocus", "activeChange"] }, { kind: "directive", type: i5.AXTabContentDirective, selector: "[axTabContent]", inputs: ["axTabContent"], exportAs: ["axTabContent"] }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "component", type: i1$3.AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i1.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
390
386
  }
391
387
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPSelectLanguagePopup, decorators: [{
392
388
  type: Component,
@@ -798,7 +794,7 @@ class AXPButtonWidgetColumnComponent extends AXPColumnWidgetComponent {
798
794
  <ax-loading></ax-loading>
799
795
  }
800
796
  </ax-button>
801
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2$2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { 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" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
797
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: AXLoadingModule }, { kind: "component", type: i2$2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { 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" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
802
798
  }
803
799
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPButtonWidgetColumnComponent, decorators: [{
804
800
  type: Component,
@@ -914,7 +910,7 @@ class AXPButtonWidgetViewComponent extends AXPLayoutBaseWidgetComponent {
914
910
  <ax-loading> </ax-loading>
915
911
  }
916
912
  </ax-button>
917
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2$2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { 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: AXBadgeModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
913
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: AXLoadingModule }, { kind: "component", type: i2$2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { 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: AXBadgeModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
918
914
  }
919
915
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPButtonWidgetViewComponent, decorators: [{
920
916
  type: Component,
@@ -964,7 +960,7 @@ const AXPButtonWidget = {
964
960
  ],
965
961
  components: {
966
962
  designer: {
967
- component: () => import('./acorex-platform-framework-client-layout-widgets-button-widget-designer.component-BiWerYcu.mjs').then((c) => c.AXPButtonWidgetDesignerComponent),
963
+ component: () => import('./acorex-platform-framework-client-layout-widgets-button-widget-designer.component-BDOdcoyN.mjs').then((c) => c.AXPButtonWidgetDesignerComponent),
968
964
  },
969
965
  view: {
970
966
  component: () => Promise.resolve().then(function () { return buttonWidgetView_component; }).then((c) => c.AXPButtonWidgetViewComponent),
@@ -3460,7 +3456,7 @@ class AXPContactWidgetEditComponent extends AXPValueWidgetComponent {
3460
3456
  </ax-lookup>
3461
3457
  }
3462
3458
  </div>
3463
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { 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: AXTextBoxModule }, { kind: "component", type: i1$7.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: "ngmodule", type: AXValidationModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3459
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { 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: AXTextBoxModule }, { kind: "component", type: i1$7.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: "ngmodule", type: AXValidationModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3464
3460
  }
3465
3461
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPContactWidgetEditComponent, decorators: [{
3466
3462
  type: Component,
@@ -3944,7 +3940,7 @@ class AXPFilterOperationsComponent {
3944
3940
  return resolved.length > 0 ? resolved : base;
3945
3941
  }
3946
3942
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPFilterOperationsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3947
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPFilterOperationsComponent, isStandalone: true, selector: "axp-filter-operations", inputs: { selectedOperation: { classPropertyName: "selectedOperation", publicName: "selectedOperation", isSignal: true, isRequired: true, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, operations: { classPropertyName: "operations", publicName: "operations", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedOperation: "selectedOperationChange" }, ngImport: i0, template: "@if (operationItems().length > 1) {\n<ax-button #changeOperator look=\"blank\" color=\"default\" class=\"ax-sm\">\n <ax-icon class=\"fa-solid fa-ellipsis-vertical\"></ax-icon>\n</ax-button>\n<ax-popover\n #operatorsPopover\n [target]=\"changeOperator\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n>\n <div\n class=\"max-h-max overflow-auto bg-lightest py-5 px-3 border border-default rounded-md shadow-md w-full min-w-[250px]\"\n >\n <ax-selection-list\n class=\"\"\n [valueField]=\"'name'\"\n [textField]=\"'title'\"\n [(ngModel)]=\"selectedOperation\"\n (ngModelChange)=\"operatorsPopover.close()\"\n [direction]=\"'vertical'\"\n [items]=\"operationItems()\"\n [multiple]=\"false\"\n ></ax-selection-list>\n </div>\n</ax-popover>\n}\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i3$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXSelectionListModule }, { kind: "component", type: i2$4.AXSelectionListComponent, selector: "ax-selection-list", inputs: ["id", "name", "disabled", "readonly", "tabIndex", "size", "value", "valueField", "textField", "disabledField", "readonlyField", "multiple", "direction", "customTemplate", "showControl", "items", "look"], outputs: ["onValueChanged", "onBlur", "onFocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3943
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPFilterOperationsComponent, isStandalone: true, selector: "axp-filter-operations", inputs: { selectedOperation: { classPropertyName: "selectedOperation", publicName: "selectedOperation", isSignal: true, isRequired: true, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, operations: { classPropertyName: "operations", publicName: "operations", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedOperation: "selectedOperationChange" }, ngImport: i0, template: "@if (operationItems().length > 1) {\n<ax-button #changeOperator look=\"blank\" color=\"default\" class=\"ax-sm\">\n <ax-icon class=\"fa-solid fa-ellipsis-vertical\"></ax-icon>\n</ax-button>\n<ax-popover\n #operatorsPopover\n [target]=\"changeOperator\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n>\n <div\n class=\"max-h-max overflow-auto bg-lightest py-5 px-3 border border-default rounded-md shadow-md w-full min-w-[250px]\"\n >\n <ax-selection-list\n class=\"\"\n [valueField]=\"'name'\"\n [textField]=\"'title'\"\n [(ngModel)]=\"selectedOperation\"\n (ngModelChange)=\"operatorsPopover.close()\"\n [direction]=\"'vertical'\"\n [items]=\"operationItems()\"\n [multiple]=\"false\"\n ></ax-selection-list>\n </div>\n</ax-popover>\n}\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i3$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3948
3944
  }
3949
3945
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPFilterOperationsComponent, decorators: [{
3950
3946
  type: Component,
@@ -4142,15 +4138,31 @@ class AXPDateTimeBoxWidgetEditComponent extends AXPValueWidgetComponent {
4142
4138
  void this.translatePresets(presets);
4143
4139
  }, /* @ts-ignore */
4144
4140
  ...(ngDevMode ? [{ debugName: "#presetTranslateEffect" }] : /* istanbul ignore next */ []));
4141
+ /**
4142
+ * Revalidates when min/max or dependent rules change. Skips the first CD run and
4143
+ * empty/pristine fields so create forms do not show required errors on open.
4144
+ * `refresh()` still validates immediately; later runs revalidate when there is a
4145
+ * value or the user already touched the field.
4146
+ */
4147
+ this.#hasCompletedInitialDependencyRevalidate = false;
4148
+ this.#hasUserInteracted = false;
4145
4149
  this.#revalidateWhenDependenciesChange = effect(() => {
4146
4150
  if (this.filterMode()) {
4147
4151
  return;
4148
4152
  }
4149
4153
  this.validationRules();
4150
4154
  this.minValue();
4155
+ this.maxValue();
4151
4156
  this.validationRevision();
4152
4157
  untracked(() => {
4158
+ if (!this.#hasCompletedInitialDependencyRevalidate) {
4159
+ this.#hasCompletedInitialDependencyRevalidate = true;
4160
+ return;
4161
+ }
4153
4162
  queueMicrotask(() => {
4163
+ if (!this.#shouldRevalidateStandardDateTimeBox()) {
4164
+ return;
4165
+ }
4154
4166
  void this.standardDateTimeBox()?.validate();
4155
4167
  });
4156
4168
  });
@@ -4192,11 +4204,23 @@ class AXPDateTimeBoxWidgetEditComponent extends AXPValueWidgetComponent {
4192
4204
  this.selectedPresetId.set(presetId);
4193
4205
  }
4194
4206
  }
4207
+ /**
4208
+ * Revalidates when min/max or dependent rules change. Skips the first CD run and
4209
+ * empty/pristine fields so create forms do not show required errors on open.
4210
+ * `refresh()` still validates immediately; later runs revalidate when there is a
4211
+ * value or the user already touched the field.
4212
+ */
4213
+ #hasCompletedInitialDependencyRevalidate;
4214
+ #hasUserInteracted;
4195
4215
  #revalidateWhenDependenciesChange;
4216
+ #shouldRevalidateStandardDateTimeBox() {
4217
+ const value = this.getValue();
4218
+ const hasValue = value != null && value !== '';
4219
+ const box = this.standardDateTimeBox();
4220
+ return hasValue || this.#hasUserInteracted || box?.dirty === true || box?.touched === true;
4221
+ }
4196
4222
  validationTrackKey(validation, index) {
4197
- const compareValue = validation.options?.compareValue ??
4198
- validation.options?.value ??
4199
- `${validation.options?.min ?? ''}-${validation.options?.max ?? ''}`;
4223
+ const compareValue = validation.options?.compareValue ?? validation.options?.value ?? `${validation.options?.min ?? ''}-${validation.options?.max ?? ''}`;
4200
4224
  return `${index}-${validation.rule}-${this.validationRevision()}-${compareValue}-${this.minValue() ?? ''}`;
4201
4225
  }
4202
4226
  validationMessage(validation) {
@@ -4210,6 +4234,7 @@ class AXPDateTimeBoxWidgetEditComponent extends AXPValueWidgetComponent {
4210
4234
  }
4211
4235
  handleValueChange(e) {
4212
4236
  if (e.isUserInteraction) {
4237
+ this.#hasUserInteracted = true;
4213
4238
  this.setValue(this.normalizeFieldValue(e.value));
4214
4239
  }
4215
4240
  }
@@ -4268,9 +4293,7 @@ class AXPDateTimeBoxWidgetEditComponent extends AXPValueWidgetComponent {
4268
4293
  async translatePresets(presets) {
4269
4294
  const translated = await Promise.all(presets.map(async (preset) => ({
4270
4295
  id: preset.id,
4271
- title: preset.title.startsWith('@')
4272
- ? await this.translationService.translateAsync(preset.title)
4273
- : preset.title,
4296
+ title: preset.title.startsWith('@') ? await this.translationService.translateAsync(preset.title) : preset.title,
4274
4297
  })));
4275
4298
  this.translatedPresets.set(translated);
4276
4299
  }
@@ -4502,21 +4525,11 @@ class AXPDateTimeBoxWidgetEditComponent extends AXPValueWidgetComponent {
4502
4525
  return cls;
4503
4526
  }
4504
4527
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDateTimeBoxWidgetEditComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4505
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPDateTimeBoxWidgetEditComponent, isStandalone: true, selector: "axp-date-time-box-widget-edit", host: { properties: { "class": "this.__class" } }, viewQueries: [{ propertyName: "lookup", first: true, predicate: ["lookup"], descendants: true, isSignal: true }, { propertyName: "standardDateTimeBox", first: true, predicate: ["standardDateTimeBox"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<!-- Filter mode: grid/list filters with operation metadata and optional preset ranges -->\n@if (filterMode()) {\n <!-- Simple filter UI: operation picker + one or two datetime inputs -->\n @if (filterUi() === 'simple') {\n <div class=\"flex items-center w-full\">\n <!-- Between operation: from / to range inputs -->\n @if (operation().type === 'between') {\n <div class=\"flex-1 flex gap-2\">\n <ax-datetime-box\n #dateTimeBox\n class=\"w-full\"\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [minValue]=\"filterFromMinValue()\"\n [maxValue]=\"filterFromMaxValue()\"\n [placeholder]=\"'@general:terms.common.from' | translate | async\"\n [disabled]=\"isValuelessOperation()\"\n [ngModel]=\"filterRangeValue().from\"\n (onValueChanged)=\"handleFilterValueChange($event, 'from')\"\n >\n <ax-clear-button></ax-clear-button>\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-datetime-box>\n <ax-datetime-box\n class=\"w-full\"\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [minValue]=\"filterToMinValue()\"\n [maxValue]=\"filterToMaxValue()\"\n [placeholder]=\"'@general:terms.common.to' | translate | async\"\n [disabled]=\"isValuelessOperation()\"\n [ngModel]=\"filterRangeValue().to\"\n (onValueChanged)=\"handleFilterValueChange($event, 'to')\"\n >\n <ax-clear-button></ax-clear-button>\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-datetime-box>\n </div>\n } @else {\n <!-- Single-value operations: equal, greaterThan, lessThan, isEmpty, isNotEmpty, etc. -->\n <ax-datetime-box\n #dateTimeBox\n class=\"flex-1\"\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [placeholder]=\"(placeholder() | translate | async) ?? ''\"\n [disabled]=\"isValuelessOperation()\"\n [ngModel]=\"filterValue()\"\n (onValueChanged)=\"handleFilterValueChange($event, 'self')\"\n >\n <ax-clear-button></ax-clear-button>\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-datetime-box>\n }\n\n <!-- Operation selector (equal, between, isEmpty, ...) -->\n <axp-filter-operations\n type=\"datetime\"\n [operations]=\"filterOperations()\"\n [selectedOperation]=\"operation().type\"\n (selectedOperationChange)=\"handleOperationChange($event)\"\n ></axp-filter-operations>\n </div>\n } @else {\n <!-- Presets filter UI: relative ranges (Today, This Week, ...) plus manual inputs -->\n <div class=\"flex flex-col items-center w-full\">\n <!-- Preset dropdown (Today, Yesterday, This Week, Between, Greater Than, ...) -->\n @if (resolvedPresets().length) {\n <ax-lookup\n #lookup\n mode=\"drop-down-list\"\n class=\"w-full\"\n [dataSource]=\"translatedPresets()\"\n [valueField]=\"'id'\"\n [textField]=\"'title'\"\n [searchable]=\"false\"\n [placeholder]=\"('@general:actions.select.title' | translate | async) ?? ''\"\n [ngModel]=\"selectedPresetId()\"\n (onValueChanged)=\"handlePresetChange($event)\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-lookup>\n }\n\n <!-- Manual preset: custom between range -->\n @if (selectedManualPreset()?.operationType === 'between') {\n <div class=\"flex gap-2 mt-2 w-full\">\n <ax-datetime-box\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [minValue]=\"filterFromMinValue()\"\n [maxValue]=\"filterFromMaxValue()\"\n [placeholder]=\"'@general:terms.common.from' | translate | async\"\n [ngModel]=\"filterRangeValue().from\"\n (onValueChanged)=\"handleFilterValueChange($event, 'from')\"\n >\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n <ax-clear-button></ax-clear-button>\n </ax-datetime-box>\n <ax-datetime-box\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [minValue]=\"filterToMinValue()\"\n [maxValue]=\"filterToMaxValue()\"\n [placeholder]=\"'@general:terms.common.to' | translate | async\"\n [ngModel]=\"filterRangeValue().to\"\n (onValueChanged)=\"handleFilterValueChange($event, 'to')\"\n >\n <ax-clear-button></ax-clear-button>\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-datetime-box>\n </div>\n }\n\n <!-- Manual preset: single bound for greaterThan / lessThan -->\n @if (\n selectedManualPreset()?.operationType === 'greaterThan' ||\n selectedManualPreset()?.operationType === 'lessThan'\n ) {\n <div class=\"w-full mt-2\">\n <ax-datetime-box\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [ngModel]=\"filterValue()\"\n (onValueChanged)=\"handleFilterValueChange($event, 'self')\"\n >\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n <ax-clear-button></ax-clear-button>\n </ax-datetime-box>\n </div>\n }\n </div>\n }\n} @else {\n <!-- Standard form edit: single date/time value bound to entity or form field -->\n <ax-datetime-box\n #standardDateTimeBox\n [ngModel]=\"getValue()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n (onValueChanged)=\"handleValueChange($event)\"\n [minValue]=\"minValue()\"\n [maxValue]=\"maxValue()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [format]=\"calendarFormat()\"\n [placeholder]=\"placeholder()\"\n >\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n @if (clearButton()) {\n <ax-clear-button></ax-clear-button>\n }\n </ax-datetime-box>\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXValidationModule }, { kind: "ngmodule", type: AXDateTimeBoxModule }, { kind: "component", type: i3$2.AXDateTimeBoxComponent, selector: "ax-datetime-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "depth", "id", "type", "look", "holidayDates", "allowTyping", "picker", "calendar", "weekend", "weekdays", "calendarLook", "yearRange", "boxLook", "format"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "onOpened", "onClosed", "readonlyChange", "disabledChange", "formatChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { 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", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPFilterOperationsComponent, selector: "axp-filter-operations", inputs: ["selectedOperation", "type", "operations"], outputs: ["selectedOperationChange"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4528
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPDateTimeBoxWidgetEditComponent, isStandalone: true, selector: "axp-date-time-box-widget-edit", host: { properties: { "class": "this.__class" } }, viewQueries: [{ propertyName: "lookup", first: true, predicate: ["lookup"], descendants: true, isSignal: true }, { propertyName: "standardDateTimeBox", first: true, predicate: ["standardDateTimeBox"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<!-- Filter mode: grid/list filters with operation metadata and optional preset ranges -->\n@if (filterMode()) {\n <!-- Simple filter UI: operation picker + one or two datetime inputs -->\n @if (filterUi() === 'simple') {\n <div class=\"flex items-center w-full\">\n <!-- Between operation: from / to range inputs -->\n @if (operation().type === 'between') {\n <div class=\"flex-1 flex gap-2\">\n <ax-datetime-box\n #dateTimeBox\n class=\"w-full\"\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [minValue]=\"filterFromMinValue()\"\n [maxValue]=\"filterFromMaxValue()\"\n [placeholder]=\"'@general:terms.common.from' | translate | async\"\n [disabled]=\"isValuelessOperation()\"\n [ngModel]=\"filterRangeValue().from\"\n (onValueChanged)=\"handleFilterValueChange($event, 'from')\"\n >\n <ax-clear-button></ax-clear-button>\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-datetime-box>\n <ax-datetime-box\n class=\"w-full\"\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [minValue]=\"filterToMinValue()\"\n [maxValue]=\"filterToMaxValue()\"\n [placeholder]=\"'@general:terms.common.to' | translate | async\"\n [disabled]=\"isValuelessOperation()\"\n [ngModel]=\"filterRangeValue().to\"\n (onValueChanged)=\"handleFilterValueChange($event, 'to')\"\n >\n <ax-clear-button></ax-clear-button>\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-datetime-box>\n </div>\n } @else {\n <!-- Single-value operations: equal, greaterThan, lessThan, isEmpty, isNotEmpty, etc. -->\n <ax-datetime-box\n #dateTimeBox\n class=\"flex-1\"\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [placeholder]=\"(placeholder() | translate | async) ?? ''\"\n [disabled]=\"isValuelessOperation()\"\n [ngModel]=\"filterValue()\"\n (onValueChanged)=\"handleFilterValueChange($event, 'self')\"\n >\n <ax-clear-button></ax-clear-button>\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-datetime-box>\n }\n\n <!-- Operation selector (equal, between, isEmpty, ...) -->\n <axp-filter-operations\n type=\"datetime\"\n [operations]=\"filterOperations()\"\n [selectedOperation]=\"operation().type\"\n (selectedOperationChange)=\"handleOperationChange($event)\"\n ></axp-filter-operations>\n </div>\n } @else {\n <!-- Presets filter UI: relative ranges (Today, This Week, ...) plus manual inputs -->\n <div class=\"flex flex-col items-center w-full\">\n <!-- Preset dropdown (Today, Yesterday, This Week, Between, Greater Than, ...) -->\n @if (resolvedPresets().length) {\n <ax-lookup\n #lookup\n mode=\"drop-down-list\"\n class=\"w-full\"\n [dataSource]=\"translatedPresets()\"\n [valueField]=\"'id'\"\n [textField]=\"'title'\"\n [searchable]=\"false\"\n [placeholder]=\"('@general:actions.select.title' | translate | async) ?? ''\"\n [ngModel]=\"selectedPresetId()\"\n (onValueChanged)=\"handlePresetChange($event)\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-lookup>\n }\n\n <!-- Manual preset: custom between range -->\n @if (selectedManualPreset()?.operationType === 'between') {\n <div class=\"flex gap-2 mt-2 w-full\">\n <ax-datetime-box\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [minValue]=\"filterFromMinValue()\"\n [maxValue]=\"filterFromMaxValue()\"\n [placeholder]=\"'@general:terms.common.from' | translate | async\"\n [ngModel]=\"filterRangeValue().from\"\n (onValueChanged)=\"handleFilterValueChange($event, 'from')\"\n >\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n <ax-clear-button></ax-clear-button>\n </ax-datetime-box>\n <ax-datetime-box\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [minValue]=\"filterToMinValue()\"\n [maxValue]=\"filterToMaxValue()\"\n [placeholder]=\"'@general:terms.common.to' | translate | async\"\n [ngModel]=\"filterRangeValue().to\"\n (onValueChanged)=\"handleFilterValueChange($event, 'to')\"\n >\n <ax-clear-button></ax-clear-button>\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-datetime-box>\n </div>\n }\n\n <!-- Manual preset: single bound for greaterThan / lessThan -->\n @if (\n selectedManualPreset()?.operationType === 'greaterThan' ||\n selectedManualPreset()?.operationType === 'lessThan'\n ) {\n <div class=\"w-full mt-2\">\n <ax-datetime-box\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [ngModel]=\"filterValue()\"\n (onValueChanged)=\"handleFilterValueChange($event, 'self')\"\n >\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n <ax-clear-button></ax-clear-button>\n </ax-datetime-box>\n </div>\n }\n </div>\n }\n} @else {\n <!-- Standard form edit: single date/time value bound to entity or form field -->\n <ax-datetime-box\n #standardDateTimeBox\n [ngModel]=\"getValue()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n (onValueChanged)=\"handleValueChange($event)\"\n [minValue]=\"minValue()\"\n [maxValue]=\"maxValue()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [format]=\"calendarFormat()\"\n [placeholder]=\"placeholder()\"\n >\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n @if (clearButton()) {\n <ax-clear-button></ax-clear-button>\n }\n </ax-datetime-box>\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXValidationModule }, { kind: "ngmodule", type: AXDateTimeBoxModule }, { kind: "component", type: i3$2.AXDateTimeBoxComponent, selector: "ax-datetime-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "depth", "id", "type", "look", "holidayDates", "allowTyping", "picker", "calendar", "weekend", "weekdays", "calendarLook", "yearRange", "boxLook", "format"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "onOpened", "onClosed", "readonlyChange", "disabledChange", "formatChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { 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: AXTranslationModule }, { kind: "component", type: AXPFilterOperationsComponent, selector: "axp-filter-operations", inputs: ["selectedOperation", "type", "operations"], outputs: ["selectedOperationChange"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4506
4529
  }
4507
4530
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDateTimeBoxWidgetEditComponent, decorators: [{
4508
4531
  type: Component,
4509
- args: [{ selector: 'axp-date-time-box-widget-edit', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
4510
- CommonModule,
4511
- FormsModule,
4512
- AXFormModule,
4513
- AXValidationModule,
4514
- AXDateTimeBoxModule,
4515
- AXDecoratorModule,
4516
- AXLookupComponent,
4517
- AXTranslationModule,
4518
- AXPFilterOperationsComponent,
4519
- ], template: "<!-- Filter mode: grid/list filters with operation metadata and optional preset ranges -->\n@if (filterMode()) {\n <!-- Simple filter UI: operation picker + one or two datetime inputs -->\n @if (filterUi() === 'simple') {\n <div class=\"flex items-center w-full\">\n <!-- Between operation: from / to range inputs -->\n @if (operation().type === 'between') {\n <div class=\"flex-1 flex gap-2\">\n <ax-datetime-box\n #dateTimeBox\n class=\"w-full\"\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [minValue]=\"filterFromMinValue()\"\n [maxValue]=\"filterFromMaxValue()\"\n [placeholder]=\"'@general:terms.common.from' | translate | async\"\n [disabled]=\"isValuelessOperation()\"\n [ngModel]=\"filterRangeValue().from\"\n (onValueChanged)=\"handleFilterValueChange($event, 'from')\"\n >\n <ax-clear-button></ax-clear-button>\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-datetime-box>\n <ax-datetime-box\n class=\"w-full\"\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [minValue]=\"filterToMinValue()\"\n [maxValue]=\"filterToMaxValue()\"\n [placeholder]=\"'@general:terms.common.to' | translate | async\"\n [disabled]=\"isValuelessOperation()\"\n [ngModel]=\"filterRangeValue().to\"\n (onValueChanged)=\"handleFilterValueChange($event, 'to')\"\n >\n <ax-clear-button></ax-clear-button>\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-datetime-box>\n </div>\n } @else {\n <!-- Single-value operations: equal, greaterThan, lessThan, isEmpty, isNotEmpty, etc. -->\n <ax-datetime-box\n #dateTimeBox\n class=\"flex-1\"\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [placeholder]=\"(placeholder() | translate | async) ?? ''\"\n [disabled]=\"isValuelessOperation()\"\n [ngModel]=\"filterValue()\"\n (onValueChanged)=\"handleFilterValueChange($event, 'self')\"\n >\n <ax-clear-button></ax-clear-button>\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-datetime-box>\n }\n\n <!-- Operation selector (equal, between, isEmpty, ...) -->\n <axp-filter-operations\n type=\"datetime\"\n [operations]=\"filterOperations()\"\n [selectedOperation]=\"operation().type\"\n (selectedOperationChange)=\"handleOperationChange($event)\"\n ></axp-filter-operations>\n </div>\n } @else {\n <!-- Presets filter UI: relative ranges (Today, This Week, ...) plus manual inputs -->\n <div class=\"flex flex-col items-center w-full\">\n <!-- Preset dropdown (Today, Yesterday, This Week, Between, Greater Than, ...) -->\n @if (resolvedPresets().length) {\n <ax-lookup\n #lookup\n mode=\"drop-down-list\"\n class=\"w-full\"\n [dataSource]=\"translatedPresets()\"\n [valueField]=\"'id'\"\n [textField]=\"'title'\"\n [searchable]=\"false\"\n [placeholder]=\"('@general:actions.select.title' | translate | async) ?? ''\"\n [ngModel]=\"selectedPresetId()\"\n (onValueChanged)=\"handlePresetChange($event)\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-lookup>\n }\n\n <!-- Manual preset: custom between range -->\n @if (selectedManualPreset()?.operationType === 'between') {\n <div class=\"flex gap-2 mt-2 w-full\">\n <ax-datetime-box\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [minValue]=\"filterFromMinValue()\"\n [maxValue]=\"filterFromMaxValue()\"\n [placeholder]=\"'@general:terms.common.from' | translate | async\"\n [ngModel]=\"filterRangeValue().from\"\n (onValueChanged)=\"handleFilterValueChange($event, 'from')\"\n >\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n <ax-clear-button></ax-clear-button>\n </ax-datetime-box>\n <ax-datetime-box\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [minValue]=\"filterToMinValue()\"\n [maxValue]=\"filterToMaxValue()\"\n [placeholder]=\"'@general:terms.common.to' | translate | async\"\n [ngModel]=\"filterRangeValue().to\"\n (onValueChanged)=\"handleFilterValueChange($event, 'to')\"\n >\n <ax-clear-button></ax-clear-button>\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-datetime-box>\n </div>\n }\n\n <!-- Manual preset: single bound for greaterThan / lessThan -->\n @if (\n selectedManualPreset()?.operationType === 'greaterThan' ||\n selectedManualPreset()?.operationType === 'lessThan'\n ) {\n <div class=\"w-full mt-2\">\n <ax-datetime-box\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [ngModel]=\"filterValue()\"\n (onValueChanged)=\"handleFilterValueChange($event, 'self')\"\n >\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n <ax-clear-button></ax-clear-button>\n </ax-datetime-box>\n </div>\n }\n </div>\n }\n} @else {\n <!-- Standard form edit: single date/time value bound to entity or form field -->\n <ax-datetime-box\n #standardDateTimeBox\n [ngModel]=\"getValue()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n (onValueChanged)=\"handleValueChange($event)\"\n [minValue]=\"minValue()\"\n [maxValue]=\"maxValue()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [format]=\"calendarFormat()\"\n [placeholder]=\"placeholder()\"\n >\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n @if (clearButton()) {\n <ax-clear-button></ax-clear-button>\n }\n </ax-datetime-box>\n}\n" }]
4532
+ args: [{ selector: 'axp-date-time-box-widget-edit', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, FormsModule, AXFormModule, AXValidationModule, AXDateTimeBoxModule, AXDecoratorModule, AXLookupComponent, AXTranslationModule, AXPFilterOperationsComponent], template: "<!-- Filter mode: grid/list filters with operation metadata and optional preset ranges -->\n@if (filterMode()) {\n <!-- Simple filter UI: operation picker + one or two datetime inputs -->\n @if (filterUi() === 'simple') {\n <div class=\"flex items-center w-full\">\n <!-- Between operation: from / to range inputs -->\n @if (operation().type === 'between') {\n <div class=\"flex-1 flex gap-2\">\n <ax-datetime-box\n #dateTimeBox\n class=\"w-full\"\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [minValue]=\"filterFromMinValue()\"\n [maxValue]=\"filterFromMaxValue()\"\n [placeholder]=\"'@general:terms.common.from' | translate | async\"\n [disabled]=\"isValuelessOperation()\"\n [ngModel]=\"filterRangeValue().from\"\n (onValueChanged)=\"handleFilterValueChange($event, 'from')\"\n >\n <ax-clear-button></ax-clear-button>\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-datetime-box>\n <ax-datetime-box\n class=\"w-full\"\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [minValue]=\"filterToMinValue()\"\n [maxValue]=\"filterToMaxValue()\"\n [placeholder]=\"'@general:terms.common.to' | translate | async\"\n [disabled]=\"isValuelessOperation()\"\n [ngModel]=\"filterRangeValue().to\"\n (onValueChanged)=\"handleFilterValueChange($event, 'to')\"\n >\n <ax-clear-button></ax-clear-button>\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-datetime-box>\n </div>\n } @else {\n <!-- Single-value operations: equal, greaterThan, lessThan, isEmpty, isNotEmpty, etc. -->\n <ax-datetime-box\n #dateTimeBox\n class=\"flex-1\"\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [placeholder]=\"(placeholder() | translate | async) ?? ''\"\n [disabled]=\"isValuelessOperation()\"\n [ngModel]=\"filterValue()\"\n (onValueChanged)=\"handleFilterValueChange($event, 'self')\"\n >\n <ax-clear-button></ax-clear-button>\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-datetime-box>\n }\n\n <!-- Operation selector (equal, between, isEmpty, ...) -->\n <axp-filter-operations\n type=\"datetime\"\n [operations]=\"filterOperations()\"\n [selectedOperation]=\"operation().type\"\n (selectedOperationChange)=\"handleOperationChange($event)\"\n ></axp-filter-operations>\n </div>\n } @else {\n <!-- Presets filter UI: relative ranges (Today, This Week, ...) plus manual inputs -->\n <div class=\"flex flex-col items-center w-full\">\n <!-- Preset dropdown (Today, Yesterday, This Week, Between, Greater Than, ...) -->\n @if (resolvedPresets().length) {\n <ax-lookup\n #lookup\n mode=\"drop-down-list\"\n class=\"w-full\"\n [dataSource]=\"translatedPresets()\"\n [valueField]=\"'id'\"\n [textField]=\"'title'\"\n [searchable]=\"false\"\n [placeholder]=\"('@general:actions.select.title' | translate | async) ?? ''\"\n [ngModel]=\"selectedPresetId()\"\n (onValueChanged)=\"handlePresetChange($event)\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-lookup>\n }\n\n <!-- Manual preset: custom between range -->\n @if (selectedManualPreset()?.operationType === 'between') {\n <div class=\"flex gap-2 mt-2 w-full\">\n <ax-datetime-box\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [minValue]=\"filterFromMinValue()\"\n [maxValue]=\"filterFromMaxValue()\"\n [placeholder]=\"'@general:terms.common.from' | translate | async\"\n [ngModel]=\"filterRangeValue().from\"\n (onValueChanged)=\"handleFilterValueChange($event, 'from')\"\n >\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n <ax-clear-button></ax-clear-button>\n </ax-datetime-box>\n <ax-datetime-box\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [minValue]=\"filterToMinValue()\"\n [maxValue]=\"filterToMaxValue()\"\n [placeholder]=\"'@general:terms.common.to' | translate | async\"\n [ngModel]=\"filterRangeValue().to\"\n (onValueChanged)=\"handleFilterValueChange($event, 'to')\"\n >\n <ax-clear-button></ax-clear-button>\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-datetime-box>\n </div>\n }\n\n <!-- Manual preset: single bound for greaterThan / lessThan -->\n @if (\n selectedManualPreset()?.operationType === 'greaterThan' ||\n selectedManualPreset()?.operationType === 'lessThan'\n ) {\n <div class=\"w-full mt-2\">\n <ax-datetime-box\n [format]=\"calendarFormat()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n [ngModel]=\"filterValue()\"\n (onValueChanged)=\"handleFilterValueChange($event, 'self')\"\n >\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n <ax-clear-button></ax-clear-button>\n </ax-datetime-box>\n </div>\n }\n </div>\n }\n} @else {\n <!-- Standard form edit: single date/time value bound to entity or form field -->\n <ax-datetime-box\n #standardDateTimeBox\n [ngModel]=\"getValue()\"\n [picker]=\"format()\"\n [depth]=\"inputDepth()\"\n (onValueChanged)=\"handleValueChange($event)\"\n [minValue]=\"minValue()\"\n [maxValue]=\"maxValue()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [format]=\"calendarFormat()\"\n [placeholder]=\"placeholder()\"\n >\n @for (validation of validationRules(); track validationTrackKey(validation, $index)) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"validationMessage(validation)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n @if (clearButton()) {\n <ax-clear-button></ax-clear-button>\n }\n </ax-datetime-box>\n}\n" }]
4520
4533
  }], ctorParameters: () => [], propDecorators: { lookup: [{ type: i0.ViewChild, args: ['lookup', { isSignal: true }] }], standardDateTimeBox: [{ type: i0.ViewChild, args: ['standardDateTimeBox', { isSignal: true }] }], __class: [{
4521
4534
  type: HostBinding,
4522
4535
  args: ['class']
@@ -4947,7 +4960,15 @@ class AXPLargeTextWidgetEditComponent extends AXPValueWidgetComponent {
4947
4960
  this.currentLanguage = toSignal(this.translationService.langChanges$, {
4948
4961
  initialValue: this.translationService.getActiveLang(),
4949
4962
  });
4950
- this.getCurrentText = computed(() => this.translationService.resolve(this.getValue(), this.currentLanguage()), /* @ts-ignore */
4963
+ this.getCurrentText = computed(() => {
4964
+ const value = this.getValue();
4965
+ if ((this.disabled() || this.readonly()) &&
4966
+ typeof value === 'string' &&
4967
+ value.trim().startsWith('@')) {
4968
+ return this.translationService.translateSync(value.trim()) || value;
4969
+ }
4970
+ return this.translationService.resolve(value, this.currentLanguage());
4971
+ }, /* @ts-ignore */
4951
4972
  ...(ngDevMode ? [{ debugName: "getCurrentText" }] : /* istanbul ignore next */ []));
4952
4973
  }
4953
4974
  handleValueChange(e) {
@@ -5026,7 +5047,7 @@ class AXPLargeTextWidgetEditComponent extends AXPValueWidgetComponent {
5026
5047
  }
5027
5048
  </div>
5028
5049
  </div>
5029
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: "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: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXTextAreaModule }, { kind: "component", type: i4.AXTextAreaComponent, selector: "ax-text-area", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "placeholder", "maxLength", "look", "rows", "allowResize", "showCounter", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5050
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: "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: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXTextAreaModule }, { kind: "component", type: i4.AXTextAreaComponent, selector: "ax-text-area", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "placeholder", "maxLength", "look", "rows", "allowResize", "showCounter", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5030
5051
  }
5031
5052
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLargeTextWidgetEditComponent, decorators: [{
5032
5053
  type: Component,
@@ -5595,7 +5616,7 @@ class AXPNumberBoxWidgetEditComponent extends AXPValueWidgetComponent {
5595
5616
  </ax-button>
5596
5617
  }
5597
5618
  </div>
5598
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXNumberBoxModule }, { kind: "component", type: i1$8.AXNumberBoxComponent, selector: "ax-number-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "minValue", "maxValue", "showSpinButtons", "thousandsSeparator", "decimals", "changeOnScroll", "step"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "thousandsSeparatorChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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: "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: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5619
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXNumberBoxModule }, { kind: "component", type: i1$8.AXNumberBoxComponent, selector: "ax-number-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "minValue", "maxValue", "showSpinButtons", "thousandsSeparator", "decimals", "changeOnScroll", "step"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "thousandsSeparatorChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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: "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: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5599
5620
  }
5600
5621
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPNumberBoxWidgetEditComponent, decorators: [{
5601
5622
  type: Component,
@@ -6886,7 +6907,7 @@ class AXPRichTextWidgetColumnComponent extends AXPColumnWidgetComponent {
6886
6907
  } @else {
6887
6908
  <span class="text-muted">---</span>
6888
6909
  }
6889
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: AXSafePipe, name: "safe" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
6910
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: AXSafePipe, name: "safe" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
6890
6911
  }
6891
6912
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPRichTextWidgetColumnComponent, decorators: [{
6892
6913
  type: Component,
@@ -7110,7 +7131,7 @@ class AXPRichTextWidgetEditComponent extends AXPValueWidgetComponent {
7110
7131
  [options]="validation.options"
7111
7132
  ></ax-validation-rule>
7112
7133
  }
7113
- </ax-wysiwyg-container>`, 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: AXWysiwygModule }, { kind: "component", type: i2$5.AXWysiwygContainerComponent, selector: "ax-wysiwyg-container", inputs: ["look", "readonly", "disabled", "value", "placeHolder", "initialLine"], outputs: ["onValueChanged"] }, { kind: "component", type: i2$5.AXWysiwygViewComponent, selector: "ax-wysiwyg-view" }, { kind: "component", type: i2$5.AXWysiwygAlignmentComponent, selector: "ax-wysiwyg-alignment" }, { kind: "component", type: i2$5.AXWysiwygColorsComponent, selector: "ax-wysiwyg-colors" }, { kind: "component", type: i2$5.AXWysiwygFontStyleComponent, selector: "ax-wysiwyg-font-style" }, { kind: "component", type: i2$5.AXWysiwygHistoryComponent, selector: "ax-wysiwyg-history" }, { kind: "component", type: i2$5.AXWysiwygInsertComponent, selector: "ax-wysiwyg-insert" }, { kind: "component", type: i2$5.AXWysiwygListComponent, selector: "ax-wysiwyg-list" }, { kind: "component", type: i2$5.AXWysiwygToolbarComponent, selector: "ax-wysiwyg-toolbar" }, { 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$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
7134
+ </ax-wysiwyg-container>`, 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: AXWysiwygModule }, { kind: "component", type: i2$5.AXWysiwygContainerComponent, selector: "ax-wysiwyg-container", inputs: ["look", "readonly", "disabled", "value", "placeHolder", "initialLine"], outputs: ["onValueChanged"] }, { kind: "component", type: i2$5.AXWysiwygViewComponent, selector: "ax-wysiwyg-view" }, { kind: "component", type: i2$5.AXWysiwygAlignmentComponent, selector: "ax-wysiwyg-alignment" }, { kind: "component", type: i2$5.AXWysiwygColorsComponent, selector: "ax-wysiwyg-colors" }, { kind: "component", type: i2$5.AXWysiwygFontStyleComponent, selector: "ax-wysiwyg-font-style" }, { kind: "component", type: i2$5.AXWysiwygHistoryComponent, selector: "ax-wysiwyg-history" }, { kind: "component", type: i2$5.AXWysiwygInsertComponent, selector: "ax-wysiwyg-insert" }, { kind: "component", type: i2$5.AXWysiwygListComponent, selector: "ax-wysiwyg-list" }, { kind: "component", type: i2$5.AXWysiwygToolbarComponent, selector: "ax-wysiwyg-toolbar" }, { 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$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
7114
7135
  }
7115
7136
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPRichTextWidgetEditComponent, decorators: [{
7116
7137
  type: Component,
@@ -8122,7 +8143,7 @@ class AXPSelectBoxWidgetEditComponent extends AXPDataListWidgetComponent {
8122
8143
  return cls;
8123
8144
  }
8124
8145
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPSelectBoxWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
8125
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPSelectBoxWidgetEditComponent, isStandalone: true, selector: "axp-select-box-widget-edit", host: { properties: { "class": "this.__class" }, classAttribute: "block flex-1" }, viewQueries: [{ propertyName: "comboBox", first: true, predicate: AXComboBoxComponent, descendants: true, isSignal: true }, { propertyName: "lookup", first: true, predicate: AXLookupComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@if (showSelectBoxSkeleton()) {\n <!-- ----- Loading indicator while registry data source resolves ----- -->\n <ax-skeleton [animated]=\"true\" class=\"axp-select-box-skeleton\"></ax-skeleton>\n}\n<!-- ----- In-memory list rendered with combo-box ----- -->\n@else if (isArraySource()) {\n <ax-combo-box\n [placeholder]=\"(placeholder() | translate | async) ?? ''\"\n [caption]=\"(placeholder() | translate | async) ?? ''\"\n [items]=\"comboItems()\"\n [value]=\"comboValue()\"\n [disabled]=\"isSelectBoxDisabled()\"\n [multiple]=\"multiple()\"\n [readonly]=\"readonly()\"\n [searchable]=\"allowSearch()\"\n (onValueChanged)=\"handleComboValueChange($event)\"\n >\n <!--------------------------------------------------------------->\n <!-- ----- Clear button ----- -->\n @if (hasClearButton() && !filterMode()) {\n <ax-clear-button></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-combo-box>\n}\n<!-- ----- Registry or AXDataSource list rendered with lookup ----- -->\n@else if (editorKey()) {\n <ax-lookup\n [placeholder]=\"(placeholder() | translate | async) ?? ''\"\n [caption]=\"(placeholder() | translate | async) ?? ''\"\n [mode]=\"lookupMode()\"\n [dataSource]=\"effectiveDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [value]=\"editorValue()\"\n [valueItems]=\"selectedItems()\"\n [disabled]=\"isSelectBoxDisabled()\"\n [readonly]=\"readonly()\"\n [searchable]=\"allowSearch()\"\n [itemTemplate]=\"multiple() ? lookupItemTemplate : lookupDropDownListItemTemplate\"\n [selectedTemplate]=\"lookupItemTemplate\"\n (onValueChanged)=\"handleLookupValueChange($event)\"\n >\n <!--------------------------------------------------------------->\n <!-- ----- Clear button ----- -->\n @if (hasClearButton() && !filterMode()) {\n <ax-clear-button></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-lookup>\n}\n\n<!-- ----- Lookup item and selected-value label ----- -->\n<ng-template #lookupItemTemplate let-item>\n <span class=\"ax-lookup-option-text\">{{ getLookupItemLabel(item) | translate | async }}</span>\n</ng-template>\n<!-- ----- Drop-down-list rows: library skips .ax-lookup-option chrome when itemTemplate is set ----- -->\n<ng-template #lookupDropDownListItemTemplate let-item>\n <span class=\"flex h-full w-full min-w-0 items-center px-3 text-sm\">\n <span class=\"ax-lookup-option-text min-w-0 flex-1 truncate\">{{ getLookupItemLabel(item) | translate | async }}</span>\n </span>\n</ng-template>\n", styles: [":host .axp-select-box-skeleton{display:block;width:100%;height:2.5rem;border-radius:var(--ax-sys-radius-md, .375rem)}\n"], dependencies: [{ kind: "component", type: AXComboBoxComponent, selector: "ax-combo-box", inputs: ["name", "items", "searchable", "multiple", "adaptivityEnabled", "caption", "alternate", "placeholder", "searchPlaceholder", "emptyTemplate", "itemTemplate", "selectedTemplate", "disabled", "readonly", "look", "value"], outputs: ["lookChange", "valueChange", "onValueChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { 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", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i3$5.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
8146
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPSelectBoxWidgetEditComponent, isStandalone: true, selector: "axp-select-box-widget-edit", host: { properties: { "class": "this.__class" }, classAttribute: "block flex-1" }, viewQueries: [{ propertyName: "comboBox", first: true, predicate: AXComboBoxComponent, descendants: true, isSignal: true }, { propertyName: "lookup", first: true, predicate: AXLookupComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@if (showSelectBoxSkeleton()) {\n <!-- ----- Loading indicator while registry data source resolves ----- -->\n <ax-skeleton [animated]=\"true\" class=\"axp-select-box-skeleton\"></ax-skeleton>\n}\n<!-- ----- In-memory list rendered with combo-box ----- -->\n@else if (isArraySource()) {\n <ax-combo-box\n [placeholder]=\"(placeholder() | translate | async) ?? ''\"\n [caption]=\"(placeholder() | translate | async) ?? ''\"\n [items]=\"comboItems()\"\n [value]=\"comboValue()\"\n [disabled]=\"isSelectBoxDisabled()\"\n [multiple]=\"multiple()\"\n [readonly]=\"readonly()\"\n [searchable]=\"allowSearch()\"\n (onValueChanged)=\"handleComboValueChange($event)\"\n >\n <!--------------------------------------------------------------->\n <!-- ----- Clear button ----- -->\n @if (hasClearButton() && !filterMode()) {\n <ax-clear-button></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-combo-box>\n}\n<!-- ----- Registry or AXDataSource list rendered with lookup ----- -->\n@else if (editorKey()) {\n <ax-lookup\n [placeholder]=\"(placeholder() | translate | async) ?? ''\"\n [caption]=\"(placeholder() | translate | async) ?? ''\"\n [mode]=\"lookupMode()\"\n [dataSource]=\"effectiveDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [value]=\"editorValue()\"\n [valueItems]=\"selectedItems()\"\n [disabled]=\"isSelectBoxDisabled()\"\n [readonly]=\"readonly()\"\n [searchable]=\"allowSearch()\"\n [itemTemplate]=\"multiple() ? lookupItemTemplate : lookupDropDownListItemTemplate\"\n [selectedTemplate]=\"lookupItemTemplate\"\n (onValueChanged)=\"handleLookupValueChange($event)\"\n >\n <!--------------------------------------------------------------->\n <!-- ----- Clear button ----- -->\n @if (hasClearButton() && !filterMode()) {\n <ax-clear-button></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-lookup>\n}\n\n<!-- ----- Lookup item and selected-value label ----- -->\n<ng-template #lookupItemTemplate let-item let-highlightText=\"highlightText\">\n <span class=\"ax-lookup-option-text\">\n <ax-highlight-text\n [text]=\"(getLookupItemLabel(item) | translate | async) ?? ''\"\n [query]=\"highlightText ?? ''\"\n ></ax-highlight-text>\n </span>\n</ng-template>\n<!-- ----- Drop-down-list rows: library skips .ax-lookup-option chrome when itemTemplate is set ----- -->\n<ng-template #lookupDropDownListItemTemplate let-item let-highlightText=\"highlightText\">\n <span class=\"flex h-full w-full min-w-0 items-center px-3 text-sm\">\n <span class=\"ax-lookup-option-text min-w-0 flex-1 truncate\">\n <ax-highlight-text\n [text]=\"(getLookupItemLabel(item) | translate | async) ?? ''\"\n [query]=\"highlightText ?? ''\"\n ></ax-highlight-text>\n </span>\n </span>\n</ng-template>\n", styles: [":host .axp-select-box-skeleton{display:block;width:100%;height:2.5rem;border-radius:var(--ax-sys-radius-md, .375rem)}\n"], dependencies: [{ kind: "component", type: AXComboBoxComponent, selector: "ax-combo-box", inputs: ["name", "items", "searchable", "multiple", "adaptivityEnabled", "caption", "alternate", "placeholder", "searchPlaceholder", "highlightSearch", "emptyTemplate", "itemTemplate", "selectedTemplate", "disabled", "readonly", "look", "value"], outputs: ["lookChange", "valueChange", "onValueChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "component", type: AXHighlightTextComponent, selector: "ax-highlight-text", inputs: ["text", "query", "highlightDisabled", "highlightOptions"] }, { 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: AXSkeletonModule }, { kind: "component", type: i3$5.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
8126
8147
  }
8127
8148
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPSelectBoxWidgetEditComponent, decorators: [{
8128
8149
  type: Component,
@@ -8132,11 +8153,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
8132
8153
  AXComboBoxComponent,
8133
8154
  AXDecoratorModule,
8134
8155
  AXFormModule,
8156
+ AXHighlightTextComponent,
8135
8157
  AXLookupComponent,
8136
8158
  AXSkeletonModule,
8137
8159
  AXTranslationModule,
8138
8160
  AsyncPipe,
8139
- ], template: "@if (showSelectBoxSkeleton()) {\n <!-- ----- Loading indicator while registry data source resolves ----- -->\n <ax-skeleton [animated]=\"true\" class=\"axp-select-box-skeleton\"></ax-skeleton>\n}\n<!-- ----- In-memory list rendered with combo-box ----- -->\n@else if (isArraySource()) {\n <ax-combo-box\n [placeholder]=\"(placeholder() | translate | async) ?? ''\"\n [caption]=\"(placeholder() | translate | async) ?? ''\"\n [items]=\"comboItems()\"\n [value]=\"comboValue()\"\n [disabled]=\"isSelectBoxDisabled()\"\n [multiple]=\"multiple()\"\n [readonly]=\"readonly()\"\n [searchable]=\"allowSearch()\"\n (onValueChanged)=\"handleComboValueChange($event)\"\n >\n <!--------------------------------------------------------------->\n <!-- ----- Clear button ----- -->\n @if (hasClearButton() && !filterMode()) {\n <ax-clear-button></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-combo-box>\n}\n<!-- ----- Registry or AXDataSource list rendered with lookup ----- -->\n@else if (editorKey()) {\n <ax-lookup\n [placeholder]=\"(placeholder() | translate | async) ?? ''\"\n [caption]=\"(placeholder() | translate | async) ?? ''\"\n [mode]=\"lookupMode()\"\n [dataSource]=\"effectiveDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [value]=\"editorValue()\"\n [valueItems]=\"selectedItems()\"\n [disabled]=\"isSelectBoxDisabled()\"\n [readonly]=\"readonly()\"\n [searchable]=\"allowSearch()\"\n [itemTemplate]=\"multiple() ? lookupItemTemplate : lookupDropDownListItemTemplate\"\n [selectedTemplate]=\"lookupItemTemplate\"\n (onValueChanged)=\"handleLookupValueChange($event)\"\n >\n <!--------------------------------------------------------------->\n <!-- ----- Clear button ----- -->\n @if (hasClearButton() && !filterMode()) {\n <ax-clear-button></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-lookup>\n}\n\n<!-- ----- Lookup item and selected-value label ----- -->\n<ng-template #lookupItemTemplate let-item>\n <span class=\"ax-lookup-option-text\">{{ getLookupItemLabel(item) | translate | async }}</span>\n</ng-template>\n<!-- ----- Drop-down-list rows: library skips .ax-lookup-option chrome when itemTemplate is set ----- -->\n<ng-template #lookupDropDownListItemTemplate let-item>\n <span class=\"flex h-full w-full min-w-0 items-center px-3 text-sm\">\n <span class=\"ax-lookup-option-text min-w-0 flex-1 truncate\">{{ getLookupItemLabel(item) | translate | async }}</span>\n </span>\n</ng-template>\n", styles: [":host .axp-select-box-skeleton{display:block;width:100%;height:2.5rem;border-radius:var(--ax-sys-radius-md, .375rem)}\n"] }]
8161
+ ], template: "@if (showSelectBoxSkeleton()) {\n <!-- ----- Loading indicator while registry data source resolves ----- -->\n <ax-skeleton [animated]=\"true\" class=\"axp-select-box-skeleton\"></ax-skeleton>\n}\n<!-- ----- In-memory list rendered with combo-box ----- -->\n@else if (isArraySource()) {\n <ax-combo-box\n [placeholder]=\"(placeholder() | translate | async) ?? ''\"\n [caption]=\"(placeholder() | translate | async) ?? ''\"\n [items]=\"comboItems()\"\n [value]=\"comboValue()\"\n [disabled]=\"isSelectBoxDisabled()\"\n [multiple]=\"multiple()\"\n [readonly]=\"readonly()\"\n [searchable]=\"allowSearch()\"\n (onValueChanged)=\"handleComboValueChange($event)\"\n >\n <!--------------------------------------------------------------->\n <!-- ----- Clear button ----- -->\n @if (hasClearButton() && !filterMode()) {\n <ax-clear-button></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-combo-box>\n}\n<!-- ----- Registry or AXDataSource list rendered with lookup ----- -->\n@else if (editorKey()) {\n <ax-lookup\n [placeholder]=\"(placeholder() | translate | async) ?? ''\"\n [caption]=\"(placeholder() | translate | async) ?? ''\"\n [mode]=\"lookupMode()\"\n [dataSource]=\"effectiveDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [value]=\"editorValue()\"\n [valueItems]=\"selectedItems()\"\n [disabled]=\"isSelectBoxDisabled()\"\n [readonly]=\"readonly()\"\n [searchable]=\"allowSearch()\"\n [itemTemplate]=\"multiple() ? lookupItemTemplate : lookupDropDownListItemTemplate\"\n [selectedTemplate]=\"lookupItemTemplate\"\n (onValueChanged)=\"handleLookupValueChange($event)\"\n >\n <!--------------------------------------------------------------->\n <!-- ----- Clear button ----- -->\n @if (hasClearButton() && !filterMode()) {\n <ax-clear-button></ax-clear-button>\n }\n @for (validation of validationRules(); track $index) {\n <ax-validation-rule\n [rule]=\"validation.rule\"\n [message]=\"$safeNavigationMigration(validation.options?.message)\"\n [options]=\"validation.options\"\n ></ax-validation-rule>\n }\n </ax-lookup>\n}\n\n<!-- ----- Lookup item and selected-value label ----- -->\n<ng-template #lookupItemTemplate let-item let-highlightText=\"highlightText\">\n <span class=\"ax-lookup-option-text\">\n <ax-highlight-text\n [text]=\"(getLookupItemLabel(item) | translate | async) ?? ''\"\n [query]=\"highlightText ?? ''\"\n ></ax-highlight-text>\n </span>\n</ng-template>\n<!-- ----- Drop-down-list rows: library skips .ax-lookup-option chrome when itemTemplate is set ----- -->\n<ng-template #lookupDropDownListItemTemplate let-item let-highlightText=\"highlightText\">\n <span class=\"flex h-full w-full min-w-0 items-center px-3 text-sm\">\n <span class=\"ax-lookup-option-text min-w-0 flex-1 truncate\">\n <ax-highlight-text\n [text]=\"(getLookupItemLabel(item) | translate | async) ?? ''\"\n [query]=\"highlightText ?? ''\"\n ></ax-highlight-text>\n </span>\n </span>\n</ng-template>\n", styles: [":host .axp-select-box-skeleton{display:block;width:100%;height:2.5rem;border-radius:var(--ax-sys-radius-md, .375rem)}\n"] }]
8140
8162
  }], propDecorators: { comboBox: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXComboBoxComponent), { isSignal: true }] }], lookup: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXLookupComponent), { isSignal: true }] }], __class: [{
8141
8163
  type: HostBinding,
8142
8164
  args: ['class']
@@ -8405,7 +8427,7 @@ class AXPSelectionListWidgetDesignerComponent extends AXPDataListWidgetComponent
8405
8427
  [readonly]="readonly()"
8406
8428
  >
8407
8429
  </ax-selection-list>
8408
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXSelectionListModule }, { kind: "component", type: i2$4.AXSelectionListComponent, selector: "ax-selection-list", inputs: ["id", "name", "disabled", "readonly", "tabIndex", "size", "value", "valueField", "textField", "disabledField", "readonlyField", "multiple", "direction", "customTemplate", "showControl", "items", "look"], outputs: ["onValueChanged", "onBlur", "onFocus"] }, { kind: "ngmodule", type: AXFormModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
8430
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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: AXFormModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
8409
8431
  }
8410
8432
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPSelectionListWidgetDesignerComponent, decorators: [{
8411
8433
  type: Component,
@@ -8525,7 +8547,7 @@ class AXPSelectionListWidgetEditComponent extends AXPDataListWidgetComponent {
8525
8547
  ></ax-validation-rule>
8526
8548
  }
8527
8549
  </ax-selection-list>
8528
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXSelectionListModule }, { kind: "component", type: i2$4.AXSelectionListComponent, selector: "ax-selection-list", inputs: ["id", "name", "disabled", "readonly", "tabIndex", "size", "value", "valueField", "textField", "disabledField", "readonlyField", "multiple", "direction", "customTemplate", "showControl", "items", "look"], outputs: ["onValueChanged", "onBlur", "onFocus"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
8550
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
8529
8551
  }
8530
8552
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPSelectionListWidgetEditComponent, decorators: [{
8531
8553
  type: Component,
@@ -9517,7 +9539,7 @@ class AXPTemplateBoxWidgetEditComponent extends AXPValueWidgetComponent {
9517
9539
  </div>
9518
9540
  </div>
9519
9541
  </div>
9520
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: "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: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXTextAreaModule }, { kind: "component", type: i4.AXTextAreaComponent, selector: "ax-text-area", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "placeholder", "maxLength", "look", "rows", "allowResize", "showCounter", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i5$1.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i1$1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1$1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9542
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: "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: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXTextAreaModule }, { kind: "component", type: i4.AXTextAreaComponent, selector: "ax-text-area", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "placeholder", "maxLength", "look", "rows", "allowResize", "showCounter", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i5$1.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: i1$1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1$1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9521
9543
  }
9522
9544
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTemplateBoxWidgetEditComponent, decorators: [{
9523
9545
  type: Component,
@@ -9804,7 +9826,13 @@ class AXPTextBoxWidgetEditComponent extends AXPValueWidgetComponent {
9804
9826
  this.setValue(nextValue);
9805
9827
  }
9806
9828
  getCurrentText() {
9807
- return this.translationService.resolve(this.getValue(), this.currentLanguage());
9829
+ const value = this.getValue();
9830
+ if ((this.disabled() || this.readonly()) &&
9831
+ typeof value === 'string' &&
9832
+ value.trim().startsWith('@')) {
9833
+ return this.translationService.translateSync(value.trim()) || value;
9834
+ }
9835
+ return this.translationService.resolve(value, this.currentLanguage());
9808
9836
  }
9809
9837
  async openMultiLanguagePopup() {
9810
9838
  const node = {
@@ -9873,7 +9901,7 @@ class AXPTextBoxWidgetEditComponent extends AXPValueWidgetComponent {
9873
9901
  }
9874
9902
  </ax-text-box>
9875
9903
  </div>
9876
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i1$7.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: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: 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: "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: AXValidationModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9904
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i1$7.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: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: 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: "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: AXValidationModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9877
9905
  }
9878
9906
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTextBoxWidgetEditComponent, decorators: [{
9879
9907
  type: Component,
@@ -10902,7 +10930,7 @@ class AXPAvatarWidgetEditComponent extends AXPValueWidgetComponent {
10902
10930
  </div>
10903
10931
  </div>
10904
10932
  }
10905
- `, isInline: true, styles: ["@layer properties;axp-avatar-widget-edit .axp-empty{width:calc(var(--spacing, .25rem) * 28);height:calc(var(--spacing, .25rem) * 28);cursor:pointer;border-radius:calc(infinity * 1px);border-style:var(--tw-border-style);border-width:2px;--tw-border-style: dashed;border-style:dashed;border-color:rgba(var(--ax-sys-color-primary-surface));transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s));--tw-duration: .5s;transition-duration:.5s;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 2)}axp-avatar-widget-edit .axp-empty:hover{background-color:rgba(var(--ax-sys-color-primary-50))}axp-avatar-widget-edit .axp-empty.axp-state-error{border-color:rgba(var(--ax-sys-color-danger-surface))}axp-avatar-widget-edit .axp-empty.axp-state-loading{--fa-animation-duration: .7s}axp-avatar-widget-edit .axp-empty.axp-state-loading i{font-size:var(--text-3xl, 1.875rem);line-height:var(--tw-leading, var(--text-3xl--line-height, 1.2 ))}axp-avatar-widget-edit .axp-content{position:relative;display:flex;width:calc(var(--spacing, .25rem) * 28);height:calc(var(--spacing, .25rem) * 28);overflow:hidden;border-radius:calc(infinity * 1px)}axp-avatar-widget-edit .axp-content>:first-child{width:100%;height:100%;cursor:pointer;background-size:cover;background-position:center}axp-avatar-widget-edit .axp-content>:last-child{position:absolute;display:flex;display:none;height:100%;width:100%;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 2);transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s));--tw-duration: .5s;transition-duration:.5s}axp-avatar-widget-edit .axp-content:hover>:last-child{display:flex;background-color:color-mix(in srgb,#000 30%,transparent)}@supports (color: color-mix(in lab,red,red)){axp-avatar-widget-edit .axp-content:hover>:last-child{background-color:color-mix(in oklab,var(--color-black, #000) 30%,transparent)}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-duration{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-duration: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.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" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
10933
+ `, isInline: true, styles: ["@layer properties;axp-avatar-widget-edit .axp-empty{width:calc(var(--spacing, .25rem) * 28);height:calc(var(--spacing, .25rem) * 28);cursor:pointer;border-radius:calc(infinity * 1px);border-style:var(--tw-border-style);border-width:2px;--tw-border-style: dashed;border-style:dashed;border-color:rgba(var(--ax-sys-color-primary-surface));transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s));--tw-duration: .5s;transition-duration:.5s;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 2)}axp-avatar-widget-edit .axp-empty:hover{background-color:rgba(var(--ax-sys-color-primary-50))}axp-avatar-widget-edit .axp-empty.axp-state-error{border-color:rgba(var(--ax-sys-color-danger-surface))}axp-avatar-widget-edit .axp-empty.axp-state-loading{--fa-animation-duration: .7s}axp-avatar-widget-edit .axp-empty.axp-state-loading i{font-size:var(--text-3xl, 1.875rem);line-height:var(--tw-leading, var(--text-3xl--line-height, 1.2 ))}axp-avatar-widget-edit .axp-content{position:relative;display:flex;width:calc(var(--spacing, .25rem) * 28);height:calc(var(--spacing, .25rem) * 28);overflow:hidden;border-radius:calc(infinity * 1px)}axp-avatar-widget-edit .axp-content>:first-child{width:100%;height:100%;cursor:pointer;background-size:cover;background-position:center}axp-avatar-widget-edit .axp-content>:last-child{position:absolute;display:flex;display:none;height:100%;width:100%;align-items:center;justify-content:center;gap:calc(var(--spacing, .25rem) * 2);transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s));--tw-duration: .5s;transition-duration:.5s}axp-avatar-widget-edit .axp-content:hover>:last-child{display:flex;background-color:color-mix(in srgb,#000 30%,transparent)}@supports (color: color-mix(in lab,red,red)){axp-avatar-widget-edit .axp-content:hover>:last-child{background-color:color-mix(in oklab,var(--color-black, #000) 30%,transparent)}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-duration{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-duration: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: AXDecoratorModule }, { 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" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
10906
10934
  }
10907
10935
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAvatarWidgetEditComponent, decorators: [{
10908
10936
  type: Component,
@@ -11122,6 +11150,49 @@ const AXPAvatarWidget = {
11122
11150
  },
11123
11151
  };
11124
11152
 
11153
+ //#region ----- Code editor value coercion -----
11154
+ /**
11155
+ * Code-editor widgets bind a string. Catalog fields often store object/array JSON.
11156
+ * Coerce those values so column/view/edit never call string methods on non-strings.
11157
+ */
11158
+ function coerceCodeEditorText(value, pretty = false) {
11159
+ if (value == null) {
11160
+ return '';
11161
+ }
11162
+ if (typeof value === 'string') {
11163
+ return value;
11164
+ }
11165
+ if (typeof value === 'number' || typeof value === 'boolean') {
11166
+ return String(value);
11167
+ }
11168
+ try {
11169
+ return JSON.stringify(value, null, pretty ? 2 : 0) ?? '';
11170
+ }
11171
+ catch {
11172
+ return '';
11173
+ }
11174
+ }
11175
+ /**
11176
+ * Edit mode binds a string. Writing that string over an object/array
11177
+ * (`content`) breaks sibling nested paths such as `content.module`.
11178
+ */
11179
+ function restoreCodeEditorBoundValue(text, current) {
11180
+ if (current != null && typeof current === 'object') {
11181
+ const trimmed = text?.trim() ?? '';
11182
+ if (!trimmed) {
11183
+ return current;
11184
+ }
11185
+ try {
11186
+ return JSON.parse(trimmed);
11187
+ }
11188
+ catch {
11189
+ return current;
11190
+ }
11191
+ }
11192
+ return text;
11193
+ }
11194
+ //#endregion
11195
+
11125
11196
  //#region ---- Imports ----
11126
11197
  //#endregion
11127
11198
  //#region ---- Component ----
@@ -11129,10 +11200,7 @@ class AXPCodeEditorWidgetViewComponent extends AXPValueWidgetComponent {
11129
11200
  constructor() {
11130
11201
  super(...arguments);
11131
11202
  //#region ---- Computed Properties ----
11132
- this.currentValue = computed(() => {
11133
- const value = this.getValue();
11134
- return value ?? '';
11135
- }, /* @ts-ignore */
11203
+ this.currentValue = computed(() => coerceCodeEditorText(this.getValue(), true), /* @ts-ignore */
11136
11204
  ...(ngDevMode ? [{ debugName: "currentValue" }] : /* istanbul ignore next */ []));
11137
11205
  this.language = computed(() => {
11138
11206
  const options = this.options();
@@ -11144,37 +11212,42 @@ class AXPCodeEditorWidgetViewComponent extends AXPValueWidgetComponent {
11144
11212
  return options?.['lineNumbers'] ?? true;
11145
11213
  }, /* @ts-ignore */
11146
11214
  ...(ngDevMode ? [{ debugName: "lineNumbers" }] : /* istanbul ignore next */ []));
11215
+ this.editorHeight = computed(() => {
11216
+ const options = this.options();
11217
+ return options?.['height'] ?? 'h-96';
11218
+ }, /* @ts-ignore */
11219
+ ...(ngDevMode ? [{ debugName: "editorHeight" }] : /* istanbul ignore next */ []));
11147
11220
  }
11148
11221
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCodeEditorWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
11149
11222
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPCodeEditorWidgetViewComponent, isStandalone: true, selector: "axp-code-editor-widget-view", host: { classAttribute: "block w-full" }, usesInheritance: true, ngImport: i0, template: `
11150
- <div class="w-full border rounded-md p-2" style="direction: ltr;">
11223
+ <div class="w-full border rounded-md min-h-0 overflow-auto" style="direction: ltr;" [ngClass]="editorHeight()">
11151
11224
  <ax-code-editor
11152
11225
  [value]="currentValue()"
11153
11226
  [readonly]="true"
11154
11227
  [language]="language()"
11155
11228
  [lineNumbers]="lineNumbers()"
11156
- class="w-full h-full"
11229
+ class="w-full"
11157
11230
  ></ax-code-editor>
11158
11231
  </div>
11159
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXCodeEditorModule }, { kind: "component", type: i1$c.AXCodeEditorComponent, selector: "ax-code-editor", inputs: ["disabled", "value", "state", "name", "id", "language", "readonly", "placeholder", "lineNumbers", "lineWrapping", "tabSize", "indentWithTab", "theme", "extensions", "ariaLabel", "focusOnReady", "formatOnSave", "minRow", "customCompletions"], outputs: ["onValueChanged", "valueChange", "stateChange", "readonlyChange", "disabledChange", "ready", "save"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11232
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXCodeEditorModule }, { kind: "component", type: i1$c.AXCodeEditorComponent, selector: "ax-code-editor", inputs: ["disabled", "value", "state", "name", "id", "language", "readonly", "placeholder", "lineNumbers", "lineWrapping", "tabSize", "indentWithTab", "theme", "extensions", "ariaLabel", "focusOnReady", "formatOnSave", "minRow", "customCompletions"], outputs: ["onValueChanged", "valueChange", "stateChange", "readonlyChange", "disabledChange", "ready", "save"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11160
11233
  }
11161
11234
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCodeEditorWidgetViewComponent, decorators: [{
11162
11235
  type: Component,
11163
11236
  args: [{
11164
11237
  selector: 'axp-code-editor-widget-view',
11165
11238
  template: `
11166
- <div class="w-full border rounded-md p-2" style="direction: ltr;">
11239
+ <div class="w-full border rounded-md min-h-0 overflow-auto" style="direction: ltr;" [ngClass]="editorHeight()">
11167
11240
  <ax-code-editor
11168
11241
  [value]="currentValue()"
11169
11242
  [readonly]="true"
11170
11243
  [language]="language()"
11171
11244
  [lineNumbers]="lineNumbers()"
11172
- class="w-full h-full"
11245
+ class="w-full"
11173
11246
  ></ax-code-editor>
11174
11247
  </div>
11175
11248
  `,
11176
11249
  changeDetection: ChangeDetectionStrategy.OnPush,
11177
- imports: [AXCodeEditorModule],
11250
+ imports: [AXCodeEditorModule, NgClass],
11178
11251
  host: {
11179
11252
  class: 'block w-full',
11180
11253
  },
@@ -11193,10 +11266,7 @@ class AXPCodeEditorWidgetEditComponent extends AXPValueWidgetComponent {
11193
11266
  constructor() {
11194
11267
  super(...arguments);
11195
11268
  //#region ---- Computed Properties ----
11196
- this.currentValue = computed(() => {
11197
- const value = this.getValue();
11198
- return value ?? '';
11199
- }, /* @ts-ignore */
11269
+ this.currentValue = computed(() => coerceCodeEditorText(this.getValue(), true), /* @ts-ignore */
11200
11270
  ...(ngDevMode ? [{ debugName: "currentValue" }] : /* istanbul ignore next */ []));
11201
11271
  this.language = computed(() => {
11202
11272
  const options = this.options();
@@ -11208,44 +11278,57 @@ class AXPCodeEditorWidgetEditComponent extends AXPValueWidgetComponent {
11208
11278
  return options?.['lineNumbers'] ?? true;
11209
11279
  }, /* @ts-ignore */
11210
11280
  ...(ngDevMode ? [{ debugName: "lineNumbers" }] : /* istanbul ignore next */ []));
11211
- this.editorClass = computed(() => {
11281
+ this.editorHeight = computed(() => {
11282
+ const options = this.options();
11283
+ return options?.['height'] ?? 'h-96';
11284
+ }, /* @ts-ignore */
11285
+ ...(ngDevMode ? [{ debugName: "editorHeight" }] : /* istanbul ignore next */ []));
11286
+ this.isReadOnly = computed(() => {
11212
11287
  const options = this.options();
11213
- const height = options?.['height'] ?? 'min-h-96';
11214
- return `w-full h-full ${height}`;
11288
+ return options?.['readOnly'] === true || options?.['readonly'] === true || options?.['disabled'] === true;
11215
11289
  }, /* @ts-ignore */
11216
- ...(ngDevMode ? [{ debugName: "editorClass" }] : /* istanbul ignore next */ []));
11290
+ ...(ngDevMode ? [{ debugName: "isReadOnly" }] : /* istanbul ignore next */ []));
11217
11291
  }
11218
11292
  //#endregion
11219
11293
  //#region ---- Event Handlers ----
11220
11294
  handleValueChange(newValue) {
11221
- this.setValue(newValue);
11295
+ if (this.isReadOnly()) {
11296
+ return;
11297
+ }
11298
+ this.setValue(restoreCodeEditorBoundValue(newValue, this.getValue()));
11222
11299
  }
11223
11300
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCodeEditorWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
11224
11301
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPCodeEditorWidgetEditComponent, isStandalone: true, selector: "axp-code-editor-widget-edit", host: { classAttribute: "block w-full ltr" }, usesInheritance: true, ngImport: i0, template: `
11302
+ <div class="w-full min-h-0 overflow-auto" [ngClass]="editorHeight()">
11225
11303
  <ax-code-editor
11226
11304
  [ngModel]="currentValue()"
11227
11305
  (ngModelChange)="handleValueChange($event)"
11228
11306
  [language]="language()"
11229
11307
  [lineNumbers]="lineNumbers()"
11230
- [class]="editorClass()"
11308
+ [readonly]="isReadOnly()"
11309
+ class="w-full"
11231
11310
  ></ax-code-editor>
11232
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXCodeEditorModule }, { kind: "component", type: i1$c.AXCodeEditorComponent, selector: "ax-code-editor", inputs: ["disabled", "value", "state", "name", "id", "language", "readonly", "placeholder", "lineNumbers", "lineWrapping", "tabSize", "indentWithTab", "theme", "extensions", "ariaLabel", "focusOnReady", "formatOnSave", "minRow", "customCompletions"], outputs: ["onValueChanged", "valueChange", "stateChange", "readonlyChange", "disabledChange", "ready", "save"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11311
+ </div>
11312
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXCodeEditorModule }, { kind: "component", type: i1$c.AXCodeEditorComponent, selector: "ax-code-editor", inputs: ["disabled", "value", "state", "name", "id", "language", "readonly", "placeholder", "lineNumbers", "lineWrapping", "tabSize", "indentWithTab", "theme", "extensions", "ariaLabel", "focusOnReady", "formatOnSave", "minRow", "customCompletions"], outputs: ["onValueChanged", "valueChange", "stateChange", "readonlyChange", "disabledChange", "ready", "save"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11233
11313
  }
11234
11314
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCodeEditorWidgetEditComponent, decorators: [{
11235
11315
  type: Component,
11236
11316
  args: [{
11237
11317
  selector: 'axp-code-editor-widget-edit',
11238
11318
  template: `
11319
+ <div class="w-full min-h-0 overflow-auto" [ngClass]="editorHeight()">
11239
11320
  <ax-code-editor
11240
11321
  [ngModel]="currentValue()"
11241
11322
  (ngModelChange)="handleValueChange($event)"
11242
11323
  [language]="language()"
11243
11324
  [lineNumbers]="lineNumbers()"
11244
- [class]="editorClass()"
11325
+ [readonly]="isReadOnly()"
11326
+ class="w-full"
11245
11327
  ></ax-code-editor>
11328
+ </div>
11246
11329
  `,
11247
11330
  changeDetection: ChangeDetectionStrategy.OnPush,
11248
- imports: [FormsModule, AXCodeEditorModule],
11331
+ imports: [FormsModule, AXCodeEditorModule, NgClass],
11249
11332
  host: {
11250
11333
  class: 'block w-full ltr',
11251
11334
  },
@@ -11264,17 +11347,13 @@ class AXPCodeEditorWidgetColumnComponent extends AXPColumnWidgetComponent {
11264
11347
  constructor() {
11265
11348
  super(...arguments);
11266
11349
  //#region ---- Computed Properties ----
11267
- this.fullValue = computed(() => {
11268
- const value = this.rawValue;
11269
- return value ?? '';
11270
- }, /* @ts-ignore */
11350
+ this.fullValue = computed(() => coerceCodeEditorText(this.rawValue), /* @ts-ignore */
11271
11351
  ...(ngDevMode ? [{ debugName: "fullValue" }] : /* istanbul ignore next */ []));
11272
11352
  this.displayText = computed(() => {
11273
11353
  const value = this.fullValue();
11274
11354
  if (!value) {
11275
11355
  return '';
11276
11356
  }
11277
- // Trim whitespace and normalize line breaks
11278
11357
  const trimmed = value.trim().replace(/\r\n/g, '\n').replace(/\r/g, '\n');
11279
11358
  // If empty after trimming, return empty
11280
11359
  if (!trimmed) {
@@ -11861,7 +11940,25 @@ const FileViewerWebhookKeys = {
11861
11940
  AfterFilesAdded: 'file-viewer.afterFilesAdded',
11862
11941
  };
11863
11942
 
11864
- //#region ----- Imports -----
11943
+ //#endregion
11944
+ //#region ----- Constants -----
11945
+ const FILE_VIEWER_UPLOAD_ACTION = 'upload';
11946
+ //#endregion
11947
+ //#region ----- Helpers -----
11948
+ function resolveChooserMenuTarget(event) {
11949
+ if (!event) {
11950
+ return null;
11951
+ }
11952
+ const source = event.currentTarget instanceof HTMLElement
11953
+ ? event.currentTarget
11954
+ : event.target instanceof HTMLElement
11955
+ ? event.target
11956
+ : null;
11957
+ if (!source) {
11958
+ return null;
11959
+ }
11960
+ return source.closest('button, ax-button') ?? source;
11961
+ }
11865
11962
  //#endregion
11866
11963
  //#region ----- Component -----
11867
11964
  class AXPFileViewerWidgetEditComponent extends AXPValueWidgetComponent {
@@ -11869,6 +11966,13 @@ class AXPFileViewerWidgetEditComponent extends AXPValueWidgetComponent {
11869
11966
  super(...arguments);
11870
11967
  //#region ----- Services & Dependencies -----
11871
11968
  this.hooks = inject(AXPHookService);
11969
+ this.chooserService = inject(AXPFileChooserService);
11970
+ this.translation = inject(AXTranslationService);
11971
+ this.envInjector = inject(EnvironmentInjector);
11972
+ this.appRef = inject(ApplicationRef);
11973
+ this.providerMenu = createAttachedFileProviderMenu(this.envInjector, this.appRef, (key) => {
11974
+ void this.runChooser(key);
11975
+ });
11872
11976
  //#endregion
11873
11977
  //#region ----- Computed Properties -----
11874
11978
  this.thumbnail = computed(() => this.options()['thumbnail'] ?? true, /* @ts-ignore */
@@ -11905,6 +12009,46 @@ class AXPFileViewerWidgetEditComponent extends AXPValueWidgetComponent {
11905
12009
  //#region ----- State Signals -----
11906
12010
  this.isChoosing = signal(false, /* @ts-ignore */
11907
12011
  ...(ngDevMode ? [{ debugName: "isChoosing" }] : /* istanbul ignore next */ []));
12012
+ this.locale = toSignal(this.translation.currentLocale$, {
12013
+ initialValue: this.translation.getActiveLang(),
12014
+ });
12015
+ //#endregion
12016
+ //#region ----- Header Actions -----
12017
+ /**
12018
+ * Custom headerActions replace the container's built-in download/fullscreen buttons,
12019
+ * so those actions are included whenever upload is shown.
12020
+ */
12021
+ this.headerActions = computed(() => {
12022
+ this.locale();
12023
+ if (!this.allowUpload()) {
12024
+ return [];
12025
+ }
12026
+ const actions = [
12027
+ {
12028
+ name: FILE_VIEWER_UPLOAD_ACTION,
12029
+ text: this.translation.translateSync('@general:actions.add-item.title'),
12030
+ icon: 'fa-light fa-plus',
12031
+ disabled: this.isChoosing(),
12032
+ isLoading: this.isChoosing(),
12033
+ },
12034
+ ];
12035
+ if (this.downloadButton()) {
12036
+ actions.push({
12037
+ name: 'download',
12038
+ text: this.translation.translateSync('@general:actions.download.title'),
12039
+ icon: 'fa-light fa-download',
12040
+ });
12041
+ }
12042
+ if (this.fullScreenButton()) {
12043
+ actions.push({
12044
+ name: 'fullscreen',
12045
+ text: this.translation.translateSync('@platform-layout-widgets:widgets.file-viewer.actions.fullscreen'),
12046
+ icon: 'fa-light fa-expand',
12047
+ });
12048
+ }
12049
+ return actions;
12050
+ }, /* @ts-ignore */
12051
+ ...(ngDevMode ? [{ debugName: "headerActions" }] : /* istanbul ignore next */ []));
11908
12052
  //#endregion
11909
12053
  //#region ----- View Queries -----
11910
12054
  this.fileViewer = viewChild('fileViewer', /* @ts-ignore */
@@ -11918,8 +12062,40 @@ class AXPFileViewerWidgetEditComponent extends AXPValueWidgetComponent {
11918
12062
  }
11919
12063
  });
11920
12064
  }
12065
+ ngOnDestroy() {
12066
+ this.providerMenu.destroy();
12067
+ }
11921
12068
  //#endregion
11922
12069
  //#region ----- Event Handlers -----
12070
+ onHeaderActionClick(event) {
12071
+ if (event.item.name !== FILE_VIEWER_UPLOAD_ACTION) {
12072
+ return;
12073
+ }
12074
+ this.onUploadAction(event.nativeEvent);
12075
+ }
12076
+ onUploadAction(event) {
12077
+ if (this.isChoosing()) {
12078
+ return;
12079
+ }
12080
+ const nativeEvent = event instanceof Event ? event : event?.nativeEvent;
12081
+ const providers = this.chooserService.getProviders(this.chooserContext().options).map((provider) => ({
12082
+ key: provider.key,
12083
+ title: provider.title,
12084
+ icon: provider.icon,
12085
+ }));
12086
+ if (providers.length === 0) {
12087
+ return;
12088
+ }
12089
+ if (providers.length === 1) {
12090
+ void this.runChooser(providers[0].key);
12091
+ return;
12092
+ }
12093
+ const target = resolveChooserMenuTarget(nativeEvent);
12094
+ if (!target) {
12095
+ return;
12096
+ }
12097
+ this.providerMenu.open(target, providers, this.isChoosing());
12098
+ }
11923
12099
  async onChooserItemsChanged(next) {
11924
12100
  const current = this.getValue() ?? [];
11925
12101
  const currentIds = new Set(current.map((file) => file.id));
@@ -11934,6 +12110,19 @@ class AXPFileViewerWidgetEditComponent extends AXPValueWidgetComponent {
11934
12110
  }
11935
12111
  //#endregion
11936
12112
  //#region ----- Data Loading -----
12113
+ async runChooser(providerKey) {
12114
+ this.providerMenu.close();
12115
+ this.isChoosing.set(true);
12116
+ try {
12117
+ const result = await this.chooserService.choose(providerKey, this.chooserContext());
12118
+ if (result) {
12119
+ await this.onChooserItemsChanged(result);
12120
+ }
12121
+ }
12122
+ finally {
12123
+ this.isChoosing.set(false);
12124
+ }
12125
+ }
11937
12126
  async processChosenItems(items) {
11938
12127
  if (items.length === 0) {
11939
12128
  return;
@@ -11969,7 +12158,7 @@ class AXPFileViewerWidgetEditComponent extends AXPValueWidgetComponent {
11969
12158
  await this.processChosenItems(newFileItems);
11970
12159
  }
11971
12160
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPFileViewerWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
11972
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPFileViewerWidgetEditComponent, isStandalone: true, selector: "axp-file-viewer-widget-edit", host: { properties: { "style.height": "height()" }, classAttribute: "block" }, viewQueries: [{ propertyName: "fileViewer", first: true, predicate: ["fileViewer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"flex h-full flex-col gap-2\">\n <!-- ----- Upload action when chooser is enabled ----- -->\n @if (allowUpload()) {\n <div class=\"flex justify-start\">\n <ax-button\n axpFileChooser\n class=\"ax-sm\"\n color=\"primary\"\n [text]=\"'@general:actions.add-item.title' | translate | async\"\n [context]=\"chooserContext()\"\n [items]=\"files()\"\n [busy]=\"isChoosing()\"\n (itemsChange)=\"onChooserItemsChanged($event)\"\n (busyChange)=\"isChoosing.set($event)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-plus\"></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n }\n\n <axp-file-viewer\n #fileViewer\n class=\"min-h-0 flex-1\"\n [files]=\"files()\"\n [startIndex]=\"startIndex()\"\n [thumbnail]=\"thumbnail()\"\n [download]=\"downloadButton()\"\n [fullscreen]=\"fullScreenButton()\"\n [loading]=\"isChoosing()\"\n />\n</div>\n", dependencies: [{ kind: "component", type: AXPFileViewerComponent, selector: "axp-file-viewer", inputs: ["items", "files", "startIndex", "thumbnail", "pagination", "download", "fullscreen", "galleryMode", "loading", "height", "headerContent", "headerContentInputs", "fallbackContent", "fallbackContentInputs"], outputs: ["fullscreenClosed"] }, { 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: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: AXPFileChooserDirective, selector: "[axpFileChooser]", inputs: ["context", "disabled", "items", "busy"], outputs: ["itemsChange", "busyChange"] }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12161
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPFileViewerWidgetEditComponent, isStandalone: true, selector: "axp-file-viewer-widget-edit", host: { properties: { "style.height": "height()" }, classAttribute: "block" }, viewQueries: [{ propertyName: "fileViewer", first: true, predicate: ["fileViewer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<!-- ----- Empty state; upload stays available when the carousel has no files ----- -->\n<ng-template #emptyContent>\n <axp-state-message\n icon=\"fa-light fa-file-lines\"\n [title]=\"'@platform-layout-widgets:widgets.file-viewer.empty.title'\"\n [description]=\"'@platform-layout-widgets:widgets.file-viewer.empty.description'\"\n >\n @if (allowUpload()) {\n <!-- ----- Upload action for the empty viewer ----- -->\n <ax-button\n slot=\"actions\"\n class=\"ax-sm\"\n color=\"primary\"\n [text]=\"'@general:actions.add-item.title' | translate | async\"\n [disabled]=\"isChoosing()\"\n (onClick)=\"onUploadAction($event)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-plus\"></ax-icon>\n </ax-prefix>\n </ax-button>\n }\n </axp-state-message>\n</ng-template>\n\n<axp-file-viewer\n #fileViewer\n class=\"h-full\"\n [files]=\"files()\"\n [startIndex]=\"startIndex()\"\n [thumbnail]=\"thumbnail()\"\n [download]=\"downloadButton()\"\n [fullscreen]=\"fullScreenButton()\"\n [loading]=\"isChoosing()\"\n [headerActions]=\"headerActions()\"\n [emptyContent]=\"emptyContent\"\n (headerActionClick)=\"onHeaderActionClick($event)\"\n/>\n", dependencies: [{ kind: "component", type: AXPFileViewerComponent, selector: "axp-file-viewer", inputs: ["items", "files", "startIndex", "thumbnail", "pagination", "download", "fullscreen", "galleryMode", "loading", "height", "headerContent", "headerContentInputs", "fallbackContent", "fallbackContentInputs", "emptyContent", "emptyContentInputs", "headerActions"], outputs: ["headerActionClick", "fullscreenClosed"] }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "titleParams", "descriptionParams", "look"] }, { 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: AXButtonModule }, { kind: "component", type: i1$1.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$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11973
12162
  }
11974
12163
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPFileViewerWidgetEditComponent, decorators: [{
11975
12164
  type: Component,
@@ -11978,12 +12167,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
11978
12167
  '[style.height]': 'height()',
11979
12168
  }, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
11980
12169
  AXPFileViewerComponent,
12170
+ AXPStateMessageComponent,
11981
12171
  AXDecoratorModule,
11982
12172
  AXButtonModule,
11983
12173
  AXTranslationModule,
11984
- AXPFileChooserDirective,
11985
12174
  AsyncPipe,
11986
- ], template: "<div class=\"flex h-full flex-col gap-2\">\n <!-- ----- Upload action when chooser is enabled ----- -->\n @if (allowUpload()) {\n <div class=\"flex justify-start\">\n <ax-button\n axpFileChooser\n class=\"ax-sm\"\n color=\"primary\"\n [text]=\"'@general:actions.add-item.title' | translate | async\"\n [context]=\"chooserContext()\"\n [items]=\"files()\"\n [busy]=\"isChoosing()\"\n (itemsChange)=\"onChooserItemsChanged($event)\"\n (busyChange)=\"isChoosing.set($event)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-plus\"></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n }\n\n <axp-file-viewer\n #fileViewer\n class=\"min-h-0 flex-1\"\n [files]=\"files()\"\n [startIndex]=\"startIndex()\"\n [thumbnail]=\"thumbnail()\"\n [download]=\"downloadButton()\"\n [fullscreen]=\"fullScreenButton()\"\n [loading]=\"isChoosing()\"\n />\n</div>\n" }]
12175
+ ], template: "<!-- ----- Empty state; upload stays available when the carousel has no files ----- -->\n<ng-template #emptyContent>\n <axp-state-message\n icon=\"fa-light fa-file-lines\"\n [title]=\"'@platform-layout-widgets:widgets.file-viewer.empty.title'\"\n [description]=\"'@platform-layout-widgets:widgets.file-viewer.empty.description'\"\n >\n @if (allowUpload()) {\n <!-- ----- Upload action for the empty viewer ----- -->\n <ax-button\n slot=\"actions\"\n class=\"ax-sm\"\n color=\"primary\"\n [text]=\"'@general:actions.add-item.title' | translate | async\"\n [disabled]=\"isChoosing()\"\n (onClick)=\"onUploadAction($event)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-plus\"></ax-icon>\n </ax-prefix>\n </ax-button>\n }\n </axp-state-message>\n</ng-template>\n\n<axp-file-viewer\n #fileViewer\n class=\"h-full\"\n [files]=\"files()\"\n [startIndex]=\"startIndex()\"\n [thumbnail]=\"thumbnail()\"\n [download]=\"downloadButton()\"\n [fullscreen]=\"fullScreenButton()\"\n [loading]=\"isChoosing()\"\n [headerActions]=\"headerActions()\"\n [emptyContent]=\"emptyContent\"\n (headerActionClick)=\"onHeaderActionClick($event)\"\n/>\n" }]
11987
12176
  }], propDecorators: { fileViewer: [{ type: i0.ViewChild, args: ['fileViewer', { isSignal: true }] }] } });
11988
12177
 
11989
12178
  var fileViewerWidgetEdit_component = /*#__PURE__*/Object.freeze({
@@ -11997,6 +12186,14 @@ var fileViewerWidgetEdit_component = /*#__PURE__*/Object.freeze({
11997
12186
  class AXPFileViewerWidgetViewComponent extends AXPValueWidgetComponent {
11998
12187
  constructor() {
11999
12188
  super(...arguments);
12189
+ //#region ----- Constants -----
12190
+ this.emptyContent = AXPStateMessageComponent;
12191
+ this.emptyContentInputs = {
12192
+ icon: 'fa-light fa-file-lines',
12193
+ title: '@platform-layout-widgets:widgets.file-viewer.empty.title',
12194
+ description: '@platform-layout-widgets:widgets.file-viewer.empty.description',
12195
+ };
12196
+ //#endregion
12000
12197
  //#region ----- Computed Properties -----
12001
12198
  this.internalValue = computed(() => normalizeFileViewerBoundValue(this.getValue()), /* @ts-ignore */
12002
12199
  ...(ngDevMode ? [{ debugName: "internalValue" }] : /* istanbul ignore next */ []));
@@ -12010,14 +12207,14 @@ class AXPFileViewerWidgetViewComponent extends AXPValueWidgetComponent {
12010
12207
  ...(ngDevMode ? [{ debugName: "fullScreenButton" }] : /* istanbul ignore next */ []));
12011
12208
  }
12012
12209
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPFileViewerWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
12013
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPFileViewerWidgetViewComponent, isStandalone: true, selector: "axp-file-viewer-widget-view", host: { properties: { "style.height": "height()" }, classAttribute: "block" }, usesInheritance: true, ngImport: i0, template: "@if (internalValue().length) {\n <axp-file-viewer\n class=\"h-full\"\n [files]=\"internalValue()\"\n [thumbnail]=\"thumbnail()\"\n [download]=\"downloadButton()\"\n [fullscreen]=\"fullScreenButton()\"\n />\n}\n<!-- ----- Empty state when no files are bound ----- -->\n@else {\n <axp-state-message\n icon=\"fa-light fa-file-lines\"\n [title]=\"'@general:no-media.title'\"\n [description]=\"'@general:no-media.description'\"\n />\n}\n", dependencies: [{ kind: "component", type: AXPFileViewerComponent, selector: "axp-file-viewer", inputs: ["items", "files", "startIndex", "thumbnail", "pagination", "download", "fullscreen", "galleryMode", "loading", "height", "headerContent", "headerContentInputs", "fallbackContent", "fallbackContentInputs"], outputs: ["fullscreenClosed"] }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "titleParams", "descriptionParams", "look"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12210
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPFileViewerWidgetViewComponent, isStandalone: true, selector: "axp-file-viewer-widget-view", host: { properties: { "style.height": "height()" }, classAttribute: "block" }, usesInheritance: true, ngImport: i0, template: "<axp-file-viewer\n class=\"h-full\"\n [files]=\"internalValue()\"\n [thumbnail]=\"thumbnail()\"\n [download]=\"downloadButton()\"\n [fullscreen]=\"fullScreenButton()\"\n [emptyContent]=\"emptyContent\"\n [emptyContentInputs]=\"emptyContentInputs\"\n/>\n", dependencies: [{ kind: "component", type: AXPFileViewerComponent, selector: "axp-file-viewer", inputs: ["items", "files", "startIndex", "thumbnail", "pagination", "download", "fullscreen", "galleryMode", "loading", "height", "headerContent", "headerContentInputs", "fallbackContent", "fallbackContentInputs", "emptyContent", "emptyContentInputs", "headerActions"], outputs: ["headerActionClick", "fullscreenClosed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12014
12211
  }
12015
12212
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPFileViewerWidgetViewComponent, decorators: [{
12016
12213
  type: Component,
12017
12214
  args: [{ selector: 'axp-file-viewer-widget-view', host: {
12018
12215
  class: 'block',
12019
12216
  '[style.height]': 'height()',
12020
- }, changeDetection: ChangeDetectionStrategy.OnPush, imports: [AXPFileViewerComponent, AXPStateMessageComponent], template: "@if (internalValue().length) {\n <axp-file-viewer\n class=\"h-full\"\n [files]=\"internalValue()\"\n [thumbnail]=\"thumbnail()\"\n [download]=\"downloadButton()\"\n [fullscreen]=\"fullScreenButton()\"\n />\n}\n<!-- ----- Empty state when no files are bound ----- -->\n@else {\n <axp-state-message\n icon=\"fa-light fa-file-lines\"\n [title]=\"'@general:no-media.title'\"\n [description]=\"'@general:no-media.description'\"\n />\n}\n" }]
12217
+ }, changeDetection: ChangeDetectionStrategy.OnPush, imports: [AXPFileViewerComponent], template: "<axp-file-viewer\n class=\"h-full\"\n [files]=\"internalValue()\"\n [thumbnail]=\"thumbnail()\"\n [download]=\"downloadButton()\"\n [fullscreen]=\"fullScreenButton()\"\n [emptyContent]=\"emptyContent\"\n [emptyContentInputs]=\"emptyContentInputs\"\n/>\n" }]
12021
12218
  }] });
12022
12219
 
12023
12220
  var fileViewerWidgetView_component = /*#__PURE__*/Object.freeze({
@@ -12072,826 +12269,71 @@ const AXPFileViewerWidget = {
12072
12269
  },
12073
12270
  };
12074
12271
 
12075
- const GalleryWebhookKeys = {
12076
- BeforeFilesAdded: 'gallery.beforeFilesAdded',
12077
- AfterFilesAdded: 'gallery.afterFilesAdded',
12078
- };
12272
+ class AXPImageMarkerPopupComponent extends AXBasePageComponent {
12273
+ ngOnInit() {
12274
+ this.node = {
12275
+ name: 'image-marker-popup-view',
12276
+ type: 'image-marker',
12277
+ options: this.options,
12278
+ defaultValue: this.value,
12279
+ };
12280
+ }
12281
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPImageMarkerPopupComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
12282
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPImageMarkerPopupComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: `
12283
+ <axp-widgets-container>
12284
+ <ng-container axp-widget-renderer [node]="node" mode="view"></ng-container>
12285
+ </axp-widgets-container>
12286
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i1.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12287
+ }
12288
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPImageMarkerPopupComponent, decorators: [{
12289
+ type: Component,
12290
+ args: [{
12291
+ imports: [AXPWidgetCoreModule],
12292
+ template: `
12293
+ <axp-widgets-container>
12294
+ <ng-container axp-widget-renderer [node]="node" mode="view"></ng-container>
12295
+ </axp-widgets-container>
12296
+ `,
12297
+ changeDetection: ChangeDetectionStrategy.OnPush,
12298
+ }]
12299
+ }] });
12079
12300
 
12080
- class AXPGalleryWidgetEditComponent extends AXPValueWidgetComponent {
12301
+ class AXPImageMarkerWidgetColumnComponent extends AXPColumnWidgetComponent {
12081
12302
  constructor() {
12082
- super(...arguments);
12083
- this.thumbnail = computed(() => this.options()['thumbnail'], /* @ts-ignore */
12084
- ...(ngDevMode ? [{ debugName: "thumbnail" }] : /* istanbul ignore next */ []));
12085
- this.height = computed(() => this.options()['height'] ?? '30rem', /* @ts-ignore */
12086
- ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
12087
- this.header = computed(() => this.options()['header'], /* @ts-ignore */
12088
- ...(ngDevMode ? [{ debugName: "header" }] : /* istanbul ignore next */ []));
12089
- this.fileInfo = computed(() => this.options()['fileInfo'], /* @ts-ignore */
12090
- ...(ngDevMode ? [{ debugName: "fileInfo" }] : /* istanbul ignore next */ []));
12091
- this.fullScreenButton = computed(() => this.options()['fullScreenButton'] ?? true, /* @ts-ignore */
12092
- ...(ngDevMode ? [{ debugName: "fullScreenButton" }] : /* istanbul ignore next */ []));
12093
- this.downloadButton = computed(() => this.options()['downloadButton'] ?? true, /* @ts-ignore */
12094
- ...(ngDevMode ? [{ debugName: "downloadButton" }] : /* istanbul ignore next */ []));
12095
- this.allowUploadTypes = computed(() => this.options()['allowUploadTypes'] ?? [`image/*`], /* @ts-ignore */
12096
- ...(ngDevMode ? [{ debugName: "allowUploadTypes" }] : /* istanbul ignore next */ []));
12097
- this.allowUpload = computed(() => this.options()['allowUpload'] ?? true, /* @ts-ignore */
12098
- ...(ngDevMode ? [{ debugName: "allowUpload" }] : /* istanbul ignore next */ []));
12099
- this.startIndex = computed(() => {
12100
- const index = this.options()['startIndex'];
12101
- return typeof index === 'number' && index >= 0 ? index : 0;
12102
- }, /* @ts-ignore */
12103
- ...(ngDevMode ? [{ debugName: "startIndex" }] : /* istanbul ignore next */ []));
12104
- this.hooks = inject(AXPHookService);
12105
- this.fileStorageService = inject(AXPFileStorageService);
12106
- this.loadingDialog = inject(AXLoadingDialogService);
12107
- this.translationService = inject(AXTranslationService);
12108
- this.gallery = viewChild('c', /* @ts-ignore */
12109
- ...(ngDevMode ? [{ debugName: "gallery" }] : /* istanbul ignore next */ []));
12110
- this.isChoosing = signal(false, /* @ts-ignore */
12111
- ...(ngDevMode ? [{ debugName: "isChoosing" }] : /* istanbul ignore next */ []));
12112
- this.files = computed(() => this.getValue() ?? [], /* @ts-ignore */
12113
- ...(ngDevMode ? [{ debugName: "files" }] : /* istanbul ignore next */ []));
12114
- this.chooserContext = computed(() => ({
12115
- options: {
12116
- multiple: true,
12117
- accept: this.allowUploadTypes().join(','),
12118
- scope: this.options()['scope'],
12119
- destination: this.options()['destination'],
12120
- excludeProviders: this.options()['excludeProviders'],
12121
- },
12122
- items: this.getValue() ?? [],
12123
- }), /* @ts-ignore */
12124
- ...(ngDevMode ? [{ debugName: "chooserContext" }] : /* istanbul ignore next */ []));
12125
- /** Navigate to the requested start index once the media viewer is rendered. */
12126
- this.navigateToStartIndex = afterNextRender(() => {
12127
- const index = this.startIndex();
12128
- if (index > 0) {
12129
- setTimeout(() => this.gallery()?.goToIndex(index), 100);
12303
+ super();
12304
+ this.layoutBuilder = inject(AXPLayoutBuilderService);
12305
+ this.rawImage = computed(() => this.options?.image, /* @ts-ignore */
12306
+ ...(ngDevMode ? [{ debugName: "rawImage" }] : /* istanbul ignore next */ []));
12307
+ this.rawPoints = () => this.rawValue;
12308
+ this.imageUrl = signal(null, /* @ts-ignore */
12309
+ ...(ngDevMode ? [{ debugName: "imageUrl" }] : /* istanbul ignore next */ []));
12310
+ effect(() => {
12311
+ const imageSource = this.rawImage();
12312
+ const currentUrl = this.imageUrl();
12313
+ if (currentUrl && currentUrl.startsWith('blob:')) {
12314
+ URL.revokeObjectURL(currentUrl);
12130
12315
  }
12131
- });
12132
- /** Object URLs created for blobs/binary; revoked on destroy for memory safety. */
12133
- this.objectUrls = new Set();
12134
- /**
12135
- * Convert AXPFileListItem[] to AXMediaViewerData[] for display in media viewer.
12136
- * Uses lazy-loading callbacks for URL resolution.
12137
- */
12138
- this.mediaViewerData = computed(() => {
12139
- const fileItems = this.getValue() ?? [];
12140
- return fileItems.map((file) => this.fileItemToMediaViewerData(file));
12141
- }, /* @ts-ignore */
12142
- ...(ngDevMode ? [{ debugName: "mediaViewerData" }] : /* istanbul ignore next */ []));
12143
- }
12144
- /** Downloads the file at the current media viewer index. */
12145
- async download() {
12146
- const galleryRef = this.gallery();
12147
- const files = this.getValue() ?? [];
12148
- if (!galleryRef || files.length === 0) {
12149
- return;
12150
- }
12151
- const index = galleryRef.getActiveIndex();
12152
- const file = files[index];
12153
- if (!file) {
12154
- return;
12155
- }
12156
- const loadingDialogRef = this.loadingDialog.show({
12157
- title: await this.translationService.translateAsync('@general:actions.download.processing'),
12158
- mode: 'indeterminate',
12159
- progressColor: 'primary',
12160
- status: await this.translationService.translateAsync('@general:actions.download.processing'),
12161
- });
12162
- try {
12163
- const url = await this.resolveFileUrl(file);
12164
- if (!url) {
12165
- return;
12316
+ if (typeof imageSource === 'string') {
12317
+ this.imageUrl.set(imageSource);
12166
12318
  }
12167
- const link = document.createElement('a');
12168
- link.href = url;
12169
- link.download = file.name ?? 'download';
12170
- link.target = '_blank';
12171
- link.rel = 'noopener noreferrer';
12172
- link.click();
12173
- link.remove();
12174
- }
12175
- finally {
12176
- loadingDialogRef.close();
12177
- }
12178
- }
12179
- /**
12180
- * Handle items returned from file chooser providers (system, drive, etc.).
12181
- * Providers return the merged list; only newly added items are processed.
12182
- */
12183
- async onChooserItemsChanged(next) {
12184
- const current = this.getValue() ?? [];
12185
- const currentIds = new Set(current.map((file) => file.id));
12186
- const added = next.filter((file) => file.id != null && !currentIds.has(file.id));
12187
- if (added.length === 0) {
12188
- return;
12189
- }
12190
- await this.processChosenItems(added);
12319
+ else if (imageSource instanceof URL) {
12320
+ this.imageUrl.set(imageSource.href);
12321
+ }
12322
+ else if (imageSource instanceof Blob) {
12323
+ this.imageUrl.set(URL.createObjectURL(imageSource));
12324
+ }
12325
+ else if (imageSource instanceof ArrayBuffer) {
12326
+ const blob = new Blob([imageSource]);
12327
+ this.imageUrl.set(URL.createObjectURL(blob));
12328
+ }
12329
+ else {
12330
+ this.imageUrl.set(null);
12331
+ }
12332
+ });
12191
12333
  }
12192
- /**
12193
- * Process items returned from file chooser providers.
12194
- */
12195
- async processChosenItems(items) {
12196
- if (items.length === 0) {
12197
- return;
12198
- }
12199
- await this.hooks.runAsync(GalleryWebhookKeys.BeforeFilesAdded, {
12200
- host: this,
12201
- newFiles: items,
12202
- });
12203
- const newValue = [...(this.getValue() ?? []), ...items];
12204
- this.setValue(newValue);
12205
- await this.hooks.runAsync(GalleryWebhookKeys.AfterFilesAdded, {
12206
- host: this,
12207
- newFiles: items,
12208
- });
12209
- setTimeout(() => {
12210
- this.gallery()?.goToIndex(newValue.length - 1);
12211
- }, 100);
12212
- }
12213
- /**
12214
- * Format file size with appropriate unit (B, KB, MB, GB, etc.)
12215
- * Divides by 1000 until the value is less than 1000
12216
- */
12217
- formatFileSize(size) {
12218
- if (!size) {
12219
- return '';
12220
- }
12221
- const units = ['B', 'KB', 'MB', 'GB', 'TB'];
12222
- let value = size;
12223
- let unitIndex = 0;
12224
- while (value >= 1000 && unitIndex < units.length - 1) {
12225
- value /= 1000;
12226
- unitIndex++;
12227
- }
12228
- // Round to 2 decimal places, but remove trailing zeros
12229
- const roundedValue = Math.round(value * 100) / 100;
12230
- return `${roundedValue} ${units[unitIndex]}`;
12231
- }
12232
- /**
12233
- * Convert AXPFileListItem to AXMediaViewerData for display in media viewer.
12234
- * Uses lazy-loading callbacks for URL and thumbnail resolution.
12235
- */
12236
- fileItemToMediaViewerData(file) {
12237
- const mediaType = resolveMediaViewerType(file.name);
12238
- const urlCallback = () => this.resolveFileUrl(file);
12239
- const thumbnailCallback = mediaType === 'image' || mediaType === 'video'
12240
- ? () => this.resolveFileUrl(file)
12241
- : undefined;
12242
- return {
12243
- id: file.id ??
12244
- `media-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
12245
- name: file.name,
12246
- type: mediaType,
12247
- url: urlCallback,
12248
- thumbnailUrl: thumbnailCallback,
12249
- size: this.formatFileSize(file.size),
12250
- };
12251
- }
12252
- /**
12253
- * Resolve the URL for a file item.
12254
- * Returns a promise that resolves to the file URL.
12255
- */
12256
- /**
12257
- * Register an object URL for later revocation on destroy (memory safety).
12258
- */
12259
- trackObjectUrl(url) {
12260
- if (url.startsWith('blob:')) {
12261
- this.objectUrls.add(url);
12262
- }
12263
- return url;
12264
- }
12265
- async resolveFileUrl(file) {
12266
- // Blob source - create object URL
12267
- if (file.source?.kind === 'blob' && file.source.value instanceof Blob) {
12268
- return this.trackObjectUrl(URL.createObjectURL(file.source.value));
12269
- }
12270
- // File ID source - fetch from storage service
12271
- if (file.source?.kind === 'fileId' &&
12272
- typeof file.source.value === 'string') {
12273
- const fileId = normalizeStoredImageRef(file.source.value) ?? file.source.value;
12274
- const fileInfo = await this.fileStorageService.getInfo(fileId);
12275
- if (fileInfo?.url)
12276
- return fileInfo.url;
12277
- if (fileInfo?.binary)
12278
- return this.trackObjectUrl(URL.createObjectURL(fileInfo.binary));
12279
- return '';
12280
- }
12281
- // URL source - return directly
12282
- if (file.source?.kind === 'url' && typeof file.source.value === 'string') {
12283
- return file.source.value;
12284
- }
12285
- // String value - check if it's already a URL or needs resolution
12286
- if (typeof file.source?.value === 'string') {
12287
- const value = file.source.value;
12288
- // Already a blob URL or data URL - use directly
12289
- if (value.startsWith('blob:') ||
12290
- value.startsWith('data:') ||
12291
- value.startsWith('http')) {
12292
- return value;
12293
- }
12294
- // Assume it's a file ID - fetch from storage service
12295
- const fileId = normalizeStoredImageRef(value) ?? value;
12296
- const fileInfo = await this.fileStorageService.getInfo(fileId);
12297
- if (fileInfo?.url)
12298
- return fileInfo.url;
12299
- if (fileInfo?.binary)
12300
- return this.trackObjectUrl(URL.createObjectURL(fileInfo.binary));
12301
- return '';
12302
- }
12303
- return '';
12304
- }
12305
- ngOnDestroy() {
12306
- for (const url of this.objectUrls) {
12307
- URL.revokeObjectURL(url);
12308
- }
12309
- this.objectUrls.clear();
12310
- }
12311
- /**
12312
- * Process files from drag-drop or other raw File sources.
12313
- */
12314
- async processFiles(files) {
12315
- if (files.length === 0) {
12316
- return;
12317
- }
12318
- const newFileItems = files.map((file) => ({
12319
- id: AXPDataGenerator.uuid(),
12320
- name: file.name,
12321
- size: file.size,
12322
- status: 'attached',
12323
- source: {
12324
- kind: 'blob',
12325
- value: file,
12326
- },
12327
- }));
12328
- await this.processChosenItems(newFileItems);
12329
- }
12330
- //#region ---- Drag & Drop Handlers ----
12331
- onFileChange(event) {
12332
- void this.processFiles(event.files);
12333
- }
12334
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPGalleryWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
12335
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPGalleryWidgetEditComponent, isStandalone: true, selector: "axp-gallery-widget-edit", host: { properties: { "style.height": "height()" }, classAttribute: "block" }, viewQueries: [{ propertyName: "gallery", first: true, predicate: ["c"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: ` <ax-media-viewer-container
12336
- style="height: 75vh;"
12337
- [thumbnail]="thumbnail()"
12338
- #c
12339
- [dataArray]="mediaViewerData()"
12340
- >
12341
- @if (header()) {
12342
- <ax-header>
12343
- @if (allowUpload()) {
12344
- <ax-prefix>
12345
- <ax-button
12346
- axpFileChooser
12347
- class="ax-sm"
12348
- color="primary"
12349
- [text]="'@general:actions.add-item.title' | translate | async"
12350
- [context]="chooserContext()"
12351
- [items]="files()"
12352
- [busy]="isChoosing()"
12353
- (itemsChange)="onChooserItemsChanged($event)"
12354
- (busyChange)="isChoosing.set($event)"
12355
- >
12356
- <ax-prefix>
12357
- <ax-icon icon="fa-light fa-plus"></ax-icon>
12358
- </ax-prefix>
12359
- </ax-button>
12360
- </ax-prefix>
12361
- }
12362
-
12363
- @if (fileInfo()) {
12364
- <ax-file-info></ax-file-info>
12365
- }
12366
-
12367
- <ax-suffix>
12368
- @if (downloadButton()) {
12369
- <ax-button
12370
- class="ax-sm"
12371
- look="blank"
12372
- (click)="download()"
12373
- [disabled]="mediaViewerData().length === 0"
12374
- >
12375
- <ax-icon icon="fa-light fa-download"></ax-icon>
12376
- </ax-button>
12377
- }
12378
- @if (fullScreenButton()) {
12379
- <ax-fullscreen-button> </ax-fullscreen-button>
12380
- }
12381
- </ax-suffix>
12382
- </ax-header>
12383
- }
12384
-
12385
- <ax-prefix>
12386
- <ax-button
12387
- class="ax-sm"
12388
- (click)="c.next()"
12389
- [disabled]="c.getActiveIndex() === this.mediaViewerData().length - 1"
12390
- >
12391
- <ax-icon class="rtl:rotate-180 ax-icon ax-icon-chevron-right">
12392
- </ax-icon>
12393
- </ax-button>
12394
- </ax-prefix>
12395
-
12396
- <ax-suffix>
12397
- <ax-button
12398
- class="ax-sm"
12399
- (click)="c.prev()"
12400
- [disabled]="c.getActiveIndex() === 0"
12401
- >
12402
- <ax-icon class="rtl:rotate-180 ax-icon ax-icon-chevron-left">
12403
- </ax-icon>
12404
- </ax-button>
12405
- </ax-suffix>
12406
- </ax-media-viewer-container>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXMediaViewerModule }, { kind: "component", type: i1$e.AXMediaViewerContainerComponent, selector: "ax-media-viewer-container", inputs: ["dataArray", "thumbnail", "pagination"] }, { kind: "component", type: i1$e.AXFileInfoComponent, selector: "ax-file-info" }, { 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: "component", type: i2$1.AXDecoratorFullScreenButtonComponent, selector: "ax-fullscreen-button", inputs: ["element", "isActive"], outputs: ["elementChange", "isActiveChange"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: AXPFileChooserDirective, selector: "[axpFileChooser]", inputs: ["context", "disabled", "items", "busy"], outputs: ["itemsChange", "busyChange"] }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12407
- }
12408
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPGalleryWidgetEditComponent, decorators: [{
12409
- type: Component,
12410
- args: [{
12411
- selector: 'axp-gallery-widget-edit',
12412
- template: ` <ax-media-viewer-container
12413
- style="height: 75vh;"
12414
- [thumbnail]="thumbnail()"
12415
- #c
12416
- [dataArray]="mediaViewerData()"
12417
- >
12418
- @if (header()) {
12419
- <ax-header>
12420
- @if (allowUpload()) {
12421
- <ax-prefix>
12422
- <ax-button
12423
- axpFileChooser
12424
- class="ax-sm"
12425
- color="primary"
12426
- [text]="'@general:actions.add-item.title' | translate | async"
12427
- [context]="chooserContext()"
12428
- [items]="files()"
12429
- [busy]="isChoosing()"
12430
- (itemsChange)="onChooserItemsChanged($event)"
12431
- (busyChange)="isChoosing.set($event)"
12432
- >
12433
- <ax-prefix>
12434
- <ax-icon icon="fa-light fa-plus"></ax-icon>
12435
- </ax-prefix>
12436
- </ax-button>
12437
- </ax-prefix>
12438
- }
12439
-
12440
- @if (fileInfo()) {
12441
- <ax-file-info></ax-file-info>
12442
- }
12443
-
12444
- <ax-suffix>
12445
- @if (downloadButton()) {
12446
- <ax-button
12447
- class="ax-sm"
12448
- look="blank"
12449
- (click)="download()"
12450
- [disabled]="mediaViewerData().length === 0"
12451
- >
12452
- <ax-icon icon="fa-light fa-download"></ax-icon>
12453
- </ax-button>
12454
- }
12455
- @if (fullScreenButton()) {
12456
- <ax-fullscreen-button> </ax-fullscreen-button>
12457
- }
12458
- </ax-suffix>
12459
- </ax-header>
12460
- }
12461
-
12462
- <ax-prefix>
12463
- <ax-button
12464
- class="ax-sm"
12465
- (click)="c.next()"
12466
- [disabled]="c.getActiveIndex() === this.mediaViewerData().length - 1"
12467
- >
12468
- <ax-icon class="rtl:rotate-180 ax-icon ax-icon-chevron-right">
12469
- </ax-icon>
12470
- </ax-button>
12471
- </ax-prefix>
12472
-
12473
- <ax-suffix>
12474
- <ax-button
12475
- class="ax-sm"
12476
- (click)="c.prev()"
12477
- [disabled]="c.getActiveIndex() === 0"
12478
- >
12479
- <ax-icon class="rtl:rotate-180 ax-icon ax-icon-chevron-left">
12480
- </ax-icon>
12481
- </ax-button>
12482
- </ax-suffix>
12483
- </ax-media-viewer-container>`,
12484
- host: {
12485
- class: 'block',
12486
- '[style.height]': 'height()',
12487
- },
12488
- changeDetection: ChangeDetectionStrategy.OnPush,
12489
- imports: [
12490
- AXMediaViewerModule,
12491
- AXDecoratorModule,
12492
- AXButtonModule,
12493
- AXTranslationModule,
12494
- AXPFileChooserDirective,
12495
- AsyncPipe,
12496
- ],
12497
- }]
12498
- }], propDecorators: { gallery: [{ type: i0.ViewChild, args: ['c', { isSignal: true }] }] } });
12499
-
12500
- var galleryWidgetEdit_component = /*#__PURE__*/Object.freeze({
12501
- __proto__: null,
12502
- AXPGalleryWidgetEditComponent: AXPGalleryWidgetEditComponent
12503
- });
12504
-
12505
- class AXPGalleryWidgetViewComponent extends AXPValueWidgetComponent {
12506
- constructor() {
12507
- super(...arguments);
12508
- this.loadingDialog = inject(AXLoadingDialogService);
12509
- this.translationService = inject(AXTranslationService);
12510
- this.internalValue = computed(() => {
12511
- const parsedValue = this.getValue() ? JSON.parse(this.getValue()) : [];
12512
- return Array.isArray(parsedValue) ? parsedValue.map((c) => c) : [parsedValue];
12513
- }, /* @ts-ignore */
12514
- ...(ngDevMode ? [{ debugName: "internalValue" }] : /* istanbul ignore next */ []));
12515
- this.multiple = computed(() => this.options()['multiple'], /* @ts-ignore */
12516
- ...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
12517
- this.height = computed(() => this.options()['height'] ?? 30, /* @ts-ignore */
12518
- ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
12519
- this.header = computed(() => this.options()['header'] ?? true, /* @ts-ignore */
12520
- ...(ngDevMode ? [{ debugName: "header" }] : /* istanbul ignore next */ []));
12521
- this.fullScreenButton = computed(() => this.options()['fullScreenButton'] ?? true, /* @ts-ignore */
12522
- ...(ngDevMode ? [{ debugName: "fullScreenButton" }] : /* istanbul ignore next */ []));
12523
- this.downloadButton = computed(() => this.options()['downloadButton'] ?? true, /* @ts-ignore */
12524
- ...(ngDevMode ? [{ debugName: "downloadButton" }] : /* istanbul ignore next */ []));
12525
- this.thumbnails = computed(() => this.internalValue().filter((i) => i.id !== this.activeMedia()?.id), /* @ts-ignore */
12526
- ...(ngDevMode ? [{ debugName: "thumbnails" }] : /* istanbul ignore next */ []));
12527
- this.activeMedia = signal(undefined, /* @ts-ignore */
12528
- ...(ngDevMode ? [{ debugName: "activeMedia" }] : /* istanbul ignore next */ []));
12529
- }
12530
- ngAfterViewInit() {
12531
- this.activeMedia.set(this.internalValue()[0]);
12532
- }
12533
- changeMediaSelected(media) {
12534
- this.activeMedia.set(media);
12535
- }
12536
- /** Downloads the currently active media file. */
12537
- async download() {
12538
- const media = this.activeMedia();
12539
- if (!media?.url) {
12540
- return;
12541
- }
12542
- const loadingDialogRef = this.loadingDialog.show({
12543
- title: await this.translationService.translateAsync('@general:actions.download.processing'),
12544
- mode: 'indeterminate',
12545
- progressColor: 'primary',
12546
- status: await this.translationService.translateAsync('@general:actions.download.processing'),
12547
- });
12548
- try {
12549
- const link = document.createElement('a');
12550
- link.href = media.url;
12551
- link.download = media.name ?? 'download';
12552
- link.target = '_blank';
12553
- link.rel = 'noopener noreferrer';
12554
- link.click();
12555
- }
12556
- finally {
12557
- loadingDialogRef.close();
12558
- }
12559
- }
12560
- getMediaInfo(mediaName) {
12561
- const extension = mediaName.split('.').pop()?.toLowerCase();
12562
- switch (extension) {
12563
- case 'jpg':
12564
- case 'jpeg':
12565
- case 'png':
12566
- case 'gif':
12567
- case 'bmp':
12568
- case 'webp':
12569
- case 'svg':
12570
- return { icon: '', format: 'image' };
12571
- case 'pdf':
12572
- return { icon: 'fa-regular fa-file-pdf', format: 'image' };
12573
- case 'mp4':
12574
- case 'webm':
12575
- case 'avi':
12576
- case 'mkv':
12577
- case 'mov':
12578
- case 'm4v':
12579
- case 'wmv':
12580
- return { icon: 'fa-regular fa-play', format: 'video' };
12581
- case 'mp3':
12582
- case 'wav':
12583
- case 'ogg':
12584
- case 'oga':
12585
- case 'm4a':
12586
- case 'flac':
12587
- case 'aac':
12588
- case 'wma':
12589
- case 'weba':
12590
- return { icon: 'fa-regular fa-volume-high', format: 'audio' };
12591
- default:
12592
- return { icon: '', format: 'image' };
12593
- }
12594
- }
12595
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPGalleryWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
12596
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPGalleryWidgetViewComponent, isStandalone: true, selector: "axp-gallery-widget-view", host: { properties: { "style.height": "height()" }, classAttribute: "block" }, usesInheritance: true, ngImport: i0, template: `
12597
- <div class="grid grid-cols-12 gap-2">
12598
- @if (internalValue().length) {
12599
- @if (header()) {
12600
- <div class="col-start-1 col-end-13 flex justify-end gap-2 mb-2">
12601
- @if (downloadButton()) {
12602
- <ax-button class="ax-sm" look="blank" (click)="download()">
12603
- <ax-icon icon="fa-light fa-download"></ax-icon>
12604
- </ax-button>
12605
- }
12606
- @if (fullScreenButton()) {
12607
- <ax-fullscreen-button></ax-fullscreen-button>
12608
- }
12609
- </div>
12610
- }
12611
- <div class="flex items-center justify-between rounded-lg col-start-1 col-end-13">
12612
- <div class="flex items-center md:justify-start justify-center w-full gap-3">
12613
- <div class="flex flex-col items-center gap-4">
12614
- @switch (getMediaInfo(activeMedia()?.name || '').format) {
12615
- @case ('video') {
12616
- <video
12617
- class="rounded-lg h-48 md:h-72 w-auto shadow-md"
12618
- controls
12619
- [src]="$safeNavigationMigration(activeMedia()?.url)"
12620
- ></video>
12621
- }
12622
- @case ('image') {
12623
- <ax-image class="rounded-lg h-48 md:h-72 w-auto" [src]="$safeNavigationMigration(activeMedia()?.url)">
12624
- <ax-loading></ax-loading>
12625
- <ax-placeholder>
12626
- <div
12627
- class="w-96 h-72 gap-4 flex flex-col items-center justify-center border rounded-lg"
12628
- >
12629
- <ax-icon class="fa-solid fa-circle-exclamation text-2xl"> </ax-icon>
12630
- <span>Connection Error!</span>
12631
- </div>
12632
- </ax-placeholder>
12633
- </ax-image>
12634
- }
12635
- @case ('audio') {
12636
- <audio controls class="rounded-lg">
12637
- <source [src]="$safeNavigationMigration(activeMedia()?.url)" type="audio/mp3" />
12638
- </audio>
12639
- }
12640
- }
12641
- <div class="flex gap-4 overflow-x-auto max-w-[320px] lg:max-w-[480px] pb-2">
12642
- @for (media of thumbnails(); track $index) {
12643
- @if (getMediaInfo(media.name); as mediaInfo) {
12644
- <div
12645
- class="hover:opacity-75 transition-all relative cursor-pointer flex justify-center items-center"
12646
- (click)="changeMediaSelected(media)"
12647
- >
12648
- <ax-image
12649
- class="w-16 brightness-50 h-16 rounded-lg shadow-md filter"
12650
- [src]="mediaInfo.format == 'image' ? media.url : media.posterUrl"
12651
- ></ax-image>
12652
- <div class="absolute text-neutral-300 text-xl">
12653
- <ax-icon [class]="mediaInfo.icon"> </ax-icon>
12654
- </div>
12655
- </div>
12656
- }
12657
- }
12658
- </div>
12659
- </div>
12660
- </div>
12661
- </div>
12662
- } @else {
12663
- <!-- Empty State -->
12664
- <axp-state-message
12665
- icon="fa-light fa-images"
12666
- [title]="'@general:no-media.title'"
12667
- [description]="'@general:no-media.description'"
12668
- >
12669
- </axp-state-message>
12670
- }
12671
- </div>
12672
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i1$f.AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { 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: "component", type: i2$1.AXDecoratorFullScreenButtonComponent, selector: "ax-fullscreen-button", inputs: ["element", "isActive"], outputs: ["elementChange", "isActiveChange"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2$2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "titleParams", "descriptionParams", "look"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXMediaViewerModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12673
- }
12674
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPGalleryWidgetViewComponent, decorators: [{
12675
- type: Component,
12676
- args: [{
12677
- selector: 'axp-gallery-widget-view',
12678
- template: `
12679
- <div class="grid grid-cols-12 gap-2">
12680
- @if (internalValue().length) {
12681
- @if (header()) {
12682
- <div class="col-start-1 col-end-13 flex justify-end gap-2 mb-2">
12683
- @if (downloadButton()) {
12684
- <ax-button class="ax-sm" look="blank" (click)="download()">
12685
- <ax-icon icon="fa-light fa-download"></ax-icon>
12686
- </ax-button>
12687
- }
12688
- @if (fullScreenButton()) {
12689
- <ax-fullscreen-button></ax-fullscreen-button>
12690
- }
12691
- </div>
12692
- }
12693
- <div class="flex items-center justify-between rounded-lg col-start-1 col-end-13">
12694
- <div class="flex items-center md:justify-start justify-center w-full gap-3">
12695
- <div class="flex flex-col items-center gap-4">
12696
- @switch (getMediaInfo(activeMedia()?.name || '').format) {
12697
- @case ('video') {
12698
- <video
12699
- class="rounded-lg h-48 md:h-72 w-auto shadow-md"
12700
- controls
12701
- [src]="$safeNavigationMigration(activeMedia()?.url)"
12702
- ></video>
12703
- }
12704
- @case ('image') {
12705
- <ax-image class="rounded-lg h-48 md:h-72 w-auto" [src]="$safeNavigationMigration(activeMedia()?.url)">
12706
- <ax-loading></ax-loading>
12707
- <ax-placeholder>
12708
- <div
12709
- class="w-96 h-72 gap-4 flex flex-col items-center justify-center border rounded-lg"
12710
- >
12711
- <ax-icon class="fa-solid fa-circle-exclamation text-2xl"> </ax-icon>
12712
- <span>Connection Error!</span>
12713
- </div>
12714
- </ax-placeholder>
12715
- </ax-image>
12716
- }
12717
- @case ('audio') {
12718
- <audio controls class="rounded-lg">
12719
- <source [src]="$safeNavigationMigration(activeMedia()?.url)" type="audio/mp3" />
12720
- </audio>
12721
- }
12722
- }
12723
- <div class="flex gap-4 overflow-x-auto max-w-[320px] lg:max-w-[480px] pb-2">
12724
- @for (media of thumbnails(); track $index) {
12725
- @if (getMediaInfo(media.name); as mediaInfo) {
12726
- <div
12727
- class="hover:opacity-75 transition-all relative cursor-pointer flex justify-center items-center"
12728
- (click)="changeMediaSelected(media)"
12729
- >
12730
- <ax-image
12731
- class="w-16 brightness-50 h-16 rounded-lg shadow-md filter"
12732
- [src]="mediaInfo.format == 'image' ? media.url : media.posterUrl"
12733
- ></ax-image>
12734
- <div class="absolute text-neutral-300 text-xl">
12735
- <ax-icon [class]="mediaInfo.icon"> </ax-icon>
12736
- </div>
12737
- </div>
12738
- }
12739
- }
12740
- </div>
12741
- </div>
12742
- </div>
12743
- </div>
12744
- } @else {
12745
- <!-- Empty State -->
12746
- <axp-state-message
12747
- icon="fa-light fa-images"
12748
- [title]="'@general:no-media.title'"
12749
- [description]="'@general:no-media.description'"
12750
- >
12751
- </axp-state-message>
12752
- }
12753
- </div>
12754
- `,
12755
- host: {
12756
- class: 'block',
12757
- '[style.height]': 'height()',
12758
- },
12759
- changeDetection: ChangeDetectionStrategy.OnPush,
12760
- imports: [
12761
- AXImageModule,
12762
- AXDecoratorModule,
12763
- AXLoadingModule,
12764
- AXPStateMessageComponent,
12765
- AXButtonModule,
12766
- AXMediaViewerModule,
12767
- ],
12768
- }]
12769
- }] });
12770
-
12771
- var galleryWidgetView_component = /*#__PURE__*/Object.freeze({
12772
- __proto__: null,
12773
- AXPGalleryWidgetViewComponent: AXPGalleryWidgetViewComponent
12774
- });
12775
-
12776
- const AXPGalleryWidget = {
12777
- name: 'gallery',
12778
- title: '@platform-layout-widgets:widgets.gallery.title',
12779
- description: '@platform-layout-widgets:widgets.gallery.description',
12780
- icon: 'fa-light fa-images',
12781
- categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
12782
- subCategory: AXP_WIDGETS_ADVANCE_SUB_MEDIA,
12783
- groups: [AXPWidgetGroupEnum.FormElement],
12784
- properties: [
12785
- AXP_NAME_PROPERTY,
12786
- AXP_DATA_PATH_PROPERTY,
12787
- createBooleanProperty({
12788
- name: 'thumbnail',
12789
- title: 'Thumbnail',
12790
- group: AXP_BEHAVIOR_PROPERTY_GROUP,
12791
- defaultValue: true,
12792
- path: 'options.thumbnail',
12793
- }),
12794
- createBooleanProperty({
12795
- name: 'header',
12796
- title: 'Header',
12797
- group: AXP_BEHAVIOR_PROPERTY_GROUP,
12798
- defaultValue: true,
12799
- path: 'options.header',
12800
- }),
12801
- createBooleanProperty({
12802
- name: 'fileInfo',
12803
- title: 'File Info',
12804
- group: AXP_BEHAVIOR_PROPERTY_GROUP,
12805
- defaultValue: true,
12806
- path: 'options.fileInfo',
12807
- }),
12808
- createBooleanProperty({
12809
- name: 'fullScreenButton',
12810
- title: 'Full Screen Button',
12811
- group: AXP_BEHAVIOR_PROPERTY_GROUP,
12812
- defaultValue: true,
12813
- path: 'options.fullScreenButton',
12814
- }),
12815
- ],
12816
- type: 'editor',
12817
- components: {
12818
- view: {
12819
- component: () => Promise.resolve().then(function () { return galleryWidgetView_component; }).then((c) => c.AXPGalleryWidgetViewComponent),
12820
- },
12821
- edit: {
12822
- component: () => Promise.resolve().then(function () { return galleryWidgetEdit_component; }).then((c) => c.AXPGalleryWidgetEditComponent),
12823
- },
12824
- designer: {
12825
- component: () => Promise.resolve().then(function () { return galleryWidgetEdit_component; }).then((c) => c.AXPGalleryWidgetEditComponent),
12826
- },
12827
- },
12828
- };
12829
-
12830
- class AXPImageMarkerPopupComponent extends AXBasePageComponent {
12831
- ngOnInit() {
12832
- this.node = {
12833
- name: 'image-marker-popup-view',
12834
- type: 'image-marker',
12835
- options: this.options,
12836
- defaultValue: this.value,
12837
- };
12838
- }
12839
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPImageMarkerPopupComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
12840
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPImageMarkerPopupComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: `
12841
- <axp-widgets-container>
12842
- <ng-container axp-widget-renderer [node]="node" mode="view"></ng-container>
12843
- </axp-widgets-container>
12844
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i1.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12845
- }
12846
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPImageMarkerPopupComponent, decorators: [{
12847
- type: Component,
12848
- args: [{
12849
- imports: [AXPWidgetCoreModule],
12850
- template: `
12851
- <axp-widgets-container>
12852
- <ng-container axp-widget-renderer [node]="node" mode="view"></ng-container>
12853
- </axp-widgets-container>
12854
- `,
12855
- changeDetection: ChangeDetectionStrategy.OnPush,
12856
- }]
12857
- }] });
12858
-
12859
- class AXPImageMarkerWidgetColumnComponent extends AXPColumnWidgetComponent {
12860
- constructor() {
12861
- super();
12862
- this.layoutBuilder = inject(AXPLayoutBuilderService);
12863
- this.rawImage = computed(() => this.options?.image, /* @ts-ignore */
12864
- ...(ngDevMode ? [{ debugName: "rawImage" }] : /* istanbul ignore next */ []));
12865
- this.rawPoints = () => this.rawValue;
12866
- this.imageUrl = signal(null, /* @ts-ignore */
12867
- ...(ngDevMode ? [{ debugName: "imageUrl" }] : /* istanbul ignore next */ []));
12868
- effect(() => {
12869
- const imageSource = this.rawImage();
12870
- const currentUrl = this.imageUrl();
12871
- if (currentUrl && currentUrl.startsWith('blob:')) {
12872
- URL.revokeObjectURL(currentUrl);
12873
- }
12874
- if (typeof imageSource === 'string') {
12875
- this.imageUrl.set(imageSource);
12876
- }
12877
- else if (imageSource instanceof URL) {
12878
- this.imageUrl.set(imageSource.href);
12879
- }
12880
- else if (imageSource instanceof Blob) {
12881
- this.imageUrl.set(URL.createObjectURL(imageSource));
12882
- }
12883
- else if (imageSource instanceof ArrayBuffer) {
12884
- const blob = new Blob([imageSource]);
12885
- this.imageUrl.set(URL.createObjectURL(blob));
12886
- }
12887
- else {
12888
- this.imageUrl.set(null);
12889
- }
12890
- });
12891
- }
12892
- async showPopup() {
12893
- const url = this.imageUrl();
12894
- if (!url) {
12334
+ async showPopup() {
12335
+ const url = this.imageUrl();
12336
+ if (!url) {
12895
12337
  return;
12896
12338
  }
12897
12339
  const opts = this.options;
@@ -12939,7 +12381,7 @@ class AXPImageMarkerWidgetColumnComponent extends AXPColumnWidgetComponent {
12939
12381
  </ax-icon>
12940
12382
  </ax-button>
12941
12383
  </div>
12942
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12384
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12943
12385
  }
12944
12386
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPImageMarkerWidgetColumnComponent, decorators: [{
12945
12387
  type: Component,
@@ -13330,7 +12772,7 @@ const AXPImageMarkerWidget = {
13330
12772
  //#region ----- Imports -----
13331
12773
  //#endregion
13332
12774
  //#region ----- Constants -----
13333
- const I18N = '@platform-layout-widgets:widgets.integration-connections-panel';
12775
+ const I18N$1 = '@platform-layout-widgets:widgets.integration-connections-panel';
13334
12776
  const ACTION_CLICK_GUARD_MS$1 = 300;
13335
12777
  const CONNECTION_UPDATE_COMMAND = 'IntegrationManagement.Connection:Update';
13336
12778
  const DISCONNECT_COMMAND = 'IntegrationManagement.Connection:Disconnect';
@@ -13481,7 +12923,7 @@ class AXPIntegrationConnectionActionsService {
13481
12923
  }
13482
12924
  async disconnect(provider, connection) {
13483
12925
  const connectionLabel = await this.resolveConnectionLabel(provider, connection);
13484
- const confirmed = await this.dialogService.confirm(await this.translationService.translateAsync(`${I18N}.dialogs.disconnect.title`), await this.translationService.translateAsync(`${I18N}.dialogs.disconnect.message`, {
12926
+ const confirmed = await this.dialogService.confirm(await this.translationService.translateAsync(`${I18N$1}.dialogs.disconnect.title`), await this.translationService.translateAsync(`${I18N$1}.dialogs.disconnect.message`, {
13485
12927
  params: { provider: connectionLabel },
13486
12928
  }), 'danger', 'horizontal', false, 'cancel');
13487
12929
  if (confirmed.result !== true) {
@@ -13494,7 +12936,7 @@ class AXPIntegrationConnectionActionsService {
13494
12936
  }
13495
12937
  async remove(provider, connection) {
13496
12938
  const connectionLabel = await this.resolveConnectionLabel(provider, connection);
13497
- const confirmed = await this.dialogService.confirm(await this.translationService.translateAsync(`${I18N}.dialogs.remove.title`), await this.translationService.translateAsync(`${I18N}.dialogs.remove.message`, {
12939
+ const confirmed = await this.dialogService.confirm(await this.translationService.translateAsync(`${I18N$1}.dialogs.remove.title`), await this.translationService.translateAsync(`${I18N$1}.dialogs.remove.message`, {
13498
12940
  params: { provider: connectionLabel },
13499
12941
  }), 'danger', 'horizontal', false, 'cancel');
13500
12942
  if (confirmed.result !== true) {
@@ -13973,7 +13415,7 @@ class AXPIntegrationConnectionsPanelWidgetEditComponent extends AXPValueWidgetCo
13973
13415
  this.providerBadges.set(resolved);
13974
13416
  }
13975
13417
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPIntegrationConnectionsPanelWidgetEditComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
13976
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPIntegrationConnectionsPanelWidgetEditComponent, isStandalone: true, selector: "axp-integration-connections-panel-widget-edit", usesInheritance: true, ngImport: i0, template: "<!-- ----- Integration connections panel: loading state or provider cards ----- -->\n<div class=\"flex w-full flex-col gap-4\">\n @if (loading()) {\n <!-- ----- Loading indicator while providers and connections are fetched ----- -->\n <ax-loading></ax-loading>\n }\n <!-- ----- Provider cards filtered by widget options (providerId, domainId) ----- -->\n @else {\n @for (provider of visibleProviders(); track provider.id) {\n <section\n class=\"flex flex-col gap-4 rounded-lg border border-surface bg-lighter-surface p-4\"\n >\n <div class=\"flex items-start justify-between gap-3\">\n <!-- ----- Provider identity: logo/icon, title, description, and status badges ----- -->\n <div class=\"flex min-w-0 items-center gap-3\">\n @if (provider.logoKey) {\n <axp-logo\n [logoKey]=\"provider.logoKey\"\n appearance=\"colored\"\n [size]=\"24\"\n />\n }\n <!-- ----- Fallback icon when no logo key is configured ----- -->\n @else if (provider.icon) {\n <ax-icon class=\"text-lg\">\n <i [class]=\"provider.icon\"></i>\n </ax-icon>\n }\n\n <div class=\"min-w-0\">\n <!-- ----- Provider display name and connect-disabled warning badge ----- -->\n <div class=\"flex flex-wrap items-center gap-2 font-medium\">\n <span>{{ provider.displayName | translate | async }}</span>\n <!--------------------------------------------------------------->\n @if (isConnectDisabled(provider.id) && connectDisabledBadgeKey(provider.id); as badgeKey) {\n <span\n class=\"inline-flex cursor-help\"\n [axTooltip]=\"(connectDisabledMessageKey(provider.id) | translate | async) ?? ''\"\n axTooltipPlacement=\"top\"\n [attr.aria-label]=\"(connectDisabledMessageKey(provider.id) | translate | async) ?? ''\"\n >\n <ax-badge\n size=\"sm\"\n look=\"twotone\"\n color=\"warning\"\n [text]=\"(badgeKey | translate | async) ?? ''\"\n ></ax-badge>\n </span>\n }\n </div>\n\n <!--------------------------------------------------------------->\n <!-- ----- Optional provider description ----- -->\n @if (provider.description) {\n <div class=\"text-sm opacity-70\">\n {{ provider.description | translate | async }}\n </div>\n }\n </div>\n </div>\n\n <!-- ----- Status badges and connect or manage actions ----- -->\n <div class=\"flex shrink-0 flex-wrap items-center justify-end gap-2\">\n @if (getProviderBadges(provider.id); as badges) {\n <!--------------------------------------------------------------->\n <!-- ----- Runtime connection settings badges (e.g. last sync) ----- -->\n @if (badges.length > 0) {\n <div class=\"flex flex-wrap items-center gap-1\">\n @for (badge of badges; track badge.text) {\n <ax-badge\n size=\"sm\"\n [look]=\"'twotone'\"\n [color]=\"badge.color\"\n [text]=\"badge.text\"\n ></ax-badge>\n }\n </div>\n }\n }\n @if (isProviderConnected(provider.id)) {\n <!-- ----- Manage dropdown: reconfigure and disconnect ----- -->\n <ax-dropdown-button\n size=\"sm\"\n look=\"twotone\"\n color=\"primary\"\n [mode]=\"'dropdown'\"\n type=\"button\"\n [disabled]=\"pendingAction()\"\n [text]=\"(I18N + '.actions.manage' | translate | async) ?? ''\"\n >\n <ax-button-item-list>\n @if (supportsConnect(provider)) {\n <ax-button-item\n [text]=\"(I18N + '.actions.reconfigure' | translate | async) ?? ''\"\n [disabled]=\"pendingAction() || isConnectDisabled(provider.id)\"\n (onClick)=\"handleConfigure(provider)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-gear\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n }\n @for (action of getManageActions(provider); track action.commandKey) {\n <ax-button-item\n [text]=\"(action.titleKey | translate | async) ?? ''\"\n [color]=\"action.color\"\n [disabled]=\"pendingAction()\"\n (onClick)=\"handleManageAction(provider, action)\"\n >\n @if (action.icon) {\n <ax-prefix>\n <ax-icon [icon]=\"action.icon\"></ax-icon>\n </ax-prefix>\n }\n </ax-button-item>\n }\n <ax-button-item\n [text]=\"(I18N + '.actions.disconnect' | translate | async) ?? ''\"\n color=\"danger\"\n [disabled]=\"pendingAction()\"\n (onClick)=\"disconnect(provider.id)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-link-slash\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-button>\n }\n <!-- ----- Connect action when provider is not yet connected ----- -->\n @else if (supportsConnect(provider)) {\n <ax-button\n size=\"sm\"\n look=\"twotone\"\n color=\"primary\"\n type=\"button\"\n [disabled]=\"pendingAction() || isConnectDisabled(provider.id)\"\n [text]=\"(I18N + '.actions.connect' | translate | async) ?? ''\"\n (onClick)=\"handleConnect(provider)\"\n >\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-arrow-up-right-from-square\"></ax-icon>\n </ax-suffix>\n </ax-button>\n }\n </div>\n </div>\n </section>\n }\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: AXBadgeModule }, { kind: "component", type: i1$3.AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i1$1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1$1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "component", type: i6.AXDropdownButtonComponent, selector: "ax-dropdown-button", inputs: ["disabled", "size", "text", "color", "look", "type", "mode"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "lookChange", "colorChange", "disabledChange"] }, { 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: AXLoadingModule }, { kind: "component", type: i2$2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXTooltipModule }, { kind: "directive", type: i6$1.AXTooltipDirective, selector: "[axTooltip]", inputs: ["axTooltipDisabled", "axTooltip", "axTooltipContext", "axTooltipPlacement", "axTooltipOffsetX", "axTooltipOffsetY", "axTooltipOpenAfter", "axTooltipCloseAfter"] }, { kind: "component", type: AXPLogoComponent, selector: "axp-logo", inputs: ["logoKey", "appearance", "size", "format"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
13418
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPIntegrationConnectionsPanelWidgetEditComponent, isStandalone: true, selector: "axp-integration-connections-panel-widget-edit", usesInheritance: true, ngImport: i0, template: "<!-- ----- Integration connections panel: loading state or provider cards ----- -->\n<div class=\"flex w-full flex-col gap-4\">\n @if (loading()) {\n <!-- ----- Loading indicator while providers and connections are fetched ----- -->\n <ax-loading></ax-loading>\n }\n <!-- ----- Provider cards filtered by widget options (providerId, domainId) ----- -->\n @else {\n @for (provider of visibleProviders(); track provider.id) {\n <section\n class=\"flex flex-col gap-4 rounded-lg border border-surface bg-lighter-surface p-4\"\n >\n <div class=\"flex items-start justify-between gap-3\">\n <!-- ----- Provider identity: logo/icon, title, description, and status badges ----- -->\n <div class=\"flex min-w-0 items-center gap-3\">\n @if (provider.logoKey) {\n <axp-logo\n [logoKey]=\"provider.logoKey\"\n appearance=\"colored\"\n [size]=\"24\"\n />\n }\n <!-- ----- Fallback icon when no logo key is configured ----- -->\n @else if (provider.icon) {\n <ax-icon class=\"text-lg\">\n <i [class]=\"provider.icon\"></i>\n </ax-icon>\n }\n\n <div class=\"min-w-0\">\n <!-- ----- Provider display name and connect-disabled warning badge ----- -->\n <div class=\"flex flex-wrap items-center gap-2 font-medium\">\n <span>{{ provider.displayName | translate | async }}</span>\n <!--------------------------------------------------------------->\n @if (isConnectDisabled(provider.id) && connectDisabledBadgeKey(provider.id); as badgeKey) {\n <span\n class=\"inline-flex cursor-help\"\n [axTooltip]=\"(connectDisabledMessageKey(provider.id) | translate | async) ?? ''\"\n axTooltipPlacement=\"top\"\n [attr.aria-label]=\"(connectDisabledMessageKey(provider.id) | translate | async) ?? ''\"\n >\n <ax-badge\n size=\"sm\"\n look=\"twotone\"\n color=\"warning\"\n [text]=\"(badgeKey | translate | async) ?? ''\"\n ></ax-badge>\n </span>\n }\n </div>\n\n <!--------------------------------------------------------------->\n <!-- ----- Optional provider description ----- -->\n @if (provider.description) {\n <div class=\"text-sm opacity-70\">\n {{ provider.description | translate | async }}\n </div>\n }\n </div>\n </div>\n\n <!-- ----- Status badges and connect or manage actions ----- -->\n <div class=\"flex shrink-0 flex-wrap items-center justify-end gap-2\">\n @if (getProviderBadges(provider.id); as badges) {\n <!--------------------------------------------------------------->\n <!-- ----- Runtime connection settings badges (e.g. last sync) ----- -->\n @if (badges.length > 0) {\n <div class=\"flex flex-wrap items-center gap-1\">\n @for (badge of badges; track badge.text) {\n <ax-badge\n size=\"sm\"\n [look]=\"'twotone'\"\n [color]=\"badge.color\"\n [text]=\"badge.text\"\n ></ax-badge>\n }\n </div>\n }\n }\n @if (isProviderConnected(provider.id)) {\n <!-- ----- Manage dropdown: reconfigure and disconnect ----- -->\n <ax-dropdown-button\n size=\"sm\"\n look=\"twotone\"\n color=\"primary\"\n [mode]=\"'dropdown'\"\n type=\"button\"\n [disabled]=\"pendingAction()\"\n [text]=\"(I18N + '.actions.manage' | translate | async) ?? ''\"\n >\n <ax-button-item-list>\n @if (supportsConnect(provider)) {\n <ax-button-item\n [text]=\"(I18N + '.actions.reconfigure' | translate | async) ?? ''\"\n [disabled]=\"pendingAction() || isConnectDisabled(provider.id)\"\n (onClick)=\"handleConfigure(provider)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-gear\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n }\n @for (action of getManageActions(provider); track action.commandKey) {\n <ax-button-item\n [text]=\"(action.titleKey | translate | async) ?? ''\"\n [color]=\"action.color\"\n [disabled]=\"pendingAction()\"\n (onClick)=\"handleManageAction(provider, action)\"\n >\n @if (action.icon) {\n <ax-prefix>\n <ax-icon [icon]=\"action.icon\"></ax-icon>\n </ax-prefix>\n }\n </ax-button-item>\n }\n <ax-button-item\n [text]=\"(I18N + '.actions.disconnect' | translate | async) ?? ''\"\n color=\"danger\"\n [disabled]=\"pendingAction()\"\n (onClick)=\"disconnect(provider.id)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-link-slash\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-button>\n }\n <!-- ----- Connect action when provider is not yet connected ----- -->\n @else if (supportsConnect(provider)) {\n <ax-button\n size=\"sm\"\n look=\"twotone\"\n color=\"primary\"\n type=\"button\"\n [disabled]=\"pendingAction() || isConnectDisabled(provider.id)\"\n [text]=\"(I18N + '.actions.connect' | translate | async) ?? ''\"\n (onClick)=\"handleConnect(provider)\"\n >\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-arrow-up-right-from-square\"></ax-icon>\n </ax-suffix>\n </ax-button>\n }\n </div>\n </div>\n </section>\n }\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: AXBadgeModule }, { kind: "component", type: i1$3.AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: i1$1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1$1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "component", type: i6.AXDropdownButtonComponent, selector: "ax-dropdown-button", inputs: ["disabled", "size", "text", "color", "look", "type", "mode"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "lookChange", "colorChange", "disabledChange"] }, { 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: AXLoadingModule }, { kind: "component", type: i2$2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXTooltipModule }, { kind: "directive", type: i6$1.AXTooltipDirective, selector: "[axTooltip]", inputs: ["axTooltipDisabled", "axTooltip", "axTooltipContext", "axTooltipPlacement", "axTooltipOffsetX", "axTooltipOffsetY", "axTooltipOpenAfter", "axTooltipCloseAfter"] }, { kind: "component", type: AXPLogoComponent, selector: "axp-logo", inputs: ["logoKey", "appearance", "size", "format"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
13977
13419
  }
13978
13420
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPIntegrationConnectionsPanelWidgetEditComponent, decorators: [{
13979
13421
  type: Component,
@@ -14028,7 +13470,7 @@ class AXPJsonViewerWidgetViewComponent extends AXPValueWidgetComponent {
14028
13470
  <div class="w-full">
14029
13471
  <ax-json-viewer [json]="jsonValue()"></ax-json-viewer>
14030
13472
  </div>
14031
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXJsonViewerModule }, { kind: "component", type: i1$g.JsonViewerComponent, selector: "ax-json-viewer", inputs: ["json"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
13473
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXJsonViewerModule }, { kind: "component", type: i1$e.JsonViewerComponent, selector: "ax-json-viewer", inputs: ["json"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14032
13474
  }
14033
13475
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPJsonViewerWidgetViewComponent, decorators: [{
14034
13476
  type: Component,
@@ -14085,7 +13527,7 @@ class AXPJsonViewerWidgetEditComponent extends AXPValueWidgetComponent {
14085
13527
  <div class="w-full">
14086
13528
  <ax-json-viewer [json]="jsonValue()"></ax-json-viewer>
14087
13529
  </div>
14088
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXJsonViewerModule }, { kind: "component", type: i1$g.JsonViewerComponent, selector: "ax-json-viewer", inputs: ["json"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
13530
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXJsonViewerModule }, { kind: "component", type: i1$e.JsonViewerComponent, selector: "ax-json-viewer", inputs: ["json"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14089
13531
  }
14090
13532
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPJsonViewerWidgetEditComponent, decorators: [{
14091
13533
  type: Component,
@@ -14321,7 +13763,7 @@ class AXPMapWidgetEditComponent extends AXPValueWidgetComponent {
14321
13763
  [readonly]="readonly()"
14322
13764
  >
14323
13765
  </ax-map>
14324
- </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXMapModule }, { kind: "component", type: i1$h.AXMapComponent, selector: "ax-map", inputs: ["zoomLevel", "latitude", "longitude", "maxMarker", "maxPolygon", "maxPolyline", "maxRectangle", "maxCircle", "hasDraw", "hasLocator", "fitToDraw", "limitDraw", "addPoiToFitDraw", "addMarkerOnTap", "readonly", "disabled", "markerPlace", "locatePlace", "poiMinZoom", "markers", "polygons", "polylines", "rectangles", "circles", "pois"], outputs: ["zoomLevelChange", "latitudeChange", "longitudeChange", "onMarkerAdded", "onMarkerClick", "onMarkerChanged", "onPolygonAdded", "onPolygonClick", "onPolygonChanged", "onPolylineAdded", "onPolylineClick", "onPolylineChanged", "onRectangleAdded", "onRectangleClick", "onRectangleChanged", "onCircleAdded", "onCircleClick", "onCircleChanged", "onLocationFound", "onPoiChanged", "onPoiAdded", "onMapReady", "onLoadError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
13766
+ </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXMapModule }, { kind: "component", type: i1$f.AXMapComponent, selector: "ax-map", inputs: ["zoomLevel", "latitude", "longitude", "maxMarker", "maxPolygon", "maxPolyline", "maxRectangle", "maxCircle", "hasDraw", "hasLocator", "fitToDraw", "limitDraw", "addPoiToFitDraw", "addMarkerOnTap", "readonly", "disabled", "markerPlace", "locatePlace", "poiMinZoom", "markers", "polygons", "polylines", "rectangles", "circles", "pois"], outputs: ["zoomLevelChange", "latitudeChange", "longitudeChange", "onMarkerAdded", "onMarkerClick", "onMarkerChanged", "onPolygonAdded", "onPolygonClick", "onPolygonChanged", "onPolylineAdded", "onPolylineClick", "onPolylineChanged", "onRectangleAdded", "onRectangleClick", "onRectangleChanged", "onCircleAdded", "onCircleClick", "onCircleChanged", "onLocationFound", "onPoiChanged", "onPoiAdded", "onMapReady", "onLoadError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
14325
13767
  }
14326
13768
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPMapWidgetEditComponent, decorators: [{
14327
13769
  type: Component,
@@ -14417,7 +13859,7 @@ class AXPMapWidgetViewComponent extends AXPValueWidgetComponent {
14417
13859
  [disabled]="disabled()"
14418
13860
  [readonly]="readonly()"
14419
13861
  ></ax-map>
14420
- </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXMapModule }, { kind: "component", type: i1$h.AXMapComponent, selector: "ax-map", inputs: ["zoomLevel", "latitude", "longitude", "maxMarker", "maxPolygon", "maxPolyline", "maxRectangle", "maxCircle", "hasDraw", "hasLocator", "fitToDraw", "limitDraw", "addPoiToFitDraw", "addMarkerOnTap", "readonly", "disabled", "markerPlace", "locatePlace", "poiMinZoom", "markers", "polygons", "polylines", "rectangles", "circles", "pois"], outputs: ["zoomLevelChange", "latitudeChange", "longitudeChange", "onMarkerAdded", "onMarkerClick", "onMarkerChanged", "onPolygonAdded", "onPolygonClick", "onPolygonChanged", "onPolylineAdded", "onPolylineClick", "onPolylineChanged", "onRectangleAdded", "onRectangleClick", "onRectangleChanged", "onCircleAdded", "onCircleClick", "onCircleChanged", "onLocationFound", "onPoiChanged", "onPoiAdded", "onMapReady", "onLoadError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
13862
+ </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXMapModule }, { kind: "component", type: i1$f.AXMapComponent, selector: "ax-map", inputs: ["zoomLevel", "latitude", "longitude", "maxMarker", "maxPolygon", "maxPolyline", "maxRectangle", "maxCircle", "hasDraw", "hasLocator", "fitToDraw", "limitDraw", "addPoiToFitDraw", "addMarkerOnTap", "readonly", "disabled", "markerPlace", "locatePlace", "poiMinZoom", "markers", "polygons", "polylines", "rectangles", "circles", "pois"], outputs: ["zoomLevelChange", "latitudeChange", "longitudeChange", "onMarkerAdded", "onMarkerClick", "onMarkerChanged", "onPolygonAdded", "onPolygonClick", "onPolygonChanged", "onPolylineAdded", "onPolylineClick", "onPolylineChanged", "onRectangleAdded", "onRectangleClick", "onRectangleChanged", "onCircleAdded", "onCircleClick", "onCircleChanged", "onLocationFound", "onPoiChanged", "onPoiAdded", "onMapReady", "onLoadError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
14421
13863
  }
14422
13864
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPMapWidgetViewComponent, decorators: [{
14423
13865
  type: Component,
@@ -14647,7 +14089,7 @@ class AXPQrcodeWidgetColumnComponent extends AXPColumnWidgetComponent {
14647
14089
  <span>-</span>
14648
14090
  }
14649
14091
  </div>
14650
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14092
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14651
14093
  }
14652
14094
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPQrcodeWidgetColumnComponent, decorators: [{
14653
14095
  type: Component,
@@ -14768,7 +14210,7 @@ class AXPQrcodeWidgetEditComponent extends AXPValueWidgetComponent {
14768
14210
  }
14769
14211
  }
14770
14212
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPQrcodeWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
14771
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPQrcodeWidgetEditComponent, isStandalone: true, selector: "axp-qrcode-widget-edit", host: { classAttribute: "block flex-1" }, usesInheritance: true, ngImport: i0, template: "<!-- Main Container -->\n<div class=\"flex flex-col gap-3 p-3 w-fit\">\n <div class=\"flex justify-center\">\n <!-- QR Code Container -->\n <div class=\"bg-lightest border border-default rounded-md shadow-md p-3\" #qr>\n <!-- QR Code Display or Empty Placeholder -->\n @if (value()) {\n <!-- Display QR Code when value exists -->\n <ax-qrcode [content]=\"value()\" [size]=\"size()\" [color]=\"color()\" [level]=\"level()\" [outputType]=\"'svg'\">\n </ax-qrcode>\n } @else {\n <!-- Empty State: Show placeholder when value is null or empty -->\n <div\n class=\"flex flex-col items-center justify-center text-center\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n >\n <ax-icon icon=\"fa-light fa-qrcode\" class=\"text-4xl text-gray-400 mb-3\"></ax-icon>\n <div class=\"text-sm text-gray-500\">\n {{ '@general:state-message.empty.title' | translate | async }}\n </div>\n </div>\n }\n\n <!-- Action Buttons Section -->\n @if (!readonly()) {\n <div class=\"flex items-center justify-between gap-2 pt-4\">\n <!-- Edit Button: Opens popover to edit QR code content -->\n <ax-button\n #editBtn\n look=\"twotone\"\n [title]=\"('@general:actions.edit.title' | translate | async)!\"\n (onClick)=\"beginEdit()\"\n >\n <!-- Edit Popover: Text input for editing QR code content -->\n <ax-popover #po [target]=\"editBtn\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\" [adaptivityEnabled]=\"true\">\n <div\n class=\"bg-lightest border border-default rounded-md shadow-md p-5 w-full sm:w-96\"\n >\n <!-- Text Input for QR Code Content -->\n <ax-text-box\n [value]=\"draft()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [placeholder]=\"placeholder() | translate | async\"\n (onValueChanged)=\"onDraftChange($event)\"\n >\n @if (hasClearButton()) {\n <ax-clear-button></ax-clear-button>\n }\n </ax-text-box>\n <!-- Popover Action Buttons -->\n <div class=\"flex justify-end gap-2 mt-3\">\n <ax-button\n look=\"outline\"\n class=\"ax-sm\"\n [text]=\"('@general:actions.cancel.title' | translate | async)!\"\n (onClick)=\"cancelEdit(); po.close()\"\n ></ax-button>\n <ax-button\n look=\"solid\"\n class=\"ax-sm\"\n color=\"primary\"\n [text]=\"('@general:actions.submit.title' | translate | async)!\"\n (onClick)=\"applyDraft(); po.close()\"\n ></ax-button>\n </div>\n </div>\n </ax-popover>\n <ax-icon icon=\"fa-light fa-pen\"></ax-icon>\n </ax-button>\n\n <!-- Upload Button: Upload text file to set QR code content -->\n <!-- <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.upload.title' | translate | async)!\"\n (onClick)=\"fileInput.click()\"\n >\n <input #fileInput type=\"file\" accept=\"text/plain\" class=\"hidden\" (change)=\"onFileSelected($event)\" />\n <ax-icon icon=\"fa-light fa-upload\"></ax-icon>\n </ax-button> -->\n\n <!-- Export Button: Download QR code as image (only shown when value exists) -->\n @if (value()) {\n <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.preview.title' | translate | async)!\"\n (onClick)=\"openPreview()\"\n >\n <ax-icon icon=\"fa-light fa-expand\"></ax-icon>\n </ax-button>\n\n <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.export.title' | translate | async)!\"\n (onClick)=\"downloadQr(qr)\"\n >\n <ax-icon icon=\"fa-light fa-download\"></ax-icon>\n </ax-button>\n }\n\n <!-- Delete Button: Clear QR code value (only shown when not readonly and value exists) -->\n @if (!readonly() && value()) {\n <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.delete.title' | translate | async)!\"\n (onClick)=\"clearValue()\"\n >\n <ax-icon icon=\"text-danger fa-light fa-trash-can\"></ax-icon>\n </ax-button>\n }\n </div>\n }\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i1$7.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: "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$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i3$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXQrcodeModule }, { kind: "component", type: i5$2.AXQrcodeComponent, selector: "ax-qrcode", inputs: ["content", "size", "level", "color", "backgroundColor", "outputType"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: FormsModule }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14213
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPQrcodeWidgetEditComponent, isStandalone: true, selector: "axp-qrcode-widget-edit", host: { classAttribute: "block flex-1" }, usesInheritance: true, ngImport: i0, template: "<!-- Main Container -->\n<div class=\"flex flex-col gap-3 p-3 w-fit\">\n <div class=\"flex justify-center\">\n <!-- QR Code Container -->\n <div class=\"bg-lightest border border-default rounded-md shadow-md p-3\" #qr>\n <!-- QR Code Display or Empty Placeholder -->\n @if (value()) {\n <!-- Display QR Code when value exists -->\n <ax-qrcode [content]=\"value()\" [size]=\"size()\" [color]=\"color()\" [level]=\"level()\" [outputType]=\"'svg'\">\n </ax-qrcode>\n } @else {\n <!-- Empty State: Show placeholder when value is null or empty -->\n <div\n class=\"flex flex-col items-center justify-center text-center\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n >\n <ax-icon icon=\"fa-light fa-qrcode\" class=\"text-4xl text-gray-400 mb-3\"></ax-icon>\n <div class=\"text-sm text-gray-500\">\n {{ '@general:state-message.empty.title' | translate | async }}\n </div>\n </div>\n }\n\n <!-- Action Buttons Section -->\n @if (!readonly()) {\n <div class=\"flex items-center justify-between gap-2 pt-4\">\n <!-- Edit Button: Opens popover to edit QR code content -->\n <ax-button\n #editBtn\n look=\"twotone\"\n [title]=\"('@general:actions.edit.title' | translate | async)!\"\n (onClick)=\"beginEdit()\"\n >\n <!-- Edit Popover: Text input for editing QR code content -->\n <ax-popover #po [target]=\"editBtn\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\" [adaptivityEnabled]=\"true\">\n <div\n class=\"bg-lightest border border-default rounded-md shadow-md p-5 w-full sm:w-96\"\n >\n <!-- Text Input for QR Code Content -->\n <ax-text-box\n [value]=\"draft()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [placeholder]=\"placeholder() | translate | async\"\n (onValueChanged)=\"onDraftChange($event)\"\n >\n @if (hasClearButton()) {\n <ax-clear-button></ax-clear-button>\n }\n </ax-text-box>\n <!-- Popover Action Buttons -->\n <div class=\"flex justify-end gap-2 mt-3\">\n <ax-button\n look=\"outline\"\n class=\"ax-sm\"\n [text]=\"('@general:actions.cancel.title' | translate | async)!\"\n (onClick)=\"cancelEdit(); po.close()\"\n ></ax-button>\n <ax-button\n look=\"solid\"\n class=\"ax-sm\"\n color=\"primary\"\n [text]=\"('@general:actions.submit.title' | translate | async)!\"\n (onClick)=\"applyDraft(); po.close()\"\n ></ax-button>\n </div>\n </div>\n </ax-popover>\n <ax-icon icon=\"fa-light fa-pen\"></ax-icon>\n </ax-button>\n\n <!-- Upload Button: Upload text file to set QR code content -->\n <!-- <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.upload.title' | translate | async)!\"\n (onClick)=\"fileInput.click()\"\n >\n <input #fileInput type=\"file\" accept=\"text/plain\" class=\"hidden\" (change)=\"onFileSelected($event)\" />\n <ax-icon icon=\"fa-light fa-upload\"></ax-icon>\n </ax-button> -->\n\n <!-- Export Button: Download QR code as image (only shown when value exists) -->\n @if (value()) {\n <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.preview.title' | translate | async)!\"\n (onClick)=\"openPreview()\"\n >\n <ax-icon icon=\"fa-light fa-expand\"></ax-icon>\n </ax-button>\n\n <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.export.title' | translate | async)!\"\n (onClick)=\"downloadQr(qr)\"\n >\n <ax-icon icon=\"fa-light fa-download\"></ax-icon>\n </ax-button>\n }\n\n <!-- Delete Button: Clear QR code value (only shown when not readonly and value exists) -->\n @if (!readonly() && value()) {\n <ax-button\n look=\"twotone\"\n [title]=\"('@general:actions.delete.title' | translate | async)!\"\n (onClick)=\"clearValue()\"\n >\n <ax-icon icon=\"text-danger fa-light fa-trash-can\"></ax-icon>\n </ax-button>\n }\n </div>\n }\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i1$7.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: "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$1.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: AXPopoverModule }, { kind: "component", type: i3$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXQrcodeModule }, { kind: "component", type: i5$2.AXQrcodeComponent, selector: "ax-qrcode", inputs: ["content", "size", "level", "color", "backgroundColor", "outputType"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: FormsModule }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14772
14214
  }
14773
14215
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPQrcodeWidgetEditComponent, decorators: [{
14774
14216
  type: Component,
@@ -14877,7 +14319,7 @@ class AXPQrcodeWidgetViewComponent extends AXPValueWidgetComponent {
14877
14319
  }
14878
14320
  </div>
14879
14321
  }
14880
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXQrcodeModule }, { kind: "component", type: i5$2.AXQrcodeComponent, selector: "ax-qrcode", inputs: ["content", "size", "level", "color", "backgroundColor", "outputType"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14322
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXQrcodeModule }, { kind: "component", type: i5$2.AXQrcodeComponent, selector: "ax-qrcode", inputs: ["content", "size", "level", "color", "backgroundColor", "outputType"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14881
14323
  }
14882
14324
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPQrcodeWidgetViewComponent, decorators: [{
14883
14325
  type: Component,
@@ -15277,7 +14719,7 @@ class AXPSignatureWidgetColumnComponent extends AXPColumnWidgetComponent {
15277
14719
  <span>-</span>
15278
14720
  }
15279
14721
  </div>
15280
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14722
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
15281
14723
  }
15282
14724
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPSignatureWidgetColumnComponent, decorators: [{
15283
14725
  type: Component,
@@ -15453,7 +14895,7 @@ class AXPSignatureWidgetEditComponent extends AXPValueWidgetComponent {
15453
14895
  }
15454
14896
  }
15455
14897
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPSignatureWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
15456
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPSignatureWidgetEditComponent, isStandalone: true, selector: "axp-signature-pad-widget-edit", host: { classAttribute: "block w-full" }, viewQueries: [{ propertyName: "paintContainer", first: true, predicate: ["paintContainer"], descendants: true, isSignal: true }, { propertyName: "paintView", first: true, predicate: ["paintView"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"axp-signature-pad-widget-edit block w-full select-none\">\n <div\n class=\"relative w-full min-h-[9rem] overflow-hidden rounded-md\"\n [class.cursor-pointer]=\"showOverlay() && !disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.opacity-60]=\"disabled()\"\n (mouseenter)=\"handleMouseEnter()\"\n (mouseleave)=\"handleMouseLeave()\"\n (click)=\"handleSurfaceClick($event)\"\n (pointerdown)=\"handleSurfacePointerDown($event)\"\n >\n @if (showSignaturePreview()) {\n <ax-image\n [src]=\"getValue()!\"\n class=\"block w-full min-h-[9rem] object-contain\"\n />\n } @else if (showPaintSurface()) {\n <ax-paint-container\n look=\"none\"\n [editMode]=\"editMode()\"\n [disabled]=\"disabled()\"\n [ngModel]=\"getValue()\"\n (ngModelChange)=\"setValue($event)\"\n class=\"__paint\"\n #paintContainer\n >\n <ax-paint-view #paintView paintBackgroundColor=\"white\"></ax-paint-view>\n </ax-paint-container>\n }\n\n @if (showEmptyHint()) {\n <div\n class=\"absolute inset-0 z-5 flex flex-col items-center justify-center gap-2 pointer-events-none\"\n >\n <i class=\"fa-light fa-file-signature text-2xl\"></i>\n <span class=\"text-sm\">{{ emptyHint() | translate | async }}</span>\n </div>\n }\n\n @if (showDialogHint()) {\n <div\n class=\"absolute inset-0 z-5 flex items-center justify-center pointer-events-none text-sm opacity-60\"\n >\n {{ signHereHint() | translate | async }}\n </div>\n }\n\n @if (showDesktopHover()) {\n <div\n class=\"absolute inset-0 z-5 flex cursor-pointer items-center justify-center bg-neutral-900/50 text-neutral-100 transition-opacity duration-400\"\n data-signature-action=\"true\"\n [style.opacity]=\"hovering() ? 1 : 0\"\n (click)=\"handleOverlayClick($event)\"\n >\n <i class=\"fa-light fa-pen\"></i>\n </div>\n }\n </div>\n</div>\n", styles: [".axp-signature-pad-widget-edit .__paint{display:block;width:100%;min-height:9rem}.axp-signature-pad-widget-edit ax-paint-container{display:block;width:100%}.axp-signature-pad-widget-edit ax-paint-container .main-toolbar,.axp-signature-pad-widget-edit ax-paint-container .secondary-toolbar{display:none}:host ::ng-deep .axp-signature-pad-widget-edit ax-paint-container,:host ::ng-deep .axp-signature-pad-widget-edit ax-paint-container>.editor-container,:host ::ng-deep .axp-signature-pad-widget-edit ax-paint-view,:host ::ng-deep .axp-signature-pad-widget-edit ax-paint-view .canvas-element{border:none!important;box-shadow:none!important;outline:none!important}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXPaintModule }, { kind: "component", type: i2$8.AXPaintContainerComponent, selector: "ax-paint-container", inputs: ["look", "disabled", "editMode"] }, { kind: "component", type: i2$8.AXPaintViewComponent, selector: "ax-paint-view", inputs: ["paintBackgroundColor"] }, { kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i1$f.AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14898
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPSignatureWidgetEditComponent, isStandalone: true, selector: "axp-signature-pad-widget-edit", host: { classAttribute: "block w-full" }, viewQueries: [{ propertyName: "paintContainer", first: true, predicate: ["paintContainer"], descendants: true, isSignal: true }, { propertyName: "paintView", first: true, predicate: ["paintView"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"axp-signature-pad-widget-edit block w-full select-none\">\n <div\n class=\"relative w-full min-h-[9rem] overflow-hidden rounded-md\"\n [class.cursor-pointer]=\"showOverlay() && !disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.opacity-60]=\"disabled()\"\n (mouseenter)=\"handleMouseEnter()\"\n (mouseleave)=\"handleMouseLeave()\"\n (click)=\"handleSurfaceClick($event)\"\n (pointerdown)=\"handleSurfacePointerDown($event)\"\n >\n @if (showSignaturePreview()) {\n <ax-image\n [src]=\"getValue()!\"\n class=\"block w-full min-h-[9rem] object-contain\"\n />\n } @else if (showPaintSurface()) {\n <ax-paint-container\n look=\"none\"\n [editMode]=\"editMode()\"\n [disabled]=\"disabled()\"\n [ngModel]=\"getValue()\"\n (ngModelChange)=\"setValue($event)\"\n class=\"__paint\"\n #paintContainer\n >\n <ax-paint-view #paintView paintBackgroundColor=\"white\"></ax-paint-view>\n </ax-paint-container>\n }\n\n @if (showEmptyHint()) {\n <div\n class=\"absolute inset-0 z-5 flex flex-col items-center justify-center gap-2 pointer-events-none\"\n >\n <i class=\"fa-light fa-file-signature text-2xl\"></i>\n <span class=\"text-sm\">{{ emptyHint() | translate | async }}</span>\n </div>\n }\n\n @if (showDialogHint()) {\n <div\n class=\"absolute inset-0 z-5 flex items-center justify-center pointer-events-none text-sm opacity-60\"\n >\n {{ signHereHint() | translate | async }}\n </div>\n }\n\n @if (showDesktopHover()) {\n <div\n class=\"absolute inset-0 z-5 flex cursor-pointer items-center justify-center bg-neutral-900/50 text-neutral-100 transition-opacity duration-400\"\n data-signature-action=\"true\"\n [style.opacity]=\"hovering() ? 1 : 0\"\n (click)=\"handleOverlayClick($event)\"\n >\n <i class=\"fa-light fa-pen\"></i>\n </div>\n }\n </div>\n</div>\n", styles: [".axp-signature-pad-widget-edit .__paint{display:block;width:100%;min-height:9rem}.axp-signature-pad-widget-edit ax-paint-container{display:block;width:100%}.axp-signature-pad-widget-edit ax-paint-container .main-toolbar,.axp-signature-pad-widget-edit ax-paint-container .secondary-toolbar{display:none}:host ::ng-deep .axp-signature-pad-widget-edit ax-paint-container,:host ::ng-deep .axp-signature-pad-widget-edit ax-paint-container>.editor-container,:host ::ng-deep .axp-signature-pad-widget-edit ax-paint-view,:host ::ng-deep .axp-signature-pad-widget-edit ax-paint-view .canvas-element{border:none!important;box-shadow:none!important;outline:none!important}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXPaintModule }, { kind: "component", type: i2$8.AXPaintContainerComponent, selector: "ax-paint-container", inputs: ["look", "disabled", "editMode"] }, { kind: "component", type: i2$8.AXPaintViewComponent, selector: "ax-paint-view", inputs: ["paintBackgroundColor"] }, { kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i3$6.AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
15457
14899
  }
15458
14900
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPSignatureWidgetEditComponent, decorators: [{
15459
14901
  type: Component,
@@ -15490,7 +14932,7 @@ class AXPSignatureWidgetViewComponent extends AXPValueWidgetComponent {
15490
14932
  <span>{{ placeholder() }}</span>
15491
14933
  }
15492
14934
  </div>
15493
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i1$f.AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14935
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i3$6.AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
15494
14936
  }
15495
14937
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPSignatureWidgetViewComponent, decorators: [{
15496
14938
  type: Component,
@@ -17807,7 +17249,7 @@ class AXPAdvancedGridWidgetDesignerComponent extends AXPLayoutBaseWidgetComponen
17807
17249
  justify-items-end justify-items-stretch grid-flow-row grid-flow-col
17808
17250
  </div>
17809
17251
  }
17810
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXGridLayoutBuilderModule }, { kind: "component", type: i1$i.AXGridLayoutContainerComponent, selector: "ax-grid-layout-container", inputs: ["options", "isEmpty"], outputs: ["onAdded", "onRemoved", "onWidgetChange", "onChange", "onRender", "isEmptyChange"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: AXPWidgetDesignerRendererDirective, selector: "[axp-widget-designer-renderer]", inputs: ["parentNode", "parentElement", "parentComponent", "index", "locked", "mode", "node"] }, { kind: "component", type: AXPDesignerGridDrawerComponent, selector: "axp-designer-grid-drawer", inputs: ["rows", "columns"], outputs: ["rowsChange", "columnsChange", "onSelect"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17252
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXGridLayoutBuilderModule }, { kind: "component", type: i1$g.AXGridLayoutContainerComponent, selector: "ax-grid-layout-container", inputs: ["options", "isEmpty"], outputs: ["onAdded", "onRemoved", "onWidgetChange", "onChange", "onRender", "isEmptyChange"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: AXPWidgetDesignerRendererDirective, selector: "[axp-widget-designer-renderer]", inputs: ["parentNode", "parentElement", "parentComponent", "index", "locked", "mode", "node"] }, { kind: "component", type: AXPDesignerGridDrawerComponent, selector: "axp-designer-grid-drawer", inputs: ["rows", "columns"], outputs: ["rowsChange", "columnsChange", "onSelect"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17811
17253
  }
17812
17254
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAdvancedGridWidgetDesignerComponent, decorators: [{
17813
17255
  type: Component,
@@ -18063,7 +17505,7 @@ class AXPAdvancedGridWidgetViewComponent extends AXPValueWidgetComponent {
18063
17505
  justify-items-end justify-items-stretch
18064
17506
  </div>
18065
17507
  }
18066
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXGridLayoutBuilderModule }, { kind: "component", type: i1$i.AXGridLayoutContainerComponent, selector: "ax-grid-layout-container", inputs: ["options", "isEmpty"], outputs: ["onAdded", "onRemoved", "onWidgetChange", "onChange", "onRender", "isEmptyChange"] }, { kind: "component", type: i1$i.AXGridLayoutWidgetComponent, selector: "ax-grid-layout-widget", inputs: ["options"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: AXPWidgetDesignerRendererDirective, selector: "[axp-widget-designer-renderer]", inputs: ["parentNode", "parentElement", "parentComponent", "index", "locked", "mode", "node"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17508
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXGridLayoutBuilderModule }, { kind: "component", type: i1$g.AXGridLayoutContainerComponent, selector: "ax-grid-layout-container", inputs: ["options", "isEmpty"], outputs: ["onAdded", "onRemoved", "onWidgetChange", "onChange", "onRender", "isEmptyChange"] }, { kind: "component", type: i1$g.AXGridLayoutWidgetComponent, selector: "ax-grid-layout-widget", inputs: ["options"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: AXPWidgetDesignerRendererDirective, selector: "[axp-widget-designer-renderer]", inputs: ["parentNode", "parentElement", "parentComponent", "index", "locked", "mode", "node"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
18067
17509
  }
18068
17510
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAdvancedGridWidgetViewComponent, decorators: [{
18069
17511
  type: Component,
@@ -18215,7 +17657,7 @@ class AXPAdvancedGridItemWidgetDesignerComponent extends AXPLayoutBaseWidgetComp
18215
17657
  ><axp-designer-add-widget-mini-button></axp-designer-add-widget-mini-button>
18216
17658
  </ax-grid-layout-widget>
18217
17659
  }
18218
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: AXPWidgetDesignerRendererDirective, selector: "[axp-widget-designer-renderer]", inputs: ["parentNode", "parentElement", "parentComponent", "index", "locked", "mode", "node"] }, { kind: "component", type: AXPDesignerAddWidgetMiniButtonComponent, selector: "axp-designer-add-widget-mini-button", outputs: ["onClick"] }, { kind: "ngmodule", type: AXGridLayoutBuilderModule }, { kind: "component", type: i1$i.AXGridLayoutWidgetComponent, selector: "ax-grid-layout-widget", inputs: ["options"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17660
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: AXPWidgetDesignerRendererDirective, selector: "[axp-widget-designer-renderer]", inputs: ["parentNode", "parentElement", "parentComponent", "index", "locked", "mode", "node"] }, { kind: "component", type: AXPDesignerAddWidgetMiniButtonComponent, selector: "axp-designer-add-widget-mini-button", outputs: ["onClick"] }, { kind: "ngmodule", type: AXGridLayoutBuilderModule }, { kind: "component", type: i1$g.AXGridLayoutWidgetComponent, selector: "ax-grid-layout-widget", inputs: ["options"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
18219
17661
  }
18220
17662
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAdvancedGridItemWidgetDesignerComponent, decorators: [{
18221
17663
  type: Component,
@@ -19213,7 +18655,7 @@ class AXPRepeaterWidgetDesignerComponent extends AXPValueWidgetComponent {
19213
18655
  <axp-designer-add-widget-mini-button></axp-designer-add-widget-mini-button>
19214
18656
  }
19215
18657
  </ng-template>
19216
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: AXPWidgetDesignerRendererDirective, selector: "[axp-widget-designer-renderer]", inputs: ["parentNode", "parentElement", "parentComponent", "index", "locked", "mode", "node"] }, { kind: "component", type: AXPDesignerAddWidgetMiniButtonComponent, selector: "axp-designer-add-widget-mini-button", outputs: ["onClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
18658
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: AXPWidgetDesignerRendererDirective, selector: "[axp-widget-designer-renderer]", inputs: ["parentNode", "parentElement", "parentComponent", "index", "locked", "mode", "node"] }, { kind: "component", type: AXPDesignerAddWidgetMiniButtonComponent, selector: "axp-designer-add-widget-mini-button", outputs: ["onClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
19217
18659
  }
19218
18660
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPRepeaterWidgetDesignerComponent, decorators: [{
19219
18661
  type: Component,
@@ -19792,7 +19234,7 @@ class AXPStepWizardWidgetViewComponent extends AXPLayoutBaseWidgetComponent {
19792
19234
  </div>
19793
19235
  }
19794
19236
  </div>
19795
- `, isInline: true, styles: [":host ax-step-wizard-item>ax-content{display:none!important}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXStepWizardModule }, { kind: "component", type: i1$j.AXStepWizardComponent, selector: "ax-step-wizard", inputs: ["connector", "scrollToStep", "size", "look", "changeStep", "orientation", "content"], outputs: ["stepChanged"] }, { kind: "component", type: i1$j.AXStepWizardItemComponent, selector: "ax-step-wizard-item", inputs: ["disabled", "color", "step", "label", "description", "customTemplate", "active", "passed", "look", "state", "id"], outputs: ["activeChange", "passedChange", "lookChange", "stateChange"] }, { kind: "directive", type: i1$j.AXStepWizardContentDirective, selector: "[axStepWizardContent]", inputs: ["axStepWizardContent"], exportAs: ["axStepWizardContent"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: i1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
19237
+ `, isInline: true, styles: [":host ax-step-wizard-item>ax-content{display:none!important}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXStepWizardModule }, { kind: "component", type: i1$h.AXStepWizardComponent, selector: "ax-step-wizard", inputs: ["connector", "scrollToStep", "size", "look", "changeStep", "orientation", "content"], outputs: ["stepChanged"] }, { kind: "component", type: i1$h.AXStepWizardItemComponent, selector: "ax-step-wizard-item", inputs: ["disabled", "color", "step", "label", "description", "customTemplate", "active", "passed", "look", "state", "id"], outputs: ["activeChange", "passedChange", "lookChange", "stateChange"] }, { kind: "directive", type: i1$h.AXStepWizardContentDirective, selector: "[axStepWizardContent]", inputs: ["axStepWizardContent"], exportAs: ["axStepWizardContent"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: i1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
19796
19238
  }
19797
19239
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPStepWizardWidgetViewComponent, decorators: [{
19798
19240
  type: Component,
@@ -21677,7 +21119,7 @@ class AXPGridOptionsWidgetEditComponent extends AXPValueWidgetComponent {
21677
21119
  }
21678
21120
  }
21679
21121
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPGridOptionsWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
21680
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPGridOptionsWidgetEditComponent, isStandalone: true, selector: "axp-grid-options-widget-editor", usesInheritance: true, ngImport: i0, template: "<div class=\"axp-grid-breakpoints pb-4\">\n <ax-selection-list\n [direction]=\"'horizontal'\"\n [items]=\"selectionItems\"\n [look]=\"'card'\"\n [customTemplate]=\"customTemplate\"\n [showControl]=\"false\"\n [ngModel]=\"currentBreakpoint()\"\n (onValueChanged)=\"changeBreakPoint($event)\"\n ></ax-selection-list>\n</div>\n<ng-template #customTemplate let-item>\n @let data = item.data;\n <div [class]=\"isBreakpointConfigured()[data.id] ? 'text-primary-300' : ''\">\n {{ data.text }}\n </div>\n</ng-template>\n<ax-button\n color=\"primary\"\n text=\"Reset\"\n [disabled]=\"currentBreakpoint() === 'default'\"\n (click)=\"resetBreakpoint()\"\n></ax-button>\n\n<div class=\"axp-grid-option grid grid-cols-[auto_1fr] pt-2 gap-2 items-center justify-items-start\">\n <span> Direction </span>\n <div>\n <ax-button-group [selection]=\"'single'\">\n <ax-button-group-item (onClick)=\"setGridDirection('row')\" [selected]=\"gridDirection() === 'row'\"\n ><ax-prefix\n ><svg\n data-wf-icon=\"FlexFlowWrapIcon\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M3 4H11V3H3V4ZM13.8536 11.1464L10.8536 8.14645L10.1464 8.85355L12.2929 11H3V12H12.2929L10.1464 14.1464L10.8536 14.8536L13.8536 11.8536L14.2071 11.5L13.8536 11.1464Z\"\n fill=\"currentColor\"\n ></path>\n <path\n opacity=\"0.4\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M3 10.7929L9.79289 4H11V4.20711L4.20711 11H3V10.7929Z\"\n fill=\"currentColor\"\n ></path></svg></ax-prefix\n ></ax-button-group-item>\n <ax-button-group-item (onClick)=\"setGridDirection('column')\" [selected]=\"gridDirection() === 'column'\"\n ><ax-prefix\n ><svg\n data-wf-icon=\"FlexFlowColumnWrapIcon\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M4 3L4 11L3 11L3 3L4 3ZM11.1464 13.8536L8.14645 10.8536L8.85355 10.1464L11 12.2929L11 3L12 3L12 12.2929L14.1464 10.1464L14.8536 10.8536L11.8536 13.8536L11.5 14.2071L11.1464 13.8536Z\"\n fill=\"currentColor\"\n ></path>\n <path\n opacity=\"0.4\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M10.7929 3L4 9.79289L4 11L4.20711 11L11 4.20711L11 3L10.7929 3Z\"\n fill=\"currentColor\"\n ></path></svg></ax-prefix\n ></ax-button-group-item>\n </ax-button-group>\n </div>\n <span>Grid</span>\n <div class=\"flex items-center justify-between gap-1\">\n <span class=\"text-xs\">Row</span>\n <ax-number-box\n [minValue]=\"1\"\n [maxValue]=\"12\"\n [value]=\"rows()\"\n (onValueChanged)=\"setRowOrColumn($event.value, 'row')\"\n [changeOnScroll]=\"true\"\n [showSpinButtons]=\"false\"\n class=\"ax-sm max-w-12\"\n ></ax-number-box>\n <span class=\"text-xs\">Column</span>\n <ax-number-box\n [minValue]=\"1\"\n [maxValue]=\"12\"\n [value]=\"columns()\"\n (onValueChanged)=\"setRowOrColumn($event.value, 'column')\"\n [changeOnScroll]=\"true\"\n [showSpinButtons]=\"false\"\n class=\"ax-sm max-w-12\"\n ></ax-number-box>\n <!-- <button>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M7 3.29289C7.18754 3.10536 7.44189 3 7.70711 3H10.5C10.7022 3 10.8845 3.12182 10.9619 3.30866C11.0393 3.4955 10.9966 3.71055 10.8536 3.85355L9 5.70711V7H10.2929L12.1464 5.14645C12.2894 5.00345 12.5045 4.96067 12.6913 5.03806C12.8782 5.11545 13 5.29777 13 5.5V8.29289C13 8.55811 12.8946 8.81246 12.7071 9L11 10.7071C10.8125 10.8946 10.5581 11 10.2929 11H7.70711L4.85355 13.8536C4.65829 14.0488 4.34171 14.0488 4.14645 13.8536L2.14645 11.8536C1.95118 11.6583 1.95118 11.3417 2.14645 11.1464L5 8.29289V5.70711C5 5.44189 5.10536 5.18754 5.29289 5L7 3.29289ZM9.29289 4H7.70711L6 5.70711L6 8.29289C6 8.55811 5.89464 8.81246 5.70711 9L3.20711 11.5L4.5 12.7929L7 10.2929C7.18754 10.1054 7.44189 10 7.70711 10H10.2929L12 8.29289V6.70711L10.8536 7.85355C10.7598 7.94732 10.6326 8 10.5 8H8.5C8.22386 8 8 7.77614 8 7.5V5.5C8 5.36739 8.05268 5.24021 8.14645 5.14645L9.29289 4Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </button> -->\n </div>\n\n <span>Align</span>\n <div class=\"flex justify-between gap-2 items-center\">\n <div\n class=\"relative size-[62px] bg-[rgb(30,30,30)] border border-white border-opacity-15 rounded\"\n >\n <div class=\"absolute inset-0 grid grid-cols-3 grid-rows-3\">\n @for (side of gridSides; track side.value) {\n <div\n [attr.aria-label]=\"side.label\"\n [attr.aria-value]=\"side.value\"\n class=\"grid place-content-center\"\n (mouseenter)=\"onHover(side)\"\n (mouseleave)=\"onHoverLeave()\"\n (click)=\"onClick(side)\"\n >\n @if (true) {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"7\" y=\"7\" width=\"2\" height=\"2\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.3\"></rect>\n </svg>\n }\n </div>\n }\n </div>\n @if (hoveredJustify() && hoveredAlign()) {\n <div\n class=\"axp-grid-option-hover absolute inset-0 grid pointer-events-none transition-all\"\n [style.justify-items]=\"hoveredJustify()\"\n [style.align-items]=\"hoveredAlign()\"\n >\n <div class=\"flex justify-center items-center min-w-5 min-h-5\">\n <div class=\"size-auto z-[1] rounded-lg bg-[rgb(30,30,30)] flex-none\">\n @if (clickedJustify() === 'stretch' && clickedAlign() === 'stretch') {\n } @else if (clickedJustify() === 'stretch') {\n <svg\n width=\"60\"\n height=\"20\"\n viewBox=\"0 0 60 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M4.5 4.6a.15.15 0 0 1 .033-.1h50.934l.003.003a.15.15 0 0 1 .03.097v10.8a.15.15 0 0 1-.03.097l-.003.003H4.533l-.003-.003a.15.15 0 0 1-.03-.097V4.6Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.07; stroke-opacity: 0.25\"\n ></path>\n </svg>\n } @else if (clickedAlign() === 'stretch') {\n <svg\n width=\"20\"\n height=\"60\"\n viewBox=\"0 0 20 60\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M4.6 4.5h10.8a.15.15 0 0 1 .097.03l.003.003v50.934l-.003.003a.15.15 0 0 1-.097.03H4.6a.15.15 0 0 1-.1-.033V4.533l.003-.003A.15.15 0 0 1 4.6 4.5Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.07; stroke-opacity: 0.25\"\n ></path>\n </svg>\n } @else {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: #efeaea\"\n >\n <path\n d=\"M4.5 4.6a.1.1 0 0 1 .1-.1h10.8a.1.1 0 0 1 .1.1v10.8a.1.1 0 0 1-.1.1H4.6a.1.1 0 0 1-.1-.1V4.6Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"stroke-opacity: 0.25; fill-opacity: 0.07\"\n class=\"hover:fill-opacity-20\"\n ></path>\n </svg>\n }\n </div>\n </div>\n </div>\n }\n\n <div\n class=\"axp-grid-option-active absolute inset-0 grid pointer-events-none transition-all\"\n [style.justify-items]=\"clickedJustify()\"\n [style.align-items]=\"clickedAlign()\"\n >\n <div class=\"flex justify-center items-center min-w-5 min-h-5\">\n <div class=\"size-auto z-[2] rounded-lg bg-[rgb(30,30,30)] flex-none\">\n @if (clickedJustify() === 'stretch' && clickedAlign() === 'stretch') {\n <svg\n width=\"60\"\n height=\"60\"\n viewBox=\"0 0 60 60\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M55.5 55.48a.02.02 0 0 1-.02.02H4.52a.02.02 0 0 1-.02-.02V4.52a.02.02 0 0 1 .02-.02h50.96a.02.02 0 0 1 .02.02v50.96Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.16; stroke: white\"\n ></path>\n <path\n d=\"m26.354 20.354 3.146-3.147V29.5h-3v1h3v12.293l-3.146-3.147-.707.708L30 44.707l4.354-4.353-.707-.708-3.147 3.147V30.5h12.293l-3.147 3.147.708.707L44.707 30l-4.353-4.354-.708.708 3.147 3.146H30.5V17.207l3.146 3.147.707-.707L30 15.293l-4.354 4.354.707.707Z\"\n fill=\"currentColor\"\n style=\"fill-opacity: 0.25\"\n ></path>\n <path\n d=\"m17.207 30.5 3.146 3.147-.707.707L15.293 30l4.353-4.354.707.708-3.146 3.146H26.5v1h-9.293Z\"\n fill=\"currentColor\"\n style=\"fill-opacity: 0.25\"\n ></path>\n </svg>\n } @else if (clickedJustify() === 'stretch') {\n <svg\n width=\"60\"\n height=\"20\"\n viewBox=\"0 0 60 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M4.5 4.6a.15.15 0 0 1 .033-.1h50.934l.003.003a.15.15 0 0 1 .03.097v10.8a.15.15 0 0 1-.03.097l-.003.003H4.533l-.003-.003a.15.15 0 0 1-.03-.097V4.6Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.16; stroke: white\"\n ></path>\n </svg>\n } @else if (clickedAlign() === 'stretch') {\n <svg\n width=\"20\"\n height=\"60\"\n viewBox=\"0 0 20 60\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M4.6 4.5h10.8a.15.15 0 0 1 .097.03l.003.003v50.934l-.003.003a.15.15 0 0 1-.097.03H4.6a.15.15 0 0 1-.1-.033V4.533l.003-.003A.15.15 0 0 1 4.6 4.5Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.16; stroke: white\"\n ></path>\n </svg>\n } @else {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: #efeaea\"\n >\n <path\n d=\"M4.5 4.6a.1.1 0 0 1 .1-.1h10.8a.1.1 0 0 1 .1.1v10.8a.1.1 0 0 1-.1.1H4.6a.1.1 0 0 1-.1-.1V4.6Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill: #cebcbc; fill-opacity: 0.16\"\n ></path>\n </svg>\n }\n </div>\n </div>\n </div>\n </div>\n <div class=\"grid grid-cols-[auto_1fr] items-center justify-items-start gap-2\">\n <span>X:</span>\n <div class=\"w-24\">\n <ax-lookup\n mode=\"drop-down-list\"\n class=\"ax-sm\"\n [dataSource]=\"justifyDataSource\"\n [value]=\"selectedJustify()\"\n (onValueChanged)=\"onJustifyChange($event)\"\n textField=\"label\"\n valueField=\"value\"\n [searchable]=\"false\"\n placeholder=\"Choose...\"\n >\n </ax-lookup>\n </div>\n <span>Y:</span>\n <div class=\"w-24\">\n <ax-lookup\n mode=\"drop-down-list\"\n class=\"ax-sm\"\n [dataSource]=\"alignDataSource\"\n [value]=\"selectedAlign()\"\n (onValueChanged)=\"onAlignChange($event)\"\n textField=\"label\"\n valueField=\"value\"\n [searchable]=\"false\"\n placeholder=\"Choose...\"\n >\n </ax-lookup>\n </div>\n </div>\n </div>\n\n <span>Gap</span>\n <div class=\"flex gap-2 justify-between items-center\">\n @if (gapMode() === 'single') {\n <ax-range-slider\n class=\"w-32\"\n [values]=\"gap().x\"\n (valuesChange)=\"setGap($event ?? 0, 'both')\"\n ></ax-range-slider>\n <ax-number-box\n [minValue]=\"0\"\n [maxValue]=\"999\"\n [value]=\"gap().x\"\n (onValueChanged)=\"setGap($event.value ?? 0, 'both')\"\n [changeOnScroll]=\"true\"\n class=\"ax-sm min-w-6\"\n [showSpinButtons]=\"false\"\n ><ax-suffix><ax-text class=\"text-xs! px-1!\">PX</ax-text></ax-suffix></ax-number-box\n >\n } @else {\n <div class=\"flex items-center gap-2 h-12\">\n <span class=\"text-xs\"\n ><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12.2929 7.00004L9.14645 3.85359L9.85355 3.14648L14.2071 7.50004L9.85355 11.8536L9.14645 11.1465L12.2929 8.00004H3V7.00004H12.2929Z\"\n fill=\"currentColor\"\n ></path></svg ></span>\n <ax-number-box\n [minValue]=\"0\"\n [maxValue]=\"999\"\n [value]=\"gap().x\"\n (onValueChanged)=\"setGap($event.value ?? 0, 'x')\"\n [changeOnScroll]=\"true\"\n class=\"ax-sm min-w-5\"\n [showSpinButtons]=\"false\"\n ><ax-suffix><ax-text class=\"text-xs! px-1!\">PX</ax-text></ax-suffix></ax-number-box\n >\n <span class=\"text-xs\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8.00001 12.2929L4.85356 9.14645L4.14645 9.85355L8.50001 14.2071L12.8536 9.85355L12.1465 9.14645L9.00001 12.2929L9.00001 3H8.00001L8.00001 12.2929Z\"\n fill=\"currentColor\"\n ></path></svg></span>\n <ax-number-box\n [minValue]=\"0\"\n [maxValue]=\"999\"\n [value]=\"gap().y\"\n [changeOnScroll]=\"true\"\n (valueChange)=\"setGap($event ?? 0, 'y')\"\n class=\"ax-sm min-w-5\"\n [showSpinButtons]=\"false\"\n ><ax-suffix><ax-text class=\"text-xs! px-1!\">PX</ax-text></ax-suffix></ax-number-box\n >\n </div>\n }\n <button (click)=\"toggleGapMode()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n @if (gapMode() === 'single') {\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M5 7L5 5C5 3.34315 6.34315 2 8 2C9.65685 2 11 3.34315 11 5V7C11.5523 7 12 7.44772 12 8V12C12 12.5523 11.5523 13 11 13H5C4.44772 13 4 12.5523 4 12V8C4 7.44771 4.44772 7 5 7ZM6 5C6 3.89543 6.89543 3 8 3C9.10457 3 10 3.89543 10 5V7H6V5ZM5 12V8H11V12H5Z\"\n fill=\"currentColor\"\n ></path>\n } @else {\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M9 5C9 3.89543 9.89543 3 11 3C12.1046 3 13 3.89543 13 5V6H14V5C14 3.34315 12.6569 2 11 2C9.34315 2 8 3.34315 8 5V7H3C2.44772 7 2 7.44771 2 8V12C2 12.5523 2.44772 13 3 13H9C9.55228 13 10 12.5523 10 12V8C10 7.44772 9.55228 7 9 7V5ZM3 8H9V12H3V8Z\"\n fill=\"currentColor\"\n ></path>\n }\n </svg>\n </button>\n </div>\n</div>\n", styles: ["axp-grid-options-widget{--ax-comp-range-slider-handler-size: .75rem}axp-grid-options-widget ax-selection-list>ul{gap:var(--spacing, .25rem);overflow:auto;padding-bottom:calc(var(--spacing, .25rem) * 2);flex-wrap:nowrap}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXButtonGroupModule }, { kind: "component", type: i1$k.AXButtonGroupComponent, selector: "ax-button-group", inputs: ["disabled", "fitParent", "color", "look", "class", "selection"], outputs: ["onBlur", "onFocus", "disabledChange", "colorChange", "lookChange", "onClick", "selectionChange", "selectedButtonChange"] }, { kind: "component", type: i1$k.AXButtonGroupItemComponent, selector: "ax-button-group-item", inputs: ["disabled", "color", "text", "class", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange", "classChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { 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: "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", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXNumberBoxModule }, { kind: "component", type: i1$8.AXNumberBoxComponent, selector: "ax-number-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "minValue", "maxValue", "showSpinButtons", "thousandsSeparator", "decimals", "changeOnScroll", "step"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "thousandsSeparatorChange"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXRangeSliderModule }, { kind: "component", type: i3$4.AXRangeSliderComponent, selector: "ax-range-slider", inputs: ["disabled", "readonly", "orientation", "color", "values", "mode", "min", "max", "step", "snap", "tooltipMode", "snapMode", "hasStep", "hasSnap", "hasLable", "hasTooltip"], outputs: ["valuesChange"] }, { kind: "ngmodule", type: AXSelectionListModule }, { kind: "component", type: i2$4.AXSelectionListComponent, selector: "ax-selection-list", inputs: ["id", "name", "disabled", "readonly", "tabIndex", "size", "value", "valueField", "textField", "disabledField", "readonlyField", "multiple", "direction", "customTemplate", "showControl", "items", "look"], outputs: ["onValueChanged", "onBlur", "onFocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
21122
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPGridOptionsWidgetEditComponent, isStandalone: true, selector: "axp-grid-options-widget-editor", usesInheritance: true, ngImport: i0, template: "<div class=\"axp-grid-breakpoints pb-4\">\n <ax-selection-list\n [direction]=\"'horizontal'\"\n [items]=\"selectionItems\"\n [look]=\"'card'\"\n [customTemplate]=\"customTemplate\"\n [showControl]=\"false\"\n [ngModel]=\"currentBreakpoint()\"\n (onValueChanged)=\"changeBreakPoint($event)\"\n ></ax-selection-list>\n</div>\n<ng-template #customTemplate let-item>\n @let data = item.data;\n <div [class]=\"isBreakpointConfigured()[data.id] ? 'text-primary-300' : ''\">\n {{ data.text }}\n </div>\n</ng-template>\n<ax-button\n color=\"primary\"\n text=\"Reset\"\n [disabled]=\"currentBreakpoint() === 'default'\"\n (click)=\"resetBreakpoint()\"\n></ax-button>\n\n<div class=\"axp-grid-option grid grid-cols-[auto_1fr] pt-2 gap-2 items-center justify-items-start\">\n <span> Direction </span>\n <div>\n <ax-button-group [selection]=\"'single'\">\n <ax-button-group-item (onClick)=\"setGridDirection('row')\" [selected]=\"gridDirection() === 'row'\"\n ><ax-prefix\n ><svg\n data-wf-icon=\"FlexFlowWrapIcon\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M3 4H11V3H3V4ZM13.8536 11.1464L10.8536 8.14645L10.1464 8.85355L12.2929 11H3V12H12.2929L10.1464 14.1464L10.8536 14.8536L13.8536 11.8536L14.2071 11.5L13.8536 11.1464Z\"\n fill=\"currentColor\"\n ></path>\n <path\n opacity=\"0.4\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M3 10.7929L9.79289 4H11V4.20711L4.20711 11H3V10.7929Z\"\n fill=\"currentColor\"\n ></path></svg></ax-prefix\n ></ax-button-group-item>\n <ax-button-group-item (onClick)=\"setGridDirection('column')\" [selected]=\"gridDirection() === 'column'\"\n ><ax-prefix\n ><svg\n data-wf-icon=\"FlexFlowColumnWrapIcon\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M4 3L4 11L3 11L3 3L4 3ZM11.1464 13.8536L8.14645 10.8536L8.85355 10.1464L11 12.2929L11 3L12 3L12 12.2929L14.1464 10.1464L14.8536 10.8536L11.8536 13.8536L11.5 14.2071L11.1464 13.8536Z\"\n fill=\"currentColor\"\n ></path>\n <path\n opacity=\"0.4\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M10.7929 3L4 9.79289L4 11L4.20711 11L11 4.20711L11 3L10.7929 3Z\"\n fill=\"currentColor\"\n ></path></svg></ax-prefix\n ></ax-button-group-item>\n </ax-button-group>\n </div>\n <span>Grid</span>\n <div class=\"flex items-center justify-between gap-1\">\n <span class=\"text-xs\">Row</span>\n <ax-number-box\n [minValue]=\"1\"\n [maxValue]=\"12\"\n [value]=\"rows()\"\n (onValueChanged)=\"setRowOrColumn($event.value, 'row')\"\n [changeOnScroll]=\"true\"\n [showSpinButtons]=\"false\"\n class=\"ax-sm max-w-12\"\n ></ax-number-box>\n <span class=\"text-xs\">Column</span>\n <ax-number-box\n [minValue]=\"1\"\n [maxValue]=\"12\"\n [value]=\"columns()\"\n (onValueChanged)=\"setRowOrColumn($event.value, 'column')\"\n [changeOnScroll]=\"true\"\n [showSpinButtons]=\"false\"\n class=\"ax-sm max-w-12\"\n ></ax-number-box>\n <!-- <button>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M7 3.29289C7.18754 3.10536 7.44189 3 7.70711 3H10.5C10.7022 3 10.8845 3.12182 10.9619 3.30866C11.0393 3.4955 10.9966 3.71055 10.8536 3.85355L9 5.70711V7H10.2929L12.1464 5.14645C12.2894 5.00345 12.5045 4.96067 12.6913 5.03806C12.8782 5.11545 13 5.29777 13 5.5V8.29289C13 8.55811 12.8946 8.81246 12.7071 9L11 10.7071C10.8125 10.8946 10.5581 11 10.2929 11H7.70711L4.85355 13.8536C4.65829 14.0488 4.34171 14.0488 4.14645 13.8536L2.14645 11.8536C1.95118 11.6583 1.95118 11.3417 2.14645 11.1464L5 8.29289V5.70711C5 5.44189 5.10536 5.18754 5.29289 5L7 3.29289ZM9.29289 4H7.70711L6 5.70711L6 8.29289C6 8.55811 5.89464 8.81246 5.70711 9L3.20711 11.5L4.5 12.7929L7 10.2929C7.18754 10.1054 7.44189 10 7.70711 10H10.2929L12 8.29289V6.70711L10.8536 7.85355C10.7598 7.94732 10.6326 8 10.5 8H8.5C8.22386 8 8 7.77614 8 7.5V5.5C8 5.36739 8.05268 5.24021 8.14645 5.14645L9.29289 4Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </button> -->\n </div>\n\n <span>Align</span>\n <div class=\"flex justify-between gap-2 items-center\">\n <div\n class=\"relative size-[62px] bg-[rgb(30,30,30)] border border-white border-opacity-15 rounded\"\n >\n <div class=\"absolute inset-0 grid grid-cols-3 grid-rows-3\">\n @for (side of gridSides; track side.value) {\n <div\n [attr.aria-label]=\"side.label\"\n [attr.aria-value]=\"side.value\"\n class=\"grid place-content-center\"\n (mouseenter)=\"onHover(side)\"\n (mouseleave)=\"onHoverLeave()\"\n (click)=\"onClick(side)\"\n >\n @if (true) {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"7\" y=\"7\" width=\"2\" height=\"2\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.3\"></rect>\n </svg>\n }\n </div>\n }\n </div>\n @if (hoveredJustify() && hoveredAlign()) {\n <div\n class=\"axp-grid-option-hover absolute inset-0 grid pointer-events-none transition-all\"\n [style.justify-items]=\"hoveredJustify()\"\n [style.align-items]=\"hoveredAlign()\"\n >\n <div class=\"flex justify-center items-center min-w-5 min-h-5\">\n <div class=\"size-auto z-[1] rounded-lg bg-[rgb(30,30,30)] flex-none\">\n @if (clickedJustify() === 'stretch' && clickedAlign() === 'stretch') {\n } @else if (clickedJustify() === 'stretch') {\n <svg\n width=\"60\"\n height=\"20\"\n viewBox=\"0 0 60 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M4.5 4.6a.15.15 0 0 1 .033-.1h50.934l.003.003a.15.15 0 0 1 .03.097v10.8a.15.15 0 0 1-.03.097l-.003.003H4.533l-.003-.003a.15.15 0 0 1-.03-.097V4.6Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.07; stroke-opacity: 0.25\"\n ></path>\n </svg>\n } @else if (clickedAlign() === 'stretch') {\n <svg\n width=\"20\"\n height=\"60\"\n viewBox=\"0 0 20 60\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M4.6 4.5h10.8a.15.15 0 0 1 .097.03l.003.003v50.934l-.003.003a.15.15 0 0 1-.097.03H4.6a.15.15 0 0 1-.1-.033V4.533l.003-.003A.15.15 0 0 1 4.6 4.5Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.07; stroke-opacity: 0.25\"\n ></path>\n </svg>\n } @else {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: #efeaea\"\n >\n <path\n d=\"M4.5 4.6a.1.1 0 0 1 .1-.1h10.8a.1.1 0 0 1 .1.1v10.8a.1.1 0 0 1-.1.1H4.6a.1.1 0 0 1-.1-.1V4.6Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"stroke-opacity: 0.25; fill-opacity: 0.07\"\n class=\"hover:fill-opacity-20\"\n ></path>\n </svg>\n }\n </div>\n </div>\n </div>\n }\n\n <div\n class=\"axp-grid-option-active absolute inset-0 grid pointer-events-none transition-all\"\n [style.justify-items]=\"clickedJustify()\"\n [style.align-items]=\"clickedAlign()\"\n >\n <div class=\"flex justify-center items-center min-w-5 min-h-5\">\n <div class=\"size-auto z-[2] rounded-lg bg-[rgb(30,30,30)] flex-none\">\n @if (clickedJustify() === 'stretch' && clickedAlign() === 'stretch') {\n <svg\n width=\"60\"\n height=\"60\"\n viewBox=\"0 0 60 60\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M55.5 55.48a.02.02 0 0 1-.02.02H4.52a.02.02 0 0 1-.02-.02V4.52a.02.02 0 0 1 .02-.02h50.96a.02.02 0 0 1 .02.02v50.96Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.16; stroke: white\"\n ></path>\n <path\n d=\"m26.354 20.354 3.146-3.147V29.5h-3v1h3v12.293l-3.146-3.147-.707.708L30 44.707l4.354-4.353-.707-.708-3.147 3.147V30.5h12.293l-3.147 3.147.708.707L44.707 30l-4.353-4.354-.708.708 3.147 3.146H30.5V17.207l3.146 3.147.707-.707L30 15.293l-4.354 4.354.707.707Z\"\n fill=\"currentColor\"\n style=\"fill-opacity: 0.25\"\n ></path>\n <path\n d=\"m17.207 30.5 3.146 3.147-.707.707L15.293 30l4.353-4.354.707.708-3.146 3.146H26.5v1h-9.293Z\"\n fill=\"currentColor\"\n style=\"fill-opacity: 0.25\"\n ></path>\n </svg>\n } @else if (clickedJustify() === 'stretch') {\n <svg\n width=\"60\"\n height=\"20\"\n viewBox=\"0 0 60 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M4.5 4.6a.15.15 0 0 1 .033-.1h50.934l.003.003a.15.15 0 0 1 .03.097v10.8a.15.15 0 0 1-.03.097l-.003.003H4.533l-.003-.003a.15.15 0 0 1-.03-.097V4.6Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.16; stroke: white\"\n ></path>\n </svg>\n } @else if (clickedAlign() === 'stretch') {\n <svg\n width=\"20\"\n height=\"60\"\n viewBox=\"0 0 20 60\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M4.6 4.5h10.8a.15.15 0 0 1 .097.03l.003.003v50.934l-.003.003a.15.15 0 0 1-.097.03H4.6a.15.15 0 0 1-.1-.033V4.533l.003-.003A.15.15 0 0 1 4.6 4.5Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.16; stroke: white\"\n ></path>\n </svg>\n } @else {\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: #efeaea\"\n >\n <path\n d=\"M4.5 4.6a.1.1 0 0 1 .1-.1h10.8a.1.1 0 0 1 .1.1v10.8a.1.1 0 0 1-.1.1H4.6a.1.1 0 0 1-.1-.1V4.6Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill: #cebcbc; fill-opacity: 0.16\"\n ></path>\n </svg>\n }\n </div>\n </div>\n </div>\n </div>\n <div class=\"grid grid-cols-[auto_1fr] items-center justify-items-start gap-2\">\n <span>X:</span>\n <div class=\"w-24\">\n <ax-lookup\n mode=\"drop-down-list\"\n class=\"ax-sm\"\n [dataSource]=\"justifyDataSource\"\n [value]=\"selectedJustify()\"\n (onValueChanged)=\"onJustifyChange($event)\"\n textField=\"label\"\n valueField=\"value\"\n [searchable]=\"false\"\n placeholder=\"Choose...\"\n >\n </ax-lookup>\n </div>\n <span>Y:</span>\n <div class=\"w-24\">\n <ax-lookup\n mode=\"drop-down-list\"\n class=\"ax-sm\"\n [dataSource]=\"alignDataSource\"\n [value]=\"selectedAlign()\"\n (onValueChanged)=\"onAlignChange($event)\"\n textField=\"label\"\n valueField=\"value\"\n [searchable]=\"false\"\n placeholder=\"Choose...\"\n >\n </ax-lookup>\n </div>\n </div>\n </div>\n\n <span>Gap</span>\n <div class=\"flex gap-2 justify-between items-center\">\n @if (gapMode() === 'single') {\n <ax-range-slider\n class=\"w-32\"\n [values]=\"gap().x\"\n (valuesChange)=\"setGap($event ?? 0, 'both')\"\n ></ax-range-slider>\n <ax-number-box\n [minValue]=\"0\"\n [maxValue]=\"999\"\n [value]=\"gap().x\"\n (onValueChanged)=\"setGap($event.value ?? 0, 'both')\"\n [changeOnScroll]=\"true\"\n class=\"ax-sm min-w-6\"\n [showSpinButtons]=\"false\"\n ><ax-suffix><ax-text class=\"text-xs! px-1!\">PX</ax-text></ax-suffix></ax-number-box\n >\n } @else {\n <div class=\"flex items-center gap-2 h-12\">\n <span class=\"text-xs\"\n ><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12.2929 7.00004L9.14645 3.85359L9.85355 3.14648L14.2071 7.50004L9.85355 11.8536L9.14645 11.1465L12.2929 8.00004H3V7.00004H12.2929Z\"\n fill=\"currentColor\"\n ></path></svg ></span>\n <ax-number-box\n [minValue]=\"0\"\n [maxValue]=\"999\"\n [value]=\"gap().x\"\n (onValueChanged)=\"setGap($event.value ?? 0, 'x')\"\n [changeOnScroll]=\"true\"\n class=\"ax-sm min-w-5\"\n [showSpinButtons]=\"false\"\n ><ax-suffix><ax-text class=\"text-xs! px-1!\">PX</ax-text></ax-suffix></ax-number-box\n >\n <span class=\"text-xs\"><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8.00001 12.2929L4.85356 9.14645L4.14645 9.85355L8.50001 14.2071L12.8536 9.85355L12.1465 9.14645L9.00001 12.2929L9.00001 3H8.00001L8.00001 12.2929Z\"\n fill=\"currentColor\"\n ></path></svg></span>\n <ax-number-box\n [minValue]=\"0\"\n [maxValue]=\"999\"\n [value]=\"gap().y\"\n [changeOnScroll]=\"true\"\n (valueChange)=\"setGap($event ?? 0, 'y')\"\n class=\"ax-sm min-w-5\"\n [showSpinButtons]=\"false\"\n ><ax-suffix><ax-text class=\"text-xs! px-1!\">PX</ax-text></ax-suffix></ax-number-box\n >\n </div>\n }\n <button (click)=\"toggleGapMode()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n @if (gapMode() === 'single') {\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M5 7L5 5C5 3.34315 6.34315 2 8 2C9.65685 2 11 3.34315 11 5V7C11.5523 7 12 7.44772 12 8V12C12 12.5523 11.5523 13 11 13H5C4.44772 13 4 12.5523 4 12V8C4 7.44771 4.44772 7 5 7ZM6 5C6 3.89543 6.89543 3 8 3C9.10457 3 10 3.89543 10 5V7H6V5ZM5 12V8H11V12H5Z\"\n fill=\"currentColor\"\n ></path>\n } @else {\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M9 5C9 3.89543 9.89543 3 11 3C12.1046 3 13 3.89543 13 5V6H14V5C14 3.34315 12.6569 2 11 2C9.34315 2 8 3.34315 8 5V7H3C2.44772 7 2 7.44771 2 8V12C2 12.5523 2.44772 13 3 13H9C9.55228 13 10 12.5523 10 12V8C10 7.44772 9.55228 7 9 7V5ZM3 8H9V12H3V8Z\"\n fill=\"currentColor\"\n ></path>\n }\n </svg>\n </button>\n </div>\n</div>\n", styles: ["axp-grid-options-widget{--ax-comp-range-slider-handler-size: .75rem}axp-grid-options-widget ax-selection-list>ul{gap:var(--spacing, .25rem);overflow:auto;padding-bottom:calc(var(--spacing, .25rem) * 2);flex-wrap:nowrap}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXButtonGroupModule }, { kind: "component", type: i1$i.AXButtonGroupComponent, selector: "ax-button-group", inputs: ["disabled", "fitParent", "color", "look", "class", "selection"], outputs: ["onBlur", "onFocus", "disabledChange", "colorChange", "lookChange", "onClick", "selectionChange", "selectedButtonChange"] }, { kind: "component", type: i1$i.AXButtonGroupItemComponent, selector: "ax-button-group-item", inputs: ["disabled", "color", "text", "class", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange", "classChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { 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: "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: AXNumberBoxModule }, { kind: "component", type: i1$8.AXNumberBoxComponent, selector: "ax-number-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "minValue", "maxValue", "showSpinButtons", "thousandsSeparator", "decimals", "changeOnScroll", "step"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "thousandsSeparatorChange"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXRangeSliderModule }, { kind: "component", type: i3$4.AXRangeSliderComponent, selector: "ax-range-slider", inputs: ["disabled", "readonly", "orientation", "color", "values", "mode", "min", "max", "step", "snap", "tooltipMode", "snapMode", "hasStep", "hasSnap", "hasLable", "hasTooltip"], outputs: ["valuesChange"] }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
21681
21123
  }
21682
21124
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPGridOptionsWidgetEditComponent, decorators: [{
21683
21125
  type: Component,
@@ -21857,7 +21299,7 @@ class AXPAdvancedGridOptionsWidgetEditComponent extends AXPValueWidgetComponent
21857
21299
  this.selectedAlign.set({ value: align, label: this.findAlignNameById(align) });
21858
21300
  }
21859
21301
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAdvancedGridOptionsWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
21860
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPAdvancedGridOptionsWidgetEditComponent, isStandalone: true, selector: "axp-advanced-grid-options-widget-editor", usesInheritance: true, ngImport: i0, template: "<div class=\"axp-advanced-grid w-11/12\">\n <div class=\"grid grid-cols-2 grid-rows-2 gap-x-3 items-center pb-2\">\n <span>Columns</span>\n <span>Items</span>\n <ax-number-box\n [minValue]=\"1\"\n [maxValue]=\"12\"\n [value]=\"columns()\"\n (onValueChanged)=\"changeValue($event, 'columns')\"\n ></ax-number-box>\n <ax-number-box\n [minValue]=\"1\"\n [maxValue]=\"99\"\n [value]=\"items()\"\n (onValueChanged)=\"changeValue($event, 'itemsCount')\"\n ></ax-number-box>\n </div>\n <span>Align</span>\n <div class=\"flex justify-between gap-2 items-center\">\n <div\n class=\"relative size-[62px] bg-[rgb(30,30,30)] border border-white border-opacity-15 rounded\"\n >\n <div class=\"absolute inset-0 grid grid-cols-3 grid-rows-3\">\n @for(side of gridSides; track side.value){\n <div\n [attr.aria-label]=\"side.label\"\n [attr.aria-value]=\"side.value\"\n class=\"grid place-content-center\"\n (mouseenter)=\"onHover(side)\"\n (mouseleave)=\"onHoverLeave()\"\n (click)=\"onClick(side)\"\n >\n @if (true) {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"7\" y=\"7\" width=\"2\" height=\"2\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.3\"></rect>\n </svg>\n }\n </div>\n }\n </div>\n @if(hoveredJustify() && hoveredAlign()){\n <div\n class=\"axp-grid-option-hover absolute inset-0 grid pointer-events-none transition-all\"\n [style.justify-items]=\"hoveredJustify()\"\n [style.align-items]=\"hoveredAlign()\"\n >\n <div class=\"flex justify-center items-center min-w-5 min-h-5\">\n <div class=\"size-auto z-[1] rounded-lg bg-[rgb(30,30,30)] flex-none\">\n @if(clickedJustify()==='stretch' && clickedAlign()==='stretch') {} @else if(clickedJustify()==='stretch'){\n <svg\n width=\"60\"\n height=\"20\"\n viewBox=\"0 0 60 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M4.5 4.6a.15.15 0 0 1 .033-.1h50.934l.003.003a.15.15 0 0 1 .03.097v10.8a.15.15 0 0 1-.03.097l-.003.003H4.533l-.003-.003a.15.15 0 0 1-.03-.097V4.6Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.07; stroke-opacity: 0.25\"\n ></path>\n </svg>\n } @else if(clickedAlign()==='stretch'){\n <svg\n width=\"20\"\n height=\"60\"\n viewBox=\"0 0 20 60\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M4.6 4.5h10.8a.15.15 0 0 1 .097.03l.003.003v50.934l-.003.003a.15.15 0 0 1-.097.03H4.6a.15.15 0 0 1-.1-.033V4.533l.003-.003A.15.15 0 0 1 4.6 4.5Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.07; stroke-opacity: 0.25\"\n ></path>\n </svg>\n } @else{\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: #efeaea\"\n >\n <path\n d=\"M4.5 4.6a.1.1 0 0 1 .1-.1h10.8a.1.1 0 0 1 .1.1v10.8a.1.1 0 0 1-.1.1H4.6a.1.1 0 0 1-.1-.1V4.6Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"stroke-opacity: 0.25; fill-opacity: 0.07\"\n class=\"hover:fill-opacity-20\"\n ></path>\n </svg>\n }\n </div>\n </div>\n </div>\n }\n\n <div\n class=\"axp-grid-option-active absolute inset-0 grid pointer-events-none transition-all\"\n [style.justify-items]=\"clickedJustify()\"\n [style.align-items]=\"clickedAlign()\"\n >\n <div class=\"flex justify-center items-center min-w-5 min-h-5\">\n <div class=\"size-auto z-[2] rounded-lg bg-[rgb(30,30,30)] flex-none\">\n @if(clickedJustify()==='stretch' && clickedAlign()==='stretch') {\n <svg\n width=\"60\"\n height=\"60\"\n viewBox=\"0 0 60 60\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M55.5 55.48a.02.02 0 0 1-.02.02H4.52a.02.02 0 0 1-.02-.02V4.52a.02.02 0 0 1 .02-.02h50.96a.02.02 0 0 1 .02.02v50.96Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.16; stroke: white\"\n ></path>\n <path\n d=\"m26.354 20.354 3.146-3.147V29.5h-3v1h3v12.293l-3.146-3.147-.707.708L30 44.707l4.354-4.353-.707-.708-3.147 3.147V30.5h12.293l-3.147 3.147.708.707L44.707 30l-4.353-4.354-.708.708 3.147 3.146H30.5V17.207l3.146 3.147.707-.707L30 15.293l-4.354 4.354.707.707Z\"\n fill=\"currentColor\"\n style=\"fill-opacity: 0.25\"\n ></path>\n <path\n d=\"m17.207 30.5 3.146 3.147-.707.707L15.293 30l4.353-4.354.707.708-3.146 3.146H26.5v1h-9.293Z\"\n fill=\"currentColor\"\n style=\"fill-opacity: 0.25\"\n ></path>\n </svg>\n } @else if(clickedJustify()==='stretch'){\n <svg\n width=\"60\"\n height=\"20\"\n viewBox=\"0 0 60 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M4.5 4.6a.15.15 0 0 1 .033-.1h50.934l.003.003a.15.15 0 0 1 .03.097v10.8a.15.15 0 0 1-.03.097l-.003.003H4.533l-.003-.003a.15.15 0 0 1-.03-.097V4.6Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.16; stroke: white\"\n ></path>\n </svg>\n } @else if(clickedAlign()==='stretch'){\n <svg\n width=\"20\"\n height=\"60\"\n viewBox=\"0 0 20 60\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M4.6 4.5h10.8a.15.15 0 0 1 .097.03l.003.003v50.934l-.003.003a.15.15 0 0 1-.097.03H4.6a.15.15 0 0 1-.1-.033V4.533l.003-.003A.15.15 0 0 1 4.6 4.5Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.16; stroke: white\"\n ></path>\n </svg>\n } @else{\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: #efeaea\"\n >\n <path\n d=\"M4.5 4.6a.1.1 0 0 1 .1-.1h10.8a.1.1 0 0 1 .1.1v10.8a.1.1 0 0 1-.1.1H4.6a.1.1 0 0 1-.1-.1V4.6Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill: #cebcbc; fill-opacity: 0.16\"\n ></path>\n </svg>\n }\n </div>\n </div>\n </div>\n </div>\n <div class=\"grid grid-cols-[auto_1fr] items-center justify-items-start gap-2\">\n <span>X:</span>\n <div class=\"w-36\">\n <ax-lookup\n mode=\"drop-down-list\"\n [dataSource]=\"justifyDataSource\"\n [value]=\"selectedJustify()\"\n (onValueChanged)=\"onJustifyChange($event)\"\n textField=\"label\"\n valueField=\"value\"\n [searchable]=\"false\"\n placeholder=\"Choose...\"\n >\n </ax-lookup>\n </div>\n <span>Y:</span>\n <div class=\"w-36\">\n <ax-lookup\n mode=\"drop-down-list\"\n [dataSource]=\"alignDataSource\"\n [value]=\"selectedAlign()\"\n (onValueChanged)=\"onAlignChange($event)\"\n textField=\"label\"\n valueField=\"value\"\n [searchable]=\"false\"\n placeholder=\"Choose...\"\n >\n </ax-lookup>\n </div>\n </div>\n </div>\n</div>\n", styles: ["/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXNumberBoxModule }, { kind: "component", type: i1$8.AXNumberBoxComponent, selector: "ax-number-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "minValue", "maxValue", "showSpinButtons", "thousandsSeparator", "decimals", "changeOnScroll", "step"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "thousandsSeparatorChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXLabelModule }, { 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", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
21302
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPAdvancedGridOptionsWidgetEditComponent, isStandalone: true, selector: "axp-advanced-grid-options-widget-editor", usesInheritance: true, ngImport: i0, template: "<div class=\"axp-advanced-grid w-11/12\">\n <div class=\"grid grid-cols-2 grid-rows-2 gap-x-3 items-center pb-2\">\n <span>Columns</span>\n <span>Items</span>\n <ax-number-box\n [minValue]=\"1\"\n [maxValue]=\"12\"\n [value]=\"columns()\"\n (onValueChanged)=\"changeValue($event, 'columns')\"\n ></ax-number-box>\n <ax-number-box\n [minValue]=\"1\"\n [maxValue]=\"99\"\n [value]=\"items()\"\n (onValueChanged)=\"changeValue($event, 'itemsCount')\"\n ></ax-number-box>\n </div>\n <span>Align</span>\n <div class=\"flex justify-between gap-2 items-center\">\n <div\n class=\"relative size-[62px] bg-[rgb(30,30,30)] border border-white border-opacity-15 rounded\"\n >\n <div class=\"absolute inset-0 grid grid-cols-3 grid-rows-3\">\n @for(side of gridSides; track side.value){\n <div\n [attr.aria-label]=\"side.label\"\n [attr.aria-value]=\"side.value\"\n class=\"grid place-content-center\"\n (mouseenter)=\"onHover(side)\"\n (mouseleave)=\"onHoverLeave()\"\n (click)=\"onClick(side)\"\n >\n @if (true) {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"7\" y=\"7\" width=\"2\" height=\"2\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.3\"></rect>\n </svg>\n }\n </div>\n }\n </div>\n @if(hoveredJustify() && hoveredAlign()){\n <div\n class=\"axp-grid-option-hover absolute inset-0 grid pointer-events-none transition-all\"\n [style.justify-items]=\"hoveredJustify()\"\n [style.align-items]=\"hoveredAlign()\"\n >\n <div class=\"flex justify-center items-center min-w-5 min-h-5\">\n <div class=\"size-auto z-[1] rounded-lg bg-[rgb(30,30,30)] flex-none\">\n @if(clickedJustify()==='stretch' && clickedAlign()==='stretch') {} @else if(clickedJustify()==='stretch'){\n <svg\n width=\"60\"\n height=\"20\"\n viewBox=\"0 0 60 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M4.5 4.6a.15.15 0 0 1 .033-.1h50.934l.003.003a.15.15 0 0 1 .03.097v10.8a.15.15 0 0 1-.03.097l-.003.003H4.533l-.003-.003a.15.15 0 0 1-.03-.097V4.6Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.07; stroke-opacity: 0.25\"\n ></path>\n </svg>\n } @else if(clickedAlign()==='stretch'){\n <svg\n width=\"20\"\n height=\"60\"\n viewBox=\"0 0 20 60\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M4.6 4.5h10.8a.15.15 0 0 1 .097.03l.003.003v50.934l-.003.003a.15.15 0 0 1-.097.03H4.6a.15.15 0 0 1-.1-.033V4.533l.003-.003A.15.15 0 0 1 4.6 4.5Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.07; stroke-opacity: 0.25\"\n ></path>\n </svg>\n } @else{\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: #efeaea\"\n >\n <path\n d=\"M4.5 4.6a.1.1 0 0 1 .1-.1h10.8a.1.1 0 0 1 .1.1v10.8a.1.1 0 0 1-.1.1H4.6a.1.1 0 0 1-.1-.1V4.6Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"stroke-opacity: 0.25; fill-opacity: 0.07\"\n class=\"hover:fill-opacity-20\"\n ></path>\n </svg>\n }\n </div>\n </div>\n </div>\n }\n\n <div\n class=\"axp-grid-option-active absolute inset-0 grid pointer-events-none transition-all\"\n [style.justify-items]=\"clickedJustify()\"\n [style.align-items]=\"clickedAlign()\"\n >\n <div class=\"flex justify-center items-center min-w-5 min-h-5\">\n <div class=\"size-auto z-[2] rounded-lg bg-[rgb(30,30,30)] flex-none\">\n @if(clickedJustify()==='stretch' && clickedAlign()==='stretch') {\n <svg\n width=\"60\"\n height=\"60\"\n viewBox=\"0 0 60 60\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M55.5 55.48a.02.02 0 0 1-.02.02H4.52a.02.02 0 0 1-.02-.02V4.52a.02.02 0 0 1 .02-.02h50.96a.02.02 0 0 1 .02.02v50.96Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.16; stroke: white\"\n ></path>\n <path\n d=\"m26.354 20.354 3.146-3.147V29.5h-3v1h3v12.293l-3.146-3.147-.707.708L30 44.707l4.354-4.353-.707-.708-3.147 3.147V30.5h12.293l-3.147 3.147.708.707L44.707 30l-4.353-4.354-.708.708 3.147 3.146H30.5V17.207l3.146 3.147.707-.707L30 15.293l-4.354 4.354.707.707Z\"\n fill=\"currentColor\"\n style=\"fill-opacity: 0.25\"\n ></path>\n <path\n d=\"m17.207 30.5 3.146 3.147-.707.707L15.293 30l4.353-4.354.707.708-3.146 3.146H26.5v1h-9.293Z\"\n fill=\"currentColor\"\n style=\"fill-opacity: 0.25\"\n ></path>\n </svg>\n } @else if(clickedJustify()==='stretch'){\n <svg\n width=\"60\"\n height=\"20\"\n viewBox=\"0 0 60 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M4.5 4.6a.15.15 0 0 1 .033-.1h50.934l.003.003a.15.15 0 0 1 .03.097v10.8a.15.15 0 0 1-.03.097l-.003.003H4.533l-.003-.003a.15.15 0 0 1-.03-.097V4.6Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.16; stroke: white\"\n ></path>\n </svg>\n } @else if(clickedAlign()==='stretch'){\n <svg\n width=\"20\"\n height=\"60\"\n viewBox=\"0 0 20 60\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: white\"\n >\n <path\n d=\"M4.6 4.5h10.8a.15.15 0 0 1 .097.03l.003.003v50.934l-.003.003a.15.15 0 0 1-.097.03H4.6a.15.15 0 0 1-.1-.033V4.533l.003-.003A.15.15 0 0 1 4.6 4.5Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill-opacity: 0.16; stroke: white\"\n ></path>\n </svg>\n } @else{\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"color: #efeaea\"\n >\n <path\n d=\"M4.5 4.6a.1.1 0 0 1 .1-.1h10.8a.1.1 0 0 1 .1.1v10.8a.1.1 0 0 1-.1.1H4.6a.1.1 0 0 1-.1-.1V4.6Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n style=\"fill: #cebcbc; fill-opacity: 0.16\"\n ></path>\n </svg>\n }\n </div>\n </div>\n </div>\n </div>\n <div class=\"grid grid-cols-[auto_1fr] items-center justify-items-start gap-2\">\n <span>X:</span>\n <div class=\"w-36\">\n <ax-lookup\n mode=\"drop-down-list\"\n [dataSource]=\"justifyDataSource\"\n [value]=\"selectedJustify()\"\n (onValueChanged)=\"onJustifyChange($event)\"\n textField=\"label\"\n valueField=\"value\"\n [searchable]=\"false\"\n placeholder=\"Choose...\"\n >\n </ax-lookup>\n </div>\n <span>Y:</span>\n <div class=\"w-36\">\n <ax-lookup\n mode=\"drop-down-list\"\n [dataSource]=\"alignDataSource\"\n [value]=\"selectedAlign()\"\n (onValueChanged)=\"onAlignChange($event)\"\n textField=\"label\"\n valueField=\"value\"\n [searchable]=\"false\"\n placeholder=\"Choose...\"\n >\n </ax-lookup>\n </div>\n </div>\n </div>\n</div>\n", styles: ["/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXNumberBoxModule }, { kind: "component", type: i1$8.AXNumberBoxComponent, selector: "ax-number-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "minValue", "maxValue", "showSpinButtons", "thousandsSeparator", "decimals", "changeOnScroll", "step"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "thousandsSeparatorChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXLabelModule }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
21861
21303
  }
21862
21304
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAdvancedGridOptionsWidgetEditComponent, decorators: [{
21863
21305
  type: Component,
@@ -22302,7 +21744,7 @@ class AXPBorderWidgetEditComponent extends AXPValueWidgetComponent {
22302
21744
  };
22303
21745
  }
22304
21746
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPBorderWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
22305
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPBorderWidgetEditComponent, isStandalone: true, selector: "axp-border-widget-editor", viewQueries: [{ propertyName: "allBorderEl", first: true, predicate: ["allBorderEl"], descendants: true, isSignal: true }, { propertyName: "allRadiusEl", first: true, predicate: ["allRadiusEl"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"pt-2 axp-border-container\">\n <div class=\"radius-box flex justify-between items-center gap-2 h-[26px]\">\n <span class=\"text-sm font-light\">Radius</span>\n <div class=\"flex gap-1 items-center\">\n <button\n #allRadiusEl\n (pointerdown)=\"handleActiveRadiusSide($event)\"\n name=\"all\"\n class=\"p-1 hover:!bg-[var(--hover-effect)]\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2.5 5.5C2.5 3.84315 3.84315 2.5 5.5 2.5H10.5C12.1569 2.5 13.5 3.84315 13.5 5.5V10.5C13.5 12.1569 12.1569 13.5 10.5 13.5H5.5C3.84315 13.5 2.5 12.1569 2.5 10.5V5.5Z\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n </button>\n\n <button\n (pointerdown)=\"handleActiveRadiusSide($event)\"\n name=\"sides\"\n class=\"p-1 hover:!bg-[var(--hover-effect)]\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.5 2C3.11929 2 2 3.11929 2 4.5V7H3V4.5C3 3.67157 3.67157 3 4.5 3H7V2H4.5Z\"\n fill=\"currentColor\"\n ></path>\n <path\n d=\"M9 2V3H11.5C12.3284 3 13 3.67157 13 4.5V7H14V4.5C14 3.11929 12.8807 2 11.5 2H9Z\"\n fill=\"currentColor\"\n ></path>\n <path\n d=\"M14 9H13V11.5C13 12.3284 12.3284 13 11.5 13H9V14H11.5C12.8807 14 14 12.8807 14 11.5V9Z\"\n fill=\"currentColor\"\n ></path>\n <path\n d=\"M7 14V13H4.5C3.67157 13 3 12.3284 3 11.5V9H2V11.5C2 12.8807 3.11929 14 4.5 14H7Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </button>\n\n @if (currentActiveRadiusSide() === 'all') {\n <div class=\"flex justify-center items-center flex-shrink\">\n <ax-range-slider\n [values]=\"allRadius()\"\n [min]=\"0\"\n [max]=\"100\"\n (valuesChange)=\"setBorder($event ?? 0, 'radius', 'all')\"\n class=\"min-w-24\"\n ></ax-range-slider>\n </div>\n <div class=\"flex justify-start items-center\">\n <ax-number-box\n [minValue]=\"0\"\n [maxValue]=\"100\"\n [value]=\"allRadius()\"\n [changeOnScroll]=\"true\"\n (valueChange)=\"setBorder($event ?? 0, 'radius', 'all')\"\n class=\"min-w-[4.5rem] ax-sm\"\n [showSpinButtons]=\"false\"\n ><ax-suffix>\n <ax-dropdown-button\n [text]=\"getRadiusUnitLabel('all')\"\n [look]=\"'blank'\"\n [mode]=\"'dropdown'\"\n >\n <ax-button-item-list>\n @for (u of radiusUnits; track $index) {\n <ax-button-item\n [text]=\"u.toUpperCase()\"\n [selected]=\"getRadiusUnit('all') === u\"\n (onClick)=\"onRadiusUnitChange(u, 'all')\"\n ></ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-button> </ax-suffix\n ></ax-number-box>\n </div>\n } @else {\n <div class=\"w-48\"></div>\n }\n </div>\n </div>\n\n <div\n class=\"axp-border-radius-sides flex justify-end items-center overflow-y-hidden transition-[height] duration-300 ease-in-out\"\n [class]=\"currentActiveRadiusSide() === 'all' ? '!h-0' : '!h-auto'\"\n style=\"interpolate-size: allow-keywords\"\n >\n <div class=\"grid grid-cols-2 grid-rows-2 gap-2\">\n <div class=\"flex gap-1 items-center\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g opacity=\"0.4\">\n <path d=\"M14 14V9H13V13H9V14H14Z\" fill=\"currentColor\"></path>\n <path d=\"M7 14V13H3V9H2V14H7Z\" fill=\"currentColor\"></path>\n <path\n d=\"M2 7H3V6.5C3 4.567 4.567 3 6.5 3H7V2H6.5C4.01472 2 2 4.01472 2 6.5V7Z\"\n fill=\"currentColor\"\n ></path>\n <path d=\"M9 2V3H13V7H14V2H9Z\" fill=\"currentColor\"></path>\n </g>\n <path\n d=\"M2.5 7V6.5C2.5 4.29086 4.29086 2.5 6.5 2.5H7\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n <div class=\"flex justify-start items-center max-w-24\">\n <ax-number-box\n class=\"ax-sm\"\n [minValue]=\"0\"\n [changeOnScroll]=\"true\"\n [ngModel]=\"calculatedValues().radius['top-left']\"\n (onValueChanged)=\"\n setBorder($event.value ?? 0, 'radius', 'top-left')\n \"\n [showSpinButtons]=\"false\"\n ><ax-suffix>\n <ax-dropdown-button\n [text]=\"getRadiusUnitLabel('top-left')\"\n [look]=\"'blank'\"\n [mode]=\"'dropdown'\"\n >\n <ax-button-item-list>\n @for (u of radiusUnits; track $index) {\n <ax-button-item\n [text]=\"u.toUpperCase()\"\n [selected]=\"getRadiusUnit('top-left') === u\"\n (onClick)=\"onRadiusUnitChange(u, 'top-left')\"\n ></ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-button> </ax-suffix\n ></ax-number-box>\n </div>\n </div>\n <div class=\"flex gap-1 items-center\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g opacity=\"0.4\">\n <path d=\"M2 14V9H3V13H7V14H2Z\" fill=\"currentColor\"></path>\n <path d=\"M9 14V13H13V9H14V14H9Z\" fill=\"currentColor\"></path>\n <path\n d=\"M14 7H13V6.5C13 4.567 11.433 3 9.5 3H9V2H9.5C11.9853 2 14 4.01472 14 6.5V7Z\"\n fill=\"currentColor\"\n ></path>\n <path d=\"M7 2V3H3V7H2V2H7Z\" fill=\"currentColor\"></path>\n </g>\n <path\n d=\"M13.5 7V6.5C13.5 4.29086 11.7091 2.5 9.5 2.5H9\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n <div class=\"flex justify-start items-center max-w-24\">\n <ax-number-box\n class=\"ax-sm\"\n [minValue]=\"0\"\n [changeOnScroll]=\"true\"\n [ngModel]=\"calculatedValues().radius['top-right']\"\n (onValueChanged)=\"\n setBorder($event.value ?? 0, 'radius', 'top-right')\n \"\n [showSpinButtons]=\"false\"\n ><ax-suffix>\n <ax-dropdown-button\n [text]=\"getRadiusUnitLabel('top-right')\"\n [look]=\"'blank'\"\n [mode]=\"'dropdown'\"\n >\n <ax-button-item-list>\n @for (u of radiusUnits; track $index) {\n <ax-button-item\n [text]=\"u.toUpperCase()\"\n [selected]=\"getRadiusUnit('top-right') === u\"\n (onClick)=\"onRadiusUnitChange(u, 'top-right')\"\n ></ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-button> </ax-suffix\n ></ax-number-box>\n </div>\n </div>\n <div class=\"flex gap-1 items-center\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g opacity=\"0.4\">\n <path d=\"M2 2V7H3V3H7V2H2Z\" fill=\"currentColor\"></path>\n <path d=\"M9 2V3H13V7H14V2H9Z\" fill=\"currentColor\"></path>\n <path d=\"M14 9H13V13H9V14H14V9Z\" fill=\"currentColor\"></path>\n <path\n d=\"M7 14V13H6.5C4.567 13 3 11.433 3 9.5V9H2V9.5C2 11.9853 4.01472 14 6.5 14H7Z\"\n fill=\"currentColor\"\n ></path>\n </g>\n <path\n d=\"M2.5 9V9.5C2.5 11.7091 4.29086 13.5 6.5 13.5H7\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n <div class=\"flex justify-start items-center max-w-24\">\n <ax-number-box\n class=\"ax-sm\"\n [minValue]=\"0\"\n [changeOnScroll]=\"true\"\n [ngModel]=\"calculatedValues().radius['bottom-left']\"\n (onValueChanged)=\"\n setBorder($event.value ?? 0, 'radius', 'bottom-left')\n \"\n [showSpinButtons]=\"false\"\n ><ax-suffix>\n <ax-dropdown-button\n [text]=\"getRadiusUnitLabel('bottom-left')\"\n [look]=\"'blank'\"\n [mode]=\"'dropdown'\"\n >\n <ax-button-item-list>\n @for (u of radiusUnits; track $index) {\n <ax-button-item\n [text]=\"u.toUpperCase()\"\n [selected]=\"getRadiusUnit('bottom-left') === u\"\n (onClick)=\"onRadiusUnitChange(u, 'bottom-left')\"\n ></ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-button> </ax-suffix\n ></ax-number-box>\n </div>\n </div>\n <div class=\"flex gap-1 items-center\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g opacity=\"0.4\">\n <path d=\"M2 2V7H3V3H7V2H2Z\" fill=\"currentColor\"></path>\n <path d=\"M9 2V3H13V7H14V2H9Z\" fill=\"currentColor\"></path>\n <path\n d=\"M14 9H13V11.5C13 12.3284 12.3284 13 11.5 13H9V14H11.5C12.8807 14 14 12.8807 14 11.5V9Z\"\n fill=\"currentColor\"\n ></path>\n <path d=\"M7 14V13H3V9H2V14H7Z\" fill=\"currentColor\"></path>\n </g>\n <path\n d=\"M13.5 9V9.5C13.5 11.7091 11.7091 13.5 9.5 13.5H9\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n <div class=\"flex justify-start items-center max-w-24\">\n <ax-number-box\n class=\"ax-sm\"\n [minValue]=\"0\"\n [changeOnScroll]=\"true\"\n [ngModel]=\"calculatedValues().radius['bottom-right']\"\n (onValueChanged)=\"\n setBorder($event.value ?? 0, 'radius', 'bottom-right')\n \"\n [showSpinButtons]=\"false\"\n ><ax-suffix>\n <ax-dropdown-button\n [text]=\"getRadiusUnitLabel('bottom-right')\"\n [look]=\"'blank'\"\n [mode]=\"'dropdown'\"\n >\n <ax-button-item-list>\n @for (u of radiusUnits; track $index) {\n <ax-button-item\n [text]=\"u.toUpperCase()\"\n [selected]=\"getRadiusUnit('bottom-right') === u\"\n (onClick)=\"onRadiusUnitChange(u, 'bottom-right')\"\n ></ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-button> </ax-suffix\n ></ax-number-box>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-between items-center py-1\">\n <span class=\"text-sm font-light\">Borders</span>\n </div>\n\n <div class=\"border-box flex justify-between items-center gap-4\">\n <div class=\"grid grid-cols-3 grid-rows-3 gap-1 flex-shrink-0\">\n <!-- Top Border -->\n <div class=\"border-box-top col-start-2 row-start-1\">\n <button\n (pointerdown)=\"handleActiveBorderSide($event)\"\n name=\"top\"\n class=\"p-1 hover:!bg-[var(--hover-effect)]\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n opacity=\"0.4\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M2 13C2 13.5523 2.44772 14 3 14H13C13.5523 14 14 13.5523 14 13V5H13V13H3V5H2V13Z\"\n fill=\"currentColor\"\n ></path>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M2 3H14V2H2V3Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </button>\n </div>\n\n <!-- Right Border -->\n <div class=\"border-box-right col-start-3 row-start-2\">\n <button\n (pointerdown)=\"handleActiveBorderSide($event)\"\n name=\"right\"\n class=\"p-1 hover:!bg-[var(--hover-effect)]\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n opacity=\"0.4\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M3 2C2.44772 2 2 2.44772 2 3L2 13C2 13.5523 2.44772 14 3 14L11 14L11 13L3 13L3 3L11 3L11 2L3 2Z\"\n fill=\"currentColor\"\n ></path>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M13 2L13 14L14 14L14 2L13 2Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </button>\n </div>\n\n <!-- Bottom Border -->\n <div class=\"border-box-bottom col-start-2 row-start-3\">\n <button\n (pointerdown)=\"handleActiveBorderSide($event)\"\n name=\"bottom\"\n class=\"p-1 hover:!bg-[var(--hover-effect)]\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n opacity=\"0.4\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M2 3C2 2.44772 2.44772 2 3 2H13C13.5523 2 14 2.44772 14 3V11H13V3H3V11H2V3Z\"\n fill=\"currentColor\"\n ></path>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M2 13H14V14H2V13Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </button>\n </div>\n\n <!-- Left Border -->\n <div class=\"border-box-left col-start-1 row-start-2\">\n <button\n (pointerdown)=\"handleActiveBorderSide($event)\"\n name=\"left\"\n class=\"p-1 hover:!bg-[var(--hover-effect)]\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n opacity=\"0.4\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M13 2C13.5523 2 14 2.44772 14 3L14 13C14 13.5523 13.5523 14 13 14L5 14L5 13L13 13L13 3L5 3L5 2L13 2Z\"\n fill=\"currentColor\"\n ></path>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M3 2L3 14L2 14L2 2L3 2Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </button>\n </div>\n\n <!-- All -->\n <div class=\"border-box-all col-start-2 row-start-2\">\n <button\n #allBorderEl\n (pointerdown)=\"handleActiveBorderSide($event)\"\n name=\"all\"\n class=\"p-1 hover:!bg-[var(--hover-effect)]\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M2 3C2 2.44772 2.44772 2 3 2H13C13.5523 2 14 2.44772 14 3V13C14 13.5523 13.5523 14 13 14H3C2.44772 14 2 13.5523 2 13V3ZM13 3L3 3V13H13V3Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </button>\n </div>\n </div>\n <div\n class=\"grid grid-cols-[auto_1fr] items-center justify-items-center gap-x-2 gap-y-2\"\n >\n <div class=\"text-sm font-light\">Style</div>\n <ax-button-group class=\"ax-sm\" [selection]=\"'single'\">\n <ax-button-group-item\n (onClick)=\"setBorder('none', 'style', currentActiveSide())\"\n [selected]=\"shownStyle() === 'none'\"\n ><ax-prefix\n ><svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M8.70714 8.00004L12.3536 4.35359L11.6465 3.64648L8.00004 7.29293L4.35359 3.64648L3.64648 4.35359L7.29293 8.00004L3.64648 11.6465L4.35359 12.3536L8.00004 8.70714L11.6465 12.3536L12.3536 11.6465L8.70714 8.00004Z\"\n fill=\"currentColor\"\n ></path></svg></ax-prefix\n ></ax-button-group-item>\n <ax-button-group-item\n (onClick)=\"setBorder('solid', 'style', currentActiveSide())\"\n [selected]=\"shownStyle() === 'solid'\"\n ><ax-prefix\n ><svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M2 7.5H14\" stroke=\"currentColor\"></path></svg></ax-prefix\n ></ax-button-group-item>\n <ax-button-group-item\n (onClick)=\"setBorder('dashed', 'style', currentActiveSide())\"\n [selected]=\"shownStyle() === 'dashed'\"\n ><ax-prefix\n ><svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M5 7H2V8H5V7ZM11 8H12H14V7H12H11V8ZM9.5 7H6.5V8H9.5V7Z\"\n fill=\"currentColor\"\n ></path></svg></ax-prefix\n ></ax-button-group-item>\n <ax-button-group-item\n (onClick)=\"setBorder('dotted', 'style', currentActiveSide())\"\n [selected]=\"shownStyle() === 'dotted'\"\n ><ax-prefix\n ><svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M4 7H3V8H4V7ZM6 7H5V8H6V7ZM7 7H8V8H7V7ZM10 7H9V8H10V7ZM11 7H12V8H11V7ZM14 7H13V8H14V7Z\"\n fill=\"currentColor\"\n ></path></svg></ax-prefix\n ></ax-button-group-item>\n </ax-button-group>\n <div\n class=\"contents\"\n [class]=\"shownStyle() === 'none' ? 'invisible' : 'visible'\"\n >\n <div class=\"text-sm font-light\">Width</div>\n <div class=\"flex justify-start items-center max-w-36\">\n <ax-number-box\n [minValue]=\"0\"\n [changeOnScroll]=\"true\"\n [value]=\"shownWidth()\"\n (onValueChanged)=\"\n setBorder($event.value ?? 0, 'width', currentActiveSide())\n \"\n class=\"ax-sm exclude\"\n [showSpinButtons]=\"false\"\n ><ax-suffix>\n <ax-dropdown-button\n [text]=\"getWidthUnitLabel(currentActiveSide())\"\n [look]=\"'blank'\"\n [mode]=\"'dropdown'\"\n >\n <ax-button-item-list>\n @for (u of widthUnits; track $index) {\n <ax-button-item\n [text]=\"u.toUpperCase()\"\n [selected]=\"getWidthUnit(currentActiveSide()) === u\"\n (onClick)=\"onWidthUnitChange(u, currentActiveSide())\"\n ></ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-button> </ax-suffix\n ></ax-number-box>\n </div>\n\n <div class=\"text-sm font-light\">Color</div>\n <div class=\"flex justify-start items-center max-w-36 overflow-hidden\">\n <ax-color-box\n class=\"ax-sm\"\n [value]=\"shownColor()\"\n (onValueChanged)=\"\n setBorder($event.value ?? '', 'color', currentActiveSide())\n \"\n ></ax-color-box>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: ["axp-border-widget-edit{--ax-comp-range-slider-handler-size: .75rem;--focus-color: rgb(var(--ax-sys-color-primary-700));--hover-effect: rgb(var(--ax-sys-color-primary-500))}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXNumberBoxModule }, { kind: "component", type: i1$8.AXNumberBoxComponent, selector: "ax-number-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "minValue", "maxValue", "showSpinButtons", "thousandsSeparator", "decimals", "changeOnScroll", "step"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "thousandsSeparatorChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXCheckBoxModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1$1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDecoratorModule }, { 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: AXRangeSliderModule }, { kind: "component", type: i3$4.AXRangeSliderComponent, selector: "ax-range-slider", inputs: ["disabled", "readonly", "orientation", "color", "values", "mode", "min", "max", "step", "snap", "tooltipMode", "snapMode", "hasStep", "hasSnap", "hasLable", "hasTooltip"], outputs: ["valuesChange"] }, { kind: "ngmodule", type: AXButtonGroupModule }, { kind: "component", type: i1$k.AXButtonGroupComponent, selector: "ax-button-group", inputs: ["disabled", "fitParent", "color", "look", "class", "selection"], outputs: ["onBlur", "onFocus", "disabledChange", "colorChange", "lookChange", "onClick", "selectionChange", "selectedButtonChange"] }, { kind: "component", type: i1$k.AXButtonGroupItemComponent, selector: "ax-button-group-item", inputs: ["disabled", "color", "text", "class", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange", "classChange"] }, { kind: "ngmodule", type: AXColorBoxModule }, { kind: "component", type: i2$3.AXColorBoxComponent, selector: "ax-color-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "showBadge", "showValue", "showClearButton", "showIcon"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "component", type: i6.AXDropdownButtonComponent, selector: "ax-dropdown-button", inputs: ["disabled", "size", "text", "color", "look", "type", "mode"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "lookChange", "colorChange", "disabledChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
21747
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPBorderWidgetEditComponent, isStandalone: true, selector: "axp-border-widget-editor", viewQueries: [{ propertyName: "allBorderEl", first: true, predicate: ["allBorderEl"], descendants: true, isSignal: true }, { propertyName: "allRadiusEl", first: true, predicate: ["allRadiusEl"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"pt-2 axp-border-container\">\n <div class=\"radius-box flex justify-between items-center gap-2 h-[26px]\">\n <span class=\"text-sm font-light\">Radius</span>\n <div class=\"flex gap-1 items-center\">\n <button\n #allRadiusEl\n (pointerdown)=\"handleActiveRadiusSide($event)\"\n name=\"all\"\n class=\"p-1 hover:!bg-[var(--hover-effect)]\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2.5 5.5C2.5 3.84315 3.84315 2.5 5.5 2.5H10.5C12.1569 2.5 13.5 3.84315 13.5 5.5V10.5C13.5 12.1569 12.1569 13.5 10.5 13.5H5.5C3.84315 13.5 2.5 12.1569 2.5 10.5V5.5Z\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n </button>\n\n <button\n (pointerdown)=\"handleActiveRadiusSide($event)\"\n name=\"sides\"\n class=\"p-1 hover:!bg-[var(--hover-effect)]\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.5 2C3.11929 2 2 3.11929 2 4.5V7H3V4.5C3 3.67157 3.67157 3 4.5 3H7V2H4.5Z\"\n fill=\"currentColor\"\n ></path>\n <path\n d=\"M9 2V3H11.5C12.3284 3 13 3.67157 13 4.5V7H14V4.5C14 3.11929 12.8807 2 11.5 2H9Z\"\n fill=\"currentColor\"\n ></path>\n <path\n d=\"M14 9H13V11.5C13 12.3284 12.3284 13 11.5 13H9V14H11.5C12.8807 14 14 12.8807 14 11.5V9Z\"\n fill=\"currentColor\"\n ></path>\n <path\n d=\"M7 14V13H4.5C3.67157 13 3 12.3284 3 11.5V9H2V11.5C2 12.8807 3.11929 14 4.5 14H7Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </button>\n\n @if (currentActiveRadiusSide() === 'all') {\n <div class=\"flex justify-center items-center flex-shrink\">\n <ax-range-slider\n [values]=\"allRadius()\"\n [min]=\"0\"\n [max]=\"100\"\n (valuesChange)=\"setBorder($event ?? 0, 'radius', 'all')\"\n class=\"min-w-24\"\n ></ax-range-slider>\n </div>\n <div class=\"flex justify-start items-center\">\n <ax-number-box\n [minValue]=\"0\"\n [maxValue]=\"100\"\n [value]=\"allRadius()\"\n [changeOnScroll]=\"true\"\n (valueChange)=\"setBorder($event ?? 0, 'radius', 'all')\"\n class=\"min-w-[4.5rem] ax-sm\"\n [showSpinButtons]=\"false\"\n ><ax-suffix>\n <ax-dropdown-button\n [text]=\"getRadiusUnitLabel('all')\"\n [look]=\"'blank'\"\n [mode]=\"'dropdown'\"\n >\n <ax-button-item-list>\n @for (u of radiusUnits; track $index) {\n <ax-button-item\n [text]=\"u.toUpperCase()\"\n [selected]=\"getRadiusUnit('all') === u\"\n (onClick)=\"onRadiusUnitChange(u, 'all')\"\n ></ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-button> </ax-suffix\n ></ax-number-box>\n </div>\n } @else {\n <div class=\"w-48\"></div>\n }\n </div>\n </div>\n\n <div\n class=\"axp-border-radius-sides flex justify-end items-center overflow-y-hidden transition-[height] duration-300 ease-in-out\"\n [class]=\"currentActiveRadiusSide() === 'all' ? '!h-0' : '!h-auto'\"\n style=\"interpolate-size: allow-keywords\"\n >\n <div class=\"grid grid-cols-2 grid-rows-2 gap-2\">\n <div class=\"flex gap-1 items-center\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g opacity=\"0.4\">\n <path d=\"M14 14V9H13V13H9V14H14Z\" fill=\"currentColor\"></path>\n <path d=\"M7 14V13H3V9H2V14H7Z\" fill=\"currentColor\"></path>\n <path\n d=\"M2 7H3V6.5C3 4.567 4.567 3 6.5 3H7V2H6.5C4.01472 2 2 4.01472 2 6.5V7Z\"\n fill=\"currentColor\"\n ></path>\n <path d=\"M9 2V3H13V7H14V2H9Z\" fill=\"currentColor\"></path>\n </g>\n <path\n d=\"M2.5 7V6.5C2.5 4.29086 4.29086 2.5 6.5 2.5H7\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n <div class=\"flex justify-start items-center max-w-24\">\n <ax-number-box\n class=\"ax-sm\"\n [minValue]=\"0\"\n [changeOnScroll]=\"true\"\n [ngModel]=\"calculatedValues().radius['top-left']\"\n (onValueChanged)=\"\n setBorder($event.value ?? 0, 'radius', 'top-left')\n \"\n [showSpinButtons]=\"false\"\n ><ax-suffix>\n <ax-dropdown-button\n [text]=\"getRadiusUnitLabel('top-left')\"\n [look]=\"'blank'\"\n [mode]=\"'dropdown'\"\n >\n <ax-button-item-list>\n @for (u of radiusUnits; track $index) {\n <ax-button-item\n [text]=\"u.toUpperCase()\"\n [selected]=\"getRadiusUnit('top-left') === u\"\n (onClick)=\"onRadiusUnitChange(u, 'top-left')\"\n ></ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-button> </ax-suffix\n ></ax-number-box>\n </div>\n </div>\n <div class=\"flex gap-1 items-center\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g opacity=\"0.4\">\n <path d=\"M2 14V9H3V13H7V14H2Z\" fill=\"currentColor\"></path>\n <path d=\"M9 14V13H13V9H14V14H9Z\" fill=\"currentColor\"></path>\n <path\n d=\"M14 7H13V6.5C13 4.567 11.433 3 9.5 3H9V2H9.5C11.9853 2 14 4.01472 14 6.5V7Z\"\n fill=\"currentColor\"\n ></path>\n <path d=\"M7 2V3H3V7H2V2H7Z\" fill=\"currentColor\"></path>\n </g>\n <path\n d=\"M13.5 7V6.5C13.5 4.29086 11.7091 2.5 9.5 2.5H9\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n <div class=\"flex justify-start items-center max-w-24\">\n <ax-number-box\n class=\"ax-sm\"\n [minValue]=\"0\"\n [changeOnScroll]=\"true\"\n [ngModel]=\"calculatedValues().radius['top-right']\"\n (onValueChanged)=\"\n setBorder($event.value ?? 0, 'radius', 'top-right')\n \"\n [showSpinButtons]=\"false\"\n ><ax-suffix>\n <ax-dropdown-button\n [text]=\"getRadiusUnitLabel('top-right')\"\n [look]=\"'blank'\"\n [mode]=\"'dropdown'\"\n >\n <ax-button-item-list>\n @for (u of radiusUnits; track $index) {\n <ax-button-item\n [text]=\"u.toUpperCase()\"\n [selected]=\"getRadiusUnit('top-right') === u\"\n (onClick)=\"onRadiusUnitChange(u, 'top-right')\"\n ></ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-button> </ax-suffix\n ></ax-number-box>\n </div>\n </div>\n <div class=\"flex gap-1 items-center\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g opacity=\"0.4\">\n <path d=\"M2 2V7H3V3H7V2H2Z\" fill=\"currentColor\"></path>\n <path d=\"M9 2V3H13V7H14V2H9Z\" fill=\"currentColor\"></path>\n <path d=\"M14 9H13V13H9V14H14V9Z\" fill=\"currentColor\"></path>\n <path\n d=\"M7 14V13H6.5C4.567 13 3 11.433 3 9.5V9H2V9.5C2 11.9853 4.01472 14 6.5 14H7Z\"\n fill=\"currentColor\"\n ></path>\n </g>\n <path\n d=\"M2.5 9V9.5C2.5 11.7091 4.29086 13.5 6.5 13.5H7\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n <div class=\"flex justify-start items-center max-w-24\">\n <ax-number-box\n class=\"ax-sm\"\n [minValue]=\"0\"\n [changeOnScroll]=\"true\"\n [ngModel]=\"calculatedValues().radius['bottom-left']\"\n (onValueChanged)=\"\n setBorder($event.value ?? 0, 'radius', 'bottom-left')\n \"\n [showSpinButtons]=\"false\"\n ><ax-suffix>\n <ax-dropdown-button\n [text]=\"getRadiusUnitLabel('bottom-left')\"\n [look]=\"'blank'\"\n [mode]=\"'dropdown'\"\n >\n <ax-button-item-list>\n @for (u of radiusUnits; track $index) {\n <ax-button-item\n [text]=\"u.toUpperCase()\"\n [selected]=\"getRadiusUnit('bottom-left') === u\"\n (onClick)=\"onRadiusUnitChange(u, 'bottom-left')\"\n ></ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-button> </ax-suffix\n ></ax-number-box>\n </div>\n </div>\n <div class=\"flex gap-1 items-center\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g opacity=\"0.4\">\n <path d=\"M2 2V7H3V3H7V2H2Z\" fill=\"currentColor\"></path>\n <path d=\"M9 2V3H13V7H14V2H9Z\" fill=\"currentColor\"></path>\n <path\n d=\"M14 9H13V11.5C13 12.3284 12.3284 13 11.5 13H9V14H11.5C12.8807 14 14 12.8807 14 11.5V9Z\"\n fill=\"currentColor\"\n ></path>\n <path d=\"M7 14V13H3V9H2V14H7Z\" fill=\"currentColor\"></path>\n </g>\n <path\n d=\"M13.5 9V9.5C13.5 11.7091 11.7091 13.5 9.5 13.5H9\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n <div class=\"flex justify-start items-center max-w-24\">\n <ax-number-box\n class=\"ax-sm\"\n [minValue]=\"0\"\n [changeOnScroll]=\"true\"\n [ngModel]=\"calculatedValues().radius['bottom-right']\"\n (onValueChanged)=\"\n setBorder($event.value ?? 0, 'radius', 'bottom-right')\n \"\n [showSpinButtons]=\"false\"\n ><ax-suffix>\n <ax-dropdown-button\n [text]=\"getRadiusUnitLabel('bottom-right')\"\n [look]=\"'blank'\"\n [mode]=\"'dropdown'\"\n >\n <ax-button-item-list>\n @for (u of radiusUnits; track $index) {\n <ax-button-item\n [text]=\"u.toUpperCase()\"\n [selected]=\"getRadiusUnit('bottom-right') === u\"\n (onClick)=\"onRadiusUnitChange(u, 'bottom-right')\"\n ></ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-button> </ax-suffix\n ></ax-number-box>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-between items-center py-1\">\n <span class=\"text-sm font-light\">Borders</span>\n </div>\n\n <div class=\"border-box flex justify-between items-center gap-4\">\n <div class=\"grid grid-cols-3 grid-rows-3 gap-1 flex-shrink-0\">\n <!-- Top Border -->\n <div class=\"border-box-top col-start-2 row-start-1\">\n <button\n (pointerdown)=\"handleActiveBorderSide($event)\"\n name=\"top\"\n class=\"p-1 hover:!bg-[var(--hover-effect)]\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n opacity=\"0.4\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M2 13C2 13.5523 2.44772 14 3 14H13C13.5523 14 14 13.5523 14 13V5H13V13H3V5H2V13Z\"\n fill=\"currentColor\"\n ></path>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M2 3H14V2H2V3Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </button>\n </div>\n\n <!-- Right Border -->\n <div class=\"border-box-right col-start-3 row-start-2\">\n <button\n (pointerdown)=\"handleActiveBorderSide($event)\"\n name=\"right\"\n class=\"p-1 hover:!bg-[var(--hover-effect)]\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n opacity=\"0.4\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M3 2C2.44772 2 2 2.44772 2 3L2 13C2 13.5523 2.44772 14 3 14L11 14L11 13L3 13L3 3L11 3L11 2L3 2Z\"\n fill=\"currentColor\"\n ></path>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M13 2L13 14L14 14L14 2L13 2Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </button>\n </div>\n\n <!-- Bottom Border -->\n <div class=\"border-box-bottom col-start-2 row-start-3\">\n <button\n (pointerdown)=\"handleActiveBorderSide($event)\"\n name=\"bottom\"\n class=\"p-1 hover:!bg-[var(--hover-effect)]\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n opacity=\"0.4\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M2 3C2 2.44772 2.44772 2 3 2H13C13.5523 2 14 2.44772 14 3V11H13V3H3V11H2V3Z\"\n fill=\"currentColor\"\n ></path>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M2 13H14V14H2V13Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </button>\n </div>\n\n <!-- Left Border -->\n <div class=\"border-box-left col-start-1 row-start-2\">\n <button\n (pointerdown)=\"handleActiveBorderSide($event)\"\n name=\"left\"\n class=\"p-1 hover:!bg-[var(--hover-effect)]\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n opacity=\"0.4\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M13 2C13.5523 2 14 2.44772 14 3L14 13C14 13.5523 13.5523 14 13 14L5 14L5 13L13 13L13 3L5 3L5 2L13 2Z\"\n fill=\"currentColor\"\n ></path>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M3 2L3 14L2 14L2 2L3 2Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </button>\n </div>\n\n <!-- All -->\n <div class=\"border-box-all col-start-2 row-start-2\">\n <button\n #allBorderEl\n (pointerdown)=\"handleActiveBorderSide($event)\"\n name=\"all\"\n class=\"p-1 hover:!bg-[var(--hover-effect)]\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M2 3C2 2.44772 2.44772 2 3 2H13C13.5523 2 14 2.44772 14 3V13C14 13.5523 13.5523 14 13 14H3C2.44772 14 2 13.5523 2 13V3ZM13 3L3 3V13H13V3Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n </button>\n </div>\n </div>\n <div\n class=\"grid grid-cols-[auto_1fr] items-center justify-items-center gap-x-2 gap-y-2\"\n >\n <div class=\"text-sm font-light\">Style</div>\n <ax-button-group class=\"ax-sm\" [selection]=\"'single'\">\n <ax-button-group-item\n (onClick)=\"setBorder('none', 'style', currentActiveSide())\"\n [selected]=\"shownStyle() === 'none'\"\n ><ax-prefix\n ><svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M8.70714 8.00004L12.3536 4.35359L11.6465 3.64648L8.00004 7.29293L4.35359 3.64648L3.64648 4.35359L7.29293 8.00004L3.64648 11.6465L4.35359 12.3536L8.00004 8.70714L11.6465 12.3536L12.3536 11.6465L8.70714 8.00004Z\"\n fill=\"currentColor\"\n ></path></svg></ax-prefix\n ></ax-button-group-item>\n <ax-button-group-item\n (onClick)=\"setBorder('solid', 'style', currentActiveSide())\"\n [selected]=\"shownStyle() === 'solid'\"\n ><ax-prefix\n ><svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M2 7.5H14\" stroke=\"currentColor\"></path></svg></ax-prefix\n ></ax-button-group-item>\n <ax-button-group-item\n (onClick)=\"setBorder('dashed', 'style', currentActiveSide())\"\n [selected]=\"shownStyle() === 'dashed'\"\n ><ax-prefix\n ><svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M5 7H2V8H5V7ZM11 8H12H14V7H12H11V8ZM9.5 7H6.5V8H9.5V7Z\"\n fill=\"currentColor\"\n ></path></svg></ax-prefix\n ></ax-button-group-item>\n <ax-button-group-item\n (onClick)=\"setBorder('dotted', 'style', currentActiveSide())\"\n [selected]=\"shownStyle() === 'dotted'\"\n ><ax-prefix\n ><svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M4 7H3V8H4V7ZM6 7H5V8H6V7ZM7 7H8V8H7V7ZM10 7H9V8H10V7ZM11 7H12V8H11V7ZM14 7H13V8H14V7Z\"\n fill=\"currentColor\"\n ></path></svg></ax-prefix\n ></ax-button-group-item>\n </ax-button-group>\n <div\n class=\"contents\"\n [class]=\"shownStyle() === 'none' ? 'invisible' : 'visible'\"\n >\n <div class=\"text-sm font-light\">Width</div>\n <div class=\"flex justify-start items-center max-w-36\">\n <ax-number-box\n [minValue]=\"0\"\n [changeOnScroll]=\"true\"\n [value]=\"shownWidth()\"\n (onValueChanged)=\"\n setBorder($event.value ?? 0, 'width', currentActiveSide())\n \"\n class=\"ax-sm exclude\"\n [showSpinButtons]=\"false\"\n ><ax-suffix>\n <ax-dropdown-button\n [text]=\"getWidthUnitLabel(currentActiveSide())\"\n [look]=\"'blank'\"\n [mode]=\"'dropdown'\"\n >\n <ax-button-item-list>\n @for (u of widthUnits; track $index) {\n <ax-button-item\n [text]=\"u.toUpperCase()\"\n [selected]=\"getWidthUnit(currentActiveSide()) === u\"\n (onClick)=\"onWidthUnitChange(u, currentActiveSide())\"\n ></ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-button> </ax-suffix\n ></ax-number-box>\n </div>\n\n <div class=\"text-sm font-light\">Color</div>\n <div class=\"flex justify-start items-center max-w-36 overflow-hidden\">\n <ax-color-box\n class=\"ax-sm\"\n [value]=\"shownColor()\"\n (onValueChanged)=\"\n setBorder($event.value ?? '', 'color', currentActiveSide())\n \"\n ></ax-color-box>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: ["axp-border-widget-edit{--ax-comp-range-slider-handler-size: .75rem;--focus-color: rgb(var(--ax-sys-color-primary-700));--hover-effect: rgb(var(--ax-sys-color-primary-500))}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXNumberBoxModule }, { kind: "component", type: i1$8.AXNumberBoxComponent, selector: "ax-number-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "minValue", "maxValue", "showSpinButtons", "thousandsSeparator", "decimals", "changeOnScroll", "step"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "thousandsSeparatorChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXCheckBoxModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1$1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDecoratorModule }, { 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: AXRangeSliderModule }, { kind: "component", type: i3$4.AXRangeSliderComponent, selector: "ax-range-slider", inputs: ["disabled", "readonly", "orientation", "color", "values", "mode", "min", "max", "step", "snap", "tooltipMode", "snapMode", "hasStep", "hasSnap", "hasLable", "hasTooltip"], outputs: ["valuesChange"] }, { kind: "ngmodule", type: AXButtonGroupModule }, { kind: "component", type: i1$i.AXButtonGroupComponent, selector: "ax-button-group", inputs: ["disabled", "fitParent", "color", "look", "class", "selection"], outputs: ["onBlur", "onFocus", "disabledChange", "colorChange", "lookChange", "onClick", "selectionChange", "selectedButtonChange"] }, { kind: "component", type: i1$i.AXButtonGroupItemComponent, selector: "ax-button-group-item", inputs: ["disabled", "color", "text", "class", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange", "classChange"] }, { kind: "ngmodule", type: AXColorBoxModule }, { kind: "component", type: i2$3.AXColorBoxComponent, selector: "ax-color-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "showBadge", "showValue", "showClearButton", "showIcon"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "component", type: i6.AXDropdownButtonComponent, selector: "ax-dropdown-button", inputs: ["disabled", "size", "text", "color", "look", "type", "mode"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "lookChange", "colorChange", "disabledChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
22306
21748
  }
22307
21749
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPBorderWidgetEditComponent, decorators: [{
22308
21750
  type: Component,
@@ -22803,7 +22245,7 @@ class AXPDataSourceOptionsWidgetEditComponent extends AXPValueWidgetComponent {
22803
22245
  //#region ----- Lifecycle -----
22804
22246
  #init;
22805
22247
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDataSourceOptionsWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
22806
- 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 <!-- ----- Simple list (text rows) ----- -->\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') {\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.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { 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", "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", "size", "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$7.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$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.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$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
22248
+ 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 <!-- ----- Simple list (text rows) ----- -->\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') {\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.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { 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$7.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$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.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$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
22807
22249
  }
22808
22250
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDataSourceOptionsWidgetEditComponent, decorators: [{
22809
22251
  type: Component,
@@ -22850,7 +22292,7 @@ class AXPDirectionWidgetEditComponent extends AXPValueWidgetComponent {
22850
22292
  ];
22851
22293
  }
22852
22294
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDirectionWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
22853
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPDirectionWidgetEditComponent, isStandalone: true, selector: "axp-direction-widget-editor", usesInheritance: true, ngImport: i0, template: "<div class=\"pt-2\">\n <div class=\"mt-2\">\n <ax-selection-list\n [items]=\"directionOptions\"\n [ngModel]=\"direction()\"\n (onValueChanged)=\"handleValueChanged($event)\"\n direction=\"horizontal\"\n [multiple]=\"false\"\n [showControl]=\"true\"\n look=\"card\"\n valueField=\"id\"\n textField=\"text\"\n >\n <ng-template #itemTemplate let-item>\n <div class=\"flex items-center\">\n <i [class]=\"item.icon\"></i>\n <span class=\"ml-2\">{{ item.text }}</span>\n </div>\n </ng-template>\n </ax-selection-list>\n </div>\n</div>\n", styles: ["axp-direction-widget-editor ax-selection-list>ul{flex-wrap:nowrap}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXSelectionListModule }, { kind: "component", type: i2$4.AXSelectionListComponent, selector: "ax-selection-list", inputs: ["id", "name", "disabled", "readonly", "tabIndex", "size", "value", "valueField", "textField", "disabledField", "readonlyField", "multiple", "direction", "customTemplate", "showControl", "items", "look"], outputs: ["onValueChanged", "onBlur", "onFocus"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
22295
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPDirectionWidgetEditComponent, isStandalone: true, selector: "axp-direction-widget-editor", usesInheritance: true, ngImport: i0, template: "<div class=\"pt-2\">\n <div class=\"mt-2\">\n <ax-selection-list\n [items]=\"directionOptions\"\n [ngModel]=\"direction()\"\n (onValueChanged)=\"handleValueChanged($event)\"\n direction=\"horizontal\"\n [multiple]=\"false\"\n [showControl]=\"true\"\n look=\"card\"\n valueField=\"id\"\n textField=\"text\"\n >\n <ng-template #itemTemplate let-item>\n <div class=\"flex items-center\">\n <i [class]=\"item.icon\"></i>\n <span class=\"ml-2\">{{ item.text }}</span>\n </div>\n </ng-template>\n </ax-selection-list>\n </div>\n</div>\n", styles: ["axp-direction-widget-editor ax-selection-list>ul{flex-wrap:nowrap}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ 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: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
22854
22296
  }
22855
22297
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDirectionWidgetEditComponent, decorators: [{
22856
22298
  type: Component,
@@ -23300,7 +22742,7 @@ class AXPFlexOptionsWidgetEditComponent extends AXPValueWidgetComponent {
23300
22742
  }
23301
22743
  #af;
23302
22744
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPFlexOptionsWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
23303
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPFlexOptionsWidgetEditComponent, isStandalone: true, selector: "axp-flex-options-widget-editor", usesInheritance: true, ngImport: i0, template: "<div class=\"axp-flex-option grid grid-cols-[auto_1fr] pt-2 gap-2 items-center justify-items-start\">\n <span>Direction</span>\n <div>\n <ax-button-group class=\"ax-sm\" [selection]=\"'single'\">\n <ax-button-group-item (onClick)=\"setFlexDirection('row')\" [selected]=\"flexDirection() === 'row'\"\n ><ax-prefix\n ><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12.2929 7.00004L9.14645 3.85359L9.85355 3.14648L14.2071 7.50004L9.85355 11.8536L9.14645 11.1465L12.2929 8.00004H3V7.00004H12.2929Z\"\n fill=\"currentColor\"\n ></path></svg></ax-prefix\n ></ax-button-group-item>\n <ax-button-group-item (onClick)=\"setFlexDirection('row-reverse')\" [selected]=\"flexDirection() === 'row-reverse'\"\n ><ax-prefix\n ><svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"transform: rotate(180deg)\"\n >\n <path\n d=\"M12.2929 7.00004L9.14645 3.85359L9.85355 3.14648L14.2071 7.50004L9.85355 11.8536L9.14645 11.1465L12.2929 8.00004H3V7.00004H12.2929Z\"\n fill=\"currentColor\"\n ></path></svg></ax-prefix\n ></ax-button-group-item>\n <ax-button-group-item (onClick)=\"setFlexDirection('column')\" [selected]=\"flexDirection() === 'column'\"\n ><ax-prefix\n ><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8.00001 12.2929L4.85356 9.14645L4.14645 9.85355L8.50001 14.2071L12.8536 9.85355L12.1465 9.14645L9.00001 12.2929L9.00001 3H8.00001L8.00001 12.2929Z\"\n fill=\"currentColor\"\n ></path></svg></ax-prefix\n ></ax-button-group-item>\n <ax-button-group-item\n (onClick)=\"setFlexDirection('column-reverse')\"\n [selected]=\"flexDirection() === 'column-reverse'\"\n ><ax-prefix\n ><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M9.00004 3.70721L12.1465 6.85363L12.8536 6.14652L8.50001 1.79297L4.14645 6.14652L4.85356 6.85363L8.00004 3.70715L8.00004 13.0001H9.00004L9.00004 3.70721Z\"\n fill=\"currentColor\"\n ></path></svg></ax-prefix\n ></ax-button-group-item>\n </ax-button-group>\n </div>\n <span> Wrap </span>\n <div>\n <ax-selection-list\n [items]=\"['wrap', 'nowrap']\"\n [value]=\"flexWrap()\"\n (onValueChanged)=\"setWrapMode($event.value)\"\n direction=\"horizontal\"\n [multiple]=\"false\"\n [showControl]=\"true\"\n look=\"card\"\n valueField=\"id\"\n textField=\"text\"\n >\n <ng-template #itemTemplate let-item>\n <div class=\"flex items-center\">\n <ax-icon [icon]=\"item.icon\"></ax-icon>\n <span class=\"ml-2\">{{ item.text }}</span>\n </div>\n </ng-template>\n </ax-selection-list>\n </div>\n <span>Align</span>\n <div class=\"flex justify-between gap-2 items-center\">\n <div\n class=\"relative size-[62px] bg-[rgb(30,30,30)] border border-white border-opacity-15 rounded\"\n >\n <div class=\"absolute inset-0 grid grid-cols-3 grid-rows-3\">\n @for (side of flexSides; track side.value) {\n <div\n [attr.aria-label]=\"side.label\"\n [attr.aria-value]=\"side.value\"\n class=\"grid place-content-center\"\n (mouseenter)=\"onHover(side)\"\n (mouseleave)=\"onHoverLeave()\"\n (click)=\"onClick(side)\"\n >\n @if (true) {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"7\" y=\"7\" width=\"2\" height=\"2\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.3\"></rect>\n </svg>\n }\n </div>\n }\n </div>\n <div\n class=\"absolute inset-0 flex pointer-events-none transition-all\"\n [style.justify-content]=\"hoveredJustify()\"\n [style.align-items]=\"hoveredAlign()\"\n [style.flex-direction]=\"flexDirection()\"\n >\n <div class=\"flex justify-center items-center min-w-5 min-h-5\">\n <div\n class=\"size-auto z-[1] rounded-lg bg-[rgb(30,30,30)] flex-none\"\n [class]=\"flexDirectionIsColumn() ? '-ax-rotate-90' : ''\"\n >\n @if (hoveredJustify() === 'space-between') {\n @if (clickedAlign() === 'stretch') {\n } @else if (clickedAlign() === 'baseline' && hoveredAlign() === 'flex-start') {\n } @else {\n <svg width=\"60\" height=\"20\" viewBox=\"0 0 60 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M29 6.5C29 6.22386 29.2239 6 29.5 6H30.5C30.7761 6 31 6.22386 31 6.5V15.5C31 15.7761 30.7761 16 30.5 16H29.5C29.2239 16 29 15.7761 29 15.5V6.5ZM9 8.5C9 8.22386 9.22386 8 9.5 8H10.5C10.7761 8 11 8.22386 11 8.5V12.5C11 12.7761 10.7761 13 10.5 13H9.5C9.22386 13 9 12.7761 9 12.5V8.5ZM49.5 8C49.2239 8 49 8.22386 49 8.5V14.5C49 14.7761 49.2239 15 49.5 15H50.5C50.7761 15 51 14.7761 51 14.5V8.5C51 8.22386 50.7761 8 50.5 8H49.5Z\"\n fill=\"currentColor\"\n fill-opacity=\"0.3\"\n ></path>\n </svg>\n }\n } @else if (hoveredJustify() === 'space-around') {\n @if (clickedAlign() === 'stretch') {\n } @else if (clickedAlign() === 'baseline' && hoveredAlign() === 'flex-start') {\n } @else {\n <svg width=\"60\" height=\"20\" viewBox=\"0 0 60 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"11\" y=\"9\" width=\"2\" height=\"5\" rx=\"0.5\" fill=\"currentColor\" fill-opacity=\"0.3\"></rect>\n <rect x=\"29\" y=\"6\" width=\"2\" height=\"10\" rx=\"0.5\" fill=\"currentColor\" fill-opacity=\"0.3\"></rect>\n <rect x=\"47\" y=\"8\" width=\"2\" height=\"7\" rx=\"0.5\" fill=\"currentColor\" fill-opacity=\"0.3\"></rect>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M5 13L8 11L5 9V13ZM55 9L52 11L55 13V9Z\"\n fill=\"currentColor\"\n fill-opacity=\"0.3\"\n ></path>\n </svg>\n }\n } @else if (hoveredAlign() === 'flex-start') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M3.5 7C3.22386 7 3 6.77614 3 6.5V3.5C3 3.22386 3.22386 3 3.5 3H4.5C4.77614 3 5 3.22386 5 3.5V6.5C5 6.77614 4.77614 7 4.5 7H3.5ZM7.5 13C7.22386 13 7 12.7761 7 12.5V3.5C7 3.22386 7.22386 3 7.5 3H8.5C8.77614 3 9 3.22386 9 3.5V12.5C9 12.7761 8.77614 13 8.5 13H7.5ZM11.5 3C11.2239 3 11 3.22386 11 3.5V8.5C11 8.77614 11.2239 9 11.5 9H12.5C12.7761 9 13 8.77614 13 8.5V3.5C13 3.22386 12.7761 3 12.5 3H11.5Z\"\n fill=\"currentColor\"\n fill-opacity=\"0.3\"\n ></path>\n </svg>\n } @else if (hoveredAlign() === 'center') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M7.5 13C7.22386 13 7 12.7761 7 12.5V3.5C7 3.22386 7.22386 3 7.5 3H8.5C8.77614 3 9 3.22386 9 3.5V12.5C9 12.7761 8.77614 13 8.5 13H7.5ZM3.5 10C3.22386 10 3 9.77614 3 9.5V6.5C3 6.22386 3.22386 6 3.5 6H4.5C4.77614 6 5 6.22386 5 6.5V9.5C5 9.77614 4.77614 10 4.5 10H3.5ZM11.5 5C11.2239 5 11 5.22386 11 5.5V10.5C11 10.7761 11.2239 11 11.5 11H12.5C12.7761 11 13 10.7761 13 10.5V5.5C13 5.22386 12.7761 5 12.5 5H11.5Z\"\n fill=\"currentColor\"\n fill-opacity=\"0.3\"\n ></path>\n </svg>\n } @else if (hoveredAlign() === 'flex-end') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M11.5 7C11.2239 7 11 7.22386 11 7.5L11 12.5C11 12.7761 11.2239 13 11.5 13L12.5 13C12.7761 13 13 12.7761 13 12.5L13 7.5C13 7.22386 12.7761 7 12.5 7L11.5 7ZM7.5 13C7.22386 13 7 12.7761 7 12.5L7 3.5C7 3.22386 7.22386 3 7.5 3L8.5 3C8.77614 3 9 3.22386 9 3.5L9 12.5C9 12.7761 8.77614 13 8.5 13L7.5 13ZM3.5 13C3.22386 13 3 12.7761 3 12.5L3 9.5C3 9.22386 3.22386 9 3.5 9L4.5 9C4.77614 9 5 9.22386 5 9.5L5 12.5C5 12.7761 4.77614 13 4.5 13L3.5 13Z\"\n fill=\"currentColor\"\n fill-opacity=\"0.3\"\n ></path>\n </svg>\n } @else if (hoveredAlign() === 'stretch') {\n <svg width=\"20\" height=\"60\" viewBox=\"0 0 20 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M7 53.5C7 53.7761 6.77614 54 6.5 54L5.5 54C5.22386 54 5 53.7761 5 53.5L5 6.5C5 6.22386 5.22386 6 5.5 6L6.5 6C6.77614 6 7 6.22386 7 6.5L7 53.5ZM11 53.5C11 53.7761 10.7761 54 10.5 54L9.5 54C9.22386 54 9 53.7761 9 53.5L9 6.5C9 6.22386 9.22386 6 9.5 6L10.5 6C10.7761 6 11 6.22386 11 6.5L11 53.5ZM14.5 54C14.7761 54 15 53.7761 15 53.5L15 6.5C15 6.22386 14.7761 6 14.5 6L13.5 6C13.2239 6 13 6.22386 13 6.5L13 53.5C13 53.7761 13.2239 54 13.5 54L14.5 54Z\"\n fill=\"currentColor\"\n fill-opacity=\"0.3\"\n ></path>\n </svg>\n } @else if (hoveredAlign() === 'baseline') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13 2V8.29289L14.6464 6.64645L15.3536 7.35355L12.5 10.2071L9.64645 7.35355L10.3536 6.64645L12 8.29289V2H13Z\"\n fill=\"currentColor\"\n fill-opacity=\"0.3\"\n ></path>\n <path d=\"M16 12L1 12V13L16 13V12Z\" fill=\"currentColor\"></path>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M4.62582 2H6.37412L8.72712 10H7.68476L7.09649 7.99994H3.90349L3.31524 10H2.27288L4.62582 2ZM6.80237 6.99994L5.62585 2.9999H5.37409L4.19761 6.99994H6.80237Z\"\n fill=\"currentColor\"\n fill-opacity=\"0.3\"\n ></path>\n </svg>\n }\n </div>\n </div>\n </div>\n <div\n class=\"absolute inset-0 flex pointer-events-none transition-all\"\n [style.justify-content]=\"clickedJustify()\"\n [style.align-items]=\"clickedAlign()\"\n [style.flex-direction]=\"flexDirection()\"\n >\n <div class=\"flex justify-center items-center min-w-5 min-h-5\">\n <div\n class=\"size-auto z-[2] rounded-lg bg-[rgb(30,30,30)] flex-none\"\n [class]=\"flexDirectionIsColumn() ? '-ax-rotate-90' : ''\"\n >\n @if (clickedJustify() === 'space-between') {\n @if (clickedAlign() === 'stretch') {\n <svg width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M11 53.5C11 53.7761 10.7761 54 10.5 54H9.5C9.22386 54 9 53.7761 9 53.5L9 6.5C9 6.22386 9.22386 6 9.5 6H10.5C10.7761 6 11 6.22386 11 6.5L11 53.5ZM31 53.5C31 53.7761 30.7761 54 30.5 54H29.5C29.2239 54 29 53.7761 29 53.5L29 6.5C29 6.22386 29.2239 6 29.5 6H30.5C30.7761 6 31 6.22386 31 6.5L31 53.5ZM50.5 54C50.7761 54 51 53.7761 51 53.5L51 6.5C51 6.22386 50.7761 6 50.5 6H49.5C49.2239 6 49 6.22386 49 6.5L49 53.5C49 53.7761 49.2239 54 49.5 54H50.5Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n } @else if (clickedAlign() === 'baseline') {\n <svg width=\"60\" height=\"20\" viewBox=\"0 0 60 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M50.5996 4V10.2929L52.246 8.64645L52.9531 9.35355L50.0996 12.2071L47.246 9.35355L47.9531 8.64645L49.5996 10.2929V4H50.5996Z\"\n fill=\"currentColor\"\n ></path>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M9.35294 4H11.1012L13.4542 12H12.4119L11.8236 9.99994H8.63061L8.04236 12H7L9.35294 4ZM11.5295 8.99994L10.353 4.9999H10.1012L8.92473 8.99994H11.5295Z\"\n fill=\"currentColor\"\n ></path>\n <path d=\"M6 14H54V15H6V14Z\" fill=\"currentColor\"></path>\n </svg>\n } @else {\n <svg width=\"60\" height=\"20\" viewBox=\"0 0 60 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M29 6.5C29 6.22386 29.2239 6 29.5 6H30.5C30.7761 6 31 6.22386 31 6.5V15.5C31 15.7761 30.7761 16 30.5 16H29.5C29.2239 16 29 15.7761 29 15.5V6.5ZM9 8.5C9 8.22386 9.22386 8 9.5 8H10.5C10.7761 8 11 8.22386 11 8.5V12.5C11 12.7761 10.7761 13 10.5 13H9.5C9.22386 13 9 12.7761 9 12.5V8.5ZM49.5 8C49.2239 8 49 8.22386 49 8.5V14.5C49 14.7761 49.2239 15 49.5 15H50.5C50.7761 15 51 14.7761 51 14.5V8.5C51 8.22386 50.7761 8 50.5 8H49.5Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n }\n } @else if (clickedJustify() === 'space-around') {\n @if (clickedAlign() === 'stretch') {\n <svg width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 30L5 32L5 28L8 30Z\" fill=\"currentColor\"></path>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M13 53.5C13 53.7761 12.7761 54 12.5 54H11.5C11.2239 54 11 53.7761 11 53.5L11 6.5C11 6.22386 11.2239 6 11.5 6H12.5C12.7761 6 13 6.22386 13 6.5L13 53.5ZM31 53.5C31 53.7761 30.7761 54 30.5 54H29.5C29.2239 54 29 53.7761 29 53.5L29 6.5C29 6.22386 29.2239 6 29.5 6H30.5C30.7761 6 31 6.22386 31 6.5L31 53.5ZM48.5 54C48.7761 54 49 53.7761 49 53.5L49 6.5C49 6.22386 48.7761 6 48.5 6H47.5C47.2239 6 47 6.22386 47 6.5L47 53.5C47 53.7761 47.2239 54 47.5 54H48.5Z\"\n fill=\"currentColor\"\n ></path>\n <path d=\"M52 30L55 28L55 32L52 30Z\" fill=\"currentColor\"></path>\n </svg>\n } @else if (clickedAlign() === 'baseline') {\n <svg\n data-wf-icon=\"NineBoxAlignItemsRowSpaceAroundBaselineIcon\"\n width=\"60\"\n height=\"20\"\n viewBox=\"0 0 60 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M40.8529 4V10.2929L42.4993 8.64645L43.2064 9.35355L40.3529 12.2071L37.4993 9.35355L38.2064 8.64645L39.8529 10.2929V4H40.8529Z\"\n fill=\"currentColor\"\n ></path>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M19.3523 4H21.1006L23.4536 12H22.4112L21.8229 9.99994H18.6299L18.0417 12H16.9993L19.3523 4ZM21.5288 8.99994L20.3523 4.9999H20.1005L18.924 8.99994H21.5288Z\"\n fill=\"currentColor\"\n ></path>\n <path d=\"M6 14H54V15H6V14Z\" fill=\"currentColor\"></path>\n </svg>\n } @else {\n <svg width=\"60\" height=\"20\" viewBox=\"0 0 60 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"11\" y=\"9\" width=\"2\" height=\"5\" rx=\"0.5\" fill=\"currentColor\"></rect>\n <rect x=\"29\" y=\"6\" width=\"2\" height=\"10\" rx=\"0.5\" fill=\"currentColor\"></rect>\n <rect x=\"47\" y=\"8\" width=\"2\" height=\"7\" rx=\"0.5\" fill=\"currentColor\"></rect>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M5 13L8 11L5 9V13ZM55 9L52 11L55 13V9Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n }\n } @else if (clickedAlign() === 'flex-start') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M3.5 7C3.22386 7 3 6.77614 3 6.5V3.5C3 3.22386 3.22386 3 3.5 3H4.5C4.77614 3 5 3.22386 5 3.5V6.5C5 6.77614 4.77614 7 4.5 7H3.5ZM7.5 13C7.22386 13 7 12.7761 7 12.5V3.5C7 3.22386 7.22386 3 7.5 3H8.5C8.77614 3 9 3.22386 9 3.5V12.5C9 12.7761 8.77614 13 8.5 13H7.5ZM11.5 3C11.2239 3 11 3.22386 11 3.5V8.5C11 8.77614 11.2239 9 11.5 9H12.5C12.7761 9 13 8.77614 13 8.5V3.5C13 3.22386 12.7761 3 12.5 3H11.5Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n } @else if (clickedAlign() === 'center') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M7.5 13C7.22386 13 7 12.7761 7 12.5V3.5C7 3.22386 7.22386 3 7.5 3H8.5C8.77614 3 9 3.22386 9 3.5V12.5C9 12.7761 8.77614 13 8.5 13H7.5ZM3.5 10C3.22386 10 3 9.77614 3 9.5V6.5C3 6.22386 3.22386 6 3.5 6H4.5C4.77614 6 5 6.22386 5 6.5V9.5C5 9.77614 4.77614 10 4.5 10H3.5ZM11.5 5C11.2239 5 11 5.22386 11 5.5V10.5C11 10.7761 11.2239 11 11.5 11H12.5C12.7761 11 13 10.7761 13 10.5V5.5C13 5.22386 12.7761 5 12.5 5H11.5Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n } @else if (clickedAlign() === 'flex-end') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M11.5 7C11.2239 7 11 7.22386 11 7.5L11 12.5C11 12.7761 11.2239 13 11.5 13L12.5 13C12.7761 13 13 12.7761 13 12.5L13 7.5C13 7.22386 12.7761 7 12.5 7L11.5 7ZM7.5 13C7.22386 13 7 12.7761 7 12.5L7 3.5C7 3.22386 7.22386 3 7.5 3L8.5 3C8.77614 3 9 3.22386 9 3.5L9 12.5C9 12.7761 8.77614 13 8.5 13L7.5 13ZM3.5 13C3.22386 13 3 12.7761 3 12.5L3 9.5C3 9.22386 3.22386 9 3.5 9L4.5 9C4.77614 9 5 9.22386 5 9.5L5 12.5C5 12.7761 4.77614 13 4.5 13L3.5 13Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n } @else if (clickedAlign() === 'stretch') {\n <svg width=\"20\" height=\"60\" viewBox=\"0 0 20 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M7 53.5C7 53.7761 6.77614 54 6.5 54L5.5 54C5.22386 54 5 53.7761 5 53.5L5 6.5C5 6.22386 5.22386 6 5.5 6L6.5 6C6.77614 6 7 6.22386 7 6.5L7 53.5ZM11 53.5C11 53.7761 10.7761 54 10.5 54L9.5 54C9.22386 54 9 53.7761 9 53.5L9 6.5C9 6.22386 9.22386 6 9.5 6L10.5 6C10.7761 6 11 6.22386 11 6.5L11 53.5ZM14.5 54C14.7761 54 15 53.7761 15 53.5L15 6.5C15 6.22386 14.7761 6 14.5 6L13.5 6C13.2239 6 13 6.22386 13 6.5L13 53.5C13 53.7761 13.2239 54 13.5 54L14.5 54Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n } @else if (clickedAlign() === 'baseline') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13 2V8.29289L14.6464 6.64645L15.3536 7.35355L12.5 10.2071L9.64645 7.35355L10.3536 6.64645L12 8.29289V2H13Z\"\n fill=\"currentColor\"\n ></path>\n <path d=\"M16 12L1 12V13L16 13V12Z\" fill=\"currentColor\"></path>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M4.62582 2H6.37412L8.72712 10H7.68476L7.09649 7.99994H3.90349L3.31524 10H2.27288L4.62582 2ZM6.80237 6.99994L5.62585 2.9999H5.37409L4.19761 6.99994H6.80237Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n }\n </div>\n </div>\n </div>\n </div>\n <div class=\"grid grid-cols-[auto_1fr] items-center justify-items-start gap-2\">\n <span class=\"order-1\">X:</span>\n <div class=\"max-w-28\" [style.order]=\"flexDirectionIsColumn() ? '4' : '2'\">\n <!-- removed legacy ax-select-box align/justify picker -->\n <ax-lookup\n mode=\"drop-down-list\"\n class=\"ax-sm\"\n [dataSource]=\"justifyDataSource\"\n [(ngModel)]=\"selectedJustify\"\n (onValueChanged)=\"onJustifyChange($event)\"\n textField=\"label\"\n valueField=\"value\"\n [searchable]=\"false\"\n placeholder=\"Choose...\"\n >\n </ax-lookup>\n </div>\n <span class=\"order-3\">Y:</span>\n <div class=\"max-w-28\" [style.order]=\"flexDirectionIsColumn() ? '2' : '4'\">\n <ax-lookup\n mode=\"drop-down-list\"\n class=\"ax-sm\"\n [dataSource]=\"alignDataSource\"\n [(ngModel)]=\"selectedAlign\"\n (onValueChanged)=\"onAlignChange($event)\"\n textField=\"label\"\n valueField=\"value\"\n [searchable]=\"false\"\n placeholder=\"Choose...\"\n >\n </ax-lookup>\n </div>\n </div>\n </div>\n <span>Gap</span>\n <div class=\"flex gap-2 justify-between items-center\">\n @if (gapMode() === 'both') {\n <ax-range-slider\n class=\"w-32\"\n [ngModel]=\"gap().both\"\n (ngModelChange)=\"setGap($event ?? 0, 'both')\"\n ></ax-range-slider>\n <ax-number-box\n [minValue]=\"0\"\n [maxValue]=\"999\"\n [value]=\"gap().both\"\n [changeOnScroll]=\"true\"\n (onValueChanged)=\"setGap($event.value ?? 0, 'both')\"\n class=\"ax-sm max-w-[5.5rem]\"\n [showSpinButtons]=\"false\"\n ><ax-suffix><ax-text class=\"text-xs! px-1!\">PX</ax-text></ax-suffix></ax-number-box\n >\n } @else {\n <div class=\"flex items-center gap-2 h-12\">\n <span class=\"text-xs\"\n ><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12.2929 7.00004L9.14645 3.85359L9.85355 3.14648L14.2071 7.50004L9.85355 11.8536L9.14645 11.1465L12.2929 8.00004H3V7.00004H12.2929Z\"\n fill=\"currentColor\"\n ></path></svg ></span>\n <ax-number-box\n [minValue]=\"0\"\n [maxValue]=\"999\"\n [value]=\"gap().x\"\n [changeOnScroll]=\"true\"\n (onValueChanged)=\"setGap($event.value ?? 0, 'x')\"\n class=\"ax-sm min-w-5\"\n [showSpinButtons]=\"false\"\n ><ax-suffix><ax-text class=\"text-xs! px-1!\">PX</ax-text></ax-suffix></ax-number-box\n >\n <span class=\"text-xs\"\n ><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8.00001 12.2929L4.85356 9.14645L4.14645 9.85355L8.50001 14.2071L12.8536 9.85355L12.1465 9.14645L9.00001 12.2929L9.00001 3H8.00001L8.00001 12.2929Z\"\n fill=\"currentColor\"\n ></path></svg></span>\n <ax-number-box\n [minValue]=\"0\"\n [maxValue]=\"999\"\n [value]=\"gap().y\"\n [changeOnScroll]=\"true\"\n (onValueChanged)=\"setGap($event.value ?? 0, 'y')\"\n class=\"ax-sm min-w-5\"\n [showSpinButtons]=\"false\"\n ><ax-suffix><ax-text class=\"text-xs! px-1!\">PX</ax-text></ax-suffix></ax-number-box\n >\n </div>\n }\n <button (click)=\"setGapMode()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n @if (gapMode() === 'both') {\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M5 7L5 5C5 3.34315 6.34315 2 8 2C9.65685 2 11 3.34315 11 5V7C11.5523 7 12 7.44772 12 8V12C12 12.5523 11.5523 13 11 13H5C4.44772 13 4 12.5523 4 12V8C4 7.44771 4.44772 7 5 7ZM6 5C6 3.89543 6.89543 3 8 3C9.10457 3 10 3.89543 10 5V7H6V5ZM5 12V8H11V12H5Z\"\n fill=\"currentColor\"\n ></path>\n } @else {\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M9 5C9 3.89543 9.89543 3 11 3C12.1046 3 13 3.89543 13 5V6H14V5C14 3.34315 12.6569 2 11 2C9.34315 2 8 3.34315 8 5V7H3C2.44772 7 2 7.44771 2 8V12C2 12.5523 2.44772 13 3 13H9C9.55228 13 10 12.5523 10 12V8C10 7.44772 9.55228 7 9 7V5ZM3 8H9V12H3V8Z\"\n fill=\"currentColor\"\n ></path>\n }\n </svg>\n </button>\n </div>\n <!-- <span>Items</span>\n <div>\n <ax-number-box\n [minValue]=\"0\"\n [maxValue]=\"12\"\n [ngModel]=\"itemsCount()\"\n (ngModelChange)=\"setItemsCount($event ?? 0)\"\n class=\"w-32\"\n ></ax-number-box>\n </div> -->\n</div>\n", styles: [":host{--ax-comp-range-slider-handler-size: .75rem}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXButtonGroupModule }, { kind: "component", type: i1$k.AXButtonGroupComponent, selector: "ax-button-group", inputs: ["disabled", "fitParent", "color", "look", "class", "selection"], outputs: ["onBlur", "onFocus", "disabledChange", "colorChange", "lookChange", "onClick", "selectionChange", "selectedButtonChange"] }, { kind: "component", type: i1$k.AXButtonGroupItemComponent, selector: "ax-button-group-item", inputs: ["disabled", "color", "text", "class", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange", "classChange"] }, { 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: "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", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXRangeSliderModule }, { kind: "component", type: i3$4.AXRangeSliderComponent, selector: "ax-range-slider", inputs: ["disabled", "readonly", "orientation", "color", "values", "mode", "min", "max", "step", "snap", "tooltipMode", "snapMode", "hasStep", "hasSnap", "hasLable", "hasTooltip"], outputs: ["valuesChange"] }, { kind: "ngmodule", type: AXNumberBoxModule }, { kind: "component", type: i1$8.AXNumberBoxComponent, selector: "ax-number-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "minValue", "maxValue", "showSpinButtons", "thousandsSeparator", "decimals", "changeOnScroll", "step"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "thousandsSeparatorChange"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXSelectionListModule }, { kind: "component", type: i2$4.AXSelectionListComponent, selector: "ax-selection-list", inputs: ["id", "name", "disabled", "readonly", "tabIndex", "size", "value", "valueField", "textField", "disabledField", "readonlyField", "multiple", "direction", "customTemplate", "showControl", "items", "look"], outputs: ["onValueChanged", "onBlur", "onFocus"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
22745
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPFlexOptionsWidgetEditComponent, isStandalone: true, selector: "axp-flex-options-widget-editor", usesInheritance: true, ngImport: i0, template: "<div class=\"axp-flex-option grid grid-cols-[auto_1fr] pt-2 gap-2 items-center justify-items-start\">\n <span>Direction</span>\n <div>\n <ax-button-group class=\"ax-sm\" [selection]=\"'single'\">\n <ax-button-group-item (onClick)=\"setFlexDirection('row')\" [selected]=\"flexDirection() === 'row'\"\n ><ax-prefix\n ><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12.2929 7.00004L9.14645 3.85359L9.85355 3.14648L14.2071 7.50004L9.85355 11.8536L9.14645 11.1465L12.2929 8.00004H3V7.00004H12.2929Z\"\n fill=\"currentColor\"\n ></path></svg></ax-prefix\n ></ax-button-group-item>\n <ax-button-group-item (onClick)=\"setFlexDirection('row-reverse')\" [selected]=\"flexDirection() === 'row-reverse'\"\n ><ax-prefix\n ><svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style=\"transform: rotate(180deg)\"\n >\n <path\n d=\"M12.2929 7.00004L9.14645 3.85359L9.85355 3.14648L14.2071 7.50004L9.85355 11.8536L9.14645 11.1465L12.2929 8.00004H3V7.00004H12.2929Z\"\n fill=\"currentColor\"\n ></path></svg></ax-prefix\n ></ax-button-group-item>\n <ax-button-group-item (onClick)=\"setFlexDirection('column')\" [selected]=\"flexDirection() === 'column'\"\n ><ax-prefix\n ><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8.00001 12.2929L4.85356 9.14645L4.14645 9.85355L8.50001 14.2071L12.8536 9.85355L12.1465 9.14645L9.00001 12.2929L9.00001 3H8.00001L8.00001 12.2929Z\"\n fill=\"currentColor\"\n ></path></svg></ax-prefix\n ></ax-button-group-item>\n <ax-button-group-item\n (onClick)=\"setFlexDirection('column-reverse')\"\n [selected]=\"flexDirection() === 'column-reverse'\"\n ><ax-prefix\n ><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M9.00004 3.70721L12.1465 6.85363L12.8536 6.14652L8.50001 1.79297L4.14645 6.14652L4.85356 6.85363L8.00004 3.70715L8.00004 13.0001H9.00004L9.00004 3.70721Z\"\n fill=\"currentColor\"\n ></path></svg></ax-prefix\n ></ax-button-group-item>\n </ax-button-group>\n </div>\n <span> Wrap </span>\n <div>\n <ax-selection-list\n [items]=\"['wrap', 'nowrap']\"\n [value]=\"flexWrap()\"\n (onValueChanged)=\"setWrapMode($event.value)\"\n direction=\"horizontal\"\n [multiple]=\"false\"\n [showControl]=\"true\"\n look=\"card\"\n valueField=\"id\"\n textField=\"text\"\n >\n <ng-template #itemTemplate let-item>\n <div class=\"flex items-center\">\n <ax-icon [icon]=\"item.icon\"></ax-icon>\n <span class=\"ml-2\">{{ item.text }}</span>\n </div>\n </ng-template>\n </ax-selection-list>\n </div>\n <span>Align</span>\n <div class=\"flex justify-between gap-2 items-center\">\n <div\n class=\"relative size-[62px] bg-[rgb(30,30,30)] border border-white border-opacity-15 rounded\"\n >\n <div class=\"absolute inset-0 grid grid-cols-3 grid-rows-3\">\n @for (side of flexSides; track side.value) {\n <div\n [attr.aria-label]=\"side.label\"\n [attr.aria-value]=\"side.value\"\n class=\"grid place-content-center\"\n (mouseenter)=\"onHover(side)\"\n (mouseleave)=\"onHoverLeave()\"\n (click)=\"onClick(side)\"\n >\n @if (true) {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"7\" y=\"7\" width=\"2\" height=\"2\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.3\"></rect>\n </svg>\n }\n </div>\n }\n </div>\n <div\n class=\"absolute inset-0 flex pointer-events-none transition-all\"\n [style.justify-content]=\"hoveredJustify()\"\n [style.align-items]=\"hoveredAlign()\"\n [style.flex-direction]=\"flexDirection()\"\n >\n <div class=\"flex justify-center items-center min-w-5 min-h-5\">\n <div\n class=\"size-auto z-[1] rounded-lg bg-[rgb(30,30,30)] flex-none\"\n [class]=\"flexDirectionIsColumn() ? '-ax-rotate-90' : ''\"\n >\n @if (hoveredJustify() === 'space-between') {\n @if (clickedAlign() === 'stretch') {\n } @else if (clickedAlign() === 'baseline' && hoveredAlign() === 'flex-start') {\n } @else {\n <svg width=\"60\" height=\"20\" viewBox=\"0 0 60 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M29 6.5C29 6.22386 29.2239 6 29.5 6H30.5C30.7761 6 31 6.22386 31 6.5V15.5C31 15.7761 30.7761 16 30.5 16H29.5C29.2239 16 29 15.7761 29 15.5V6.5ZM9 8.5C9 8.22386 9.22386 8 9.5 8H10.5C10.7761 8 11 8.22386 11 8.5V12.5C11 12.7761 10.7761 13 10.5 13H9.5C9.22386 13 9 12.7761 9 12.5V8.5ZM49.5 8C49.2239 8 49 8.22386 49 8.5V14.5C49 14.7761 49.2239 15 49.5 15H50.5C50.7761 15 51 14.7761 51 14.5V8.5C51 8.22386 50.7761 8 50.5 8H49.5Z\"\n fill=\"currentColor\"\n fill-opacity=\"0.3\"\n ></path>\n </svg>\n }\n } @else if (hoveredJustify() === 'space-around') {\n @if (clickedAlign() === 'stretch') {\n } @else if (clickedAlign() === 'baseline' && hoveredAlign() === 'flex-start') {\n } @else {\n <svg width=\"60\" height=\"20\" viewBox=\"0 0 60 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"11\" y=\"9\" width=\"2\" height=\"5\" rx=\"0.5\" fill=\"currentColor\" fill-opacity=\"0.3\"></rect>\n <rect x=\"29\" y=\"6\" width=\"2\" height=\"10\" rx=\"0.5\" fill=\"currentColor\" fill-opacity=\"0.3\"></rect>\n <rect x=\"47\" y=\"8\" width=\"2\" height=\"7\" rx=\"0.5\" fill=\"currentColor\" fill-opacity=\"0.3\"></rect>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M5 13L8 11L5 9V13ZM55 9L52 11L55 13V9Z\"\n fill=\"currentColor\"\n fill-opacity=\"0.3\"\n ></path>\n </svg>\n }\n } @else if (hoveredAlign() === 'flex-start') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M3.5 7C3.22386 7 3 6.77614 3 6.5V3.5C3 3.22386 3.22386 3 3.5 3H4.5C4.77614 3 5 3.22386 5 3.5V6.5C5 6.77614 4.77614 7 4.5 7H3.5ZM7.5 13C7.22386 13 7 12.7761 7 12.5V3.5C7 3.22386 7.22386 3 7.5 3H8.5C8.77614 3 9 3.22386 9 3.5V12.5C9 12.7761 8.77614 13 8.5 13H7.5ZM11.5 3C11.2239 3 11 3.22386 11 3.5V8.5C11 8.77614 11.2239 9 11.5 9H12.5C12.7761 9 13 8.77614 13 8.5V3.5C13 3.22386 12.7761 3 12.5 3H11.5Z\"\n fill=\"currentColor\"\n fill-opacity=\"0.3\"\n ></path>\n </svg>\n } @else if (hoveredAlign() === 'center') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M7.5 13C7.22386 13 7 12.7761 7 12.5V3.5C7 3.22386 7.22386 3 7.5 3H8.5C8.77614 3 9 3.22386 9 3.5V12.5C9 12.7761 8.77614 13 8.5 13H7.5ZM3.5 10C3.22386 10 3 9.77614 3 9.5V6.5C3 6.22386 3.22386 6 3.5 6H4.5C4.77614 6 5 6.22386 5 6.5V9.5C5 9.77614 4.77614 10 4.5 10H3.5ZM11.5 5C11.2239 5 11 5.22386 11 5.5V10.5C11 10.7761 11.2239 11 11.5 11H12.5C12.7761 11 13 10.7761 13 10.5V5.5C13 5.22386 12.7761 5 12.5 5H11.5Z\"\n fill=\"currentColor\"\n fill-opacity=\"0.3\"\n ></path>\n </svg>\n } @else if (hoveredAlign() === 'flex-end') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M11.5 7C11.2239 7 11 7.22386 11 7.5L11 12.5C11 12.7761 11.2239 13 11.5 13L12.5 13C12.7761 13 13 12.7761 13 12.5L13 7.5C13 7.22386 12.7761 7 12.5 7L11.5 7ZM7.5 13C7.22386 13 7 12.7761 7 12.5L7 3.5C7 3.22386 7.22386 3 7.5 3L8.5 3C8.77614 3 9 3.22386 9 3.5L9 12.5C9 12.7761 8.77614 13 8.5 13L7.5 13ZM3.5 13C3.22386 13 3 12.7761 3 12.5L3 9.5C3 9.22386 3.22386 9 3.5 9L4.5 9C4.77614 9 5 9.22386 5 9.5L5 12.5C5 12.7761 4.77614 13 4.5 13L3.5 13Z\"\n fill=\"currentColor\"\n fill-opacity=\"0.3\"\n ></path>\n </svg>\n } @else if (hoveredAlign() === 'stretch') {\n <svg width=\"20\" height=\"60\" viewBox=\"0 0 20 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M7 53.5C7 53.7761 6.77614 54 6.5 54L5.5 54C5.22386 54 5 53.7761 5 53.5L5 6.5C5 6.22386 5.22386 6 5.5 6L6.5 6C6.77614 6 7 6.22386 7 6.5L7 53.5ZM11 53.5C11 53.7761 10.7761 54 10.5 54L9.5 54C9.22386 54 9 53.7761 9 53.5L9 6.5C9 6.22386 9.22386 6 9.5 6L10.5 6C10.7761 6 11 6.22386 11 6.5L11 53.5ZM14.5 54C14.7761 54 15 53.7761 15 53.5L15 6.5C15 6.22386 14.7761 6 14.5 6L13.5 6C13.2239 6 13 6.22386 13 6.5L13 53.5C13 53.7761 13.2239 54 13.5 54L14.5 54Z\"\n fill=\"currentColor\"\n fill-opacity=\"0.3\"\n ></path>\n </svg>\n } @else if (hoveredAlign() === 'baseline') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13 2V8.29289L14.6464 6.64645L15.3536 7.35355L12.5 10.2071L9.64645 7.35355L10.3536 6.64645L12 8.29289V2H13Z\"\n fill=\"currentColor\"\n fill-opacity=\"0.3\"\n ></path>\n <path d=\"M16 12L1 12V13L16 13V12Z\" fill=\"currentColor\"></path>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M4.62582 2H6.37412L8.72712 10H7.68476L7.09649 7.99994H3.90349L3.31524 10H2.27288L4.62582 2ZM6.80237 6.99994L5.62585 2.9999H5.37409L4.19761 6.99994H6.80237Z\"\n fill=\"currentColor\"\n fill-opacity=\"0.3\"\n ></path>\n </svg>\n }\n </div>\n </div>\n </div>\n <div\n class=\"absolute inset-0 flex pointer-events-none transition-all\"\n [style.justify-content]=\"clickedJustify()\"\n [style.align-items]=\"clickedAlign()\"\n [style.flex-direction]=\"flexDirection()\"\n >\n <div class=\"flex justify-center items-center min-w-5 min-h-5\">\n <div\n class=\"size-auto z-[2] rounded-lg bg-[rgb(30,30,30)] flex-none\"\n [class]=\"flexDirectionIsColumn() ? '-ax-rotate-90' : ''\"\n >\n @if (clickedJustify() === 'space-between') {\n @if (clickedAlign() === 'stretch') {\n <svg width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M11 53.5C11 53.7761 10.7761 54 10.5 54H9.5C9.22386 54 9 53.7761 9 53.5L9 6.5C9 6.22386 9.22386 6 9.5 6H10.5C10.7761 6 11 6.22386 11 6.5L11 53.5ZM31 53.5C31 53.7761 30.7761 54 30.5 54H29.5C29.2239 54 29 53.7761 29 53.5L29 6.5C29 6.22386 29.2239 6 29.5 6H30.5C30.7761 6 31 6.22386 31 6.5L31 53.5ZM50.5 54C50.7761 54 51 53.7761 51 53.5L51 6.5C51 6.22386 50.7761 6 50.5 6H49.5C49.2239 6 49 6.22386 49 6.5L49 53.5C49 53.7761 49.2239 54 49.5 54H50.5Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n } @else if (clickedAlign() === 'baseline') {\n <svg width=\"60\" height=\"20\" viewBox=\"0 0 60 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M50.5996 4V10.2929L52.246 8.64645L52.9531 9.35355L50.0996 12.2071L47.246 9.35355L47.9531 8.64645L49.5996 10.2929V4H50.5996Z\"\n fill=\"currentColor\"\n ></path>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M9.35294 4H11.1012L13.4542 12H12.4119L11.8236 9.99994H8.63061L8.04236 12H7L9.35294 4ZM11.5295 8.99994L10.353 4.9999H10.1012L8.92473 8.99994H11.5295Z\"\n fill=\"currentColor\"\n ></path>\n <path d=\"M6 14H54V15H6V14Z\" fill=\"currentColor\"></path>\n </svg>\n } @else {\n <svg width=\"60\" height=\"20\" viewBox=\"0 0 60 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M29 6.5C29 6.22386 29.2239 6 29.5 6H30.5C30.7761 6 31 6.22386 31 6.5V15.5C31 15.7761 30.7761 16 30.5 16H29.5C29.2239 16 29 15.7761 29 15.5V6.5ZM9 8.5C9 8.22386 9.22386 8 9.5 8H10.5C10.7761 8 11 8.22386 11 8.5V12.5C11 12.7761 10.7761 13 10.5 13H9.5C9.22386 13 9 12.7761 9 12.5V8.5ZM49.5 8C49.2239 8 49 8.22386 49 8.5V14.5C49 14.7761 49.2239 15 49.5 15H50.5C50.7761 15 51 14.7761 51 14.5V8.5C51 8.22386 50.7761 8 50.5 8H49.5Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n }\n } @else if (clickedJustify() === 'space-around') {\n @if (clickedAlign() === 'stretch') {\n <svg width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 30L5 32L5 28L8 30Z\" fill=\"currentColor\"></path>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M13 53.5C13 53.7761 12.7761 54 12.5 54H11.5C11.2239 54 11 53.7761 11 53.5L11 6.5C11 6.22386 11.2239 6 11.5 6H12.5C12.7761 6 13 6.22386 13 6.5L13 53.5ZM31 53.5C31 53.7761 30.7761 54 30.5 54H29.5C29.2239 54 29 53.7761 29 53.5L29 6.5C29 6.22386 29.2239 6 29.5 6H30.5C30.7761 6 31 6.22386 31 6.5L31 53.5ZM48.5 54C48.7761 54 49 53.7761 49 53.5L49 6.5C49 6.22386 48.7761 6 48.5 6H47.5C47.2239 6 47 6.22386 47 6.5L47 53.5C47 53.7761 47.2239 54 47.5 54H48.5Z\"\n fill=\"currentColor\"\n ></path>\n <path d=\"M52 30L55 28L55 32L52 30Z\" fill=\"currentColor\"></path>\n </svg>\n } @else if (clickedAlign() === 'baseline') {\n <svg\n data-wf-icon=\"NineBoxAlignItemsRowSpaceAroundBaselineIcon\"\n width=\"60\"\n height=\"20\"\n viewBox=\"0 0 60 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M40.8529 4V10.2929L42.4993 8.64645L43.2064 9.35355L40.3529 12.2071L37.4993 9.35355L38.2064 8.64645L39.8529 10.2929V4H40.8529Z\"\n fill=\"currentColor\"\n ></path>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M19.3523 4H21.1006L23.4536 12H22.4112L21.8229 9.99994H18.6299L18.0417 12H16.9993L19.3523 4ZM21.5288 8.99994L20.3523 4.9999H20.1005L18.924 8.99994H21.5288Z\"\n fill=\"currentColor\"\n ></path>\n <path d=\"M6 14H54V15H6V14Z\" fill=\"currentColor\"></path>\n </svg>\n } @else {\n <svg width=\"60\" height=\"20\" viewBox=\"0 0 60 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"11\" y=\"9\" width=\"2\" height=\"5\" rx=\"0.5\" fill=\"currentColor\"></rect>\n <rect x=\"29\" y=\"6\" width=\"2\" height=\"10\" rx=\"0.5\" fill=\"currentColor\"></rect>\n <rect x=\"47\" y=\"8\" width=\"2\" height=\"7\" rx=\"0.5\" fill=\"currentColor\"></rect>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M5 13L8 11L5 9V13ZM55 9L52 11L55 13V9Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n }\n } @else if (clickedAlign() === 'flex-start') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M3.5 7C3.22386 7 3 6.77614 3 6.5V3.5C3 3.22386 3.22386 3 3.5 3H4.5C4.77614 3 5 3.22386 5 3.5V6.5C5 6.77614 4.77614 7 4.5 7H3.5ZM7.5 13C7.22386 13 7 12.7761 7 12.5V3.5C7 3.22386 7.22386 3 7.5 3H8.5C8.77614 3 9 3.22386 9 3.5V12.5C9 12.7761 8.77614 13 8.5 13H7.5ZM11.5 3C11.2239 3 11 3.22386 11 3.5V8.5C11 8.77614 11.2239 9 11.5 9H12.5C12.7761 9 13 8.77614 13 8.5V3.5C13 3.22386 12.7761 3 12.5 3H11.5Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n } @else if (clickedAlign() === 'center') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M7.5 13C7.22386 13 7 12.7761 7 12.5V3.5C7 3.22386 7.22386 3 7.5 3H8.5C8.77614 3 9 3.22386 9 3.5V12.5C9 12.7761 8.77614 13 8.5 13H7.5ZM3.5 10C3.22386 10 3 9.77614 3 9.5V6.5C3 6.22386 3.22386 6 3.5 6H4.5C4.77614 6 5 6.22386 5 6.5V9.5C5 9.77614 4.77614 10 4.5 10H3.5ZM11.5 5C11.2239 5 11 5.22386 11 5.5V10.5C11 10.7761 11.2239 11 11.5 11H12.5C12.7761 11 13 10.7761 13 10.5V5.5C13 5.22386 12.7761 5 12.5 5H11.5Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n } @else if (clickedAlign() === 'flex-end') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M11.5 7C11.2239 7 11 7.22386 11 7.5L11 12.5C11 12.7761 11.2239 13 11.5 13L12.5 13C12.7761 13 13 12.7761 13 12.5L13 7.5C13 7.22386 12.7761 7 12.5 7L11.5 7ZM7.5 13C7.22386 13 7 12.7761 7 12.5L7 3.5C7 3.22386 7.22386 3 7.5 3L8.5 3C8.77614 3 9 3.22386 9 3.5L9 12.5C9 12.7761 8.77614 13 8.5 13L7.5 13ZM3.5 13C3.22386 13 3 12.7761 3 12.5L3 9.5C3 9.22386 3.22386 9 3.5 9L4.5 9C4.77614 9 5 9.22386 5 9.5L5 12.5C5 12.7761 4.77614 13 4.5 13L3.5 13Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n } @else if (clickedAlign() === 'stretch') {\n <svg width=\"20\" height=\"60\" viewBox=\"0 0 20 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M7 53.5C7 53.7761 6.77614 54 6.5 54L5.5 54C5.22386 54 5 53.7761 5 53.5L5 6.5C5 6.22386 5.22386 6 5.5 6L6.5 6C6.77614 6 7 6.22386 7 6.5L7 53.5ZM11 53.5C11 53.7761 10.7761 54 10.5 54L9.5 54C9.22386 54 9 53.7761 9 53.5L9 6.5C9 6.22386 9.22386 6 9.5 6L10.5 6C10.7761 6 11 6.22386 11 6.5L11 53.5ZM14.5 54C14.7761 54 15 53.7761 15 53.5L15 6.5C15 6.22386 14.7761 6 14.5 6L13.5 6C13.2239 6 13 6.22386 13 6.5L13 53.5C13 53.7761 13.2239 54 13.5 54L14.5 54Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n } @else if (clickedAlign() === 'baseline') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13 2V8.29289L14.6464 6.64645L15.3536 7.35355L12.5 10.2071L9.64645 7.35355L10.3536 6.64645L12 8.29289V2H13Z\"\n fill=\"currentColor\"\n ></path>\n <path d=\"M16 12L1 12V13L16 13V12Z\" fill=\"currentColor\"></path>\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M4.62582 2H6.37412L8.72712 10H7.68476L7.09649 7.99994H3.90349L3.31524 10H2.27288L4.62582 2ZM6.80237 6.99994L5.62585 2.9999H5.37409L4.19761 6.99994H6.80237Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n }\n </div>\n </div>\n </div>\n </div>\n <div class=\"grid grid-cols-[auto_1fr] items-center justify-items-start gap-2\">\n <span class=\"order-1\">X:</span>\n <div class=\"max-w-28\" [style.order]=\"flexDirectionIsColumn() ? '4' : '2'\">\n <!-- removed legacy ax-select-box align/justify picker -->\n <ax-lookup\n mode=\"drop-down-list\"\n class=\"ax-sm\"\n [dataSource]=\"justifyDataSource\"\n [(ngModel)]=\"selectedJustify\"\n (onValueChanged)=\"onJustifyChange($event)\"\n textField=\"label\"\n valueField=\"value\"\n [searchable]=\"false\"\n placeholder=\"Choose...\"\n >\n </ax-lookup>\n </div>\n <span class=\"order-3\">Y:</span>\n <div class=\"max-w-28\" [style.order]=\"flexDirectionIsColumn() ? '2' : '4'\">\n <ax-lookup\n mode=\"drop-down-list\"\n class=\"ax-sm\"\n [dataSource]=\"alignDataSource\"\n [(ngModel)]=\"selectedAlign\"\n (onValueChanged)=\"onAlignChange($event)\"\n textField=\"label\"\n valueField=\"value\"\n [searchable]=\"false\"\n placeholder=\"Choose...\"\n >\n </ax-lookup>\n </div>\n </div>\n </div>\n <span>Gap</span>\n <div class=\"flex gap-2 justify-between items-center\">\n @if (gapMode() === 'both') {\n <ax-range-slider\n class=\"w-32\"\n [ngModel]=\"gap().both\"\n (ngModelChange)=\"setGap($event ?? 0, 'both')\"\n ></ax-range-slider>\n <ax-number-box\n [minValue]=\"0\"\n [maxValue]=\"999\"\n [value]=\"gap().both\"\n [changeOnScroll]=\"true\"\n (onValueChanged)=\"setGap($event.value ?? 0, 'both')\"\n class=\"ax-sm max-w-[5.5rem]\"\n [showSpinButtons]=\"false\"\n ><ax-suffix><ax-text class=\"text-xs! px-1!\">PX</ax-text></ax-suffix></ax-number-box\n >\n } @else {\n <div class=\"flex items-center gap-2 h-12\">\n <span class=\"text-xs\"\n ><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12.2929 7.00004L9.14645 3.85359L9.85355 3.14648L14.2071 7.50004L9.85355 11.8536L9.14645 11.1465L12.2929 8.00004H3V7.00004H12.2929Z\"\n fill=\"currentColor\"\n ></path></svg ></span>\n <ax-number-box\n [minValue]=\"0\"\n [maxValue]=\"999\"\n [value]=\"gap().x\"\n [changeOnScroll]=\"true\"\n (onValueChanged)=\"setGap($event.value ?? 0, 'x')\"\n class=\"ax-sm min-w-5\"\n [showSpinButtons]=\"false\"\n ><ax-suffix><ax-text class=\"text-xs! px-1!\">PX</ax-text></ax-suffix></ax-number-box\n >\n <span class=\"text-xs\"\n ><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8.00001 12.2929L4.85356 9.14645L4.14645 9.85355L8.50001 14.2071L12.8536 9.85355L12.1465 9.14645L9.00001 12.2929L9.00001 3H8.00001L8.00001 12.2929Z\"\n fill=\"currentColor\"\n ></path></svg></span>\n <ax-number-box\n [minValue]=\"0\"\n [maxValue]=\"999\"\n [value]=\"gap().y\"\n [changeOnScroll]=\"true\"\n (onValueChanged)=\"setGap($event.value ?? 0, 'y')\"\n class=\"ax-sm min-w-5\"\n [showSpinButtons]=\"false\"\n ><ax-suffix><ax-text class=\"text-xs! px-1!\">PX</ax-text></ax-suffix></ax-number-box\n >\n </div>\n }\n <button (click)=\"setGapMode()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n @if (gapMode() === 'both') {\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M5 7L5 5C5 3.34315 6.34315 2 8 2C9.65685 2 11 3.34315 11 5V7C11.5523 7 12 7.44772 12 8V12C12 12.5523 11.5523 13 11 13H5C4.44772 13 4 12.5523 4 12V8C4 7.44771 4.44772 7 5 7ZM6 5C6 3.89543 6.89543 3 8 3C9.10457 3 10 3.89543 10 5V7H6V5ZM5 12V8H11V12H5Z\"\n fill=\"currentColor\"\n ></path>\n } @else {\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M9 5C9 3.89543 9.89543 3 11 3C12.1046 3 13 3.89543 13 5V6H14V5C14 3.34315 12.6569 2 11 2C9.34315 2 8 3.34315 8 5V7H3C2.44772 7 2 7.44771 2 8V12C2 12.5523 2.44772 13 3 13H9C9.55228 13 10 12.5523 10 12V8C10 7.44772 9.55228 7 9 7V5ZM3 8H9V12H3V8Z\"\n fill=\"currentColor\"\n ></path>\n }\n </svg>\n </button>\n </div>\n <!-- <span>Items</span>\n <div>\n <ax-number-box\n [minValue]=\"0\"\n [maxValue]=\"12\"\n [ngModel]=\"itemsCount()\"\n (ngModelChange)=\"setItemsCount($event ?? 0)\"\n class=\"w-32\"\n ></ax-number-box>\n </div> -->\n</div>\n", styles: [":host{--ax-comp-range-slider-handler-size: .75rem}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXButtonGroupModule }, { kind: "component", type: i1$i.AXButtonGroupComponent, selector: "ax-button-group", inputs: ["disabled", "fitParent", "color", "look", "class", "selection"], outputs: ["onBlur", "onFocus", "disabledChange", "colorChange", "lookChange", "onClick", "selectionChange", "selectedButtonChange"] }, { kind: "component", type: i1$i.AXButtonGroupItemComponent, selector: "ax-button-group-item", inputs: ["disabled", "color", "text", "class", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange", "classChange"] }, { 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: "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: AXRangeSliderModule }, { kind: "component", type: i3$4.AXRangeSliderComponent, selector: "ax-range-slider", inputs: ["disabled", "readonly", "orientation", "color", "values", "mode", "min", "max", "step", "snap", "tooltipMode", "snapMode", "hasStep", "hasSnap", "hasLable", "hasTooltip"], outputs: ["valuesChange"] }, { kind: "ngmodule", type: AXNumberBoxModule }, { kind: "component", type: i1$8.AXNumberBoxComponent, selector: "ax-number-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "minValue", "maxValue", "showSpinButtons", "thousandsSeparator", "decimals", "changeOnScroll", "step"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "thousandsSeparatorChange"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "ngmodule", type: AXButtonModule }, { 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: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23304
22746
  }
23305
22747
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPFlexOptionsWidgetEditComponent, decorators: [{
23306
22748
  type: Component,
@@ -24720,79 +24162,631 @@ const AXPRegularExpressionValidationWidget = {
24720
24162
 
24721
24163
  class AXPRequiredValidationWidgetEditComponent extends AXPValueWidgetComponent {
24722
24164
  constructor() {
24723
- super(...arguments);
24724
- this.validationName = this.token.node.name;
24725
- this.validationInformation = AXP_BASE_VALIDATION_INFORMATION[this.validationName];
24726
- this.validationStatus = linkedSignal(() => this.getValue()?.rule === this.validationInformation.rule ? true : false, /* @ts-ignore */
24727
- ...(ngDevMode ? [{ debugName: "validationStatus" }] : /* istanbul ignore next */ []));
24728
- this.validationText = linkedSignal(() => this.getValue()?.message ?? this.validationInformation.message, /* @ts-ignore */
24729
- ...(ngDevMode ? [{ debugName: "validationText" }] : /* istanbul ignore next */ []));
24730
- this.validationPlaceholder = this.validationInformation.placeholder;
24731
- this.#syncChange = effect(() => {
24732
- if (this.validationStatus()) {
24733
- this.setValue({ rule: this.validationInformation.rule, message: this.validationText() });
24165
+ super(...arguments);
24166
+ this.validationName = this.token.node.name;
24167
+ this.validationInformation = AXP_BASE_VALIDATION_INFORMATION[this.validationName];
24168
+ this.validationStatus = linkedSignal(() => this.getValue()?.rule === this.validationInformation.rule ? true : false, /* @ts-ignore */
24169
+ ...(ngDevMode ? [{ debugName: "validationStatus" }] : /* istanbul ignore next */ []));
24170
+ this.validationText = linkedSignal(() => this.getValue()?.message ?? this.validationInformation.message, /* @ts-ignore */
24171
+ ...(ngDevMode ? [{ debugName: "validationText" }] : /* istanbul ignore next */ []));
24172
+ this.validationPlaceholder = this.validationInformation.placeholder;
24173
+ this.#syncChange = effect(() => {
24174
+ if (this.validationStatus()) {
24175
+ this.setValue({ rule: this.validationInformation.rule, message: this.validationText() });
24176
+ }
24177
+ else
24178
+ this.setValue(undefined);
24179
+ }, /* @ts-ignore */
24180
+ ...(ngDevMode ? [{ debugName: "#syncChange" }] : /* istanbul ignore next */ []));
24181
+ }
24182
+ ToggleRule(event) {
24183
+ this.validationStatus.set(event);
24184
+ }
24185
+ #syncChange;
24186
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPRequiredValidationWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
24187
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPRequiredValidationWidgetEditComponent, isStandalone: true, selector: "axp-required-validation-widget-editor", usesInheritance: true, ngImport: i0, template: `<axp-base-validation-component
24188
+ [validationStatus]="validationStatus()"
24189
+ (validationStatusChange)="ToggleRule($event)"
24190
+ [(validationText)]="validationText"
24191
+ [validationTextPlaceholder]="validationPlaceholder"
24192
+ >
24193
+ </axp-base-validation-component>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: AXPBaseValidationComponent, selector: "axp-base-validation-component", inputs: ["validationStatus", "validationText", "validationTextPlaceholder"], outputs: ["validationStatusChange", "validationTextChange"] }, { kind: "ngmodule", type: FormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24194
+ }
24195
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPRequiredValidationWidgetEditComponent, decorators: [{
24196
+ type: Component,
24197
+ args: [{
24198
+ selector: 'axp-required-validation-widget-editor',
24199
+ template: `<axp-base-validation-component
24200
+ [validationStatus]="validationStatus()"
24201
+ (validationStatusChange)="ToggleRule($event)"
24202
+ [(validationText)]="validationText"
24203
+ [validationTextPlaceholder]="validationPlaceholder"
24204
+ >
24205
+ </axp-base-validation-component>`,
24206
+ changeDetection: ChangeDetectionStrategy.OnPush,
24207
+ imports: [AXPWidgetCoreModule, AXPBaseValidationComponent, FormsModule],
24208
+ }]
24209
+ }] });
24210
+
24211
+ var requiredValidationWidgetEdit_component = /*#__PURE__*/Object.freeze({
24212
+ __proto__: null,
24213
+ AXPRequiredValidationWidgetEditComponent: AXPRequiredValidationWidgetEditComponent
24214
+ });
24215
+
24216
+ const AXPRequiredValidationWidget = {
24217
+ name: 'required-validation',
24218
+ title: 'Mandatory Field Validation',
24219
+ type: 'validation',
24220
+ icon: 'fa-light fa-exclamation-circle',
24221
+ properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY],
24222
+ components: {
24223
+ edit: {
24224
+ component: () => Promise.resolve().then(function () { return requiredValidationWidgetEdit_component; }).then((c) => c.AXPRequiredValidationWidgetEditComponent),
24225
+ },
24226
+ },
24227
+ };
24228
+
24229
+ //#region ----- Constants -----
24230
+ const UNIX_FIELD_PATTERN = /^(?:\*|\d+(?:-\d+)?(?:\/\d+)?|\*\/\d+)(?:,(?:\*|\d+(?:-\d+)?(?:\/\d+)?|\*\/\d+))*$/;
24231
+ const ALL_WEEKDAYS = [0, 1, 2, 3, 4, 5, 6];
24232
+ const AXP_CRON_DEFAULT_MODEL = {
24233
+ preset: 'daily',
24234
+ minute: 0,
24235
+ hour: 0,
24236
+ hourInterval: 1,
24237
+ weekdays: [1],
24238
+ monthDay: 1,
24239
+ raw: '0 0 * * *',
24240
+ };
24241
+ //#endregion
24242
+ //#region ----- Validation -----
24243
+ function normalizeCronExpression(value) {
24244
+ return typeof value === 'string' ? value.trim() : '';
24245
+ }
24246
+ function isValidUnixCron(value) {
24247
+ const raw = normalizeCronExpression(value);
24248
+ if (!raw) {
24249
+ return false;
24250
+ }
24251
+ const fields = raw.split(/\s+/);
24252
+ if (fields.length !== 5 && fields.length !== 6) {
24253
+ return false;
24254
+ }
24255
+ return fields.every((field) => UNIX_FIELD_PATTERN.test(field));
24256
+ }
24257
+ //#endregion
24258
+ //#region ----- Parse / build -----
24259
+ function parseCronExpression(value) {
24260
+ const raw = normalizeCronExpression(value);
24261
+ if (!raw || !isValidUnixCron(raw)) {
24262
+ return { ...AXP_CRON_DEFAULT_MODEL, preset: raw ? 'custom' : 'daily', raw };
24263
+ }
24264
+ const fiveField = toFiveFieldCron(raw);
24265
+ const [minuteField, hourField, dayOfMonthField, monthField, dayOfWeekField] = fiveField.split(' ');
24266
+ const minute = parseExactNumber(minuteField, 0, 59);
24267
+ const monthDay = parseExactNumber(dayOfMonthField, 1, 31);
24268
+ const hour = parseExactNumber(hourField, 0, 23);
24269
+ const hourInterval = parseStarStep(hourField);
24270
+ const weekdays = parseWeekdays(dayOfWeekField);
24271
+ const base = {
24272
+ ...AXP_CRON_DEFAULT_MODEL,
24273
+ minute: minute ?? AXP_CRON_DEFAULT_MODEL.minute,
24274
+ hour: hour ?? AXP_CRON_DEFAULT_MODEL.hour,
24275
+ hourInterval: hourInterval ?? AXP_CRON_DEFAULT_MODEL.hourInterval,
24276
+ weekdays: weekdays ?? AXP_CRON_DEFAULT_MODEL.weekdays,
24277
+ monthDay: monthDay ?? AXP_CRON_DEFAULT_MODEL.monthDay,
24278
+ raw: fiveField,
24279
+ };
24280
+ if (monthField !== '*') {
24281
+ return { ...base, preset: 'custom', raw };
24282
+ }
24283
+ if (minute == null) {
24284
+ return { ...base, preset: 'custom', raw };
24285
+ }
24286
+ if (dayOfMonthField === '*' && dayOfWeekField === '*' && hourInterval != null) {
24287
+ return { ...base, preset: 'hourly', hour: 0 };
24288
+ }
24289
+ if (hour != null && dayOfMonthField === '*' && dayOfWeekField === '*') {
24290
+ return { ...base, preset: 'daily' };
24291
+ }
24292
+ if (hour != null && dayOfMonthField === '*' && weekdays != null) {
24293
+ if (weekdays.length === ALL_WEEKDAYS.length) {
24294
+ return { ...base, preset: 'daily' };
24295
+ }
24296
+ return { ...base, preset: 'weekly', weekdays };
24297
+ }
24298
+ if (hour != null && monthDay != null && dayOfWeekField === '*') {
24299
+ return { ...base, preset: 'monthly' };
24300
+ }
24301
+ return { ...base, preset: 'custom', raw };
24302
+ }
24303
+ function buildCronExpression(model) {
24304
+ const minute = clampInt(model.minute, 0, 59);
24305
+ const hour = clampInt(model.hour, 0, 23);
24306
+ const hourInterval = clampInt(model.hourInterval, 1, 23);
24307
+ const monthDay = clampInt(model.monthDay, 1, 31);
24308
+ const weekdays = normalizeWeekdays(model.weekdays);
24309
+ switch (model.preset) {
24310
+ case 'hourly':
24311
+ return `${minute} ${hourInterval === 1 ? '*' : `*/${hourInterval}`} * * *`;
24312
+ case 'daily':
24313
+ return `${minute} ${hour} * * *`;
24314
+ case 'weekly':
24315
+ return `${minute} ${hour} * * ${formatWeekdays(weekdays.length ? weekdays : [1])}`;
24316
+ case 'monthly':
24317
+ return `${minute} ${hour} ${monthDay} * *`;
24318
+ case 'custom':
24319
+ return normalizeCronExpression(model.raw);
24320
+ default:
24321
+ return AXP_CRON_DEFAULT_MODEL.raw;
24322
+ }
24323
+ }
24324
+ function describeCronExpression(value) {
24325
+ const raw = normalizeCronExpression(value);
24326
+ if (!raw) {
24327
+ return { kind: 'empty' };
24328
+ }
24329
+ if (!isValidUnixCron(raw)) {
24330
+ return { kind: 'invalid', raw };
24331
+ }
24332
+ const model = parseCronExpression(raw);
24333
+ switch (model.preset) {
24334
+ case 'hourly':
24335
+ return { kind: 'hourly', interval: model.hourInterval, minute: model.minute };
24336
+ case 'daily':
24337
+ return { kind: 'daily', hour: model.hour, minute: model.minute };
24338
+ case 'weekly':
24339
+ return { kind: 'weekly', hour: model.hour, minute: model.minute, weekdays: model.weekdays };
24340
+ case 'monthly':
24341
+ return { kind: 'monthly', hour: model.hour, minute: model.minute, monthDay: model.monthDay };
24342
+ default:
24343
+ return { kind: 'custom', raw: toFiveFieldCron(raw) };
24344
+ }
24345
+ }
24346
+ function applyCronPreset(model, preset) {
24347
+ const next = { ...model, preset };
24348
+ return { ...next, raw: buildCronExpression(next) };
24349
+ }
24350
+ //#endregion
24351
+ //#region ----- Field helpers -----
24352
+ function toFiveFieldCron(raw) {
24353
+ const fields = raw.split(/\s+/);
24354
+ return fields.length === 6 ? fields.slice(1).join(' ') : fields.join(' ');
24355
+ }
24356
+ function parseExactNumber(field, min, max) {
24357
+ if (!/^\d+$/.test(field)) {
24358
+ return null;
24359
+ }
24360
+ const value = Number(field);
24361
+ if (!Number.isInteger(value) || value < min || value > max) {
24362
+ return null;
24363
+ }
24364
+ return value;
24365
+ }
24366
+ function parseStarStep(field) {
24367
+ if (field === '*') {
24368
+ return 1;
24369
+ }
24370
+ const match = /^\*\/(\d+)$/.exec(field);
24371
+ if (!match) {
24372
+ return null;
24373
+ }
24374
+ const interval = Number(match[1]);
24375
+ if (!Number.isInteger(interval) || interval < 1 || interval > 23) {
24376
+ return null;
24377
+ }
24378
+ return interval;
24379
+ }
24380
+ function parseWeekdays(field) {
24381
+ if (field === '*') {
24382
+ return null;
24383
+ }
24384
+ const values = new Set();
24385
+ for (const part of field.split(',')) {
24386
+ if (part.includes('/')) {
24387
+ return null;
24388
+ }
24389
+ if (part.includes('-')) {
24390
+ const [fromRaw, toRaw] = part.split('-');
24391
+ const from = normalizeWeekday(Number(fromRaw));
24392
+ const to = normalizeWeekday(Number(toRaw));
24393
+ if (from == null || to == null || from > to) {
24394
+ return null;
24395
+ }
24396
+ for (let day = from; day <= to; day += 1) {
24397
+ values.add(day);
24398
+ }
24399
+ continue;
24400
+ }
24401
+ const day = normalizeWeekday(Number(part));
24402
+ if (day == null) {
24403
+ return null;
24404
+ }
24405
+ values.add(day);
24406
+ }
24407
+ return values.size ? [...values].sort((left, right) => left - right) : null;
24408
+ }
24409
+ function normalizeWeekday(value) {
24410
+ if (!Number.isInteger(value) || value < 0 || value > 7) {
24411
+ return null;
24412
+ }
24413
+ return value === 7 ? 0 : value;
24414
+ }
24415
+ function normalizeWeekdays(weekdays) {
24416
+ const values = new Set();
24417
+ for (const weekday of weekdays) {
24418
+ const day = normalizeWeekday(weekday);
24419
+ if (day != null) {
24420
+ values.add(day);
24421
+ }
24422
+ }
24423
+ return [...values].sort((left, right) => left - right);
24424
+ }
24425
+ function formatWeekdays(weekdays) {
24426
+ const days = normalizeWeekdays(weekdays);
24427
+ if (days.length === 0) {
24428
+ return '1';
24429
+ }
24430
+ const isContiguous = days.every((day, index) => index === 0 || day === days[index - 1] + 1);
24431
+ if (isContiguous && days.length > 2) {
24432
+ return `${days[0]}-${days[days.length - 1]}`;
24433
+ }
24434
+ return days.join(',');
24435
+ }
24436
+ function resolveLocaleWeekStartsOn(startsOn) {
24437
+ const start = Number(startsOn);
24438
+ return Number.isInteger(start) && start >= 0 && start <= 6 ? start : 0;
24439
+ }
24440
+ function orderWeekdaysFromStart(startsOn) {
24441
+ const origin = resolveLocaleWeekStartsOn(startsOn);
24442
+ return ALL_WEEKDAYS.map((_, offset) => (origin + offset) % 7);
24443
+ }
24444
+ function clampInt(value, min, max) {
24445
+ if (!Number.isFinite(value)) {
24446
+ return min;
24447
+ }
24448
+ return Math.min(max, Math.max(min, Math.trunc(value)));
24449
+ }
24450
+ //#endregion
24451
+
24452
+ //#region ----- Constants -----
24453
+ const I18N_PREFIX = '@platform-layout-widgets:widgets.cron-job';
24454
+ const WEEKDAYS = [1, 2, 3, 4, 5];
24455
+ const WEEKEND = [0, 6];
24456
+ //#endregion
24457
+ //#region ----- Service -----
24458
+ class AXPCronExpressionDisplayService {
24459
+ constructor() {
24460
+ //#region ----- Services & Dependencies -----
24461
+ this.translation = inject(AXTranslationService);
24462
+ this.formatService = inject(AXFormatService);
24463
+ this.settingsService = inject(AXPSettingsService);
24464
+ this.localeService = inject(AXLocaleService);
24465
+ }
24466
+ //#endregion
24467
+ //#region ----- Public API -----
24468
+ async describe(value) {
24469
+ const model = describeCronExpression(value);
24470
+ switch (model.kind) {
24471
+ case 'empty':
24472
+ return (await this.translation.translateAsync(`${I18N_PREFIX}.summary.empty`)) ?? '';
24473
+ case 'invalid':
24474
+ return (await this.translation.translateAsync(`${I18N_PREFIX}.summary.invalid`)) ?? model.raw;
24475
+ case 'hourly':
24476
+ return this.describeHourly(model.interval, model.minute);
24477
+ case 'daily':
24478
+ return this.translate(`${I18N_PREFIX}.summary.daily`, {
24479
+ time: await this.formatTime(model.hour, model.minute),
24480
+ });
24481
+ case 'weekly':
24482
+ return this.describeWeekly(model.weekdays, model.hour, model.minute);
24483
+ case 'monthly':
24484
+ return this.translate(`${I18N_PREFIX}.summary.monthly`, {
24485
+ day: String(model.monthDay),
24486
+ time: await this.formatTime(model.hour, model.minute),
24487
+ });
24488
+ case 'custom':
24489
+ return model.raw;
24490
+ default:
24491
+ return '';
24492
+ }
24493
+ }
24494
+ //#endregion
24495
+ //#region ----- Private helpers -----
24496
+ async describeHourly(interval, minute) {
24497
+ if (interval === 1 && minute === 0) {
24498
+ return this.translate(`${I18N_PREFIX}.summary.every-hour`);
24499
+ }
24500
+ if (interval === 1) {
24501
+ return this.translate(`${I18N_PREFIX}.summary.every-hour-at-minute`, { minute: String(minute) });
24502
+ }
24503
+ if (minute === 0) {
24504
+ return this.translate(`${I18N_PREFIX}.summary.every-n-hours`, { n: String(interval) });
24505
+ }
24506
+ return this.translate(`${I18N_PREFIX}.summary.every-n-hours-at-minute`, {
24507
+ n: String(interval),
24508
+ minute: String(minute),
24509
+ });
24510
+ }
24511
+ async describeWeekly(weekdays, hour, minute) {
24512
+ const time = await this.formatTime(hour, minute);
24513
+ if (sameDays(weekdays, WEEKDAYS)) {
24514
+ return this.translate(`${I18N_PREFIX}.summary.weekdays`, { time });
24515
+ }
24516
+ if (sameDays(weekdays, WEEKEND)) {
24517
+ return this.translate(`${I18N_PREFIX}.summary.weekend`, { time });
24518
+ }
24519
+ const selected = new Set(weekdays);
24520
+ const dayNames = await Promise.all(orderWeekdaysFromStart(this.localeService.activeProfile()?.calendar?.week?.startsOn)
24521
+ .filter((day) => selected.has(day))
24522
+ .map((day) => this.translate(`${I18N_PREFIX}.weekdays.${day}`)));
24523
+ return this.translate(`${I18N_PREFIX}.summary.weekly`, {
24524
+ days: dayNames.filter(Boolean).join(', '),
24525
+ time,
24526
+ });
24527
+ }
24528
+ async formatTime(hour, minute) {
24529
+ const format = await this.settingsService.get(AXPRegionalSetting.ShortTime);
24530
+ return this.formatService.format(new Date(2000, 0, 1, hour, minute, 0), 'time', { format });
24531
+ }
24532
+ async translate(key, params) {
24533
+ return (await this.translation.translateAsync(key, params ? { params } : undefined)) ?? '';
24534
+ }
24535
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCronExpressionDisplayService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
24536
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCronExpressionDisplayService, providedIn: 'root' }); }
24537
+ }
24538
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCronExpressionDisplayService, decorators: [{
24539
+ type: Injectable,
24540
+ args: [{ providedIn: 'root' }]
24541
+ }] });
24542
+ //#endregion
24543
+ function sameDays(left, right) {
24544
+ if (left.length !== right.length) {
24545
+ return false;
24546
+ }
24547
+ return left.every((day, index) => day === right[index]);
24548
+ }
24549
+
24550
+ //#region ----- Types -----
24551
+ const AXP_CRON_UI_PRESETS = ['hourly', 'daily', 'weekly', 'monthly'];
24552
+ const AXP_CRON_PRESETS = [...AXP_CRON_UI_PRESETS, 'custom'];
24553
+ //#endregion
24554
+
24555
+ //#endregion
24556
+ //#region ----- Constants -----
24557
+ const I18N = '@platform-layout-widgets:widgets.cron-job';
24558
+ const HOUR_ITEMS = Array.from({ length: 24 }, (_, hour) => ({
24559
+ id: String(hour),
24560
+ text: String(hour).padStart(2, '0'),
24561
+ value: String(hour),
24562
+ }));
24563
+ const MINUTE_ITEMS = Array.from({ length: 60 }, (_, minute) => ({
24564
+ id: String(minute),
24565
+ text: String(minute).padStart(2, '0'),
24566
+ value: String(minute),
24567
+ }));
24568
+ const MONTH_DAY_ITEMS = Array.from({ length: 31 }, (_, index) => {
24569
+ const day = String(index + 1);
24570
+ return { id: day, text: day, value: day };
24571
+ });
24572
+ //#endregion
24573
+ //#region ----- Component -----
24574
+ class AXPCronExpressionEditorComponent {
24575
+ //#endregion
24576
+ //#region ----- Lifecycle -----
24577
+ constructor() {
24578
+ //#region ----- Services & Dependencies -----
24579
+ this.translation = inject(AXTranslationService);
24580
+ this.display = inject(AXPCronExpressionDisplayService);
24581
+ this.localeService = inject(AXLocaleService);
24582
+ this.destroyRef = inject(DestroyRef);
24583
+ //#endregion
24584
+ //#region ----- Inputs & Outputs -----
24585
+ this.value = input(null, /* @ts-ignore */
24586
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
24587
+ this.disabled = input(false, /* @ts-ignore */
24588
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
24589
+ this.valueChange = output();
24590
+ //#endregion
24591
+ //#region ----- State Signals -----
24592
+ this.i18n = I18N;
24593
+ this.hourItems = HOUR_ITEMS;
24594
+ this.minuteItems = MINUTE_ITEMS;
24595
+ this.monthDayItems = MONTH_DAY_ITEMS;
24596
+ this.model = signal({ ...AXP_CRON_DEFAULT_MODEL }, /* @ts-ignore */
24597
+ ...(ngDevMode ? [{ debugName: "model" }] : /* istanbul ignore next */ []));
24598
+ this.summary = signal('', /* @ts-ignore */
24599
+ ...(ngDevMode ? [{ debugName: "summary" }] : /* istanbul ignore next */ []));
24600
+ this.presetItems = signal([], /* @ts-ignore */
24601
+ ...(ngDevMode ? [{ debugName: "presetItems" }] : /* istanbul ignore next */ []));
24602
+ this.weekdayItems = signal([], /* @ts-ignore */
24603
+ ...(ngDevMode ? [{ debugName: "weekdayItems" }] : /* istanbul ignore next */ []));
24604
+ //#endregion
24605
+ //#region ----- Computed Properties -----
24606
+ this.preset = computed(() => this.model().preset, /* @ts-ignore */
24607
+ ...(ngDevMode ? [{ debugName: "preset" }] : /* istanbul ignore next */ []));
24608
+ this.#syncFromValue = effect(() => {
24609
+ const incoming = normalizeCronExpression(this.value());
24610
+ const current = untracked(() => this.model().raw);
24611
+ if (incoming === current) {
24612
+ return;
24734
24613
  }
24735
- else
24736
- this.setValue(undefined);
24614
+ untracked(() => {
24615
+ this.model.set(incoming ? parseCronExpression(incoming) : { ...AXP_CRON_DEFAULT_MODEL, raw: '' });
24616
+ void this.refreshSummary();
24617
+ });
24737
24618
  }, /* @ts-ignore */
24738
- ...(ngDevMode ? [{ debugName: "#syncChange" }] : /* istanbul ignore next */ []));
24619
+ ...(ngDevMode ? [{ debugName: "#syncFromValue" }] : /* istanbul ignore next */ []));
24620
+ void this.loadLabels();
24621
+ merge(this.translation.langChanges$, this.localeService.profileChanged$)
24622
+ .pipe(takeUntilDestroyed(this.destroyRef))
24623
+ .subscribe(() => {
24624
+ void this.loadLabels();
24625
+ void this.refreshSummary();
24626
+ });
24739
24627
  }
24740
- ToggleRule(event) {
24741
- this.validationStatus.set(event);
24628
+ #syncFromValue;
24629
+ //#endregion
24630
+ //#region ----- Event Handlers -----
24631
+ onPresetChange(event) {
24632
+ if (!event.isUserInteraction) {
24633
+ return;
24634
+ }
24635
+ const preset = event.value;
24636
+ if (!preset || preset === this.model().preset) {
24637
+ return;
24638
+ }
24639
+ this.commit(applyCronPreset(this.model(), preset));
24742
24640
  }
24743
- #syncChange;
24744
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPRequiredValidationWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
24745
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPRequiredValidationWidgetEditComponent, isStandalone: true, selector: "axp-required-validation-widget-editor", usesInheritance: true, ngImport: i0, template: `<axp-base-validation-component
24746
- [validationStatus]="validationStatus()"
24747
- (validationStatusChange)="ToggleRule($event)"
24748
- [(validationText)]="validationText"
24749
- [validationTextPlaceholder]="validationPlaceholder"
24750
- >
24751
- </axp-base-validation-component>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: AXPBaseValidationComponent, selector: "axp-base-validation-component", inputs: ["validationStatus", "validationText", "validationTextPlaceholder"], outputs: ["validationStatusChange", "validationTextChange"] }, { kind: "ngmodule", type: FormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24641
+ onHourChange(event) {
24642
+ if (!event.isUserInteraction) {
24643
+ return;
24644
+ }
24645
+ this.patch({ hour: coerceSelectNumber(event.value, this.model().hour) });
24646
+ }
24647
+ onMinuteChange(event) {
24648
+ if (!event.isUserInteraction) {
24649
+ return;
24650
+ }
24651
+ this.patch({ minute: coerceSelectNumber(event.value, this.model().minute) });
24652
+ }
24653
+ onHourIntervalChange(event) {
24654
+ if (!event.isUserInteraction) {
24655
+ return;
24656
+ }
24657
+ const interval = Number(event.value);
24658
+ this.patch({ hourInterval: Number.isFinite(interval) ? interval : 1 });
24659
+ }
24660
+ onMonthDayChange(event) {
24661
+ if (!event.isUserInteraction) {
24662
+ return;
24663
+ }
24664
+ this.patch({ monthDay: coerceSelectNumber(event.value, this.model().monthDay) });
24665
+ }
24666
+ onWeekdaysChange(event) {
24667
+ if (!event.isUserInteraction) {
24668
+ return;
24669
+ }
24670
+ const selected = normalizeWeekdaySelection(event.value);
24671
+ this.patch({ weekdays: selected.length ? selected : this.model().weekdays });
24672
+ }
24673
+ //#endregion
24674
+ //#region ----- Private helpers -----
24675
+ patch(partial) {
24676
+ const next = { ...this.model(), ...partial };
24677
+ this.commit({ ...next, raw: buildCronExpression(next) });
24678
+ }
24679
+ commit(next) {
24680
+ this.model.set(next);
24681
+ this.valueChange.emit(next.raw);
24682
+ void this.refreshSummary();
24683
+ }
24684
+ async refreshSummary() {
24685
+ this.summary.set(await this.display.describe(this.model().raw));
24686
+ }
24687
+ async loadLabels() {
24688
+ const presets = await Promise.all(AXP_CRON_UI_PRESETS.map(async (id) => ({
24689
+ id,
24690
+ text: (await this.translation.translateAsync(`${I18N}.presets.${id}`)) ?? id,
24691
+ })));
24692
+ const weekdays = await Promise.all(orderWeekdaysFromStart(this.localeService.activeProfile()?.calendar?.week?.startsOn).map(async (id) => ({
24693
+ id,
24694
+ text: (await this.translation.translateAsync(`${I18N}.weekdays-short.${id}`)) ?? String(id),
24695
+ })));
24696
+ this.presetItems.set(presets);
24697
+ this.weekdayItems.set(weekdays);
24698
+ }
24699
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCronExpressionEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24700
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPCronExpressionEditorComponent, isStandalone: true, selector: "axp-cron-expression-editor", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, host: { classAttribute: "block w-full" }, ngImport: i0, template: "<div class=\"flex flex-col gap-4\">\n <!-- ----- Recurrence presets ----- -->\n <ax-selection-list\n [items]=\"presetItems()\"\n [ngModel]=\"preset()\"\n (onValueChanged)=\"onPresetChange($event)\"\n direction=\"horizontal\"\n [multiple]=\"false\"\n [showControl]=\"true\"\n valueField=\"id\"\n textField=\"text\"\n [disabled]=\"disabled()\"\n ></ax-selection-list>\n\n @if (preset() === 'hourly') {\n <!-- ----- Hourly interval and minute ----- -->\n <div class=\"flex flex-wrap items-end gap-3\">\n <div class=\"flex flex-col gap-1 w-28\">\n <ax-label class=\"text-sm\">{{ i18n + '.fields.every' | translate | async }}</ax-label>\n <ax-number-box\n [ngModel]=\"model().hourInterval\"\n (onValueChanged)=\"onHourIntervalChange($event)\"\n [minValue]=\"1\"\n [maxValue]=\"23\"\n [disabled]=\"disabled()\"\n [showSpinButtons]=\"true\"\n ></ax-number-box>\n </div>\n <div class=\"flex flex-col gap-1\">\n <ax-label class=\"text-sm invisible select-none\" aria-hidden=\"true\">&nbsp;</ax-label>\n <ax-label class=\"flex h-9 items-center text-sm\">{{ i18n + '.fields.hours' | translate | async }}</ax-label>\n </div>\n <div class=\"flex flex-col gap-1 w-24\">\n <ax-label class=\"text-sm\">{{ i18n + '.fields.at-minute' | translate | async }}</ax-label>\n <ax-combo-box\n [items]=\"minuteItems\"\n [value]=\"'' + model().minute\"\n [searchable]=\"false\"\n [disabled]=\"disabled()\"\n (onValueChanged)=\"onMinuteChange($event)\"\n ></ax-combo-box>\n </div>\n </div>\n }\n <!-- ----- Daily time ----- -->\n @else if (preset() === 'daily') {\n <div class=\"flex flex-wrap items-end gap-3\">\n <div class=\"flex flex-col gap-1\">\n <ax-label class=\"text-sm invisible select-none\" aria-hidden=\"true\">&nbsp;</ax-label>\n <ax-label class=\"flex h-9 items-center text-sm\">{{ i18n + '.fields.at' | translate | async }}</ax-label>\n </div>\n <div class=\"flex flex-col gap-1 w-24\">\n <ax-label class=\"text-sm\">{{ i18n + '.fields.hour' | translate | async }}</ax-label>\n <ax-combo-box\n [items]=\"hourItems\"\n [value]=\"'' + model().hour\"\n [searchable]=\"false\"\n [disabled]=\"disabled()\"\n (onValueChanged)=\"onHourChange($event)\"\n ></ax-combo-box>\n </div>\n <div class=\"flex flex-col gap-1\">\n <ax-label class=\"text-sm invisible select-none\" aria-hidden=\"true\">&nbsp;</ax-label>\n <ax-label class=\"flex h-9 items-center text-sm\">:</ax-label>\n </div>\n <div class=\"flex flex-col gap-1 w-24\">\n <ax-label class=\"text-sm\">{{ i18n + '.fields.minute' | translate | async }}</ax-label>\n <ax-combo-box\n [items]=\"minuteItems\"\n [value]=\"'' + model().minute\"\n [searchable]=\"false\"\n [disabled]=\"disabled()\"\n (onValueChanged)=\"onMinuteChange($event)\"\n ></ax-combo-box>\n </div>\n </div>\n }\n <!-- ----- Weekly days and time ----- -->\n @else if (preset() === 'weekly') {\n <div class=\"flex flex-col gap-3\">\n <ax-selection-list\n [items]=\"weekdayItems()\"\n [ngModel]=\"model().weekdays\"\n (onValueChanged)=\"onWeekdaysChange($event)\"\n direction=\"horizontal\"\n [multiple]=\"true\"\n [showControl]=\"true\"\n valueField=\"id\"\n textField=\"text\"\n [disabled]=\"disabled()\"\n ></ax-selection-list>\n <div class=\"flex flex-wrap items-end gap-3\">\n <div class=\"flex flex-col gap-1\">\n <ax-label class=\"text-sm invisible select-none\" aria-hidden=\"true\">&nbsp;</ax-label>\n <ax-label class=\"flex h-9 items-center text-sm\">{{ i18n + '.fields.at' | translate | async }}</ax-label>\n </div>\n <div class=\"flex flex-col gap-1 w-24\">\n <ax-label class=\"text-sm\">{{ i18n + '.fields.hour' | translate | async }}</ax-label>\n <ax-combo-box\n [items]=\"hourItems\"\n [value]=\"'' + model().hour\"\n [searchable]=\"false\"\n [disabled]=\"disabled()\"\n (onValueChanged)=\"onHourChange($event)\"\n ></ax-combo-box>\n </div>\n <div class=\"flex flex-col gap-1\">\n <ax-label class=\"text-sm invisible select-none\" aria-hidden=\"true\">&nbsp;</ax-label>\n <ax-label class=\"flex h-9 items-center text-sm\">:</ax-label>\n </div>\n <div class=\"flex flex-col gap-1 w-24\">\n <ax-label class=\"text-sm\">{{ i18n + '.fields.minute' | translate | async }}</ax-label>\n <ax-combo-box\n [items]=\"minuteItems\"\n [value]=\"'' + model().minute\"\n [searchable]=\"false\"\n [disabled]=\"disabled()\"\n (onValueChanged)=\"onMinuteChange($event)\"\n ></ax-combo-box>\n </div>\n </div>\n </div>\n }\n <!-- ----- Monthly day and time ----- -->\n @else if (preset() === 'monthly') {\n <div class=\"flex flex-wrap items-end gap-3\">\n <div class=\"flex flex-col gap-1\">\n <ax-label class=\"text-sm invisible select-none\" aria-hidden=\"true\">&nbsp;</ax-label>\n <ax-label class=\"flex h-9 items-center text-sm\">{{ i18n + '.fields.on-day' | translate | async }}</ax-label>\n </div>\n <div class=\"flex flex-col gap-1 w-24\">\n <ax-label class=\"text-sm\">{{ i18n + '.fields.day-of-month' | translate | async }}</ax-label>\n <ax-combo-box\n [items]=\"monthDayItems\"\n [value]=\"'' + model().monthDay\"\n [searchable]=\"false\"\n [disabled]=\"disabled()\"\n (onValueChanged)=\"onMonthDayChange($event)\"\n ></ax-combo-box>\n </div>\n <div class=\"flex flex-col gap-1\">\n <ax-label class=\"text-sm invisible select-none\" aria-hidden=\"true\">&nbsp;</ax-label>\n <ax-label class=\"flex h-9 items-center text-sm\">{{ i18n + '.fields.at' | translate | async }}</ax-label>\n </div>\n <div class=\"flex flex-col gap-1 w-24\">\n <ax-label class=\"text-sm\">{{ i18n + '.fields.hour' | translate | async }}</ax-label>\n <ax-combo-box\n [items]=\"hourItems\"\n [value]=\"'' + model().hour\"\n [searchable]=\"false\"\n [disabled]=\"disabled()\"\n (onValueChanged)=\"onHourChange($event)\"\n ></ax-combo-box>\n </div>\n <div class=\"flex flex-col gap-1\">\n <ax-label class=\"text-sm invisible select-none\" aria-hidden=\"true\">&nbsp;</ax-label>\n <ax-label class=\"flex h-9 items-center text-sm\">:</ax-label>\n </div>\n <div class=\"flex flex-col gap-1 w-24\">\n <ax-label class=\"text-sm\">{{ i18n + '.fields.minute' | translate | async }}</ax-label>\n <ax-combo-box\n [items]=\"minuteItems\"\n [value]=\"'' + model().minute\"\n [searchable]=\"false\"\n [disabled]=\"disabled()\"\n (onValueChanged)=\"onMinuteChange($event)\"\n ></ax-combo-box>\n </div>\n </div>\n }\n\n @if (summary()) {\n <!-- ----- Human-readable schedule summary ----- -->\n <ax-badge size=\"sm\" look=\"twotone\" color=\"primary\" [text]=\"summary()\"></ax-badge>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: AXBadgeModule }, { kind: "component", type: i1$3.AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "component", type: AXComboBoxComponent, selector: "ax-combo-box", inputs: ["name", "items", "searchable", "multiple", "adaptivityEnabled", "caption", "alternate", "placeholder", "searchPlaceholder", "highlightSearch", "emptyTemplate", "itemTemplate", "selectedTemplate", "disabled", "readonly", "look", "value"], outputs: ["lookChange", "valueChange", "onValueChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "ngmodule", type: AXLabelModule }, { kind: "component", type: i2.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXNumberBoxModule }, { kind: "component", type: i1$8.AXNumberBoxComponent, selector: "ax-number-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "minValue", "maxValue", "showSpinButtons", "thousandsSeparator", "decimals", "changeOnScroll", "step"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "thousandsSeparatorChange"] }, { 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: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.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$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24752
24701
  }
24753
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPRequiredValidationWidgetEditComponent, decorators: [{
24702
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCronExpressionEditorComponent, decorators: [{
24754
24703
  type: Component,
24755
- args: [{
24756
- selector: 'axp-required-validation-widget-editor',
24757
- template: `<axp-base-validation-component
24758
- [validationStatus]="validationStatus()"
24759
- (validationStatusChange)="ToggleRule($event)"
24760
- [(validationText)]="validationText"
24761
- [validationTextPlaceholder]="validationPlaceholder"
24762
- >
24763
- </axp-base-validation-component>`,
24764
- changeDetection: ChangeDetectionStrategy.OnPush,
24765
- imports: [AXPWidgetCoreModule, AXPBaseValidationComponent, FormsModule],
24766
- }]
24767
- }] });
24768
-
24769
- var requiredValidationWidgetEdit_component = /*#__PURE__*/Object.freeze({
24770
- __proto__: null,
24771
- AXPRequiredValidationWidgetEditComponent: AXPRequiredValidationWidgetEditComponent
24772
- });
24773
-
24774
- const AXPRequiredValidationWidget = {
24775
- name: 'required-validation',
24776
- title: 'Mandatory Field Validation',
24777
- type: 'validation',
24778
- icon: 'fa-light fa-exclamation-circle',
24779
- properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY],
24780
- components: {
24781
- edit: {
24782
- component: () => Promise.resolve().then(function () { return requiredValidationWidgetEdit_component; }).then((c) => c.AXPRequiredValidationWidgetEditComponent),
24783
- },
24784
- },
24785
- };
24704
+ args: [{ selector: 'axp-cron-expression-editor', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'block w-full' }, imports: [
24705
+ AsyncPipe,
24706
+ AXBadgeModule,
24707
+ AXComboBoxComponent,
24708
+ AXFormModule,
24709
+ AXLabelModule,
24710
+ AXNumberBoxModule,
24711
+ AXSelectionListModule,
24712
+ AXTranslationModule,
24713
+ FormsModule,
24714
+ ], template: "<div class=\"flex flex-col gap-4\">\n <!-- ----- Recurrence presets ----- -->\n <ax-selection-list\n [items]=\"presetItems()\"\n [ngModel]=\"preset()\"\n (onValueChanged)=\"onPresetChange($event)\"\n direction=\"horizontal\"\n [multiple]=\"false\"\n [showControl]=\"true\"\n valueField=\"id\"\n textField=\"text\"\n [disabled]=\"disabled()\"\n ></ax-selection-list>\n\n @if (preset() === 'hourly') {\n <!-- ----- Hourly interval and minute ----- -->\n <div class=\"flex flex-wrap items-end gap-3\">\n <div class=\"flex flex-col gap-1 w-28\">\n <ax-label class=\"text-sm\">{{ i18n + '.fields.every' | translate | async }}</ax-label>\n <ax-number-box\n [ngModel]=\"model().hourInterval\"\n (onValueChanged)=\"onHourIntervalChange($event)\"\n [minValue]=\"1\"\n [maxValue]=\"23\"\n [disabled]=\"disabled()\"\n [showSpinButtons]=\"true\"\n ></ax-number-box>\n </div>\n <div class=\"flex flex-col gap-1\">\n <ax-label class=\"text-sm invisible select-none\" aria-hidden=\"true\">&nbsp;</ax-label>\n <ax-label class=\"flex h-9 items-center text-sm\">{{ i18n + '.fields.hours' | translate | async }}</ax-label>\n </div>\n <div class=\"flex flex-col gap-1 w-24\">\n <ax-label class=\"text-sm\">{{ i18n + '.fields.at-minute' | translate | async }}</ax-label>\n <ax-combo-box\n [items]=\"minuteItems\"\n [value]=\"'' + model().minute\"\n [searchable]=\"false\"\n [disabled]=\"disabled()\"\n (onValueChanged)=\"onMinuteChange($event)\"\n ></ax-combo-box>\n </div>\n </div>\n }\n <!-- ----- Daily time ----- -->\n @else if (preset() === 'daily') {\n <div class=\"flex flex-wrap items-end gap-3\">\n <div class=\"flex flex-col gap-1\">\n <ax-label class=\"text-sm invisible select-none\" aria-hidden=\"true\">&nbsp;</ax-label>\n <ax-label class=\"flex h-9 items-center text-sm\">{{ i18n + '.fields.at' | translate | async }}</ax-label>\n </div>\n <div class=\"flex flex-col gap-1 w-24\">\n <ax-label class=\"text-sm\">{{ i18n + '.fields.hour' | translate | async }}</ax-label>\n <ax-combo-box\n [items]=\"hourItems\"\n [value]=\"'' + model().hour\"\n [searchable]=\"false\"\n [disabled]=\"disabled()\"\n (onValueChanged)=\"onHourChange($event)\"\n ></ax-combo-box>\n </div>\n <div class=\"flex flex-col gap-1\">\n <ax-label class=\"text-sm invisible select-none\" aria-hidden=\"true\">&nbsp;</ax-label>\n <ax-label class=\"flex h-9 items-center text-sm\">:</ax-label>\n </div>\n <div class=\"flex flex-col gap-1 w-24\">\n <ax-label class=\"text-sm\">{{ i18n + '.fields.minute' | translate | async }}</ax-label>\n <ax-combo-box\n [items]=\"minuteItems\"\n [value]=\"'' + model().minute\"\n [searchable]=\"false\"\n [disabled]=\"disabled()\"\n (onValueChanged)=\"onMinuteChange($event)\"\n ></ax-combo-box>\n </div>\n </div>\n }\n <!-- ----- Weekly days and time ----- -->\n @else if (preset() === 'weekly') {\n <div class=\"flex flex-col gap-3\">\n <ax-selection-list\n [items]=\"weekdayItems()\"\n [ngModel]=\"model().weekdays\"\n (onValueChanged)=\"onWeekdaysChange($event)\"\n direction=\"horizontal\"\n [multiple]=\"true\"\n [showControl]=\"true\"\n valueField=\"id\"\n textField=\"text\"\n [disabled]=\"disabled()\"\n ></ax-selection-list>\n <div class=\"flex flex-wrap items-end gap-3\">\n <div class=\"flex flex-col gap-1\">\n <ax-label class=\"text-sm invisible select-none\" aria-hidden=\"true\">&nbsp;</ax-label>\n <ax-label class=\"flex h-9 items-center text-sm\">{{ i18n + '.fields.at' | translate | async }}</ax-label>\n </div>\n <div class=\"flex flex-col gap-1 w-24\">\n <ax-label class=\"text-sm\">{{ i18n + '.fields.hour' | translate | async }}</ax-label>\n <ax-combo-box\n [items]=\"hourItems\"\n [value]=\"'' + model().hour\"\n [searchable]=\"false\"\n [disabled]=\"disabled()\"\n (onValueChanged)=\"onHourChange($event)\"\n ></ax-combo-box>\n </div>\n <div class=\"flex flex-col gap-1\">\n <ax-label class=\"text-sm invisible select-none\" aria-hidden=\"true\">&nbsp;</ax-label>\n <ax-label class=\"flex h-9 items-center text-sm\">:</ax-label>\n </div>\n <div class=\"flex flex-col gap-1 w-24\">\n <ax-label class=\"text-sm\">{{ i18n + '.fields.minute' | translate | async }}</ax-label>\n <ax-combo-box\n [items]=\"minuteItems\"\n [value]=\"'' + model().minute\"\n [searchable]=\"false\"\n [disabled]=\"disabled()\"\n (onValueChanged)=\"onMinuteChange($event)\"\n ></ax-combo-box>\n </div>\n </div>\n </div>\n }\n <!-- ----- Monthly day and time ----- -->\n @else if (preset() === 'monthly') {\n <div class=\"flex flex-wrap items-end gap-3\">\n <div class=\"flex flex-col gap-1\">\n <ax-label class=\"text-sm invisible select-none\" aria-hidden=\"true\">&nbsp;</ax-label>\n <ax-label class=\"flex h-9 items-center text-sm\">{{ i18n + '.fields.on-day' | translate | async }}</ax-label>\n </div>\n <div class=\"flex flex-col gap-1 w-24\">\n <ax-label class=\"text-sm\">{{ i18n + '.fields.day-of-month' | translate | async }}</ax-label>\n <ax-combo-box\n [items]=\"monthDayItems\"\n [value]=\"'' + model().monthDay\"\n [searchable]=\"false\"\n [disabled]=\"disabled()\"\n (onValueChanged)=\"onMonthDayChange($event)\"\n ></ax-combo-box>\n </div>\n <div class=\"flex flex-col gap-1\">\n <ax-label class=\"text-sm invisible select-none\" aria-hidden=\"true\">&nbsp;</ax-label>\n <ax-label class=\"flex h-9 items-center text-sm\">{{ i18n + '.fields.at' | translate | async }}</ax-label>\n </div>\n <div class=\"flex flex-col gap-1 w-24\">\n <ax-label class=\"text-sm\">{{ i18n + '.fields.hour' | translate | async }}</ax-label>\n <ax-combo-box\n [items]=\"hourItems\"\n [value]=\"'' + model().hour\"\n [searchable]=\"false\"\n [disabled]=\"disabled()\"\n (onValueChanged)=\"onHourChange($event)\"\n ></ax-combo-box>\n </div>\n <div class=\"flex flex-col gap-1\">\n <ax-label class=\"text-sm invisible select-none\" aria-hidden=\"true\">&nbsp;</ax-label>\n <ax-label class=\"flex h-9 items-center text-sm\">:</ax-label>\n </div>\n <div class=\"flex flex-col gap-1 w-24\">\n <ax-label class=\"text-sm\">{{ i18n + '.fields.minute' | translate | async }}</ax-label>\n <ax-combo-box\n [items]=\"minuteItems\"\n [value]=\"'' + model().minute\"\n [searchable]=\"false\"\n [disabled]=\"disabled()\"\n (onValueChanged)=\"onMinuteChange($event)\"\n ></ax-combo-box>\n </div>\n </div>\n }\n\n @if (summary()) {\n <!-- ----- Human-readable schedule summary ----- -->\n <ax-badge size=\"sm\" look=\"twotone\" color=\"primary\" [text]=\"summary()\"></ax-badge>\n }\n</div>\n" }]
24715
+ }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }] } });
24716
+ //#endregion
24717
+ function coerceSelectNumber(value, fallback) {
24718
+ const scalar = Array.isArray(value) ? value[0] : value;
24719
+ if (scalar == null || scalar === '') {
24720
+ return fallback;
24721
+ }
24722
+ const parsed = Number(scalar);
24723
+ return Number.isFinite(parsed) ? parsed : fallback;
24724
+ }
24725
+ function normalizeWeekdaySelection(value) {
24726
+ const raw = Array.isArray(value) ? value : value == null ? [] : [value];
24727
+ const days = raw
24728
+ .map((day) => Number(day))
24729
+ .filter((day) => Number.isInteger(day) && day >= 0 && day <= 6);
24730
+ return [...new Set(days)].sort((left, right) => left - right);
24731
+ }
24786
24732
 
24733
+ //#region ----- Imports -----
24734
+ //#endregion
24735
+ //#region ----- Component -----
24787
24736
  class AXPCronJobWidgetColumnComponent extends AXPColumnWidgetComponent {
24737
+ constructor() {
24738
+ super(...arguments);
24739
+ //#region ----- Services & Dependencies -----
24740
+ this.display = inject(AXPCronExpressionDisplayService);
24741
+ //#endregion
24742
+ //#region ----- State Signals -----
24743
+ this.summary = signal('', /* @ts-ignore */
24744
+ ...(ngDevMode ? [{ debugName: "summary" }] : /* istanbul ignore next */ []));
24745
+ this.rawExpression = signal('', /* @ts-ignore */
24746
+ ...(ngDevMode ? [{ debugName: "rawExpression" }] : /* istanbul ignore next */ []));
24747
+ //#endregion
24748
+ //#region ----- Lifecycle -----
24749
+ this.#describe = effect(() => {
24750
+ const raw = normalizeCronExpression(this.rawValue);
24751
+ this.rawExpression.set(raw);
24752
+ void this.refreshSummary(raw);
24753
+ }, /* @ts-ignore */
24754
+ ...(ngDevMode ? [{ debugName: "#describe" }] : /* istanbul ignore next */ []));
24755
+ }
24756
+ //#endregion
24757
+ //#region ----- Lifecycle -----
24758
+ #describe;
24759
+ //#endregion
24760
+ //#region ----- Private helpers -----
24761
+ async refreshSummary(raw) {
24762
+ this.summary.set(raw ? await this.display.describe(raw) : '');
24763
+ }
24788
24764
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCronJobWidgetColumnComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
24789
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPCronJobWidgetColumnComponent, isStandalone: true, selector: "axp-cron-job-widget-column", inputs: { rawValue: "rawValue", rowData: "rowData" }, usesInheritance: true, ngImport: i0, template: `{{ rawValue }}`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24765
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPCronJobWidgetColumnComponent, isStandalone: true, selector: "axp-cron-job-widget-column", inputs: { rawValue: "rawValue", rowData: "rowData" }, usesInheritance: true, ngImport: i0, template: `
24766
+ @if (summary()) {
24767
+ <!-- ----- Human-readable cron with raw tooltip ----- -->
24768
+ <span class="text-sm" [title]="rawExpression()">{{ summary() }}</span>
24769
+ }
24770
+ <!-- ----- Empty cron cell ----- -->
24771
+ @else {
24772
+ <span class="text-sm text-muted">---</span>
24773
+ }
24774
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24790
24775
  }
24791
24776
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCronJobWidgetColumnComponent, decorators: [{
24792
24777
  type: Component,
24793
24778
  args: [{
24794
24779
  selector: 'axp-cron-job-widget-column',
24795
- template: `{{ rawValue }}`,
24780
+ template: `
24781
+ @if (summary()) {
24782
+ <!-- ----- Human-readable cron with raw tooltip ----- -->
24783
+ <span class="text-sm" [title]="rawExpression()">{{ summary() }}</span>
24784
+ }
24785
+ <!-- ----- Empty cron cell ----- -->
24786
+ @else {
24787
+ <span class="text-sm text-muted">---</span>
24788
+ }
24789
+ `,
24796
24790
  changeDetection: ChangeDetectionStrategy.OnPush,
24797
24791
  inputs: ['rawValue', 'rowData'],
24798
24792
  }]
@@ -24803,49 +24797,44 @@ var cronJobWidgetColumn_component = /*#__PURE__*/Object.freeze({
24803
24797
  AXPCronJobWidgetColumnComponent: AXPCronJobWidgetColumnComponent
24804
24798
  });
24805
24799
 
24806
- class AXPCronJobWidgetDesignerComponent extends AXPValueWidgetComponent {
24807
- constructor() {
24808
- super(...arguments);
24809
- this.expreesion = signal('* * * ? * * *', /* @ts-ignore */
24810
- ...(ngDevMode ? [{ debugName: "expreesion" }] : /* istanbul ignore next */ []));
24811
- }
24812
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCronJobWidgetDesignerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
24813
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPCronJobWidgetDesignerComponent, isStandalone: true, selector: "axp-cron-job-widget-designer", usesInheritance: true, ngImport: i0, template: `<ax-cron-job-container [ngModel]="expreesion()"> </ax-cron-job-container>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXCronJobModule }, { kind: "component", type: i1$l.AXCronJobContainerComponent, selector: "ax-cron-job-container", outputs: ["onValueChanged"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24814
- }
24815
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCronJobWidgetDesignerComponent, decorators: [{
24816
- type: Component,
24817
- args: [{
24818
- selector: 'axp-cron-job-widget-designer',
24819
- template: `<ax-cron-job-container [ngModel]="expreesion()"> </ax-cron-job-container>`,
24820
- changeDetection: ChangeDetectionStrategy.OnPush,
24821
- imports: [AXCronJobModule, FormsModule],
24822
- }]
24823
- }] });
24824
-
24825
- var cronJobWidgetDesigner_component = /*#__PURE__*/Object.freeze({
24826
- __proto__: null,
24827
- AXPCronJobWidgetDesignerComponent: AXPCronJobWidgetDesignerComponent
24828
- });
24829
-
24800
+ //#region ----- Imports -----
24801
+ //#endregion
24802
+ //#region ----- Component -----
24830
24803
  class AXPCronJobWidgetEditComponent extends AXPValueWidgetComponent {
24831
24804
  constructor() {
24832
24805
  super(...arguments);
24833
- this.expreesion = signal('* * * ? * * *', /* @ts-ignore */
24834
- ...(ngDevMode ? [{ debugName: "expreesion" }] : /* istanbul ignore next */ []));
24835
- }
24836
- getExpressionHandler(e) {
24837
- this.setValue(e.data);
24806
+ //#region ----- Computed Properties -----
24807
+ this.boundValue = computed(() => {
24808
+ const value = this.getValue();
24809
+ return typeof value === 'string' ? value : null;
24810
+ }, /* @ts-ignore */
24811
+ ...(ngDevMode ? [{ debugName: "boundValue" }] : /* istanbul ignore next */ []));
24812
+ this.disabled = computed(() => Boolean(this.options()['disabled']), /* @ts-ignore */
24813
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
24838
24814
  }
24839
24815
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCronJobWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
24840
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPCronJobWidgetEditComponent, isStandalone: true, selector: "axp-cron-job-widget-edit", usesInheritance: true, ngImport: i0, template: `<ax-cron-job-container [ngModel]="expreesion()"> </ax-cron-job-container>`, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXCronJobModule }, { kind: "component", type: i1$l.AXCronJobContainerComponent, selector: "ax-cron-job-container", outputs: ["onValueChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24816
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPCronJobWidgetEditComponent, isStandalone: true, selector: "axp-cron-job-widget-edit", host: { classAttribute: "block flex-1" }, usesInheritance: true, ngImport: i0, template: `
24817
+ <axp-cron-expression-editor
24818
+ [value]="boundValue()"
24819
+ [disabled]="disabled()"
24820
+ (valueChange)="setValue($event)"
24821
+ ></axp-cron-expression-editor>
24822
+ `, isInline: true, dependencies: [{ kind: "component", type: AXPCronExpressionEditorComponent, selector: "axp-cron-expression-editor", inputs: ["value", "disabled"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24841
24823
  }
24842
24824
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCronJobWidgetEditComponent, decorators: [{
24843
24825
  type: Component,
24844
24826
  args: [{
24845
24827
  selector: 'axp-cron-job-widget-edit',
24846
- template: `<ax-cron-job-container [ngModel]="expreesion()"> </ax-cron-job-container>`,
24828
+ template: `
24829
+ <axp-cron-expression-editor
24830
+ [value]="boundValue()"
24831
+ [disabled]="disabled()"
24832
+ (valueChange)="setValue($event)"
24833
+ ></axp-cron-expression-editor>
24834
+ `,
24847
24835
  changeDetection: ChangeDetectionStrategy.OnPush,
24848
- imports: [FormsModule, AXCronJobModule],
24836
+ imports: [AXPCronExpressionEditorComponent],
24837
+ host: { class: 'block flex-1' },
24849
24838
  }]
24850
24839
  }] });
24851
24840
 
@@ -24854,21 +24843,78 @@ var cronJobWidgetEdit_component = /*#__PURE__*/Object.freeze({
24854
24843
  AXPCronJobWidgetEditComponent: AXPCronJobWidgetEditComponent
24855
24844
  });
24856
24845
 
24846
+ //#region ----- Imports -----
24847
+ //#endregion
24848
+ //#region ----- Component -----
24857
24849
  class AXPCronJobWidgetViewComponent extends AXPValueWidgetComponent {
24858
24850
  constructor() {
24859
24851
  super(...arguments);
24860
- this.internalValue = computed(() => this.getValue(), /* @ts-ignore */
24861
- ...(ngDevMode ? [{ debugName: "internalValue" }] : /* istanbul ignore next */ []));
24852
+ //#region ----- Services & Dependencies -----
24853
+ this.display = inject(AXPCronExpressionDisplayService);
24854
+ //#endregion
24855
+ //#region ----- State Signals -----
24856
+ this.summary = signal('', /* @ts-ignore */
24857
+ ...(ngDevMode ? [{ debugName: "summary" }] : /* istanbul ignore next */ []));
24858
+ this.rawExpression = signal('', /* @ts-ignore */
24859
+ ...(ngDevMode ? [{ debugName: "rawExpression" }] : /* istanbul ignore next */ []));
24860
+ //#endregion
24861
+ //#region ----- Lifecycle -----
24862
+ this.#describe = effect(() => {
24863
+ const raw = normalizeCronExpression(this.getValue());
24864
+ this.rawExpression.set(raw);
24865
+ void this.refreshSummary(raw);
24866
+ }, /* @ts-ignore */
24867
+ ...(ngDevMode ? [{ debugName: "#describe" }] : /* istanbul ignore next */ []));
24868
+ }
24869
+ //#endregion
24870
+ //#region ----- Lifecycle -----
24871
+ #describe;
24872
+ //#endregion
24873
+ //#region ----- Private helpers -----
24874
+ async refreshSummary(raw) {
24875
+ this.summary.set(raw ? await this.display.describe(raw) : '');
24862
24876
  }
24863
24877
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCronJobWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
24864
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPCronJobWidgetViewComponent, isStandalone: true, selector: "axp-cron-job-widget-view", usesInheritance: true, ngImport: i0, template: `<p>{{ internalValue() }}</p>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24878
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPCronJobWidgetViewComponent, isStandalone: true, selector: "axp-cron-job-widget-view", host: { classAttribute: "inline-block" }, usesInheritance: true, ngImport: i0, template: `
24879
+ <div class="flex flex-col gap-0.5 p-2">
24880
+ @if (summary()) {
24881
+ <!-- ----- Human-readable cron summary ----- -->
24882
+ <ax-label class="text-sm">{{ summary() }}</ax-label>
24883
+ }
24884
+ <!-- ----- Fallback when no expression is stored ----- -->
24885
+ @else {
24886
+ <ax-label class="text-sm text-muted">---</ax-label>
24887
+ }
24888
+ @if (rawExpression()) {
24889
+ <!-- ----- Raw unix cron ----- -->
24890
+ <ax-label class="text-xs text-muted font-mono" dir="ltr">{{ rawExpression() }}</ax-label>
24891
+ }
24892
+ </div>
24893
+ `, isInline: true, dependencies: [{ kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24865
24894
  }
24866
24895
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCronJobWidgetViewComponent, decorators: [{
24867
24896
  type: Component,
24868
24897
  args: [{
24869
24898
  selector: 'axp-cron-job-widget-view',
24870
- template: `<p>{{ internalValue() }}</p>`,
24899
+ template: `
24900
+ <div class="flex flex-col gap-0.5 p-2">
24901
+ @if (summary()) {
24902
+ <!-- ----- Human-readable cron summary ----- -->
24903
+ <ax-label class="text-sm">{{ summary() }}</ax-label>
24904
+ }
24905
+ <!-- ----- Fallback when no expression is stored ----- -->
24906
+ @else {
24907
+ <ax-label class="text-sm text-muted">---</ax-label>
24908
+ }
24909
+ @if (rawExpression()) {
24910
+ <!-- ----- Raw unix cron ----- -->
24911
+ <ax-label class="text-xs text-muted font-mono" dir="ltr">{{ rawExpression() }}</ax-label>
24912
+ }
24913
+ </div>
24914
+ `,
24871
24915
  changeDetection: ChangeDetectionStrategy.OnPush,
24916
+ imports: [AXLabelComponent],
24917
+ host: { class: 'inline-block' },
24872
24918
  }]
24873
24919
  }] });
24874
24920
 
@@ -24880,6 +24926,7 @@ var cronJobWidgetView_component = /*#__PURE__*/Object.freeze({
24880
24926
  const AXPCronJobWidget = {
24881
24927
  name: 'cron-job',
24882
24928
  title: '@platform-layout-widgets:widgets.cron-job.title',
24929
+ description: '@platform-layout-widgets:widgets.cron-job.description',
24883
24930
  icon: 'fa-light fa-alarm-clock',
24884
24931
  categories: [AXP_WIDGETS_ADVANCE_CATEGORY],
24885
24932
  subCategory: AXP_WIDGETS_ADVANCE_SUB_INPUT,
@@ -24897,7 +24944,7 @@ const AXPCronJobWidget = {
24897
24944
  component: () => Promise.resolve().then(function () { return cronJobWidgetColumn_component; }).then((c) => c.AXPCronJobWidgetColumnComponent),
24898
24945
  },
24899
24946
  designer: {
24900
- component: () => Promise.resolve().then(function () { return cronJobWidgetDesigner_component; }).then((c) => c.AXPCronJobWidgetDesignerComponent),
24947
+ component: () => Promise.resolve().then(function () { return cronJobWidgetEdit_component; }).then((c) => c.AXPCronJobWidgetEditComponent),
24901
24948
  },
24902
24949
  },
24903
24950
  };
@@ -26466,7 +26513,7 @@ class AXPListToolbarWidgetViewComponent extends AXPValueWidgetComponent {
26466
26513
  }
26467
26514
  }
26468
26515
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPListToolbarWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
26469
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPListToolbarWidgetViewComponent, isStandalone: true, selector: "axp-list-toolbar-widget-view", viewQueries: [{ propertyName: "listDisplayModePopover", first: true, predicate: ["listDisplayModePopover"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"flex items-center gap-2 border-b border-light w-full\">\n @if (canFilter()) {\n <axp-query-filters\n class=\"min-w-0 flex-1\"\n [filtersDefinitions]=\"filterDefinitions()\"\n [initialFilters]=\"initialFilters()\"\n (onFiltersChanged)=\"onFiltersChanged($event)\"\n ></axp-query-filters>\n }\n <div class=\"ms-auto flex shrink-0 items-center gap-1 md:gap-2\">\n @if (filterTriggerMode() === 'manual' && isFiltersDirty()) {\n <ax-button\n [title]=\"'@general:actions.apply.title'\"\n [iconOnly]=\"true\"\n #filterButton\n [color]=\"'primary'\"\n (onClick)=\"applyFilters()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-search\"></i>\n </ax-prefix>\n </ax-button>\n }\n @if (showColumnsControl()) {\n <ax-button [iconOnly]=\"true\" #columnButton [color]=\"'default'\">\n <i class=\"fa-light fa-table-columns\"></i>\n </ax-button>\n <ax-popover\n [adaptivityEnabled]=\"true\"\n [offsetY]=\"30\"\n [target]=\"columnButton\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n #popover\n >\n <div class=\"lightest-surface shadow-md border md:w-72 w-full rounded-md\">\n <ax-header class=\"border-b lighter-surface rounded-t-md p-4 font-bold\">\n {{ '@general:terms.common.columns' | translate | async }}\n </ax-header>\n <div class=\"py-2 px-4\">\n <axp-query-columns\n [columns]=\"columnDefinitions()\"\n (columnsChange)=\"onColumnsChanged($event)\"\n ></axp-query-columns>\n </div>\n </div>\n </ax-popover>\n }\n @if (canSort()) {\n <ax-button [iconOnly]=\"true\" [text]=\"'Sorts'\" #sortButton [color]=\"'default'\">\n <i class=\"fa-light fa-sort-amount-up\"></i>\n </ax-button>\n <ax-popover\n [adaptivityEnabled]=\"true\"\n [offsetY]=\"10\"\n [target]=\"sortButton\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n #popover\n >\n <div class=\"lightest-surface shadow-md border md:w-72 w-full rounded-md\">\n <ax-header class=\"border-b lighter-surface rounded-t-md p-4 font-bold\">\n {{ '@general:terms.common.sorts' | translate | async }}\n </ax-header>\n <div class=\"py-2 px-4\">\n <axp-query-sorts\n [sortDefinitions]=\"sortDefinitions()\"\n (sortQueriesChange)=\"onSortsChanged($event)\"\n [initialSortQueries]=\"initialSorts()\"\n ></axp-query-sorts>\n </div>\n </div>\n </ax-popover>\n }\n @if (showListDisplayModeControl()) {\n <div>\n <ax-button [iconOnly]=\"true\" #listDisplayButton [color]=\"'default'\">\n <i [class]=\"listDisplayModeButtonIcon()\"></i>\n </ax-button>\n <ax-popover\n [adaptivityEnabled]=\"true\"\n [offsetY]=\"10\"\n [target]=\"listDisplayButton\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n #listDisplayModePopover\n >\n <div class=\"lightest-surface shadow-md border md:w-72 w-full rounded-md\">\n <ax-header class=\"border-b lighter-surface rounded-t-md p-4 font-bold\">\n {{ '@general:terms.interface.list-display' | translate | async }}\n </ax-header>\n <div class=\"py-2 px-2\">\n <ax-button-item-list>\n @if (hasTableListDisplayOption()) {\n <ax-button-item\n [text]=\"('@general:terms.interface.table-view' | translate | async)!\"\n [selected]=\"listDisplayMode() === 'table'\"\n (onClick)=\"setListDisplayMode('table')\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-table\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n @if (hasTableListDisplayOption() && (hasCardListDisplayOption() || hasRowListDisplayOption())) {\n <ax-divider />\n }\n @if (hasCardListDisplayOption()) {\n <!-- ----- Card grid presentation ----- -->\n <ax-button-item\n [text]=\"('@general:terms.interface.card-view' | translate | async)!\"\n [selected]=\"listDisplayMode() === 'card'\"\n (onClick)=\"setListDisplayMode('card')\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-grid-2\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n @if (hasRowListDisplayOption()) {\n <!-- ----- Horizontal row-list presentation ----- -->\n <ax-button-item\n [text]=\"('@general:terms.interface.row-view' | translate | async)!\"\n [selected]=\"listDisplayMode() === 'row'\"\n (onClick)=\"setListDisplayMode('row')\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-grip-lines\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </div>\n </div>\n </ax-popover>\n </div>\n }\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i1$1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1$1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPQueryFiltersComponent, selector: "axp-query-filters", inputs: ["filtersDefinitions", "initialFilters", "quickSearch"], outputs: ["onFiltersChanged"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i3$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: AXPQuerySortsComponent, selector: "axp-query-sorts", inputs: ["sortDefinitions", "initialSortQueries"], outputs: ["sortDefinitionsChange", "sortQueriesChange"] }, { kind: "component", type: AXPQueryColumnsComponent, selector: "axp-query-columns", inputs: ["columns"], outputs: ["columnsChange"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26516
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPListToolbarWidgetViewComponent, isStandalone: true, selector: "axp-list-toolbar-widget-view", viewQueries: [{ propertyName: "listDisplayModePopover", first: true, predicate: ["listDisplayModePopover"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"flex items-center gap-2 border-b border-light w-full\">\n @if (canFilter()) {\n <axp-query-filters\n class=\"min-w-0 flex-1\"\n [filtersDefinitions]=\"filterDefinitions()\"\n [initialFilters]=\"initialFilters()\"\n (onFiltersChanged)=\"onFiltersChanged($event)\"\n ></axp-query-filters>\n }\n <div class=\"ms-auto flex shrink-0 items-center gap-1 md:gap-2\">\n @if (filterTriggerMode() === 'manual' && isFiltersDirty()) {\n <ax-button\n [title]=\"'@general:actions.apply.title'\"\n [iconOnly]=\"true\"\n #filterButton\n [color]=\"'primary'\"\n (onClick)=\"applyFilters()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-search\"></i>\n </ax-prefix>\n </ax-button>\n }\n @if (showColumnsControl()) {\n <ax-button [iconOnly]=\"true\" #columnButton [color]=\"'default'\">\n <i class=\"fa-light fa-table-columns\"></i>\n </ax-button>\n <ax-popover\n [adaptivityEnabled]=\"true\"\n [offsetY]=\"30\"\n [target]=\"columnButton\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n #popover\n >\n <div class=\"lightest-surface shadow-md border md:w-72 w-full rounded-md\">\n <ax-header class=\"border-b lighter-surface rounded-t-md p-4 font-bold\">\n {{ '@general:terms.common.columns' | translate | async }}\n </ax-header>\n <div class=\"py-2 px-4\">\n <axp-query-columns\n [columns]=\"columnDefinitions()\"\n (columnsChange)=\"onColumnsChanged($event)\"\n ></axp-query-columns>\n </div>\n </div>\n </ax-popover>\n }\n @if (canSort()) {\n <ax-button [iconOnly]=\"true\" [text]=\"'Sorts'\" #sortButton [color]=\"'default'\">\n <i class=\"fa-light fa-sort-amount-up\"></i>\n </ax-button>\n <ax-popover\n [adaptivityEnabled]=\"true\"\n [offsetY]=\"10\"\n [target]=\"sortButton\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n #popover\n >\n <div class=\"lightest-surface shadow-md border md:w-72 w-full rounded-md\">\n <ax-header class=\"border-b lighter-surface rounded-t-md p-4 font-bold\">\n {{ '@general:terms.common.sorts' | translate | async }}\n </ax-header>\n <div class=\"py-2 px-4\">\n <axp-query-sorts\n [sortDefinitions]=\"sortDefinitions()\"\n (sortQueriesChange)=\"onSortsChanged($event)\"\n [initialSortQueries]=\"initialSorts()\"\n ></axp-query-sorts>\n </div>\n </div>\n </ax-popover>\n }\n @if (showListDisplayModeControl()) {\n <div>\n <ax-button [iconOnly]=\"true\" #listDisplayButton [color]=\"'default'\">\n <i [class]=\"listDisplayModeButtonIcon()\"></i>\n </ax-button>\n <ax-popover\n [adaptivityEnabled]=\"true\"\n [offsetY]=\"10\"\n [target]=\"listDisplayButton\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n #listDisplayModePopover\n >\n <div class=\"lightest-surface shadow-md border md:w-72 w-full rounded-md\">\n <ax-header class=\"border-b lighter-surface rounded-t-md p-4 font-bold\">\n {{ '@general:terms.interface.list-display' | translate | async }}\n </ax-header>\n <div class=\"py-2 px-2\">\n <ax-button-item-list>\n @if (hasTableListDisplayOption()) {\n <ax-button-item\n [text]=\"('@general:terms.interface.table-view' | translate | async)!\"\n [selected]=\"listDisplayMode() === 'table'\"\n (onClick)=\"setListDisplayMode('table')\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-table\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n @if (hasTableListDisplayOption() && (hasCardListDisplayOption() || hasRowListDisplayOption())) {\n <ax-divider />\n }\n @if (hasCardListDisplayOption()) {\n <!-- ----- Card grid presentation ----- -->\n <ax-button-item\n [text]=\"('@general:terms.interface.card-view' | translate | async)!\"\n [selected]=\"listDisplayMode() === 'card'\"\n (onClick)=\"setListDisplayMode('card')\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-grid-2\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n @if (hasRowListDisplayOption()) {\n <!-- ----- Horizontal row-list presentation ----- -->\n <ax-button-item\n [text]=\"('@general:terms.interface.row-view' | translate | async)!\"\n [selected]=\"listDisplayMode() === 'row'\"\n (onClick)=\"setListDisplayMode('row')\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-grip-lines\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n </ax-button-item-list>\n </div>\n </div>\n </ax-popover>\n </div>\n }\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: i1$1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1$1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPQueryFiltersComponent, selector: "axp-query-filters", inputs: ["filtersDefinitions", "initialFilters", "quickSearch"], outputs: ["onFiltersChanged"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i3$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: AXPQuerySortsComponent, selector: "axp-query-sorts", inputs: ["sortDefinitions", "initialSortQueries"], outputs: ["sortDefinitionsChange", "sortQueriesChange"] }, { kind: "component", type: AXPQueryColumnsComponent, selector: "axp-query-columns", inputs: ["columns"], outputs: ["columnsChange"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26470
26517
  }
26471
26518
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPListToolbarWidgetViewComponent, decorators: [{
26472
26519
  type: Component,
@@ -27233,7 +27280,7 @@ class AXPTabularDataWidgetEditComponent extends AXPValueWidgetComponent {
27233
27280
  this.platform = inject(AXPlatform);
27234
27281
  }
27235
27282
  async openPopup() {
27236
- const { AXPTabularDataPopupComponent } = await import('./acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-CRST84ou.mjs');
27283
+ const { AXPTabularDataPopupComponent } = await import('./acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-TWxthl21.mjs');
27237
27284
  const popupData = await this.popupService.open(AXPTabularDataPopupComponent, {
27238
27285
  size: this.platform.is('Mobile') || this.platform.is('SM') ? 'full' : this.columns().length > 3 ? 'lg' : 'md',
27239
27286
  header: true,
@@ -27285,7 +27332,7 @@ class AXPTabularDataEditorWidgetViewComponent extends AXPValueWidgetComponent {
27285
27332
  this.columns = this.options()['columns'];
27286
27333
  }
27287
27334
  async openPopup() {
27288
- const { AXPTabularDataPopupComponent } = await import('./acorex-platform-framework-client-layout-widgets-tabular-data-view-popup.component-FjtSRxIX.mjs');
27335
+ const { AXPTabularDataPopupComponent } = await import('./acorex-platform-framework-client-layout-widgets-tabular-data-view-popup.component-D7P08nHH.mjs');
27289
27336
  this.popupService.open(AXPTabularDataPopupComponent, {
27290
27337
  size: this.platform.is('Mobile') || this.platform.is('SM') ? 'full' : 'md',
27291
27338
  header: true,
@@ -27445,8 +27492,8 @@ class AXPTimerDurationWidgetEditComponent extends AXPValueWidgetComponent {
27445
27492
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTimerDurationWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
27446
27493
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPTimerDurationWidgetEditComponent, isStandalone: true, selector: "axp-time-duration-widget-edit", usesInheritance: true, ngImport: i0, template: `
27447
27494
  @if (filterMode()) {
27448
- <div class="ax-flex ax-items-center" [class.ax-gap-2]="operationsMenuVisible()">
27449
- <div class="ax-flex-1">
27495
+ <div class="flex items-center" [class.gap-2]="operationsMenuVisible()">
27496
+ <div class="flex-1">
27450
27497
  <ax-time-duration
27451
27498
  [ngModel]="filterEditorValue()"
27452
27499
  (onValueChanged)="handleFilterValueChange($event)"
@@ -27459,43 +27506,20 @@ class AXPTimerDurationWidgetEditComponent extends AXPValueWidgetComponent {
27459
27506
  [maskDigits]="maskDigits()"
27460
27507
  >
27461
27508
  @for (validation of validationRules(); track $index) {
27462
- <ax-validation-rule
27463
- [rule]="validation.rule"
27464
- [message]="$safeNavigationMigration(validation.options?.message)"
27465
- [options]="validation.options"
27466
- ></ax-validation-rule>
27509
+ <ax-validation-rule [rule]="validation.rule" [message]="$safeNavigationMigration(validation.options?.message)" [options]="validation.options"></ax-validation-rule>
27467
27510
  }
27468
27511
  </ax-time-duration>
27469
27512
  </div>
27470
- <axp-filter-operations
27471
- [type]="'number'"
27472
- [operations]="operations()"
27473
- [selectedOperation]="operation().type"
27474
- (selectedOperationChange)="handleOperationChanged($event)"
27475
- ></axp-filter-operations>
27513
+ <axp-filter-operations [type]="'number'" [operations]="operations()" [selectedOperation]="operation().type" (selectedOperationChange)="handleOperationChanged($event)"></axp-filter-operations>
27476
27514
  </div>
27477
27515
  } @else {
27478
- <ax-time-duration
27479
- [ngModel]="getValue()"
27480
- (onValueChanged)="handleChangeValue($event)"
27481
- [valueStart]="from()"
27482
- [valueEnd]="to()"
27483
- [label]="label()"
27484
- [minValue]="minValue()"
27485
- [maxValue]="maxValue()"
27486
- [disabled]="disabled()"
27487
- [maskDigits]="maskDigits()"
27488
- >
27516
+ <ax-time-duration [ngModel]="getValue()" (onValueChanged)="handleChangeValue($event)" [valueStart]="from()" [valueEnd]="to()" [label]="label()" [minValue]="minValue()" [maxValue]="maxValue()" [disabled]="disabled()" [maskDigits]="maskDigits()">
27489
27517
  @for (validation of validationRules(); track $index) {
27490
- <ax-validation-rule
27491
- [rule]="validation.rule"
27492
- [message]="$safeNavigationMigration(validation.options?.message)"
27493
- [options]="validation.options"
27494
- ></ax-validation-rule>
27518
+ <ax-validation-rule [rule]="validation.rule" [message]="$safeNavigationMigration(validation.options?.message)" [options]="validation.options"></ax-validation-rule>
27495
27519
  }
27496
27520
  </ax-time-duration>
27497
27521
  }
27498
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXTimeDurationModule }, { kind: "component", type: i3$6.AXTimeDurationComponent, selector: "ax-time-duration", inputs: ["disabled", "tabIndex", "readonly", "look", "name", "valueStart", "valueEnd", "label", "maskDigits", "minValue", "maxValue"], outputs: ["onValueChanged"] }, { kind: "ngmodule", type: AXValidationModule }, { kind: "component", type: AXPFilterOperationsComponent, selector: "axp-filter-operations", inputs: ["selectedOperation", "type", "operations"], outputs: ["selectedOperationChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27522
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i3.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXTimeDurationModule }, { kind: "component", type: i3$7.AXTimeDurationComponent, selector: "ax-time-duration", inputs: ["disabled", "tabIndex", "readonly", "look", "name", "valueStart", "valueEnd", "label", "maskDigits", "minValue", "maxValue"], outputs: ["onValueChanged"] }, { kind: "ngmodule", type: AXValidationModule }, { kind: "component", type: AXPFilterOperationsComponent, selector: "axp-filter-operations", inputs: ["selectedOperation", "type", "operations"], outputs: ["selectedOperationChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27499
27523
  }
27500
27524
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTimerDurationWidgetEditComponent, decorators: [{
27501
27525
  type: Component,
@@ -27503,8 +27527,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
27503
27527
  selector: 'axp-time-duration-widget-edit',
27504
27528
  template: `
27505
27529
  @if (filterMode()) {
27506
- <div class="ax-flex ax-items-center" [class.ax-gap-2]="operationsMenuVisible()">
27507
- <div class="ax-flex-1">
27530
+ <div class="flex items-center" [class.gap-2]="operationsMenuVisible()">
27531
+ <div class="flex-1">
27508
27532
  <ax-time-duration
27509
27533
  [ngModel]="filterEditorValue()"
27510
27534
  (onValueChanged)="handleFilterValueChange($event)"
@@ -27517,39 +27541,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
27517
27541
  [maskDigits]="maskDigits()"
27518
27542
  >
27519
27543
  @for (validation of validationRules(); track $index) {
27520
- <ax-validation-rule
27521
- [rule]="validation.rule"
27522
- [message]="$safeNavigationMigration(validation.options?.message)"
27523
- [options]="validation.options"
27524
- ></ax-validation-rule>
27544
+ <ax-validation-rule [rule]="validation.rule" [message]="$safeNavigationMigration(validation.options?.message)" [options]="validation.options"></ax-validation-rule>
27525
27545
  }
27526
27546
  </ax-time-duration>
27527
27547
  </div>
27528
- <axp-filter-operations
27529
- [type]="'number'"
27530
- [operations]="operations()"
27531
- [selectedOperation]="operation().type"
27532
- (selectedOperationChange)="handleOperationChanged($event)"
27533
- ></axp-filter-operations>
27548
+ <axp-filter-operations [type]="'number'" [operations]="operations()" [selectedOperation]="operation().type" (selectedOperationChange)="handleOperationChanged($event)"></axp-filter-operations>
27534
27549
  </div>
27535
27550
  } @else {
27536
- <ax-time-duration
27537
- [ngModel]="getValue()"
27538
- (onValueChanged)="handleChangeValue($event)"
27539
- [valueStart]="from()"
27540
- [valueEnd]="to()"
27541
- [label]="label()"
27542
- [minValue]="minValue()"
27543
- [maxValue]="maxValue()"
27544
- [disabled]="disabled()"
27545
- [maskDigits]="maskDigits()"
27546
- >
27551
+ <ax-time-duration [ngModel]="getValue()" (onValueChanged)="handleChangeValue($event)" [valueStart]="from()" [valueEnd]="to()" [label]="label()" [minValue]="minValue()" [maxValue]="maxValue()" [disabled]="disabled()" [maskDigits]="maskDigits()">
27547
27552
  @for (validation of validationRules(); track $index) {
27548
- <ax-validation-rule
27549
- [rule]="validation.rule"
27550
- [message]="$safeNavigationMigration(validation.options?.message)"
27551
- [options]="validation.options"
27552
- ></ax-validation-rule>
27553
+ <ax-validation-rule [rule]="validation.rule" [message]="$safeNavigationMigration(validation.options?.message)" [options]="validation.options"></ax-validation-rule>
27553
27554
  }
27554
27555
  </ax-time-duration>
27555
27556
  }
@@ -27729,13 +27730,27 @@ class AXPBooleanFilterWidgetEditComponent extends AXPValueWidgetComponent {
27729
27730
  }, /* @ts-ignore */
27730
27731
  ...(ngDevMode ? [{ debugName: "#effect" }] : /* istanbul ignore next */ []));
27731
27732
  }
27733
+ /**
27734
+ * Lookup may skip `onValueChanged` on the first pick (`#lastValue === undefined`).
27735
+ * `onItemSelected` always fires from `handleSinglePick`.
27736
+ */
27737
+ handleItemSelected(e) {
27738
+ const text = e.item?.['text'];
27739
+ this.commitSelection(e.item?.['value'], typeof text === 'string' ? text : undefined);
27740
+ }
27732
27741
  handleValueChange(e) {
27733
- if (e.isUserInteraction) {
27734
- this.setValue({
27735
- value: e.value,
27736
- operation: this.negative() ? { type: 'notEqual' } : { type: 'equal' },
27737
- });
27742
+ this.commitSelection(e.value);
27743
+ }
27744
+ commitSelection(value, displayText) {
27745
+ if (typeof value !== 'boolean') {
27746
+ return;
27738
27747
  }
27748
+ const item = this.items.find((c) => c.value === value);
27749
+ this.setValue({
27750
+ value,
27751
+ operation: this.negative() ? { type: 'notEqual' } : { type: 'equal' },
27752
+ displayText: displayText ?? item?.text,
27753
+ });
27739
27754
  }
27740
27755
  #effect;
27741
27756
  focus() {
@@ -27753,11 +27768,12 @@ class AXPBooleanFilterWidgetEditComponent extends AXPValueWidgetComponent {
27753
27768
  [placeholder]="('@general:actions.select.title' | translate | async) ?? ''"
27754
27769
  [dataSource]="dataSource"
27755
27770
  [ngModel]="value()"
27771
+ (onItemSelected)="handleItemSelected($event)"
27756
27772
  (onValueChanged)="handleValueChange($event)"
27757
27773
  >
27758
27774
  </ax-lookup>
27759
27775
  </div>
27760
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXDecoratorModule }, { 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", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27776
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXDecoratorModule }, { 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: AXTranslationModule }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27761
27777
  }
27762
27778
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPBooleanFilterWidgetEditComponent, decorators: [{
27763
27779
  type: Component,
@@ -27773,6 +27789,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
27773
27789
  [placeholder]="('@general:actions.select.title' | translate | async) ?? ''"
27774
27790
  [dataSource]="dataSource"
27775
27791
  [ngModel]="value()"
27792
+ (onItemSelected)="handleItemSelected($event)"
27776
27793
  (onValueChanged)="handleValueChange($event)"
27777
27794
  >
27778
27795
  </ax-lookup>
@@ -28131,7 +28148,7 @@ class AXPStatusFilterWidgetEditComponent extends AXPDataListWidgetComponent {
28131
28148
  <ax-clear-button></ax-clear-button>
28132
28149
  </ax-lookup>
28133
28150
  </div>
28134
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28151
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28135
28152
  }
28136
28153
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPStatusFilterWidgetEditComponent, decorators: [{
28137
28154
  type: Component,
@@ -28452,7 +28469,7 @@ class AXPAlertBoxWidgetViewComponent extends AXPLayoutBaseWidgetComponent {
28452
28469
  <div [innerHTML]="innerContent()"></div>
28453
28470
  </ax-content>
28454
28471
  </ax-alert>
28455
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "ngmodule", type: AXAlertModule }, { kind: "component", type: i1$m.AXAlertComponent, selector: "ax-alert", inputs: ["color", "timeOut"], outputs: ["colorChange", "onClosed", "timeOutChange"] }, { 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" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28472
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "ngmodule", type: AXAlertModule }, { kind: "component", type: i1$j.AXAlertComponent, selector: "ax-alert", inputs: ["color", "timeOut"], outputs: ["colorChange", "onClosed", "timeOutChange"] }, { 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" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28456
28473
  }
28457
28474
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAlertBoxWidgetViewComponent, decorators: [{
28458
28475
  type: Component,
@@ -28516,7 +28533,7 @@ class AXPAlertBoxWidgetDesignerComponent extends AXPLayoutBaseWidgetComponent {
28516
28533
  <div [innerHTML]="innerContent()"></div>
28517
28534
  </ax-content>
28518
28535
  </ax-alert>
28519
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "ngmodule", type: AXAlertModule }, { kind: "component", type: i1$m.AXAlertComponent, selector: "ax-alert", inputs: ["color", "timeOut"], outputs: ["colorChange", "onClosed", "timeOutChange"] }, { 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" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28536
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "ngmodule", type: AXAlertModule }, { kind: "component", type: i1$j.AXAlertComponent, selector: "ax-alert", inputs: ["color", "timeOut"], outputs: ["colorChange", "onClosed", "timeOutChange"] }, { 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" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28520
28537
  }
28521
28538
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAlertBoxWidgetDesignerComponent, decorators: [{
28522
28539
  type: Component,
@@ -30138,7 +30155,7 @@ class AXPPanelWidgetDesignerComponent extends AXPLayoutBaseWidgetComponent {
30138
30155
  }
30139
30156
  </ax-accordion-item>
30140
30157
  </ax-accordion-group>
30141
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "ngmodule", type: AXAccordionModule }, { kind: "component", type: i1$n.AXAccordionItemComponent, selector: "ax-accordion-item", inputs: ["isCollapsed", "icon", "textdecoration", "caption", "isLoading", "headerTemplate", "look", "disabled"], outputs: ["isCollapsedChange", "isLoadingChange", "onClick"] }, { kind: "component", type: i1$n.AXAccordionGroupComponent, selector: "ax-accordion-group", inputs: ["accordion", "activeIndex", "look", "collapsedOnItemClick"], outputs: ["activeIndexChange"] }, { kind: "directive", type: AXPWidgetDesignerRendererDirective, selector: "[axp-widget-designer-renderer]", inputs: ["parentNode", "parentElement", "parentComponent", "index", "locked", "mode", "node"] }, { kind: "component", type: AXPDesignerAddWidgetMiniButtonComponent, selector: "axp-designer-add-widget-mini-button", outputs: ["onClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
30158
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "ngmodule", type: AXAccordionModule }, { kind: "component", type: i1$k.AXAccordionItemComponent, selector: "ax-accordion-item", inputs: ["isCollapsed", "icon", "textdecoration", "caption", "isLoading", "headerTemplate", "look", "disabled"], outputs: ["isCollapsedChange", "isLoadingChange", "onClick"] }, { kind: "component", type: i1$k.AXAccordionGroupComponent, selector: "ax-accordion-group", inputs: ["accordion", "activeIndex", "look", "collapsedOnItemClick"], outputs: ["activeIndexChange"] }, { kind: "directive", type: AXPWidgetDesignerRendererDirective, selector: "[axp-widget-designer-renderer]", inputs: ["parentNode", "parentElement", "parentComponent", "index", "locked", "mode", "node"] }, { kind: "component", type: AXPDesignerAddWidgetMiniButtonComponent, selector: "axp-designer-add-widget-mini-button", outputs: ["onClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
30142
30159
  }
30143
30160
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPPanelWidgetDesignerComponent, decorators: [{
30144
30161
  type: Component,
@@ -30240,7 +30257,7 @@ class AXPPanelWidgetViewComponent extends AXPLayoutBaseWidgetComponent {
30240
30257
  }
30241
30258
  </ax-accordion-item>
30242
30259
  </ax-accordion-group>
30243
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: i1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "ngmodule", type: AXAccordionModule }, { kind: "component", type: i1$n.AXAccordionItemComponent, selector: "ax-accordion-item", inputs: ["isCollapsed", "icon", "textdecoration", "caption", "isLoading", "headerTemplate", "look", "disabled"], outputs: ["isCollapsedChange", "isLoadingChange", "onClick"] }, { kind: "component", type: i1$n.AXAccordionGroupComponent, selector: "ax-accordion-group", inputs: ["accordion", "activeIndex", "look", "collapsedOnItemClick"], outputs: ["activeIndexChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
30260
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: i1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "ngmodule", type: AXAccordionModule }, { kind: "component", type: i1$k.AXAccordionItemComponent, selector: "ax-accordion-item", inputs: ["isCollapsed", "icon", "textdecoration", "caption", "isLoading", "headerTemplate", "look", "disabled"], outputs: ["isCollapsedChange", "isLoadingChange", "onClick"] }, { kind: "component", type: i1$k.AXAccordionGroupComponent, selector: "ax-accordion-group", inputs: ["accordion", "activeIndex", "look", "collapsedOnItemClick"], outputs: ["activeIndexChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
30244
30261
  }
30245
30262
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPPanelWidgetViewComponent, decorators: [{
30246
30263
  type: Component,
@@ -30488,7 +30505,7 @@ class AXPTabSetWidgetViewComponent extends AXPLayoutBaseWidgetComponent {
30488
30505
  </div>
30489
30506
  }
30490
30507
  </div>
30491
- `, isInline: true, styles: [":host.vertical{display:flex;width:100%;flex-direction:row}:host.vertical .content{display:block;width:100%}:host.horizontal{display:flex;width:100%;flex-direction:column}:host.horizontal .content{margin-top:calc(var(--spacing, .25rem) * 4);display:block;width:100%}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXTabsModule }, { kind: "component", type: i5.AXTabsComponent, selector: "ax-tabs", inputs: ["look", "location", "fitParent", "minWidth", "content"], outputs: ["onActiveTabChanged"] }, { kind: "component", type: i5.AXTabItemComponent, selector: "ax-tab-item", inputs: ["disabled", "text", "key", "headerTemplate", "active"], outputs: ["disabledChange", "onClick", "onBlur", "onFocus", "activeChange"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: i1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
30508
+ `, isInline: true, styles: [":host.vertical{display:flex;width:100%;flex-direction:row}:host.vertical .content{display:block;width:100%}:host.horizontal{display:flex;width:100%;flex-direction:column}:host.horizontal .content{margin-top:calc(var(--spacing, .25rem) * 4);display:block;width:100%}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXTabsModule }, { kind: "component", type: i5.AXTabsComponent, selector: "ax-tabs", inputs: ["look", "location", "reorderable", "reorderDelay", "fitParent", "minWidth", "content"], outputs: ["onActiveTabChanged", "onTabsReordered"] }, { kind: "component", type: i5.AXTabItemComponent, selector: "ax-tab-item", inputs: ["disabled", "text", "key", "headerTemplate", "active"], outputs: ["disabledChange", "onClick", "onBlur", "onFocus", "activeChange"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "directive", type: i1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
30492
30509
  }
30493
30510
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTabSetWidgetViewComponent, decorators: [{
30494
30511
  type: Component,
@@ -31140,7 +31157,7 @@ class AXPTriggersWidgetEditComponent extends AXPValueWidgetComponent {
31140
31157
  </div>
31141
31158
  }
31142
31159
  </div>
31143
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "titleParams", "descriptionParams", "look"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31160
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "titleParams", "descriptionParams", "look"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31144
31161
  }
31145
31162
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTriggersWidgetEditComponent, decorators: [{
31146
31163
  type: Component,
@@ -31330,7 +31347,7 @@ class AXPTriggerExpressionEditorPopupComponent extends AXBasePageComponent {
31330
31347
  ></ax-button>
31331
31348
  </ax-suffix>
31332
31349
  </ax-footer>
31333
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXCodeEditorModule }, { kind: "component", type: i1$c.AXCodeEditorComponent, selector: "ax-code-editor", inputs: ["disabled", "value", "state", "name", "id", "language", "readonly", "placeholder", "lineNumbers", "lineWrapping", "tabSize", "indentWithTab", "theme", "extensions", "ariaLabel", "focusOnReady", "formatOnSave", "minRow", "customCompletions"], outputs: ["onValueChanged", "valueChange", "stateChange", "readonlyChange", "disabledChange", "ready", "save"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31350
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: AXCodeEditorModule }, { kind: "component", type: i1$c.AXCodeEditorComponent, selector: "ax-code-editor", inputs: ["disabled", "value", "state", "name", "id", "language", "readonly", "placeholder", "lineNumbers", "lineWrapping", "tabSize", "indentWithTab", "theme", "extensions", "ariaLabel", "focusOnReady", "formatOnSave", "minRow", "customCompletions"], outputs: ["onValueChanged", "valueChange", "stateChange", "readonlyChange", "disabledChange", "ready", "save"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31334
31351
  }
31335
31352
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTriggerExpressionEditorPopupComponent, decorators: [{
31336
31353
  type: Component,
@@ -31428,7 +31445,6 @@ const REGISTERED_WIDGETS = [
31428
31445
  AXPQrcodeWidget,
31429
31446
  AXPSchedulerPickerWidget,
31430
31447
  AXPPasswordBoxWidget,
31431
- AXPGalleryWidget,
31432
31448
  AXPFileViewerWidget,
31433
31449
  AXPCodeEditorWidget,
31434
31450
  AXPJsonViewerWidget,
@@ -31560,7 +31576,6 @@ class AXPWidgetsModule {
31560
31576
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWidgetsModule, providers: [
31561
31577
  { provide: AXP_WIDGET_DEFINITION_PROVIDER, useClass: AXPCoreWidgetsProvider, multi: true },
31562
31578
  { provide: STRATEGY_CONFIG_TOKEN, useValue: DEFAULT_STRATEGY_CONFIG },
31563
- importProvidersFrom(AXMediaViewerModule.forRoot()),
31564
31579
  ...provideFileViewer(),
31565
31580
  //TODO convert dialogService to layoutBuilder saeed:
31566
31581
  provideQuerySetups([
@@ -31578,7 +31593,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
31578
31593
  providers: [
31579
31594
  { provide: AXP_WIDGET_DEFINITION_PROVIDER, useClass: AXPCoreWidgetsProvider, multi: true },
31580
31595
  { provide: STRATEGY_CONFIG_TOKEN, useValue: DEFAULT_STRATEGY_CONFIG },
31581
- importProvidersFrom(AXMediaViewerModule.forRoot()),
31582
31596
  ...provideFileViewer(),
31583
31597
  //TODO convert dialogService to layoutBuilder saeed:
31584
31598
  provideQuerySetups([
@@ -31970,5 +31984,5 @@ var getWidgetsForAi_query = /*#__PURE__*/Object.freeze({
31970
31984
  * Generated bundle index. Do not edit.
31971
31985
  */
31972
31986
 
31973
- export { AXPAdvancedGridItemWidget, AXPAdvancedGridItemWidgetDesignerComponent, AXPAdvancedGridItemWidgetViewComponent, AXPAdvancedGridOptionsWidget, AXPAdvancedGridOptionsWidgetEditComponent, AXPAdvancedGridWidget, AXPAdvancedGridWidgetDesignerComponent, AXPAdvancedGridWidgetViewComponent, AXPAvatarWidget, AXPAvatarWidgetColumnComponent, AXPAvatarWidgetDesignerComponent, AXPAvatarWidgetEditComponent, AXPAvatarWidgetViewComponent, AXPBetweenExpressionValidationWidget, AXPBetweenValidationWidgetEditComponent, AXPBlockWidget, AXPBlockWidgetDesignerComponent, AXPBlockWidgetViewComponent, AXPBorderWidget, AXPBorderWidgetEditComponent, AXPButtonWidget, AXPButtonWidgetColumnComponent, AXPButtonWidgetViewComponent, AXPCallbackValidationWidget, AXPCallbackValidationWidgetEditComponent, AXPCheckBoxWidget, AXPCheckBoxWidgetColumnComponent, AXPCheckBoxWidgetDesignerComponent, AXPCheckBoxWidgetEditComponent, AXPCheckBoxWidgetPrintComponent, AXPCheckBoxWidgetViewComponent, AXPCodeEditorWidget, AXPCodeEditorWidgetColumnComponent, AXPCodeEditorWidgetEditComponent, AXPCodeEditorWidgetViewComponent, AXPColorBoxWidget, AXPColorBoxWidgetColumnComponent, AXPColorBoxWidgetDesignerComponent, AXPColorBoxWidgetEditComponent, AXPColorBoxWidgetViewComponent, AXPColorChooserWidget, AXPColorChooserWidgetColumnComponent, AXPColorChooserWidgetDesignerComponent, AXPColorChooserWidgetEditComponent, AXPColorChooserWidgetViewComponent, AXPColorPaletteWidget, AXPColorPaletteWidgetColumnComponent, AXPColorPaletteWidgetDesignerComponent, AXPColorPaletteWidgetEditComponent, AXPColorPaletteWidgetViewComponent, AXPConditionBuilderWidget, AXPConditionBuilderWidgetEditComponent, AXPConditionBuilderWidgetViewComponent, AXPConnectedDragDropListsWidget, AXPConnectedListsWidgetColumnComponent, AXPConnectedListsWidgetEditComponent, AXPConnectedListsWidgetViewComponent, AXPContactWidget, AXPContactWidgetColumnComponent, AXPContactWidgetEditComponent, AXPContactWidgetViewComponent, AXPDataListWidget, AXPDataListWidgetViewComponent, AXPDataSourceOptionsWidget, AXPDataSourceOptionsWidgetEditComponent, AXPDateTimeBoxWidget, AXPDateTimeBoxWidgetColumnComponent, AXPDateTimeBoxWidgetEditComponent, AXPDateTimeBoxWidgetViewComponent, AXPDirectionWidget, AXPDirectionWidgetEditComponent, AXPDragDropListWidget, AXPEditorJsWidget, AXPEditorJsWidgetColumnComponent, AXPEditorJsWidgetEditComponent, AXPEditorJsWidgetViewComponent, AXPEqualValidationWidget, AXPEqualValidationWidgetEditComponent, AXPFieldsetWidget, AXPFieldsetWidgetDesignerComponent, AXPFieldsetWidgetViewComponent, AXPFileViewerWidget, AXPFileViewerWidgetEditComponent, AXPFileViewerWidgetViewComponent, AXPFlexItemOptionsWidget, AXPFlexItemOptionsWidgetEditComponent, AXPFlexItemWidget, AXPFlexItemWidgetDesignerComponent, AXPFlexItemWidgetViewComponent, AXPFlexOptionsWidget, AXPFlexOptionsWidgetEditComponent, AXPFlexWidget, AXPFlexWidgetDesignerComponent, AXPFlexWidgetViewComponent, AXPGalleryWidget, AXPGalleryWidgetEditComponent, AXPGalleryWidgetViewComponent, AXPGetWidgetsForAIQuery, AXPGreaterThanExpressionValidationWidget, AXPGreaterThanValidationWidgetEditComponent, AXPGridItemOptionsWidget, AXPGridItemOptionsWidgetEditComponent, AXPGridOptionsWidget, AXPGridOptionsWidgetEditComponent, AXPImageMarkerPopupComponent, AXPImageMarkerWidget, AXPImageMarkerWidgetColumnComponent, AXPImageMarkerWidgetEditComponent, AXPImageMarkerWidgetViewComponent, AXPIntegrationConnectionActionsService, AXPIntegrationConnectionsPanelWidget, AXPIntegrationConnectionsPanelWidgetEditComponent, AXPItemConfiguratorWidget, AXPItemConfiguratorWidgetColumnComponent, AXPItemConfiguratorWidgetEditComponent, AXPJsonViewerWidget, AXPJsonViewerWidgetEditComponent, AXPJsonViewerWidgetViewComponent, AXPLargeTextWidget, AXPLargeTextWidgetColumnComponent, AXPLargeTextWidgetEditComponent, AXPLargeTextWidgetPrintComponent, AXPLargeTextWidgetViewComponent, AXPLessThanExpressionValidationWidget, AXPLessThanValidationWidgetEditComponent, AXPListWidgetColumnComponent, AXPListWidgetEditComponent, AXPListWidgetViewComponent, AXPMapWidgetEditComponent, AXPMapWidgetViewComponent, AXPMaxLengthExpressionValidationWidget, AXPMaxLengthValidationWidgetEditComponent, AXPMinLengthExpressionValidationWidget, AXPMinLengthValidationWidgetEditComponent, AXPNodeRendererWidget, AXPNodeRendererWidgetEditComponent, AXPNodeRendererWidgetViewComponent, AXPNumberBoxWidget, AXPNumberBoxWidgetColumnComponent, AXPNumberBoxWidgetEditComponent, AXPNumberBoxWidgetPrintComponent, AXPNumberBoxWidgetViewComponent, AXPOutcomeResultsViewerWidget, AXPOutcomeResultsViewerWidgetViewComponent, AXPPageWidget, AXPPageWidgetViewComponent, AXPPasswordBoxWidget, AXPPasswordBoxWidgetColumnComponent, AXPPasswordBoxWidgetEditComponent, AXPPasswordBoxWidgetViewComponent, AXPProgressBarWidget, AXPProgressBarWidgetColumnComponent, AXPProgressBarWidgetEditComponent, AXPProgressBarWidgetViewComponent, AXPProviderSelectWidgetColumnComponent, AXPProviderSelectWidgetEditBase, AXPProviderSelectWidgetViewComponent, AXPQrcodeViewerService, AXPQrcodeWidget, AXPQrcodeWidgetColumnComponent, AXPQrcodeWidgetEditComponent, AXPQrcodeWidgetViewComponent, AXPRatePickerWidget, AXPRatePickerWidgetColumnComponent, AXPRatePickerWidgetEditComponent, AXPRatePickerWidgetViewComponent, AXPRegularExpressionValidationWidget, AXPRegularExpressionValidationWidgetEditComponent, AXPRepeaterWidget, AXPRepeaterWidgetDesignerComponent, AXPRepeaterWidgetEditComponent, AXPRepeaterWidgetViewComponent, AXPRequiredValidationWidget, AXPRequiredValidationWidgetEditComponent, AXPRichTextWidget, AXPRichTextWidgetColumnComponent, AXPRichTextWidgetEditComponent, AXPRichTextWidgetPrintComponent, AXPRichTextWidgetViewComponent, AXPSchedulerPickerWidget, AXPSchedulerPickerWidgetColumnComponent, AXPSchedulerPickerWidgetEditComponent, AXPSchedulerPickerWidgetViewComponent, AXPSelectBoxWidget, AXPSelectBoxWidgetColumnComponent, AXPSelectBoxWidgetEditComponent, AXPSelectBoxWidgetViewComponent, AXPSelectLanguagePopup, AXPSelectionListWidget, AXPSelectionListWidgetColumnComponent, AXPSelectionListWidgetDesignerComponent, AXPSelectionListWidgetEditComponent, AXPSelectionListWidgetViewComponent, AXPSignatureWidget, AXPSignatureWidgetColumnComponent, AXPSignatureWidgetEditComponent, AXPSignatureWidgetViewComponent, AXPSpacingWidget, AXPSpacingWidgetEditComponent, AXPStatusChipComponent, AXPStatusWidget, AXPStatusWidgetColumnComponent, AXPStatusWidgetEditComponent, AXPStatusWidgetViewComponent, AXPStepWizardWidget, AXPStepWizardWidgetViewComponent, AXPStopwatchWidget, AXPStopwatchWidgetViewComponent, AXPTableItemWidget, AXPTableItemWidgetDesignerComponent, AXPTableItemWidgetViewComponent, AXPTableWidget, AXPTableWidgetDesignerComponent, AXPTableWidgetViewComponent, AXPTagEditorWidget, AXPTagEditorWidgetColumnComponent, AXPTagEditorWidgetEditComponent, AXPTagEditorWidgetViewComponent, AXPTemplateBoxWidget, AXPTemplateBoxWidgetColumnComponent, AXPTemplateBoxWidgetEditComponent, AXPTemplateBoxWidgetPrintComponent, AXPTemplateBoxWidgetViewComponent, AXPTextBoxWidget, AXPTextBoxWidgetColumnComponent, AXPTextBoxWidgetEditComponent, AXPTextBoxWidgetPrintComponent, AXPTextBoxWidgetViewComponent, AXPToggleWidget, AXPToggleWidgetColumnComponent, AXPToggleWidgetEditComponent, AXPToggleWidgetPrintComponent, AXPToggleWidgetViewComponent, AXPWidgetFieldConfiguratorWidget, AXPWidgetFieldConfiguratorWidgetColumnComponent, AXPWidgetFieldConfiguratorWidgetEditComponent, AXPWidgetsModule, AXP_ABSOLUTE_UNITS, AXP_BORDER_RADIUS_UNITS, AXP_BORDER_WIDTH_UNITS, AXP_DATA_LIST_CMD_DELETE, AXP_DATA_LIST_CMD_EDIT, AXP_DATA_LIST_PENDING_DELETE_KEY, AXP_Flex_Box_Align_Options, AXP_Flex_Box_Alignments, AXP_Flex_Box_Justify_Options, AXP_Grid_Box_Align_Items_Options, AXP_Grid_Box_Alignments, AXP_Grid_Box_Justify_Items_Options, AXP_RELATIVE_UNITS, AXP_RELATIVE_UNITS_NO_PERCENT, AXP_REPEATER_ENTITY_BY_KEY_LOOKUP, AXP_ROW_EXPR_PREFIX, AXP_SPACING_UNITS, AXP_default_Border_Box_Units, AXP_default_Border_Box_Value, AXP_default_Spacing_Box_Units, AXP_default_Spacing_Box_Value, DEFAULT_QRCODE_SIZE, DEFAULT_STRATEGY_CONFIG, STRATEGY_CONFIG_TOKEN, prepareNodeRendererChild, resolveColorChooserGroups, resolveDataListColumnWidth };
31987
+ export { AXPAdvancedGridItemWidget, AXPAdvancedGridItemWidgetDesignerComponent, AXPAdvancedGridItemWidgetViewComponent, AXPAdvancedGridOptionsWidget, AXPAdvancedGridOptionsWidgetEditComponent, AXPAdvancedGridWidget, AXPAdvancedGridWidgetDesignerComponent, AXPAdvancedGridWidgetViewComponent, AXPAvatarWidget, AXPAvatarWidgetColumnComponent, AXPAvatarWidgetDesignerComponent, AXPAvatarWidgetEditComponent, AXPAvatarWidgetViewComponent, AXPBetweenExpressionValidationWidget, AXPBetweenValidationWidgetEditComponent, AXPBlockWidget, AXPBlockWidgetDesignerComponent, AXPBlockWidgetViewComponent, AXPBorderWidget, AXPBorderWidgetEditComponent, AXPButtonWidget, AXPButtonWidgetColumnComponent, AXPButtonWidgetViewComponent, AXPCallbackValidationWidget, AXPCallbackValidationWidgetEditComponent, AXPCheckBoxWidget, AXPCheckBoxWidgetColumnComponent, AXPCheckBoxWidgetDesignerComponent, AXPCheckBoxWidgetEditComponent, AXPCheckBoxWidgetPrintComponent, AXPCheckBoxWidgetViewComponent, AXPCodeEditorWidget, AXPCodeEditorWidgetColumnComponent, AXPCodeEditorWidgetEditComponent, AXPCodeEditorWidgetViewComponent, AXPColorBoxWidget, AXPColorBoxWidgetColumnComponent, AXPColorBoxWidgetDesignerComponent, AXPColorBoxWidgetEditComponent, AXPColorBoxWidgetViewComponent, AXPColorChooserWidget, AXPColorChooserWidgetColumnComponent, AXPColorChooserWidgetDesignerComponent, AXPColorChooserWidgetEditComponent, AXPColorChooserWidgetViewComponent, AXPColorPaletteWidget, AXPColorPaletteWidgetColumnComponent, AXPColorPaletteWidgetDesignerComponent, AXPColorPaletteWidgetEditComponent, AXPColorPaletteWidgetViewComponent, AXPConditionBuilderWidget, AXPConditionBuilderWidgetEditComponent, AXPConditionBuilderWidgetViewComponent, AXPConnectedDragDropListsWidget, AXPConnectedListsWidgetColumnComponent, AXPConnectedListsWidgetEditComponent, AXPConnectedListsWidgetViewComponent, AXPContactWidget, AXPContactWidgetColumnComponent, AXPContactWidgetEditComponent, AXPContactWidgetViewComponent, AXPDataListWidget, AXPDataListWidgetViewComponent, AXPDataSourceOptionsWidget, AXPDataSourceOptionsWidgetEditComponent, AXPDateTimeBoxWidget, AXPDateTimeBoxWidgetColumnComponent, AXPDateTimeBoxWidgetEditComponent, AXPDateTimeBoxWidgetViewComponent, AXPDirectionWidget, AXPDirectionWidgetEditComponent, AXPDragDropListWidget, AXPEditorJsWidget, AXPEditorJsWidgetColumnComponent, AXPEditorJsWidgetEditComponent, AXPEditorJsWidgetViewComponent, AXPEqualValidationWidget, AXPEqualValidationWidgetEditComponent, AXPFieldsetWidget, AXPFieldsetWidgetDesignerComponent, AXPFieldsetWidgetViewComponent, AXPFileViewerWidget, AXPFileViewerWidgetEditComponent, AXPFileViewerWidgetViewComponent, AXPFlexItemOptionsWidget, AXPFlexItemOptionsWidgetEditComponent, AXPFlexItemWidget, AXPFlexItemWidgetDesignerComponent, AXPFlexItemWidgetViewComponent, AXPFlexOptionsWidget, AXPFlexOptionsWidgetEditComponent, AXPFlexWidget, AXPFlexWidgetDesignerComponent, AXPFlexWidgetViewComponent, AXPGetWidgetsForAIQuery, AXPGreaterThanExpressionValidationWidget, AXPGreaterThanValidationWidgetEditComponent, AXPGridItemOptionsWidget, AXPGridItemOptionsWidgetEditComponent, AXPGridOptionsWidget, AXPGridOptionsWidgetEditComponent, AXPImageMarkerPopupComponent, AXPImageMarkerWidget, AXPImageMarkerWidgetColumnComponent, AXPImageMarkerWidgetEditComponent, AXPImageMarkerWidgetViewComponent, AXPIntegrationConnectionActionsService, AXPIntegrationConnectionsPanelWidget, AXPIntegrationConnectionsPanelWidgetEditComponent, AXPItemConfiguratorWidget, AXPItemConfiguratorWidgetColumnComponent, AXPItemConfiguratorWidgetEditComponent, AXPJsonViewerWidget, AXPJsonViewerWidgetEditComponent, AXPJsonViewerWidgetViewComponent, AXPLargeTextWidget, AXPLargeTextWidgetColumnComponent, AXPLargeTextWidgetEditComponent, AXPLargeTextWidgetPrintComponent, AXPLargeTextWidgetViewComponent, AXPLessThanExpressionValidationWidget, AXPLessThanValidationWidgetEditComponent, AXPListWidgetColumnComponent, AXPListWidgetEditComponent, AXPListWidgetViewComponent, AXPMapWidgetEditComponent, AXPMapWidgetViewComponent, AXPMaxLengthExpressionValidationWidget, AXPMaxLengthValidationWidgetEditComponent, AXPMinLengthExpressionValidationWidget, AXPMinLengthValidationWidgetEditComponent, AXPNodeRendererWidget, AXPNodeRendererWidgetEditComponent, AXPNodeRendererWidgetViewComponent, AXPNumberBoxWidget, AXPNumberBoxWidgetColumnComponent, AXPNumberBoxWidgetEditComponent, AXPNumberBoxWidgetPrintComponent, AXPNumberBoxWidgetViewComponent, AXPOutcomeResultsViewerWidget, AXPOutcomeResultsViewerWidgetViewComponent, AXPPageWidget, AXPPageWidgetViewComponent, AXPPasswordBoxWidget, AXPPasswordBoxWidgetColumnComponent, AXPPasswordBoxWidgetEditComponent, AXPPasswordBoxWidgetViewComponent, AXPProgressBarWidget, AXPProgressBarWidgetColumnComponent, AXPProgressBarWidgetEditComponent, AXPProgressBarWidgetViewComponent, AXPProviderSelectWidgetColumnComponent, AXPProviderSelectWidgetEditBase, AXPProviderSelectWidgetViewComponent, AXPQrcodeViewerService, AXPQrcodeWidget, AXPQrcodeWidgetColumnComponent, AXPQrcodeWidgetEditComponent, AXPQrcodeWidgetViewComponent, AXPRatePickerWidget, AXPRatePickerWidgetColumnComponent, AXPRatePickerWidgetEditComponent, AXPRatePickerWidgetViewComponent, AXPRegularExpressionValidationWidget, AXPRegularExpressionValidationWidgetEditComponent, AXPRepeaterWidget, AXPRepeaterWidgetDesignerComponent, AXPRepeaterWidgetEditComponent, AXPRepeaterWidgetViewComponent, AXPRequiredValidationWidget, AXPRequiredValidationWidgetEditComponent, AXPRichTextWidget, AXPRichTextWidgetColumnComponent, AXPRichTextWidgetEditComponent, AXPRichTextWidgetPrintComponent, AXPRichTextWidgetViewComponent, AXPSchedulerPickerWidget, AXPSchedulerPickerWidgetColumnComponent, AXPSchedulerPickerWidgetEditComponent, AXPSchedulerPickerWidgetViewComponent, AXPSelectBoxWidget, AXPSelectBoxWidgetColumnComponent, AXPSelectBoxWidgetEditComponent, AXPSelectBoxWidgetViewComponent, AXPSelectLanguagePopup, AXPSelectionListWidget, AXPSelectionListWidgetColumnComponent, AXPSelectionListWidgetDesignerComponent, AXPSelectionListWidgetEditComponent, AXPSelectionListWidgetViewComponent, AXPSignatureWidget, AXPSignatureWidgetColumnComponent, AXPSignatureWidgetEditComponent, AXPSignatureWidgetViewComponent, AXPSpacingWidget, AXPSpacingWidgetEditComponent, AXPStatusChipComponent, AXPStatusWidget, AXPStatusWidgetColumnComponent, AXPStatusWidgetEditComponent, AXPStatusWidgetViewComponent, AXPStepWizardWidget, AXPStepWizardWidgetViewComponent, AXPStopwatchWidget, AXPStopwatchWidgetViewComponent, AXPTableItemWidget, AXPTableItemWidgetDesignerComponent, AXPTableItemWidgetViewComponent, AXPTableWidget, AXPTableWidgetDesignerComponent, AXPTableWidgetViewComponent, AXPTagEditorWidget, AXPTagEditorWidgetColumnComponent, AXPTagEditorWidgetEditComponent, AXPTagEditorWidgetViewComponent, AXPTemplateBoxWidget, AXPTemplateBoxWidgetColumnComponent, AXPTemplateBoxWidgetEditComponent, AXPTemplateBoxWidgetPrintComponent, AXPTemplateBoxWidgetViewComponent, AXPTextBoxWidget, AXPTextBoxWidgetColumnComponent, AXPTextBoxWidgetEditComponent, AXPTextBoxWidgetPrintComponent, AXPTextBoxWidgetViewComponent, AXPToggleWidget, AXPToggleWidgetColumnComponent, AXPToggleWidgetEditComponent, AXPToggleWidgetPrintComponent, AXPToggleWidgetViewComponent, AXPWidgetFieldConfiguratorWidget, AXPWidgetFieldConfiguratorWidgetColumnComponent, AXPWidgetFieldConfiguratorWidgetEditComponent, AXPWidgetsModule, AXP_ABSOLUTE_UNITS, AXP_BORDER_RADIUS_UNITS, AXP_BORDER_WIDTH_UNITS, AXP_DATA_LIST_CMD_DELETE, AXP_DATA_LIST_CMD_EDIT, AXP_DATA_LIST_PENDING_DELETE_KEY, AXP_Flex_Box_Align_Options, AXP_Flex_Box_Alignments, AXP_Flex_Box_Justify_Options, AXP_Grid_Box_Align_Items_Options, AXP_Grid_Box_Alignments, AXP_Grid_Box_Justify_Items_Options, AXP_RELATIVE_UNITS, AXP_RELATIVE_UNITS_NO_PERCENT, AXP_REPEATER_ENTITY_BY_KEY_LOOKUP, AXP_ROW_EXPR_PREFIX, AXP_SPACING_UNITS, AXP_default_Border_Box_Units, AXP_default_Border_Box_Value, AXP_default_Spacing_Box_Units, AXP_default_Spacing_Box_Value, DEFAULT_QRCODE_SIZE, DEFAULT_STRATEGY_CONFIG, STRATEGY_CONFIG_TOKEN, prepareNodeRendererChild, resolveColorChooserGroups, resolveDataListColumnWidth };
31974
31988
  //# sourceMappingURL=acorex-platform-framework-client-layout-widgets.mjs.map