@acorex-platform/framework-client 0.0.46 → 0.0.49

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 (50) hide show
  1. package/fesm2022/acorex-platform-framework-client-common.mjs +233 -6
  2. package/fesm2022/acorex-platform-framework-client-common.mjs.map +1 -1
  3. package/fesm2022/acorex-platform-framework-client-core.mjs +25 -38
  4. package/fesm2022/acorex-platform-framework-client-core.mjs.map +1 -1
  5. package/fesm2022/acorex-platform-framework-client-layout-builder.mjs +4 -52
  6. package/fesm2022/acorex-platform-framework-client-layout-builder.mjs.map +1 -1
  7. package/fesm2022/acorex-platform-framework-client-layout-components.mjs +48 -14
  8. package/fesm2022/acorex-platform-framework-client-layout-components.mjs.map +1 -1
  9. package/fesm2022/{acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-Dc_NpBx6.mjs → acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-CkqVHcl9.mjs} +53 -46
  10. package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-CkqVHcl9.mjs.map +1 -0
  11. package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-Cx-n7ZuA.mjs → acorex-platform-framework-client-layout-entity-attachments-page.component-CEtWy70B.mjs} +2 -2
  12. package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-Cx-n7ZuA.mjs.map → acorex-platform-framework-client-layout-entity-attachments-page.component-CEtWy70B.mjs.map} +1 -1
  13. package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-BONV249y.mjs → acorex-platform-framework-client-layout-entity-bulk-entity.command-BnH5XK5M.mjs} +2 -2
  14. package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-BONV249y.mjs.map → acorex-platform-framework-client-layout-entity-bulk-entity.command-BnH5XK5M.mjs.map} +1 -1
  15. package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-uTG2nFly.mjs → acorex-platform-framework-client-layout-entity-gallery-page.component-COjqVu_3.mjs} +2 -2
  16. package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-uTG2nFly.mjs.map → acorex-platform-framework-client-layout-entity-gallery-page.component-COjqVu_3.mjs.map} +1 -1
  17. package/fesm2022/acorex-platform-framework-client-layout-entity.mjs +2 -2
  18. package/fesm2022/acorex-platform-framework-client-layout-views.mjs +46 -7
  19. package/fesm2022/acorex-platform-framework-client-layout-views.mjs.map +1 -1
  20. package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs +10 -20
  21. package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs.map +1 -1
  22. package/fesm2022/{acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-CDpzvn6z.mjs → acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-BwwxqHzR.mjs} +179 -51
  23. package/fesm2022/acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-BwwxqHzR.mjs.map +1 -0
  24. package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-Cw3NhWL8.mjs → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-DYpd-XXJ.mjs} +2 -2
  25. package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-Cw3NhWL8.mjs.map → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-DYpd-XXJ.mjs.map} +1 -1
  26. package/fesm2022/{acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-BEa-vD6O.mjs → acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-DfgIxNyy.mjs} +2 -2
  27. package/fesm2022/{acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-BEa-vD6O.mjs.map → acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-DfgIxNyy.mjs.map} +1 -1
  28. package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs +1 -1
  29. package/fesm2022/{acorex-platform-framework-client-themes-default-entity-master-create-view.component-CT7WWWG0.mjs → acorex-platform-framework-client-themes-default-entity-master-create-view.component-Dh_hRxZX.mjs} +3 -3
  30. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-create-view.component-Dh_hRxZX.mjs.map +1 -0
  31. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-modify-view.component-bC_uPN9l.mjs +122 -0
  32. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-modify-view.component-bC_uPN9l.mjs.map +1 -0
  33. package/fesm2022/{acorex-platform-framework-client-themes-default-entity-master-single-view.component-CHLsBvBE.mjs → acorex-platform-framework-client-themes-default-entity-master-single-view.component-CDzBgDt7.mjs} +3 -3
  34. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-single-view.component-CDzBgDt7.mjs.map +1 -0
  35. package/fesm2022/acorex-platform-framework-client-themes-default.mjs +60 -42
  36. package/fesm2022/acorex-platform-framework-client-themes-default.mjs.map +1 -1
  37. package/package.json +2 -2
  38. package/types/acorex-platform-framework-client-common.d.ts +41 -3
  39. package/types/acorex-platform-framework-client-core.d.ts +3 -5
  40. package/types/acorex-platform-framework-client-layout-components.d.ts +20 -3
  41. package/types/acorex-platform-framework-client-layout-entity.d.ts +12 -1
  42. package/types/acorex-platform-framework-client-layout-views.d.ts +7 -1
  43. package/types/acorex-platform-framework-client-layout-widget-core.d.ts +8 -3
  44. package/types/acorex-platform-framework-client-layout-widgets.d.ts +27 -3
  45. package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-Dc_NpBx6.mjs.map +0 -1
  46. package/fesm2022/acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-CDpzvn6z.mjs.map +0 -1
  47. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-create-view.component-CT7WWWG0.mjs.map +0 -1
  48. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-modify-view.component-DienTcPE.mjs +0 -122
  49. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-modify-view.component-DienTcPE.mjs.map +0 -1
  50. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-single-view.component-CHLsBvBE.mjs.map +0 -1
@@ -30,14 +30,14 @@ import * as i1$6 from '@angular/forms';
30
30
  import { FormsModule } from '@angular/forms';
31
31
  import { AXLookupComponent } from '@acorex/components/lookup';
32
32
  import { AXFormatService } from '@acorex/core/format';
33
- import { resolveMultiLanguageString, setSmart, omitFilterClauseIdentity, createRandomUuid, themeSurfaceVariantFromClass, toRuntimeSurfaceClassName, resolveToSurfaceClass, parseRuntimeHexSurface, listThemeSurfaceGroups, normalizeHexColor, extractValue, AXPRegionalSetting, filterOperatorAllowsEmptyValue, shouldUseLocaleMapShape, buildLocaleTextMapValue, isFormValueEqual, isSelectionValueEqual, isLocaleStringMap, AXPWidgetsCatalog, runtimeQueryCollectionData, AXP_INTEGRATION_CONNECTION_STATUS, AXP_INTEGRATION_AUTH_METHOD_TYPE, sortByMultiLanguageString, AXPFileStorageStatus, AXPPlatformScope, flattenQueryFilterUserGroups, isPersistableFilterQuery, resolveFilterQueryIdentityField, normalizeDefinitionCategories, runtimeQueryFailure, runtimeQuerySuccessObject } from '@acorex-platform/framework-shared/core';
33
+ import { resolveMultiLanguageString, setSmart, omitFilterClauseIdentity, createRandomUuid, themeSurfaceVariantFromClass, toRuntimeSurfaceClassName, resolveToSurfaceClass, parseRuntimeHexSurface, listThemeSurfaceGroups, normalizeHexColor, extractValue, AXPRegionalSetting, filterOperatorAllowsEmptyValue, shouldUseLocaleMapShape, buildLocaleTextMapValue, isFormValueEqual, isSelectionValueEqual, isLocaleStringMap, AXPWidgetsCatalog, runtimeQueryCollectionData, AXP_INTEGRATION_CONNECTION_STATUS, AXP_INTEGRATION_AUTH_METHOD_TYPE, sortByMultiLanguageString, axpGridItemPlacementClassMap, AXPFileStorageStatus, AXPPlatformScope, flattenQueryFilterUserGroups, isPersistableFilterQuery, resolveFilterQueryIdentityField, axpGridNarrowContainerQueryPrefix, normalizeDefinitionCategories, runtimeQueryFailure, runtimeQuerySuccessObject } from '@acorex-platform/framework-shared/core';
34
34
  import { get, set, castArray, isNil, cloneDeep, isEqual, isNull, isEmpty, isPlainObject, isString, isNumber, defaultTo, has } from 'lodash-es';
35
35
  import * as i2$2 from '@acorex/components/loading';
36
36
  import { AXLoadingModule } from '@acorex/components/loading';
37
37
  import { AXPCommandService, AXPQueryService, provideQuerySetups } from '@acorex-platform/framework-client/runtime';
38
38
  import { cloneProperty, AXPWidgetGroupEnum, createSelectProperty, createStringProperty, createNumberProperty, createBooleanProperty, AXPWidgetStatus, resolveLayoutProfileValue, layoutProfileKeyFromContext, isLayoutProfileKeyConfigured, resolveLayoutProfile, layoutProfileContextForKey, resolveLayoutProfileExcluding, diffLayoutProfileLayer } from '@acorex-platform/framework-shared/widget-core';
39
39
  import { AXPopupService } from '@acorex/components/popup';
40
- import { AXPConditionBuilderComponent, AXPConditionBuilderConditionComponent, AXPColorChooserComponent, AXPColorPalettePickerComponent, AXPDragDropListComponent, AXPColumnItemListComponent, AXPImageEditorService, AXPFileChooserService, createAttachedFileProviderMenu, AXPFileViewerComponent, AXPStateMessageComponent, normalizeFileViewerBoundValue, AXPOutcomeResultsViewerComponent, AXPSignatureEditorService, AXPStopwatchComponent, AXPWidgetFieldConfiguratorComponent, AXPItemConfiguratorComponent, AXPRepeaterRowsLayoutComponent, AXPLocalDataSourceEditorDialogService, AXPSpreadsheetComponent, AXPQueryViewSaveDialogService, AXPQueryFiltersComponent, AXPQuerySortsComponent, AXPQueryColumnsComponent, AXPQueryViewSaveButtonComponent, AXPQueryViewTabsComponent } from '@acorex-platform/framework-client/layout/components';
40
+ import { AXPConditionBuilderComponent, AXPConditionBuilderConditionComponent, AXPColorChooserComponent, AXPColorPalettePickerComponent, AXPDragDropListComponent, AXPColumnItemListComponent, AXPImageEditorService, AXPFileChooserService, createAttachedFileProviderMenu, AXPFileViewerComponent, AXPStateMessageComponent, normalizeFileViewerBoundValue, AXPOutcomeResultsViewerComponent, AXPSignatureEditorService, AXP_SIGNATURE_PROVIDER, AXPStopwatchComponent, AXPWidgetFieldConfiguratorComponent, AXPItemConfiguratorComponent, AXPRepeaterRowsLayoutComponent, AXPLocalDataSourceEditorDialogService, AXPSpreadsheetComponent, AXPQueryViewSaveDialogService, AXPQueryFiltersComponent, AXPQuerySortsComponent, AXPQueryColumnsComponent, AXPQueryViewSaveButtonComponent, AXPQueryViewTabsComponent } from '@acorex-platform/framework-client/layout/components';
41
41
  import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
