@acorex/platform 21.0.0-next.72 → 21.0.0-next.73

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 (35) hide show
  1. package/contracts/README.md +3 -0
  2. package/fesm2022/acorex-platform-auth.mjs +72 -58
  3. package/fesm2022/acorex-platform-auth.mjs.map +1 -1
  4. package/fesm2022/acorex-platform-common.mjs +12 -6
  5. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  6. package/fesm2022/acorex-platform-contracts.mjs +10 -0
  7. package/fesm2022/acorex-platform-contracts.mjs.map +1 -0
  8. package/fesm2022/acorex-platform-core.mjs +15 -12
  9. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  10. package/fesm2022/acorex-platform-layout-builder.mjs +3 -0
  11. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  12. package/fesm2022/acorex-platform-layout-components.mjs +185 -8
  13. package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
  14. package/fesm2022/acorex-platform-layout-entity.mjs +64 -44
  15. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  16. package/fesm2022/acorex-platform-layout-widget-core.mjs +11 -1
  17. package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
  18. package/fesm2022/acorex-platform-layout-widgets.mjs +279 -108
  19. package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
  20. package/fesm2022/acorex-platform-themes-default.mjs +4 -4
  21. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  22. package/fesm2022/acorex-platform-themes-shared-settings.provider-BjuzSe0T.mjs.map +1 -1
  23. package/fesm2022/acorex-platform-themes-shared.mjs +3 -0
  24. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  25. package/fesm2022/acorex-platform-workflow.mjs +57 -54
  26. package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
  27. package/package.json +5 -1
  28. package/types/acorex-platform-auth.d.ts +29 -22
  29. package/types/acorex-platform-common.d.ts +7 -6
  30. package/types/acorex-platform-contracts.d.ts +39 -0
  31. package/types/acorex-platform-core.d.ts +8 -8
  32. package/types/acorex-platform-layout-components.d.ts +77 -7
  33. package/types/acorex-platform-layout-entity.d.ts +185 -175
  34. package/types/acorex-platform-layout-widget-core.d.ts +3 -1
  35. package/types/acorex-platform-layout-widgets.d.ts +45 -45
@@ -23,7 +23,7 @@ import * as i1$1 from '@acorex/components/avatar';
23
23
  import { AXAvatarModule } from '@acorex/components/avatar';
24
24
  import * as i3$1 from '@acorex/components/image';
25
25
  import { AXImageModule } from '@acorex/components/image';
26
- import { isNil, isEmpty, cloneDeep, isEqual, get, unionBy, sortBy, isArray, set, merge, capitalize } from 'lodash-es';
26
+ import { isNil, isEmpty, cloneDeep, isEqual, get, isString, unionBy, sortBy, isArray, set, merge, capitalize } from 'lodash-es';
27
27
  import * as i1$3 from '@acorex/components/badge';
28
28
  import { AXBadgeComponent, AXBadgeModule } from '@acorex/components/badge';
29
29
  import { AXPLayoutThemeService, AXPMenuVerticalMode } from '@acorex/platform/themes/shared';
@@ -339,11 +339,11 @@ class AXPAvatarComponent {
339
339
  // ax-accent3-lightest
340
340
  }