42
42
  import { AXValidationModule, AXValidationService } from '@acorex/core/validation';
43
43
  import { AXColorUtil } from '@acorex/core/utils';
@@ -100,9 +100,9 @@ import * as i1$e from '@acorex/components/map';
100
100
  import { AXMapModule } from '@acorex/components/map';
101
101
  import * as i5$1 from '@acorex/components/qrcode';
102
102
  import { AXQrcodeModule } from '@acorex/components/qrcode';
103
- import * as i3$7 from '@acorex/components/image';
103
+ import * as i4$1 from '@acorex/components/image';
104
104
  import { AXImageModule } from '@acorex/components/image';
105
- import * as i2$8 from '@acorex/components/paint';
105
+ import * as i3$7 from '@acorex/components/paint';
106
106
  import { AXPaintModule } from '@acorex/components/paint';
107
107
  import * as i1$f from '@acorex/components/grid-layout-builder';
108
108
  import { AXGridLayoutContainerComponent, AXGridLayoutBuilderModule } from '@acorex/components/grid-layout-builder';
@@ -14886,8 +14886,10 @@ class AXPSignatureWidgetEditComponent extends AXPValueWidgetComponent {
14886
14886
  //#region ---- Options & State ----
14887
14887
  this.disabled = computed(() => this.options()['disabled'] ?? false, /* @ts-ignore */
14888
14888
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
14889
- /** When true (default), show click-to-edit overlay over read-only paint. Set false when used inside a dialog. */
14890
- this.showOverlay = computed(() => this.options()['showOverlay'] ?? true, /* @ts-ignore */
14889
+ /** Popup opens the signature dialog. Inline paints on the field. `showOverlay: false` still forces inline. */
14890
+ this.captureMode = computed(() => resolveSignatureCaptureMode(this.options()['captureMode'], this.options()['showOverlay']), /* @ts-ignore */
14891
+ ...(ngDevMode ? [{ debugName: "captureMode" }] : /* istanbul ignore next */ []));
14892
+ this.showOverlay = computed(() => this.captureMode() === 'popup', /* @ts-ignore */
14891
14893
  ...(ngDevMode ? [{ debugName: "showOverlay" }] : /* istanbul ignore next */ []));
14892
14894
  /** Paint editMode: true hides pen/highlighter/eraser toolbars. */
14893
14895
  this.editMode = computed(() => this.options()['editMode'] ?? true, /* @ts-ignore */
@@ -14897,6 +14899,11 @@ class AXPSignatureWidgetEditComponent extends AXPValueWidgetComponent {
14897
14899
  return typeof value === 'string' && value.length > 0;
14898
14900
  }, /* @ts-ignore */
14899
14901
  ...(ngDevMode ? [{ debugName: "hasSignature" }] : /* istanbul ignore next */ []));
14902
+ this.showInlineClear = computed(() => this.captureMode() === 'inline' &&
14903
+ this.options()['showClear'] !== false &&
14904
+ this.hasSignature() &&
14905
+ !this.disabled(), /* @ts-ignore */
14906
+ ...(ngDevMode ? [{ debugName: "showInlineClear" }] : /* istanbul ignore next */ []));
14900
14907
  this.showSignaturePreview = computed(() => this.showOverlay() && this.hasSignature(), /* @ts-ignore */
14901
14908
  ...(ngDevMode ? [{ debugName: "showSignaturePreview" }] : /* istanbul ignore next */ []));
14902
14909
  this.showPaintSurface = computed(() => !this.showOverlay(), /* @ts-ignore */
@@ -14929,10 +14936,23 @@ class AXPSignatureWidgetEditComponent extends AXPValueWidgetComponent {
14929
14936
  ...(ngDevMode ? [{ debugName: "paintContainer" }] : /* istanbul ignore next */ []));
14930
14937
  this.paintView = viewChild('paintView', /* @ts-ignore */
14931
14938
  ...(ngDevMode ? [{ debugName: "paintView" }] : /* istanbul ignore next */ []));
14939
+ this.savedSignature = signal(null, /* @ts-ignore */
14940
+ ...(ngDevMode ? [{ debugName: "savedSignature" }] : /* istanbul ignore next */ []));
14941
+ this.savedSignatureLabel = signal('@platform-layout-widgets:widgets.signature.actions.use-saved', /* @ts-ignore */
14942
+ ...(ngDevMode ? [{ debugName: "savedSignatureLabel" }] : /* istanbul ignore next */ []));
14943
+ this.showSavedSignatureAction = computed(() => {
14944
+ const saved = this.savedSignature();
14945
+ return !this.disabled() && !!saved && this.getValue() !== saved;
14946
+ }, /* @ts-ignore */
14947
+ ...(ngDevMode ? [{ debugName: "showSavedSignatureAction" }] : /* istanbul ignore next */ []));
14948
+ this.showSignatureActions = computed(() => this.showInlineClear() || this.showSavedSignatureAction(), /* @ts-ignore */
14949
+ ...(ngDevMode ? [{ debugName: "showSignatureActions" }] : /* istanbul ignore next */ []));
14932
14950
  //#endregion
14933
14951
  //#region ---- Services & Dependencies ----
14934
14952
  this.signatureEditorService = inject(AXPSignatureEditorService);
14935
14953
  this.deviceService = inject(AXPDeviceService);
14954
+ this.signatureProviders = inject(AXP_SIGNATURE_PROVIDER, { optional: true });
14955
+ this.savedSignatureLoadGeneration = 0;
14936
14956
  //#endregion
14937
14957
  //#region ---- Effects ----
14938
14958
  this.#loadInitialImageEffect = effect(() => {
@@ -14951,11 +14971,41 @@ class AXPSignatureWidgetEditComponent extends AXPValueWidgetComponent {
14951
14971
  this.#init = afterNextRender(() => {
14952
14972
  this.paintContainer()?.setPenWidth(5);
14953
14973
  });
14974
+ this.#loadSavedSignatureEffect = effect((onCleanup) => {
14975
+ const name = resolveSignatureProviderName(this.options()['signatureProvider']);
14976
+ const generation = ++this.savedSignatureLoadGeneration;
14977
+ const provider = name ? this.findSignatureProvider(name) : undefined;
14978
+ let active = true;
14979
+ onCleanup(() => {
14980
+ active = false;
14981
+ });
14982
+ if (!provider) {
14983
+ this.savedSignature.set(null);
14984
+ this.savedSignatureLabel.set('@platform-layout-widgets:widgets.signature.actions.use-saved');
14985
+ return;
14986
+ }
14987
+ this.savedSignatureLabel.set(provider.title.trim() || '@platform-layout-widgets:widgets.signature.actions.use-saved');
14988
+ void provider
14989
+ .load()
14990
+ .then((value) => {
14991
+ if (!active || generation !== this.savedSignatureLoadGeneration) {
14992
+ return;
14993
+ }
14994
+ this.savedSignature.set(normalizeSignatureValue(value));
14995
+ })
14996
+ .catch(() => {
14997
+ if (active && generation === this.savedSignatureLoadGeneration) {
14998
+ this.savedSignature.set(null);
14999
+ }
15000
+ });
15001
+ }, /* @ts-ignore */
15002
+ ...(ngDevMode ? [{ debugName: "#loadSavedSignatureEffect" }] : /* istanbul ignore next */ []));
14954
15003
  }
14955
15004
  //#endregion
14956
15005
  //#region ---- Effects ----
14957
15006
  #loadInitialImageEffect;
14958
15007
  #init;
15008
+ #loadSavedSignatureEffect;
14959
15009
  //#endregion
14960
15010
  //#region ---- Widget API ----