341
341
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPAvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
342
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPAvatarComponent, isStandalone: true, selector: "axp-avatar", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: false, transformFunction: null }, fullName: { classPropertyName: "fullName", publicName: "fullName", isSignal: true, isRequired: false, transformFunction: null }, fallbackText: { classPropertyName: "fallbackText", publicName: "fallbackText", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<ax-avatar [size]=\"size()\" class=\"ax-cursor-pointer ax-relative\" [title]=\"title()\"\n class=\"ax-{{ avatarColor() }}-lightest ax-border \">\n @if (hasAvatar()) {\n <ng-container>\n <ax-image (onError)=\"onImageError($event)\" (onLoad)=\"onImageLoad($event)\" [src]=\"resolvedSrc()\"\n [class.ax-opacity-0]=\"isLoading()\" class=\"ax-transition-opacity ax-duration-200\" />\n @if (isLoading()) {\n <ax-icon icon=\"fa-solid fa-user fa-2x\" class=\"ax-text-3xl\" />\n }\n </ng-container>\n } @else {\n <ax-text>\n <small class=\"ax-text-xs ax-font-semibold\">{{ avatarText() }}</small>\n </ax-text>\n }\n</ax-avatar>", styles: [":host ax-text{border-style:none;background-color:transparent;color:unset!important}\n"], dependencies: [{ kind: "ngmodule", type: AXAvatarModule }, { kind: "component", type: i1$1.AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i3$1.AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
342
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPAvatarComponent, isStandalone: true, selector: "axp-avatar", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: false, transformFunction: null }, fullName: { classPropertyName: "fullName", publicName: "fullName", isSignal: true, isRequired: false, transformFunction: null }, fallbackText: { classPropertyName: "fallbackText", publicName: "fallbackText", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<ax-avatar [size]=\"size()\" class=\"ax-cursor-pointer ax-relative\" [title]=\"title()\"\n class=\"ax-{{ avatarColor() }}-lightest ax-border \">\n @if (hasAvatar()) {\n <ng-container>\n <ax-image (onError)=\"onImageError($event)\" (onLoad)=\"onImageLoad($event)\" [src]=\"resolvedSrc()\"\n [class.ax-opacity-0]=\"isLoading()\" class=\"ax-transition-opacity ax-duration-200\" />\n @if (isLoading()) {\n <ax-icon icon=\"fa-solid fa-user fa-2x\" class=\"ax-text-3xl\" />\n }\n </ng-container>\n } @else {\n <ax-text>\n <small class=\"ax-font-semibold\" [style.font-size]=\"size() * 0.35 + 'px'\">{{ avatarText() }}</small>\n </ax-text>\n }\n</ax-avatar>", styles: [":host ax-text{border-style:none;background-color:transparent;color:unset!important}\n"], dependencies: [{ kind: "ngmodule", type: AXAvatarModule }, { kind: "component", type: i1$1.AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i3$1.AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
343
343
  }
344
344
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPAvatarComponent, decorators: [{
345
345
  type: Component,
346
- args: [{ selector: 'axp-avatar', imports: [AXAvatarModule, AXDecoratorModule, AXImageModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ax-avatar [size]=\"size()\" class=\"ax-cursor-pointer ax-relative\" [title]=\"title()\"\n class=\"ax-{{ avatarColor() }}-lightest ax-border \">\n @if (hasAvatar()) {\n <ng-container>\n <ax-image (onError)=\"onImageError($event)\" (onLoad)=\"onImageLoad($event)\" [src]=\"resolvedSrc()\"\n [class.ax-opacity-0]=\"isLoading()\" class=\"ax-transition-opacity ax-duration-200\" />\n @if (isLoading()) {\n <ax-icon icon=\"fa-solid fa-user fa-2x\" class=\"ax-text-3xl\" />\n }\n </ng-container>\n } @else {\n <ax-text>\n <small class=\"ax-text-xs ax-font-semibold\">{{ avatarText() }}</small>\n </ax-text>\n }\n</ax-avatar>", styles: [":host ax-text{border-style:none;background-color:transparent;color:unset!important}\n"] }]
346
+ args: [{ selector: 'axp-avatar', imports: [AXAvatarModule, AXDecoratorModule, AXImageModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ax-avatar [size]=\"size()\" class=\"ax-cursor-pointer ax-relative\" [title]=\"title()\"\n class=\"ax-{{ avatarColor() }}-lightest ax-border \">\n @if (hasAvatar()) {\n <ng-container>\n <ax-image (onError)=\"onImageError($event)\" (onLoad)=\"onImageLoad($event)\" [src]=\"resolvedSrc()\"\n [class.ax-opacity-0]=\"isLoading()\" class=\"ax-transition-opacity ax-duration-200\" />\n @if (isLoading()) {\n <ax-icon icon=\"fa-solid fa-user fa-2x\" class=\"ax-text-3xl\" />\n }\n </ng-container>\n } @else {\n <ax-text>\n <small class=\"ax-font-semibold\" [style.font-size]=\"size() * 0.35 + 'px'\">{{ avatarText() }}</small>\n </ax-text>\n }\n</ax-avatar>", styles: [":host ax-text{border-style:none;background-color:transparent;color:unset!important}\n"] }]
347
347
  }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], src: [{ type: i0.Input, args: [{ isSignal: true, alias: "src", required: false }] }], fullName: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullName", required: false }] }], fallbackText: [{ type: i0.Input, args: [{ isSignal: true, alias: "fallbackText", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }] } });
348
348
 
349
349
  const AXP_TASK_BADGE_PROVIDERS = new InjectionToken('AXP_TASK_BADGE_PROVIDERS');
@@ -2114,7 +2114,7 @@ class AXPDataSelectorComponent extends AXBasePageComponent {
2114
2114
  }
2115
2115
  }
2116
2116
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2117
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPDataSelectorComponent, isStandalone: true, selector: "axp-data-selector", viewQueries: [{ propertyName: "grid", first: true, predicate: ["grid"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"axp-data-selector\">\n <!-- Main Content Area -->\n <div class=\"axp-data-selector-content\" [class.with-category-filter]=\"categoryEnabled()\">\n <!-- Category Filter Side Panel -->\n @if (categoryEnabled()) {\n <div class=\"axp-category-filter-panel\" [style.width]=\"config().category?.width || '300px'\">\n <axp-category-tree [dataSource]=\"config().category!.dataSource\" [config]=\"categoryTreeConfig()\"\n [actions]=\"categoryTreeActions()\" (nodeClick)=\"handleCategoryFilterClick($event)\">\n </axp-category-tree>\n </div>\n }\n\n <!-- Main Data Area -->\n <div class=\"axp-main-data-area\">\n @if (hasSearch()) {\n <div class=\"ax-w-full ax-mb-2\">\n <ax-search-box [placeholder]=\"searchPlaceholderText()\" [value]=\"searchTerm\"\n (onValueChanged)=\"handleChangeSearchValue($event)\" [axAutoFocus]=\"true\">\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n </div>\n }\n <ax-data-table #grid [showFooter]=\"false\" class=\"ax-flex-1 ax-min-h-0\" [paging]=\"true\"\n [loading]=\"{ enabled: true, animation: true }\" [dataSource]=\"config().dataSource\"\n [parentField]=\"config().grid.parentField\" [selectedRows]=\"selectedItems()\"\n (selectedRowsChange)=\"handleSelectedRowsChange($event)\" (onRowClick)=\"handleRowClick($event)\"\n (onRowDbClick)=\"handleRowDbClick($event)\">\n <ax-select-column fixed=\"start\" [width]=\"'50px'\"></ax-select-column>\n\n @for (col of config().grid.columns; track col.name) {\n @if (col.visible) {\n <axp-widget-column-renderer [expandHandler]=\"$index === 0 && config().grid.parentField ? true : false\"\n [caption]=\"col.title | translate | async\" [customWidth]=\"col.width || ''\" [node]=\"{\n path: col.dataPath || col.name,\n type: col.widget.type,\n options: col.widget.options\n }\">\n </axp-widget-column-renderer>\n }\n }\n @if (hasRowActionPrimary()) {\n <ax-command-column fixed=\"end\" [width]=\"primaryRowActionColumnWidth()\" [items]=\"primaryRowActionItems()\"\n (onItemClick)=\"handleRowActionClick($event)\">\n </ax-command-column>\n }\n @if (hasRowActionDropdown()) {\n <ax-dropdown-command-column fixed=\"end\" [width]=\"'60px'\" [items]=\"getDropdownRowActionItems\"\n (onItemClick)=\"handleRowActionClick($event)\">\n </ax-dropdown-command-column>\n }\n </ax-data-table>\n </div>\n </div>\n</div>\n\n<ax-footer>\n <ax-prefix>\n @if ((config().create?.mode === 'full' || config().create?.mode === 'quick') && config().create?.onCreate) {\n <ax-button look=\"twotone\" color=\"primary\" [text]=\"'@general:actions.create.title' | translate | async\"\n (onClick)=\"handleCreateNewClick(config().create?.mode === 'quick' ? 'quick' : 'full')\">\n <ax-prefix>\n <ax-icon icon=\"far fa-plus\"></ax-icon>\n </ax-prefix>\n </ax-button>\n }\n </ax-prefix>\n <ax-suffix>\n <ax-button look=\"solid\" [text]=\"('@general:actions.close.title' | translate | async)!\"\n (onClick)=\"handleCloseClick()\">\n </ax-button>\n <ax-button look=\"solid\" color=\"primary\" [text]=\"('@general:actions.select.title' | translate | async)!\"\n (onClick)=\"handleSelectClick()\" [disabled]=\"allowSelect() === false\">\n <!-- @if (selectionMode() === 'multiple' && selectedCount() > 0) {\n <ax-badge [text]=\"selectedCount().toString()\" color=\"accent1\"\n class=\"ax-absolute ax-end-[2px] ax-top-[2px]\"></ax-badge>\n } -->\n </ax-button>\n </ax-suffix>\n</ax-footer>\n", styles: ["axp-data-selector{display:flex;flex-direction:column;flex:1;min-height:0;height:100%;overflow:hidden}.ax-expand-handler{cursor:pointer;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;margin-right:8px}.ax-expand-handler:hover{opacity:.8}.ax-expand-handler.ax-invisible{visibility:hidden}.ax-overflow-hidden{overflow:hidden}.ax-flex{display:flex}.ax-flex-col{flex-direction:column}.ax-gap-4{gap:1rem}.ax-p-4{padding:1rem}.ax-w-full{width:100%}.axp-data-selector{display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden}.axp-data-selector-content{display:flex;flex:1;min-height:0;overflow:hidden}.axp-data-selector-content.with-category-filter .axp-main-data-area{flex:1;min-width:0;min-height:0;overflow:hidden}.axp-data-selector .axp-category-filter-panel{display:flex;flex-direction:column;border-right:1px solid var(--border-color);padding:1rem;background:var(--surface-color);flex-shrink:0;min-height:0;min-width:0;overflow:hidden}.axp-data-selector .axp-category-filter-panel axp-category-tree{display:flex;flex:1;flex-direction:column;min-height:0;min-width:0;overflow:hidden}.axp-data-selector .axp-main-data-area{flex:1;min-width:0;min-height:0;overflow:hidden;padding:1rem;display:flex;flex-direction:column;gap:1rem}.axp-data-selector .axp-main-data-area ax-data-table{flex:1;min-height:0;height:100%;display:flex;flex-direction:column;overflow:hidden}.axp-data-selector .axp-main-data-area .ax-search-box{width:100%;flex-shrink:0}.ax-popup:has(axp-data-selector){display:flex;flex-direction:column;height:90vh;max-height:90vh;overflow:hidden}.ax-popup:has(axp-data-selector) .ax-popup-main-container{display:flex;flex:1 1 auto;flex-direction:column;min-height:0;overflow:hidden}.ax-popup:has(axp-data-selector) .ax-popup-body-container{display:flex;flex:1 1 auto;flex-direction:column;min-height:0;overflow:hidden!important}.ax-popup:has(axp-data-selector) .ax-popup-footer-container{flex-shrink:0}@media(min-width:320px)and (max-width:640px){.ax-popup.ax-popup-sm:has(axp-data-selector),.ax-popup.ax-popup-md:has(axp-data-selector),.ax-popup.ax-popup-lg:has(axp-data-selector){height:90vh!important;max-height:90vh!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXCommonModule }, { kind: "directive", type: i1$6.AXAutoFocusDirective, selector: "[axAutoFocus]", inputs: ["axAutoFocus", "axAutoFocusTime"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "ngmodule", type: AXDataTableModule }, { kind: "component", type: i4$1.AXDataTableComponent, selector: "ax-data-table", inputs: ["dataSource", "selectedRows", "parentField", "hasChildrenField", "rowDetailsTemplate", "look", "rowTemplate", "emptyTemplate", "noDataTemplate", "alternative", "showHeader", "fixedHeader", "showFooter", "fixedFooter", "itemHeight", "allowReordering", "paging", "fetchDataMode", "loading", "focusedRow"], outputs: ["selectedRowsChange", "focusedRowChange", "onRowClick", "onRowDbClick", "onColumnsOrderChanged", "onColumnSizeChanged", "onPageChanged"] }, { kind: "component", type: i4$1.AXRowSelectColumnComponent, selector: "ax-select-column", inputs: ["width", "caption", "fixed"] }, { kind: "component", type: i4$1.AXRowCommandColumnComponent, selector: "ax-command-column", inputs: ["width", "caption", "fixed", "footerTemplate", "items"], outputs: ["onItemClick"] }, { kind: "component", type: i4$1.AXRowDropdownCommandColumnComponent, selector: "ax-dropdown-command-column", inputs: ["width", "caption", "fixed", "footerTemplate", "emptyStateTemplate", "emptyStateText", "items"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i5.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i3$3.AXPWidgetColumnRendererComponent, selector: "axp-widget-column-renderer", inputs: ["caption", "customExpandIcon", "customCollapseIcon", "customWidth", "node", "footerTemplate", "expandHandler", "sortEnabled", "headerSortDirection", "headerSortPriority", "cellTemplate", "headerTemplate"], outputs: ["sortToggle"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "component", type: AXPCategoryTreeComponent, selector: "axp-category-tree", inputs: ["dataSource", "config", "actions", "events"], outputs: ["nodeClick", "nodeSelect", "nodeCreate", "nodeUpdate", "nodeDelete", "searchChange", "collapseChange"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2117
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPDataSelectorComponent, isStandalone: true, selector: "axp-data-selector", viewQueries: [{ propertyName: "grid", first: true, predicate: ["grid"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"axp-data-selector\">\n <!-- Main Content Area -->\n <div class=\"axp-data-selector-content\" [class.with-category-filter]=\"categoryEnabled()\">\n <!-- Category Filter Side Panel -->\n @if (categoryEnabled()) {\n <div class=\"axp-category-filter-panel\" [style.width]=\"config().category?.width || '300px'\">\n <axp-category-tree [dataSource]=\"config().category!.dataSource\" [config]=\"categoryTreeConfig()\"\n [actions]=\"categoryTreeActions()\" (nodeClick)=\"handleCategoryFilterClick($event)\">\n </axp-category-tree>\n </div>\n }\n\n <!-- Main Data Area -->\n <div class=\"axp-main-data-area\">\n @if (hasSearch()) {\n <div class=\"ax-w-full ax-mb-2\">\n <ax-search-box [placeholder]=\"searchPlaceholderText()\" [value]=\"searchTerm\"\n (onValueChanged)=\"handleChangeSearchValue($event)\" [axAutoFocus]=\"true\">\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n </div>\n }\n <ax-data-table #grid [showFooter]=\"false\" class=\"ax-flex-1 ax-min-h-0\" [paging]=\"true\"\n [loading]=\"{ enabled: true, animation: true }\" [dataSource]=\"config().dataSource\"\n [parentField]=\"config().grid.parentField\" [selectedRows]=\"selectedItems()\"\n (selectedRowsChange)=\"handleSelectedRowsChange($event)\" (onRowClick)=\"handleRowClick($event)\"\n (onRowDbClick)=\"handleRowDbClick($event)\">\n <ax-select-column fixed=\"start\" [width]=\"'50px'\"></ax-select-column>\n\n @for (col of config().grid.columns; track col.name) {\n @if (col.visible) {\n <axp-widget-column-renderer [expandHandler]=\"$index === 0 && config().grid.parentField ? true : false\"\n [caption]=\"col.title | translate | async\" [customWidth]=\"col.width || ''\" [node]=\"{\n path: col.dataPath || col.name,\n type: col.widget.type,\n options: col.widget.options\n }\">\n </axp-widget-column-renderer>\n }\n }\n @if (hasRowActionPrimary()) {\n <ax-command-column fixed=\"end\" [width]=\"primaryRowActionColumnWidth()\" [items]=\"primaryRowActionItems()\"\n (onItemClick)=\"handleRowActionClick($event)\">\n </ax-command-column>\n }\n @if (hasRowActionDropdown()) {\n <ax-dropdown-command-column fixed=\"end\" [width]=\"'60px'\" [items]=\"getDropdownRowActionItems\"\n (onItemClick)=\"handleRowActionClick($event)\">\n </ax-dropdown-command-column>\n }\n </ax-data-table>\n </div>\n </div>\n</div>\n\n<ax-footer>\n <ax-prefix>\n @if ((config().create?.mode === 'full' || config().create?.mode === 'quick') && config().create?.onCreate) {\n <ax-button look=\"twotone\" color=\"primary\" [text]=\"'@general:actions.create.title' | translate | async\"\n (onClick)=\"handleCreateNewClick(config().create?.mode === 'quick' ? 'quick' : 'full')\">\n <ax-prefix>\n <ax-icon icon=\"far fa-plus\"></ax-icon>\n </ax-prefix>\n </ax-button>\n }\n </ax-prefix>\n <ax-suffix>\n <ax-button look=\"solid\" [text]=\"('@general:actions.close.title' | translate | async)!\"\n (onClick)=\"handleCloseClick()\">\n </ax-button>\n <ax-button look=\"solid\" color=\"primary\" [text]=\"('@general:actions.select.title' | translate | async)!\"\n (onClick)=\"handleSelectClick()\" [disabled]=\"allowSelect() === false\">\n <!-- @if (selectionMode() === 'multiple' && selectedCount() > 0) {\n <ax-badge [text]=\"selectedCount().toString()\" color=\"accent1\"\n class=\"ax-absolute ax-end-[2px] ax-top-[2px]\"></ax-badge>\n } -->\n </ax-button>\n </ax-suffix>\n</ax-footer>\n", styles: ["axp-data-selector{display:flex;flex-direction:column;flex:1;min-height:0;height:100%;overflow:hidden}.ax-expand-handler{cursor:pointer;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;margin-right:8px}.ax-expand-handler:hover{opacity:.8}.ax-expand-handler.ax-invisible{visibility:hidden}.ax-overflow-hidden{overflow:hidden}.ax-flex{display:flex}.ax-flex-col{flex-direction:column}.ax-gap-4{gap:1rem}.ax-p-4{padding:1rem}.ax-w-full{width:100%}.axp-data-selector{display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden}.axp-data-selector-content{display:flex;flex:1;min-height:0;overflow:hidden}.axp-data-selector-content.with-category-filter .axp-main-data-area{flex:1;min-width:0;min-height:0;overflow:hidden}.axp-data-selector .axp-category-filter-panel{display:flex;flex-direction:column;border-right:1px solid var(--border-color);padding:1rem;background:var(--surface-color);flex-shrink:0;min-height:0;min-width:0;overflow:hidden}.axp-data-selector .axp-category-filter-panel axp-category-tree{display:flex;flex:1;flex-direction:column;min-height:0;min-width:0;overflow:hidden}.axp-data-selector .axp-main-data-area{flex:1;min-width:0;min-height:0;overflow:hidden;padding:1rem;display:flex;flex-direction:column;gap:1rem}.axp-data-selector .axp-main-data-area ax-data-table{flex:1;min-height:0;height:100%;display:flex;flex-direction:column;overflow:hidden}.axp-data-selector .axp-main-data-area .ax-search-box{width:100%;flex-shrink:0}.ax-popup:has(axp-data-selector){display:flex;flex-direction:column;height:90vh;max-height:90vh;overflow:hidden}.ax-popup:has(axp-data-selector) .ax-popup-main-container{display:flex;flex:1 1 auto;flex-direction:column;min-height:0;overflow:hidden}.ax-popup:has(axp-data-selector) .ax-popup-body-container{display:flex;flex:1 1 auto;flex-direction:column;min-height:0;overflow:hidden!important}.ax-popup:has(axp-data-selector) .ax-popup-footer-container{flex-shrink:0}@media(min-width:320px)and (max-width:640px){.ax-popup.ax-popup-sm:has(axp-data-selector),.ax-popup.ax-popup-md:has(axp-data-selector),.ax-popup.ax-popup-lg:has(axp-data-selector){height:90vh!important;max-height:90vh!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXCommonModule }, { kind: "directive", type: i1$6.AXAutoFocusDirective, selector: "[axAutoFocus]", inputs: ["axAutoFocus", "axAutoFocusTime"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "ngmodule", type: AXDataTableModule }, { kind: "component", type: i4$1.AXDataTableComponent, selector: "ax-data-table", inputs: ["dataSource", "selectedRows", "parentField", "hasChildrenField", "rowDetailsTemplate", "look", "rowTemplate", "emptyTemplate", "noDataTemplate", "alternative", "showHeader", "fixedHeader", "showFooter", "fixedFooter", "itemHeight", "allowReordering", "paging", "fetchDataMode", "loading", "focusedRow"], outputs: ["selectedRowsChange", "focusedRowChange", "onRowClick", "onRowDbClick", "onColumnsOrderChanged", "onColumnSizeChanged", "onPageChanged"] }, { kind: "component", type: i4$1.AXRowSelectColumnComponent, selector: "ax-select-column", inputs: ["width", "caption", "fixed"] }, { kind: "component", type: i4$1.AXRowCommandColumnComponent, selector: "ax-command-column", inputs: ["width", "caption", "fixed", "footerTemplate", "items"], outputs: ["onItemClick"] }, { kind: "component", type: i4$1.AXRowDropdownCommandColumnComponent, selector: "ax-dropdown-command-column", inputs: ["width", "caption", "fixed", "footerTemplate", "emptyStateTemplate", "emptyStateText", "items"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i5.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i3$3.AXPWidgetColumnRendererComponent, selector: "axp-widget-column-renderer", inputs: ["caption", "customExpandIcon", "customCollapseIcon", "customWidth", "node", "footerTemplate", "expandHandler", "sortEnabled", "headerSortDirection", "headerSortPriority", "columnFixed", "cellTemplate", "headerTemplate"], outputs: ["sortToggle"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "component", type: AXPCategoryTreeComponent, selector: "axp-category-tree", inputs: ["dataSource", "config", "actions", "events"], outputs: ["nodeClick", "nodeSelect", "nodeCreate", "nodeUpdate", "nodeDelete", "searchChange", "collapseChange"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2118
2118
  }
2119
2119
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataSelectorComponent, decorators: [{
2120
2120
  type: Component,
@@ -3817,6 +3817,97 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
3817
3817
  args: [{ providedIn: 'root' }]
3818
3818
  }] });
3819
3819
 
3820
+ //#region ---- Signature editor types ----
3821
+ //#endregion
3822
+
3823
+ //#region ---- Constants ----
3824
+ const SIGNATURE_WIDGET_NAME = 'signature';
3825
+ //#endregion
3826
+ //#region ---- Signature editor service ----
3827
+ /**
3828
+ * Opens the shared signature capture dialog (paint pad, Clear, and Save/Apply).
3829
+ * Clear resets the canvas; the primary action persists the current pad (empty removes the signature).
3830
+ */
3831
+ class AXPSignatureEditorService {
3832
+ constructor() {
3833
+ //#region ---- Services & Dependencies ----
3834
+ this.layoutBuilder = inject(AXPLayoutBuilderService);
3835
+ }
3836
+ //#endregion
3837
+ //#region ---- Public API ----
3838
+ async open(options = {}) {
3839
+ const initialValue = options.value ?? null;
3840
+ const disabled = options.disabled ?? false;
3841
+ const ref = await this.layoutBuilder
3842
+ .create()
3843
+ .dialog((dialog) => {
3844
+ dialog
3845
+ .setTitle(options.title ?? '@platform-layout-widgets:widgets.signature.title')
3846
+ .setSize('sm')
3847
+ .setCloseButton(true)
3848
+ .setContext({ value: initialValue })
3849
+ .content((content) => {
3850
+ content
3851
+ .setDirection('column')
3852
+ .setGap('16px')
3853
+ .setAlignItems('stretch')
3854
+ .customWidget(SIGNATURE_WIDGET_NAME, {
3855
+ name: SIGNATURE_WIDGET_NAME,
3856
+ path: 'value',
3857
+ disabled,
3858
+ showOverlay: false,
3859
+ editMode: true,
3860
+ });
3861
+ })
3862
+ .setActions((actions) => {
3863
+ actions.cancel('@general:actions.cancel.title');
3864
+ actions.custom({
3865
+ title: '@general:actions.clear.title',
3866
+ icon: 'fa-light fa-eraser',
3867
+ disabled: '{{ !context.value }}',
3868
+ command: { name: 'widget:signature.clear' },
3869
+ position: 'prefix',
3870
+ });
3871
+ actions.submit(options.submitActionKey ?? '@general:actions.apply.title');
3872
+ });
3873
+ })
3874
+ .show();
3875
+ const action = this.resolveAction(ref.action());
3876
+ const context = ref.context() ?? {};
3877
+ if (action === 'apply') {
3878
+ const newValue = context.value;
3879
+ const value = this.resolveAppliedValue(newValue, initialValue);
3880
+ ref.close();
3881
+ return { action: 'apply', value };
3882
+ }
3883
+ ref.close();
3884
+ return { action: 'cancel', value: initialValue };
3885
+ }
3886
+ //#endregion
3887
+ //#region ---- Utility Methods ----
3888
+ resolveAction(action) {
3889
+ if (action === 'submit' || action === 'signature-apply') {
3890
+ return 'apply';
3891
+ }
3892
+ return 'cancel';
3893
+ }
3894
+ resolveAppliedValue(newValue, initialValue) {
3895
+ if (newValue === null || newValue === '') {
3896
+ return null;
3897
+ }
3898
+ if (isString(newValue)) {
3899
+ return newValue;
3900
+ }
3901
+ return initialValue;
3902
+ }
3903
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPSignatureEditorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3904
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPSignatureEditorService, providedIn: 'root' }); }
3905
+ }
3906
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPSignatureEditorService, decorators: [{
3907
+ type: Injectable,
3908
+ args: [{ providedIn: 'root' }]
3909
+ }] });
3910
+
3820
3911
  /**
3821
3912
  * Copies {@link AXPWidgetProperty.validations} onto `schema.interface.options` so the property
3822
3913
  * viewer binds a stable widget node.
@@ -8683,10 +8774,14 @@ class AXPUserAvatarComponent {
8683
8774
  this.size = input(40, ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
8684
8775
  this.userId = input('', ...(ngDevMode ? [{ debugName: "userId" }] : /* istanbul ignore next */ []));
8685
8776
  this.src = signal('', ...(ngDevMode ? [{ debugName: "src" }] : /* istanbul ignore next */ []));
8777
+ /** Username from the user record. */
8686
8778
  this.userName = computed(() => this.userInfo()?.username || '', ...(ngDevMode ? [{ debugName: "userName" }] : /* istanbul ignore next */ []));
8687
- this.firstName = computed(() => this.userInfo()?.firstName || 'Root', ...(ngDevMode ? [{ debugName: "firstName" }] : /* istanbul ignore next */ []));
8688
- this.lastName = computed(() => this.userInfo()?.lastName || 'User', ...(ngDevMode ? [{ debugName: "lastName" }] : /* istanbul ignore next */ []));
8689
- this.title = computed(() => `${this.firstName()} ${this.lastName()}`, ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
8779
+ /** Given name segment used for display and templates. */
8780
+ this.firstName = computed(() => this.userInfo()?.firstName?.trim() || '', ...(ngDevMode ? [{ debugName: "firstName" }] : /* istanbul ignore next */ []));
8781
+ /** Family name segment used for display and templates. */
8782
+ this.lastName = computed(() => this.userInfo()?.lastName?.trim() || '', ...(ngDevMode ? [{ debugName: "lastName" }] : /* istanbul ignore next */ []));
8783
+ /** Full display name used for avatar initials and external templates. */
8784
+ this.title = computed(() => this.resolveDisplayName(this.userInfo()), ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
8690
8785
  this.isOnline = computed(() => this.userInfo()?.status === 'online', ...(ngDevMode ? [{ debugName: "isOnline" }] : /* istanbul ignore next */ []));
8691
8786
  }
8692
8787
  ngOnInit() {
@@ -8723,6 +8818,16 @@ class AXPUserAvatarComponent {
8723
8818
  }
8724
8819
  this.src.set('');
8725
8820
  }
8821
+ resolveDisplayName(info) {
8822
+ if (!info) {
8823
+ return '';
8824
+ }
8825
+ const parts = [info.firstName, info.lastName].map((part) => part?.trim()).filter(Boolean);
8826
+ if (parts.length > 0) {
8827
+ return parts.join(' ');
8828
+ }
8829
+ return info.username.trim();
8830
+ }
8726
8831
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPUserAvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8727
8832
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.9", type: AXPUserAvatarComponent, isStandalone: true, selector: "axp-user-avatar", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, userId: { classPropertyName: "userId", publicName: "userId", isSignal: true, isRequired: false, transformFunction: null } }, providers: [], ngImport: i0, template: "<axp-avatar [size]=\"size()\" [src]=\"src()\" [fullName]=\"title()\" />\n", styles: [""], dependencies: [{ kind: "component", type: AXPAvatarComponent, selector: "axp-avatar", inputs: ["size", "src", "fullName", "fallbackText", "placeholder"] }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "ngmodule", type: AXSkeletonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
8728
8833
  }
@@ -8731,6 +8836,78 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
8731
8836
  args: [{ selector: 'axp-user-avatar', imports: [AXPAvatarComponent, AXBadgeModule, AXSkeletonModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [], template: "<axp-avatar [size]=\"size()\" [src]=\"src()\" [fullName]=\"title()\" />\n" }]
8732
8837
  }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], userId: [{ type: i0.Input, args: [{ isSignal: true, alias: "userId", required: false }] }] } });