14961
15011
  api() {
@@ -14972,6 +15022,19 @@ class AXPSignatureWidgetEditComponent extends AXPValueWidgetComponent {
14972
15022
  this.paintContainer()?.clear();
14973
15023
  this.isInteracting.set(false);
14974
15024
  }
15025
+ handleClearClick(event) {
15026
+ event.nativeEvent?.stopPropagation();
15027
+ this.clearSignaturePad();
15028
+ }
15029
+ applySavedSignature(event) {
15030
+ event.nativeEvent?.stopPropagation();
15031
+ const saved = this.savedSignature();
15032
+ if (!saved || this.disabled()) {
15033
+ return;
15034
+ }
15035
+ this.setValue(saved);
15036
+ this.isInteracting.set(false);
15037
+ }
14975
15038
  handleMouseEnter() {
14976
15039
  if (!this.showDesktopHover()) {
14977
15040
  return;
@@ -15015,16 +15078,23 @@ class AXPSignatureWidgetEditComponent extends AXPValueWidgetComponent {
15015
15078
  if (this.disabled()) {
15016
15079
  return;
15017
15080
  }
15081
+ const signatureProvider = resolveSignatureProviderName(this.options()['signatureProvider']);
15018
15082
  const result = await this.signatureEditorService.open({
15019
15083
  value: this.getValue(),
15020
15084
  disabled: this.disabled(),
15085
+ signatureProvider: signatureProvider || undefined,
15021
15086
  });
15022
15087
  if (result.action === 'apply') {
15023
15088
  this.setValue(result.value);
15024
15089
  }
15025
15090
  }
15091
+ //#endregion
15092
+ //#region ---- Saved signature ----
15093
+ findSignatureProvider(name) {
15094
+ return this.signatureProviders?.find((provider) => provider.name === name);
15095
+ }
15026
15096
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPSignatureWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
15027
- 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$7.AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
15097
+ 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=\"flex w-full flex-col overflow-hidden rounded-md\"\n [class.border]=\"captureMode() === 'inline'\"\n [class.border-surface]=\"captureMode() === 'inline'\"\n [class.opacity-60]=\"disabled()\"\n >\n <div\n class=\"relative w-full min-h-[9rem]\"\n [class.cursor-pointer]=\"showOverlay() && !disabled()\"\n [class.cursor-not-allowed]=\"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\n @if (showSignatureActions()) {\n <!-- ----- Clear and saved-signature actions inside the signature box ----- -->\n <div class=\"flex items-center justify-between gap-2 border-t border-surface px-1 py-2\" data-signature-action=\"true\">\n <!--------------------------------------------------------------->\n <!-- ----- Clear the inline pad ----- -->\n @if (showInlineClear()) {\n <ax-button\n look=\"blank\"\n class=\"ax-sm\"\n data-signature-action=\"true\"\n [text]=\"('@general:actions.clear.title' | translate | async) ?? ''\"\n (onClick)=\"handleClearClick($event)\"\n ></ax-button>\n }\n <!--------------------------------------------------------------->\n <!-- ----- Apply the signature returned by the configured provider ----- -->\n @if (showSavedSignatureAction()) {\n <ax-button\n look=\"twotone\"\n color=\"primary\"\n class=\"ax-sm ms-auto\"\n data-signature-action=\"true\"\n [text]=\"(savedSignatureLabel() | translate | async) ?? ''\"\n (onClick)=\"applySavedSignature($event)\"\n ></ax-button>\n }\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>.ax-editor-container,:host ::ng-deep .axp-signature-pad-widget-edit ax-paint-view,:host ::ng-deep .axp-signature-pad-widget-edit canvas.ax-canvas-element,:host ::ng-deep .axp-signature-pad-widget-edit canvas.ax-canvas-element:focus,:host ::ng-deep .axp-signature-pad-widget-edit canvas.ax-canvas-element:focus-visible{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: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXPaintModule }, { kind: "component", type: i3$7.AXPaintContainerComponent, selector: "ax-paint-container", inputs: ["look", "disabled", "editMode"] }, { kind: "component", type: i3$7.AXPaintViewComponent, selector: "ax-paint-view", inputs: ["paintBackgroundColor"] }, { kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i4$1.AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
15028
15098
  }
15029
15099
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPSignatureWidgetEditComponent, decorators: [{
15030
15100
  type: Component,
@@ -15032,12 +15102,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
15032
15102
  class: 'block w-full',
15033
15103
  }, imports: [
15034
15104
  FormsModule,
15105
+ AXButtonModule,
15035
15106
  AXPaintModule,
15036
15107
  AXImageModule,
15037
15108
  AXTranslationModule,
15038
15109
  AsyncPipe,
15039
- ], 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"] }]
15110
+ ], template: "<div class=\"axp-signature-pad-widget-edit block w-full select-none\">\n <div\n class=\"flex w-full flex-col overflow-hidden rounded-md\"\n [class.border]=\"captureMode() === 'inline'\"\n [class.border-surface]=\"captureMode() === 'inline'\"\n [class.opacity-60]=\"disabled()\"\n >\n <div\n class=\"relative w-full min-h-[9rem]\"\n [class.cursor-pointer]=\"showOverlay() && !disabled()\"\n [class.cursor-not-allowed]=\"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\n @if (showSignatureActions()) {\n <!-- ----- Clear and saved-signature actions inside the signature box ----- -->\n <div class=\"flex items-center justify-between gap-2 border-t border-surface px-1 py-2\" data-signature-action=\"true\">\n <!--------------------------------------------------------------->\n <!-- ----- Clear the inline pad ----- -->\n @if (showInlineClear()) {\n <ax-button\n look=\"blank\"\n class=\"ax-sm\"\n data-signature-action=\"true\"\n [text]=\"('@general:actions.clear.title' | translate | async) ?? ''\"\n (onClick)=\"handleClearClick($event)\"\n ></ax-button>\n }\n <!--------------------------------------------------------------->\n <!-- ----- Apply the signature returned by the configured provider ----- -->\n @if (showSavedSignatureAction()) {\n <ax-button\n look=\"twotone\"\n color=\"primary\"\n class=\"ax-sm ms-auto\"\n data-signature-action=\"true\"\n [text]=\"(savedSignatureLabel() | translate | async) ?? ''\"\n (onClick)=\"applySavedSignature($event)\"\n ></ax-button>\n }\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>.ax-editor-container,:host ::ng-deep .axp-signature-pad-widget-edit ax-paint-view,:host ::ng-deep .axp-signature-pad-widget-edit canvas.ax-canvas-element,:host ::ng-deep .axp-signature-pad-widget-edit canvas.ax-canvas-element:focus,:host ::ng-deep .axp-signature-pad-widget-edit canvas.ax-canvas-element:focus-visible{border:none!important;box-shadow:none!important;outline:none!important}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
15040
15111
  }], propDecorators: { paintContainer: [{ type: i0.ViewChild, args: ['paintContainer', { isSignal: true }] }], paintView: [{ type: i0.ViewChild, args: ['paintView', { isSignal: true }] }] } });
15112
+ //#endregion
15113
+ //#region ---- Signature option helpers ----
15114
+ function resolveSignatureCaptureMode(captureMode, showOverlay) {
15115
+ // The signature dialog sets showOverlay false. The captureMode property default is popup
15116
+ // and is merged in even when the caller did not set it, so false must stay inline.
15117
+ if (showOverlay === false || readOptionId(captureMode) === 'inline') {
15118
+ return 'inline';
15119
+ }
15120
+ return 'popup';
15121
+ }
15122
+ function resolveSignatureProviderName(value) {
15123
+ const id = readOptionId(value);
15124
+ return id?.trim() ?? '';
15125
+ }
15126
+ function readOptionId(value) {
15127
+ if (typeof value === 'string') {
15128
+ return value;
15129
+ }
15130
+ if (value && typeof value === 'object' && 'id' in value && typeof value.id === 'string') {
15131
+ return value.id;
15132
+ }
15133
+ return undefined;
15134
+ }
15135
+ function normalizeSignatureValue(value) {
15136
+ const trimmed = typeof value === 'string' ? value.trim() : '';
15137
+ return trimmed.length > 0 ? trimmed : null;
15138
+ }
15041
15139
 
15042
15140
  var signaturePadWidgetEdit_component = /*#__PURE__*/Object.freeze({
15043
15141
  __proto__: null,
@@ -15061,7 +15159,7 @@ class AXPSignatureWidgetViewComponent extends AXPValueWidgetComponent {
15061
15159
  <span>{{ placeholder() }}</span>
15062
15160
  }
15063
15161
  </div>
15064
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i3$7.AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
15162
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i4$1.AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
15065
15163
  }
15066
15164
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPSignatureWidgetViewComponent, decorators: [{
15067
15165
  type: Component,
@@ -15087,6 +15185,26 @@ var signaturePadWidgetView_component = /*#__PURE__*/Object.freeze({
15087
15185
  AXPSignatureWidgetViewComponent: AXPSignatureWidgetViewComponent
15088
15186
  });
15089
15187
 
15188
+ const AXP_SIGNATURE_CAPTURE_MODE_PROPERTY = createSelectProperty({
15189
+ name: 'captureMode',
15190
+ title: '@platform-layout-widgets:widgets.signature.capture-mode.title',
15191
+ path: 'options.captureMode',
15192
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
15193
+ defaultValue: {
15194
+ id: 'popup',
15195
+ title: '@platform-layout-widgets:widgets.signature.capture-mode.popup',
15196
+ },
15197
+ dataSource: [
15198
+ { id: 'popup', title: '@platform-layout-widgets:widgets.signature.capture-mode.popup' },
15199
+ { id: 'inline', title: '@platform-layout-widgets:widgets.signature.capture-mode.inline' },
15200
+ ],
15201
+ });
15202
+ const AXP_SIGNATURE_PROVIDER_PROPERTY = createStringProperty({
15203
+ name: 'signatureProvider',
15204
+ title: '@platform-layout-widgets:widgets.signature.signature-provider.title',
15205
+ path: 'options.signatureProvider',
15206
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
15207
+ });
15090
15208
  const AXPSignatureWidget = {
15091
15209
  name: 'signature',
15092
15210
  title: '@platform-layout-widgets:widgets.signature.title',
@@ -15101,6 +15219,8 @@ const AXPSignatureWidget = {
15101
15219
  AXP_DISABLED_PROPERTY,
15102
15220
  AXP_PLACEHOLDER_PROPERTY,
15103
15221
  AXP_REQUIRED_VALIDATION_PROPERTY,
15222
+ AXP_SIGNATURE_CAPTURE_MODE_PROPERTY,
15223
+ AXP_SIGNATURE_PROVIDER_PROPERTY,
15104
15224
  ],
15105
15225
  components: {
15106
15226
  view: {
@@ -17888,22 +18008,11 @@ class AXPAdvancedGridItemWidgetViewComponent extends AXPLayoutBaseWidgetComponen
17888
18008
  if (this.flexDirection()) {
17889
18009
  cls[this.flexDirection()] = true;
17890
18010
  }
17891
- //
17892
- cls[`col-span-12`] = true;
17893
- if (this.colSpan() != null) {
17894
- cls[`lg:col-span-${this.colSpan()}`] = true;
17895
- }
17896
- else {
17897
- cls[`lg:col-span-1`] = true;
17898
- }
17899
- //
17900
- if (this.colStart() != null) {
17901
- cls[`lg:col-start-${this.colStart()}`] = true;
17902
- }
17903
- //
17904
- if (this.colEnd() != null) {
17905
- cls[`lg:col-end-${this.colEnd()}`] = true;
17906
- }
18011
+ Object.assign(cls, axpGridItemPlacementClassMap({
18012
+ colSpan: this.colSpan() ?? 1,
18013
+ colStart: this.colStart(),
18014
+ colEnd: this.colEnd(),
18015
+ }));
17907
18016
  return cls;
17908
18017
  }
17909
18018
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAdvancedGridItemWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
@@ -19250,7 +19359,7 @@ const AXPRepeaterWidget = {
19250
19359
  component: () => Promise.resolve().then(function () { return repeaterWidgetDesigner_component; }).then((c) => c.AXPRepeaterWidgetDesignerComponent),
19251
19360
  },
19252
19361
  column: {
19253
- component: () => import('./acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-Cw3NhWL8.mjs').then((c) => c.AXPRepeaterWidgetColumnComponent),
19362
+ component: () => import('./acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-DYpd-XXJ.mjs').then((c) => c.AXPRepeaterWidgetColumnComponent),
19254
19363
  },
19255
19364
  },
19256
19365
  };
@@ -27330,9 +27439,8 @@ class AXPListToolbarWidgetViewComponent extends AXPValueWidgetComponent {
27330
27439
  }, /* @ts-ignore */
27331
27440
  ...(ngDevMode ? [{ debugName: "selectedViewQuery" }] : /* istanbul ignore next */ []));
27332
27441
  this.showFilterToolbarRow = computed(() => this.canFilter() ||
27333
- this.showColumnsControl() ||
27442
+ this.showViewMenu() ||
27334
27443
  this.canSort() ||
27335
- this.showListDisplayModeControl() ||
27336
27444
  (this.filterTriggerMode() === 'manual' && this.isFiltersDirty()), /* @ts-ignore */
27337
27445
  ...(ngDevMode ? [{ debugName: "showFilterToolbarRow" }] : /* istanbul ignore next */ []));
27338
27446
  this.enabledListLayouts = computed(() => {
@@ -27347,6 +27455,16 @@ class AXPListToolbarWidgetViewComponent extends AXPValueWidgetComponent {
27347
27455
  ...(ngDevMode ? [{ debugName: "showListDisplayModeControl" }] : /* istanbul ignore next */ []));
27348
27456
  this.showColumnsControl = computed(() => this.canColumns() && this.listDisplayMode() === 'table', /* @ts-ignore */
27349
27457
  ...(ngDevMode ? [{ debugName: "showColumnsControl" }] : /* istanbul ignore next */ []));
27458
+ this.showViewMenu = computed(() => this.showListDisplayModeControl() || this.showColumnsControl(), /* @ts-ignore */
27459
+ ...(ngDevMode ? [{ debugName: "showViewMenu" }] : /* istanbul ignore next */ []));
27460
+ this.activeSortCount = computed(() => (this.getValue()?.sorts ?? []).filter((sort) => sort.dir === 'asc' || sort.dir === 'desc').length, /* @ts-ignore */
27461
+ ...(ngDevMode ? [{ debugName: "activeSortCount" }] : /* istanbul ignore next */ []));
27462
+ this.sortMenuOpen = signal(false, /* @ts-ignore */
27463
+ ...(ngDevMode ? [{ debugName: "sortMenuOpen" }] : /* istanbul ignore next */ []));
27464
+ this.viewMenuOpen = signal(false, /* @ts-ignore */
27465
+ ...(ngDevMode ? [{ debugName: "viewMenuOpen" }] : /* istanbul ignore next */ []));
27466
+ this.viewMenuPanel = signal('root', /* @ts-ignore */
27467
+ ...(ngDevMode ? [{ debugName: "viewMenuPanel" }] : /* istanbul ignore next */ []));
27350
27468
  this.hasTableListDisplayOption = computed(() => this.enabledListLayouts().includes('table'), /* @ts-ignore */
27351
27469
  ...(ngDevMode ? [{ debugName: "hasTableListDisplayOption" }] : /* istanbul ignore next */ []));
27352
27470
  this.hasCardListDisplayOption = computed(() => this.enabledListLayouts().includes('card'), /* @ts-ignore */
@@ -27355,19 +27473,8 @@ class AXPListToolbarWidgetViewComponent extends AXPValueWidgetComponent {
27355
27473
  ...(ngDevMode ? [{ debugName: "hasRowListDisplayOption" }] : /* istanbul ignore next */ []));
27356
27474
  this.listDisplayMode = signal(AXP_ENTITY_LIST_DISPLAY_MODE_DEFAULT, /* @ts-ignore */
27357
27475
  ...(ngDevMode ? [{ debugName: "listDisplayMode" }] : /* istanbul ignore next */ []));
27358
- this.listDisplayModeButtonIcon = computed(() => {
27359
- switch (this.listDisplayMode()) {
27360
- case 'table':
27361
- return 'fa-light fa-table';
27362
- case 'row':
27363
- return 'fa-light fa-grip-lines';
27364
- case 'card':
27365
- return 'fa-light fa-grid-2';
27366
- }
27367
- }, /* @ts-ignore */
27368
- ...(ngDevMode ? [{ debugName: "listDisplayModeButtonIcon" }] : /* istanbul ignore next */ []));
27369
- this.listDisplayModePopover = viewChild('listDisplayModePopover', /* @ts-ignore */
27370
- ...(ngDevMode ? [{ debugName: "listDisplayModePopover" }] : /* istanbul ignore next */ []));
27476
+ this.viewPopover = viewChild('viewPopover', /* @ts-ignore */
27477
+ ...(ngDevMode ? [{ debugName: "viewPopover" }] : /* istanbul ignore next */ []));
27371
27478
  this.filterTriggerMode = signal('manual', /* @ts-ignore */
27372
27479
  ...(ngDevMode ? [{ debugName: "filterTriggerMode" }] : /* istanbul ignore next */ []));
27373
27480
  this.previousFilterQueries = signal(this.getValue()?.filters || [], /* @ts-ignore */
@@ -27384,7 +27491,10 @@ class AXPListToolbarWidgetViewComponent extends AXPValueWidgetComponent {
27384
27491
  }, /* @ts-ignore */
27385
27492
  ...(ngDevMode ? [{ debugName: "columnDefinitions" }] : /* istanbul ignore next */ []));
27386
27493
  // sorts
27387
- this.sortDefinitions = computed(() => this.options()['sortDefinitions'] || [], /* @ts-ignore */
27494
+ this.sortDefinitions = computed(() => {
27495
+ const definitions = this.options()['sortDefinitions'];
27496
+ return Array.isArray(definitions) ? definitions : [];
27497
+ }, /* @ts-ignore */
27388
27498
  ...(ngDevMode ? [{ debugName: "sortDefinitions" }] : /* istanbul ignore next */ []));
27389
27499
  this.sortPresets = computed(() => this.options()['sortPresets'] ?? [], /* @ts-ignore */
27390
27500
  ...(ngDevMode ? [{ debugName: "sortPresets" }] : /* istanbul ignore next */ []));
@@ -27421,6 +27531,7 @@ class AXPListToolbarWidgetViewComponent extends AXPValueWidgetComponent {
27421
27531
  name: column.name,
27422
27532
  visible: isQueryViewColumnVisible(column.visible),
27423
27533
  })),
27534
+ sortableFieldNames: this.sortDefinitions().map((definition) => definition.name),
27424
27535
  });
27425
27536
  }, /* @ts-ignore */
27426
27537
  ...(ngDevMode ? [{ debugName: "canSaveQueryView" }] : /* istanbul ignore next */ []));