8733
8838
 
8839
+ //#region ---- Imports ----
8840
+ //#endregion
8841
+ //#region ---- Constants ----
8842
+ const DIGIT_KEYS = [
8843
+ { digit: '1' },
8844
+ { digit: '2', letters: 'ABC' },
8845
+ { digit: '3', letters: 'DEF' },
8846
+ { digit: '4', letters: 'GHI' },
8847
+ { digit: '5', letters: 'JKL' },
8848
+ { digit: '6', letters: 'MNO' },
8849
+ { digit: '7', letters: 'PQRS' },
8850
+ { digit: '8', letters: 'TUV' },
8851
+ { digit: '9', letters: 'WXYZ' },
8852
+ ];
8853
+ const ZERO_KEY = { digit: '0' };
8854
+ //#endregion
8855
+ //#region ---- Virtual keypad component ----
8856
+ /**
8857
+ * Touch-friendly numeric keypad for PIN and code entry on mobile layouts.
8858
+ */
8859
+ class AXPVirtualKeypadComponent {
8860
+ constructor() {
8861
+ //#region ---- Inputs ----
8862
+ /** Disables all keypad buttons. */
8863
+ this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
8864
+ /** Shows phone-style letter hints under digits 2–9. */
8865
+ this.showLetterHints = input(true, ...(ngDevMode ? [{ debugName: "showLetterHints" }] : /* istanbul ignore next */ []));
8866
+ /** Visual style of keypad keys. */
8867
+ this.look = input('solid', ...(ngDevMode ? [{ debugName: "look" }] : /* istanbul ignore next */ []));
8868
+ //#endregion
8869
+ //#region ---- Outputs ----
8870
+ /** Emitted when a digit key is pressed. */
8871
+ this.digitPress = output();
8872
+ /** Emitted when the backspace key is pressed. */
8873
+ this.backspace = output();
8874
+ /** Emitted for either digit or backspace actions. */
8875
+ this.keyPress = output();
8876
+ //#endregion
8877
+ //#region ---- Template data ----
8878
+ this.digitKeys = DIGIT_KEYS;
8879
+ this.zeroKey = ZERO_KEY;
8880
+ }
8881
+ //#endregion
8882
+ //#region ---- UI handlers ----
8883
+ onDigitPress(digit) {
8884
+ if (this.disabled()) {
8885
+ return;
8886
+ }
8887
+ const value = Number(digit);
8888
+ this.digitPress.emit(value);
8889
+ this.keyPress.emit({ action: 'digit', digit: value });
8890
+ }
8891
+ onBackspace() {
8892
+ if (this.disabled()) {
8893
+ return;
8894
+ }
8895
+ this.backspace.emit();
8896
+ this.keyPress.emit({ action: 'backspace' });
8897
+ }
8898
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPVirtualKeypadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8899
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPVirtualKeypadComponent, isStandalone: true, selector: "axp-virtual-keypad", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, showLetterHints: { classPropertyName: "showLetterHints", publicName: "showLetterHints", isSignal: true, isRequired: false, transformFunction: null }, look: { classPropertyName: "look", publicName: "look", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { digitPress: "digitPress", backspace: "backspace", keyPress: "keyPress" }, host: { classAttribute: "axp-virtual-keypad-host" }, ngImport: i0, template: "<div\n class=\"axp-virtual-keypad\"\n role=\"group\"\n [attr.data-look]=\"look()\"\n [attr.aria-label]=\"'@general:virtual-keypad.aria-label' | translate | async\"\n>\n <div class=\"__grid\">\n @for (key of digitKeys; track key.digit) {\n <button\n type=\"button\"\n class=\"__key\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"key.digit\"\n (click)=\"onDigitPress(key.digit)\"\n >\n <span class=\"__digit\">{{ key.digit }}</span>\n @if (showLetterHints() && key.letters) {\n <span class=\"__letters\" aria-hidden=\"true\">{{ key.letters }}</span>\n }\n </button>\n }\n\n <span class=\"__spacer\" aria-hidden=\"true\"></span>\n\n <button\n type=\"button\"\n class=\"__key\"\n [disabled]=\"disabled()\"\n aria-label=\"0\"\n (click)=\"onDigitPress(zeroKey.digit)\"\n >\n <span class=\"__digit\">{{ zeroKey.digit }}</span>\n </button>\n\n <button\n type=\"button\"\n class=\"__key __key--action\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'@general:virtual-keypad.backspace' | translate | async\"\n (click)=\"onBackspace()\"\n >\n <i class=\"fa-light fa-delete-left\" aria-hidden=\"true\"></i>\n </button>\n </div>\n</div>\n", styles: [".axp-virtual-keypad-host{display:block;width:100%}.axp-virtual-keypad{--axp-keypad-key-size: 4.25rem;--axp-keypad-gap: .75rem;display:flex;width:100%;-webkit-user-select:none;user-select:none;justify-content:center}.axp-virtual-keypad .__grid{margin-left:auto;margin-right:auto;display:grid;width:fit-content;justify-items:center;grid-template-columns:repeat(3,var(--axp-keypad-key-size));gap:var(--axp-keypad-gap)}.axp-virtual-keypad .__spacer{display:block;width:var(--axp-keypad-key-size);height:var(--axp-keypad-key-size)}.axp-virtual-keypad .__key{display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:pointer;border-radius:9999px;border-width:0px;background-color:transparent;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-lightest-surface),var(--tw-text-opacity, 1));transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.1s;animation-duration:.1s;width:var(--axp-keypad-key-size);height:var(--axp-keypad-key-size)}.axp-virtual-keypad .__key:active:not(:disabled){transform:scale(.96)}.axp-virtual-keypad .__key:disabled{cursor:not-allowed;opacity:.5}.axp-virtual-keypad .__key:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-600));outline-offset:2px}.axp-virtual-keypad .__digit{font-size:1.875rem;line-height:2.25rem;font-weight:500;--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);line-height:1}.axp-virtual-keypad .__letters{margin-top:.25rem;font-size:.6875rem;font-weight:600;line-height:1;letter-spacing:.14em;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-lighter-surface),var(--tw-text-opacity, 1));opacity:.6}.axp-virtual-keypad .__key--action{font-size:1.125rem;line-height:1.75rem}.axp-virtual-keypad .__key--action i{font-size:1.5rem;line-height:2rem}.axp-virtual-keypad[data-look=solid] .__key{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}.axp-virtual-keypad[data-look=solid] .__key:active:not(:disabled){background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}.axp-virtual-keypad[data-look=blank] .__key{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.axp-virtual-keypad[data-look=blank] .__key:active:not(:disabled){background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}\n"], dependencies: [{ kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
8900
+ }
8901
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPVirtualKeypadComponent, decorators: [{
8902
+ type: Component,
8903
+ args: [{ selector: 'axp-virtual-keypad', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [AXTranslationModule, AsyncPipe], host: {
8904
+ class: 'axp-virtual-keypad-host',
8905
+ }, template: "<div\n class=\"axp-virtual-keypad\"\n role=\"group\"\n [attr.data-look]=\"look()\"\n [attr.aria-label]=\"'@general:virtual-keypad.aria-label' | translate | async\"\n>\n <div class=\"__grid\">\n @for (key of digitKeys; track key.digit) {\n <button\n type=\"button\"\n class=\"__key\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"key.digit\"\n (click)=\"onDigitPress(key.digit)\"\n >\n <span class=\"__digit\">{{ key.digit }}</span>\n @if (showLetterHints() && key.letters) {\n <span class=\"__letters\" aria-hidden=\"true\">{{ key.letters }}</span>\n }\n </button>\n }\n\n <span class=\"__spacer\" aria-hidden=\"true\"></span>\n\n <button\n type=\"button\"\n class=\"__key\"\n [disabled]=\"disabled()\"\n aria-label=\"0\"\n (click)=\"onDigitPress(zeroKey.digit)\"\n >\n <span class=\"__digit\">{{ zeroKey.digit }}</span>\n </button>\n\n <button\n type=\"button\"\n class=\"__key __key--action\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'@general:virtual-keypad.backspace' | translate | async\"\n (click)=\"onBackspace()\"\n >\n <i class=\"fa-light fa-delete-left\" aria-hidden=\"true\"></i>\n </button>\n </div>\n</div>\n", styles: [".axp-virtual-keypad-host{display:block;width:100%}.axp-virtual-keypad{--axp-keypad-key-size: 4.25rem;--axp-keypad-gap: .75rem;display:flex;width:100%;-webkit-user-select:none;user-select:none;justify-content:center}.axp-virtual-keypad .__grid{margin-left:auto;margin-right:auto;display:grid;width:fit-content;justify-items:center;grid-template-columns:repeat(3,var(--axp-keypad-key-size));gap:var(--axp-keypad-gap)}.axp-virtual-keypad .__spacer{display:block;width:var(--axp-keypad-key-size);height:var(--axp-keypad-key-size)}.axp-virtual-keypad .__key{display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:pointer;border-radius:9999px;border-width:0px;background-color:transparent;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-lightest-surface),var(--tw-text-opacity, 1));transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.1s;animation-duration:.1s;width:var(--axp-keypad-key-size);height:var(--axp-keypad-key-size)}.axp-virtual-keypad .__key:active:not(:disabled){transform:scale(.96)}.axp-virtual-keypad .__key:disabled{cursor:not-allowed;opacity:.5}.axp-virtual-keypad .__key:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-600));outline-offset:2px}.axp-virtual-keypad .__digit{font-size:1.875rem;line-height:2.25rem;font-weight:500;--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);line-height:1}.axp-virtual-keypad .__letters{margin-top:.25rem;font-size:.6875rem;font-weight:600;line-height:1;letter-spacing:.14em;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-lighter-surface),var(--tw-text-opacity, 1));opacity:.6}.axp-virtual-keypad .__key--action{font-size:1.125rem;line-height:1.75rem}.axp-virtual-keypad .__key--action i{font-size:1.5rem;line-height:2rem}.axp-virtual-keypad[data-look=solid] .__key{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}.axp-virtual-keypad[data-look=solid] .__key:active:not(:disabled){background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}.axp-virtual-keypad[data-look=blank] .__key{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.axp-virtual-keypad[data-look=blank] .__key:active:not(:disabled){background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}\n"] }]
8906
+ }], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], showLetterHints: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLetterHints", required: false }] }], look: [{ type: i0.Input, args: [{ isSignal: true, alias: "look", required: false }] }], digitPress: [{ type: i0.Output, args: ["digitPress"] }], backspace: [{ type: i0.Output, args: ["backspace"] }], keyPress: [{ type: i0.Output, args: ["keyPress"] }] } });
8907
+
8908
+ //#region ---- Virtual keypad types ----
8909
+ //#endregion
8910
+
8734
8911
  class AXPQueryViewsComponent {
8735
8912
  constructor() {
8736
8913
  this.popupService = inject(AXPopupService);
@@ -9403,5 +9580,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
9403
9580
  * Generated bundle index. Do not edit.
9404
9581
  */
9405
9582
 
9406
- export { AXPActivityLogComponent, AXPAvatarComponent, AXPCategoryTreeComponent, AXPColorPalettePickerComponent, AXPColumnItemListComponent, AXPCompareViewComponent, AXPConditionBuilderComponent, AXPConditionBuilderConditionComponent, AXPDataSelectorComponent, AXPDataSelectorService, AXPDragDropListComponent, AXPExpressionFieldDefinitions, AXPImageEditorPopupComponent, AXPImageEditorService, AXPItemConfiguratorComponent, AXPLayoutFloatingZoomBarComponent, AXPLayoutSideDetailPanelComponent, AXPLayoutSideDetailPanelSectionDirective, AXPLogoComponent, AXPMarkdownTemplateDirective, AXPMarkdownViewerComponent, AXPMenuBadgeHelper, AXPMenuCustomizerComponent, AXPMenuCustomizerService, AXPOutcomeResultsViewerComponent, AXPPageComponentRegistryService, AXPPreloadFiltersComponent, AXPPropertyViewerComponent, AXPPropertyViewerPopupComponent, AXPPropertyViewerService, AXPQueryColumnsComponent, AXPQueryFiltersComponent, AXPQuerySortsComponent, AXPQueryViewsComponent, AXPRepeaterRowsLayoutComponent, AXPResourceAppointmentBoardProvider, AXPResourceAppointmentComponent, AXPResourceAppointmentService, AXPSectionItemsBuilderComponent, AXPSpreadsheetComponent, AXPStandardSectionItemsBuilderComponent, AXPStateMessageComponent, AXPStopwatchComponent, AXPTableColumnsEditorComponent, AXPTableColumnsEditorPopupComponent, AXPTableColumnsEditorService, AXPTableDataEditorComponent, AXPTableDataEditorPopupComponent, AXPTableDataEditorService, AXPTaskBadgeDirective, AXPTaskBadgeProvider, AXPTaskBadgeService, AXPTemplateViewerComponent, AXPTemplateViewerService, AXPThemeLayoutActionsComponent, AXPThemeLayoutBlockComponent, AXPThemeLayoutContainerComponent, AXPThemeLayoutEndSideComponent, AXPThemeLayoutFooterComponent, AXPThemeLayoutHeaderComponent, AXPThemeLayoutListComponent, AXPThemeLayoutListItemComponent, AXPThemeLayoutListItemsGroupComponent, AXPThemeLayoutPageHeaderComponent, AXPThemeLayoutPagePrimaryActionsComponent, AXPThemeLayoutPageSecondaryActionsComponent, AXPThemeLayoutSectionComponent, AXPThemeLayoutStartSideComponent, AXPThemeLayoutToolbarComponent, AXPUserAvatarComponent, AXPUserAvatarService, AXPWidgetFieldConfiguratorComponent, AXPWidgetItemComponent, AXPWidgetPropertyViewerComponent, AXPWidgetPropertyViewerPopupComponent, AXPWidgetPropertyViewerService, AXP_EXPRESSION_LOGIC_DEFINITIONS, AXP_EXPRESSION_OPERATION_DEFINITIONS, AXP_MENU_CUSTOMIZER_SERVICE, AXP_PAGE_COMPONENT_PROVIDER, AXP_RESOURCE_APPOINTMENT_PROVIDER, AXP_TASK_BADGE_PROVIDERS, AXP_USER_AVATAR_PROVIDER, STANDARD_SECTION_ITEMS_SECTION_TABS, buildPropertyViewerInitialContextFromProperties, buildPropertyViewerTabsFromProperties, buildTableColumnsEditorLayout, getFieldDefinitions, getLogicDefinition, getOperationDefinition, isPropertyBindingExpressionFormValue, preparePropertyForViewer, preparePropertyViewerTabs, registerFieldDefinitions, withValidationsOnEditorNode };
9583
+ export { AXPActivityLogComponent, AXPAvatarComponent, AXPCategoryTreeComponent, AXPColorPalettePickerComponent, AXPColumnItemListComponent, AXPCompareViewComponent, AXPConditionBuilderComponent, AXPConditionBuilderConditionComponent, AXPDataSelectorComponent, AXPDataSelectorService, AXPDragDropListComponent, AXPExpressionFieldDefinitions, AXPImageEditorPopupComponent, AXPImageEditorService, AXPItemConfiguratorComponent, AXPLayoutFloatingZoomBarComponent, AXPLayoutSideDetailPanelComponent, AXPLayoutSideDetailPanelSectionDirective, AXPLogoComponent, AXPMarkdownTemplateDirective, AXPMarkdownViewerComponent, AXPMenuBadgeHelper, AXPMenuCustomizerComponent, AXPMenuCustomizerService, AXPOutcomeResultsViewerComponent, AXPPageComponentRegistryService, AXPPreloadFiltersComponent, AXPPropertyViewerComponent, AXPPropertyViewerPopupComponent, AXPPropertyViewerService, AXPQueryColumnsComponent, AXPQueryFiltersComponent, AXPQuerySortsComponent, AXPQueryViewsComponent, AXPRepeaterRowsLayoutComponent, AXPResourceAppointmentBoardProvider, AXPResourceAppointmentComponent, AXPResourceAppointmentService, AXPSectionItemsBuilderComponent, AXPSignatureEditorService, AXPSpreadsheetComponent, AXPStandardSectionItemsBuilderComponent, AXPStateMessageComponent, AXPStopwatchComponent, AXPTableColumnsEditorComponent, AXPTableColumnsEditorPopupComponent, AXPTableColumnsEditorService, AXPTableDataEditorComponent, AXPTableDataEditorPopupComponent, AXPTableDataEditorService, AXPTaskBadgeDirective, AXPTaskBadgeProvider, AXPTaskBadgeService, AXPTemplateViewerComponent, AXPTemplateViewerService, AXPThemeLayoutActionsComponent, AXPThemeLayoutBlockComponent, AXPThemeLayoutContainerComponent, AXPThemeLayoutEndSideComponent, AXPThemeLayoutFooterComponent, AXPThemeLayoutHeaderComponent, AXPThemeLayoutListComponent, AXPThemeLayoutListItemComponent, AXPThemeLayoutListItemsGroupComponent, AXPThemeLayoutPageHeaderComponent, AXPThemeLayoutPagePrimaryActionsComponent, AXPThemeLayoutPageSecondaryActionsComponent, AXPThemeLayoutSectionComponent, AXPThemeLayoutStartSideComponent, AXPThemeLayoutToolbarComponent, AXPUserAvatarComponent, AXPUserAvatarService, AXPVirtualKeypadComponent, AXPWidgetFieldConfiguratorComponent, AXPWidgetItemComponent, AXPWidgetPropertyViewerComponent, AXPWidgetPropertyViewerPopupComponent, AXPWidgetPropertyViewerService, AXP_EXPRESSION_LOGIC_DEFINITIONS, AXP_EXPRESSION_OPERATION_DEFINITIONS, AXP_MENU_CUSTOMIZER_SERVICE, AXP_PAGE_COMPONENT_PROVIDER, AXP_RESOURCE_APPOINTMENT_PROVIDER, AXP_TASK_BADGE_PROVIDERS, AXP_USER_AVATAR_PROVIDER, STANDARD_SECTION_ITEMS_SECTION_TABS, buildPropertyViewerInitialContextFromProperties, buildPropertyViewerTabsFromProperties, buildTableColumnsEditorLayout, getFieldDefinitions, getLogicDefinition, getOperationDefinition, isPropertyBindingExpressionFormValue, preparePropertyForViewer, preparePropertyViewerTabs, registerFieldDefinitions, withValidationsOnEditorNode };
9407
9584
  //# sourceMappingURL=acorex-platform-layout-components.mjs.map