@@ -27644,13 +27755,29 @@ class AXPListToolbarWidgetViewComponent extends AXPValueWidgetComponent {
27644
27755
  setListDisplayMode(mode) {
27645
27756
  const enabled = this.enabledListLayouts();
27646
27757
  if (!enabled.includes(mode) || this.listDisplayMode() === mode) {
27647
- this.listDisplayModePopover()?.close();
27758
+ this.viewPopover()?.close();
27648
27759
  return;
27649
27760
  }
27650
27761
  this.listDisplayMode.set(mode);
27651
27762
  void this.settingsService.scope(AXPPlatformScope.User).set(AXPCommonSettings.EntityListDisplayMode, mode);
27652
27763
  this.setValue({ ...this.getValue(), displayMode: mode });
27653
- this.listDisplayModePopover()?.close();
27764
+ this.viewPopover()?.close();
27765
+ }
27766
+ onViewMenuOpened() {
27767
+ this.viewMenuOpen.set(true);
27768
+ this.viewMenuPanel.set('root');
27769
+ }
27770
+ onViewMenuClosed() {
27771
+ this.viewMenuOpen.set(false);
27772
+ this.viewMenuPanel.set('root');
27773
+ }
27774
+ openViewColumnsPanel() {
27775
+ this.viewMenuPanel.set('columns');
27776
+ }
27777
+ resetViewColumns() {
27778
+ const selected = this.selectedQueryView();
27779
+ const columns = applyQueryViewToColumnQueries(this.columnDefinitions(), selected);
27780
+ this.onColumnsChanged(columns);
27654
27781
  }
27655
27782
  async applyGlobalListDisplayMode() {
27656
27783
  try {
@@ -27668,7 +27795,7 @@ class AXPListToolbarWidgetViewComponent extends AXPValueWidgetComponent {
27668
27795
  }
27669
27796
  }
27670
27797
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPListToolbarWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
27671
- 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 flex-col w-full\">\n @if (showViews()) {\n <!-- ----- Query view tabs and custom-view actions ----- -->\n <axp-query-view-tabs\n class=\"w-full\"\n [views]=\"viewQueries()\"\n [selectedView]=\"selectedViewQuery()\"\n (selectedViewChange)=\"onViewChanged($event)\"\n (edit)=\"onEditQueryView($event)\"\n (remove)=\"onDeleteQueryView($event)\"\n ></axp-query-view-tabs>\n }\n @if (showFilterToolbarRow()) {\n <!-- ----- Filter, column, sort, and list-display controls ----- -->\n <div class=\"flex min-w-0 items-center gap-2 overflow-hidden border-b border-light w-full\">\n <!--------------------------------------------------------------->\n @if (canFilter()) {\n <axp-query-filters\n class=\"min-w-0 flex-1\"\n [filtersDefinitions]=\"filterDefinitions()\"\n [initialFilters]=\"initialFilters()\"\n [mode]=\"filterMode()\"\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 <!--------------------------------------------------------------->\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 <!-- ----- Save View appears when the list layout is dirty ----- -->\n <axp-query-view-save-button\n [visible]=\"canSaveQueryView()\"\n (save)=\"onSaveQueryView()\"\n ></axp-query-view-save-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]=\"pickerColumns()\"\n (columnsChange)=\"onColumnsChanged($event)\"\n ></axp-query-columns>\n </div>\n </div>\n </ax-popover>\n }\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-96 w-full rounded-md overflow-hidden\">\n <axp-query-sorts\n [sortDefinitions]=\"sortDefinitions()\"\n [sortPresets]=\"sortPresets()\"\n [defaultSortQueries]=\"defaultSorts()\"\n (sortQueriesChange)=\"onSortsChanged($event)\"\n [initialSortQueries]=\"initialSorts()\"\n ></axp-query-sorts>\n </div>\n </ax-popover>\n }\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 <!--------------------------------------------------------------->\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 <!--------------------------------------------------------------->\n @if (hasTableListDisplayOption() && (hasCardListDisplayOption() || hasRowListDisplayOption())) {\n <ax-divider />\n }\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 <!--------------------------------------------------------------->\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 }\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1.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", "mode", "quickSearch", "sortPresets", "activeSortPresetName"], outputs: ["onFiltersChanged", "onSortPresetSelected"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i3$2.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "closeOnNavigation", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: AXPQuerySortsComponent, selector: "axp-query-sorts", inputs: ["sortDefinitions", "sortPresets", "initialSortQueries", "defaultSortQueries"], outputs: ["sortDefinitionsChange", "sortQueriesChange"] }, { kind: "component", type: AXPQueryColumnsComponent, selector: "axp-query-columns", inputs: ["columns"], outputs: ["columnsChange"] }, { kind: "component", type: AXPQueryViewSaveButtonComponent, selector: "axp-query-view-save-button", inputs: ["visible"], outputs: ["save"] }, { kind: "component", type: AXPQueryViewTabsComponent, selector: "axp-query-view-tabs", inputs: ["views", "selectedView"], outputs: ["selectedViewChange", "edit", "remove"] }, { kind: "pipe", type: i1$5.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27798
+ 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: "viewPopover", first: true, predicate: ["viewPopover"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"flex flex-col w-full\">\n @if (showViews()) {\n <!-- ----- Query view tabs and custom-view actions ----- -->\n <axp-query-view-tabs\n class=\"w-full\"\n [views]=\"viewQueries()\"\n [selectedView]=\"selectedViewQuery()\"\n (selectedViewChange)=\"onViewChanged($event)\"\n (edit)=\"onEditQueryView($event)\"\n (remove)=\"onDeleteQueryView($event)\"\n ></axp-query-view-tabs>\n }\n @if (showFilterToolbarRow()) {\n <!-- ----- Filter, sort, and view presentation controls ----- -->\n <div class=\"axp-list-toolbar__row flex min-w-0 flex-wrap items-center gap-2 overflow-hidden 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 [mode]=\"filterMode()\"\n (onFiltersChanged)=\"onFiltersChanged($event)\"\n ></axp-query-filters>\n }\n <div class=\"axp-toolbar-list-tools ms-auto flex shrink-0 items-center gap-1\">\n <!-- ----- Apply pending filters when the list is in manual apply mode ----- -->\n @if (filterTriggerMode() === 'manual' && isFiltersDirty()) {\n <ax-button\n [title]=\"'@general:actions.apply.title'\"\n [iconOnly]=\"true\"\n [color]=\"'primary'\"\n (onClick)=\"applyFilters()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-search\" aria-hidden=\"true\"></i>\n </ax-prefix>\n </ax-button>\n }\n <!-- ----- Save View appears when the list layout is dirty ----- -->\n <axp-query-view-save-button\n [visible]=\"canSaveQueryView()\"\n (save)=\"onSaveQueryView()\"\n ></axp-query-view-save-button>\n\n <!-- ----- Sort opens the existing sort panel directly ----- -->\n @if (canSort()) {\n <div class=\"axp-toolbar-btn-host\">\n <ax-button\n class=\"axp-toolbar-btn axp-toolbar-btn-sort\"\n [class.axp-toolbar-btn--active]=\"activeSortCount() > 0\"\n [look]=\"'outline'\"\n [iconOnly]=\"true\"\n [color]=\"activeSortCount() > 0 ? 'primary' : 'default'\"\n [title]=\"\n (activeSortCount() > 0\n ? ('@general:terms.interface.sort.button-active' | translate: { params: { count: activeSortCount() } } | async)\n : ('@general:actions.sort.title' | translate | async)) ?? ''\n \"\n [attr.aria-expanded]=\"sortMenuOpen()\"\n [attr.aria-haspopup]=\"'dialog'\"\n #sortButton\n >\n <ax-prefix>\n <i class=\"fa-light fa-sort-amount-up\" aria-hidden=\"true\"></i>\n </ax-prefix>\n </ax-button>\n <ax-popover\n [adaptivityEnabled]=\"true\"\n [offsetY]=\"8\"\n [target]=\"sortButton\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n (onOpened)=\"sortMenuOpen.set(true)\"\n (onClosed)=\"sortMenuOpen.set(false)\"\n >\n <div class=\"axp-toolbar-popover lightest-surface shadow-md border md:w-96 w-full rounded-md overflow-hidden\">\n <axp-query-sorts\n [sortDefinitions]=\"sortDefinitions()\"\n [sortPresets]=\"sortPresets()\"\n [defaultSortQueries]=\"defaultSorts()\"\n (sortQueriesChange)=\"onSortsChanged($event)\"\n [initialSortQueries]=\"initialSorts()\"\n ></axp-query-sorts>\n </div>\n </ax-popover>\n </div>\n }\n\n <!-- ----- View groups presentation settings ----- -->\n @if (showViewMenu()) {\n <div class=\"axp-toolbar-btn-host\">\n <ax-button\n class=\"axp-toolbar-btn axp-toolbar-btn-view\"\n [look]=\"'outline'\"\n [iconOnly]=\"true\"\n [color]=\"'default'\"\n [title]=\"('@general:terms.interface.view.menu-button' | translate | async) ?? ''\"\n [attr.aria-expanded]=\"viewMenuOpen()\"\n [attr.aria-haspopup]=\"'menu'\"\n #viewButton\n >\n <ax-prefix>\n <i class=\"fa-light fa-sliders\" aria-hidden=\"true\"></i>\n </ax-prefix>\n </ax-button>\n <ax-popover\n [adaptivityEnabled]=\"true\"\n [offsetY]=\"8\"\n [target]=\"viewButton\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n (onOpened)=\"onViewMenuOpened()\"\n (onClosed)=\"onViewMenuClosed()\"\n #viewPopover\n >\n <div class=\"axp-toolbar-popover axp-toolbar-view-menu lightest-surface shadow-md border w-72 max-w-full rounded-md overflow-hidden\">\n <!-- ----- Nested column visibility panel ----- -->\n @if (viewMenuPanel() === 'columns') {\n <div class=\"axp-toolbar-view-menu__header flex items-center justify-between gap-2 border-b border-light px-3 py-2\">\n <ax-button\n class=\"ax-sm\"\n [look]=\"'blank'\"\n [color]=\"'default'\"\n [title]=\"('@general:actions.back.title' | translate | async) ?? ''\"\n (onClick)=\"viewMenuPanel.set('root')\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-chevron-left rtl:rotate-180\" aria-hidden=\"true\"></i>\n </ax-prefix>\n </ax-button>\n <span class=\"min-w-0 flex-1 truncate font-bold\">\n {{ '@general:terms.common.columns' | translate | async }}\n </span>\n <ax-button\n class=\"ax-sm\"\n [look]=\"'blank'\"\n [color]=\"'primary'\"\n [text]=\"'@general:actions.reset.title' | translate | async\"\n (onClick)=\"resetViewColumns()\"\n ></ax-button>\n </div>\n <div class=\"axp-toolbar-view-menu__body px-4 py-3\">\n <axp-query-columns\n [columns]=\"pickerColumns()\"\n [constrainHeight]=\"false\"\n (columnsChange)=\"onColumnsChanged($event)\"\n ></axp-query-columns>\n </div>\n }\n <!-- ----- Root presentation menu ----- -->\n @else {\n <div class=\"axp-toolbar-view-menu__header border-b border-light px-4 py-3 font-bold\">\n {{ '@general:terms.interface.view.menu-title' | translate | async }}\n </div>\n <div class=\"axp-toolbar-view-menu__body py-2\">\n <!-- ----- Display mode ----- -->\n @if (showListDisplayModeControl()) {\n <div class=\"axp-toolbar-view-menu__section-label px-4\">\n {{ '@general:terms.interface.view.display-mode' | translate | async }}\n </div>\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\" aria-hidden=\"true\"></i>\n </ax-prefix>\n <!--->\n <!-- ----- Selected table layout ----- -->\n @if (listDisplayMode() === 'table') {\n <ax-suffix>\n <i class=\"fa-light fa-check\" aria-hidden=\"true\"></i>\n </ax-suffix>\n }\n </ax-button-item>\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\" aria-hidden=\"true\"></i>\n </ax-prefix>\n <!--->\n <!-- ----- Selected card layout ----- -->\n @if (listDisplayMode() === 'card') {\n <ax-suffix>\n <i class=\"fa-light fa-check\" aria-hidden=\"true\"></i>\n </ax-suffix>\n }\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\" aria-hidden=\"true\"></i>\n </ax-prefix>\n <!--->\n <!-- ----- Selected row layout ----- -->\n @if (listDisplayMode() === 'row') {\n <ax-suffix>\n <i class=\"fa-light fa-check\" aria-hidden=\"true\"></i>\n </ax-suffix>\n }\n </ax-button-item>\n }\n </ax-button-item-list>\n }\n\n <!-- ----- Columns ----- -->\n @if (showColumnsControl()) {\n <!--->\n <!-- ----- Divider when a display-mode section is already shown ----- -->\n @if (showListDisplayModeControl()) {\n <ax-divider />\n }\n <div class=\"axp-toolbar-view-menu__section-label px-4\">\n {{ '@general:terms.common.columns' | translate | async }}\n </div>\n <ax-button-item-list>\n <ax-button-item\n [text]=\"('@general:terms.interface.view.manage-columns' | translate | async)!\"\n (onClick)=\"openViewColumnsPanel()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-table-columns\" aria-hidden=\"true\"></i>\n </ax-prefix>\n <ax-suffix>\n <i class=\"fa-light fa-chevron-right rtl:rotate-180\" aria-hidden=\"true\"></i>\n </ax-suffix>\n </ax-button-item>\n </ax-button-item-list>\n }\n </div>\n }\n </div>\n </ax-popover>\n </div>\n }\n </div>\n </div>\n }\n</div>\n", styles: ["@layer properties;.axp-list-toolbar__row{box-sizing:border-box;min-height:2.875rem;padding-block:.1875rem}.axp-toolbar-list-tools{width:max-content;flex:0 0 auto}.axp-toolbar-btn-host{display:inline-flex;width:max-content;flex:0 0 auto;position:relative}.axp-toolbar-btn.ax-button,.axp-toolbar-btn{flex:0 0 auto;width:max-content}.axp-toolbar-btn.ax-button-icon,.axp-toolbar-btn.ax-button-icon button{box-sizing:border-box;height:var(--ax-sys-size-base);min-height:var(--ax-sys-size-base);max-height:var(--ax-sys-size-base);min-width:var(--ax-sys-size-base);max-width:var(--ax-sys-size-base);width:var(--ax-sys-size-base)}.axp-toolbar-btn-sort.ax-button-icon button i{font-size:1em}.axp-toolbar-btn--active button{background-color:rgba(var(--ax-sys-color-primary-surface))}@supports (color: color-mix(in lab,red,red)){.axp-toolbar-btn--active button{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-primary-surface)) 10%,transparent)}}.axp-toolbar-view-menu__section-label{padding-inline:var(--spacing, .25rem);padding-top:var(--spacing, .25rem);padding-bottom:var(--spacing, .25rem);font-size:10px;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-wider, .05em);letter-spacing:var(--tracking-wider, .05em);color:var(--color-neutral-400, oklch(70.8% 0 none));text-transform:uppercase}.axp-toolbar-popover{display:flex;max-height:min(28rem,70vh);flex-direction:column;overflow:hidden}.axp-toolbar-view-menu__header{flex-shrink:0}.axp-toolbar-view-menu__body{min-height:0px;flex:1;overflow-x:hidden;overflow-y:auto}.axp-toolbar-view-menu__body .ax-sorted-list{max-height:none;overflow:visible}@media(max-width:600px){.axp-toolbar-list-tools{justify-content:flex-end}}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-tracking{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-font-weight: initial;--tw-tracking: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1.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", "mode", "quickSearch", "sortPresets", "activeSortPresetName"], outputs: ["onFiltersChanged", "onSortPresetSelected"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i3$2.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "closeOnNavigation", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: AXPQuerySortsComponent, selector: "axp-query-sorts", inputs: ["sortDefinitions", "sortPresets", "initialSortQueries", "defaultSortQueries"], outputs: ["sortDefinitionsChange", "sortQueriesChange"] }, { kind: "component", type: AXPQueryColumnsComponent, selector: "axp-query-columns", inputs: ["columns", "constrainHeight"], outputs: ["columnsChange"] }, { kind: "component", type: AXPQueryViewSaveButtonComponent, selector: "axp-query-view-save-button", inputs: ["visible"], outputs: ["save"] }, { kind: "component", type: AXPQueryViewTabsComponent, selector: "axp-query-view-tabs", inputs: ["views", "selectedView"], outputs: ["selectedViewChange", "edit", "remove"] }, { kind: "pipe", type: i1$5.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27672
27799
  }
27673
27800
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPListToolbarWidgetViewComponent, decorators: [{
27674
27801
  type: Component,
@@ -27683,8 +27810,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
27683
27810
  AXPQueryColumnsComponent,
27684
27811
  AXPQueryViewSaveButtonComponent,
27685
27812
  AXPQueryViewTabsComponent,
27686
- ], template: "<div class=\"flex flex-col w-full\">\n @if (showViews()) {\n <!-- ----- Query view tabs and custom-view actions ----- -->\n <axp-query-view-tabs\n class=\"w-full\"\n [views]=\"viewQueries()\"\n [selectedView]=\"selectedViewQuery()\"\n (selectedViewChange)=\"onViewChanged($event)\"\n (edit)=\"onEditQueryView($event)\"\n (remove)=\"onDeleteQueryView($event)\"\n ></axp-query-view-tabs>\n }\n @if (showFilterToolbarRow()) {\n <!-- ----- Filter, column, sort, and list-display controls ----- -->\n <div class=\"flex min-w-0 items-center gap-2 overflow-hidden border-b border-light w-full\">\n <!--------------------------------------------------------------->\n @if (canFilter()) {\n <axp-query-filters\n class=\"min-w-0 flex-1\"\n [filtersDefinitions]=\"filterDefinitions()\"\n [initialFilters]=\"initialFilters()\"\n [mode]=\"filterMode()\"\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 <!--------------------------------------------------------------->\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 <!-- ----- Save View appears when the list layout is dirty ----- -->\n <axp-query-view-save-button\n [visible]=\"canSaveQueryView()\"\n (save)=\"onSaveQueryView()\"\n ></axp-query-view-save-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]=\"pickerColumns()\"\n (columnsChange)=\"onColumnsChanged($event)\"\n ></axp-query-columns>\n </div>\n </div>\n </ax-popover>\n }\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-96 w-full rounded-md overflow-hidden\">\n <axp-query-sorts\n [sortDefinitions]=\"sortDefinitions()\"\n [sortPresets]=\"sortPresets()\"\n [defaultSortQueries]=\"defaultSorts()\"\n (sortQueriesChange)=\"onSortsChanged($event)\"\n [initialSortQueries]=\"initialSorts()\"\n ></axp-query-sorts>\n </div>\n </ax-popover>\n }\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 <!--------------------------------------------------------------->\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 <!--------------------------------------------------------------->\n @if (hasTableListDisplayOption() && (hasCardListDisplayOption() || hasRowListDisplayOption())) {\n <ax-divider />\n }\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 <!--------------------------------------------------------------->\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 }\n</div>\n" }]
27687
- }], propDecorators: { listDisplayModePopover: [{ type: i0.ViewChild, args: ['listDisplayModePopover', { isSignal: true }] }] } });
27813
+ ], template: "<div class=\"flex flex-col w-full\">\n @if (showViews()) {\n <!-- ----- Query view tabs and custom-view actions ----- -->\n <axp-query-view-tabs\n class=\"w-full\"\n [views]=\"viewQueries()\"\n [selectedView]=\"selectedViewQuery()\"\n (selectedViewChange)=\"onViewChanged($event)\"\n (edit)=\"onEditQueryView($event)\"\n (remove)=\"onDeleteQueryView($event)\"\n ></axp-query-view-tabs>\n }\n @if (showFilterToolbarRow()) {\n <!-- ----- Filter, sort, and view presentation controls ----- -->\n <div class=\"axp-list-toolbar__row flex min-w-0 flex-wrap items-center gap-2 overflow-hidden 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 [mode]=\"filterMode()\"\n (onFiltersChanged)=\"onFiltersChanged($event)\"\n ></axp-query-filters>\n }\n <div class=\"axp-toolbar-list-tools ms-auto flex shrink-0 items-center gap-1\">\n <!-- ----- Apply pending filters when the list is in manual apply mode ----- -->\n @if (filterTriggerMode() === 'manual' && isFiltersDirty()) {\n <ax-button\n [title]=\"'@general:actions.apply.title'\"\n [iconOnly]=\"true\"\n [color]=\"'primary'\"\n (onClick)=\"applyFilters()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-search\" aria-hidden=\"true\"></i>\n </ax-prefix>\n </ax-button>\n }\n <!-- ----- Save View appears when the list layout is dirty ----- -->\n <axp-query-view-save-button\n [visible]=\"canSaveQueryView()\"\n (save)=\"onSaveQueryView()\"\n ></axp-query-view-save-button>\n\n <!-- ----- Sort opens the existing sort panel directly ----- -->\n @if (canSort()) {\n <div class=\"axp-toolbar-btn-host\">\n <ax-button\n class=\"axp-toolbar-btn axp-toolbar-btn-sort\"\n [class.axp-toolbar-btn--active]=\"activeSortCount() > 0\"\n [look]=\"'outline'\"\n [iconOnly]=\"true\"\n [color]=\"activeSortCount() > 0 ? 'primary' : 'default'\"\n [title]=\"\n (activeSortCount() > 0\n ? ('@general:terms.interface.sort.button-active' | translate: { params: { count: activeSortCount() } } | async)\n : ('@general:actions.sort.title' | translate | async)) ?? ''\n \"\n [attr.aria-expanded]=\"sortMenuOpen()\"\n [attr.aria-haspopup]=\"'dialog'\"\n #sortButton\n >\n <ax-prefix>\n <i class=\"fa-light fa-sort-amount-up\" aria-hidden=\"true\"></i>\n </ax-prefix>\n </ax-button>\n <ax-popover\n [adaptivityEnabled]=\"true\"\n [offsetY]=\"8\"\n [target]=\"sortButton\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n (onOpened)=\"sortMenuOpen.set(true)\"\n (onClosed)=\"sortMenuOpen.set(false)\"\n >\n <div class=\"axp-toolbar-popover lightest-surface shadow-md border md:w-96 w-full rounded-md overflow-hidden\">\n <axp-query-sorts\n [sortDefinitions]=\"sortDefinitions()\"\n [sortPresets]=\"sortPresets()\"\n [defaultSortQueries]=\"defaultSorts()\"\n (sortQueriesChange)=\"onSortsChanged($event)\"\n [initialSortQueries]=\"initialSorts()\"\n ></axp-query-sorts>\n </div>\n </ax-popover>\n </div>\n }\n\n <!-- ----- View groups presentation settings ----- -->\n @if (showViewMenu()) {\n <div class=\"axp-toolbar-btn-host\">\n <ax-button\n class=\"axp-toolbar-btn axp-toolbar-btn-view\"\n [look]=\"'outline'\"\n [iconOnly]=\"true\"\n [color]=\"'default'\"\n [title]=\"('@general:terms.interface.view.menu-button' | translate | async) ?? ''\"\n [attr.aria-expanded]=\"viewMenuOpen()\"\n [attr.aria-haspopup]=\"'menu'\"\n #viewButton\n >\n <ax-prefix>\n <i class=\"fa-light fa-sliders\" aria-hidden=\"true\"></i>\n </ax-prefix>\n </ax-button>\n <ax-popover\n [adaptivityEnabled]=\"true\"\n [offsetY]=\"8\"\n [target]=\"viewButton\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n (onOpened)=\"onViewMenuOpened()\"\n (onClosed)=\"onViewMenuClosed()\"\n #viewPopover\n >\n <div class=\"axp-toolbar-popover axp-toolbar-view-menu lightest-surface shadow-md border w-72 max-w-full rounded-md overflow-hidden\">\n <!-- ----- Nested column visibility panel ----- -->\n @if (viewMenuPanel() === 'columns') {\n <div class=\"axp-toolbar-view-menu__header flex items-center justify-between gap-2 border-b border-light px-3 py-2\">\n <ax-button\n class=\"ax-sm\"\n [look]=\"'blank'\"\n [color]=\"'default'\"\n [title]=\"('@general:actions.back.title' | translate | async) ?? ''\"\n (onClick)=\"viewMenuPanel.set('root')\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-chevron-left rtl:rotate-180\" aria-hidden=\"true\"></i>\n </ax-prefix>\n </ax-button>\n <span class=\"min-w-0 flex-1 truncate font-bold\">\n {{ '@general:terms.common.columns' | translate | async }}\n </span>\n <ax-button\n class=\"ax-sm\"\n [look]=\"'blank'\"\n [color]=\"'primary'\"\n [text]=\"'@general:actions.reset.title' | translate | async\"\n (onClick)=\"resetViewColumns()\"\n ></ax-button>\n </div>\n <div class=\"axp-toolbar-view-menu__body px-4 py-3\">\n <axp-query-columns\n [columns]=\"pickerColumns()\"\n [constrainHeight]=\"false\"\n (columnsChange)=\"onColumnsChanged($event)\"\n ></axp-query-columns>\n </div>\n }\n <!-- ----- Root presentation menu ----- -->\n @else {\n <div class=\"axp-toolbar-view-menu__header border-b border-light px-4 py-3 font-bold\">\n {{ '@general:terms.interface.view.menu-title' | translate | async }}\n </div>\n <div class=\"axp-toolbar-view-menu__body py-2\">\n <!-- ----- Display mode ----- -->\n @if (showListDisplayModeControl()) {\n <div class=\"axp-toolbar-view-menu__section-label px-4\">\n {{ '@general:terms.interface.view.display-mode' | translate | async }}\n </div>\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\" aria-hidden=\"true\"></i>\n </ax-prefix>\n <!--->\n <!-- ----- Selected table layout ----- -->\n @if (listDisplayMode() === 'table') {\n <ax-suffix>\n <i class=\"fa-light fa-check\" aria-hidden=\"true\"></i>\n </ax-suffix>\n }\n </ax-button-item>\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\" aria-hidden=\"true\"></i>\n </ax-prefix>\n <!--->\n <!-- ----- Selected card layout ----- -->\n @if (listDisplayMode() === 'card') {\n <ax-suffix>\n <i class=\"fa-light fa-check\" aria-hidden=\"true\"></i>\n </ax-suffix>\n }\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\" aria-hidden=\"true\"></i>\n </ax-prefix>\n <!--->\n <!-- ----- Selected row layout ----- -->\n @if (listDisplayMode() === 'row') {\n <ax-suffix>\n <i class=\"fa-light fa-check\" aria-hidden=\"true\"></i>\n </ax-suffix>\n }\n </ax-button-item>\n }\n </ax-button-item-list>\n }\n\n <!-- ----- Columns ----- -->\n @if (showColumnsControl()) {\n <!--->\n <!-- ----- Divider when a display-mode section is already shown ----- -->\n @if (showListDisplayModeControl()) {\n <ax-divider />\n }\n <div class=\"axp-toolbar-view-menu__section-label px-4\">\n {{ '@general:terms.common.columns' | translate | async }}\n </div>\n <ax-button-item-list>\n <ax-button-item\n [text]=\"('@general:terms.interface.view.manage-columns' | translate | async)!\"\n (onClick)=\"openViewColumnsPanel()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-table-columns\" aria-hidden=\"true\"></i>\n </ax-prefix>\n <ax-suffix>\n <i class=\"fa-light fa-chevron-right rtl:rotate-180\" aria-hidden=\"true\"></i>\n </ax-suffix>\n </ax-button-item>\n </ax-button-item-list>\n }\n </div>\n }\n </div>\n </ax-popover>\n </div>\n }\n </div>\n </div>\n }\n</div>\n", styles: ["@layer properties;.axp-list-toolbar__row{box-sizing:border-box;min-height:2.875rem;padding-block:.1875rem}.axp-toolbar-list-tools{width:max-content;flex:0 0 auto}.axp-toolbar-btn-host{display:inline-flex;width:max-content;flex:0 0 auto;position:relative}.axp-toolbar-btn.ax-button,.axp-toolbar-btn{flex:0 0 auto;width:max-content}.axp-toolbar-btn.ax-button-icon,.axp-toolbar-btn.ax-button-icon button{box-sizing:border-box;height:var(--ax-sys-size-base);min-height:var(--ax-sys-size-base);max-height:var(--ax-sys-size-base);min-width:var(--ax-sys-size-base);max-width:var(--ax-sys-size-base);width:var(--ax-sys-size-base)}.axp-toolbar-btn-sort.ax-button-icon button i{font-size:1em}.axp-toolbar-btn--active button{background-color:rgba(var(--ax-sys-color-primary-surface))}@supports (color: color-mix(in lab,red,red)){.axp-toolbar-btn--active button{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-primary-surface)) 10%,transparent)}}.axp-toolbar-view-menu__section-label{padding-inline:var(--spacing, .25rem);padding-top:var(--spacing, .25rem);padding-bottom:var(--spacing, .25rem);font-size:10px;--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-tracking: var(--tracking-wider, .05em);letter-spacing:var(--tracking-wider, .05em);color:var(--color-neutral-400, oklch(70.8% 0 none));text-transform:uppercase}.axp-toolbar-popover{display:flex;max-height:min(28rem,70vh);flex-direction:column;overflow:hidden}.axp-toolbar-view-menu__header{flex-shrink:0}.axp-toolbar-view-menu__body{min-height:0px;flex:1;overflow-x:hidden;overflow-y:auto}.axp-toolbar-view-menu__body .ax-sorted-list{max-height:none;overflow:visible}@media(max-width:600px){.axp-toolbar-list-tools{justify-content:flex-end}}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-tracking{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-font-weight: initial;--tw-tracking: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
27814
+ }], propDecorators: { viewPopover: [{ type: i0.ViewChild, args: ['viewPopover', { isSignal: true }] }] } });
27688
27815
 
27689
27816
  var listToolbarWidgetView_component = /*#__PURE__*/Object.freeze({
27690
27817
  __proto__: null,
@@ -31107,10 +31234,11 @@ const AXPGridWidget = {
31107
31234
  class AXPGridItemWidgetDesignerComponent extends AXPGridItemBaseLayoutWidgetComponent {
31108
31235
  get __class() {
31109
31236
  const cls = { ...this.hostClass() };
31110
- // Entity forms keep col-span-12 so fields stack until lg:col-span-N.
31111
- // A designer grid of 3 columns would turn that into one cell per row.
31237
+ // Designer grids are often 3 columns. Leave empty cells unsized so they
31238
+ // do not inherit the form default (col-span-12 + narrow-container stack).
31112
31239
  if (this.options()?.['colSpan'] == null) {
31113
31240
  delete cls['col-span-12'];
31241
+ delete cls[`${axpGridNarrowContainerQueryPrefix()}col-span-12`];
31114
31242
  }
31115
31243
  return cls;
31116
31244
  }
@@ -32406,7 +32534,7 @@ const AXPTextBlockWidget = {
32406
32534
  component: () => Promise.resolve().then(function () { return textBlockWidgetView_component; }).then((c) => c.AXPTextBlockWidgetViewComponent),
32407
32535
  },
32408
32536
  designer: {
32409
- component: () => import('./acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-BEa-vD6O.mjs').then((c) => c.AXPTextBlockWidgetDesignerComponent),
32537
+ component: () => import('./acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-DfgIxNyy.mjs').then((c) => c.AXPTextBlockWidgetDesignerComponent),
32410
32538
  },
32411
32539
  },
32412
32540
  };
@@ -33188,4 +33316,4 @@ var getWidgetsForAi_query = /*#__PURE__*/Object.freeze({
33188
33316
  */
33189
33317
 
33190
33318
  export { AXPConditionClauseWidget as $, AXP_REPEATER_ENTITY_BY_KEY_LOOKUP as A, AXPCallbackValidationWidgetEditComponent as B, AXPCheckBoxWidget as C, AXPCheckBoxWidgetColumnComponent as D, AXPCheckBoxWidgetDesignerComponent as E, AXPCheckBoxWidgetEditComponent as F, AXPCheckBoxWidgetPrintComponent as G, AXPCheckBoxWidgetViewComponent as H, AXPCodeEditorWidget as I, AXPColorBoxWidget as J, AXPColorBoxWidgetColumnComponent as K, AXPColorBoxWidgetDesignerComponent as L, AXPColorBoxWidgetEditComponent as M, AXPColorBoxWidgetViewComponent as N, AXPColorChooserWidget as O, AXPColorChooserWidgetColumnComponent as P, AXPColorChooserWidgetDesignerComponent as Q, AXPColorChooserWidgetEditComponent as R, AXPColorChooserWidgetViewComponent as S, AXPColorPaletteWidget as T, AXPColorPaletteWidgetColumnComponent as U, AXPColorPaletteWidgetDesignerComponent as V, AXPColorPaletteWidgetEditComponent as W, AXPColorPaletteWidgetViewComponent as X, AXPConditionBuilderWidget as Y, AXPConditionBuilderWidgetEditComponent as Z, AXPConditionBuilderWidgetViewComponent as _, textBlockContentClass as a, AXPLargeTextWidget as a$, AXPConditionClauseWidgetEditComponent as a0, AXPConnectedDragDropListsWidget as a1, AXPConnectedListsWidgetColumnComponent as a2, AXPConnectedListsWidgetEditComponent as a3, AXPConnectedListsWidgetViewComponent as a4, AXPContactWidget as a5, AXPContactWidgetColumnComponent as a6, AXPContactWidgetEditComponent as a7, AXPContactWidgetViewComponent as a8, AXPDataListWidget as a9, AXPFlexItemWidgetViewComponent as aA, AXPFlexOptionsWidget as aB, AXPFlexOptionsWidgetEditComponent as aC, AXPFlexWidget as aD, AXPFlexWidgetDesignerComponent as aE, AXPFlexWidgetViewComponent as aF, AXPGetWidgetsForAIQuery as aG, AXPGreaterThanExpressionValidationWidget as aH, AXPGreaterThanValidationWidgetEditComponent as aI, AXPGridItemOptionsWidget as aJ, AXPGridItemOptionsWidgetEditComponent as aK, AXPGridOptionsWidget as aL, AXPGridOptionsWidgetEditComponent as aM, AXPImageMarkerPopupComponent as aN, AXPImageMarkerWidget as aO, AXPImageMarkerWidgetColumnComponent as aP, AXPImageMarkerWidgetEditComponent as aQ, AXPImageMarkerWidgetViewComponent as aR, AXPIntegrationConnectionActionsService as aS, AXPIntegrationConnectionsPanelWidget as aT, AXPIntegrationConnectionsPanelWidgetEditComponent as aU, AXPItemConfiguratorWidget as aV, AXPItemConfiguratorWidgetColumnComponent as aW, AXPItemConfiguratorWidgetEditComponent as aX, AXPJsonViewerWidget as aY, AXPJsonViewerWidgetEditComponent as aZ, AXPJsonViewerWidgetViewComponent as a_, AXPDataListWidgetViewComponent as aa, AXPDataSourceOptionsWidget as ab, AXPDataSourceOptionsWidgetEditComponent as ac, AXPDateTimeBoxWidget as ad, AXPDateTimeBoxWidgetColumnComponent as ae, AXPDateTimeBoxWidgetEditComponent as af, AXPDateTimeBoxWidgetViewComponent as ag, AXPDirectionWidget as ah, AXPDirectionWidgetEditComponent as ai, AXPDragDropListWidget as aj, AXPEditorJsWidget as ak, AXPEditorJsWidgetColumnComponent as al, AXPEditorJsWidgetEditComponent as am, AXPEditorJsWidgetViewComponent as an, AXPEqualValidationWidget as ao, AXPEqualValidationWidgetEditComponent as ap, AXPFieldsetWidget as aq, AXPFieldsetWidgetDesignerComponent as ar, AXPFieldsetWidgetViewComponent as as, AXPFileViewerWidget as at, AXPFileViewerWidgetEditComponent as au, AXPFileViewerWidgetViewComponent as av, AXPFlexItemOptionsWidget as aw, AXPFlexItemOptionsWidgetEditComponent as ax, AXPFlexItemWidget as ay, AXPFlexItemWidgetDesignerComponent as az, AXPAdvancedGridItemWidget as b, AXPRichTextWidgetViewComponent as b$, AXPLargeTextWidgetColumnComponent as b0, AXPLargeTextWidgetEditComponent as b1, AXPLargeTextWidgetPrintComponent as b2, AXPLargeTextWidgetViewComponent as b3, AXPLessThanExpressionValidationWidget as b4, AXPLessThanValidationWidgetEditComponent as b5, AXPListStylingRulesExtendedWidget as b6, AXPListWidgetColumnComponent as b7, AXPListWidgetEditComponent as b8, AXPListWidgetViewComponent as b9, AXPProgressBarWidgetColumnComponent as bA, AXPProgressBarWidgetEditComponent as bB, AXPProgressBarWidgetViewComponent as bC, AXPProviderSelectWidgetColumnComponent as bD, AXPProviderSelectWidgetEditBase as bE, AXPProviderSelectWidgetViewComponent as bF, AXPQrcodeViewerService as bG, AXPQrcodeWidget as bH, AXPQrcodeWidgetColumnComponent as bI, AXPQrcodeWidgetEditComponent as bJ, AXPQrcodeWidgetViewComponent as bK, AXPRatePickerWidget as bL, AXPRatePickerWidgetColumnComponent as bM, AXPRatePickerWidgetEditComponent as bN, AXPRatePickerWidgetViewComponent as bO, AXPRegularExpressionValidationWidget as bP, AXPRegularExpressionValidationWidgetEditComponent as bQ, AXPRepeaterWidget as bR, AXPRepeaterWidgetDesignerComponent as bS, AXPRepeaterWidgetEditComponent as bT, AXPRepeaterWidgetViewComponent as bU, AXPRequiredValidationWidget as bV, AXPRequiredValidationWidgetEditComponent as bW, AXPRichTextWidget as bX, AXPRichTextWidgetColumnComponent as bY, AXPRichTextWidgetEditComponent as bZ, AXPRichTextWidgetPrintComponent as b_, AXPLocalDataSourceSheetWidget as ba, AXPLocalDataSourceSheetWidgetEditComponent as bb, AXPMapWidgetEditComponent as bc, AXPMapWidgetViewComponent as bd, AXPMaxLengthExpressionValidationWidget as be, AXPMaxLengthValidationWidgetEditComponent as bf, AXPMinLengthExpressionValidationWidget as bg, AXPMinLengthValidationWidgetEditComponent as bh, AXPNodeRendererWidget as bi, AXPNodeRendererWidgetDesignerComponent as bj, AXPNodeRendererWidgetEditComponent as bk, AXPNodeRendererWidgetViewComponent as bl, AXPNumberBoxWidget as bm, AXPNumberBoxWidgetColumnComponent as bn, AXPNumberBoxWidgetEditComponent as bo, AXPNumberBoxWidgetPrintComponent as bp, AXPNumberBoxWidgetViewComponent as bq, AXPOutcomeResultsViewerWidget as br, AXPOutcomeResultsViewerWidgetViewComponent as bs, AXPPageWidget as bt, AXPPageWidgetViewComponent as bu, AXPPasswordBoxWidget as bv, AXPPasswordBoxWidgetColumnComponent as bw, AXPPasswordBoxWidgetEditComponent as bx, AXPPasswordBoxWidgetViewComponent as by, AXPProgressBarWidget as bz, AXPAdvancedGridItemWidgetDesignerComponent as c, AXP_Flex_Box_Align_Options as c$, AXPSchedulerPickerWidget as c0, AXPSelectBoxWidget as c1, AXPSelectBoxWidgetColumnComponent as c2, AXPSelectBoxWidgetEditComponent as c3, AXPSelectBoxWidgetViewComponent as c4, AXPSelectLanguagePopup as c5, AXPSelectionListWidget as c6, AXPSelectionListWidgetColumnComponent as c7, AXPSelectionListWidgetDesignerComponent as c8, AXPSelectionListWidgetEditComponent as c9, AXPTagEditorWidgetViewComponent as cA, AXPTemplateBoxWidget as cB, AXPTemplateBoxWidgetColumnComponent as cC, AXPTemplateBoxWidgetEditComponent as cD, AXPTemplateBoxWidgetPrintComponent as cE, AXPTemplateBoxWidgetViewComponent as cF, AXPTextBoxWidget as cG, AXPTextBoxWidgetColumnComponent as cH, AXPTextBoxWidgetEditComponent as cI, AXPTextBoxWidgetPrintComponent as cJ, AXPTextBoxWidgetViewComponent as cK, AXPToggleWidget as cL, AXPToggleWidgetColumnComponent as cM, AXPToggleWidgetEditComponent as cN, AXPToggleWidgetPrintComponent as cO, AXPToggleWidgetViewComponent as cP, AXPWidgetFieldConfiguratorWidget as cQ, AXPWidgetFieldConfiguratorWidgetColumnComponent as cR, AXPWidgetFieldConfiguratorWidgetEditComponent as cS, AXPWidgetsModule as cT, AXP_ABSOLUTE_UNITS as cU, AXP_BORDER_RADIUS_UNITS as cV, AXP_BORDER_WIDTH_UNITS as cW, AXP_CONDITION_CLAUSE_WIDGET_NAME as cX, AXP_DATA_LIST_CMD_DELETE as cY, AXP_DATA_LIST_CMD_EDIT as cZ, AXP_DATA_LIST_PENDING_DELETE_KEY as c_, AXPSelectionListWidgetViewComponent as ca, AXPSignatureWidget as cb, AXPSignatureWidgetColumnComponent as cc, AXPSignatureWidgetEditComponent as cd, AXPSignatureWidgetViewComponent as ce, AXPSpacingWidget as cf, AXPSpacingWidgetEditComponent as cg, AXPStatusChipComponent as ch, AXPStatusWidget as ci, AXPStatusWidgetColumnComponent as cj, AXPStatusWidgetEditComponent as ck, AXPStatusWidgetViewComponent as cl, AXPStepWizardWidget as cm, AXPStepWizardWidgetDesignerComponent as cn, AXPStepWizardWidgetViewComponent as co, AXPStopwatchWidget as cp, AXPStopwatchWidgetViewComponent as cq, AXPTableItemWidget as cr, AXPTableItemWidgetDesignerComponent as cs, AXPTableItemWidgetViewComponent as ct, AXPTableWidget as cu, AXPTableWidgetDesignerComponent as cv, AXPTableWidgetViewComponent as cw, AXPTagEditorWidget as cx, AXPTagEditorWidgetColumnComponent as cy, AXPTagEditorWidgetEditComponent as cz, AXPAdvancedGridItemWidgetViewComponent as d, AXP_Flex_Box_Alignments as d0, AXP_Flex_Box_Justify_Options as d1, AXP_Grid_Box_Align_Items_Options as d2, AXP_Grid_Box_Alignments as d3, AXP_Grid_Box_Justify_Items_Options as d4, AXP_LIST_STYLING_RULES_WIDGET_NAME as d5, AXP_LOCAL_DATA_SOURCE_SHEET_WIDGET_NAME as d6, AXP_RELATIVE_UNITS as d7, AXP_RELATIVE_UNITS_NO_PERCENT as d8, AXP_ROW_EXPR_PREFIX as d9, AXP_SPACING_UNITS as da, AXP_default_Border_Box_Units as db, AXP_default_Border_Box_Value as dc, AXP_default_Spacing_Box_Units as dd, AXP_default_Spacing_Box_Value as de, DEFAULT_QRCODE_SIZE as df, DEFAULT_STRATEGY_CONFIG as dg, STRATEGY_CONFIG_TOKEN as dh, applyLeafVisibilityToDataListColumnTree as di, flattenDataListWidgetColumns as dj, formatConditionBuilderChip as dk, formatConditionBuilderSentence as dl, isDataListColumnBand as dm, prepareNodeRendererChild as dn, resolveColorChooserGroups as dp, resolveDataListColumnWidth as dq, tokensToPlainText as dr, AXPAdvancedGridOptionsWidget as e, AXPAdvancedGridOptionsWidgetEditComponent as f, AXPAdvancedGridWidget as g, AXPAdvancedGridWidgetDesignerComponent as h, AXPAdvancedGridWidgetViewComponent as i, AXPAvatarWidget as j, AXPAvatarWidgetColumnComponent as k, AXPAvatarWidgetDesignerComponent as l, AXPAvatarWidgetEditComponent as m, AXPAvatarWidgetViewComponent as n, AXPBetweenExpressionValidationWidget as o, AXPBetweenValidationWidgetEditComponent as p, AXPBlockWidget as q, AXPBlockWidgetDesignerComponent as r, AXPBlockWidgetViewComponent as s, textBlockStyleAttribute as t, AXPBorderWidget as u, AXPBorderWidgetEditComponent as v, AXPButtonWidget as w, AXPButtonWidgetColumnComponent as x, AXPButtonWidgetViewComponent as y, AXPCallbackValidationWidget as z };
33191
- //# sourceMappingURL=acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-CDpzvn6z.mjs.map
33319
+ //# sourceMappingURL=acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-BwwxqHzR.mjs.map