@seniorsistemas/data-seniorx-core 3.3.0 → 3.4.0-main-e91c7773

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 (32) hide show
  1. package/core/constants/nested-table.const.d.ts +3 -0
  2. package/core/constants/table.const.d.ts +2 -0
  3. package/core/types/nested-table.type.d.ts +18 -0
  4. package/esm2022/core/constants/nested-table.const.mjs +4 -0
  5. package/esm2022/core/constants/table.const.mjs +15 -1
  6. package/esm2022/core/types/nested-table.type.mjs +2 -0
  7. package/esm2022/features/datepicker/datepicker.component.mjs +179 -9
  8. package/esm2022/features/nested-table/nested-table.component.mjs +132 -0
  9. package/esm2022/features/panel/panel.component.mjs +3 -3
  10. package/esm2022/features/table/components/table-actions-menu.component.mjs +47 -6
  11. package/esm2022/features/table/components/table-cell-content.component.mjs +3 -3
  12. package/esm2022/features/table/table.component.mjs +17 -67
  13. package/esm2022/features/table/utils/table-data.util.mjs +40 -1
  14. package/esm2022/locales/en.json +5 -0
  15. package/esm2022/locales/es-CO.json +5 -0
  16. package/esm2022/locales/pt.json +5 -0
  17. package/esm2022/providers/features.provider.mjs +3 -1
  18. package/esm2022/public-api.mjs +2 -1
  19. package/features/datepicker/datepicker.component.d.ts +14 -1
  20. package/features/nested-table/nested-table.component.d.ts +47 -0
  21. package/features/table/components/table-actions-menu.component.d.ts +16 -1
  22. package/features/table/table.component.d.ts +0 -1
  23. package/features/table/utils/table-data.util.d.ts +7 -1
  24. package/fesm2022/seniorsistemas-data-seniorx-core.mjs +435 -83
  25. package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
  26. package/package.json +1 -1
  27. package/public-api.d.ts +2 -0
  28. package/src/locales/en.json +5 -0
  29. package/src/locales/es-CO.json +5 -0
  30. package/src/locales/pt.json +5 -0
  31. package/styles/accessibility.scss +92 -0
  32. package/styles.css +89 -1
@@ -378,6 +378,9 @@ var enTranslations = {
378
378
  "platform.datacore.accessibility_panel_content_field": "Panel content text",
379
379
  "platform.datacore.accessibility_panel_toggleable_toggle": "Toggle panel collapsible option",
380
380
  "platform.datacore.accessibility_panel_collapsed_toggle": "Toggle panel collapsed state",
381
+ "platform.datacore.accessibility_nested_table_group_toggle": "Toggle group row",
382
+ "platform.datacore.accessibility_nested_table_hint": "Information",
383
+ "platform.datacore.accessibility_nested_table_row": "group",
381
384
  "platform.datacore.accessibility_code_editor_demo_tabs": "Code editor component demonstration tabs",
382
385
  "platform.datacore.accessibility_code_editor_language_field": "Programming language selection",
383
386
  "platform.datacore.accessibility_code_editor_width_field": "Code editor width",
@@ -561,6 +564,8 @@ var enTranslations = {
561
564
  "platform.datacore.showcase_demos_pick_list_description": "Standard list",
562
565
  "platform.datacore.showcase_demos_table_label": "Table",
563
566
  "platform.datacore.showcase_demos_table_description": "Table and filters",
567
+ "platform.datacore.showcase_demos_nested_table_label": "Nested Table",
568
+ "platform.datacore.showcase_demos_nested_table_description": "Two-level table with row expansion",
564
569
  "platform.datacore.showcase_demos_card_list_label": "Card List",
565
570
  "platform.datacore.showcase_demos_card_list_description": "Grid cards",
566
571
  "platform.datacore.showcase_demos_row_card_list_label": "Row Card List",
@@ -5291,6 +5296,9 @@ var esTranslations = {
5291
5296
  "platform.datacore.accessibility_panel_content_field": "Texto del contenido del panel",
5292
5297
  "platform.datacore.accessibility_panel_toggleable_toggle": "Alternar opción colapsable del panel",
5293
5298
  "platform.datacore.accessibility_panel_collapsed_toggle": "Alternar estado colapsado del panel",
5299
+ "platform.datacore.accessibility_nested_table_group_toggle": "Expandir o contraer fila de grupo",
5300
+ "platform.datacore.accessibility_nested_table_hint": "Información",
5301
+ "platform.datacore.accessibility_nested_table_row": "grupo",
5294
5302
  "platform.datacore.accessibility_code_editor_demo_tabs": "Pestañas de demostración del componente editor de código",
5295
5303
  "platform.datacore.accessibility_code_editor_language_field": "Selección de lenguaje de programación",
5296
5304
  "platform.datacore.accessibility_code_editor_width_field": "Ancho del editor de código",
@@ -5473,6 +5481,8 @@ var esTranslations = {
5473
5481
  "platform.datacore.showcase_demos_pick_list_description": "Lista estándar",
5474
5482
  "platform.datacore.showcase_demos_table_label": "Table",
5475
5483
  "platform.datacore.showcase_demos_table_description": "Tabla y filtros",
5484
+ "platform.datacore.showcase_demos_nested_table_label": "Nested Table",
5485
+ "platform.datacore.showcase_demos_nested_table_description": "Tabla de dos niveles con expansión de fila",
5476
5486
  "platform.datacore.showcase_demos_card_list_label": "Card List",
5477
5487
  "platform.datacore.showcase_demos_card_list_description": "Tarjetas en cuadrícula",
5478
5488
  "platform.datacore.showcase_demos_row_card_list_label": "Row Card List",
@@ -10204,6 +10214,9 @@ var ptTranslations = {
10204
10214
  "platform.datacore.accessibility_panel_content_field": "Texto do conteúdo do painel",
10205
10215
  "platform.datacore.accessibility_panel_toggleable_toggle": "Alternar opção colapsável do painel",
10206
10216
  "platform.datacore.accessibility_panel_collapsed_toggle": "Alternar estado colapsado do painel",
10217
+ "platform.datacore.accessibility_nested_table_group_toggle": "Expandir ou recolher linha de grupo",
10218
+ "platform.datacore.accessibility_nested_table_hint": "Informação",
10219
+ "platform.datacore.accessibility_nested_table_row": "grupo",
10207
10220
  "platform.datacore.accessibility_code_editor_demo_tabs": "Abas de demonstração do componente editor de código",
10208
10221
  "platform.datacore.accessibility_code_editor_language_field": "Seleção de linguagem de programação",
10209
10222
  "platform.datacore.accessibility_code_editor_width_field": "Largura do editor de código",
@@ -10387,6 +10400,8 @@ var ptTranslations = {
10387
10400
  "platform.datacore.showcase_demos_pick_list_description": "Listagem padrão",
10388
10401
  "platform.datacore.showcase_demos_table_label": "Table",
10389
10402
  "platform.datacore.showcase_demos_table_description": "Tabela e filtros",
10403
+ "platform.datacore.showcase_demos_nested_table_label": "Nested Table",
10404
+ "platform.datacore.showcase_demos_nested_table_description": "Tabela de duas camadas com expansão de linha",
10390
10405
  "platform.datacore.showcase_demos_card_list_label": "Card List",
10391
10406
  "platform.datacore.showcase_demos_card_list_description": "Cards em grade",
10392
10407
  "platform.datacore.showcase_demos_row_card_list_label": "Row Card List",
@@ -18370,6 +18385,20 @@ const TABLE_DEFAULT_ROW_ID_PREVIEW_LENGTH = 20;
18370
18385
  const TABLE_HEX_RADIX = 16;
18371
18386
  const TABLE_RGB_MAX = 255;
18372
18387
  const TABLE_MENU_GAP_PX = 4;
18388
+ // Respiro minimo entre o menu de acoes e a borda da tela, usado quando ele nao cabe
18389
+ // abaixo do gatilho e precisa ser trazido pra dentro da viewport.
18390
+ const TABLE_MENU_VIEWPORT_MARGIN_PX = 8;
18391
+ // Altura do estado VAZIO quando a tabela esta empilhada (ver emptyBodyHeightPx).
18392
+ //
18393
+ // O corpo da tabela reserva "linhas por pagina x altura da linha" pra evitar o salto
18394
+ // de layout quando os dados chegam. Empilhado, cada linha e um cartao de 120px: 10
18395
+ // linhas viram 1224px de nada. Medido num Galaxy S9+ (658px de altura util), a lista
18396
+ // vazia esticava a pagina pra 3,4 telas de rolagem - rolar tudo isso pra chegar ao
18397
+ // fim de uma lista que nao tem nada.
18398
+ //
18399
+ // Reservar espaco so faz sentido pra conteudo que vem. No vazio nao vem, entao vale
18400
+ // uma altura fixa, a mesma do piso de carregamento.
18401
+ const TABLE_EMPTY_STATE_MOBILE_HEIGHT_PX = TABLE_DEFAULT_MIN_LOADING_HEIGHT_PX;
18373
18402
  const TABLE_TAG_FOREGROUND_DARKEN_AMOUNT = 0.22;
18374
18403
  const TABLE_TAG_BACKGROUND_ALPHA = 0.14;
18375
18404
  const TABLE_ICON_RENDER_SIZE_PX = 16;
@@ -23478,7 +23507,7 @@ const HANDLE_WIDTH = 6;
23478
23507
  const TASK_LABEL_HORIZONTAL_PADDING = 6;
23479
23508
  const DRAG_MIN_HANDLE_FACTOR = 2;
23480
23509
  const POPUP_AUTO_REMOVE_DELAY_MS = 3000;
23481
- const MONTHS_IN_YEAR = 12;
23510
+ const MONTHS_IN_YEAR$1 = 12;
23482
23511
  const BAR_SELECTOR = '.sdc-gantt-bar';
23483
23512
  var DragMode;
23484
23513
  (function (DragMode) {
@@ -24068,7 +24097,7 @@ class GanttEngine {
24068
24097
  case 'week':
24069
24098
  return (diffDays(rangeStart, taskStart) / DAYS_IN_WEEK$1) * colW;
24070
24099
  case 'month': {
24071
- const monthDiff = (taskStart.getFullYear() - rangeStart.getFullYear()) * MONTHS_IN_YEAR +
24100
+ const monthDiff = (taskStart.getFullYear() - rangeStart.getFullYear()) * MONTHS_IN_YEAR$1 +
24072
24101
  (taskStart.getMonth() - rangeStart.getMonth());
24073
24102
  const dayFraction = (taskStart.getDate() - 1) / new Date(taskStart.getFullYear(), taskStart.getMonth() + 1, 0).getDate();
24074
24103
  return (monthDiff + dayFraction) * colW;
@@ -26618,11 +26647,11 @@ class PanelComponent {
26618
26647
  return 'platform.datacore.accessibility_panel_collapse';
26619
26648
  }
26620
26649
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
26621
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PanelComponent, isStandalone: true, selector: "sdc-panel", inputs: { header: "header", toggleable: "toggleable", collapsed: "collapsed", severity: "severity", borderButtonOptions: "borderButtonOptions", panelClass: ["class", "panelClass"], ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy" }, outputs: { collapsedChange: "collapsedChange" }, ngImport: i0, template: "<section\n [class]=\"panelClasses\"\n [class.sdc-panel--collapsed]=\"collapsed\"\n [class.sdc-panel--toggleable]=\"toggleable\"\n [class.sdc-panel--with-border-button]=\"showBorderButton\"\n [ngClass]=\"severityClass\"\n [attr.aria-label]=\"(ariaLabel || header) | translate\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-expanded]=\"toggleable ? !collapsed : null\"\n>\n @if (showBorderButton) {\n <button\n type=\"button\"\n class=\"sdc-panel__border-button\"\n [disabled]=\"borderButtonDisabled\"\n [attr.aria-label]=\"borderButtonLabel | translate\"\n [attr.title]=\"borderButtonTooltip ? (borderButtonTooltip | translate) : null\"\n (click)=\"onBorderButtonClick($event)\"\n >\n @if (borderButtonIcon) {\n <i [class]=\"borderButtonIcon\" aria-hidden=\"true\"></i>\n <span class=\"sdc-panel__sr-only\">{{ borderButtonLabel | translate }}</span>\n } @else {\n <span>{{ borderButtonLabel | translate }}</span>\n }\n </button>\n }\n\n @if (header || toggleable) {\n <div class=\"sdc-panel__header\">\n <div class=\"sdc-panel__header-content\">\n @if (header) {\n <span class=\"sdc-panel__title\">{{ header | translate }}</span>\n }\n\n <ng-content select=\"[sdcPanelHeaderContent]\"></ng-content>\n </div>\n\n <div class=\"sdc-panel__header-actions\">\n <ng-content select=\"[sdcPanelActions]\"></ng-content>\n\n @if (toggleable) {\n <button\n type=\"button\"\n class=\"sdc-panel__toggle fas\"\n [ngClass]=\"collapsed ? 'fa-plus' : 'fa-minus'\"\n [attr.aria-controls]=\"contentId\"\n [attr.aria-expanded]=\"!collapsed\"\n [attr.aria-label]=\"getToggleAriaLabel() | translate\"\n (click)=\"toggleCollapsed()\"\n >\n <span class=\"sdc-panel__sr-only\">{{ getToggleAriaLabel() | translate }}</span>\n </button>\n }\n </div>\n </div>\n }\n\n @if (!toggleable || !collapsed) {\n <div\n [id]=\"contentId\"\n class=\"sdc-panel__content\"\n [attr.aria-label]=\"'platform.datacore.accessibility_panel_content' | translate\"\n >\n <div class=\"sdc-panel__body\">\n <ng-content></ng-content>\n </div>\n\n <div class=\"sdc-panel__footer\">\n <ng-content select=\"[sdcFooter]\"></ng-content>\n </div>\n </div>\n }\n</section>\n", styles: [":host{display:block}.sdc-panel{position:relative;display:block;overflow:hidden;background-color:var(--sdc-panel-bg, var(--sdc-surface-bg, #ffffff));border:var(--sdc-panel-border, var(--sdc-surface-border, 1px solid #dedce5));border-radius:var(--sdc-panel-radius, var(--sdc-surface-radius, 4px));box-shadow:var(--sdc-panel-shadow, var(--sdc-surface-shadow, none));padding:var(--sdc-panel-padding, var(--sdc-surface-padding, 22px 22px 20px));transition:var(--sdc-panel-transition, var(--sdc-surface-transition, border-color .25s ease))}.sdc-panel.sdc-panel--success{border-left:4px solid var(--sdc-panel-success, #1f9d55)}.sdc-panel.sdc-panel--info{border-left:4px solid var(--sdc-panel-info, #2563eb)}.sdc-panel.sdc-panel--warn{border-left:4px solid var(--sdc-panel-warn, #d97706)}.sdc-panel.sdc-panel--error{border-left:4px solid var(--sdc-panel-error, #dc2626)}.sdc-panel__header{display:flex;align-items:center;justify-content:space-between;gap:1rem;min-height:var(--sdc-panel-header-min-height, var(--sdc-surface-header-min-height, 34px));padding-bottom:var(--sdc-panel-header-padding-bottom, var(--sdc-surface-header-padding-bottom, 20px));border-bottom:var(--sdc-panel-divider-border, var(--sdc-surface-divider-border, 1px solid #dedce5));color:var(--sdc-panel-title-color, var(--sdc-surface-title-color, #212533))}.sdc-panel--collapsed .sdc-panel__header{padding-bottom:0;border-bottom:none}.sdc-panel__header-content{display:flex;align-items:center;gap:var(--sdc-panel-header-gap, var(--sdc-control-gap-lg, .75rem));min-width:0;flex-wrap:wrap}.sdc-panel__header-actions{display:flex;align-items:center;gap:var(--sdc-panel-header-gap, var(--sdc-control-gap, .5rem));flex:0 0 auto}.sdc-panel__title{color:inherit;font-size:var(--sdc-panel-title-font-size, var(--sdc-surface-title-font-size, 14px));font-weight:var(--sdc-panel-title-font-weight, var(--sdc-surface-title-font-weight, 400));line-height:var(--sdc-panel-title-line-height, var(--sdc-surface-title-line-height, 20px))}.sdc-panel__toggle,.sdc-panel__border-button{display:inline-flex;align-items:center;justify-content:center;min-width:var(--sdc-panel-action-size, 24px);min-height:var(--sdc-panel-action-size, 24px);border:none;background:transparent;color:inherit;cursor:pointer}.sdc-panel__toggle{flex:0 0 auto;border-radius:999px}.sdc-panel__toggle:focus-visible{outline:2px solid currentColor;outline-offset:2px}.sdc-panel__border-button{position:absolute;inset-block-start:1rem;inset-inline-start:0;z-index:1;padding:.5rem;border-radius:999px;background:var(--sdc-panel-border-button-bg, #ffffff);box-shadow:0 10px 20px #0f172a1f;transform:translate(-40%)}.sdc-panel__border-button:focus-visible{outline:2px solid currentColor;outline-offset:2px}.sdc-panel__border-button:disabled{cursor:not-allowed;opacity:.56}.sdc-panel__content{padding-top:var(--sdc-panel-content-padding-top, 15px)}.sdc-panel__body{padding:var(--sdc-panel-content-padding, var(--sdc-surface-content-padding, 0))}.sdc-panel__footer{margin-top:var(--sdc-panel-footer-margin-top, var(--sdc-surface-footer-margin-top, 15px));padding-top:var(--sdc-panel-footer-padding-top, var(--sdc-surface-footer-padding-top, 15px));border-top:var(--sdc-panel-divider-border, var(--sdc-surface-divider-border, 1px solid #dedce5))}.sdc-panel__footer:empty{display:none}.sdc-panel__sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
26650
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PanelComponent, isStandalone: true, selector: "sdc-panel", inputs: { header: "header", toggleable: "toggleable", collapsed: "collapsed", severity: "severity", borderButtonOptions: "borderButtonOptions", panelClass: ["class", "panelClass"], ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy" }, outputs: { collapsedChange: "collapsedChange" }, ngImport: i0, template: "<section\n [class]=\"panelClasses\"\n [class.sdc-panel--collapsed]=\"collapsed\"\n [class.sdc-panel--toggleable]=\"toggleable\"\n [class.sdc-panel--with-border-button]=\"showBorderButton\"\n [ngClass]=\"severityClass\"\n [attr.aria-label]=\"(ariaLabel || header) | translate\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-expanded]=\"toggleable ? !collapsed : null\"\n>\n @if (showBorderButton) {\n <button\n type=\"button\"\n class=\"sdc-panel__border-button\"\n [disabled]=\"borderButtonDisabled\"\n [attr.aria-label]=\"borderButtonLabel | translate\"\n [attr.title]=\"borderButtonTooltip ? (borderButtonTooltip | translate) : null\"\n (click)=\"onBorderButtonClick($event)\"\n >\n @if (borderButtonIcon) {\n <i [class]=\"borderButtonIcon\" aria-hidden=\"true\"></i>\n <span class=\"sdc-panel__sr-only\">{{ borderButtonLabel | translate }}</span>\n } @else {\n <span>{{ borderButtonLabel | translate }}</span>\n }\n </button>\n }\n\n @if (header || toggleable) {\n <div class=\"sdc-panel__header\">\n <div class=\"sdc-panel__header-content\">\n @if (header) {\n <span class=\"sdc-panel__title\">{{ header | translate }}</span>\n }\n\n <ng-content select=\"[sdcPanelHeaderContent]\"></ng-content>\n </div>\n\n <div class=\"sdc-panel__header-actions\">\n <ng-content select=\"[sdcPanelActions]\"></ng-content>\n\n @if (toggleable) {\n <button\n type=\"button\"\n class=\"sdc-panel__toggle fas\"\n [ngClass]=\"collapsed ? 'fa-plus' : 'fa-minus'\"\n [attr.aria-controls]=\"contentId\"\n [attr.aria-expanded]=\"!collapsed\"\n [attr.aria-label]=\"getToggleAriaLabel() | translate\"\n (click)=\"toggleCollapsed()\"\n >\n <span class=\"sdc-panel__sr-only\">{{ getToggleAriaLabel() | translate }}</span>\n </button>\n }\n </div>\n </div>\n }\n\n @if (!toggleable || !collapsed) {\n <div\n [id]=\"contentId\"\n class=\"sdc-panel__content\"\n [attr.aria-label]=\"'platform.datacore.accessibility_panel_content' | translate\"\n >\n <div class=\"sdc-panel__body\">\n <ng-content></ng-content>\n </div>\n\n <div class=\"sdc-panel__footer\">\n <ng-content select=\"[sdcFooter]\"></ng-content>\n </div>\n </div>\n }\n</section>\n", styles: [":host{display:block}.sdc-panel{position:relative;display:block;overflow:hidden;background-color:var(--sdc-panel-bg, var(--sdc-surface-bg, #ffffff));border:var(--sdc-panel-border, var(--sdc-surface-border, 1px solid #dedce5));border-radius:var(--sdc-panel-radius, var(--sdc-surface-radius, 4px));box-shadow:var(--sdc-panel-shadow, var(--sdc-surface-shadow, none));padding:var(--sdc-panel-padding, var(--sdc-surface-padding, 22px 22px 20px));transition:var(--sdc-panel-transition, var(--sdc-surface-transition, border-color .25s ease))}.sdc-panel.sdc-panel--success{border-left:4px solid var(--sdc-panel-success, #1f9d55)}.sdc-panel.sdc-panel--info{border-left:4px solid var(--sdc-panel-info, #2563eb)}.sdc-panel.sdc-panel--warn{border-left:4px solid var(--sdc-panel-warn, #d97706)}.sdc-panel.sdc-panel--error{border-left:4px solid var(--sdc-panel-error, #dc2626)}.sdc-panel__header{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap-reverse;min-height:var(--sdc-panel-header-min-height, var(--sdc-surface-header-min-height, 34px));padding-bottom:var(--sdc-panel-header-padding-bottom, var(--sdc-surface-header-padding-bottom, 20px));border-bottom:var(--sdc-panel-divider-border, var(--sdc-surface-divider-border, 1px solid #dedce5));color:var(--sdc-panel-title-color, var(--sdc-surface-title-color, #212533))}.sdc-panel--collapsed .sdc-panel__header{padding-bottom:0;border-bottom:none}.sdc-panel__header-content{display:flex;align-items:center;gap:var(--sdc-panel-header-gap, var(--sdc-control-gap-lg, .75rem));min-width:0;flex-wrap:wrap}.sdc-panel__header-actions{margin-left:auto;display:flex;flex-wrap:wrap-reverse;justify-content:flex-end;align-items:center;gap:var(--sdc-panel-header-gap, var(--sdc-control-gap, .5rem));flex:0 0 auto;max-width:100%}.sdc-panel__title{color:inherit;font-size:var(--sdc-panel-title-font-size, var(--sdc-surface-title-font-size, 14px));font-weight:var(--sdc-panel-title-font-weight, var(--sdc-surface-title-font-weight, 400));line-height:var(--sdc-panel-title-line-height, var(--sdc-surface-title-line-height, 20px))}.sdc-panel__toggle,.sdc-panel__border-button{display:inline-flex;align-items:center;justify-content:center;min-width:var(--sdc-panel-action-size, 24px);min-height:var(--sdc-panel-action-size, 24px);border:none;background:transparent;color:inherit;cursor:pointer}.sdc-panel__toggle{flex:0 0 auto;border-radius:999px}.sdc-panel__toggle:focus-visible{outline:2px solid currentColor;outline-offset:2px}.sdc-panel__border-button{position:absolute;inset-block-start:1rem;inset-inline-start:0;z-index:1;padding:.5rem;border-radius:999px;background:var(--sdc-panel-border-button-bg, #ffffff);box-shadow:0 10px 20px #0f172a1f;transform:translate(-40%)}.sdc-panel__border-button:focus-visible{outline:2px solid currentColor;outline-offset:2px}.sdc-panel__border-button:disabled{cursor:not-allowed;opacity:.56}.sdc-panel__content{padding-top:var(--sdc-panel-content-padding-top, 15px)}.sdc-panel__body{padding:var(--sdc-panel-content-padding, var(--sdc-surface-content-padding, 0))}.sdc-panel__footer{margin-top:var(--sdc-panel-footer-margin-top, var(--sdc-surface-footer-margin-top, 15px));padding-top:var(--sdc-panel-footer-padding-top, var(--sdc-surface-footer-padding-top, 15px));border-top:var(--sdc-panel-divider-border, var(--sdc-surface-divider-border, 1px solid #dedce5))}.sdc-panel__footer:empty{display:none}.sdc-panel__sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
26622
26651
  }
26623
26652
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PanelComponent, decorators: [{
26624
26653
  type: Component,
26625
- args: [{ imports: [CommonModule, TranslateModule], standalone: true, selector: 'sdc-panel', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, template: "<section\n [class]=\"panelClasses\"\n [class.sdc-panel--collapsed]=\"collapsed\"\n [class.sdc-panel--toggleable]=\"toggleable\"\n [class.sdc-panel--with-border-button]=\"showBorderButton\"\n [ngClass]=\"severityClass\"\n [attr.aria-label]=\"(ariaLabel || header) | translate\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-expanded]=\"toggleable ? !collapsed : null\"\n>\n @if (showBorderButton) {\n <button\n type=\"button\"\n class=\"sdc-panel__border-button\"\n [disabled]=\"borderButtonDisabled\"\n [attr.aria-label]=\"borderButtonLabel | translate\"\n [attr.title]=\"borderButtonTooltip ? (borderButtonTooltip | translate) : null\"\n (click)=\"onBorderButtonClick($event)\"\n >\n @if (borderButtonIcon) {\n <i [class]=\"borderButtonIcon\" aria-hidden=\"true\"></i>\n <span class=\"sdc-panel__sr-only\">{{ borderButtonLabel | translate }}</span>\n } @else {\n <span>{{ borderButtonLabel | translate }}</span>\n }\n </button>\n }\n\n @if (header || toggleable) {\n <div class=\"sdc-panel__header\">\n <div class=\"sdc-panel__header-content\">\n @if (header) {\n <span class=\"sdc-panel__title\">{{ header | translate }}</span>\n }\n\n <ng-content select=\"[sdcPanelHeaderContent]\"></ng-content>\n </div>\n\n <div class=\"sdc-panel__header-actions\">\n <ng-content select=\"[sdcPanelActions]\"></ng-content>\n\n @if (toggleable) {\n <button\n type=\"button\"\n class=\"sdc-panel__toggle fas\"\n [ngClass]=\"collapsed ? 'fa-plus' : 'fa-minus'\"\n [attr.aria-controls]=\"contentId\"\n [attr.aria-expanded]=\"!collapsed\"\n [attr.aria-label]=\"getToggleAriaLabel() | translate\"\n (click)=\"toggleCollapsed()\"\n >\n <span class=\"sdc-panel__sr-only\">{{ getToggleAriaLabel() | translate }}</span>\n </button>\n }\n </div>\n </div>\n }\n\n @if (!toggleable || !collapsed) {\n <div\n [id]=\"contentId\"\n class=\"sdc-panel__content\"\n [attr.aria-label]=\"'platform.datacore.accessibility_panel_content' | translate\"\n >\n <div class=\"sdc-panel__body\">\n <ng-content></ng-content>\n </div>\n\n <div class=\"sdc-panel__footer\">\n <ng-content select=\"[sdcFooter]\"></ng-content>\n </div>\n </div>\n }\n</section>\n", styles: [":host{display:block}.sdc-panel{position:relative;display:block;overflow:hidden;background-color:var(--sdc-panel-bg, var(--sdc-surface-bg, #ffffff));border:var(--sdc-panel-border, var(--sdc-surface-border, 1px solid #dedce5));border-radius:var(--sdc-panel-radius, var(--sdc-surface-radius, 4px));box-shadow:var(--sdc-panel-shadow, var(--sdc-surface-shadow, none));padding:var(--sdc-panel-padding, var(--sdc-surface-padding, 22px 22px 20px));transition:var(--sdc-panel-transition, var(--sdc-surface-transition, border-color .25s ease))}.sdc-panel.sdc-panel--success{border-left:4px solid var(--sdc-panel-success, #1f9d55)}.sdc-panel.sdc-panel--info{border-left:4px solid var(--sdc-panel-info, #2563eb)}.sdc-panel.sdc-panel--warn{border-left:4px solid var(--sdc-panel-warn, #d97706)}.sdc-panel.sdc-panel--error{border-left:4px solid var(--sdc-panel-error, #dc2626)}.sdc-panel__header{display:flex;align-items:center;justify-content:space-between;gap:1rem;min-height:var(--sdc-panel-header-min-height, var(--sdc-surface-header-min-height, 34px));padding-bottom:var(--sdc-panel-header-padding-bottom, var(--sdc-surface-header-padding-bottom, 20px));border-bottom:var(--sdc-panel-divider-border, var(--sdc-surface-divider-border, 1px solid #dedce5));color:var(--sdc-panel-title-color, var(--sdc-surface-title-color, #212533))}.sdc-panel--collapsed .sdc-panel__header{padding-bottom:0;border-bottom:none}.sdc-panel__header-content{display:flex;align-items:center;gap:var(--sdc-panel-header-gap, var(--sdc-control-gap-lg, .75rem));min-width:0;flex-wrap:wrap}.sdc-panel__header-actions{display:flex;align-items:center;gap:var(--sdc-panel-header-gap, var(--sdc-control-gap, .5rem));flex:0 0 auto}.sdc-panel__title{color:inherit;font-size:var(--sdc-panel-title-font-size, var(--sdc-surface-title-font-size, 14px));font-weight:var(--sdc-panel-title-font-weight, var(--sdc-surface-title-font-weight, 400));line-height:var(--sdc-panel-title-line-height, var(--sdc-surface-title-line-height, 20px))}.sdc-panel__toggle,.sdc-panel__border-button{display:inline-flex;align-items:center;justify-content:center;min-width:var(--sdc-panel-action-size, 24px);min-height:var(--sdc-panel-action-size, 24px);border:none;background:transparent;color:inherit;cursor:pointer}.sdc-panel__toggle{flex:0 0 auto;border-radius:999px}.sdc-panel__toggle:focus-visible{outline:2px solid currentColor;outline-offset:2px}.sdc-panel__border-button{position:absolute;inset-block-start:1rem;inset-inline-start:0;z-index:1;padding:.5rem;border-radius:999px;background:var(--sdc-panel-border-button-bg, #ffffff);box-shadow:0 10px 20px #0f172a1f;transform:translate(-40%)}.sdc-panel__border-button:focus-visible{outline:2px solid currentColor;outline-offset:2px}.sdc-panel__border-button:disabled{cursor:not-allowed;opacity:.56}.sdc-panel__content{padding-top:var(--sdc-panel-content-padding-top, 15px)}.sdc-panel__body{padding:var(--sdc-panel-content-padding, var(--sdc-surface-content-padding, 0))}.sdc-panel__footer{margin-top:var(--sdc-panel-footer-margin-top, var(--sdc-surface-footer-margin-top, 15px));padding-top:var(--sdc-panel-footer-padding-top, var(--sdc-surface-footer-padding-top, 15px));border-top:var(--sdc-panel-divider-border, var(--sdc-surface-divider-border, 1px solid #dedce5))}.sdc-panel__footer:empty{display:none}.sdc-panel__sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n"] }]
26654
+ args: [{ imports: [CommonModule, TranslateModule], standalone: true, selector: 'sdc-panel', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, template: "<section\n [class]=\"panelClasses\"\n [class.sdc-panel--collapsed]=\"collapsed\"\n [class.sdc-panel--toggleable]=\"toggleable\"\n [class.sdc-panel--with-border-button]=\"showBorderButton\"\n [ngClass]=\"severityClass\"\n [attr.aria-label]=\"(ariaLabel || header) | translate\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-expanded]=\"toggleable ? !collapsed : null\"\n>\n @if (showBorderButton) {\n <button\n type=\"button\"\n class=\"sdc-panel__border-button\"\n [disabled]=\"borderButtonDisabled\"\n [attr.aria-label]=\"borderButtonLabel | translate\"\n [attr.title]=\"borderButtonTooltip ? (borderButtonTooltip | translate) : null\"\n (click)=\"onBorderButtonClick($event)\"\n >\n @if (borderButtonIcon) {\n <i [class]=\"borderButtonIcon\" aria-hidden=\"true\"></i>\n <span class=\"sdc-panel__sr-only\">{{ borderButtonLabel | translate }}</span>\n } @else {\n <span>{{ borderButtonLabel | translate }}</span>\n }\n </button>\n }\n\n @if (header || toggleable) {\n <div class=\"sdc-panel__header\">\n <div class=\"sdc-panel__header-content\">\n @if (header) {\n <span class=\"sdc-panel__title\">{{ header | translate }}</span>\n }\n\n <ng-content select=\"[sdcPanelHeaderContent]\"></ng-content>\n </div>\n\n <div class=\"sdc-panel__header-actions\">\n <ng-content select=\"[sdcPanelActions]\"></ng-content>\n\n @if (toggleable) {\n <button\n type=\"button\"\n class=\"sdc-panel__toggle fas\"\n [ngClass]=\"collapsed ? 'fa-plus' : 'fa-minus'\"\n [attr.aria-controls]=\"contentId\"\n [attr.aria-expanded]=\"!collapsed\"\n [attr.aria-label]=\"getToggleAriaLabel() | translate\"\n (click)=\"toggleCollapsed()\"\n >\n <span class=\"sdc-panel__sr-only\">{{ getToggleAriaLabel() | translate }}</span>\n </button>\n }\n </div>\n </div>\n }\n\n @if (!toggleable || !collapsed) {\n <div\n [id]=\"contentId\"\n class=\"sdc-panel__content\"\n [attr.aria-label]=\"'platform.datacore.accessibility_panel_content' | translate\"\n >\n <div class=\"sdc-panel__body\">\n <ng-content></ng-content>\n </div>\n\n <div class=\"sdc-panel__footer\">\n <ng-content select=\"[sdcFooter]\"></ng-content>\n </div>\n </div>\n }\n</section>\n", styles: [":host{display:block}.sdc-panel{position:relative;display:block;overflow:hidden;background-color:var(--sdc-panel-bg, var(--sdc-surface-bg, #ffffff));border:var(--sdc-panel-border, var(--sdc-surface-border, 1px solid #dedce5));border-radius:var(--sdc-panel-radius, var(--sdc-surface-radius, 4px));box-shadow:var(--sdc-panel-shadow, var(--sdc-surface-shadow, none));padding:var(--sdc-panel-padding, var(--sdc-surface-padding, 22px 22px 20px));transition:var(--sdc-panel-transition, var(--sdc-surface-transition, border-color .25s ease))}.sdc-panel.sdc-panel--success{border-left:4px solid var(--sdc-panel-success, #1f9d55)}.sdc-panel.sdc-panel--info{border-left:4px solid var(--sdc-panel-info, #2563eb)}.sdc-panel.sdc-panel--warn{border-left:4px solid var(--sdc-panel-warn, #d97706)}.sdc-panel.sdc-panel--error{border-left:4px solid var(--sdc-panel-error, #dc2626)}.sdc-panel__header{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap-reverse;min-height:var(--sdc-panel-header-min-height, var(--sdc-surface-header-min-height, 34px));padding-bottom:var(--sdc-panel-header-padding-bottom, var(--sdc-surface-header-padding-bottom, 20px));border-bottom:var(--sdc-panel-divider-border, var(--sdc-surface-divider-border, 1px solid #dedce5));color:var(--sdc-panel-title-color, var(--sdc-surface-title-color, #212533))}.sdc-panel--collapsed .sdc-panel__header{padding-bottom:0;border-bottom:none}.sdc-panel__header-content{display:flex;align-items:center;gap:var(--sdc-panel-header-gap, var(--sdc-control-gap-lg, .75rem));min-width:0;flex-wrap:wrap}.sdc-panel__header-actions{margin-left:auto;display:flex;flex-wrap:wrap-reverse;justify-content:flex-end;align-items:center;gap:var(--sdc-panel-header-gap, var(--sdc-control-gap, .5rem));flex:0 0 auto;max-width:100%}.sdc-panel__title{color:inherit;font-size:var(--sdc-panel-title-font-size, var(--sdc-surface-title-font-size, 14px));font-weight:var(--sdc-panel-title-font-weight, var(--sdc-surface-title-font-weight, 400));line-height:var(--sdc-panel-title-line-height, var(--sdc-surface-title-line-height, 20px))}.sdc-panel__toggle,.sdc-panel__border-button{display:inline-flex;align-items:center;justify-content:center;min-width:var(--sdc-panel-action-size, 24px);min-height:var(--sdc-panel-action-size, 24px);border:none;background:transparent;color:inherit;cursor:pointer}.sdc-panel__toggle{flex:0 0 auto;border-radius:999px}.sdc-panel__toggle:focus-visible{outline:2px solid currentColor;outline-offset:2px}.sdc-panel__border-button{position:absolute;inset-block-start:1rem;inset-inline-start:0;z-index:1;padding:.5rem;border-radius:999px;background:var(--sdc-panel-border-button-bg, #ffffff);box-shadow:0 10px 20px #0f172a1f;transform:translate(-40%)}.sdc-panel__border-button:focus-visible{outline:2px solid currentColor;outline-offset:2px}.sdc-panel__border-button:disabled{cursor:not-allowed;opacity:.56}.sdc-panel__content{padding-top:var(--sdc-panel-content-padding-top, 15px)}.sdc-panel__body{padding:var(--sdc-panel-content-padding, var(--sdc-surface-content-padding, 0))}.sdc-panel__footer{margin-top:var(--sdc-panel-footer-margin-top, var(--sdc-surface-footer-margin-top, 15px));padding-top:var(--sdc-panel-footer-padding-top, var(--sdc-surface-footer-padding-top, 15px));border-top:var(--sdc-panel-divider-border, var(--sdc-surface-divider-border, 1px solid #dedce5))}.sdc-panel__footer:empty{display:none}.sdc-panel__sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n"] }]
26626
26655
  }], propDecorators: { header: [{
26627
26656
  type: Input
26628
26657
  }], toggleable: [{
@@ -30360,7 +30389,9 @@ var TableMenuFocusTarget;
30360
30389
  })(TableMenuFocusTarget || (TableMenuFocusTarget = {}));
30361
30390
 
30362
30391
  class TableActionsMenuComponent {
30392
+ cdr;
30363
30393
  menuItems;
30394
+ painel;
30364
30395
  ariaLabel = 'platform.datacore.accessibility_actions_menu';
30365
30396
  items = [];
30366
30397
  left = 0;
@@ -30370,8 +30401,41 @@ class TableActionsMenuComponent {
30370
30401
  close = new EventEmitter();
30371
30402
  select = new EventEmitter();
30372
30403
  activeIndex = -1;
30404
+ constructor(cdr) {
30405
+ this.cdr = cdr;
30406
+ }
30373
30407
  ngAfterViewInit() {
30374
- queueMicrotask(() => this.focusFirstEnabledItem());
30408
+ queueMicrotask(() => {
30409
+ this.manterDentroDaViewport();
30410
+ this.focusFirstEnabledItem();
30411
+ });
30412
+ }
30413
+ /**
30414
+ * O chamador posiciona o menu logo abaixo do gatilho (table.component.ts:
30415
+ * `top: rect.bottom + gap`) sem saber a altura dele, que so existe depois de
30416
+ * renderizar. Numa linha perto do rodape o menu nascia fora da tela - medido num
30417
+ * iPad Mini (viewport de 1024px): abria em top 1028, bottom 1094, com o item
30418
+ * "Visualizar" em 1038. Como e `position: fixed`, rolar a pagina NAO traz ele de
30419
+ * volta - ficava impossivel de alcancar.
30420
+ *
30421
+ * Aqui, ja com a medida real, o menu encosta na borda em vez de passar dela. A
30422
+ * horizontal segue a mesma ideia.
30423
+ */
30424
+ manterDentroDaViewport() {
30425
+ const el = this.painel?.nativeElement;
30426
+ if (!el) {
30427
+ return;
30428
+ }
30429
+ const { width, height } = el.getBoundingClientRect();
30430
+ const margem = TABLE_MENU_VIEWPORT_MARGIN_PX;
30431
+ const top = Math.max(margem, Math.min(this.top, window.innerHeight - height - margem));
30432
+ const left = Math.max(margem, Math.min(this.left, window.innerWidth - width - margem));
30433
+ if (top === this.top && left === this.left) {
30434
+ return;
30435
+ }
30436
+ this.top = top;
30437
+ this.left = left;
30438
+ this.cdr.markForCheck();
30375
30439
  }
30376
30440
  onItemFocus(index) {
30377
30441
  if (this.items[index]?.disabled) {
@@ -30488,9 +30552,10 @@ class TableActionsMenuComponent {
30488
30552
  event.preventDefault();
30489
30553
  this.focusIndex(enabledIndexes[currentEnabledPosition + 1]);
30490
30554
  }
30491
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableActionsMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
30492
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TableActionsMenuComponent, isStandalone: true, selector: "sdc-table-actions-menu", inputs: { ariaLabel: "ariaLabel", items: "items", left: "left", menuId: "menuId", top: "top", width: "width" }, outputs: { close: "close", select: "select" }, viewQueries: [{ propertyName: "menuItems", predicate: ["menuItem"], descendants: true }], ngImport: i0, template: `
30555
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableActionsMenuComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
30556
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TableActionsMenuComponent, isStandalone: true, selector: "sdc-table-actions-menu", inputs: { ariaLabel: "ariaLabel", items: "items", left: "left", menuId: "menuId", top: "top", width: "width" }, outputs: { close: "close", select: "select" }, viewQueries: [{ propertyName: "painel", first: true, predicate: ["painel"], descendants: true }, { propertyName: "menuItems", predicate: ["menuItem"], descendants: true }], ngImport: i0, template: `
30493
30557
  <div
30558
+ #painel
30494
30559
  class="sdc-actions-menu sdc-actions-menu--portal"
30495
30560
  [id]="menuId || null"
30496
30561
  [style.top.px]="top"
@@ -30530,6 +30595,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
30530
30595
  type: Component,
30531
30596
  args: [{ selector: 'sdc-table-actions-menu', standalone: true, imports: [CommonModule, TranslateModule, IconRendererComponent], template: `
30532
30597
  <div
30598
+ #painel
30533
30599
  class="sdc-actions-menu sdc-actions-menu--portal"
30534
30600
  [id]="menuId || null"
30535
30601
  [style.top.px]="top"
@@ -30564,9 +30630,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
30564
30630
  }
30565
30631
  </div>
30566
30632
  `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".sdc-actions-menu{background:#fff;border:1px solid #d1d5db;border-radius:0;box-shadow:0 1px 2px #0f172a14;padding:0}.sdc-actions-menu--portal{position:fixed;z-index:2147483647}.sdc-actions-item{width:100%;display:flex;align-items:stretch;justify-content:flex-start;border:0;border-bottom:1px solid #e5e7eb;background:#fff;padding:0;text-align:left;cursor:pointer;font:inherit;color:#374151;min-height:2.25rem;transition:background-color .15s ease,color .15s ease}.sdc-actions-item:last-child{border-bottom:0}.sdc-actions-item__content{display:inline-flex;align-items:center;gap:.5rem;padding:.625rem .875rem;width:100%;font-size:.8125rem;line-height:1.2}.sdc-actions-item:hover:not(:disabled),.sdc-actions-item:focus-visible:not(:disabled){background:#f9fafb;outline:none}.sdc-actions-item:disabled,.sdc-actions-item.sdc-actions-item--disabled,.sdc-actions-item[data-disabled=true]{color:#9ca3af;cursor:not-allowed;background:#fff;pointer-events:none}.sdc-actions-item:disabled .sdc-actions-item__content,.sdc-actions-item.sdc-actions-item--disabled .sdc-actions-item__content,.sdc-actions-item[data-disabled=true] .sdc-actions-item__content{opacity:.55}\n"] }]
30567
- }], propDecorators: { menuItems: [{
30633
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { menuItems: [{
30568
30634
  type: ViewChildren,
30569
30635
  args: ['menuItem']
30636
+ }], painel: [{
30637
+ type: ViewChild,
30638
+ args: ['painel']
30570
30639
  }], ariaLabel: [{
30571
30640
  type: Input
30572
30641
  }], items: [{
@@ -30785,6 +30854,45 @@ function filterTableRows(data, cols, query, resolveValue) {
30785
30854
  return stringifyUnknown(value).toLowerCase().includes(normalizedQuery);
30786
30855
  }));
30787
30856
  }
30857
+ // Extraido de TableComponent.sortedData pra ser reaproveitado por sdc-nested-table no
30858
+ // nivel de grupo, que precisa do mesmo comparador sem reimplementar sdc-table inteiro.
30859
+ function sortTableRows(data, field, order, resolveValue) {
30860
+ if (!field || order === 0) {
30861
+ return [...data];
30862
+ }
30863
+ const rows = [...data];
30864
+ return rows.sort((leftRow, rightRow) => {
30865
+ const leftValue = resolveValue(leftRow, field);
30866
+ const rightValue = resolveValue(rightRow, field);
30867
+ if (leftValue == null && rightValue == null) {
30868
+ return 0;
30869
+ }
30870
+ if (leftValue == null) {
30871
+ return -order;
30872
+ }
30873
+ if (rightValue == null) {
30874
+ return order;
30875
+ }
30876
+ if (typeof leftValue === 'number' && typeof rightValue === 'number') {
30877
+ return (leftValue - rightValue) * order;
30878
+ }
30879
+ return stringifyUnknown(leftValue).localeCompare(stringifyUnknown(rightValue)) * order;
30880
+ });
30881
+ }
30882
+ // Compartilhado por TableComponent.toggleSort e NestedTableComponent.toggleGroupSort -
30883
+ // mesmo ciclo tri-state (asc -> desc -> neutro) nos dois niveis.
30884
+ function cycleSortState(currentField, currentOrder, field) {
30885
+ if (currentField !== field) {
30886
+ return { field, order: 1 };
30887
+ }
30888
+ if (currentOrder === 1) {
30889
+ return { field, order: -1 };
30890
+ }
30891
+ if (currentOrder === -1) {
30892
+ return { field: null, order: 0 };
30893
+ }
30894
+ return { field, order: 1 };
30895
+ }
30788
30896
 
30789
30897
  const HEX_COLOR_STRING_LENGTH = 6;
30790
30898
  function resolveTableVisualConfig(input, value, row) {
@@ -31123,7 +31231,7 @@ class TableCellContentComponent {
31123
31231
  this.toggleActionsMenu.emit({ event, trigger });
31124
31232
  }
31125
31233
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableCellContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
31126
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TableCellContentComponent, isStandalone: true, selector: "sdc-table-cell-content", inputs: { cellConfigs: "cellConfigs", col: "col", resolveValue: "resolveValue", row: "row", actionsMenuOpen: "actionsMenuOpen", actionsMenuId: "actionsMenuId", defaultTextOverflow: "defaultTextOverflow", rowCheckboxId: "rowCheckboxId", rowLabel: "rowLabel", rowSelectionDisabled: "rowSelectionDisabled", forceLeftAlign: "forceLeftAlign", rowSelected: "rowSelected" }, outputs: { toggleActionsMenu: "toggleActionsMenu", toggleRow: "toggleRow", triggerButtonAction: "triggerButtonAction" }, host: { properties: { "class.sdc-table-cell-content--align-left": "resolvedAlignment === 'left'", "class.sdc-table-cell-content--align-center": "resolvedAlignment === 'center'", "class.sdc-table-cell-content--align-right": "resolvedAlignment === 'right'", "class.sdc-table-cell-content--nowrap": "col?.textOverflow === 'none'" } }, ngImport: i0, template: "<div class=\"sdc-table-content\">\n @if (col.content?.length) {\n <div class=\"sdc-table-multi-content\">\n @for (item of col.content!; track $index) {\n @switch (item.type ?? 'text') {\n @case ('strong') {\n <strong\n [ngStyle]=\"item.style\"\n [class]=\"item.class ?? ''\"\n >{{ cellTextValue(item.field) | translate }}</strong>\n }\n @case ('code') {\n <code [ngStyle]=\"item.style\" [class]=\"item.class ?? ''\">{{ cellTextValue(item.field) }}</code>\n }\n @default {\n <span [ngStyle]=\"item.style\" [class]=\"item.class ?? ''\">{{ cellTextValue(item.field) | translate }}</span>\n }\n }\n }\n </div>\n } @else {\n @switch (col.type ?? 'text') {\n @case ('checkbox-selection') {\n <div class=\"sdc-table-checkbox\">\n <input\n type=\"checkbox\"\n [id]=\"rowCheckboxId\"\n [disabled]=\"rowSelectionDisabled\"\n [checked]=\"rowSelected\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (change)=\"toggleRow.emit(getCheckedValue($event))\"\n [attr.aria-label]=\"\n 'platform.datacore.accessibility_select_row'\n | translate: { name: (rowLabel | translate) }\n \"\n [attr.aria-checked]=\"rowSelected\"\n />\n <label [attr.for]=\"rowCheckboxId\" class=\"sr-only\">\n {{\n 'platform.datacore.accessibility_select_row'\n | translate: { name: (rowLabel | translate) }\n }}\n </label>\n </div>\n }\n\n @case ('date') {\n <span class=\"sdc-table-text\" [attr.title]=\"ellipsisTitleText(formatDate())\">{{ formatDate() }}</span>\n }\n\n @case ('strong') {\n <span class=\"sdc-table-strong-label\"\n [attr.title]=\"ellipsisTitleText(cellTextValue() | translate)\">\n {{ cellTextValue() | translate | sdcTruncate:col:defaultTextOverflow }}\n </span>\n }\n\n @case ('code') {\n <code class=\"sdc-table-code-label\"\n [attr.title]=\"ellipsisTitleText(cellTextValue())\">{{ displayText() }}</code>\n }\n\n @case ('link') {\n <a class=\"sdc-table-link\"\n [href]=\"cellTextValue()\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"$event.stopPropagation()\"\n [attr.title]=\"ellipsisTitleText(cellTextValue() | translate)\">\n {{ cellTextValue() | translate | sdcTruncate:col:defaultTextOverflow }}\n </a>\n }\n\n @case ('currency') {\n <span class=\"sdc-table-text\"\n [attr.title]=\"ellipsisTitleText(formatCurrency())\">{{ formatCurrency() }}</span>\n }\n\n @case ('tag') {\n <div class=\"sdc-table-tags\">\n @for (tagItem of tagItems(); track tagItem.label + '-' + $index) {\n <span\n class=\"sdc-table-tag\"\n [class.sdc-table-tag--enabled]=\"tagItem.tone === 'enabled'\"\n [class.sdc-table-tag--disabled]=\"tagItem.tone === 'disabled'\"\n [ngStyle]=\"tagItem.styles\"\n [attr.title]=\"tagItem.tooltip ? (tagItem.tooltip | translate) : (tagItem.label | translate)\"\n >\n @if (tagItem.icon) {\n <sdc-icon-renderer\n class=\"sdc-table-tag__icon\"\n [icon]=\"tagItem.icon\"\n [iconType]=\"tagItem.iconType\"\n [size]=\"tagIconSize\"\n ></sdc-icon-renderer>\n }\n {{ tagItem.label | translate }}\n </span>\n }\n\n @if (tagOverflow(); as overflow) {\n @if (overflow.hiddenCount > 0) {\n <span\n class=\"sdc-table-tag sdc-table-tag--more\"\n [attr.title]=\"\n 'platform.datacore.accessibility_table_tag_more_items'\n | translate: { items: tagOverflowTitle(overflow) }\n \"\n >\u2026</span>\n }\n }\n </div>\n }\n\n @case ('button') {\n <div class=\"sdc-table-button\">\n <sdc-button\n class=\"sdc-table-action-button\"\n [size]=\"cellConfigs.button.size ?? 'default'\"\n [priority]=\"cellConfigs.button.priority || 'primary'\"\n [icon]=\"cellConfigs.button.icon\"\n [label]=\"cellConfigs.button.label ?? ''\"\n [disabled]=\"cellConfigs.button.disabled ?? false\"\n [title]=\"cellConfigs.button.tooltip\"\n [attr.size]=\"cellConfigs.button.size\"\n [attr.priority]=\"cellConfigs.button.priority || 'primary'\"\n [attr.severity]=\"cellConfigs.button.priority || 'primary'\"\n [attr.icon]=\"cellConfigs.button.icon\"\n [attr.label]=\"cellConfigs.button.label\"\n [attr.disabled]=\"cellConfigs.button.disabled ? '' : null\"\n [attr.title]=\"cellConfigs.button.tooltip || null\"\n [attr.aria-label]=\"\n (buttonAriaLabel() | translate)\n + ' - '\n + (rowLabel | translate)\n \"\n [attr.data-key]=\"buttonKey()\"\n (click)=\"cellConfigs.button.disabled ? null : triggerButtonAction.emit()\"\n (keydown.enter)=\"cellConfigs.button.disabled ? null : triggerButtonAction.emit()\"\n (keydown.space)=\"$event.preventDefault(); cellConfigs.button.disabled ? null : triggerButtonAction.emit()\"\n ></sdc-button>\n </div>\n }\n\n @case ('actions') {\n <div\n class=\"sdc-table-actions\"\n [class.sdc-table-actions--open]=\"actionsMenuOpen\"\n >\n <button\n #actionsTrigger\n type=\"button\"\n class=\"sdc-table-actions-trigger\"\n [class.sdc-table-actions-trigger--open]=\"actionsMenuOpen\"\n [attr.aria-label]=\"\n (actionsButtonLabel() | translate)\n + ' - '\n + (rowLabel | translate)\n \"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-controls]=\"actionsMenuOpen ? actionsMenuId : null\"\n [attr.aria-expanded]=\"actionsMenuOpen\"\n (click)=\"onActionsClick($event, actionsTrigger)\"\n >\n <span class=\"sdc-table-actions-trigger__label\">\n {{ actionsButtonLabel() | translate }}\n </span>\n <i class=\"fas fa-chevron-down sdc-table-actions-trigger__icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n @case ('icon') {\n @if (iconPresentation(); as iconItem) {\n <span\n class=\"sdc-table-icon\"\n [ngStyle]=\"iconItem.colorStyle\"\n [attr.title]=\"iconItem.tooltip ? (iconItem.tooltip | translate) : null\"\n [attr.aria-label]=\"\n (iconItem.label || iconItem.tooltip)\n ? ((iconItem.label || iconItem.tooltip)! | translate)\n : null\n \"\n >\n @if (iconItem.icon) {\n <sdc-icon-renderer\n [icon]=\"iconItem.icon\"\n [iconType]=\"iconItem.iconType\"\n [size]=\"iconSize\"\n ></sdc-icon-renderer>\n }\n @if (iconItem.label) {\n <span class=\"sdc-table-icon__label\">{{ iconItem.label | translate }}</span>\n }\n </span>\n }\n }\n\n @case ('icon-title') {\n @if (titleIconPresentation(); as titleIconItem) {\n <span\n class=\"sdc-table-icon-title\"\n [ngStyle]=\"titleIconItem.colorStyle\"\n [attr.title]=\"titleIconItem.tooltip ? (titleIconItem.tooltip | translate) : null\"\n >\n @if (titleIconItem.icon) {\n <sdc-icon-renderer\n [icon]=\"titleIconItem.icon\"\n [iconType]=\"titleIconItem.iconType\"\n [size]=\"iconSize\"\n ></sdc-icon-renderer>\n }\n @if (titleIconItem.label) {\n <span [attr.title]=\"ellipsisTitleText(titleIconItem.label | translate)\">\n {{ titleIconItem.label | translate | sdcTruncate:col:defaultTextOverflow }}\n </span>\n }\n </span>\n }\n }\n\n @default {\n <span class=\"sdc-table-text\"\n [attr.title]=\"ellipsisTitleText(cellTextValue() | translate)\">\n {{ cellTextValue() | translate | sdcTruncate:col:defaultTextOverflow }}\n </span>\n }\n }\n }\n</div>\n", styles: [":host{display:block;width:100%;min-width:0}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table-content{display:flex;align-items:center;width:100%;min-width:0}:host(.sdc-table-cell-content--align-left) .sdc-table-content{justify-content:flex-start;text-align:left}:host(.sdc-table-cell-content--align-center) .sdc-table-content{justify-content:center;text-align:center}:host(.sdc-table-cell-content--align-right) .sdc-table-content{justify-content:flex-end;text-align:right}.sdc-table-multi-content{display:flex;flex-direction:column;gap:.25rem;min-width:0;max-width:100%}.sdc-table-multi-content strong,.sdc-table-multi-content code,.sdc-table-multi-content span,.sdc-table-text,.sdc-table-strong-label,.sdc-table-code-label,.sdc-table-link{min-width:0;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-table-strong-label{font-weight:500}.sdc-table-code-label{color:var(--sdc-tab-primary)}.sdc-table-link{display:inline-block;color:var(--sdc-tab-primary);text-decoration:underline}.sdc-table-link:hover,.sdc-table-link:focus-visible{text-decoration:none}.sdc-table-tags{display:flex;flex-wrap:wrap;gap:.5rem;min-width:0;max-width:100%;overflow:hidden}.sdc-table-tag{display:inline-flex;align-items:center;justify-content:center;gap:.35rem;width:fit-content;min-width:fit-content;max-width:100%;border-radius:9999px;font-weight:500;line-height:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid currentColor;box-sizing:border-box;font-size:.875rem;padding:.35rem .875rem}.sdc-table-tag__icon{flex:0 0 auto}.sdc-table-tag--enabled{background:#dcfce7;color:#16a34a;border-color:#16a34a}.sdc-table-tag--disabled{background:#fee2e2;color:#ef4444;border-color:#ef4444}.sdc-table-tag--more{background:#f3f4f6;color:#374151;border-color:#374151;cursor:default;font-weight:700}.sdc-table-button{display:flex;align-items:center;justify-content:center;min-height:44px;width:100%;min-width:0}.sdc-table-button ::ng-deep sdc-button,.sdc-table-button ::ng-deep button{min-height:unset;min-width:unset;max-width:100%}.sdc-table-action-button{width:100%;max-width:100%;min-width:0}.sdc-table-icon,.sdc-table-icon-title{display:inline-flex;align-items:center;gap:.5rem;min-width:0;max-width:100%}.sdc-table-icon__label,.sdc-table-icon-title span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.sdc-table-checkbox{display:flex;align-items:center;justify-content:center}.sdc-table-checkbox input[type=checkbox]{cursor:pointer}.sdc-table-checkbox input[type=checkbox]:disabled{cursor:not-allowed;opacity:.55}.sdc-table-actions{position:relative;display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:0}.sdc-table-actions-trigger{appearance:none;border:1px solid #c9ced6;background:#fff;border-radius:999px;min-width:4.875rem;height:2rem;padding:0 .75rem;display:inline-flex;align-items:center;justify-content:center;gap:.375rem;font:inherit;font-size:.8125rem;color:#374151;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease,background-color .15s ease}.sdc-table-actions-trigger:hover{background:#f9fafb}.sdc-table-actions-trigger:focus-visible,.sdc-table-actions-trigger--open{outline:none;border-color:#9ca3af;box-shadow:0 0 0 2px #1118270a}.sdc-table-actions-trigger__label{line-height:1;white-space:nowrap}.sdc-table-actions-trigger__icon{font-size:.625rem;line-height:1;color:#6b7280}@media (max-width: 768px){.sdc-table-multi-content strong,.sdc-table-multi-content code,.sdc-table-multi-content span{white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;word-break:break-word}.sdc-table-tag{font-size:.8125rem;padding:.35rem .75rem}.sdc-table-actions-trigger{min-width:4.375rem;height:1.75rem;padding:0 .625rem;font-size:.75rem}.sdc-table-text,.sdc-table-strong-label,.sdc-table-code-label,.sdc-table-link,.sdc-table-icon__label,.sdc-table-icon-title span{white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;word-break:break-word}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: ButtonComponent, selector: "sdc-button", inputs: ["id", "label", "ariaLabel", "disabled", "loading", "width", "priority", "size", "type", "icon", "rightIcon", "auxiliary", "rounded", "caret", "tooltip", "animation", "slide", "styleClass", "badge", "menuOptions", "menuContext", "model"], outputs: ["clicked"] }, { kind: "component", type: IconRendererComponent, selector: "sdc-icon-renderer", inputs: ["icon", "iconType", "size"] }, { kind: "pipe", type: SdcTruncatePipe, name: "sdcTruncate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
31234
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TableCellContentComponent, isStandalone: true, selector: "sdc-table-cell-content", inputs: { cellConfigs: "cellConfigs", col: "col", resolveValue: "resolveValue", row: "row", actionsMenuOpen: "actionsMenuOpen", actionsMenuId: "actionsMenuId", defaultTextOverflow: "defaultTextOverflow", rowCheckboxId: "rowCheckboxId", rowLabel: "rowLabel", rowSelectionDisabled: "rowSelectionDisabled", forceLeftAlign: "forceLeftAlign", rowSelected: "rowSelected" }, outputs: { toggleActionsMenu: "toggleActionsMenu", toggleRow: "toggleRow", triggerButtonAction: "triggerButtonAction" }, host: { properties: { "class.sdc-table-cell-content--align-left": "resolvedAlignment === 'left'", "class.sdc-table-cell-content--align-center": "resolvedAlignment === 'center'", "class.sdc-table-cell-content--align-right": "resolvedAlignment === 'right'", "class.sdc-table-cell-content--nowrap": "col?.textOverflow === 'none'" } }, ngImport: i0, template: "<div class=\"sdc-table-content\">\n @if (col.content?.length) {\n <div class=\"sdc-table-multi-content\">\n @for (item of col.content!; track $index) {\n @switch (item.type ?? 'text') {\n @case ('strong') {\n <strong\n [ngStyle]=\"item.style\"\n [class]=\"item.class ?? ''\"\n [attr.title]=\"ellipsisTitleText(cellTextValue(item.field) | translate)\"\n >{{ displayText(item.field) | translate }}</strong>\n }\n @case ('code') {\n <code\n [ngStyle]=\"item.style\"\n [class]=\"item.class ?? ''\"\n [attr.title]=\"ellipsisTitleText(cellTextValue(item.field))\"\n >{{ displayText(item.field) }}</code>\n }\n @default {\n <span\n [ngStyle]=\"item.style\"\n [class]=\"item.class ?? ''\"\n [attr.title]=\"ellipsisTitleText(cellTextValue(item.field) | translate)\"\n >{{ displayText(item.field) | translate }}</span>\n }\n }\n }\n </div>\n } @else {\n @switch (col.type ?? 'text') {\n @case ('checkbox-selection') {\n <div class=\"sdc-table-checkbox\">\n <input\n type=\"checkbox\"\n [id]=\"rowCheckboxId\"\n [disabled]=\"rowSelectionDisabled\"\n [checked]=\"rowSelected\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (change)=\"toggleRow.emit(getCheckedValue($event))\"\n [attr.aria-label]=\"\n 'platform.datacore.accessibility_select_row'\n | translate: { name: (rowLabel | translate) }\n \"\n [attr.aria-checked]=\"rowSelected\"\n />\n <label [attr.for]=\"rowCheckboxId\" class=\"sr-only\">\n {{\n 'platform.datacore.accessibility_select_row'\n | translate: { name: (rowLabel | translate) }\n }}\n </label>\n </div>\n }\n\n @case ('date') {\n <span class=\"sdc-table-text\" [attr.title]=\"ellipsisTitleText(formatDate())\">{{ formatDate() }}</span>\n }\n\n @case ('strong') {\n <span class=\"sdc-table-strong-label\"\n [attr.title]=\"ellipsisTitleText(cellTextValue() | translate)\">\n {{ cellTextValue() | translate | sdcTruncate:col:defaultTextOverflow }}\n </span>\n }\n\n @case ('code') {\n <code class=\"sdc-table-code-label\"\n [attr.title]=\"ellipsisTitleText(cellTextValue())\">{{ displayText() }}</code>\n }\n\n @case ('link') {\n <a class=\"sdc-table-link\"\n [href]=\"cellTextValue()\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"$event.stopPropagation()\"\n [attr.title]=\"ellipsisTitleText(cellTextValue() | translate)\">\n {{ cellTextValue() | translate | sdcTruncate:col:defaultTextOverflow }}\n </a>\n }\n\n @case ('currency') {\n <span class=\"sdc-table-text\"\n [attr.title]=\"ellipsisTitleText(formatCurrency())\">{{ formatCurrency() }}</span>\n }\n\n @case ('tag') {\n <div class=\"sdc-table-tags\">\n @for (tagItem of tagItems(); track tagItem.label + '-' + $index) {\n <span\n class=\"sdc-table-tag\"\n [class.sdc-table-tag--enabled]=\"tagItem.tone === 'enabled'\"\n [class.sdc-table-tag--disabled]=\"tagItem.tone === 'disabled'\"\n [ngStyle]=\"tagItem.styles\"\n [attr.title]=\"tagItem.tooltip ? (tagItem.tooltip | translate) : (tagItem.label | translate)\"\n >\n @if (tagItem.icon) {\n <sdc-icon-renderer\n class=\"sdc-table-tag__icon\"\n [icon]=\"tagItem.icon\"\n [iconType]=\"tagItem.iconType\"\n [size]=\"tagIconSize\"\n ></sdc-icon-renderer>\n }\n {{ tagItem.label | translate }}\n </span>\n }\n\n @if (tagOverflow(); as overflow) {\n @if (overflow.hiddenCount > 0) {\n <span\n class=\"sdc-table-tag sdc-table-tag--more\"\n [attr.title]=\"\n 'platform.datacore.accessibility_table_tag_more_items'\n | translate: { items: tagOverflowTitle(overflow) }\n \"\n >\u2026</span>\n }\n }\n </div>\n }\n\n @case ('button') {\n <div class=\"sdc-table-button\">\n <sdc-button\n class=\"sdc-table-action-button\"\n [size]=\"cellConfigs.button.size ?? 'default'\"\n [priority]=\"cellConfigs.button.priority || 'primary'\"\n [icon]=\"cellConfigs.button.icon\"\n [label]=\"cellConfigs.button.label ?? ''\"\n [disabled]=\"cellConfigs.button.disabled ?? false\"\n [title]=\"cellConfigs.button.tooltip\"\n [attr.size]=\"cellConfigs.button.size\"\n [attr.priority]=\"cellConfigs.button.priority || 'primary'\"\n [attr.severity]=\"cellConfigs.button.priority || 'primary'\"\n [attr.icon]=\"cellConfigs.button.icon\"\n [attr.label]=\"cellConfigs.button.label\"\n [attr.disabled]=\"cellConfigs.button.disabled ? '' : null\"\n [attr.title]=\"cellConfigs.button.tooltip || null\"\n [attr.aria-label]=\"\n (buttonAriaLabel() | translate)\n + ' - '\n + (rowLabel | translate)\n \"\n [attr.data-key]=\"buttonKey()\"\n (click)=\"cellConfigs.button.disabled ? null : triggerButtonAction.emit()\"\n (keydown.enter)=\"cellConfigs.button.disabled ? null : triggerButtonAction.emit()\"\n (keydown.space)=\"$event.preventDefault(); cellConfigs.button.disabled ? null : triggerButtonAction.emit()\"\n ></sdc-button>\n </div>\n }\n\n @case ('actions') {\n <div\n class=\"sdc-table-actions\"\n [class.sdc-table-actions--open]=\"actionsMenuOpen\"\n >\n <button\n #actionsTrigger\n type=\"button\"\n class=\"sdc-table-actions-trigger\"\n [class.sdc-table-actions-trigger--open]=\"actionsMenuOpen\"\n [attr.aria-label]=\"\n (actionsButtonLabel() | translate)\n + ' - '\n + (rowLabel | translate)\n \"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-controls]=\"actionsMenuOpen ? actionsMenuId : null\"\n [attr.aria-expanded]=\"actionsMenuOpen\"\n (click)=\"onActionsClick($event, actionsTrigger)\"\n >\n <span class=\"sdc-table-actions-trigger__label\">\n {{ actionsButtonLabel() | translate }}\n </span>\n <i class=\"fas fa-chevron-down sdc-table-actions-trigger__icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n @case ('icon') {\n @if (iconPresentation(); as iconItem) {\n <span\n class=\"sdc-table-icon\"\n [ngStyle]=\"iconItem.colorStyle\"\n [attr.title]=\"iconItem.tooltip ? (iconItem.tooltip | translate) : null\"\n [attr.aria-label]=\"\n (iconItem.label || iconItem.tooltip)\n ? ((iconItem.label || iconItem.tooltip)! | translate)\n : null\n \"\n >\n @if (iconItem.icon) {\n <sdc-icon-renderer\n [icon]=\"iconItem.icon\"\n [iconType]=\"iconItem.iconType\"\n [size]=\"iconSize\"\n ></sdc-icon-renderer>\n }\n @if (iconItem.label) {\n <span class=\"sdc-table-icon__label\">{{ iconItem.label | translate }}</span>\n }\n </span>\n }\n }\n\n @case ('icon-title') {\n @if (titleIconPresentation(); as titleIconItem) {\n <span\n class=\"sdc-table-icon-title\"\n [ngStyle]=\"titleIconItem.colorStyle\"\n [attr.title]=\"titleIconItem.tooltip ? (titleIconItem.tooltip | translate) : null\"\n >\n @if (titleIconItem.icon) {\n <sdc-icon-renderer\n [icon]=\"titleIconItem.icon\"\n [iconType]=\"titleIconItem.iconType\"\n [size]=\"iconSize\"\n ></sdc-icon-renderer>\n }\n @if (titleIconItem.label) {\n <span [attr.title]=\"ellipsisTitleText(titleIconItem.label | translate)\">\n {{ titleIconItem.label | translate | sdcTruncate:col:defaultTextOverflow }}\n </span>\n }\n </span>\n }\n }\n\n @default {\n <span class=\"sdc-table-text\"\n [attr.title]=\"ellipsisTitleText(cellTextValue() | translate)\">\n {{ cellTextValue() | translate | sdcTruncate:col:defaultTextOverflow }}\n </span>\n }\n }\n }\n</div>\n", styles: [":host{display:block;width:100%;min-width:0}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table-content{display:flex;align-items:center;width:100%;min-width:0}:host(.sdc-table-cell-content--align-left) .sdc-table-content{justify-content:flex-start;text-align:left}:host(.sdc-table-cell-content--align-center) .sdc-table-content{justify-content:center;text-align:center}:host(.sdc-table-cell-content--align-right) .sdc-table-content{justify-content:flex-end;text-align:right}.sdc-table-multi-content{display:flex;flex-direction:column;gap:.25rem;min-width:0;max-width:100%}.sdc-table-multi-content strong,.sdc-table-multi-content code,.sdc-table-multi-content span,.sdc-table-text,.sdc-table-strong-label,.sdc-table-code-label,.sdc-table-link{min-width:0;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-table-strong-label{font-weight:500}.sdc-table-code-label{color:var(--sdc-tab-primary)}.sdc-table-link{display:inline-block;color:var(--sdc-tab-primary);text-decoration:underline}.sdc-table-link:hover,.sdc-table-link:focus-visible{text-decoration:none}.sdc-table-tags{display:flex;flex-wrap:wrap;gap:.5rem;min-width:0;max-width:100%;overflow:hidden}.sdc-table-tag{display:inline-flex;align-items:center;justify-content:center;gap:.35rem;width:fit-content;min-width:fit-content;max-width:100%;border-radius:9999px;font-weight:500;line-height:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid currentColor;box-sizing:border-box;font-size:.875rem;padding:.35rem .875rem}.sdc-table-tag__icon{flex:0 0 auto}.sdc-table-tag--enabled{background:#dcfce7;color:#16a34a;border-color:#16a34a}.sdc-table-tag--disabled{background:#fee2e2;color:#ef4444;border-color:#ef4444}.sdc-table-tag--more{background:#f3f4f6;color:#374151;border-color:#374151;cursor:default;font-weight:700}.sdc-table-button{display:flex;align-items:center;justify-content:center;min-height:44px;width:100%;min-width:0}.sdc-table-button ::ng-deep sdc-button,.sdc-table-button ::ng-deep button{min-height:unset;min-width:unset;max-width:100%}.sdc-table-action-button{width:100%;max-width:100%;min-width:0}.sdc-table-icon,.sdc-table-icon-title{display:inline-flex;align-items:center;gap:.5rem;min-width:0;max-width:100%}.sdc-table-icon__label,.sdc-table-icon-title span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.sdc-table-checkbox{display:flex;align-items:center;justify-content:center}.sdc-table-checkbox input[type=checkbox]{cursor:pointer}.sdc-table-checkbox input[type=checkbox]:disabled{cursor:not-allowed;opacity:.55}.sdc-table-actions{position:relative;display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:0}.sdc-table-actions-trigger{appearance:none;border:1px solid #c9ced6;background:#fff;border-radius:999px;min-width:4.875rem;height:2rem;padding:0 .75rem;display:inline-flex;align-items:center;justify-content:center;gap:.375rem;font:inherit;font-size:.8125rem;color:#374151;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease,background-color .15s ease}.sdc-table-actions-trigger:hover{background:#f9fafb}.sdc-table-actions-trigger:focus-visible,.sdc-table-actions-trigger--open{outline:none;border-color:#9ca3af;box-shadow:0 0 0 2px #1118270a}.sdc-table-actions-trigger__label{line-height:1;white-space:nowrap}.sdc-table-actions-trigger__icon{font-size:.625rem;line-height:1;color:#6b7280}@media (max-width: 768px){.sdc-table-multi-content strong,.sdc-table-multi-content code,.sdc-table-multi-content span{white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;word-break:break-word}.sdc-table-tag{font-size:.8125rem;padding:.35rem .75rem}.sdc-table-actions-trigger{min-width:4.375rem;height:1.75rem;padding:0 .625rem;font-size:.75rem}.sdc-table-text,.sdc-table-strong-label,.sdc-table-code-label,.sdc-table-link,.sdc-table-icon__label,.sdc-table-icon-title span{white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;word-break:break-word}:host-context(.sdc-table-expandable-summary-value) .sdc-table-text,:host-context(.sdc-table-expandable-summary-value) .sdc-table-multi-content>*{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;overflow-wrap:anywhere}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: ButtonComponent, selector: "sdc-button", inputs: ["id", "label", "ariaLabel", "disabled", "loading", "width", "priority", "size", "type", "icon", "rightIcon", "auxiliary", "rounded", "caret", "tooltip", "animation", "slide", "styleClass", "badge", "menuOptions", "menuContext", "model"], outputs: ["clicked"] }, { kind: "component", type: IconRendererComponent, selector: "sdc-icon-renderer", inputs: ["icon", "iconType", "size"] }, { kind: "pipe", type: SdcTruncatePipe, name: "sdcTruncate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
31127
31235
  }
31128
31236
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableCellContentComponent, decorators: [{
31129
31237
  type: Component,
@@ -31132,7 +31240,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
31132
31240
  '[class.sdc-table-cell-content--align-center]': "resolvedAlignment === 'center'",
31133
31241
  '[class.sdc-table-cell-content--align-right]': "resolvedAlignment === 'right'",
31134
31242
  '[class.sdc-table-cell-content--nowrap]': "col?.textOverflow === 'none'"
31135
- }, template: "<div class=\"sdc-table-content\">\n @if (col.content?.length) {\n <div class=\"sdc-table-multi-content\">\n @for (item of col.content!; track $index) {\n @switch (item.type ?? 'text') {\n @case ('strong') {\n <strong\n [ngStyle]=\"item.style\"\n [class]=\"item.class ?? ''\"\n >{{ cellTextValue(item.field) | translate }}</strong>\n }\n @case ('code') {\n <code [ngStyle]=\"item.style\" [class]=\"item.class ?? ''\">{{ cellTextValue(item.field) }}</code>\n }\n @default {\n <span [ngStyle]=\"item.style\" [class]=\"item.class ?? ''\">{{ cellTextValue(item.field) | translate }}</span>\n }\n }\n }\n </div>\n } @else {\n @switch (col.type ?? 'text') {\n @case ('checkbox-selection') {\n <div class=\"sdc-table-checkbox\">\n <input\n type=\"checkbox\"\n [id]=\"rowCheckboxId\"\n [disabled]=\"rowSelectionDisabled\"\n [checked]=\"rowSelected\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (change)=\"toggleRow.emit(getCheckedValue($event))\"\n [attr.aria-label]=\"\n 'platform.datacore.accessibility_select_row'\n | translate: { name: (rowLabel | translate) }\n \"\n [attr.aria-checked]=\"rowSelected\"\n />\n <label [attr.for]=\"rowCheckboxId\" class=\"sr-only\">\n {{\n 'platform.datacore.accessibility_select_row'\n | translate: { name: (rowLabel | translate) }\n }}\n </label>\n </div>\n }\n\n @case ('date') {\n <span class=\"sdc-table-text\" [attr.title]=\"ellipsisTitleText(formatDate())\">{{ formatDate() }}</span>\n }\n\n @case ('strong') {\n <span class=\"sdc-table-strong-label\"\n [attr.title]=\"ellipsisTitleText(cellTextValue() | translate)\">\n {{ cellTextValue() | translate | sdcTruncate:col:defaultTextOverflow }}\n </span>\n }\n\n @case ('code') {\n <code class=\"sdc-table-code-label\"\n [attr.title]=\"ellipsisTitleText(cellTextValue())\">{{ displayText() }}</code>\n }\n\n @case ('link') {\n <a class=\"sdc-table-link\"\n [href]=\"cellTextValue()\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"$event.stopPropagation()\"\n [attr.title]=\"ellipsisTitleText(cellTextValue() | translate)\">\n {{ cellTextValue() | translate | sdcTruncate:col:defaultTextOverflow }}\n </a>\n }\n\n @case ('currency') {\n <span class=\"sdc-table-text\"\n [attr.title]=\"ellipsisTitleText(formatCurrency())\">{{ formatCurrency() }}</span>\n }\n\n @case ('tag') {\n <div class=\"sdc-table-tags\">\n @for (tagItem of tagItems(); track tagItem.label + '-' + $index) {\n <span\n class=\"sdc-table-tag\"\n [class.sdc-table-tag--enabled]=\"tagItem.tone === 'enabled'\"\n [class.sdc-table-tag--disabled]=\"tagItem.tone === 'disabled'\"\n [ngStyle]=\"tagItem.styles\"\n [attr.title]=\"tagItem.tooltip ? (tagItem.tooltip | translate) : (tagItem.label | translate)\"\n >\n @if (tagItem.icon) {\n <sdc-icon-renderer\n class=\"sdc-table-tag__icon\"\n [icon]=\"tagItem.icon\"\n [iconType]=\"tagItem.iconType\"\n [size]=\"tagIconSize\"\n ></sdc-icon-renderer>\n }\n {{ tagItem.label | translate }}\n </span>\n }\n\n @if (tagOverflow(); as overflow) {\n @if (overflow.hiddenCount > 0) {\n <span\n class=\"sdc-table-tag sdc-table-tag--more\"\n [attr.title]=\"\n 'platform.datacore.accessibility_table_tag_more_items'\n | translate: { items: tagOverflowTitle(overflow) }\n \"\n >\u2026</span>\n }\n }\n </div>\n }\n\n @case ('button') {\n <div class=\"sdc-table-button\">\n <sdc-button\n class=\"sdc-table-action-button\"\n [size]=\"cellConfigs.button.size ?? 'default'\"\n [priority]=\"cellConfigs.button.priority || 'primary'\"\n [icon]=\"cellConfigs.button.icon\"\n [label]=\"cellConfigs.button.label ?? ''\"\n [disabled]=\"cellConfigs.button.disabled ?? false\"\n [title]=\"cellConfigs.button.tooltip\"\n [attr.size]=\"cellConfigs.button.size\"\n [attr.priority]=\"cellConfigs.button.priority || 'primary'\"\n [attr.severity]=\"cellConfigs.button.priority || 'primary'\"\n [attr.icon]=\"cellConfigs.button.icon\"\n [attr.label]=\"cellConfigs.button.label\"\n [attr.disabled]=\"cellConfigs.button.disabled ? '' : null\"\n [attr.title]=\"cellConfigs.button.tooltip || null\"\n [attr.aria-label]=\"\n (buttonAriaLabel() | translate)\n + ' - '\n + (rowLabel | translate)\n \"\n [attr.data-key]=\"buttonKey()\"\n (click)=\"cellConfigs.button.disabled ? null : triggerButtonAction.emit()\"\n (keydown.enter)=\"cellConfigs.button.disabled ? null : triggerButtonAction.emit()\"\n (keydown.space)=\"$event.preventDefault(); cellConfigs.button.disabled ? null : triggerButtonAction.emit()\"\n ></sdc-button>\n </div>\n }\n\n @case ('actions') {\n <div\n class=\"sdc-table-actions\"\n [class.sdc-table-actions--open]=\"actionsMenuOpen\"\n >\n <button\n #actionsTrigger\n type=\"button\"\n class=\"sdc-table-actions-trigger\"\n [class.sdc-table-actions-trigger--open]=\"actionsMenuOpen\"\n [attr.aria-label]=\"\n (actionsButtonLabel() | translate)\n + ' - '\n + (rowLabel | translate)\n \"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-controls]=\"actionsMenuOpen ? actionsMenuId : null\"\n [attr.aria-expanded]=\"actionsMenuOpen\"\n (click)=\"onActionsClick($event, actionsTrigger)\"\n >\n <span class=\"sdc-table-actions-trigger__label\">\n {{ actionsButtonLabel() | translate }}\n </span>\n <i class=\"fas fa-chevron-down sdc-table-actions-trigger__icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n @case ('icon') {\n @if (iconPresentation(); as iconItem) {\n <span\n class=\"sdc-table-icon\"\n [ngStyle]=\"iconItem.colorStyle\"\n [attr.title]=\"iconItem.tooltip ? (iconItem.tooltip | translate) : null\"\n [attr.aria-label]=\"\n (iconItem.label || iconItem.tooltip)\n ? ((iconItem.label || iconItem.tooltip)! | translate)\n : null\n \"\n >\n @if (iconItem.icon) {\n <sdc-icon-renderer\n [icon]=\"iconItem.icon\"\n [iconType]=\"iconItem.iconType\"\n [size]=\"iconSize\"\n ></sdc-icon-renderer>\n }\n @if (iconItem.label) {\n <span class=\"sdc-table-icon__label\">{{ iconItem.label | translate }}</span>\n }\n </span>\n }\n }\n\n @case ('icon-title') {\n @if (titleIconPresentation(); as titleIconItem) {\n <span\n class=\"sdc-table-icon-title\"\n [ngStyle]=\"titleIconItem.colorStyle\"\n [attr.title]=\"titleIconItem.tooltip ? (titleIconItem.tooltip | translate) : null\"\n >\n @if (titleIconItem.icon) {\n <sdc-icon-renderer\n [icon]=\"titleIconItem.icon\"\n [iconType]=\"titleIconItem.iconType\"\n [size]=\"iconSize\"\n ></sdc-icon-renderer>\n }\n @if (titleIconItem.label) {\n <span [attr.title]=\"ellipsisTitleText(titleIconItem.label | translate)\">\n {{ titleIconItem.label | translate | sdcTruncate:col:defaultTextOverflow }}\n </span>\n }\n </span>\n }\n }\n\n @default {\n <span class=\"sdc-table-text\"\n [attr.title]=\"ellipsisTitleText(cellTextValue() | translate)\">\n {{ cellTextValue() | translate | sdcTruncate:col:defaultTextOverflow }}\n </span>\n }\n }\n }\n</div>\n", styles: [":host{display:block;width:100%;min-width:0}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table-content{display:flex;align-items:center;width:100%;min-width:0}:host(.sdc-table-cell-content--align-left) .sdc-table-content{justify-content:flex-start;text-align:left}:host(.sdc-table-cell-content--align-center) .sdc-table-content{justify-content:center;text-align:center}:host(.sdc-table-cell-content--align-right) .sdc-table-content{justify-content:flex-end;text-align:right}.sdc-table-multi-content{display:flex;flex-direction:column;gap:.25rem;min-width:0;max-width:100%}.sdc-table-multi-content strong,.sdc-table-multi-content code,.sdc-table-multi-content span,.sdc-table-text,.sdc-table-strong-label,.sdc-table-code-label,.sdc-table-link{min-width:0;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-table-strong-label{font-weight:500}.sdc-table-code-label{color:var(--sdc-tab-primary)}.sdc-table-link{display:inline-block;color:var(--sdc-tab-primary);text-decoration:underline}.sdc-table-link:hover,.sdc-table-link:focus-visible{text-decoration:none}.sdc-table-tags{display:flex;flex-wrap:wrap;gap:.5rem;min-width:0;max-width:100%;overflow:hidden}.sdc-table-tag{display:inline-flex;align-items:center;justify-content:center;gap:.35rem;width:fit-content;min-width:fit-content;max-width:100%;border-radius:9999px;font-weight:500;line-height:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid currentColor;box-sizing:border-box;font-size:.875rem;padding:.35rem .875rem}.sdc-table-tag__icon{flex:0 0 auto}.sdc-table-tag--enabled{background:#dcfce7;color:#16a34a;border-color:#16a34a}.sdc-table-tag--disabled{background:#fee2e2;color:#ef4444;border-color:#ef4444}.sdc-table-tag--more{background:#f3f4f6;color:#374151;border-color:#374151;cursor:default;font-weight:700}.sdc-table-button{display:flex;align-items:center;justify-content:center;min-height:44px;width:100%;min-width:0}.sdc-table-button ::ng-deep sdc-button,.sdc-table-button ::ng-deep button{min-height:unset;min-width:unset;max-width:100%}.sdc-table-action-button{width:100%;max-width:100%;min-width:0}.sdc-table-icon,.sdc-table-icon-title{display:inline-flex;align-items:center;gap:.5rem;min-width:0;max-width:100%}.sdc-table-icon__label,.sdc-table-icon-title span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.sdc-table-checkbox{display:flex;align-items:center;justify-content:center}.sdc-table-checkbox input[type=checkbox]{cursor:pointer}.sdc-table-checkbox input[type=checkbox]:disabled{cursor:not-allowed;opacity:.55}.sdc-table-actions{position:relative;display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:0}.sdc-table-actions-trigger{appearance:none;border:1px solid #c9ced6;background:#fff;border-radius:999px;min-width:4.875rem;height:2rem;padding:0 .75rem;display:inline-flex;align-items:center;justify-content:center;gap:.375rem;font:inherit;font-size:.8125rem;color:#374151;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease,background-color .15s ease}.sdc-table-actions-trigger:hover{background:#f9fafb}.sdc-table-actions-trigger:focus-visible,.sdc-table-actions-trigger--open{outline:none;border-color:#9ca3af;box-shadow:0 0 0 2px #1118270a}.sdc-table-actions-trigger__label{line-height:1;white-space:nowrap}.sdc-table-actions-trigger__icon{font-size:.625rem;line-height:1;color:#6b7280}@media (max-width: 768px){.sdc-table-multi-content strong,.sdc-table-multi-content code,.sdc-table-multi-content span{white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;word-break:break-word}.sdc-table-tag{font-size:.8125rem;padding:.35rem .75rem}.sdc-table-actions-trigger{min-width:4.375rem;height:1.75rem;padding:0 .625rem;font-size:.75rem}.sdc-table-text,.sdc-table-strong-label,.sdc-table-code-label,.sdc-table-link,.sdc-table-icon__label,.sdc-table-icon-title span{white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;word-break:break-word}}\n"] }]
31243
+ }, template: "<div class=\"sdc-table-content\">\n @if (col.content?.length) {\n <div class=\"sdc-table-multi-content\">\n @for (item of col.content!; track $index) {\n @switch (item.type ?? 'text') {\n @case ('strong') {\n <strong\n [ngStyle]=\"item.style\"\n [class]=\"item.class ?? ''\"\n [attr.title]=\"ellipsisTitleText(cellTextValue(item.field) | translate)\"\n >{{ displayText(item.field) | translate }}</strong>\n }\n @case ('code') {\n <code\n [ngStyle]=\"item.style\"\n [class]=\"item.class ?? ''\"\n [attr.title]=\"ellipsisTitleText(cellTextValue(item.field))\"\n >{{ displayText(item.field) }}</code>\n }\n @default {\n <span\n [ngStyle]=\"item.style\"\n [class]=\"item.class ?? ''\"\n [attr.title]=\"ellipsisTitleText(cellTextValue(item.field) | translate)\"\n >{{ displayText(item.field) | translate }}</span>\n }\n }\n }\n </div>\n } @else {\n @switch (col.type ?? 'text') {\n @case ('checkbox-selection') {\n <div class=\"sdc-table-checkbox\">\n <input\n type=\"checkbox\"\n [id]=\"rowCheckboxId\"\n [disabled]=\"rowSelectionDisabled\"\n [checked]=\"rowSelected\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (change)=\"toggleRow.emit(getCheckedValue($event))\"\n [attr.aria-label]=\"\n 'platform.datacore.accessibility_select_row'\n | translate: { name: (rowLabel | translate) }\n \"\n [attr.aria-checked]=\"rowSelected\"\n />\n <label [attr.for]=\"rowCheckboxId\" class=\"sr-only\">\n {{\n 'platform.datacore.accessibility_select_row'\n | translate: { name: (rowLabel | translate) }\n }}\n </label>\n </div>\n }\n\n @case ('date') {\n <span class=\"sdc-table-text\" [attr.title]=\"ellipsisTitleText(formatDate())\">{{ formatDate() }}</span>\n }\n\n @case ('strong') {\n <span class=\"sdc-table-strong-label\"\n [attr.title]=\"ellipsisTitleText(cellTextValue() | translate)\">\n {{ cellTextValue() | translate | sdcTruncate:col:defaultTextOverflow }}\n </span>\n }\n\n @case ('code') {\n <code class=\"sdc-table-code-label\"\n [attr.title]=\"ellipsisTitleText(cellTextValue())\">{{ displayText() }}</code>\n }\n\n @case ('link') {\n <a class=\"sdc-table-link\"\n [href]=\"cellTextValue()\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"$event.stopPropagation()\"\n [attr.title]=\"ellipsisTitleText(cellTextValue() | translate)\">\n {{ cellTextValue() | translate | sdcTruncate:col:defaultTextOverflow }}\n </a>\n }\n\n @case ('currency') {\n <span class=\"sdc-table-text\"\n [attr.title]=\"ellipsisTitleText(formatCurrency())\">{{ formatCurrency() }}</span>\n }\n\n @case ('tag') {\n <div class=\"sdc-table-tags\">\n @for (tagItem of tagItems(); track tagItem.label + '-' + $index) {\n <span\n class=\"sdc-table-tag\"\n [class.sdc-table-tag--enabled]=\"tagItem.tone === 'enabled'\"\n [class.sdc-table-tag--disabled]=\"tagItem.tone === 'disabled'\"\n [ngStyle]=\"tagItem.styles\"\n [attr.title]=\"tagItem.tooltip ? (tagItem.tooltip | translate) : (tagItem.label | translate)\"\n >\n @if (tagItem.icon) {\n <sdc-icon-renderer\n class=\"sdc-table-tag__icon\"\n [icon]=\"tagItem.icon\"\n [iconType]=\"tagItem.iconType\"\n [size]=\"tagIconSize\"\n ></sdc-icon-renderer>\n }\n {{ tagItem.label | translate }}\n </span>\n }\n\n @if (tagOverflow(); as overflow) {\n @if (overflow.hiddenCount > 0) {\n <span\n class=\"sdc-table-tag sdc-table-tag--more\"\n [attr.title]=\"\n 'platform.datacore.accessibility_table_tag_more_items'\n | translate: { items: tagOverflowTitle(overflow) }\n \"\n >\u2026</span>\n }\n }\n </div>\n }\n\n @case ('button') {\n <div class=\"sdc-table-button\">\n <sdc-button\n class=\"sdc-table-action-button\"\n [size]=\"cellConfigs.button.size ?? 'default'\"\n [priority]=\"cellConfigs.button.priority || 'primary'\"\n [icon]=\"cellConfigs.button.icon\"\n [label]=\"cellConfigs.button.label ?? ''\"\n [disabled]=\"cellConfigs.button.disabled ?? false\"\n [title]=\"cellConfigs.button.tooltip\"\n [attr.size]=\"cellConfigs.button.size\"\n [attr.priority]=\"cellConfigs.button.priority || 'primary'\"\n [attr.severity]=\"cellConfigs.button.priority || 'primary'\"\n [attr.icon]=\"cellConfigs.button.icon\"\n [attr.label]=\"cellConfigs.button.label\"\n [attr.disabled]=\"cellConfigs.button.disabled ? '' : null\"\n [attr.title]=\"cellConfigs.button.tooltip || null\"\n [attr.aria-label]=\"\n (buttonAriaLabel() | translate)\n + ' - '\n + (rowLabel | translate)\n \"\n [attr.data-key]=\"buttonKey()\"\n (click)=\"cellConfigs.button.disabled ? null : triggerButtonAction.emit()\"\n (keydown.enter)=\"cellConfigs.button.disabled ? null : triggerButtonAction.emit()\"\n (keydown.space)=\"$event.preventDefault(); cellConfigs.button.disabled ? null : triggerButtonAction.emit()\"\n ></sdc-button>\n </div>\n }\n\n @case ('actions') {\n <div\n class=\"sdc-table-actions\"\n [class.sdc-table-actions--open]=\"actionsMenuOpen\"\n >\n <button\n #actionsTrigger\n type=\"button\"\n class=\"sdc-table-actions-trigger\"\n [class.sdc-table-actions-trigger--open]=\"actionsMenuOpen\"\n [attr.aria-label]=\"\n (actionsButtonLabel() | translate)\n + ' - '\n + (rowLabel | translate)\n \"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-controls]=\"actionsMenuOpen ? actionsMenuId : null\"\n [attr.aria-expanded]=\"actionsMenuOpen\"\n (click)=\"onActionsClick($event, actionsTrigger)\"\n >\n <span class=\"sdc-table-actions-trigger__label\">\n {{ actionsButtonLabel() | translate }}\n </span>\n <i class=\"fas fa-chevron-down sdc-table-actions-trigger__icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n @case ('icon') {\n @if (iconPresentation(); as iconItem) {\n <span\n class=\"sdc-table-icon\"\n [ngStyle]=\"iconItem.colorStyle\"\n [attr.title]=\"iconItem.tooltip ? (iconItem.tooltip | translate) : null\"\n [attr.aria-label]=\"\n (iconItem.label || iconItem.tooltip)\n ? ((iconItem.label || iconItem.tooltip)! | translate)\n : null\n \"\n >\n @if (iconItem.icon) {\n <sdc-icon-renderer\n [icon]=\"iconItem.icon\"\n [iconType]=\"iconItem.iconType\"\n [size]=\"iconSize\"\n ></sdc-icon-renderer>\n }\n @if (iconItem.label) {\n <span class=\"sdc-table-icon__label\">{{ iconItem.label | translate }}</span>\n }\n </span>\n }\n }\n\n @case ('icon-title') {\n @if (titleIconPresentation(); as titleIconItem) {\n <span\n class=\"sdc-table-icon-title\"\n [ngStyle]=\"titleIconItem.colorStyle\"\n [attr.title]=\"titleIconItem.tooltip ? (titleIconItem.tooltip | translate) : null\"\n >\n @if (titleIconItem.icon) {\n <sdc-icon-renderer\n [icon]=\"titleIconItem.icon\"\n [iconType]=\"titleIconItem.iconType\"\n [size]=\"iconSize\"\n ></sdc-icon-renderer>\n }\n @if (titleIconItem.label) {\n <span [attr.title]=\"ellipsisTitleText(titleIconItem.label | translate)\">\n {{ titleIconItem.label | translate | sdcTruncate:col:defaultTextOverflow }}\n </span>\n }\n </span>\n }\n }\n\n @default {\n <span class=\"sdc-table-text\"\n [attr.title]=\"ellipsisTitleText(cellTextValue() | translate)\">\n {{ cellTextValue() | translate | sdcTruncate:col:defaultTextOverflow }}\n </span>\n }\n }\n }\n</div>\n", styles: [":host{display:block;width:100%;min-width:0}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table-content{display:flex;align-items:center;width:100%;min-width:0}:host(.sdc-table-cell-content--align-left) .sdc-table-content{justify-content:flex-start;text-align:left}:host(.sdc-table-cell-content--align-center) .sdc-table-content{justify-content:center;text-align:center}:host(.sdc-table-cell-content--align-right) .sdc-table-content{justify-content:flex-end;text-align:right}.sdc-table-multi-content{display:flex;flex-direction:column;gap:.25rem;min-width:0;max-width:100%}.sdc-table-multi-content strong,.sdc-table-multi-content code,.sdc-table-multi-content span,.sdc-table-text,.sdc-table-strong-label,.sdc-table-code-label,.sdc-table-link{min-width:0;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-table-strong-label{font-weight:500}.sdc-table-code-label{color:var(--sdc-tab-primary)}.sdc-table-link{display:inline-block;color:var(--sdc-tab-primary);text-decoration:underline}.sdc-table-link:hover,.sdc-table-link:focus-visible{text-decoration:none}.sdc-table-tags{display:flex;flex-wrap:wrap;gap:.5rem;min-width:0;max-width:100%;overflow:hidden}.sdc-table-tag{display:inline-flex;align-items:center;justify-content:center;gap:.35rem;width:fit-content;min-width:fit-content;max-width:100%;border-radius:9999px;font-weight:500;line-height:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid currentColor;box-sizing:border-box;font-size:.875rem;padding:.35rem .875rem}.sdc-table-tag__icon{flex:0 0 auto}.sdc-table-tag--enabled{background:#dcfce7;color:#16a34a;border-color:#16a34a}.sdc-table-tag--disabled{background:#fee2e2;color:#ef4444;border-color:#ef4444}.sdc-table-tag--more{background:#f3f4f6;color:#374151;border-color:#374151;cursor:default;font-weight:700}.sdc-table-button{display:flex;align-items:center;justify-content:center;min-height:44px;width:100%;min-width:0}.sdc-table-button ::ng-deep sdc-button,.sdc-table-button ::ng-deep button{min-height:unset;min-width:unset;max-width:100%}.sdc-table-action-button{width:100%;max-width:100%;min-width:0}.sdc-table-icon,.sdc-table-icon-title{display:inline-flex;align-items:center;gap:.5rem;min-width:0;max-width:100%}.sdc-table-icon__label,.sdc-table-icon-title span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.sdc-table-checkbox{display:flex;align-items:center;justify-content:center}.sdc-table-checkbox input[type=checkbox]{cursor:pointer}.sdc-table-checkbox input[type=checkbox]:disabled{cursor:not-allowed;opacity:.55}.sdc-table-actions{position:relative;display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:0}.sdc-table-actions-trigger{appearance:none;border:1px solid #c9ced6;background:#fff;border-radius:999px;min-width:4.875rem;height:2rem;padding:0 .75rem;display:inline-flex;align-items:center;justify-content:center;gap:.375rem;font:inherit;font-size:.8125rem;color:#374151;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease,background-color .15s ease}.sdc-table-actions-trigger:hover{background:#f9fafb}.sdc-table-actions-trigger:focus-visible,.sdc-table-actions-trigger--open{outline:none;border-color:#9ca3af;box-shadow:0 0 0 2px #1118270a}.sdc-table-actions-trigger__label{line-height:1;white-space:nowrap}.sdc-table-actions-trigger__icon{font-size:.625rem;line-height:1;color:#6b7280}@media (max-width: 768px){.sdc-table-multi-content strong,.sdc-table-multi-content code,.sdc-table-multi-content span{white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;word-break:break-word}.sdc-table-tag{font-size:.8125rem;padding:.35rem .75rem}.sdc-table-actions-trigger{min-width:4.375rem;height:1.75rem;padding:0 .625rem;font-size:.75rem}.sdc-table-text,.sdc-table-strong-label,.sdc-table-code-label,.sdc-table-link,.sdc-table-icon__label,.sdc-table-icon-title span{white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;word-break:break-word}:host-context(.sdc-table-expandable-summary-value) .sdc-table-text,:host-context(.sdc-table-expandable-summary-value) .sdc-table-multi-content>*{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;overflow-wrap:anywhere}}\n"] }]
31136
31244
  }], propDecorators: { cellConfigs: [{
31137
31245
  type: Input,
31138
31246
  args: [{ required: true }]
@@ -31403,29 +31511,7 @@ class TableComponent {
31403
31511
  if (this.isApiMode()) {
31404
31512
  return this.filteredData();
31405
31513
  }
31406
- const field = this.sortField();
31407
- const order = this.sortOrder();
31408
- const rows = [...this.filteredData()];
31409
- if (!field || order === 0) {
31410
- return rows;
31411
- }
31412
- return rows.sort((leftRow, rightRow) => {
31413
- const leftValue = this.resolveValue(leftRow, field);
31414
- const rightValue = this.resolveValue(rightRow, field);
31415
- if (leftValue == null && rightValue == null) {
31416
- return 0;
31417
- }
31418
- if (leftValue == null) {
31419
- return -order;
31420
- }
31421
- if (rightValue == null) {
31422
- return order;
31423
- }
31424
- if (typeof leftValue === 'number' && typeof rightValue === 'number') {
31425
- return (leftValue - rightValue) * order;
31426
- }
31427
- return this.toComparableText(leftValue).localeCompare(this.toComparableText(rightValue)) * order;
31428
- });
31514
+ return sortTableRows(this.filteredData(), this.sortField(), this.sortOrder(), this.resolveValue);
31429
31515
  });
31430
31516
  totalRecords = computed(() => {
31431
31517
  if (!this.isApiMode()) {
@@ -31462,7 +31548,14 @@ class TableComponent {
31462
31548
  const estimatedHeight = safeRows * rowHeight + TABLE_DEFAULT_LOADING_VERTICAL_PADDING_PX;
31463
31549
  return Math.max(TABLE_DEFAULT_MIN_LOADING_HEIGHT_PX, estimatedHeight);
31464
31550
  });
31465
- emptyBodyHeightPx = computed(() => this.bodyViewportHeightPx());
31551
+ // O corpo reserva "linhas por pagina x altura da linha" pra nao dar salto de layout
31552
+ // quando os dados chegam. No estado VAZIO nao chega nada, e empilhado a conta
31553
+ // explode: cada linha e um cartao de 120px, entao 10 linhas pedem 1224px de nada -
31554
+ // medido num Galaxy S9+, a lista vazia virava 3,4 telas de rolagem.
31555
+ //
31556
+ // So no empilhado: em tela larga a reserva da uns 460px e segura o rodape no lugar,
31557
+ // que e o comportamento que ja existia.
31558
+ emptyBodyHeightPx = computed(() => this.isMobile() ? TABLE_EMPTY_STATE_MOBILE_HEIGHT_PX : this.bodyViewportHeightPx());
31466
31559
  tableMinWidthPx = computed(() => getTableMinWidthPx(this.colsSignal()));
31467
31560
  resolveValue = (obj, path) => getNestedValue(obj, path, this.pathPartsCache);
31468
31561
  onDocumentClick() {
@@ -31508,24 +31601,9 @@ class TableComponent {
31508
31601
  if (!enabled || !field) {
31509
31602
  return;
31510
31603
  }
31511
- if (this.sortField() !== field) {
31512
- this.sortField.set(field);
31513
- this.sortOrder.set(1);
31514
- }
31515
- else {
31516
- const currentOrder = this.sortOrder();
31517
- if (currentOrder === 1) {
31518
- this.sortOrder.set(-1);
31519
- }
31520
- else if (currentOrder === -1) {
31521
- this.sortOrder.set(0);
31522
- this.sortField.set(null);
31523
- }
31524
- else {
31525
- this.sortOrder.set(1);
31526
- this.sortField.set(field);
31527
- }
31528
- }
31604
+ const next = cycleSortState(this.sortField(), this.sortOrder(), field);
31605
+ this.sortField.set(next.field);
31606
+ this.sortOrder.set(next.order);
31529
31607
  this.first.set(TABLE_INDEX_ZERO);
31530
31608
  if (this.isApiMode()) {
31531
31609
  this.emitLazyLoad('sort');
@@ -31875,26 +31953,6 @@ class TableComponent {
31875
31953
  return currentSelection.length === nextSelection.length
31876
31954
  && currentSelection.every((row, index) => row === nextSelection[index]);
31877
31955
  }
31878
- toComparableText(value) {
31879
- if (value == null) {
31880
- return '';
31881
- }
31882
- if (typeof value === 'string') {
31883
- return value;
31884
- }
31885
- if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {
31886
- return String(value);
31887
- }
31888
- if (typeof value === 'object') {
31889
- try {
31890
- return JSON.stringify(value);
31891
- }
31892
- catch {
31893
- return '';
31894
- }
31895
- }
31896
- return '';
31897
- }
31898
31956
  nextActionsMenuId() {
31899
31957
  this.actionsMenuIdSequence += 1;
31900
31958
  return `sdc-table-actions-menu-${this.actionsMenuIdSequence}`;
@@ -31919,7 +31977,7 @@ class TableComponent {
31919
31977
  nextElement?.focus();
31920
31978
  }
31921
31979
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
31922
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TableComponent, isStandalone: true, selector: "sdc-table", inputs: { cols: "cols", data: "data", selection: "selection", loading: "loading", loadingIndicator: "loadingIndicator", config: "config", ariaLabel: "ariaLabel" }, outputs: { action: "action", rowClick: "rowClick", lazyLoad: "lazyLoad", selectionChange: "selectionChange" }, host: { listeners: { "document:click": "onDocumentClick()", "document:keydown.escape": "onEscapeKey()", "window:scroll": "onWindowScroll()" } }, ngImport: i0, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile()\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n>\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"loadingIndicator\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div class=\"sdc-table-caption__search\" [class.sdc-table-caption__search--full-width]=\"searchFullWidth()\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"'platform.datacore.accessibility_search_field' | translate\"\n />\n </div>\n </div>\n }\n\n @if (!isMobile()) {\n <div\n class=\"sdc-table-scroll\"\n [style.--sdc-table-min-width]=\"isFitLayout() ? '100%' : tableMinWidthPx() + 'px'\"\n >\n <table\n class=\"sdc-table-grid\"\n [class.sdc-table-grid--fit]=\"isFitLayout()\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <colgroup>\n @for (col of cols; track $index) {\n <col [style.width]=\"colWidthStyle(col)\" />\n }\n </colgroup>\n\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n [class.sdc-table-sortable]=\"canSortColumn(col)\"\n [class.sdc-table-sortable-disabled]=\"isSortableColumn(col) && !canSortColumn(col)\"\n [class.sdc-table-header-disabled]=\"!hasDataRows()\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col, 'header')\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"hasDataRows() && canSortColumn(col) ? 0 : null\"\n [attr.aria-disabled]=\"!hasDataRows() || (isSortableColumn(col) && !canSortColumn(col)) ? 'true' : null\"\n [attr.aria-label]=\"\n isSortableColumn(col)\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility_sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n (click)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.enter)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.space)=\"$event.preventDefault();\n hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n >\n @if (col.type === 'checkbox-selection' && (cellsCfg().checkbox.selectAll ?? true)) {\n <div class=\"sdc-table-th-inner sdc-table-th-inner--checkbox\">\n <span class=\"sdc-table-th-label sr-only\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n <span class=\"sdc-table-th-center\">\n <input\n type=\"checkbox\"\n [id]=\"getSelectAllCheckboxId($index)\"\n [checked]=\"isPageFullySelected()\"\n [indeterminate]=\"isPagePartiallySelected()\"\n [disabled]=\"!hasSelectablePageRows()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility_select_all_rows' | translate\"\n [attr.aria-checked]=\"getPageSelectionAriaChecked()\"\n />\n <label [for]=\"getSelectAllCheckboxId($index)\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility_select_all_rows' | translate }}\n </label>\n </span>\n </div>\n } @else {\n <div class=\"sdc-table-th-inner\" [class.sdc-table-th-inner--sortable]=\"isSortableColumn(col)\">\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n\n @if (col.headerTooltip) {\n <sdc-tooltip\n class=\"sdc-table-th-tooltip\"\n [pTooltip]=\"col.headerTooltip\"\n [tooltipPosition]=\"col.headerTooltipPosition ?? 'top'\"\n [tooltipEvent]=\"col.headerTooltipEvent ?? 'hover'\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-circle-info sdc-table-th-tooltip__icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n\n <span class=\"sdc-table-sort-overlay\" aria-hidden=\"true\">\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </span>\n </div>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr\n role=\"row\"\n [attr.aria-rowindex]=\"r + 1\"\n (click)=\"onRowClicked(row)\"\n (keydown.enter)=\"onRowClicked(row)\"\n >\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n [attr.id]=\"col.colId || null\"\n role=\"cell\"\n >\n @if (col.cellTag === 'span') {\n <span class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </span>\n } @else if (col.cellTag === 'i') {\n <i class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </i>\n } @else if (col.cellTag === 'p') {\n <p class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </p>\n } @else {\n <div class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n </div>\n } @else if (mobileMode() === 'stacked') {\n <div\n class=\"sdc-table-mobile-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <div class=\"sdc-table-mobile-card sdc-table-mobile-card--loading\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <div class=\"sdc-table-mobile-field sdc-table-mobile-field--loading\">\n <div class=\"sdc-table-mobile-label sdc-table-mobile-label--loading\"></div>\n <div class=\"sdc-table-mobile-skeleton\"></div>\n </div>\n }\n </div>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <div class=\"sdc-table-mobile-card\">\n @for (col of cols; track $index) {\n <div\n class=\"sdc-table-mobile-field\"\n [class.sdc-table-mobile-field--full-width]=\"\n col.type === 'button' || col.type === 'actions' || col.type === 'checkbox-selection'\n \"\n [class.sdc-table-mobile-field--selected]=\"sortField() === col.field\"\n [class.sdc-table-mobile-field--sortable]=\"col.field && isSortableColumn(col)\"\n (click)=\"col.field && toggleSort(col.field, isSortableColumn(col))\"\n >\n @if (mobileFieldLabel(col)) {\n <div class=\"sdc-table-mobile-label-wrap\">\n @if (col.field && isSortableColumn(col)) {\n <button\n type=\"button\"\n class=\"sdc-table-mobile-label sdc-table-mobile-label--sortable\"\n [attr.aria-label]=\"\n (mobileFieldLabel(col) | translate)\n + ' - '\n + ('platform.datacore.accessibility_sortable_column' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleSort(col.field, isSortableColumn(col))\"\n (keydown.enter)=\"toggleSort(col.field, isSortableColumn(col))\"\n (keydown.space)=\"$event.preventDefault(); toggleSort(col.field, isSortableColumn(col))\"\n >\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </button>\n } @else {\n <div class=\"sdc-table-mobile-label\">\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-table-mobile-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n } @else {\n <ul\n class=\"sdc-table-expandable-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex) {\n <li class=\"sdc-table-expandable-item sdc-table-expandable-item--loading\" aria-hidden=\"true\">\n <div class=\"sdc-table-expandable-summary sdc-table-expandable-summary--loading\">\n <div class=\"sdc-table-expandable-summary-fields\">\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-primary\"></div>\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-secondary\"></div>\n </div>\n <span class=\"sdc-table-expandable-chevron\" aria-hidden=\"true\">\n <i class=\"fas fa-chevron-down\"></i>\n </span>\n </div>\n </li>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <li\n class=\"sdc-table-expandable-item\"\n [class.sdc-table-expandable-item--expanded]=\"isRowExpanded(r)\"\n >\n <div\n class=\"sdc-table-expandable-summary\"\n (click)=\"toggleExpandRow(r)\"\n (keydown.enter)=\"toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); toggleExpandRow(r)\"\n >\n @if (checkboxCol(); as cbCol) {\n <div\n class=\"sdc-table-expandable-checkbox\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"cbCol\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, cbCol)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, cbCol, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n <div class=\"sdc-table-expandable-summary-fields\">\n @for (col of summaryCols(); track $index) {\n <div class=\"sdc-table-expandable-summary-field\">\n <span class=\"sdc-table-expandable-summary-label\">{{ mobileFieldLabel(col) | translate }}</span>\n <div class=\"sdc-table-expandable-summary-value\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n <button\n type=\"button\"\n class=\"sdc-table-expandable-toggle\"\n [attr.aria-expanded]=\"isRowExpanded(r)\"\n [attr.aria-label]=\"\n isRowExpanded(r)\n ? ('platform.datacore.accessibility_collapse_row' | translate)\n : ('platform.datacore.accessibility_expand_row' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.enter)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); $event.stopPropagation(); toggleExpandRow(r)\"\n >\n <span\n class=\"sdc-table-expandable-chevron\"\n [class.sdc-table-expandable-chevron--open]=\"isRowExpanded(r)\"\n aria-hidden=\"true\"\n ><i class=\"fas fa-chevron-down\"></i></span>\n </button>\n </div>\n @if (isRowExpanded(r)) {\n <div class=\"sdc-table-expandable-details\">\n @for (col of cols; track $index) {\n @if (col.type !== 'checkbox-selection') {\n <div\n class=\"sdc-table-expandable-field\"\n [class.sdc-table-expandable-field--full-width]=\"\n col.type === 'button' || col.type === 'actions'\n \"\n >\n @if (col.type !== 'button' && col.type !== 'actions') {\n <div class=\"sdc-table-expandable-label-wrap\">\n <span class=\"sdc-table-expandable-label\">{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n <div class=\"sdc-table-expandable-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n }\n </div>\n }\n </li>\n }\n }\n </ul>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile() ? [] : rowsPerPageOptions()\"\n [showRowsPerPageSelector]=\"showRowsPerPageSelector()\"\n [isMobile]=\"isMobile()\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n</section>\n\n@if (openMenuState(); as menu) {\n <sdc-table-actions-menu\n [items]=\"menu.items\"\n [menuId]=\"menu.menuId\"\n [top]=\"menu.top\"\n [left]=\"menu.left\"\n [width]=\"menu.width\"\n (close)=\"onMenuClose($event)\"\n (select)=\"onPortalActionClick($event)\"\n ></sdc-table-actions-menu>\n}\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:flex-end;display:flex;padding:.75rem 0}.sdc-table-caption__search{width:min(100%,22rem)}.sdc-table-caption__search--full-width{width:100%}.sdc-table-scroll{width:100%;overflow-x:auto;overflow-y:visible}.sdc-table-grid{min-width:var(--sdc-table-min-width, 100%);width:100%;border-collapse:collapse;table-layout:auto}.sdc-table-grid--fit{table-layout:fixed}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable-disabled,thead th.sdc-table-header-disabled{cursor:default}thead th.sdc-table-sortable-disabled:focus,thead th.sdc-table-sortable-disabled:focus-visible{outline:none;box-shadow:none}thead th.sdc-table-sortable:focus,thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff33;position:relative;z-index:1}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}thead th.sdc-table-is-selected .sdc-table-sort-overlay{right:.5rem}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden;text-align:inherit}.sdc-table-sort-overlay{position:absolute;right:0;top:50%;transform:translateY(-50%)}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-td-val{display:flex;align-items:center;width:100%;min-width:0;overflow:hidden}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto;width:100%;text-align:inherit}.sdc-table-th-inner--sortable{padding-right:1.5rem}.sdc-table-th-tooltip{flex-shrink:0;display:inline-flex;align-items:center}.sdc-table-th-tooltip__icon{font-size:.75rem;color:var(--sdc-table-th-tooltip-icon, #767676);cursor:help}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}.sdc-table--initial-loading .sdc-table-scroll{overflow-x:hidden}thead th.sdc-table-th-checkbox .sdc-table-th-inner--checkbox{justify-content:center}thead th.sdc-table-th-checkbox .sdc-table-th-center{display:flex;align-items:center;justify-content:center;width:100%}thead th.sdc-table-th-checkbox .sdc-table-th-center input{cursor:pointer;margin:0}thead th.sdc-table-th-checkbox .sdc-table-th-center input:disabled{cursor:not-allowed}.sdc-table-paginator{padding:.5rem 0;position:sticky;bottom:0;z-index:1;background:var(--sdc-table-bg-card)}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-th-align-left{text-align:left}.sdc-table-th-align-center{text-align:center}.sdc-table-th-align-right{text-align:right}.sdc-table-cell-content--nowrap .sdc-table-text,.sdc-table-cell-content--nowrap .sdc-table-strong-label,.sdc-table-cell-content--nowrap .sdc-table-code-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}@keyframes sdc-mobile-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.sdc-table-mobile-list{display:flex;flex-direction:column;width:100%;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.5rem;overflow:hidden}.sdc-table-mobile-card{display:flex;flex-direction:column;background:var(--sdc-formfield-default-bg, #ffffff);border-top:2px solid var(--sdc-border-strong, #d1d5db)}.sdc-table-mobile-card:first-child{border-top:0}.sdc-table-mobile-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.5rem 1rem;border-top:1px solid rgba(0,0,0,.05)}.sdc-table-mobile-field:first-child{border-top:0;padding-top:.75rem}.sdc-table-mobile-field:last-child{padding-bottom:.75rem}.sdc-table-mobile-field--selected{background:#11182706}.sdc-table-mobile-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-mobile-label-wrap,.sdc-table-mobile-value{min-width:0}.sdc-table-mobile-field--full-width>.sdc-table-mobile-label-wrap{display:none}.sdc-table-mobile-label,.sdc-table-mobile-label--sortable{display:flex;align-items:center;justify-content:flex-start;gap:.25rem;width:100%;margin:0;padding:0;border:0;background:transparent;color:var(--sdc-text-muted, #6b7280);font:inherit;font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;text-align:left}.sdc-table-mobile-label--sortable{cursor:pointer}.sdc-table-mobile-label--sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:3px;border-radius:.375rem}.sdc-table-mobile-label--loading{width:5.5rem;height:.625rem;border-radius:999px;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b824,#94a3b842,#94a3b824);background-size:200% 100%}.sdc-table-mobile-skeleton{min-height:1.25rem;border-radius:.25rem;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b81a,#94a3b82e,#94a3b81a);background-size:200% 100%}.sdc-table-mobile-value{display:flex;align-items:flex-start;width:100%}@media (max-width: 768px){.sdc-table-caption__search{width:100%}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-mobile-field--sortable:hover{background:#11182705}}@media (max-width: 540px){.sdc-table-mobile-list{border-radius:.375rem}.sdc-table-mobile-field{grid-template-columns:1fr;gap:.125rem;padding:.4375rem .875rem}.sdc-table-mobile-field:first-child{padding-top:.625rem}.sdc-table-mobile-field:last-child{padding-bottom:.625rem}}.sdc-table-expandable-list{display:flex;flex-direction:column;width:100%;list-style:none;margin:0;padding:0;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.5rem;overflow:hidden}.sdc-table-expandable-item{display:flex;flex-direction:column;background:var(--sdc-formfield-default-bg, #ffffff);border-top:1px solid var(--sdc-border-strong, #d1d5db)}.sdc-table-expandable-item:first-child{border-top:0}.sdc-table-expandable-summary{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-expandable-summary--loading{pointer-events:none}.sdc-table-expandable-summary:hover{background:#11182705}.sdc-table-expandable-checkbox{flex:0 0 auto}.sdc-table-expandable-summary-fields{display:flex;flex:1 1 0;flex-wrap:wrap;gap:.125rem 1.5rem;min-width:0}.sdc-table-expandable-summary-field{display:flex;flex-direction:column;min-width:0}.sdc-table-expandable-summary-label{color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-table-expandable-summary-value{display:flex;align-items:center;min-width:0}.sdc-table-expandable-toggle{display:flex;align-items:center;justify-content:center;flex:0 0 auto;width:1.75rem;height:1.75rem;padding:0;border:0;border-radius:50%;background:transparent;color:var(--sdc-text-muted, #6b7280);cursor:pointer;transition:color var(--sdc-table-transition-fast, .15s ease),background var(--sdc-table-transition-fast, .15s ease)}.sdc-table-expandable-toggle:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:2px}.sdc-table-expandable-toggle:hover{color:var(--sdc-text-default, #111827);background:#1118270f}.sdc-table-expandable-chevron{display:flex;align-items:center;justify-content:center;font-size:.75rem;transition:transform .2s ease}.sdc-table-expandable-label-wrap,.sdc-table-expandable-value{min-width:0}.sdc-table-expandable-details{padding:.375rem 0;border-top:1px solid rgba(0,0,0,.06);background:#11182704}.sdc-table-expandable-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.375rem 1rem;border-top:1px solid rgba(0,0,0,.04)}.sdc-table-expandable-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-expandable-field:first-child{border-top:0}.sdc-table-expandable-field--full-width>.sdc-table-expandable-label-wrap{display:none}.sdc-table-expandable-label{display:flex;align-items:center;color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em}.sdc-table-expandable-value{display:flex;align-items:flex-start;width:100%}.sdc-table-expandable-skeleton-primary{width:55%;max-width:10rem}.sdc-table-expandable-skeleton-secondary{width:35%;max-width:7rem}.sdc-table-expandable-chevron--open{transform:rotate(180deg)}.sdc-table-expandable-item--expanded .sdc-table-expandable-summary{background:#11182706}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SearchboxComponent, selector: "sdc-searchbox", inputs: ["triggerMode", "debounceTimeMs", "ariaLabel", "inputRole", "inputAriaControls", "inputAriaDescribedBy", "inputAriaActiveDescendant", "inputAriaHaspopup", "inputAriaExpanded", "inputAutocomplete", "submitOnEnter", "clearOnEscape"], outputs: ["debouncedValueChange", "onSearch", "onClear"] }, { kind: "component", type: PaginatorComponent, selector: "sdc-paginator", inputs: ["first", "rows", "totalRecords", "rowsPerPageOptions", "showRowsPerPageSelector", "isMobile", "totalRecordsLabel"], outputs: ["pageChange"] }, { kind: "component", type: LoadingStateComponent, selector: "sdc-loading-state", inputs: ["indicator", "id", "blockWindow", "blockDelayMs", "unblockDelayMs", "loading"] }, { kind: "component", type: EmptyStateComponent, selector: "sdc-empty-state", inputs: ["id", "title", "variant", "titleParams", "iconClass", "description", "descriptionParams", "showPrimaryAction", "showSecondaryAction", "primaryActionLabel", "primaryActionLabelParams", "secondaryActionLabel", "secondaryActionLabelParams", "primaryModel"], outputs: ["primaryAction", "secondaryAction"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: TableSortIndicatorComponent, selector: "sdc-table-sort-indicator", inputs: ["columnField", "columnType", "sortField", "sortOrder", "sortable"] }, { kind: "component", type: TableCellContentComponent, selector: "sdc-table-cell-content", inputs: ["cellConfigs", "col", "resolveValue", "row", "actionsMenuOpen", "actionsMenuId", "defaultTextOverflow", "rowCheckboxId", "rowLabel", "rowSelectionDisabled", "forceLeftAlign", "rowSelected"], outputs: ["toggleActionsMenu", "toggleRow", "triggerButtonAction"] }, { kind: "component", type: TableActionsMenuComponent, selector: "sdc-table-actions-menu", inputs: ["ariaLabel", "items", "left", "menuId", "top", "width"], outputs: ["close", "select"] }, { kind: "component", type: TooltipComponent, selector: "sdc-tooltip", inputs: ["pTooltip", "tooltipPosition", "tooltipEvent", "fitContent", "tooltipDisabled", "allowHtml"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
31980
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TableComponent, isStandalone: true, selector: "sdc-table", inputs: { cols: "cols", data: "data", selection: "selection", loading: "loading", loadingIndicator: "loadingIndicator", config: "config", ariaLabel: "ariaLabel" }, outputs: { action: "action", rowClick: "rowClick", lazyLoad: "lazyLoad", selectionChange: "selectionChange" }, host: { listeners: { "document:click": "onDocumentClick()", "document:keydown.escape": "onEscapeKey()", "window:scroll": "onWindowScroll()" } }, ngImport: i0, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile()\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n>\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"loadingIndicator\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div class=\"sdc-table-caption__search\" [class.sdc-table-caption__search--full-width]=\"searchFullWidth()\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"'platform.datacore.accessibility_search_field' | translate\"\n />\n </div>\n </div>\n }\n\n @if (!isMobile()) {\n <div\n class=\"sdc-table-scroll\"\n [style.--sdc-table-min-width]=\"isFitLayout() ? '100%' : tableMinWidthPx() + 'px'\"\n >\n <table\n class=\"sdc-table-grid\"\n [class.sdc-table-grid--fit]=\"isFitLayout()\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <colgroup>\n @for (col of cols; track $index) {\n <col [style.width]=\"colWidthStyle(col)\" />\n }\n </colgroup>\n\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n [class.sdc-table-sortable]=\"canSortColumn(col)\"\n [class.sdc-table-sortable-disabled]=\"isSortableColumn(col) && !canSortColumn(col)\"\n [class.sdc-table-header-disabled]=\"!hasDataRows()\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col, 'header')\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"hasDataRows() && canSortColumn(col) ? 0 : null\"\n [attr.aria-disabled]=\"!hasDataRows() || (isSortableColumn(col) && !canSortColumn(col)) ? 'true' : null\"\n [attr.aria-label]=\"\n isSortableColumn(col)\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility_sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n (click)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.enter)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.space)=\"$event.preventDefault();\n hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n >\n @if (col.type === 'checkbox-selection' && (cellsCfg().checkbox.selectAll ?? true)) {\n <div class=\"sdc-table-th-inner sdc-table-th-inner--checkbox\">\n <span class=\"sdc-table-th-label sr-only\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n <span class=\"sdc-table-th-center\">\n <input\n type=\"checkbox\"\n [id]=\"getSelectAllCheckboxId($index)\"\n [checked]=\"isPageFullySelected()\"\n [indeterminate]=\"isPagePartiallySelected()\"\n [disabled]=\"!hasSelectablePageRows()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility_select_all_rows' | translate\"\n [attr.aria-checked]=\"getPageSelectionAriaChecked()\"\n />\n <label [for]=\"getSelectAllCheckboxId($index)\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility_select_all_rows' | translate }}\n </label>\n </span>\n </div>\n } @else {\n <div class=\"sdc-table-th-inner\" [class.sdc-table-th-inner--sortable]=\"isSortableColumn(col)\">\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n\n @if (col.headerTooltip) {\n <sdc-tooltip\n class=\"sdc-table-th-tooltip\"\n [pTooltip]=\"col.headerTooltip\"\n [tooltipPosition]=\"col.headerTooltipPosition ?? 'top'\"\n [tooltipEvent]=\"col.headerTooltipEvent ?? 'hover'\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-circle-info sdc-table-th-tooltip__icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n\n <span class=\"sdc-table-sort-overlay\" aria-hidden=\"true\">\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </span>\n </div>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr\n role=\"row\"\n [attr.aria-rowindex]=\"r + 1\"\n (click)=\"onRowClicked(row)\"\n (keydown.enter)=\"onRowClicked(row)\"\n >\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n [attr.id]=\"col.colId || null\"\n role=\"cell\"\n >\n @if (col.cellTag === 'span') {\n <span class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </span>\n } @else if (col.cellTag === 'i') {\n <i class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </i>\n } @else if (col.cellTag === 'p') {\n <p class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </p>\n } @else {\n <div class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n </div>\n } @else if (mobileMode() === 'stacked') {\n <div\n class=\"sdc-table-mobile-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <div class=\"sdc-table-mobile-card sdc-table-mobile-card--loading\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <div class=\"sdc-table-mobile-field sdc-table-mobile-field--loading\">\n <div class=\"sdc-table-mobile-label sdc-table-mobile-label--loading\"></div>\n <div class=\"sdc-table-mobile-skeleton\"></div>\n </div>\n }\n </div>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <div class=\"sdc-table-mobile-card\">\n @for (col of cols; track $index) {\n <div\n class=\"sdc-table-mobile-field\"\n [class.sdc-table-mobile-field--full-width]=\"\n col.type === 'button' || col.type === 'actions' || col.type === 'checkbox-selection'\n \"\n [class.sdc-table-mobile-field--selected]=\"sortField() === col.field\"\n [class.sdc-table-mobile-field--sortable]=\"col.field && isSortableColumn(col)\"\n (click)=\"col.field && toggleSort(col.field, isSortableColumn(col))\"\n >\n @if (mobileFieldLabel(col)) {\n <div class=\"sdc-table-mobile-label-wrap\">\n @if (col.field && isSortableColumn(col)) {\n <button\n type=\"button\"\n class=\"sdc-table-mobile-label sdc-table-mobile-label--sortable\"\n [attr.aria-label]=\"\n (mobileFieldLabel(col) | translate)\n + ' - '\n + ('platform.datacore.accessibility_sortable_column' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleSort(col.field, isSortableColumn(col))\"\n (keydown.enter)=\"toggleSort(col.field, isSortableColumn(col))\"\n (keydown.space)=\"$event.preventDefault(); toggleSort(col.field, isSortableColumn(col))\"\n >\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </button>\n } @else {\n <div class=\"sdc-table-mobile-label\">\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-table-mobile-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n } @else {\n <ul\n class=\"sdc-table-expandable-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex) {\n <li class=\"sdc-table-expandable-item sdc-table-expandable-item--loading\" aria-hidden=\"true\">\n <div class=\"sdc-table-expandable-summary sdc-table-expandable-summary--loading\">\n <div class=\"sdc-table-expandable-summary-fields\">\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-primary\"></div>\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-secondary\"></div>\n </div>\n <span class=\"sdc-table-expandable-chevron\" aria-hidden=\"true\">\n <i class=\"fas fa-chevron-down\"></i>\n </span>\n </div>\n </li>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <li\n class=\"sdc-table-expandable-item\"\n [class.sdc-table-expandable-item--expanded]=\"isRowExpanded(r)\"\n >\n <div\n class=\"sdc-table-expandable-summary\"\n (click)=\"toggleExpandRow(r)\"\n (keydown.enter)=\"toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); toggleExpandRow(r)\"\n >\n @if (checkboxCol(); as cbCol) {\n <div\n class=\"sdc-table-expandable-checkbox\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"cbCol\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, cbCol)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, cbCol, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n <div class=\"sdc-table-expandable-summary-fields\">\n @for (col of summaryCols(); track $index) {\n <div class=\"sdc-table-expandable-summary-field\">\n <span class=\"sdc-table-expandable-summary-label\">{{ mobileFieldLabel(col) | translate }}</span>\n <div class=\"sdc-table-expandable-summary-value\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n <button\n type=\"button\"\n class=\"sdc-table-expandable-toggle\"\n [attr.aria-expanded]=\"isRowExpanded(r)\"\n [attr.aria-label]=\"\n isRowExpanded(r)\n ? ('platform.datacore.accessibility_collapse_row' | translate)\n : ('platform.datacore.accessibility_expand_row' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.enter)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); $event.stopPropagation(); toggleExpandRow(r)\"\n >\n <span\n class=\"sdc-table-expandable-chevron\"\n [class.sdc-table-expandable-chevron--open]=\"isRowExpanded(r)\"\n aria-hidden=\"true\"\n ><i class=\"fas fa-chevron-down\"></i></span>\n </button>\n </div>\n @if (isRowExpanded(r)) {\n <div class=\"sdc-table-expandable-details\">\n @for (col of cols; track $index) {\n @if (col.type !== 'checkbox-selection') {\n <div\n class=\"sdc-table-expandable-field\"\n [class.sdc-table-expandable-field--full-width]=\"\n col.type === 'button' || col.type === 'actions'\n \"\n >\n @if (col.type !== 'button' && col.type !== 'actions') {\n <div class=\"sdc-table-expandable-label-wrap\">\n <span class=\"sdc-table-expandable-label\">{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n <div class=\"sdc-table-expandable-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n }\n </div>\n }\n </li>\n }\n }\n </ul>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile() ? [] : rowsPerPageOptions()\"\n [showRowsPerPageSelector]=\"showRowsPerPageSelector()\"\n [isMobile]=\"isMobile()\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n</section>\n\n@if (openMenuState(); as menu) {\n <sdc-table-actions-menu\n [items]=\"menu.items\"\n [menuId]=\"menu.menuId\"\n [top]=\"menu.top\"\n [left]=\"menu.left\"\n [width]=\"menu.width\"\n (close)=\"onMenuClose($event)\"\n (select)=\"onPortalActionClick($event)\"\n ></sdc-table-actions-menu>\n}\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:flex-end;display:flex;padding:.75rem 0}.sdc-table-caption__search{width:min(100%,22rem)}.sdc-table-caption__search--full-width{width:100%}.sdc-table-scroll{width:100%;overflow-x:auto;overflow-y:visible}.sdc-table-grid{min-width:var(--sdc-table-min-width, 100%);width:100%;border-collapse:collapse;table-layout:auto}.sdc-table-grid--fit{table-layout:fixed}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable-disabled,thead th.sdc-table-header-disabled{cursor:default}thead th.sdc-table-sortable-disabled:focus,thead th.sdc-table-sortable-disabled:focus-visible{outline:none;box-shadow:none}thead th.sdc-table-sortable:focus,thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff33;position:relative;z-index:1}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}thead th.sdc-table-is-selected .sdc-table-sort-overlay{right:.5rem}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden;text-align:inherit}.sdc-table-sort-overlay{position:absolute;right:0;top:50%;transform:translateY(-50%)}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-td-val{display:flex;align-items:center;width:100%;min-width:0;overflow:hidden}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto;width:100%;text-align:inherit}.sdc-table-th-inner--sortable{padding-right:1.5rem}.sdc-table-th-tooltip{flex-shrink:0;display:inline-flex;align-items:center}.sdc-table-th-tooltip__icon{font-size:.75rem;color:var(--sdc-table-th-tooltip-icon, #767676);cursor:help}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}.sdc-table--initial-loading .sdc-table-scroll{overflow-x:hidden}thead th.sdc-table-th-checkbox .sdc-table-th-inner--checkbox{justify-content:center}thead th.sdc-table-th-checkbox .sdc-table-th-center{display:flex;align-items:center;justify-content:center;width:100%}thead th.sdc-table-th-checkbox .sdc-table-th-center input{cursor:pointer;margin:0}thead th.sdc-table-th-checkbox .sdc-table-th-center input:disabled{cursor:not-allowed}.sdc-table-paginator{padding:.5rem 0;position:sticky;bottom:0;z-index:1;background:var(--sdc-table-bg-card)}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-th-align-left{text-align:left}.sdc-table-th-align-center{text-align:center}.sdc-table-th-align-right{text-align:right}.sdc-table-cell-content--nowrap .sdc-table-text,.sdc-table-cell-content--nowrap .sdc-table-strong-label,.sdc-table-cell-content--nowrap .sdc-table-code-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}@keyframes sdc-mobile-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.sdc-table-mobile-list{display:flex;flex-direction:column;width:100%;border:1px solid var(--sdc-table-border-gray);border-radius:.5rem;overflow:hidden}.sdc-table-mobile-card{display:flex;flex-direction:column;background:var(--sdc-table-bg-card);border-top:2px solid var(--sdc-table-border-gray)}.sdc-table-mobile-card:first-child{border-top:0}.sdc-table-mobile-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.5rem 1rem;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field:first-child{border-top:0;padding-top:.75rem}.sdc-table-mobile-field:last-child{padding-bottom:.75rem}.sdc-table-mobile-field--selected{background:#11182706}.sdc-table-mobile-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-mobile-label-wrap,.sdc-table-mobile-value{min-width:0}.sdc-table-mobile-field--full-width>.sdc-table-mobile-label-wrap{display:none}.sdc-table-mobile-label,.sdc-table-mobile-label--sortable{display:flex;align-items:center;justify-content:flex-start;gap:.25rem;width:100%;margin:0;padding:0;border:0;background:transparent;color:var(--sdc-text-muted, #6b7280);font:inherit;font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;text-align:left}.sdc-table-mobile-label--sortable{cursor:pointer}.sdc-table-mobile-label--sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:3px;border-radius:.375rem}.sdc-table-mobile-label--loading{width:5.5rem;height:.625rem;border-radius:999px;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b824,#94a3b842,#94a3b824);background-size:200% 100%}.sdc-table-mobile-skeleton{min-height:1.25rem;border-radius:.25rem;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b81a,#94a3b82e,#94a3b81a);background-size:200% 100%}.sdc-table-mobile-value{display:flex;align-items:flex-start;width:100%}@media (max-width: 768px){.sdc-table-caption__search{width:100%}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-mobile-field--sortable:hover{background:#11182705}}@media (max-width: 540px){.sdc-table-mobile-list{border-radius:.375rem}.sdc-table-mobile-field{grid-template-columns:1fr;gap:.125rem;padding:.4375rem .875rem}.sdc-table-mobile-field:first-child{padding-top:.625rem}.sdc-table-mobile-field:last-child{padding-bottom:.625rem}}.sdc-table-expandable-list{display:flex;flex-direction:column;width:100%;list-style:none;margin:0;padding:0;border:1px solid var(--sdc-table-border-gray);border-radius:.5rem;overflow:hidden}.sdc-table-expandable-item{display:flex;flex-direction:column;background:var(--sdc-table-bg-card);border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-expandable-item:first-child{border-top:0}.sdc-table-expandable-summary{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-expandable-summary--loading{pointer-events:none}.sdc-table-expandable-summary:hover{background:#11182705}.sdc-table-expandable-checkbox{flex:0 0 auto}.sdc-table-expandable-summary-fields{display:flex;flex:1 1 0;flex-wrap:wrap;gap:.125rem 1.5rem;min-width:0}.sdc-table-expandable-summary-field{display:flex;flex-direction:column;min-width:0}.sdc-table-expandable-summary-label{color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-table-expandable-summary-value{display:flex;align-items:center;min-width:0}.sdc-table-expandable-toggle{display:flex;align-items:center;justify-content:center;flex:0 0 auto;width:1.75rem;height:1.75rem;padding:0;border:0;border-radius:50%;background:transparent;color:var(--sdc-text-muted, #6b7280);cursor:pointer;transition:color var(--sdc-table-transition-fast, .15s ease),background var(--sdc-table-transition-fast, .15s ease)}.sdc-table-expandable-toggle:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:2px}.sdc-table-expandable-toggle:hover{color:var(--sdc-text-default, #111827);background:#1118270f}.sdc-table-expandable-chevron{display:flex;align-items:center;justify-content:center;font-size:.75rem;transition:transform .2s ease}.sdc-table-expandable-label-wrap,.sdc-table-expandable-value{min-width:0}.sdc-table-expandable-details{padding:.375rem 0;border-top:1px solid var(--sdc-table-border-gray);background:#11182704}.sdc-table-expandable-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.375rem 1rem;border-top:1px solid rgba(0,0,0,.04)}.sdc-table-expandable-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-expandable-field:first-child{border-top:0}.sdc-table-expandable-field--full-width>.sdc-table-expandable-label-wrap{display:none}.sdc-table-expandable-label{display:flex;align-items:center;color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em}.sdc-table-expandable-value{display:flex;align-items:flex-start;width:100%}.sdc-table-expandable-skeleton-primary{width:55%;max-width:10rem}.sdc-table-expandable-skeleton-secondary{width:35%;max-width:7rem}.sdc-table-expandable-chevron--open{transform:rotate(180deg)}.sdc-table-expandable-item--expanded .sdc-table-expandable-summary{background:#11182706}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SearchboxComponent, selector: "sdc-searchbox", inputs: ["triggerMode", "debounceTimeMs", "ariaLabel", "inputRole", "inputAriaControls", "inputAriaDescribedBy", "inputAriaActiveDescendant", "inputAriaHaspopup", "inputAriaExpanded", "inputAutocomplete", "submitOnEnter", "clearOnEscape"], outputs: ["debouncedValueChange", "onSearch", "onClear"] }, { kind: "component", type: PaginatorComponent, selector: "sdc-paginator", inputs: ["first", "rows", "totalRecords", "rowsPerPageOptions", "showRowsPerPageSelector", "isMobile", "totalRecordsLabel"], outputs: ["pageChange"] }, { kind: "component", type: LoadingStateComponent, selector: "sdc-loading-state", inputs: ["indicator", "id", "blockWindow", "blockDelayMs", "unblockDelayMs", "loading"] }, { kind: "component", type: EmptyStateComponent, selector: "sdc-empty-state", inputs: ["id", "title", "variant", "titleParams", "iconClass", "description", "descriptionParams", "showPrimaryAction", "showSecondaryAction", "primaryActionLabel", "primaryActionLabelParams", "secondaryActionLabel", "secondaryActionLabelParams", "primaryModel"], outputs: ["primaryAction", "secondaryAction"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: TableSortIndicatorComponent, selector: "sdc-table-sort-indicator", inputs: ["columnField", "columnType", "sortField", "sortOrder", "sortable"] }, { kind: "component", type: TableCellContentComponent, selector: "sdc-table-cell-content", inputs: ["cellConfigs", "col", "resolveValue", "row", "actionsMenuOpen", "actionsMenuId", "defaultTextOverflow", "rowCheckboxId", "rowLabel", "rowSelectionDisabled", "forceLeftAlign", "rowSelected"], outputs: ["toggleActionsMenu", "toggleRow", "triggerButtonAction"] }, { kind: "component", type: TableActionsMenuComponent, selector: "sdc-table-actions-menu", inputs: ["ariaLabel", "items", "left", "menuId", "top", "width"], outputs: ["close", "select"] }, { kind: "component", type: TooltipComponent, selector: "sdc-tooltip", inputs: ["pTooltip", "tooltipPosition", "tooltipEvent", "fitContent", "tooltipDisabled", "allowHtml"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
31923
31981
  }
31924
31982
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableComponent, decorators: [{
31925
31983
  type: Component,
@@ -31935,7 +31993,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
31935
31993
  TableCellContentComponent,
31936
31994
  TableActionsMenuComponent,
31937
31995
  TooltipComponent
31938
- ], encapsulation: ViewEncapsulation.Emulated, changeDetection: ChangeDetectionStrategy.OnPush, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile()\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n>\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"loadingIndicator\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div class=\"sdc-table-caption__search\" [class.sdc-table-caption__search--full-width]=\"searchFullWidth()\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"'platform.datacore.accessibility_search_field' | translate\"\n />\n </div>\n </div>\n }\n\n @if (!isMobile()) {\n <div\n class=\"sdc-table-scroll\"\n [style.--sdc-table-min-width]=\"isFitLayout() ? '100%' : tableMinWidthPx() + 'px'\"\n >\n <table\n class=\"sdc-table-grid\"\n [class.sdc-table-grid--fit]=\"isFitLayout()\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <colgroup>\n @for (col of cols; track $index) {\n <col [style.width]=\"colWidthStyle(col)\" />\n }\n </colgroup>\n\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n [class.sdc-table-sortable]=\"canSortColumn(col)\"\n [class.sdc-table-sortable-disabled]=\"isSortableColumn(col) && !canSortColumn(col)\"\n [class.sdc-table-header-disabled]=\"!hasDataRows()\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col, 'header')\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"hasDataRows() && canSortColumn(col) ? 0 : null\"\n [attr.aria-disabled]=\"!hasDataRows() || (isSortableColumn(col) && !canSortColumn(col)) ? 'true' : null\"\n [attr.aria-label]=\"\n isSortableColumn(col)\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility_sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n (click)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.enter)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.space)=\"$event.preventDefault();\n hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n >\n @if (col.type === 'checkbox-selection' && (cellsCfg().checkbox.selectAll ?? true)) {\n <div class=\"sdc-table-th-inner sdc-table-th-inner--checkbox\">\n <span class=\"sdc-table-th-label sr-only\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n <span class=\"sdc-table-th-center\">\n <input\n type=\"checkbox\"\n [id]=\"getSelectAllCheckboxId($index)\"\n [checked]=\"isPageFullySelected()\"\n [indeterminate]=\"isPagePartiallySelected()\"\n [disabled]=\"!hasSelectablePageRows()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility_select_all_rows' | translate\"\n [attr.aria-checked]=\"getPageSelectionAriaChecked()\"\n />\n <label [for]=\"getSelectAllCheckboxId($index)\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility_select_all_rows' | translate }}\n </label>\n </span>\n </div>\n } @else {\n <div class=\"sdc-table-th-inner\" [class.sdc-table-th-inner--sortable]=\"isSortableColumn(col)\">\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n\n @if (col.headerTooltip) {\n <sdc-tooltip\n class=\"sdc-table-th-tooltip\"\n [pTooltip]=\"col.headerTooltip\"\n [tooltipPosition]=\"col.headerTooltipPosition ?? 'top'\"\n [tooltipEvent]=\"col.headerTooltipEvent ?? 'hover'\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-circle-info sdc-table-th-tooltip__icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n\n <span class=\"sdc-table-sort-overlay\" aria-hidden=\"true\">\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </span>\n </div>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr\n role=\"row\"\n [attr.aria-rowindex]=\"r + 1\"\n (click)=\"onRowClicked(row)\"\n (keydown.enter)=\"onRowClicked(row)\"\n >\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n [attr.id]=\"col.colId || null\"\n role=\"cell\"\n >\n @if (col.cellTag === 'span') {\n <span class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </span>\n } @else if (col.cellTag === 'i') {\n <i class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </i>\n } @else if (col.cellTag === 'p') {\n <p class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </p>\n } @else {\n <div class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n </div>\n } @else if (mobileMode() === 'stacked') {\n <div\n class=\"sdc-table-mobile-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <div class=\"sdc-table-mobile-card sdc-table-mobile-card--loading\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <div class=\"sdc-table-mobile-field sdc-table-mobile-field--loading\">\n <div class=\"sdc-table-mobile-label sdc-table-mobile-label--loading\"></div>\n <div class=\"sdc-table-mobile-skeleton\"></div>\n </div>\n }\n </div>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <div class=\"sdc-table-mobile-card\">\n @for (col of cols; track $index) {\n <div\n class=\"sdc-table-mobile-field\"\n [class.sdc-table-mobile-field--full-width]=\"\n col.type === 'button' || col.type === 'actions' || col.type === 'checkbox-selection'\n \"\n [class.sdc-table-mobile-field--selected]=\"sortField() === col.field\"\n [class.sdc-table-mobile-field--sortable]=\"col.field && isSortableColumn(col)\"\n (click)=\"col.field && toggleSort(col.field, isSortableColumn(col))\"\n >\n @if (mobileFieldLabel(col)) {\n <div class=\"sdc-table-mobile-label-wrap\">\n @if (col.field && isSortableColumn(col)) {\n <button\n type=\"button\"\n class=\"sdc-table-mobile-label sdc-table-mobile-label--sortable\"\n [attr.aria-label]=\"\n (mobileFieldLabel(col) | translate)\n + ' - '\n + ('platform.datacore.accessibility_sortable_column' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleSort(col.field, isSortableColumn(col))\"\n (keydown.enter)=\"toggleSort(col.field, isSortableColumn(col))\"\n (keydown.space)=\"$event.preventDefault(); toggleSort(col.field, isSortableColumn(col))\"\n >\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </button>\n } @else {\n <div class=\"sdc-table-mobile-label\">\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-table-mobile-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n } @else {\n <ul\n class=\"sdc-table-expandable-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex) {\n <li class=\"sdc-table-expandable-item sdc-table-expandable-item--loading\" aria-hidden=\"true\">\n <div class=\"sdc-table-expandable-summary sdc-table-expandable-summary--loading\">\n <div class=\"sdc-table-expandable-summary-fields\">\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-primary\"></div>\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-secondary\"></div>\n </div>\n <span class=\"sdc-table-expandable-chevron\" aria-hidden=\"true\">\n <i class=\"fas fa-chevron-down\"></i>\n </span>\n </div>\n </li>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <li\n class=\"sdc-table-expandable-item\"\n [class.sdc-table-expandable-item--expanded]=\"isRowExpanded(r)\"\n >\n <div\n class=\"sdc-table-expandable-summary\"\n (click)=\"toggleExpandRow(r)\"\n (keydown.enter)=\"toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); toggleExpandRow(r)\"\n >\n @if (checkboxCol(); as cbCol) {\n <div\n class=\"sdc-table-expandable-checkbox\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"cbCol\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, cbCol)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, cbCol, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n <div class=\"sdc-table-expandable-summary-fields\">\n @for (col of summaryCols(); track $index) {\n <div class=\"sdc-table-expandable-summary-field\">\n <span class=\"sdc-table-expandable-summary-label\">{{ mobileFieldLabel(col) | translate }}</span>\n <div class=\"sdc-table-expandable-summary-value\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n <button\n type=\"button\"\n class=\"sdc-table-expandable-toggle\"\n [attr.aria-expanded]=\"isRowExpanded(r)\"\n [attr.aria-label]=\"\n isRowExpanded(r)\n ? ('platform.datacore.accessibility_collapse_row' | translate)\n : ('platform.datacore.accessibility_expand_row' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.enter)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); $event.stopPropagation(); toggleExpandRow(r)\"\n >\n <span\n class=\"sdc-table-expandable-chevron\"\n [class.sdc-table-expandable-chevron--open]=\"isRowExpanded(r)\"\n aria-hidden=\"true\"\n ><i class=\"fas fa-chevron-down\"></i></span>\n </button>\n </div>\n @if (isRowExpanded(r)) {\n <div class=\"sdc-table-expandable-details\">\n @for (col of cols; track $index) {\n @if (col.type !== 'checkbox-selection') {\n <div\n class=\"sdc-table-expandable-field\"\n [class.sdc-table-expandable-field--full-width]=\"\n col.type === 'button' || col.type === 'actions'\n \"\n >\n @if (col.type !== 'button' && col.type !== 'actions') {\n <div class=\"sdc-table-expandable-label-wrap\">\n <span class=\"sdc-table-expandable-label\">{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n <div class=\"sdc-table-expandable-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n }\n </div>\n }\n </li>\n }\n }\n </ul>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile() ? [] : rowsPerPageOptions()\"\n [showRowsPerPageSelector]=\"showRowsPerPageSelector()\"\n [isMobile]=\"isMobile()\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n</section>\n\n@if (openMenuState(); as menu) {\n <sdc-table-actions-menu\n [items]=\"menu.items\"\n [menuId]=\"menu.menuId\"\n [top]=\"menu.top\"\n [left]=\"menu.left\"\n [width]=\"menu.width\"\n (close)=\"onMenuClose($event)\"\n (select)=\"onPortalActionClick($event)\"\n ></sdc-table-actions-menu>\n}\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:flex-end;display:flex;padding:.75rem 0}.sdc-table-caption__search{width:min(100%,22rem)}.sdc-table-caption__search--full-width{width:100%}.sdc-table-scroll{width:100%;overflow-x:auto;overflow-y:visible}.sdc-table-grid{min-width:var(--sdc-table-min-width, 100%);width:100%;border-collapse:collapse;table-layout:auto}.sdc-table-grid--fit{table-layout:fixed}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable-disabled,thead th.sdc-table-header-disabled{cursor:default}thead th.sdc-table-sortable-disabled:focus,thead th.sdc-table-sortable-disabled:focus-visible{outline:none;box-shadow:none}thead th.sdc-table-sortable:focus,thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff33;position:relative;z-index:1}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}thead th.sdc-table-is-selected .sdc-table-sort-overlay{right:.5rem}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden;text-align:inherit}.sdc-table-sort-overlay{position:absolute;right:0;top:50%;transform:translateY(-50%)}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-td-val{display:flex;align-items:center;width:100%;min-width:0;overflow:hidden}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto;width:100%;text-align:inherit}.sdc-table-th-inner--sortable{padding-right:1.5rem}.sdc-table-th-tooltip{flex-shrink:0;display:inline-flex;align-items:center}.sdc-table-th-tooltip__icon{font-size:.75rem;color:var(--sdc-table-th-tooltip-icon, #767676);cursor:help}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}.sdc-table--initial-loading .sdc-table-scroll{overflow-x:hidden}thead th.sdc-table-th-checkbox .sdc-table-th-inner--checkbox{justify-content:center}thead th.sdc-table-th-checkbox .sdc-table-th-center{display:flex;align-items:center;justify-content:center;width:100%}thead th.sdc-table-th-checkbox .sdc-table-th-center input{cursor:pointer;margin:0}thead th.sdc-table-th-checkbox .sdc-table-th-center input:disabled{cursor:not-allowed}.sdc-table-paginator{padding:.5rem 0;position:sticky;bottom:0;z-index:1;background:var(--sdc-table-bg-card)}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-th-align-left{text-align:left}.sdc-table-th-align-center{text-align:center}.sdc-table-th-align-right{text-align:right}.sdc-table-cell-content--nowrap .sdc-table-text,.sdc-table-cell-content--nowrap .sdc-table-strong-label,.sdc-table-cell-content--nowrap .sdc-table-code-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}@keyframes sdc-mobile-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.sdc-table-mobile-list{display:flex;flex-direction:column;width:100%;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.5rem;overflow:hidden}.sdc-table-mobile-card{display:flex;flex-direction:column;background:var(--sdc-formfield-default-bg, #ffffff);border-top:2px solid var(--sdc-border-strong, #d1d5db)}.sdc-table-mobile-card:first-child{border-top:0}.sdc-table-mobile-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.5rem 1rem;border-top:1px solid rgba(0,0,0,.05)}.sdc-table-mobile-field:first-child{border-top:0;padding-top:.75rem}.sdc-table-mobile-field:last-child{padding-bottom:.75rem}.sdc-table-mobile-field--selected{background:#11182706}.sdc-table-mobile-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-mobile-label-wrap,.sdc-table-mobile-value{min-width:0}.sdc-table-mobile-field--full-width>.sdc-table-mobile-label-wrap{display:none}.sdc-table-mobile-label,.sdc-table-mobile-label--sortable{display:flex;align-items:center;justify-content:flex-start;gap:.25rem;width:100%;margin:0;padding:0;border:0;background:transparent;color:var(--sdc-text-muted, #6b7280);font:inherit;font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;text-align:left}.sdc-table-mobile-label--sortable{cursor:pointer}.sdc-table-mobile-label--sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:3px;border-radius:.375rem}.sdc-table-mobile-label--loading{width:5.5rem;height:.625rem;border-radius:999px;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b824,#94a3b842,#94a3b824);background-size:200% 100%}.sdc-table-mobile-skeleton{min-height:1.25rem;border-radius:.25rem;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b81a,#94a3b82e,#94a3b81a);background-size:200% 100%}.sdc-table-mobile-value{display:flex;align-items:flex-start;width:100%}@media (max-width: 768px){.sdc-table-caption__search{width:100%}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-mobile-field--sortable:hover{background:#11182705}}@media (max-width: 540px){.sdc-table-mobile-list{border-radius:.375rem}.sdc-table-mobile-field{grid-template-columns:1fr;gap:.125rem;padding:.4375rem .875rem}.sdc-table-mobile-field:first-child{padding-top:.625rem}.sdc-table-mobile-field:last-child{padding-bottom:.625rem}}.sdc-table-expandable-list{display:flex;flex-direction:column;width:100%;list-style:none;margin:0;padding:0;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.5rem;overflow:hidden}.sdc-table-expandable-item{display:flex;flex-direction:column;background:var(--sdc-formfield-default-bg, #ffffff);border-top:1px solid var(--sdc-border-strong, #d1d5db)}.sdc-table-expandable-item:first-child{border-top:0}.sdc-table-expandable-summary{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-expandable-summary--loading{pointer-events:none}.sdc-table-expandable-summary:hover{background:#11182705}.sdc-table-expandable-checkbox{flex:0 0 auto}.sdc-table-expandable-summary-fields{display:flex;flex:1 1 0;flex-wrap:wrap;gap:.125rem 1.5rem;min-width:0}.sdc-table-expandable-summary-field{display:flex;flex-direction:column;min-width:0}.sdc-table-expandable-summary-label{color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-table-expandable-summary-value{display:flex;align-items:center;min-width:0}.sdc-table-expandable-toggle{display:flex;align-items:center;justify-content:center;flex:0 0 auto;width:1.75rem;height:1.75rem;padding:0;border:0;border-radius:50%;background:transparent;color:var(--sdc-text-muted, #6b7280);cursor:pointer;transition:color var(--sdc-table-transition-fast, .15s ease),background var(--sdc-table-transition-fast, .15s ease)}.sdc-table-expandable-toggle:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:2px}.sdc-table-expandable-toggle:hover{color:var(--sdc-text-default, #111827);background:#1118270f}.sdc-table-expandable-chevron{display:flex;align-items:center;justify-content:center;font-size:.75rem;transition:transform .2s ease}.sdc-table-expandable-label-wrap,.sdc-table-expandable-value{min-width:0}.sdc-table-expandable-details{padding:.375rem 0;border-top:1px solid rgba(0,0,0,.06);background:#11182704}.sdc-table-expandable-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.375rem 1rem;border-top:1px solid rgba(0,0,0,.04)}.sdc-table-expandable-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-expandable-field:first-child{border-top:0}.sdc-table-expandable-field--full-width>.sdc-table-expandable-label-wrap{display:none}.sdc-table-expandable-label{display:flex;align-items:center;color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em}.sdc-table-expandable-value{display:flex;align-items:flex-start;width:100%}.sdc-table-expandable-skeleton-primary{width:55%;max-width:10rem}.sdc-table-expandable-skeleton-secondary{width:35%;max-width:7rem}.sdc-table-expandable-chevron--open{transform:rotate(180deg)}.sdc-table-expandable-item--expanded .sdc-table-expandable-summary{background:#11182706}\n"] }]
31996
+ ], encapsulation: ViewEncapsulation.Emulated, changeDetection: ChangeDetectionStrategy.OnPush, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile()\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n>\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"loadingIndicator\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div class=\"sdc-table-caption__search\" [class.sdc-table-caption__search--full-width]=\"searchFullWidth()\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"'platform.datacore.accessibility_search_field' | translate\"\n />\n </div>\n </div>\n }\n\n @if (!isMobile()) {\n <div\n class=\"sdc-table-scroll\"\n [style.--sdc-table-min-width]=\"isFitLayout() ? '100%' : tableMinWidthPx() + 'px'\"\n >\n <table\n class=\"sdc-table-grid\"\n [class.sdc-table-grid--fit]=\"isFitLayout()\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <colgroup>\n @for (col of cols; track $index) {\n <col [style.width]=\"colWidthStyle(col)\" />\n }\n </colgroup>\n\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n [class.sdc-table-sortable]=\"canSortColumn(col)\"\n [class.sdc-table-sortable-disabled]=\"isSortableColumn(col) && !canSortColumn(col)\"\n [class.sdc-table-header-disabled]=\"!hasDataRows()\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col, 'header')\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"hasDataRows() && canSortColumn(col) ? 0 : null\"\n [attr.aria-disabled]=\"!hasDataRows() || (isSortableColumn(col) && !canSortColumn(col)) ? 'true' : null\"\n [attr.aria-label]=\"\n isSortableColumn(col)\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility_sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n (click)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.enter)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.space)=\"$event.preventDefault();\n hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n >\n @if (col.type === 'checkbox-selection' && (cellsCfg().checkbox.selectAll ?? true)) {\n <div class=\"sdc-table-th-inner sdc-table-th-inner--checkbox\">\n <span class=\"sdc-table-th-label sr-only\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n <span class=\"sdc-table-th-center\">\n <input\n type=\"checkbox\"\n [id]=\"getSelectAllCheckboxId($index)\"\n [checked]=\"isPageFullySelected()\"\n [indeterminate]=\"isPagePartiallySelected()\"\n [disabled]=\"!hasSelectablePageRows()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility_select_all_rows' | translate\"\n [attr.aria-checked]=\"getPageSelectionAriaChecked()\"\n />\n <label [for]=\"getSelectAllCheckboxId($index)\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility_select_all_rows' | translate }}\n </label>\n </span>\n </div>\n } @else {\n <div class=\"sdc-table-th-inner\" [class.sdc-table-th-inner--sortable]=\"isSortableColumn(col)\">\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n\n @if (col.headerTooltip) {\n <sdc-tooltip\n class=\"sdc-table-th-tooltip\"\n [pTooltip]=\"col.headerTooltip\"\n [tooltipPosition]=\"col.headerTooltipPosition ?? 'top'\"\n [tooltipEvent]=\"col.headerTooltipEvent ?? 'hover'\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-circle-info sdc-table-th-tooltip__icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n\n <span class=\"sdc-table-sort-overlay\" aria-hidden=\"true\">\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </span>\n </div>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr\n role=\"row\"\n [attr.aria-rowindex]=\"r + 1\"\n (click)=\"onRowClicked(row)\"\n (keydown.enter)=\"onRowClicked(row)\"\n >\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n [attr.id]=\"col.colId || null\"\n role=\"cell\"\n >\n @if (col.cellTag === 'span') {\n <span class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </span>\n } @else if (col.cellTag === 'i') {\n <i class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </i>\n } @else if (col.cellTag === 'p') {\n <p class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </p>\n } @else {\n <div class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n </div>\n } @else if (mobileMode() === 'stacked') {\n <div\n class=\"sdc-table-mobile-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <div class=\"sdc-table-mobile-card sdc-table-mobile-card--loading\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <div class=\"sdc-table-mobile-field sdc-table-mobile-field--loading\">\n <div class=\"sdc-table-mobile-label sdc-table-mobile-label--loading\"></div>\n <div class=\"sdc-table-mobile-skeleton\"></div>\n </div>\n }\n </div>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <div class=\"sdc-table-mobile-card\">\n @for (col of cols; track $index) {\n <div\n class=\"sdc-table-mobile-field\"\n [class.sdc-table-mobile-field--full-width]=\"\n col.type === 'button' || col.type === 'actions' || col.type === 'checkbox-selection'\n \"\n [class.sdc-table-mobile-field--selected]=\"sortField() === col.field\"\n [class.sdc-table-mobile-field--sortable]=\"col.field && isSortableColumn(col)\"\n (click)=\"col.field && toggleSort(col.field, isSortableColumn(col))\"\n >\n @if (mobileFieldLabel(col)) {\n <div class=\"sdc-table-mobile-label-wrap\">\n @if (col.field && isSortableColumn(col)) {\n <button\n type=\"button\"\n class=\"sdc-table-mobile-label sdc-table-mobile-label--sortable\"\n [attr.aria-label]=\"\n (mobileFieldLabel(col) | translate)\n + ' - '\n + ('platform.datacore.accessibility_sortable_column' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleSort(col.field, isSortableColumn(col))\"\n (keydown.enter)=\"toggleSort(col.field, isSortableColumn(col))\"\n (keydown.space)=\"$event.preventDefault(); toggleSort(col.field, isSortableColumn(col))\"\n >\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </button>\n } @else {\n <div class=\"sdc-table-mobile-label\">\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-table-mobile-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n } @else {\n <ul\n class=\"sdc-table-expandable-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex) {\n <li class=\"sdc-table-expandable-item sdc-table-expandable-item--loading\" aria-hidden=\"true\">\n <div class=\"sdc-table-expandable-summary sdc-table-expandable-summary--loading\">\n <div class=\"sdc-table-expandable-summary-fields\">\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-primary\"></div>\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-secondary\"></div>\n </div>\n <span class=\"sdc-table-expandable-chevron\" aria-hidden=\"true\">\n <i class=\"fas fa-chevron-down\"></i>\n </span>\n </div>\n </li>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <li\n class=\"sdc-table-expandable-item\"\n [class.sdc-table-expandable-item--expanded]=\"isRowExpanded(r)\"\n >\n <div\n class=\"sdc-table-expandable-summary\"\n (click)=\"toggleExpandRow(r)\"\n (keydown.enter)=\"toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); toggleExpandRow(r)\"\n >\n @if (checkboxCol(); as cbCol) {\n <div\n class=\"sdc-table-expandable-checkbox\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"cbCol\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, cbCol)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, cbCol, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n <div class=\"sdc-table-expandable-summary-fields\">\n @for (col of summaryCols(); track $index) {\n <div class=\"sdc-table-expandable-summary-field\">\n <span class=\"sdc-table-expandable-summary-label\">{{ mobileFieldLabel(col) | translate }}</span>\n <div class=\"sdc-table-expandable-summary-value\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n <button\n type=\"button\"\n class=\"sdc-table-expandable-toggle\"\n [attr.aria-expanded]=\"isRowExpanded(r)\"\n [attr.aria-label]=\"\n isRowExpanded(r)\n ? ('platform.datacore.accessibility_collapse_row' | translate)\n : ('platform.datacore.accessibility_expand_row' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.enter)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); $event.stopPropagation(); toggleExpandRow(r)\"\n >\n <span\n class=\"sdc-table-expandable-chevron\"\n [class.sdc-table-expandable-chevron--open]=\"isRowExpanded(r)\"\n aria-hidden=\"true\"\n ><i class=\"fas fa-chevron-down\"></i></span>\n </button>\n </div>\n @if (isRowExpanded(r)) {\n <div class=\"sdc-table-expandable-details\">\n @for (col of cols; track $index) {\n @if (col.type !== 'checkbox-selection') {\n <div\n class=\"sdc-table-expandable-field\"\n [class.sdc-table-expandable-field--full-width]=\"\n col.type === 'button' || col.type === 'actions'\n \"\n >\n @if (col.type !== 'button' && col.type !== 'actions') {\n <div class=\"sdc-table-expandable-label-wrap\">\n <span class=\"sdc-table-expandable-label\">{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n <div class=\"sdc-table-expandable-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n }\n </div>\n }\n </li>\n }\n }\n </ul>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile() ? [] : rowsPerPageOptions()\"\n [showRowsPerPageSelector]=\"showRowsPerPageSelector()\"\n [isMobile]=\"isMobile()\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n</section>\n\n@if (openMenuState(); as menu) {\n <sdc-table-actions-menu\n [items]=\"menu.items\"\n [menuId]=\"menu.menuId\"\n [top]=\"menu.top\"\n [left]=\"menu.left\"\n [width]=\"menu.width\"\n (close)=\"onMenuClose($event)\"\n (select)=\"onPortalActionClick($event)\"\n ></sdc-table-actions-menu>\n}\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:flex-end;display:flex;padding:.75rem 0}.sdc-table-caption__search{width:min(100%,22rem)}.sdc-table-caption__search--full-width{width:100%}.sdc-table-scroll{width:100%;overflow-x:auto;overflow-y:visible}.sdc-table-grid{min-width:var(--sdc-table-min-width, 100%);width:100%;border-collapse:collapse;table-layout:auto}.sdc-table-grid--fit{table-layout:fixed}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable-disabled,thead th.sdc-table-header-disabled{cursor:default}thead th.sdc-table-sortable-disabled:focus,thead th.sdc-table-sortable-disabled:focus-visible{outline:none;box-shadow:none}thead th.sdc-table-sortable:focus,thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff33;position:relative;z-index:1}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}thead th.sdc-table-is-selected .sdc-table-sort-overlay{right:.5rem}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden;text-align:inherit}.sdc-table-sort-overlay{position:absolute;right:0;top:50%;transform:translateY(-50%)}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-td-val{display:flex;align-items:center;width:100%;min-width:0;overflow:hidden}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto;width:100%;text-align:inherit}.sdc-table-th-inner--sortable{padding-right:1.5rem}.sdc-table-th-tooltip{flex-shrink:0;display:inline-flex;align-items:center}.sdc-table-th-tooltip__icon{font-size:.75rem;color:var(--sdc-table-th-tooltip-icon, #767676);cursor:help}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}.sdc-table--initial-loading .sdc-table-scroll{overflow-x:hidden}thead th.sdc-table-th-checkbox .sdc-table-th-inner--checkbox{justify-content:center}thead th.sdc-table-th-checkbox .sdc-table-th-center{display:flex;align-items:center;justify-content:center;width:100%}thead th.sdc-table-th-checkbox .sdc-table-th-center input{cursor:pointer;margin:0}thead th.sdc-table-th-checkbox .sdc-table-th-center input:disabled{cursor:not-allowed}.sdc-table-paginator{padding:.5rem 0;position:sticky;bottom:0;z-index:1;background:var(--sdc-table-bg-card)}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-th-align-left{text-align:left}.sdc-table-th-align-center{text-align:center}.sdc-table-th-align-right{text-align:right}.sdc-table-cell-content--nowrap .sdc-table-text,.sdc-table-cell-content--nowrap .sdc-table-strong-label,.sdc-table-cell-content--nowrap .sdc-table-code-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}@keyframes sdc-mobile-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.sdc-table-mobile-list{display:flex;flex-direction:column;width:100%;border:1px solid var(--sdc-table-border-gray);border-radius:.5rem;overflow:hidden}.sdc-table-mobile-card{display:flex;flex-direction:column;background:var(--sdc-table-bg-card);border-top:2px solid var(--sdc-table-border-gray)}.sdc-table-mobile-card:first-child{border-top:0}.sdc-table-mobile-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.5rem 1rem;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field:first-child{border-top:0;padding-top:.75rem}.sdc-table-mobile-field:last-child{padding-bottom:.75rem}.sdc-table-mobile-field--selected{background:#11182706}.sdc-table-mobile-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-mobile-label-wrap,.sdc-table-mobile-value{min-width:0}.sdc-table-mobile-field--full-width>.sdc-table-mobile-label-wrap{display:none}.sdc-table-mobile-label,.sdc-table-mobile-label--sortable{display:flex;align-items:center;justify-content:flex-start;gap:.25rem;width:100%;margin:0;padding:0;border:0;background:transparent;color:var(--sdc-text-muted, #6b7280);font:inherit;font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;text-align:left}.sdc-table-mobile-label--sortable{cursor:pointer}.sdc-table-mobile-label--sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:3px;border-radius:.375rem}.sdc-table-mobile-label--loading{width:5.5rem;height:.625rem;border-radius:999px;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b824,#94a3b842,#94a3b824);background-size:200% 100%}.sdc-table-mobile-skeleton{min-height:1.25rem;border-radius:.25rem;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b81a,#94a3b82e,#94a3b81a);background-size:200% 100%}.sdc-table-mobile-value{display:flex;align-items:flex-start;width:100%}@media (max-width: 768px){.sdc-table-caption__search{width:100%}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-mobile-field--sortable:hover{background:#11182705}}@media (max-width: 540px){.sdc-table-mobile-list{border-radius:.375rem}.sdc-table-mobile-field{grid-template-columns:1fr;gap:.125rem;padding:.4375rem .875rem}.sdc-table-mobile-field:first-child{padding-top:.625rem}.sdc-table-mobile-field:last-child{padding-bottom:.625rem}}.sdc-table-expandable-list{display:flex;flex-direction:column;width:100%;list-style:none;margin:0;padding:0;border:1px solid var(--sdc-table-border-gray);border-radius:.5rem;overflow:hidden}.sdc-table-expandable-item{display:flex;flex-direction:column;background:var(--sdc-table-bg-card);border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-expandable-item:first-child{border-top:0}.sdc-table-expandable-summary{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-expandable-summary--loading{pointer-events:none}.sdc-table-expandable-summary:hover{background:#11182705}.sdc-table-expandable-checkbox{flex:0 0 auto}.sdc-table-expandable-summary-fields{display:flex;flex:1 1 0;flex-wrap:wrap;gap:.125rem 1.5rem;min-width:0}.sdc-table-expandable-summary-field{display:flex;flex-direction:column;min-width:0}.sdc-table-expandable-summary-label{color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-table-expandable-summary-value{display:flex;align-items:center;min-width:0}.sdc-table-expandable-toggle{display:flex;align-items:center;justify-content:center;flex:0 0 auto;width:1.75rem;height:1.75rem;padding:0;border:0;border-radius:50%;background:transparent;color:var(--sdc-text-muted, #6b7280);cursor:pointer;transition:color var(--sdc-table-transition-fast, .15s ease),background var(--sdc-table-transition-fast, .15s ease)}.sdc-table-expandable-toggle:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:2px}.sdc-table-expandable-toggle:hover{color:var(--sdc-text-default, #111827);background:#1118270f}.sdc-table-expandable-chevron{display:flex;align-items:center;justify-content:center;font-size:.75rem;transition:transform .2s ease}.sdc-table-expandable-label-wrap,.sdc-table-expandable-value{min-width:0}.sdc-table-expandable-details{padding:.375rem 0;border-top:1px solid var(--sdc-table-border-gray);background:#11182704}.sdc-table-expandable-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.375rem 1rem;border-top:1px solid rgba(0,0,0,.04)}.sdc-table-expandable-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-expandable-field:first-child{border-top:0}.sdc-table-expandable-field--full-width>.sdc-table-expandable-label-wrap{display:none}.sdc-table-expandable-label{display:flex;align-items:center;color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em}.sdc-table-expandable-value{display:flex;align-items:flex-start;width:100%}.sdc-table-expandable-skeleton-primary{width:55%;max-width:10rem}.sdc-table-expandable-skeleton-secondary{width:35%;max-width:7rem}.sdc-table-expandable-chevron--open{transform:rotate(180deg)}.sdc-table-expandable-item--expanded .sdc-table-expandable-summary{background:#11182706}\n"] }]
31939
31997
  }], propDecorators: { cols: [{
31940
31998
  type: Input,
31941
31999
  args: [{ required: true }]
@@ -31973,6 +32031,129 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
31973
32031
  args: ['window:scroll']
31974
32032
  }] } });
31975
32033
 
32034
+ const NESTED_TABLE_DEFAULT_GROUP_TOGGLE_ARIA_LABEL = 'platform.datacore.accessibility_nested_table_group_toggle';
32035
+ const NESTED_TABLE_DEFAULT_HINT_ARIA_LABEL = 'platform.datacore.accessibility_nested_table_hint';
32036
+ const NESTED_TABLE_DEFAULT_ROW_LABEL = 'platform.datacore.accessibility_nested_table_row';
32037
+
32038
+ class NestedTableComponent {
32039
+ translate = inject(TranslateService);
32040
+ instanceId = nextSequentialId('sdc-nested-table');
32041
+ groupPathPartsCache = new Map();
32042
+ groupsSignal = signal([]);
32043
+ openKeysSignal = signal(new Set());
32044
+ configSignal = signal({});
32045
+ groupSortField = signal(null);
32046
+ groupSortOrder = signal(0);
32047
+ set groups(value) {
32048
+ const next = value ?? [];
32049
+ this.groupsSignal.set(next);
32050
+ const validKeys = new Set(next.map((entry) => this.groupKey(entry)));
32051
+ this.openKeysSignal.update((current) => {
32052
+ const filtered = new Set([...current].filter((key) => validKeys.has(key)));
32053
+ return filtered.size === current.size ? current : filtered;
32054
+ });
32055
+ }
32056
+ get groups() {
32057
+ return this.groupsSignal();
32058
+ }
32059
+ groupCols = [];
32060
+ itemCols = [];
32061
+ set config(value) {
32062
+ this.configSignal.set(value ?? {});
32063
+ }
32064
+ get config() {
32065
+ return this.configSignal();
32066
+ }
32067
+ loading = false;
32068
+ ariaLabel = '';
32069
+ groupExpanded = new EventEmitter();
32070
+ groupCollapsed = new EventEmitter();
32071
+ itemAction = new EventEmitter();
32072
+ hintAriaLabel = NESTED_TABLE_DEFAULT_HINT_ARIA_LABEL;
32073
+ rowLabel = NESTED_TABLE_DEFAULT_ROW_LABEL;
32074
+ groupToggleAriaLabel = NESTED_TABLE_DEFAULT_GROUP_TOGGLE_ARIA_LABEL;
32075
+ summaryLabel = computed(() => this.configSignal().summaryLabel ?? '');
32076
+ headerHint = computed(() => this.configSignal().headerHint ?? '');
32077
+ groupCellConfigs = computed(() => buildTableCellConfigMap(this.configSignal().groupTableConfig ?? {}));
32078
+ itemTableConfig = computed(() => this.configSignal().itemTableConfig);
32079
+ resolveGroupValue = (row, path) => getNestedValue(row, path, this.groupPathPartsCache);
32080
+ sortedGroups = computed(() => sortTableRows(this.groupsSignal(), this.groupSortField(), this.groupSortOrder(), (entry, path) => this.resolveGroupValue(entry.group, path)));
32081
+ isSortableColumn(col) {
32082
+ return (col.sortable ?? true) && !!col.field;
32083
+ }
32084
+ isActiveSort(col) {
32085
+ return this.groupSortField() === col.field;
32086
+ }
32087
+ toggleGroupSort(col) {
32088
+ if (!this.isSortableColumn(col) || !col.field) {
32089
+ return;
32090
+ }
32091
+ const next = cycleSortState(this.groupSortField(), this.groupSortOrder(), col.field);
32092
+ this.groupSortField.set(next.field);
32093
+ this.groupSortOrder.set(next.order);
32094
+ }
32095
+ groupKey(entry) {
32096
+ return resolveRowSelectionKey(entry.group);
32097
+ }
32098
+ isOpen(entry) {
32099
+ return this.openKeysSignal().has(this.groupKey(entry));
32100
+ }
32101
+ groupContentId(entry) {
32102
+ return `${this.instanceId}-content-${this.groupKey(entry)}`;
32103
+ }
32104
+ sortHintId(col) {
32105
+ return `${this.instanceId}-sort-hint-${col.field}`;
32106
+ }
32107
+ toggleGroup(entry) {
32108
+ const key = this.groupKey(entry);
32109
+ const next = new Set(this.openKeysSignal());
32110
+ if (next.has(key)) {
32111
+ next.delete(key);
32112
+ this.openKeysSignal.set(next);
32113
+ this.groupCollapsed.emit(entry.group);
32114
+ return;
32115
+ }
32116
+ next.add(key);
32117
+ this.openKeysSignal.set(next);
32118
+ this.groupExpanded.emit(entry.group);
32119
+ }
32120
+ resolveGroupToggleAriaLabel(entry) {
32121
+ const action = resolveTranslatableText(this.translate, this.groupToggleAriaLabel);
32122
+ const verbKey = this.isOpen(entry)
32123
+ ? 'platform.datacore.accessibility_panel_collapse'
32124
+ : 'platform.datacore.accessibility_panel_expand';
32125
+ const verb = resolveTranslatableText(this.translate, verbKey);
32126
+ return [action, verb].filter(Boolean).join(' - ');
32127
+ }
32128
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NestedTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
32129
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: NestedTableComponent, isStandalone: true, selector: "sdc-nested-table", inputs: { groups: "groups", groupCols: "groupCols", itemCols: "itemCols", config: "config", loading: "loading", ariaLabel: "ariaLabel" }, outputs: { groupExpanded: "groupExpanded", groupCollapsed: "groupCollapsed", itemAction: "itemAction" }, ngImport: i0, template: "<div class=\"sdc-nested-table\" [attr.aria-label]=\"ariaLabel || null\">\n @if (summaryLabel() || headerHint()) {\n <div class=\"sdc-nested-table__meta\">\n @if (headerHint()) {\n <sdc-tooltip [pTooltip]=\"headerHint() | translate\" [tooltipPosition]=\"'right'\" [tooltipEvent]=\"'both'\">\n <button type=\"button\" class=\"sdc-nested-table__hint\" [attr.aria-label]=\"hintAriaLabel | translate\">\n <i class=\"fas fa-info-circle sdc-nested-table__hint-icon\" aria-hidden=\"true\"></i>\n </button>\n </sdc-tooltip>\n }\n\n @if (summaryLabel()) {\n <span class=\"sdc-nested-table__summary\">{{ summaryLabel() }}</span>\n }\n </div>\n }\n\n <table class=\"sdc-nested-table__groups\">\n <thead>\n <tr>\n <th class=\"sdc-nested-table__toggle-col\" scope=\"col\">\n <span class=\"sr-only\">{{ groupToggleAriaLabel | translate }}</span>\n </th>\n\n @for (col of groupCols; track $index) {\n <th\n class=\"sdc-nested-table__th\"\n [class.sdc-nested-table__th--sortable]=\"isSortableColumn(col)\"\n scope=\"col\"\n [attr.aria-sort]=\"\n isSortableColumn(col)\n ? isActiveSort(col)\n ? (groupSortOrder() === 1 ? 'ascending' : 'descending')\n : 'none'\n : null\n \"\n [attr.tabindex]=\"isSortableColumn(col) ? 0 : null\"\n [attr.aria-describedby]=\"isSortableColumn(col) ? sortHintId(col) : null\"\n (click)=\"toggleGroupSort(col)\"\n (keydown.enter)=\"toggleGroupSort(col)\"\n (keydown.space)=\"$event.preventDefault(); toggleGroupSort(col)\"\n >\n <span class=\"sdc-nested-table__th-label\">{{ col.header | translate }}</span>\n\n @if (isSortableColumn(col)) {\n <span class=\"sr-only\" [id]=\"sortHintId(col)\">{{\n 'platform.datacore.accessibility_sortable_column' | translate\n }}</span>\n }\n\n @if (col.headerTooltip) {\n <sdc-tooltip\n class=\"sdc-nested-table__th-tooltip\"\n [pTooltip]=\"col.headerTooltip | translate\"\n [tooltipPosition]=\"col.headerTooltipPosition ?? 'top'\"\n [tooltipEvent]=\"col.headerTooltipEvent ?? 'hover'\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-info-circle\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n\n <sdc-table-sort-indicator\n [columnField]=\"col.field ?? null\"\n [columnType]=\"col.type\"\n [sortField]=\"groupSortField()\"\n [sortOrder]=\"groupSortOrder()\"\n [sortable]=\"isSortableColumn(col)\"\n ></sdc-table-sort-indicator>\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @for (entry of sortedGroups(); track groupKey(entry)) {\n <tr class=\"sdc-nested-table__group-row\">\n <td class=\"sdc-nested-table__toggle-col\">\n <button\n type=\"button\"\n class=\"sdc-nested-table__toggle\"\n [attr.aria-expanded]=\"isOpen(entry)\"\n [attr.aria-controls]=\"groupContentId(entry)\"\n [attr.aria-label]=\"resolveGroupToggleAriaLabel(entry)\"\n (click)=\"toggleGroup(entry)\"\n >\n <i class=\"fas\" [class.fa-plus]=\"!isOpen(entry)\" [class.fa-minus]=\"isOpen(entry)\" aria-hidden=\"true\"></i>\n </button>\n </td>\n\n @for (col of groupCols; track $index) {\n <td class=\"sdc-nested-table__td\">\n <sdc-table-cell-content\n [cellConfigs]=\"groupCellConfigs()\"\n [col]=\"col\"\n [resolveValue]=\"resolveGroupValue\"\n [row]=\"entry.group\"\n [rowLabel]=\"rowLabel\"\n ></sdc-table-cell-content>\n </td>\n }\n </tr>\n\n @if (isOpen(entry)) {\n <tr class=\"sdc-nested-table__item-row\">\n <!-- Celula vazia cobrindo a coluna do botao de abrir. E ela que alinha o\n bloco expandido: ele comeca exatamente onde comeca a primeira coluna de\n dados, porque quem decide esse x e o proprio layout da tabela. Uma\n margem fixa nao serviria - a largura declarada da coluna (2.5rem) e so\n um pedido, e o navegador entrega outra medida conforme o conteudo. -->\n <td class=\"sdc-nested-table__item-spacer\"></td>\n <td class=\"sdc-nested-table__item-cell\" [attr.colspan]=\"groupCols.length\" [id]=\"groupContentId(entry)\">\n <!-- O fundo do bloco expandido fica NESTE painel, nao na celula: assim ele\n nasce colado na coluna de dados e termina na borda da tabela. Com o\n fundo na celula ele ia de borda a borda e o bloco parecia uma tabela\n irma, nao uma tabela dentro da outra. -->\n <div class=\"sdc-nested-table__item-panel\">\n <sdc-table\n [cols]=\"itemCols\"\n [data]=\"entry.items\"\n [config]=\"itemTableConfig() ?? {}\"\n [loading]=\"loading\"\n (action)=\"itemAction.emit($event)\"\n ></sdc-table>\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n", styles: [":host{display:block;width:100%;--sdc-nested-table-toggle-col-width: 2.5rem}.sr-only{border-width:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}table{width:100%;border-collapse:collapse}.sdc-nested-table__meta{align-items:center;display:flex;gap:.5rem;margin-bottom:.75rem}.sdc-nested-table__hint{align-items:center;background:transparent;border:0;display:inline-flex;padding:0}.sdc-nested-table__hint:focus-visible{outline:var(--sdc-focus-outline, 2px solid #428bca);outline-offset:2px}.sdc-nested-table__hint-icon{font-size:.875rem;color:var(--sdc-table-th-tooltip-icon, #767676);cursor:help}.sdc-nested-table__summary{background:var(--sdc-nested-table-summary-bg, #eef1f4);border-radius:9999px;color:var(--sdc-text-muted, #4b5563);font-size:.75rem;font-weight:600;padding:.2rem .65rem}.sdc-nested-table__toggle-col{width:var(--sdc-nested-table-toggle-col-width)}.sdc-nested-table__th{background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);min-height:44px;padding:var(--sdc-table-padding-cell, .75rem);position:relative;text-align:left;white-space:nowrap}.sdc-nested-table__th--sortable{cursor:pointer;padding-right:1.75rem}.sdc-nested-table__th-label{margin-right:.35rem}.sdc-nested-table__th-tooltip{display:inline-flex;align-items:center;margin-right:.35rem}.sdc-nested-table__th-tooltip i{font-size:.75rem;color:var(--sdc-table-th-tooltip-icon, #767676);cursor:help}.sdc-nested-table__group-row td{border-bottom:1px solid var(--sdc-table-border-gray, #e5e7eb);padding:.5rem var(--sdc-table-padding-cell, .75rem);vertical-align:middle}.sdc-nested-table__toggle{align-items:center;background:transparent;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:4px;color:var(--sdc-text-default, #111827);cursor:pointer;display:inline-flex;font-size:.75rem;height:1.5rem;justify-content:center;width:1.5rem}.sdc-nested-table__toggle:focus-visible{outline:var(--sdc-focus-outline, 2px solid #428bca);outline-offset:2px}.sdc-nested-table__item-row td{background:transparent;padding:0}.sdc-nested-table__item-panel{background:var(--sdc-nested-table-item-bg, #eaf2fb);border-radius:var(--sdc-nested-table-item-radius, 4px);margin:0 0 var(--sdc-nested-table-item-inset, 1rem);padding:.75rem}.sdc-nested-table__item-cell ::ng-deep .sdc-table-shell{background:transparent}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: TableComponent, selector: "sdc-table", inputs: ["cols", "data", "selection", "loading", "loadingIndicator", "config", "ariaLabel"], outputs: ["action", "rowClick", "lazyLoad", "selectionChange"] }, { kind: "component", type: TableCellContentComponent, selector: "sdc-table-cell-content", inputs: ["cellConfigs", "col", "resolveValue", "row", "actionsMenuOpen", "actionsMenuId", "defaultTextOverflow", "rowCheckboxId", "rowLabel", "rowSelectionDisabled", "forceLeftAlign", "rowSelected"], outputs: ["toggleActionsMenu", "toggleRow", "triggerButtonAction"] }, { kind: "component", type: TableSortIndicatorComponent, selector: "sdc-table-sort-indicator", inputs: ["columnField", "columnType", "sortField", "sortOrder", "sortable"] }, { kind: "component", type: TooltipComponent, selector: "sdc-tooltip", inputs: ["pTooltip", "tooltipPosition", "tooltipEvent", "fitContent", "tooltipDisabled", "allowHtml"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
32130
+ }
32131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NestedTableComponent, decorators: [{
32132
+ type: Component,
32133
+ args: [{ selector: 'sdc-nested-table', standalone: true, imports: [TranslateModule, TableComponent, TableCellContentComponent, TableSortIndicatorComponent, TooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, template: "<div class=\"sdc-nested-table\" [attr.aria-label]=\"ariaLabel || null\">\n @if (summaryLabel() || headerHint()) {\n <div class=\"sdc-nested-table__meta\">\n @if (headerHint()) {\n <sdc-tooltip [pTooltip]=\"headerHint() | translate\" [tooltipPosition]=\"'right'\" [tooltipEvent]=\"'both'\">\n <button type=\"button\" class=\"sdc-nested-table__hint\" [attr.aria-label]=\"hintAriaLabel | translate\">\n <i class=\"fas fa-info-circle sdc-nested-table__hint-icon\" aria-hidden=\"true\"></i>\n </button>\n </sdc-tooltip>\n }\n\n @if (summaryLabel()) {\n <span class=\"sdc-nested-table__summary\">{{ summaryLabel() }}</span>\n }\n </div>\n }\n\n <table class=\"sdc-nested-table__groups\">\n <thead>\n <tr>\n <th class=\"sdc-nested-table__toggle-col\" scope=\"col\">\n <span class=\"sr-only\">{{ groupToggleAriaLabel | translate }}</span>\n </th>\n\n @for (col of groupCols; track $index) {\n <th\n class=\"sdc-nested-table__th\"\n [class.sdc-nested-table__th--sortable]=\"isSortableColumn(col)\"\n scope=\"col\"\n [attr.aria-sort]=\"\n isSortableColumn(col)\n ? isActiveSort(col)\n ? (groupSortOrder() === 1 ? 'ascending' : 'descending')\n : 'none'\n : null\n \"\n [attr.tabindex]=\"isSortableColumn(col) ? 0 : null\"\n [attr.aria-describedby]=\"isSortableColumn(col) ? sortHintId(col) : null\"\n (click)=\"toggleGroupSort(col)\"\n (keydown.enter)=\"toggleGroupSort(col)\"\n (keydown.space)=\"$event.preventDefault(); toggleGroupSort(col)\"\n >\n <span class=\"sdc-nested-table__th-label\">{{ col.header | translate }}</span>\n\n @if (isSortableColumn(col)) {\n <span class=\"sr-only\" [id]=\"sortHintId(col)\">{{\n 'platform.datacore.accessibility_sortable_column' | translate\n }}</span>\n }\n\n @if (col.headerTooltip) {\n <sdc-tooltip\n class=\"sdc-nested-table__th-tooltip\"\n [pTooltip]=\"col.headerTooltip | translate\"\n [tooltipPosition]=\"col.headerTooltipPosition ?? 'top'\"\n [tooltipEvent]=\"col.headerTooltipEvent ?? 'hover'\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-info-circle\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n\n <sdc-table-sort-indicator\n [columnField]=\"col.field ?? null\"\n [columnType]=\"col.type\"\n [sortField]=\"groupSortField()\"\n [sortOrder]=\"groupSortOrder()\"\n [sortable]=\"isSortableColumn(col)\"\n ></sdc-table-sort-indicator>\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @for (entry of sortedGroups(); track groupKey(entry)) {\n <tr class=\"sdc-nested-table__group-row\">\n <td class=\"sdc-nested-table__toggle-col\">\n <button\n type=\"button\"\n class=\"sdc-nested-table__toggle\"\n [attr.aria-expanded]=\"isOpen(entry)\"\n [attr.aria-controls]=\"groupContentId(entry)\"\n [attr.aria-label]=\"resolveGroupToggleAriaLabel(entry)\"\n (click)=\"toggleGroup(entry)\"\n >\n <i class=\"fas\" [class.fa-plus]=\"!isOpen(entry)\" [class.fa-minus]=\"isOpen(entry)\" aria-hidden=\"true\"></i>\n </button>\n </td>\n\n @for (col of groupCols; track $index) {\n <td class=\"sdc-nested-table__td\">\n <sdc-table-cell-content\n [cellConfigs]=\"groupCellConfigs()\"\n [col]=\"col\"\n [resolveValue]=\"resolveGroupValue\"\n [row]=\"entry.group\"\n [rowLabel]=\"rowLabel\"\n ></sdc-table-cell-content>\n </td>\n }\n </tr>\n\n @if (isOpen(entry)) {\n <tr class=\"sdc-nested-table__item-row\">\n <!-- Celula vazia cobrindo a coluna do botao de abrir. E ela que alinha o\n bloco expandido: ele comeca exatamente onde comeca a primeira coluna de\n dados, porque quem decide esse x e o proprio layout da tabela. Uma\n margem fixa nao serviria - a largura declarada da coluna (2.5rem) e so\n um pedido, e o navegador entrega outra medida conforme o conteudo. -->\n <td class=\"sdc-nested-table__item-spacer\"></td>\n <td class=\"sdc-nested-table__item-cell\" [attr.colspan]=\"groupCols.length\" [id]=\"groupContentId(entry)\">\n <!-- O fundo do bloco expandido fica NESTE painel, nao na celula: assim ele\n nasce colado na coluna de dados e termina na borda da tabela. Com o\n fundo na celula ele ia de borda a borda e o bloco parecia uma tabela\n irma, nao uma tabela dentro da outra. -->\n <div class=\"sdc-nested-table__item-panel\">\n <sdc-table\n [cols]=\"itemCols\"\n [data]=\"entry.items\"\n [config]=\"itemTableConfig() ?? {}\"\n [loading]=\"loading\"\n (action)=\"itemAction.emit($event)\"\n ></sdc-table>\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n", styles: [":host{display:block;width:100%;--sdc-nested-table-toggle-col-width: 2.5rem}.sr-only{border-width:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}table{width:100%;border-collapse:collapse}.sdc-nested-table__meta{align-items:center;display:flex;gap:.5rem;margin-bottom:.75rem}.sdc-nested-table__hint{align-items:center;background:transparent;border:0;display:inline-flex;padding:0}.sdc-nested-table__hint:focus-visible{outline:var(--sdc-focus-outline, 2px solid #428bca);outline-offset:2px}.sdc-nested-table__hint-icon{font-size:.875rem;color:var(--sdc-table-th-tooltip-icon, #767676);cursor:help}.sdc-nested-table__summary{background:var(--sdc-nested-table-summary-bg, #eef1f4);border-radius:9999px;color:var(--sdc-text-muted, #4b5563);font-size:.75rem;font-weight:600;padding:.2rem .65rem}.sdc-nested-table__toggle-col{width:var(--sdc-nested-table-toggle-col-width)}.sdc-nested-table__th{background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);min-height:44px;padding:var(--sdc-table-padding-cell, .75rem);position:relative;text-align:left;white-space:nowrap}.sdc-nested-table__th--sortable{cursor:pointer;padding-right:1.75rem}.sdc-nested-table__th-label{margin-right:.35rem}.sdc-nested-table__th-tooltip{display:inline-flex;align-items:center;margin-right:.35rem}.sdc-nested-table__th-tooltip i{font-size:.75rem;color:var(--sdc-table-th-tooltip-icon, #767676);cursor:help}.sdc-nested-table__group-row td{border-bottom:1px solid var(--sdc-table-border-gray, #e5e7eb);padding:.5rem var(--sdc-table-padding-cell, .75rem);vertical-align:middle}.sdc-nested-table__toggle{align-items:center;background:transparent;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:4px;color:var(--sdc-text-default, #111827);cursor:pointer;display:inline-flex;font-size:.75rem;height:1.5rem;justify-content:center;width:1.5rem}.sdc-nested-table__toggle:focus-visible{outline:var(--sdc-focus-outline, 2px solid #428bca);outline-offset:2px}.sdc-nested-table__item-row td{background:transparent;padding:0}.sdc-nested-table__item-panel{background:var(--sdc-nested-table-item-bg, #eaf2fb);border-radius:var(--sdc-nested-table-item-radius, 4px);margin:0 0 var(--sdc-nested-table-item-inset, 1rem);padding:.75rem}.sdc-nested-table__item-cell ::ng-deep .sdc-table-shell{background:transparent}\n"] }]
32134
+ }], propDecorators: { groups: [{
32135
+ type: Input,
32136
+ args: [{ required: true }]
32137
+ }], groupCols: [{
32138
+ type: Input,
32139
+ args: [{ required: true }]
32140
+ }], itemCols: [{
32141
+ type: Input,
32142
+ args: [{ required: true }]
32143
+ }], config: [{
32144
+ type: Input
32145
+ }], loading: [{
32146
+ type: Input
32147
+ }], ariaLabel: [{
32148
+ type: Input
32149
+ }], groupExpanded: [{
32150
+ type: Output
32151
+ }], groupCollapsed: [{
32152
+ type: Output
32153
+ }], itemAction: [{
32154
+ type: Output
32155
+ }] } });
32156
+
31976
32157
  const STATS_CARD_DEFAULT_COLOR = '#339966';
31977
32158
  const STATS_CARD_DEFAULT_ICON_CLASS = 'fa fa-bar-chart';
31978
32159
  const STATS_CARD_ANIMATION_DURATION_MS = 220;
@@ -35808,6 +35989,7 @@ function provideFeatures() {
35808
35989
  { name: 'sdc-tab-item', component: TabItemComponent },
35809
35990
  { name: 'sdc-stats-card', component: StatsCardComponent },
35810
35991
  { name: 'sdc-table', component: TableComponent },
35992
+ { name: 'sdc-nested-table', component: NestedTableComponent },
35811
35993
  { name: 'sdc-textarea', component: TextareaComponent },
35812
35994
  { name: 'sdc-textbox', component: TextboxComponent },
35813
35995
  { name: 'sdc-tile', component: TileComponent },
@@ -41166,6 +41348,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
41166
41348
  }] } });
41167
41349
 
41168
41350
  const DAYS_IN_WEEK = 7;
41351
+ const MONTHS_IN_YEAR = 12;
41169
41352
  const YEARS_PER_PAGE = 12;
41170
41353
  const HOUR_FORMAT_12_MAX = 12;
41171
41354
  const HOUR_FORMAT_24_MAX = 23;
@@ -41184,6 +41367,12 @@ class DatepickerComponent extends InputsComponent {
41184
41367
  max = null;
41185
41368
  defaultDate = null;
41186
41369
  dateFormat = 'dd/MM/yyyy';
41370
+ // Digitacao no campo, desligada por padrao. Ate aqui o <input> so refletia o que
41371
+ // foi clicado no calendario: nao havia handler de (input), entao o que o usuario
41372
+ // digitava nunca chegava ao componente. Ligar por padrao mudaria o
41373
+ // comportamento de telas que ja contam com o campo ser efetivamente so-leitura,
41374
+ // por isso e opt-in.
41375
+ allowTyping = false;
41187
41376
  hourFormat = '24';
41188
41377
  minuteStep = 5;
41189
41378
  showSeconds = false;
@@ -41216,13 +41405,25 @@ class DatepickerComponent extends InputsComponent {
41216
41405
  hours = signal(0);
41217
41406
  minutes = signal(0);
41218
41407
  seconds = signal(0);
41408
+ // O idioma precisa ser um Signal: os nomes de mes e de dia sao `computed()`, e
41409
+ // computed so recalcula quando um Signal que ele LE muda. Ler translate.currentLang
41410
+ // direto deixaria os nomes congelados no idioma do primeiro render - o
41411
+ // markForCheck do onLangChange (ver ngOnInit) redesenha, mas com o valor velho.
41412
+ // Sem getDefaultLang() aqui: nem toda montagem do TranslateService expoe esse
41413
+ // metodo (o mock do proprio spec deste componente nao expoe), e o fallback de
41414
+ // idioma ja esta nos helpers de Intl mais abaixo.
41415
+ currentLang = signal(this.translate.currentLang ?? '');
41416
+ // Texto enquanto o usuario digita. Nao-nulo apenas durante a digitacao: enquanto
41417
+ // existe, tem precedencia sobre displayValue() no campo, senao a formatacao
41418
+ // reescreveria o texto no meio da digitacao a cada ciclo de deteccao.
41419
+ typedText = signal(null);
41219
41420
  // Range selection state
41220
41421
  rangeStart = signal(null);
41221
41422
  rangeEnd = signal(null);
41222
41423
  rangeSelecting = signal(false);
41223
41424
  // --- Computed ---
41224
41425
  weekDayNames = computed(() => {
41225
- const days = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];
41426
+ const days = this.localizedWeekDayNames(this.currentLang());
41226
41427
  const shifted = [];
41227
41428
  for (let i = 0; i < DAYS_IN_WEEK; i++) {
41228
41429
  shifted.push(days[(i + this.firstDayOfWeek) % DAYS_IN_WEEK]);
@@ -41279,7 +41480,7 @@ class DatepickerComponent extends InputsComponent {
41279
41480
  // NOTE: plain method for the same reason as `calendarDays` above (depends on `this.value`,
41280
41481
  // a non-Signal @Input).
41281
41482
  calendarMonths() {
41282
- const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
41483
+ const monthNames = this.localizedMonthNames(this.currentLang(), 'short');
41283
41484
  const viewD = this.viewDate();
41284
41485
  return monthNames.map((name, index) => ({
41285
41486
  month: index,
@@ -41318,9 +41519,12 @@ class DatepickerComponent extends InputsComponent {
41318
41519
  }
41319
41520
  return '';
41320
41521
  }
41522
+ // O que o campo mostra: o texto em digitacao, quando ha, senao o valor formatado.
41523
+ inputValue() {
41524
+ return this.typedText() ?? this.displayValue();
41525
+ }
41321
41526
  viewMonthYearLabel = computed(() => {
41322
- const monthNames = ['January', 'February', 'March', 'April', 'May', 'June',
41323
- 'July', 'August', 'September', 'October', 'November', 'December'];
41527
+ const monthNames = this.localizedMonthNames(this.currentLang(), 'long');
41324
41528
  const viewD = this.viewDate();
41325
41529
  if (this.currentView() === 'years') {
41326
41530
  const years = this.yearRange();
@@ -41334,7 +41538,8 @@ class DatepickerComponent extends InputsComponent {
41334
41538
  // --- Lifecycle ---
41335
41539
  ngOnInit() {
41336
41540
  this.initializeViewDate();
41337
- this.subscriptions.add(this.translate.onLangChange.subscribe(() => {
41541
+ this.subscriptions.add(this.translate.onLangChange.subscribe((evento) => {
41542
+ this.currentLang.set(evento.lang);
41338
41543
  this.cdr.markForCheck();
41339
41544
  }));
41340
41545
  }
@@ -41405,6 +41610,17 @@ class DatepickerComponent extends InputsComponent {
41405
41610
  }
41406
41611
  }
41407
41612
  onInputClick() {
41613
+ // Com digitacao ligada, clicar no campo quer dizer "vou escrever", nao "abra o
41614
+ // calendario" - e o painel ainda cobriria o campo enquanto a pessoa digita. Aqui
41615
+ // o calendario passa a ser so do botao ao lado.
41616
+ //
41617
+ // Preso ao allowTyping de proposito, e nao valendo pra todo mundo: abrir ao
41618
+ // clicar e o comportamento que as telas que ja usam o componente esperam
41619
+ // (showOnFocus e true por padrao), e mudar isso sem o opt-in seria quebrar quem
41620
+ // nunca pediu digitacao.
41621
+ if (this.allowTyping) {
41622
+ return;
41623
+ }
41408
41624
  if (this.showOnFocus && !this.disabled) {
41409
41625
  this.openPanel();
41410
41626
  }
@@ -41845,6 +42061,140 @@ class DatepickerComponent extends InputsComponent {
41845
42061
  const firstCurrentMonthDay = days.find(d => d.currentMonth) ?? days[0];
41846
42062
  return firstCurrentMonthDay ? this.isSameDay(day.date, firstCurrentMonthDay.date) : false;
41847
42063
  }
42064
+ onInputTyping(event) {
42065
+ if (!this.allowTyping) {
42066
+ return;
42067
+ }
42068
+ const input = event.target;
42069
+ const text = this.applyDateMask(input, input.value);
42070
+ this.typedText.set(text);
42071
+ const parsed = this.parseTypedDate(text);
42072
+ // So comita data completa e valida. Com o texto pela metade ("18/0") nao ha o
42073
+ // que commitar, e tambem nao se apaga o que ja existia - limpar a cada tecla
42074
+ // faria o calendario piscar durante a digitacao.
42075
+ if (parsed) {
42076
+ this.viewDate.set(new Date(parsed.getFullYear(), parsed.getMonth(), 1));
42077
+ this.commitDateValue(parsed);
42078
+ }
42079
+ }
42080
+ // Insere os separadores enquanto o usuario digita: 01102006 vira 01/10/2006, e
42081
+ // yyyy-MM-dd produz 2006-10-01 a partir dos mesmos digitos. Quem dita a forma e o
42082
+ // proprio dateFormat - nada de "/" escrito a mao aqui.
42083
+ //
42084
+ // Escreve direto no input, e nao so no signal: o texto que o usuario digitou ja
42085
+ // esta no DOM, e sem reescrever o campo ficaria com os digitos crus ate o proximo
42086
+ // ciclo de deteccao. Mexer no DOM tambem obriga a recolocar o cursor, senao ele
42087
+ // pula pro fim a cada tecla - ver o calculo abaixo.
42088
+ applyDateMask(input, raw) {
42089
+ // So no modo 'date': datetime/time/range/month tem outras partes no formato, e
42090
+ // mascarar por este caminho cortaria a hora.
42091
+ if (this.mode !== 'date' || !this.dateFormatOrder()) {
42092
+ return raw;
42093
+ }
42094
+ const caret = input.selectionStart ?? raw.length;
42095
+ const digitsBeforeCaret = raw.slice(0, caret).replace(/\D/g, '').length;
42096
+ const masked = this.maskByDateFormat(raw);
42097
+ if (masked === raw) {
42098
+ return raw;
42099
+ }
42100
+ input.value = masked;
42101
+ // Recoloca o cursor DEPOIS do mesmo digito em que ele estava, contando digitos e
42102
+ // nao posicoes - os separadores entram e saem conforme o texto cresce, entao a
42103
+ // posicao crua nao se mantem entre um estado e outro.
42104
+ let position = 0;
42105
+ let seen = 0;
42106
+ while (position < masked.length && seen < digitsBeforeCaret) {
42107
+ if (/\d/.test(masked[position])) {
42108
+ seen++;
42109
+ }
42110
+ position++;
42111
+ }
42112
+ input.setSelectionRange(position, position);
42113
+ return masked;
42114
+ }
42115
+ // Percorre o dateFormat colocando um digito onde ha d/M/y e o literal onde ha
42116
+ // separador. Para quando os digitos acabam, entao o separador so aparece junto do
42117
+ // digito seguinte - digitar "01" mostra "01", e o "/" chega com o terceiro numero.
42118
+ maskByDateFormat(raw) {
42119
+ const format = this.dateFormat;
42120
+ const maxDigits = (format.match(/[dMy]/g) ?? []).length;
42121
+ const digits = raw.replace(/\D/g, '').slice(0, maxDigits);
42122
+ let masked = '';
42123
+ let index = 0;
42124
+ for (const char of format) {
42125
+ if (index >= digits.length) {
42126
+ break;
42127
+ }
42128
+ masked += /[dMy]/.test(char) ? digits[index++] : char;
42129
+ }
42130
+ return masked;
42131
+ }
42132
+ // Ao sair do campo o texto em digitacao da lugar ao valor formatado. Texto invalido
42133
+ // ou incompleto some: o campo volta ao ultimo valor valido, em vez de deixar na
42134
+ // tela algo que o componente nao reconhece como data.
42135
+ onInputBlur() {
42136
+ this.typedText.set(null);
42137
+ this.cdr.markForCheck();
42138
+ }
42139
+ // Le a data conforme o dateFormat configurado e valida o DOMINIO, nao so o formato:
42140
+ // 32/13/2026 casa com "dd/MM/yyyy" e nao existe. O Date do JS aceita overflow em
42141
+ // silencio (new Date(2026, 12, 32) vira 01/02/2027), entao a verificacao e de ida e
42142
+ // volta: se o dia, o mes ou o ano mudaram, a entrada era invalida.
42143
+ parseTypedDate(text) {
42144
+ const order = this.dateFormatOrder();
42145
+ const numbers = text.match(/\d+/g);
42146
+ if (!order || !numbers || numbers.length < 3) {
42147
+ return null;
42148
+ }
42149
+ // Ano de 2 digitos nao e aceito: "18/06/26" tanto pode ser 1926 quanto 2026, e
42150
+ // adivinhar produz data errada sem o usuario perceber.
42151
+ if (numbers[order.year].length !== 4) {
42152
+ return null;
42153
+ }
42154
+ const day = Number(numbers[order.day]);
42155
+ const month = Number(numbers[order.month]);
42156
+ const year = Number(numbers[order.year]);
42157
+ const parsed = new Date(year, month - 1, day);
42158
+ const roundTripsBack = parsed.getDate() === day && parsed.getMonth() === month - 1 && parsed.getFullYear() === year;
42159
+ return roundTripsBack ? parsed : null;
42160
+ }
42161
+ // Em que posicao dia, mes e ano aparecem no dateFormat configurado - o campo pode
42162
+ // estar como dd/MM/yyyy, MM/dd/yyyy ou yyyy-MM-dd conforme o locale.
42163
+ dateFormatOrder() {
42164
+ const parts = [
42165
+ { key: 'day', position: this.dateFormat.indexOf('dd') },
42166
+ { key: 'month', position: this.dateFormat.indexOf('MM') },
42167
+ { key: 'year', position: this.dateFormat.indexOf('yyyy') }
42168
+ ];
42169
+ if (parts.some((part) => part.position < 0)) {
42170
+ return null;
42171
+ }
42172
+ const sorted = [...parts].sort((a, b) => a.position - b.position);
42173
+ return {
42174
+ day: sorted.findIndex((part) => part.key === 'day'),
42175
+ month: sorted.findIndex((part) => part.key === 'month'),
42176
+ year: sorted.findIndex((part) => part.key === 'year')
42177
+ };
42178
+ }
42179
+ // Os nomes vinham fixos em ingles no codigo. Intl resolve pelo idioma ativo sem
42180
+ // precisar de chave de traducao pra cada mes e cada dia - e e o mesmo caminho que
42181
+ // o chat.component.ts ja usa na lib.
42182
+ //
42183
+ // O ano de referencia e arbitrario: so precisa de um domingo conhecido (2023-01-01)
42184
+ // e de um dia 1 de cada mes.
42185
+ localizedWeekDayNames(lang) {
42186
+ const formatador = new Intl.DateTimeFormat(lang || 'pt', { weekday: 'short' });
42187
+ return Array.from({ length: DAYS_IN_WEEK }, (_, day) => this.semPontoFinal(formatador.format(new Date(2023, 0, 1 + day))));
42188
+ }
42189
+ localizedMonthNames(lang, estilo) {
42190
+ const formatador = new Intl.DateTimeFormat(lang || 'pt', { month: estilo });
42191
+ return Array.from({ length: MONTHS_IN_YEAR }, (_, month) => this.semPontoFinal(formatador.format(new Date(2023, month, 1))));
42192
+ }
42193
+ // pt abrevia com ponto ("jan.", "dom."); no cabecalho do calendario o ponto so
42194
+ // ocupa espaco numa coluna que ja e estreita.
42195
+ semPontoFinal(text) {
42196
+ return text.endsWith('.') ? text.slice(0, -1) : text;
42197
+ }
41848
42198
  formatDate(date) {
41849
42199
  const d = date.getDate().toString().padStart(2, '0');
41850
42200
  const m = (date.getMonth() + 1).toString().padStart(2, '0');
@@ -41875,7 +42225,7 @@ class DatepickerComponent extends InputsComponent {
41875
42225
  return n.toString().padStart(2, '0');
41876
42226
  }
41877
42227
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatepickerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
41878
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DatepickerComponent, isStandalone: true, selector: "sdc-datepicker", inputs: { mode: "mode", selectionMode: "selectionMode", showIcon: "showIcon", icon: "icon", min: "min", max: "max", defaultDate: "defaultDate", dateFormat: "dateFormat", hourFormat: "hourFormat", minuteStep: "minuteStep", showSeconds: "showSeconds", rangeSeparator: "rangeSeparator", showOnFocus: "showOnFocus", readonlyInput: "readonlyInput", firstDayOfWeek: "firstDayOfWeek", showButtonBar: "showButtonBar", showClear: "showClear", disabledDates: "disabledDates", disabledDays: "disabledDays" }, outputs: { selected: "selected", closed: "closed", monthChange: "monthChange", yearChange: "yearChange" }, providers: [
42228
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DatepickerComponent, isStandalone: true, selector: "sdc-datepicker", inputs: { mode: "mode", selectionMode: "selectionMode", showIcon: "showIcon", icon: "icon", min: "min", max: "max", defaultDate: "defaultDate", dateFormat: "dateFormat", allowTyping: "allowTyping", hourFormat: "hourFormat", minuteStep: "minuteStep", showSeconds: "showSeconds", rangeSeparator: "rangeSeparator", showOnFocus: "showOnFocus", readonlyInput: "readonlyInput", firstDayOfWeek: "firstDayOfWeek", showButtonBar: "showButtonBar", showClear: "showClear", disabledDates: "disabledDates", disabledDays: "disabledDays" }, outputs: { selected: "selected", closed: "closed", monthChange: "monthChange", yearChange: "yearChange" }, providers: [
41879
42229
  {
41880
42230
  provide: NG_VALUE_ACCESSOR,
41881
42231
  useExisting: forwardRef(() => DatepickerComponent),
@@ -41886,7 +42236,7 @@ class DatepickerComponent extends InputsComponent {
41886
42236
  useExisting: forwardRef(() => DatepickerComponent),
41887
42237
  multi: true
41888
42238
  }
41889
- ], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputRef"], descendants: true }, { propertyName: "triggerRef", first: true, predicate: ["triggerRef"], descendants: true }, { propertyName: "panelContentRef", first: true, predicate: ["panelContentRef"], descendants: true }, { propertyName: "dayButtonRefs", predicate: ["dayBtn"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"sdc-datepicker\">\n @if (labelKey()) {\n <div class=\"sdc-datepicker__label-row\">\n <label class=\"sdc-datepicker__label\" [attr.for]=\"inputId\">\n <span class=\"sdc-datepicker__label-text\">\n {{ labelKey() | translate }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [matchTriggerWidth]=\"false\"\n [restoreFocusOnClose]=\"false\"\n [trapFocus]=\"true\"\n [ariaLabel]=\"'datepicker.calendar'\"\n panelClass=\"sdc-datepicker-popover-panel\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div sdc-popover-trigger>\n <div\n class=\"sdc-datepicker__control\"\n #triggerRef\n [class.sdc-datepicker__control--invalid]=\"invalid\"\n [class.sdc-datepicker__control--disabled]=\"disabled\"\n [ngStyle]=\"getInputStyle()\"\n >\n <div class=\"sdc-datepicker__value\">\n <input\n #inputRef\n [id]=\"inputId\"\n class=\"sdc-datepicker__input\"\n type=\"text\"\n [disabled]=\"disabled\"\n [readOnly]=\"readonlyInput\"\n [placeholder]=\"placeholder || dateFormat\"\n [value]=\"displayValue()\"\n [attr.aria-label]=\"labelKey() ? (labelKey() | translate) : placeholder\"\n [attr.aria-expanded]=\"panelOpen\"\n [attr.aria-haspopup]=\"'dialog'\"\n aria-autocomplete=\"none\"\n autocomplete=\"off\"\n (click)=\"onInputClick()\"\n (focus)=\"onInputFocus()\"\n (keydown)=\"onKeydown($event)\"\n />\n </div>\n\n <div class=\"sdc-datepicker__actions\">\n @if (showClear && value) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__icon-button sdc-datepicker__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'datepicker.clear' | translate\"\n (click)=\"clearValue(); $event.stopPropagation()\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n @if (showIcon) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__icon-button sdc-datepicker__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'datepicker.calendar' | translate\"\n [attr.aria-expanded]=\"panelOpen\"\n (click)=\"togglePanel(); $event.stopPropagation()\"\n >\n <i [class]=\"icon\" class=\"sdc-datepicker__icon\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <div sdc-popover-content>\n <div\n #panelContentRef\n class=\"sdc-datepicker__panel\"\n (keydown)=\"onOverlayKeydown($event)\"\n [attr.aria-label]=\"'datepicker.calendar' | translate\"\n >\n <!-- Navigation Header -->\n @if (mode !== 'time') {\n <div class=\"sdc-datepicker__header\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__nav-btn\"\n [attr.aria-label]=\"'datepicker.prev' | translate\"\n (click)=\"currentView() === 'days' ? prevMonth() : currentView() === 'months' ? prevYear() : prevYearRange()\"\n >\n <i class=\"fas fa-chevron-left\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n type=\"button\"\n class=\"sdc-datepicker__title-btn\"\n (click)=\"\n currentView() === 'days'\n ? switchToMonthView()\n : currentView() === 'months' ? switchToYearView() : null\n \"\n >\n {{ viewMonthYearLabel() }}\n </button>\n\n <button\n type=\"button\"\n class=\"sdc-datepicker__nav-btn\"\n [attr.aria-label]=\"'datepicker.next' | translate\"\n (click)=\"currentView() === 'days' ? nextMonth() : currentView() === 'months' ? nextYear() : nextYearRange()\"\n >\n <i class=\"fas fa-chevron-right\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n <!-- Days View -->\n @if (currentView() === 'days' && mode !== 'time') {\n <table class=\"sdc-datepicker__calendar\">\n <thead>\n <tr class=\"sdc-datepicker__weekdays\">\n @for (dayName of weekDayNames(); track dayName) {\n <th class=\"sdc-datepicker__weekday\" scope=\"col\">\n {{ dayName }}\n </th>\n }\n </tr>\n </thead>\n <tbody class=\"sdc-datepicker__days\" (keydown)=\"onDaysGridKeydown($event)\">\n @for (week of calendarWeeks(); track $index) {\n <tr>\n @for (day of week; track day.date.getTime()) {\n <td>\n <button\n #dayBtn\n type=\"button\"\n class=\"sdc-datepicker__day\"\n [class.sdc-datepicker__day--other-month]=\"!day.currentMonth\"\n [class.sdc-datepicker__day--today]=\"day.today\"\n [class.sdc-datepicker__day--selected]=\"day.selected\"\n [class.sdc-datepicker__day--disabled]=\"day.disabled\"\n [class.sdc-datepicker__day--in-range]=\"day.inRange\"\n [class.sdc-datepicker__day--range-start]=\"day.rangeStart\"\n [class.sdc-datepicker__day--range-end]=\"day.rangeEnd\"\n [disabled]=\"day.disabled\"\n [attr.aria-label]=\"day.date.toLocaleDateString()\"\n [attr.aria-selected]=\"day.selected\"\n [attr.aria-disabled]=\"day.disabled\"\n [attr.tabindex]=\"isDayTabStop(day) ? 0 : -1\"\n (click)=\"selectDay(day)\"\n >\n {{ day.day }}\n </button>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n\n <!-- Months View -->\n @if (currentView() === 'months') {\n <div class=\"sdc-datepicker__months-grid\">\n @for (m of calendarMonths(); track m.month) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__month-cell\"\n [class.sdc-datepicker__month-cell--selected]=\"m.selected\"\n (click)=\"selectMonth(m.month)\"\n >\n {{ m.name }}\n </button>\n }\n </div>\n }\n\n <!-- Years View -->\n @if (currentView() === 'years') {\n <div class=\"sdc-datepicker__years-grid\">\n @for (year of yearRange(); track year) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__year-cell\"\n [class.sdc-datepicker__year-cell--selected]=\"year === viewDate().getFullYear()\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n </div>\n }\n\n <!-- Time Picker -->\n @if (showTimePicker()) {\n <div class=\"sdc-datepicker__time\">\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementHours()\"\n [attr.aria-label]=\"'datepicker.incrementHour' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(hours()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementHours()\"\n [attr.aria-label]=\"'datepicker.decrementHour' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <span class=\"sdc-datepicker__time-separator\">:</span>\n\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementMinutes()\"\n [attr.aria-label]=\"'datepicker.incrementMinute' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(minutes()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementMinutes()\"\n [attr.aria-label]=\"'datepicker.decrementMinute' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n @if (showSeconds) {\n <span class=\"sdc-datepicker__time-separator\">:</span>\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementSeconds()\"\n [attr.aria-label]=\"'datepicker.incrementSecond' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(seconds()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementSeconds()\"\n [attr.aria-label]=\"'datepicker.decrementSecond' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n </div>\n\n }\n\n <!-- Footer: Today on the left, Clear + Confirm together on the right -->\n @if (showButtonBar || mode === 'datetime' || mode === 'time') {\n <div class=\"sdc-datepicker__button-bar\">\n <div>\n @if (showButtonBar && mode !== 'time') {\n <button\n type=\"button\"\n class=\"sdc-datepicker__bar-btn\"\n (click)=\"selectToday()\"\n >\n {{ 'datepicker.today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"sdc-datepicker__button-bar-end\">\n @if (showButtonBar) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__bar-btn\"\n (click)=\"clearValue()\"\n >\n {{ 'datepicker.clear' | translate }}\n </button>\n }\n @if (mode === 'datetime' || mode === 'time') {\n <button\n type=\"button\"\n class=\"sdc-datepicker__confirm-btn\"\n (click)=\"confirmDateTime()\"\n >\n {{ 'datepicker.confirm' | translate }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </sdc-popover>\n\n @if (messageKey()) {\n <small\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ messageKey() | translate }}\n </small>\n }\n</div>\n", styles: [":host{display:block}.sdc-datepicker__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-datepicker__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-datepicker-label-py, var(--sdc-form-label-py, 0));padding-bottom:var(--sdc-datepicker-label-py, var(--sdc-form-label-py, 0));min-width:0}.sdc-datepicker__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-datepicker-required-ml, var(--sdc-form-required-ml, .25rem));color:var(--sdc-datepicker-required-color, var(--sdc-error-color, #dc3545));font-weight:400}.sdc-datepicker__control{display:flex;align-items:stretch;min-height:var(--sdc-datepicker-control-height, var(--sdc-formfield-default-height, 38px));border:1px solid var(--sdc-datepicker-border-color, var(--sdc-formfield-default-border, #ced4da));border-radius:var(--sdc-datepicker-border-radius, var(--sdc-formfield-border-radius, 4px));background:var(--sdc-datepicker-bg, var(--sdc-formfield-default-bg, #fff));box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-datepicker__control:hover{border-color:var(--sdc-datepicker-hover-border, var(--sdc-formfield-focus-color, #007bff))}.sdc-datepicker__control:focus-within{border-color:var(--sdc-datepicker-focus-border, var(--sdc-formfield-focus-color, #007bff));box-shadow:var(--sdc-datepicker-focus-shadow, var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14)))}.sdc-datepicker__control--invalid,.sdc-datepicker__control--invalid:hover,.sdc-datepicker__control--invalid:focus-within{border-color:var(--sdc-datepicker-invalid-border, var(--sdc-formfield-invalid-border, #d98888));box-shadow:var(--sdc-datepicker-invalid-shadow, var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16)))}.sdc-datepicker__control--disabled,.sdc-datepicker__control--disabled:hover{background-color:var(--sdc-datepicker-disabled-bg, var(--sdc-formfield-disabled-bg, #e9ecef));border-color:var(--sdc-datepicker-border-color, var(--sdc-formfield-default-border, #ced4da));box-shadow:none;cursor:not-allowed}.sdc-datepicker__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;padding:0 .75rem}.sdc-datepicker__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-datepicker-input-line-height, var(--sdc-formfield-default-line-height, 1.5));padding:0;cursor:pointer}.sdc-datepicker__input::placeholder{color:var(--sdc-datepicker-placeholder-color, var(--sdc-form-placeholder-color, #9ca3af))}.sdc-datepicker__input:disabled{cursor:not-allowed}.sdc-datepicker__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-datepicker__icon{font-size:.875rem}.sdc-datepicker__icon-button{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;border:0;background:transparent;color:var(--sdc-button-icon-default, #333333);cursor:pointer}.sdc-datepicker__icon-button:hover:not(:disabled){background:transparent}.sdc-datepicker__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-datepicker__icon-button--toggle{min-width:2.5rem;padding:0 .75rem;border-left:1px solid var(--sdc-formfield-default-border, #ced4da)}.sdc-datepicker__panel{background:var(--sdc-datepicker-panel-bg, #fff);border:1px solid var(--sdc-datepicker-panel-border, #e5e7eb);border-radius:var(--sdc-datepicker-panel-radius, 6px);box-shadow:var(--sdc-datepicker-panel-shadow, 0 4px 12px rgba(0, 0, 0, .1));padding:0;width:var(--sdc-datepicker-panel-width, 280px);outline:none;box-sizing:border-box}.sdc-datepicker__header{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;border-bottom:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__nav-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:0;background:transparent;border-radius:var(--sdc-datepicker-nav-btn-radius, 50%);color:var(--sdc-datepicker-nav-btn-color, #374151);cursor:pointer;transition:background-color .15s ease}.sdc-datepicker__nav-btn:hover{background-color:var(--sdc-datepicker-nav-btn-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__title-btn{border:0;background:transparent;font-weight:600;font-size:var(--sdc-datepicker-title-font-size, .875rem);color:var(--sdc-datepicker-title-color, #111827);cursor:pointer;padding:.25rem .5rem;border-radius:4px;transition:background-color .15s ease}.sdc-datepicker__title-btn:hover{background-color:var(--sdc-datepicker-title-hover-bg, rgba(0, 0, 0, .04))}.sdc-datepicker__calendar{-webkit-user-select:none;user-select:none;padding:0 .5rem .5rem;border-collapse:collapse;border-spacing:0;width:100%}.sdc-datepicker__weekdays{display:grid;grid-template-columns:repeat(7,1fr);padding-top:.5rem}.sdc-datepicker__weekday{display:flex;align-items:center;justify-content:center;height:32px;font-size:var(--sdc-datepicker-weekday-font-size, .75rem);font-weight:600;color:var(--sdc-datepicker-weekday-color, #6b7280);text-transform:uppercase}.sdc-datepicker__days{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--sdc-datepicker-day-gap, 2px)}.sdc-datepicker__days>tr{display:contents}.sdc-datepicker__days td{padding:0}.sdc-datepicker__day{display:flex;align-items:center;justify-content:center;width:var(--sdc-datepicker-day-size, 32px);height:var(--sdc-datepicker-day-size, 32px);margin:0 auto;border:0;border-radius:var(--sdc-datepicker-day-radius, 50%);background:transparent;font-size:var(--sdc-datepicker-day-font-size, .75rem);color:var(--sdc-datepicker-day-color, #111827);cursor:pointer;transition:background-color .12s ease,color .12s ease;position:relative;padding:0}.sdc-datepicker__day:hover:not(:disabled):not(.sdc-datepicker__day--selected){background-color:var(--sdc-datepicker-day-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__day--other-month{color:var(--sdc-datepicker-day-other-month-color, #d1d5db)}.sdc-datepicker__day--today{border:2px solid var(--sdc-datepicker-today-border-color, var(--sdc-tab-primary, #007bff))}.sdc-datepicker__day--selected{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);font-weight:600}.sdc-datepicker__day--selected:hover{background-color:var(--sdc-datepicker-selected-hover-bg, #0056b3)}.sdc-datepicker__day--disabled{opacity:var(--sdc-datepicker-disabled-opacity, .35);cursor:not-allowed}.sdc-datepicker__day--in-range{background-color:var(--sdc-datepicker-range-bg, rgba(0, 123, 255, .1));border-radius:0}.sdc-datepicker__day--range-start{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);border-radius:var(--sdc-datepicker-day-radius, 50%) 0 0 var(--sdc-datepicker-day-radius, 50%)}.sdc-datepicker__day--range-end{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);border-radius:0 var(--sdc-datepicker-day-radius, 50%) var(--sdc-datepicker-day-radius, 50%) 0}.sdc-datepicker__months-grid,.sdc-datepicker__years-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem;padding:.75rem}.sdc-datepicker__month-cell,.sdc-datepicker__year-cell{display:flex;align-items:center;justify-content:center;padding:.625rem .5rem;border:0;border-radius:var(--sdc-datepicker-cell-radius, 6px);background:transparent;font-size:.8125rem;color:var(--sdc-datepicker-cell-color, #374151);cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__month-cell:hover,.sdc-datepicker__year-cell:hover{background-color:var(--sdc-datepicker-cell-hover-bg, rgba(0, 0, 0, .05))}.sdc-datepicker__month-cell--selected,.sdc-datepicker__year-cell--selected{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);font-weight:600}.sdc-datepicker__time{display:flex;align-items:center;justify-content:center;gap:.25rem;padding:.75rem;border-top:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__time-group{display:flex;flex-direction:column;align-items:center;gap:.125rem}.sdc-datepicker__time-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:24px;border:0;background:transparent;border-radius:4px;color:var(--sdc-datepicker-time-btn-color, #6b7280);cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__time-btn:hover{background-color:var(--sdc-datepicker-time-btn-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__time-value{font-size:var(--sdc-datepicker-time-font-size, 1.125rem);font-weight:600;color:var(--sdc-datepicker-time-value-color, #111827);min-width:2ch;text-align:center}.sdc-datepicker__time-separator{font-size:1.125rem;font-weight:600;color:var(--sdc-datepicker-time-separator-color, #6b7280);padding:0 .125rem;align-self:center}.sdc-datepicker__confirm-btn{padding:.25rem .875rem;border:0;border-radius:var(--sdc-datepicker-confirm-btn-radius, 4px);background-color:var(--sdc-datepicker-confirm-btn-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-confirm-btn-color, #fff);font-size:.8125rem;font-weight:600;cursor:pointer;transition:background-color .15s ease}.sdc-datepicker__confirm-btn:hover{background-color:var(--sdc-datepicker-confirm-btn-hover-bg, #0056b3)}.sdc-datepicker__button-bar{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;border-top:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__button-bar-end{display:flex;align-items:center;gap:.5rem}.sdc-datepicker__bar-btn{padding:.25rem .75rem;border:0;border-radius:4px;background:transparent;font-size:.8125rem;font-weight:500;color:var(--sdc-datepicker-bar-btn-color, var(--sdc-tab-primary, #007bff));cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__bar-btn:hover{background-color:var(--sdc-datepicker-bar-btn-hover-bg, rgba(0, 123, 255, .08))}.sdc-datepicker__backdrop{background:transparent}.message{display:block;margin-top:.25rem;font-size:var(--sdc-datepicker-message-font-size, .75rem);color:var(--sdc-datepicker-message-color, #6b7280)}.message.invalid{color:var(--sdc-datepicker-message-invalid-color, var(--sdc-error-color, #dc3545))}::ng-deep .sdc-datepicker-popover-panel{overflow:visible!important;max-width:none!important;max-height:none!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: PopoverComponent, selector: "sdc-popover", inputs: ["open", "disabled", "toggleOnTriggerClick", "closeOnOutsideClick", "closeOnScroll", "closeOnEscape", "trapFocus", "focusOnOpen", "restoreFocusOnClose", "ariaLabel", "appendTo", "zIndex", "offset", "placement", "role", "matchTriggerWidth", "panelWidth", "panelMinWidth", "panelMaxWidth", "panelMaxHeight", "panelClass"], outputs: ["openChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
42239
+ ], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputRef"], descendants: true }, { propertyName: "triggerRef", first: true, predicate: ["triggerRef"], descendants: true }, { propertyName: "panelContentRef", first: true, predicate: ["panelContentRef"], descendants: true }, { propertyName: "dayButtonRefs", predicate: ["dayBtn"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"sdc-datepicker\">\n @if (labelKey()) {\n <div class=\"sdc-datepicker__label-row\">\n <label class=\"sdc-datepicker__label\" [attr.for]=\"inputId\">\n <span class=\"sdc-datepicker__label-text\">\n {{ labelKey() | translate }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [matchTriggerWidth]=\"false\"\n [restoreFocusOnClose]=\"false\"\n [trapFocus]=\"true\"\n [ariaLabel]=\"'datepicker.calendar'\"\n panelClass=\"sdc-datepicker-popover-panel\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div sdc-popover-trigger>\n <div\n class=\"sdc-datepicker__control\"\n #triggerRef\n [class.sdc-datepicker__control--invalid]=\"invalid\"\n [class.sdc-datepicker__control--disabled]=\"disabled\"\n [ngStyle]=\"getInputStyle()\"\n >\n <div class=\"sdc-datepicker__value\">\n <input\n #inputRef\n [id]=\"inputId\"\n class=\"sdc-datepicker__input\"\n type=\"text\"\n [disabled]=\"disabled\"\n [readOnly]=\"readonlyInput && !allowTyping\"\n [placeholder]=\"placeholder || dateFormat\"\n [value]=\"inputValue()\"\n [attr.aria-label]=\"labelKey() ? (labelKey() | translate) : placeholder\"\n [attr.aria-expanded]=\"panelOpen\"\n [attr.aria-haspopup]=\"'dialog'\"\n aria-autocomplete=\"none\"\n autocomplete=\"off\"\n (click)=\"onInputClick()\"\n (focus)=\"onInputFocus()\"\n (input)=\"onInputTyping($event)\"\n (blur)=\"onInputBlur()\"\n (keydown)=\"onKeydown($event)\"\n />\n </div>\n\n <div class=\"sdc-datepicker__actions\">\n @if (showClear && value) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__icon-button sdc-datepicker__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'datepicker.clear' | translate\"\n (click)=\"clearValue(); $event.stopPropagation()\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n @if (showIcon) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__icon-button sdc-datepicker__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'datepicker.calendar' | translate\"\n [attr.aria-expanded]=\"panelOpen\"\n (click)=\"togglePanel(); $event.stopPropagation()\"\n >\n <i [class]=\"icon\" class=\"sdc-datepicker__icon\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <div sdc-popover-content>\n <div\n #panelContentRef\n class=\"sdc-datepicker__panel\"\n (keydown)=\"onOverlayKeydown($event)\"\n [attr.aria-label]=\"'datepicker.calendar' | translate\"\n >\n <!-- Navigation Header -->\n @if (mode !== 'time') {\n <div class=\"sdc-datepicker__header\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__nav-btn\"\n [attr.aria-label]=\"'datepicker.prev' | translate\"\n (click)=\"currentView() === 'days' ? prevMonth() : currentView() === 'months' ? prevYear() : prevYearRange()\"\n >\n <i class=\"fas fa-chevron-left\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n type=\"button\"\n class=\"sdc-datepicker__title-btn\"\n (click)=\"\n currentView() === 'days'\n ? switchToMonthView()\n : currentView() === 'months' ? switchToYearView() : null\n \"\n >\n {{ viewMonthYearLabel() }}\n </button>\n\n <button\n type=\"button\"\n class=\"sdc-datepicker__nav-btn\"\n [attr.aria-label]=\"'datepicker.next' | translate\"\n (click)=\"currentView() === 'days' ? nextMonth() : currentView() === 'months' ? nextYear() : nextYearRange()\"\n >\n <i class=\"fas fa-chevron-right\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n <!-- Days View -->\n @if (currentView() === 'days' && mode !== 'time') {\n <table class=\"sdc-datepicker__calendar\">\n <thead>\n <tr class=\"sdc-datepicker__weekdays\">\n @for (dayName of weekDayNames(); track dayName) {\n <th class=\"sdc-datepicker__weekday\" scope=\"col\">\n {{ dayName }}\n </th>\n }\n </tr>\n </thead>\n <tbody class=\"sdc-datepicker__days\" (keydown)=\"onDaysGridKeydown($event)\">\n @for (week of calendarWeeks(); track $index) {\n <tr>\n @for (day of week; track day.date.getTime()) {\n <td>\n <button\n #dayBtn\n type=\"button\"\n class=\"sdc-datepicker__day\"\n [class.sdc-datepicker__day--other-month]=\"!day.currentMonth\"\n [class.sdc-datepicker__day--today]=\"day.today\"\n [class.sdc-datepicker__day--selected]=\"day.selected\"\n [class.sdc-datepicker__day--disabled]=\"day.disabled\"\n [class.sdc-datepicker__day--in-range]=\"day.inRange\"\n [class.sdc-datepicker__day--range-start]=\"day.rangeStart\"\n [class.sdc-datepicker__day--range-end]=\"day.rangeEnd\"\n [disabled]=\"day.disabled\"\n [attr.aria-label]=\"day.date.toLocaleDateString()\"\n [attr.aria-selected]=\"day.selected\"\n [attr.aria-disabled]=\"day.disabled\"\n [attr.tabindex]=\"isDayTabStop(day) ? 0 : -1\"\n (click)=\"selectDay(day)\"\n >\n {{ day.day }}\n </button>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n\n <!-- Months View -->\n @if (currentView() === 'months') {\n <div class=\"sdc-datepicker__months-grid\">\n @for (m of calendarMonths(); track m.month) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__month-cell\"\n [class.sdc-datepicker__month-cell--selected]=\"m.selected\"\n (click)=\"selectMonth(m.month)\"\n >\n {{ m.name }}\n </button>\n }\n </div>\n }\n\n <!-- Years View -->\n @if (currentView() === 'years') {\n <div class=\"sdc-datepicker__years-grid\">\n @for (year of yearRange(); track year) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__year-cell\"\n [class.sdc-datepicker__year-cell--selected]=\"year === viewDate().getFullYear()\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n </div>\n }\n\n <!-- Time Picker -->\n @if (showTimePicker()) {\n <div class=\"sdc-datepicker__time\">\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementHours()\"\n [attr.aria-label]=\"'datepicker.incrementHour' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(hours()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementHours()\"\n [attr.aria-label]=\"'datepicker.decrementHour' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <span class=\"sdc-datepicker__time-separator\">:</span>\n\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementMinutes()\"\n [attr.aria-label]=\"'datepicker.incrementMinute' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(minutes()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementMinutes()\"\n [attr.aria-label]=\"'datepicker.decrementMinute' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n @if (showSeconds) {\n <span class=\"sdc-datepicker__time-separator\">:</span>\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementSeconds()\"\n [attr.aria-label]=\"'datepicker.incrementSecond' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(seconds()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementSeconds()\"\n [attr.aria-label]=\"'datepicker.decrementSecond' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n </div>\n\n }\n\n <!-- Footer: Today on the left, Clear + Confirm together on the right -->\n @if (showButtonBar || mode === 'datetime' || mode === 'time') {\n <div class=\"sdc-datepicker__button-bar\">\n <div>\n @if (showButtonBar && mode !== 'time') {\n <button\n type=\"button\"\n class=\"sdc-datepicker__bar-btn\"\n (click)=\"selectToday()\"\n >\n {{ 'datepicker.today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"sdc-datepicker__button-bar-end\">\n @if (showButtonBar) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__bar-btn\"\n (click)=\"clearValue()\"\n >\n {{ 'datepicker.clear' | translate }}\n </button>\n }\n @if (mode === 'datetime' || mode === 'time') {\n <button\n type=\"button\"\n class=\"sdc-datepicker__confirm-btn\"\n (click)=\"confirmDateTime()\"\n >\n {{ 'datepicker.confirm' | translate }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </sdc-popover>\n\n @if (messageKey()) {\n <small\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ messageKey() | translate }}\n </small>\n }\n</div>\n", styles: [":host{display:block}.sdc-datepicker__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-datepicker__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-datepicker-label-py, var(--sdc-form-label-py, 0));padding-bottom:var(--sdc-datepicker-label-py, var(--sdc-form-label-py, 0));min-width:0}.sdc-datepicker__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-datepicker-required-ml, var(--sdc-form-required-ml, .25rem));color:var(--sdc-datepicker-required-color, var(--sdc-error-color, #dc3545));font-weight:400}.sdc-datepicker__control{display:flex;align-items:stretch;min-height:var(--sdc-datepicker-control-height, var(--sdc-formfield-default-height, 38px));border:1px solid var(--sdc-datepicker-border-color, var(--sdc-formfield-default-border, #ced4da));border-radius:var(--sdc-datepicker-border-radius, var(--sdc-formfield-border-radius, 4px));background:var(--sdc-datepicker-bg, var(--sdc-formfield-default-bg, #fff));box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-datepicker__control:hover{border-color:var(--sdc-datepicker-hover-border, var(--sdc-formfield-focus-color, #007bff))}.sdc-datepicker__control:focus-within{border-color:var(--sdc-datepicker-focus-border, var(--sdc-formfield-focus-color, #007bff));box-shadow:var(--sdc-datepicker-focus-shadow, var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14)))}.sdc-datepicker__control--invalid,.sdc-datepicker__control--invalid:hover,.sdc-datepicker__control--invalid:focus-within{border-color:var(--sdc-datepicker-invalid-border, var(--sdc-formfield-invalid-border, #d98888));box-shadow:var(--sdc-datepicker-invalid-shadow, var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16)))}.sdc-datepicker__control--disabled,.sdc-datepicker__control--disabled:hover{background-color:var(--sdc-datepicker-disabled-bg, var(--sdc-formfield-disabled-bg, #e9ecef));border-color:var(--sdc-datepicker-border-color, var(--sdc-formfield-default-border, #ced4da));box-shadow:none;cursor:not-allowed}.sdc-datepicker__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;padding:0 .75rem}.sdc-datepicker__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-datepicker-input-line-height, var(--sdc-formfield-default-line-height, 1.5));padding:0;cursor:pointer}.sdc-datepicker__input::placeholder{color:var(--sdc-datepicker-placeholder-color, var(--sdc-form-placeholder-color, #9ca3af))}.sdc-datepicker__input:disabled{cursor:not-allowed}.sdc-datepicker__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-datepicker__icon{font-size:.875rem}.sdc-datepicker__icon-button{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;border:0;background:transparent;color:var(--sdc-button-icon-default, #333333);cursor:pointer}.sdc-datepicker__icon-button:hover:not(:disabled){background:transparent}.sdc-datepicker__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-datepicker__icon-button--toggle{min-width:2.5rem;padding:0 .75rem;border-left:1px solid var(--sdc-formfield-default-border, #ced4da)}.sdc-datepicker__panel{background:var(--sdc-datepicker-panel-bg, #fff);border:1px solid var(--sdc-datepicker-panel-border, #e5e7eb);border-radius:var(--sdc-datepicker-panel-radius, 6px);box-shadow:var(--sdc-datepicker-panel-shadow, 0 4px 12px rgba(0, 0, 0, .1));padding:0;width:var(--sdc-datepicker-panel-width, 280px);outline:none;box-sizing:border-box}.sdc-datepicker__header{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;border-bottom:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__nav-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:0;background:transparent;border-radius:var(--sdc-datepicker-nav-btn-radius, 50%);color:var(--sdc-datepicker-nav-btn-color, #374151);cursor:pointer;transition:background-color .15s ease}.sdc-datepicker__nav-btn:hover{background-color:var(--sdc-datepicker-nav-btn-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__title-btn{border:0;background:transparent;font-weight:600;font-size:var(--sdc-datepicker-title-font-size, .875rem);color:var(--sdc-datepicker-title-color, #111827);cursor:pointer;padding:.25rem .5rem;border-radius:4px;transition:background-color .15s ease}.sdc-datepicker__title-btn:hover{background-color:var(--sdc-datepicker-title-hover-bg, rgba(0, 0, 0, .04))}.sdc-datepicker__calendar{-webkit-user-select:none;user-select:none;padding:0 .5rem .5rem;border-collapse:collapse;border-spacing:0;width:100%}.sdc-datepicker__weekdays{display:grid;grid-template-columns:repeat(7,1fr);padding-top:.5rem}.sdc-datepicker__weekday{display:flex;align-items:center;justify-content:center;height:32px;font-size:var(--sdc-datepicker-weekday-font-size, .75rem);font-weight:600;color:var(--sdc-datepicker-weekday-color, #6b7280);text-transform:uppercase}.sdc-datepicker__days{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--sdc-datepicker-day-gap, 2px)}.sdc-datepicker__days>tr{display:contents}.sdc-datepicker__days td{padding:0}.sdc-datepicker__day{display:flex;align-items:center;justify-content:center;width:var(--sdc-datepicker-day-size, 32px);height:var(--sdc-datepicker-day-size, 32px);margin:0 auto;border:0;border-radius:var(--sdc-datepicker-day-radius, 50%);background:transparent;font-size:var(--sdc-datepicker-day-font-size, .75rem);color:var(--sdc-datepicker-day-color, #111827);cursor:pointer;transition:background-color .12s ease,color .12s ease;position:relative;padding:0}.sdc-datepicker__day:hover:not(:disabled):not(.sdc-datepicker__day--selected){background-color:var(--sdc-datepicker-day-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__day--other-month{color:var(--sdc-datepicker-day-other-month-color, #d1d5db)}.sdc-datepicker__day--today{border:2px solid var(--sdc-datepicker-today-border-color, var(--sdc-tab-primary, #007bff))}.sdc-datepicker__day--selected{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);font-weight:600}.sdc-datepicker__day--selected:hover{background-color:var(--sdc-datepicker-selected-hover-bg, #0056b3)}.sdc-datepicker__day--disabled{opacity:var(--sdc-datepicker-disabled-opacity, .35);cursor:not-allowed}.sdc-datepicker__day--in-range{background-color:var(--sdc-datepicker-range-bg, rgba(0, 123, 255, .1));border-radius:0}.sdc-datepicker__day--range-start{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);border-radius:var(--sdc-datepicker-day-radius, 50%) 0 0 var(--sdc-datepicker-day-radius, 50%)}.sdc-datepicker__day--range-end{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);border-radius:0 var(--sdc-datepicker-day-radius, 50%) var(--sdc-datepicker-day-radius, 50%) 0}.sdc-datepicker__months-grid,.sdc-datepicker__years-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem;padding:.75rem}.sdc-datepicker__month-cell,.sdc-datepicker__year-cell{display:flex;align-items:center;justify-content:center;padding:.625rem .5rem;border:0;border-radius:var(--sdc-datepicker-cell-radius, 6px);background:transparent;font-size:.8125rem;color:var(--sdc-datepicker-cell-color, #374151);cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__month-cell:hover,.sdc-datepicker__year-cell:hover{background-color:var(--sdc-datepicker-cell-hover-bg, rgba(0, 0, 0, .05))}.sdc-datepicker__month-cell--selected,.sdc-datepicker__year-cell--selected{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);font-weight:600}.sdc-datepicker__time{display:flex;align-items:center;justify-content:center;gap:.25rem;padding:.75rem;border-top:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__time-group{display:flex;flex-direction:column;align-items:center;gap:.125rem}.sdc-datepicker__time-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:24px;border:0;background:transparent;border-radius:4px;color:var(--sdc-datepicker-time-btn-color, #6b7280);cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__time-btn:hover{background-color:var(--sdc-datepicker-time-btn-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__time-value{font-size:var(--sdc-datepicker-time-font-size, 1.125rem);font-weight:600;color:var(--sdc-datepicker-time-value-color, #111827);min-width:2ch;text-align:center}.sdc-datepicker__time-separator{font-size:1.125rem;font-weight:600;color:var(--sdc-datepicker-time-separator-color, #6b7280);padding:0 .125rem;align-self:center}.sdc-datepicker__confirm-btn{padding:.25rem .875rem;border:0;border-radius:var(--sdc-datepicker-confirm-btn-radius, 4px);background-color:var(--sdc-datepicker-confirm-btn-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-confirm-btn-color, #fff);font-size:.8125rem;font-weight:600;cursor:pointer;transition:background-color .15s ease}.sdc-datepicker__confirm-btn:hover{background-color:var(--sdc-datepicker-confirm-btn-hover-bg, #0056b3)}.sdc-datepicker__button-bar{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;border-top:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__button-bar-end{display:flex;align-items:center;gap:.5rem}.sdc-datepicker__bar-btn{padding:.25rem .75rem;border:0;border-radius:4px;background:transparent;font-size:.8125rem;font-weight:500;color:var(--sdc-datepicker-bar-btn-color, var(--sdc-tab-primary, #007bff));cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__bar-btn:hover{background-color:var(--sdc-datepicker-bar-btn-hover-bg, rgba(0, 123, 255, .08))}.sdc-datepicker__backdrop{background:transparent}.message{display:block;margin-top:.25rem;font-size:var(--sdc-datepicker-message-font-size, .75rem);color:var(--sdc-datepicker-message-color, #6b7280)}.message.invalid{color:var(--sdc-datepicker-message-invalid-color, var(--sdc-error-color, #dc3545))}::ng-deep .sdc-datepicker-popover-panel{overflow:visible!important;max-width:none!important;max-height:none!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: PopoverComponent, selector: "sdc-popover", inputs: ["open", "disabled", "toggleOnTriggerClick", "closeOnOutsideClick", "closeOnScroll", "closeOnEscape", "trapFocus", "focusOnOpen", "restoreFocusOnClose", "ariaLabel", "appendTo", "zIndex", "offset", "placement", "role", "matchTriggerWidth", "panelWidth", "panelMinWidth", "panelMaxWidth", "panelMaxHeight", "panelClass"], outputs: ["openChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
41890
42240
  }
41891
42241
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatepickerComponent, decorators: [{
41892
42242
  type: Component,
@@ -41906,7 +42256,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
41906
42256
  useExisting: forwardRef(() => DatepickerComponent),
41907
42257
  multi: true
41908
42258
  }
41909
- ], template: "<div class=\"sdc-datepicker\">\n @if (labelKey()) {\n <div class=\"sdc-datepicker__label-row\">\n <label class=\"sdc-datepicker__label\" [attr.for]=\"inputId\">\n <span class=\"sdc-datepicker__label-text\">\n {{ labelKey() | translate }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [matchTriggerWidth]=\"false\"\n [restoreFocusOnClose]=\"false\"\n [trapFocus]=\"true\"\n [ariaLabel]=\"'datepicker.calendar'\"\n panelClass=\"sdc-datepicker-popover-panel\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div sdc-popover-trigger>\n <div\n class=\"sdc-datepicker__control\"\n #triggerRef\n [class.sdc-datepicker__control--invalid]=\"invalid\"\n [class.sdc-datepicker__control--disabled]=\"disabled\"\n [ngStyle]=\"getInputStyle()\"\n >\n <div class=\"sdc-datepicker__value\">\n <input\n #inputRef\n [id]=\"inputId\"\n class=\"sdc-datepicker__input\"\n type=\"text\"\n [disabled]=\"disabled\"\n [readOnly]=\"readonlyInput\"\n [placeholder]=\"placeholder || dateFormat\"\n [value]=\"displayValue()\"\n [attr.aria-label]=\"labelKey() ? (labelKey() | translate) : placeholder\"\n [attr.aria-expanded]=\"panelOpen\"\n [attr.aria-haspopup]=\"'dialog'\"\n aria-autocomplete=\"none\"\n autocomplete=\"off\"\n (click)=\"onInputClick()\"\n (focus)=\"onInputFocus()\"\n (keydown)=\"onKeydown($event)\"\n />\n </div>\n\n <div class=\"sdc-datepicker__actions\">\n @if (showClear && value) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__icon-button sdc-datepicker__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'datepicker.clear' | translate\"\n (click)=\"clearValue(); $event.stopPropagation()\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n @if (showIcon) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__icon-button sdc-datepicker__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'datepicker.calendar' | translate\"\n [attr.aria-expanded]=\"panelOpen\"\n (click)=\"togglePanel(); $event.stopPropagation()\"\n >\n <i [class]=\"icon\" class=\"sdc-datepicker__icon\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <div sdc-popover-content>\n <div\n #panelContentRef\n class=\"sdc-datepicker__panel\"\n (keydown)=\"onOverlayKeydown($event)\"\n [attr.aria-label]=\"'datepicker.calendar' | translate\"\n >\n <!-- Navigation Header -->\n @if (mode !== 'time') {\n <div class=\"sdc-datepicker__header\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__nav-btn\"\n [attr.aria-label]=\"'datepicker.prev' | translate\"\n (click)=\"currentView() === 'days' ? prevMonth() : currentView() === 'months' ? prevYear() : prevYearRange()\"\n >\n <i class=\"fas fa-chevron-left\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n type=\"button\"\n class=\"sdc-datepicker__title-btn\"\n (click)=\"\n currentView() === 'days'\n ? switchToMonthView()\n : currentView() === 'months' ? switchToYearView() : null\n \"\n >\n {{ viewMonthYearLabel() }}\n </button>\n\n <button\n type=\"button\"\n class=\"sdc-datepicker__nav-btn\"\n [attr.aria-label]=\"'datepicker.next' | translate\"\n (click)=\"currentView() === 'days' ? nextMonth() : currentView() === 'months' ? nextYear() : nextYearRange()\"\n >\n <i class=\"fas fa-chevron-right\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n <!-- Days View -->\n @if (currentView() === 'days' && mode !== 'time') {\n <table class=\"sdc-datepicker__calendar\">\n <thead>\n <tr class=\"sdc-datepicker__weekdays\">\n @for (dayName of weekDayNames(); track dayName) {\n <th class=\"sdc-datepicker__weekday\" scope=\"col\">\n {{ dayName }}\n </th>\n }\n </tr>\n </thead>\n <tbody class=\"sdc-datepicker__days\" (keydown)=\"onDaysGridKeydown($event)\">\n @for (week of calendarWeeks(); track $index) {\n <tr>\n @for (day of week; track day.date.getTime()) {\n <td>\n <button\n #dayBtn\n type=\"button\"\n class=\"sdc-datepicker__day\"\n [class.sdc-datepicker__day--other-month]=\"!day.currentMonth\"\n [class.sdc-datepicker__day--today]=\"day.today\"\n [class.sdc-datepicker__day--selected]=\"day.selected\"\n [class.sdc-datepicker__day--disabled]=\"day.disabled\"\n [class.sdc-datepicker__day--in-range]=\"day.inRange\"\n [class.sdc-datepicker__day--range-start]=\"day.rangeStart\"\n [class.sdc-datepicker__day--range-end]=\"day.rangeEnd\"\n [disabled]=\"day.disabled\"\n [attr.aria-label]=\"day.date.toLocaleDateString()\"\n [attr.aria-selected]=\"day.selected\"\n [attr.aria-disabled]=\"day.disabled\"\n [attr.tabindex]=\"isDayTabStop(day) ? 0 : -1\"\n (click)=\"selectDay(day)\"\n >\n {{ day.day }}\n </button>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n\n <!-- Months View -->\n @if (currentView() === 'months') {\n <div class=\"sdc-datepicker__months-grid\">\n @for (m of calendarMonths(); track m.month) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__month-cell\"\n [class.sdc-datepicker__month-cell--selected]=\"m.selected\"\n (click)=\"selectMonth(m.month)\"\n >\n {{ m.name }}\n </button>\n }\n </div>\n }\n\n <!-- Years View -->\n @if (currentView() === 'years') {\n <div class=\"sdc-datepicker__years-grid\">\n @for (year of yearRange(); track year) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__year-cell\"\n [class.sdc-datepicker__year-cell--selected]=\"year === viewDate().getFullYear()\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n </div>\n }\n\n <!-- Time Picker -->\n @if (showTimePicker()) {\n <div class=\"sdc-datepicker__time\">\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementHours()\"\n [attr.aria-label]=\"'datepicker.incrementHour' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(hours()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementHours()\"\n [attr.aria-label]=\"'datepicker.decrementHour' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <span class=\"sdc-datepicker__time-separator\">:</span>\n\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementMinutes()\"\n [attr.aria-label]=\"'datepicker.incrementMinute' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(minutes()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementMinutes()\"\n [attr.aria-label]=\"'datepicker.decrementMinute' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n @if (showSeconds) {\n <span class=\"sdc-datepicker__time-separator\">:</span>\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementSeconds()\"\n [attr.aria-label]=\"'datepicker.incrementSecond' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(seconds()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementSeconds()\"\n [attr.aria-label]=\"'datepicker.decrementSecond' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n </div>\n\n }\n\n <!-- Footer: Today on the left, Clear + Confirm together on the right -->\n @if (showButtonBar || mode === 'datetime' || mode === 'time') {\n <div class=\"sdc-datepicker__button-bar\">\n <div>\n @if (showButtonBar && mode !== 'time') {\n <button\n type=\"button\"\n class=\"sdc-datepicker__bar-btn\"\n (click)=\"selectToday()\"\n >\n {{ 'datepicker.today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"sdc-datepicker__button-bar-end\">\n @if (showButtonBar) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__bar-btn\"\n (click)=\"clearValue()\"\n >\n {{ 'datepicker.clear' | translate }}\n </button>\n }\n @if (mode === 'datetime' || mode === 'time') {\n <button\n type=\"button\"\n class=\"sdc-datepicker__confirm-btn\"\n (click)=\"confirmDateTime()\"\n >\n {{ 'datepicker.confirm' | translate }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </sdc-popover>\n\n @if (messageKey()) {\n <small\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ messageKey() | translate }}\n </small>\n }\n</div>\n", styles: [":host{display:block}.sdc-datepicker__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-datepicker__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-datepicker-label-py, var(--sdc-form-label-py, 0));padding-bottom:var(--sdc-datepicker-label-py, var(--sdc-form-label-py, 0));min-width:0}.sdc-datepicker__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-datepicker-required-ml, var(--sdc-form-required-ml, .25rem));color:var(--sdc-datepicker-required-color, var(--sdc-error-color, #dc3545));font-weight:400}.sdc-datepicker__control{display:flex;align-items:stretch;min-height:var(--sdc-datepicker-control-height, var(--sdc-formfield-default-height, 38px));border:1px solid var(--sdc-datepicker-border-color, var(--sdc-formfield-default-border, #ced4da));border-radius:var(--sdc-datepicker-border-radius, var(--sdc-formfield-border-radius, 4px));background:var(--sdc-datepicker-bg, var(--sdc-formfield-default-bg, #fff));box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-datepicker__control:hover{border-color:var(--sdc-datepicker-hover-border, var(--sdc-formfield-focus-color, #007bff))}.sdc-datepicker__control:focus-within{border-color:var(--sdc-datepicker-focus-border, var(--sdc-formfield-focus-color, #007bff));box-shadow:var(--sdc-datepicker-focus-shadow, var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14)))}.sdc-datepicker__control--invalid,.sdc-datepicker__control--invalid:hover,.sdc-datepicker__control--invalid:focus-within{border-color:var(--sdc-datepicker-invalid-border, var(--sdc-formfield-invalid-border, #d98888));box-shadow:var(--sdc-datepicker-invalid-shadow, var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16)))}.sdc-datepicker__control--disabled,.sdc-datepicker__control--disabled:hover{background-color:var(--sdc-datepicker-disabled-bg, var(--sdc-formfield-disabled-bg, #e9ecef));border-color:var(--sdc-datepicker-border-color, var(--sdc-formfield-default-border, #ced4da));box-shadow:none;cursor:not-allowed}.sdc-datepicker__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;padding:0 .75rem}.sdc-datepicker__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-datepicker-input-line-height, var(--sdc-formfield-default-line-height, 1.5));padding:0;cursor:pointer}.sdc-datepicker__input::placeholder{color:var(--sdc-datepicker-placeholder-color, var(--sdc-form-placeholder-color, #9ca3af))}.sdc-datepicker__input:disabled{cursor:not-allowed}.sdc-datepicker__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-datepicker__icon{font-size:.875rem}.sdc-datepicker__icon-button{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;border:0;background:transparent;color:var(--sdc-button-icon-default, #333333);cursor:pointer}.sdc-datepicker__icon-button:hover:not(:disabled){background:transparent}.sdc-datepicker__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-datepicker__icon-button--toggle{min-width:2.5rem;padding:0 .75rem;border-left:1px solid var(--sdc-formfield-default-border, #ced4da)}.sdc-datepicker__panel{background:var(--sdc-datepicker-panel-bg, #fff);border:1px solid var(--sdc-datepicker-panel-border, #e5e7eb);border-radius:var(--sdc-datepicker-panel-radius, 6px);box-shadow:var(--sdc-datepicker-panel-shadow, 0 4px 12px rgba(0, 0, 0, .1));padding:0;width:var(--sdc-datepicker-panel-width, 280px);outline:none;box-sizing:border-box}.sdc-datepicker__header{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;border-bottom:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__nav-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:0;background:transparent;border-radius:var(--sdc-datepicker-nav-btn-radius, 50%);color:var(--sdc-datepicker-nav-btn-color, #374151);cursor:pointer;transition:background-color .15s ease}.sdc-datepicker__nav-btn:hover{background-color:var(--sdc-datepicker-nav-btn-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__title-btn{border:0;background:transparent;font-weight:600;font-size:var(--sdc-datepicker-title-font-size, .875rem);color:var(--sdc-datepicker-title-color, #111827);cursor:pointer;padding:.25rem .5rem;border-radius:4px;transition:background-color .15s ease}.sdc-datepicker__title-btn:hover{background-color:var(--sdc-datepicker-title-hover-bg, rgba(0, 0, 0, .04))}.sdc-datepicker__calendar{-webkit-user-select:none;user-select:none;padding:0 .5rem .5rem;border-collapse:collapse;border-spacing:0;width:100%}.sdc-datepicker__weekdays{display:grid;grid-template-columns:repeat(7,1fr);padding-top:.5rem}.sdc-datepicker__weekday{display:flex;align-items:center;justify-content:center;height:32px;font-size:var(--sdc-datepicker-weekday-font-size, .75rem);font-weight:600;color:var(--sdc-datepicker-weekday-color, #6b7280);text-transform:uppercase}.sdc-datepicker__days{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--sdc-datepicker-day-gap, 2px)}.sdc-datepicker__days>tr{display:contents}.sdc-datepicker__days td{padding:0}.sdc-datepicker__day{display:flex;align-items:center;justify-content:center;width:var(--sdc-datepicker-day-size, 32px);height:var(--sdc-datepicker-day-size, 32px);margin:0 auto;border:0;border-radius:var(--sdc-datepicker-day-radius, 50%);background:transparent;font-size:var(--sdc-datepicker-day-font-size, .75rem);color:var(--sdc-datepicker-day-color, #111827);cursor:pointer;transition:background-color .12s ease,color .12s ease;position:relative;padding:0}.sdc-datepicker__day:hover:not(:disabled):not(.sdc-datepicker__day--selected){background-color:var(--sdc-datepicker-day-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__day--other-month{color:var(--sdc-datepicker-day-other-month-color, #d1d5db)}.sdc-datepicker__day--today{border:2px solid var(--sdc-datepicker-today-border-color, var(--sdc-tab-primary, #007bff))}.sdc-datepicker__day--selected{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);font-weight:600}.sdc-datepicker__day--selected:hover{background-color:var(--sdc-datepicker-selected-hover-bg, #0056b3)}.sdc-datepicker__day--disabled{opacity:var(--sdc-datepicker-disabled-opacity, .35);cursor:not-allowed}.sdc-datepicker__day--in-range{background-color:var(--sdc-datepicker-range-bg, rgba(0, 123, 255, .1));border-radius:0}.sdc-datepicker__day--range-start{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);border-radius:var(--sdc-datepicker-day-radius, 50%) 0 0 var(--sdc-datepicker-day-radius, 50%)}.sdc-datepicker__day--range-end{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);border-radius:0 var(--sdc-datepicker-day-radius, 50%) var(--sdc-datepicker-day-radius, 50%) 0}.sdc-datepicker__months-grid,.sdc-datepicker__years-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem;padding:.75rem}.sdc-datepicker__month-cell,.sdc-datepicker__year-cell{display:flex;align-items:center;justify-content:center;padding:.625rem .5rem;border:0;border-radius:var(--sdc-datepicker-cell-radius, 6px);background:transparent;font-size:.8125rem;color:var(--sdc-datepicker-cell-color, #374151);cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__month-cell:hover,.sdc-datepicker__year-cell:hover{background-color:var(--sdc-datepicker-cell-hover-bg, rgba(0, 0, 0, .05))}.sdc-datepicker__month-cell--selected,.sdc-datepicker__year-cell--selected{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);font-weight:600}.sdc-datepicker__time{display:flex;align-items:center;justify-content:center;gap:.25rem;padding:.75rem;border-top:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__time-group{display:flex;flex-direction:column;align-items:center;gap:.125rem}.sdc-datepicker__time-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:24px;border:0;background:transparent;border-radius:4px;color:var(--sdc-datepicker-time-btn-color, #6b7280);cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__time-btn:hover{background-color:var(--sdc-datepicker-time-btn-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__time-value{font-size:var(--sdc-datepicker-time-font-size, 1.125rem);font-weight:600;color:var(--sdc-datepicker-time-value-color, #111827);min-width:2ch;text-align:center}.sdc-datepicker__time-separator{font-size:1.125rem;font-weight:600;color:var(--sdc-datepicker-time-separator-color, #6b7280);padding:0 .125rem;align-self:center}.sdc-datepicker__confirm-btn{padding:.25rem .875rem;border:0;border-radius:var(--sdc-datepicker-confirm-btn-radius, 4px);background-color:var(--sdc-datepicker-confirm-btn-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-confirm-btn-color, #fff);font-size:.8125rem;font-weight:600;cursor:pointer;transition:background-color .15s ease}.sdc-datepicker__confirm-btn:hover{background-color:var(--sdc-datepicker-confirm-btn-hover-bg, #0056b3)}.sdc-datepicker__button-bar{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;border-top:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__button-bar-end{display:flex;align-items:center;gap:.5rem}.sdc-datepicker__bar-btn{padding:.25rem .75rem;border:0;border-radius:4px;background:transparent;font-size:.8125rem;font-weight:500;color:var(--sdc-datepicker-bar-btn-color, var(--sdc-tab-primary, #007bff));cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__bar-btn:hover{background-color:var(--sdc-datepicker-bar-btn-hover-bg, rgba(0, 123, 255, .08))}.sdc-datepicker__backdrop{background:transparent}.message{display:block;margin-top:.25rem;font-size:var(--sdc-datepicker-message-font-size, .75rem);color:var(--sdc-datepicker-message-color, #6b7280)}.message.invalid{color:var(--sdc-datepicker-message-invalid-color, var(--sdc-error-color, #dc3545))}::ng-deep .sdc-datepicker-popover-panel{overflow:visible!important;max-width:none!important;max-height:none!important}\n"] }]
42259
+ ], template: "<div class=\"sdc-datepicker\">\n @if (labelKey()) {\n <div class=\"sdc-datepicker__label-row\">\n <label class=\"sdc-datepicker__label\" [attr.for]=\"inputId\">\n <span class=\"sdc-datepicker__label-text\">\n {{ labelKey() | translate }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [matchTriggerWidth]=\"false\"\n [restoreFocusOnClose]=\"false\"\n [trapFocus]=\"true\"\n [ariaLabel]=\"'datepicker.calendar'\"\n panelClass=\"sdc-datepicker-popover-panel\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div sdc-popover-trigger>\n <div\n class=\"sdc-datepicker__control\"\n #triggerRef\n [class.sdc-datepicker__control--invalid]=\"invalid\"\n [class.sdc-datepicker__control--disabled]=\"disabled\"\n [ngStyle]=\"getInputStyle()\"\n >\n <div class=\"sdc-datepicker__value\">\n <input\n #inputRef\n [id]=\"inputId\"\n class=\"sdc-datepicker__input\"\n type=\"text\"\n [disabled]=\"disabled\"\n [readOnly]=\"readonlyInput && !allowTyping\"\n [placeholder]=\"placeholder || dateFormat\"\n [value]=\"inputValue()\"\n [attr.aria-label]=\"labelKey() ? (labelKey() | translate) : placeholder\"\n [attr.aria-expanded]=\"panelOpen\"\n [attr.aria-haspopup]=\"'dialog'\"\n aria-autocomplete=\"none\"\n autocomplete=\"off\"\n (click)=\"onInputClick()\"\n (focus)=\"onInputFocus()\"\n (input)=\"onInputTyping($event)\"\n (blur)=\"onInputBlur()\"\n (keydown)=\"onKeydown($event)\"\n />\n </div>\n\n <div class=\"sdc-datepicker__actions\">\n @if (showClear && value) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__icon-button sdc-datepicker__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'datepicker.clear' | translate\"\n (click)=\"clearValue(); $event.stopPropagation()\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n @if (showIcon) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__icon-button sdc-datepicker__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'datepicker.calendar' | translate\"\n [attr.aria-expanded]=\"panelOpen\"\n (click)=\"togglePanel(); $event.stopPropagation()\"\n >\n <i [class]=\"icon\" class=\"sdc-datepicker__icon\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <div sdc-popover-content>\n <div\n #panelContentRef\n class=\"sdc-datepicker__panel\"\n (keydown)=\"onOverlayKeydown($event)\"\n [attr.aria-label]=\"'datepicker.calendar' | translate\"\n >\n <!-- Navigation Header -->\n @if (mode !== 'time') {\n <div class=\"sdc-datepicker__header\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__nav-btn\"\n [attr.aria-label]=\"'datepicker.prev' | translate\"\n (click)=\"currentView() === 'days' ? prevMonth() : currentView() === 'months' ? prevYear() : prevYearRange()\"\n >\n <i class=\"fas fa-chevron-left\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n type=\"button\"\n class=\"sdc-datepicker__title-btn\"\n (click)=\"\n currentView() === 'days'\n ? switchToMonthView()\n : currentView() === 'months' ? switchToYearView() : null\n \"\n >\n {{ viewMonthYearLabel() }}\n </button>\n\n <button\n type=\"button\"\n class=\"sdc-datepicker__nav-btn\"\n [attr.aria-label]=\"'datepicker.next' | translate\"\n (click)=\"currentView() === 'days' ? nextMonth() : currentView() === 'months' ? nextYear() : nextYearRange()\"\n >\n <i class=\"fas fa-chevron-right\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n <!-- Days View -->\n @if (currentView() === 'days' && mode !== 'time') {\n <table class=\"sdc-datepicker__calendar\">\n <thead>\n <tr class=\"sdc-datepicker__weekdays\">\n @for (dayName of weekDayNames(); track dayName) {\n <th class=\"sdc-datepicker__weekday\" scope=\"col\">\n {{ dayName }}\n </th>\n }\n </tr>\n </thead>\n <tbody class=\"sdc-datepicker__days\" (keydown)=\"onDaysGridKeydown($event)\">\n @for (week of calendarWeeks(); track $index) {\n <tr>\n @for (day of week; track day.date.getTime()) {\n <td>\n <button\n #dayBtn\n type=\"button\"\n class=\"sdc-datepicker__day\"\n [class.sdc-datepicker__day--other-month]=\"!day.currentMonth\"\n [class.sdc-datepicker__day--today]=\"day.today\"\n [class.sdc-datepicker__day--selected]=\"day.selected\"\n [class.sdc-datepicker__day--disabled]=\"day.disabled\"\n [class.sdc-datepicker__day--in-range]=\"day.inRange\"\n [class.sdc-datepicker__day--range-start]=\"day.rangeStart\"\n [class.sdc-datepicker__day--range-end]=\"day.rangeEnd\"\n [disabled]=\"day.disabled\"\n [attr.aria-label]=\"day.date.toLocaleDateString()\"\n [attr.aria-selected]=\"day.selected\"\n [attr.aria-disabled]=\"day.disabled\"\n [attr.tabindex]=\"isDayTabStop(day) ? 0 : -1\"\n (click)=\"selectDay(day)\"\n >\n {{ day.day }}\n </button>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n\n <!-- Months View -->\n @if (currentView() === 'months') {\n <div class=\"sdc-datepicker__months-grid\">\n @for (m of calendarMonths(); track m.month) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__month-cell\"\n [class.sdc-datepicker__month-cell--selected]=\"m.selected\"\n (click)=\"selectMonth(m.month)\"\n >\n {{ m.name }}\n </button>\n }\n </div>\n }\n\n <!-- Years View -->\n @if (currentView() === 'years') {\n <div class=\"sdc-datepicker__years-grid\">\n @for (year of yearRange(); track year) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__year-cell\"\n [class.sdc-datepicker__year-cell--selected]=\"year === viewDate().getFullYear()\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n </div>\n }\n\n <!-- Time Picker -->\n @if (showTimePicker()) {\n <div class=\"sdc-datepicker__time\">\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementHours()\"\n [attr.aria-label]=\"'datepicker.incrementHour' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(hours()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementHours()\"\n [attr.aria-label]=\"'datepicker.decrementHour' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <span class=\"sdc-datepicker__time-separator\">:</span>\n\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementMinutes()\"\n [attr.aria-label]=\"'datepicker.incrementMinute' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(minutes()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementMinutes()\"\n [attr.aria-label]=\"'datepicker.decrementMinute' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n @if (showSeconds) {\n <span class=\"sdc-datepicker__time-separator\">:</span>\n <div class=\"sdc-datepicker__time-group\">\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"incrementSeconds()\"\n [attr.aria-label]=\"'datepicker.incrementSecond' | translate\"\n >\n <i class=\"fas fa-chevron-up\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"sdc-datepicker__time-value\">{{ padTime(seconds()) }}</span>\n <button\n type=\"button\"\n class=\"sdc-datepicker__time-btn\"\n (click)=\"decrementSeconds()\"\n [attr.aria-label]=\"'datepicker.decrementSecond' | translate\"\n >\n <i class=\"fas fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n </div>\n\n }\n\n <!-- Footer: Today on the left, Clear + Confirm together on the right -->\n @if (showButtonBar || mode === 'datetime' || mode === 'time') {\n <div class=\"sdc-datepicker__button-bar\">\n <div>\n @if (showButtonBar && mode !== 'time') {\n <button\n type=\"button\"\n class=\"sdc-datepicker__bar-btn\"\n (click)=\"selectToday()\"\n >\n {{ 'datepicker.today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"sdc-datepicker__button-bar-end\">\n @if (showButtonBar) {\n <button\n type=\"button\"\n class=\"sdc-datepicker__bar-btn\"\n (click)=\"clearValue()\"\n >\n {{ 'datepicker.clear' | translate }}\n </button>\n }\n @if (mode === 'datetime' || mode === 'time') {\n <button\n type=\"button\"\n class=\"sdc-datepicker__confirm-btn\"\n (click)=\"confirmDateTime()\"\n >\n {{ 'datepicker.confirm' | translate }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </sdc-popover>\n\n @if (messageKey()) {\n <small\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ messageKey() | translate }}\n </small>\n }\n</div>\n", styles: [":host{display:block}.sdc-datepicker__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-datepicker__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-datepicker-label-py, var(--sdc-form-label-py, 0));padding-bottom:var(--sdc-datepicker-label-py, var(--sdc-form-label-py, 0));min-width:0}.sdc-datepicker__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-datepicker-required-ml, var(--sdc-form-required-ml, .25rem));color:var(--sdc-datepicker-required-color, var(--sdc-error-color, #dc3545));font-weight:400}.sdc-datepicker__control{display:flex;align-items:stretch;min-height:var(--sdc-datepicker-control-height, var(--sdc-formfield-default-height, 38px));border:1px solid var(--sdc-datepicker-border-color, var(--sdc-formfield-default-border, #ced4da));border-radius:var(--sdc-datepicker-border-radius, var(--sdc-formfield-border-radius, 4px));background:var(--sdc-datepicker-bg, var(--sdc-formfield-default-bg, #fff));box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-datepicker__control:hover{border-color:var(--sdc-datepicker-hover-border, var(--sdc-formfield-focus-color, #007bff))}.sdc-datepicker__control:focus-within{border-color:var(--sdc-datepicker-focus-border, var(--sdc-formfield-focus-color, #007bff));box-shadow:var(--sdc-datepicker-focus-shadow, var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14)))}.sdc-datepicker__control--invalid,.sdc-datepicker__control--invalid:hover,.sdc-datepicker__control--invalid:focus-within{border-color:var(--sdc-datepicker-invalid-border, var(--sdc-formfield-invalid-border, #d98888));box-shadow:var(--sdc-datepicker-invalid-shadow, var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16)))}.sdc-datepicker__control--disabled,.sdc-datepicker__control--disabled:hover{background-color:var(--sdc-datepicker-disabled-bg, var(--sdc-formfield-disabled-bg, #e9ecef));border-color:var(--sdc-datepicker-border-color, var(--sdc-formfield-default-border, #ced4da));box-shadow:none;cursor:not-allowed}.sdc-datepicker__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;padding:0 .75rem}.sdc-datepicker__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-datepicker-input-line-height, var(--sdc-formfield-default-line-height, 1.5));padding:0;cursor:pointer}.sdc-datepicker__input::placeholder{color:var(--sdc-datepicker-placeholder-color, var(--sdc-form-placeholder-color, #9ca3af))}.sdc-datepicker__input:disabled{cursor:not-allowed}.sdc-datepicker__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-datepicker__icon{font-size:.875rem}.sdc-datepicker__icon-button{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;border:0;background:transparent;color:var(--sdc-button-icon-default, #333333);cursor:pointer}.sdc-datepicker__icon-button:hover:not(:disabled){background:transparent}.sdc-datepicker__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-datepicker__icon-button--toggle{min-width:2.5rem;padding:0 .75rem;border-left:1px solid var(--sdc-formfield-default-border, #ced4da)}.sdc-datepicker__panel{background:var(--sdc-datepicker-panel-bg, #fff);border:1px solid var(--sdc-datepicker-panel-border, #e5e7eb);border-radius:var(--sdc-datepicker-panel-radius, 6px);box-shadow:var(--sdc-datepicker-panel-shadow, 0 4px 12px rgba(0, 0, 0, .1));padding:0;width:var(--sdc-datepicker-panel-width, 280px);outline:none;box-sizing:border-box}.sdc-datepicker__header{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;border-bottom:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__nav-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:0;background:transparent;border-radius:var(--sdc-datepicker-nav-btn-radius, 50%);color:var(--sdc-datepicker-nav-btn-color, #374151);cursor:pointer;transition:background-color .15s ease}.sdc-datepicker__nav-btn:hover{background-color:var(--sdc-datepicker-nav-btn-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__title-btn{border:0;background:transparent;font-weight:600;font-size:var(--sdc-datepicker-title-font-size, .875rem);color:var(--sdc-datepicker-title-color, #111827);cursor:pointer;padding:.25rem .5rem;border-radius:4px;transition:background-color .15s ease}.sdc-datepicker__title-btn:hover{background-color:var(--sdc-datepicker-title-hover-bg, rgba(0, 0, 0, .04))}.sdc-datepicker__calendar{-webkit-user-select:none;user-select:none;padding:0 .5rem .5rem;border-collapse:collapse;border-spacing:0;width:100%}.sdc-datepicker__weekdays{display:grid;grid-template-columns:repeat(7,1fr);padding-top:.5rem}.sdc-datepicker__weekday{display:flex;align-items:center;justify-content:center;height:32px;font-size:var(--sdc-datepicker-weekday-font-size, .75rem);font-weight:600;color:var(--sdc-datepicker-weekday-color, #6b7280);text-transform:uppercase}.sdc-datepicker__days{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--sdc-datepicker-day-gap, 2px)}.sdc-datepicker__days>tr{display:contents}.sdc-datepicker__days td{padding:0}.sdc-datepicker__day{display:flex;align-items:center;justify-content:center;width:var(--sdc-datepicker-day-size, 32px);height:var(--sdc-datepicker-day-size, 32px);margin:0 auto;border:0;border-radius:var(--sdc-datepicker-day-radius, 50%);background:transparent;font-size:var(--sdc-datepicker-day-font-size, .75rem);color:var(--sdc-datepicker-day-color, #111827);cursor:pointer;transition:background-color .12s ease,color .12s ease;position:relative;padding:0}.sdc-datepicker__day:hover:not(:disabled):not(.sdc-datepicker__day--selected){background-color:var(--sdc-datepicker-day-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__day--other-month{color:var(--sdc-datepicker-day-other-month-color, #d1d5db)}.sdc-datepicker__day--today{border:2px solid var(--sdc-datepicker-today-border-color, var(--sdc-tab-primary, #007bff))}.sdc-datepicker__day--selected{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);font-weight:600}.sdc-datepicker__day--selected:hover{background-color:var(--sdc-datepicker-selected-hover-bg, #0056b3)}.sdc-datepicker__day--disabled{opacity:var(--sdc-datepicker-disabled-opacity, .35);cursor:not-allowed}.sdc-datepicker__day--in-range{background-color:var(--sdc-datepicker-range-bg, rgba(0, 123, 255, .1));border-radius:0}.sdc-datepicker__day--range-start{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);border-radius:var(--sdc-datepicker-day-radius, 50%) 0 0 var(--sdc-datepicker-day-radius, 50%)}.sdc-datepicker__day--range-end{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);border-radius:0 var(--sdc-datepicker-day-radius, 50%) var(--sdc-datepicker-day-radius, 50%) 0}.sdc-datepicker__months-grid,.sdc-datepicker__years-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem;padding:.75rem}.sdc-datepicker__month-cell,.sdc-datepicker__year-cell{display:flex;align-items:center;justify-content:center;padding:.625rem .5rem;border:0;border-radius:var(--sdc-datepicker-cell-radius, 6px);background:transparent;font-size:.8125rem;color:var(--sdc-datepicker-cell-color, #374151);cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__month-cell:hover,.sdc-datepicker__year-cell:hover{background-color:var(--sdc-datepicker-cell-hover-bg, rgba(0, 0, 0, .05))}.sdc-datepicker__month-cell--selected,.sdc-datepicker__year-cell--selected{background-color:var(--sdc-datepicker-selected-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-selected-color, #fff);font-weight:600}.sdc-datepicker__time{display:flex;align-items:center;justify-content:center;gap:.25rem;padding:.75rem;border-top:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__time-group{display:flex;flex-direction:column;align-items:center;gap:.125rem}.sdc-datepicker__time-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:24px;border:0;background:transparent;border-radius:4px;color:var(--sdc-datepicker-time-btn-color, #6b7280);cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__time-btn:hover{background-color:var(--sdc-datepicker-time-btn-hover-bg, rgba(0, 0, 0, .06))}.sdc-datepicker__time-value{font-size:var(--sdc-datepicker-time-font-size, 1.125rem);font-weight:600;color:var(--sdc-datepicker-time-value-color, #111827);min-width:2ch;text-align:center}.sdc-datepicker__time-separator{font-size:1.125rem;font-weight:600;color:var(--sdc-datepicker-time-separator-color, #6b7280);padding:0 .125rem;align-self:center}.sdc-datepicker__confirm-btn{padding:.25rem .875rem;border:0;border-radius:var(--sdc-datepicker-confirm-btn-radius, 4px);background-color:var(--sdc-datepicker-confirm-btn-bg, var(--sdc-tab-primary, #007bff));color:var(--sdc-datepicker-confirm-btn-color, #fff);font-size:.8125rem;font-weight:600;cursor:pointer;transition:background-color .15s ease}.sdc-datepicker__confirm-btn:hover{background-color:var(--sdc-datepicker-confirm-btn-hover-bg, #0056b3)}.sdc-datepicker__button-bar{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;border-top:1px solid var(--sdc-datepicker-separator-color, #e5e7eb)}.sdc-datepicker__button-bar-end{display:flex;align-items:center;gap:.5rem}.sdc-datepicker__bar-btn{padding:.25rem .75rem;border:0;border-radius:4px;background:transparent;font-size:.8125rem;font-weight:500;color:var(--sdc-datepicker-bar-btn-color, var(--sdc-tab-primary, #007bff));cursor:pointer;transition:background-color .12s ease}.sdc-datepicker__bar-btn:hover{background-color:var(--sdc-datepicker-bar-btn-hover-bg, rgba(0, 123, 255, .08))}.sdc-datepicker__backdrop{background:transparent}.message{display:block;margin-top:.25rem;font-size:var(--sdc-datepicker-message-font-size, .75rem);color:var(--sdc-datepicker-message-color, #6b7280)}.message.invalid{color:var(--sdc-datepicker-message-invalid-color, var(--sdc-error-color, #dc3545))}::ng-deep .sdc-datepicker-popover-panel{overflow:visible!important;max-width:none!important;max-height:none!important}\n"] }]
41910
42260
  }], propDecorators: { mode: [{
41911
42261
  type: Input
41912
42262
  }], selectionMode: [{
@@ -41923,6 +42273,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
41923
42273
  type: Input
41924
42274
  }], dateFormat: [{
41925
42275
  type: Input
42276
+ }], allowTyping: [{
42277
+ type: Input
41926
42278
  }], hourFormat: [{
41927
42279
  type: Input
41928
42280
  }], minuteStep: [{
@@ -43206,5 +43558,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
43206
43558
  * Generated bundle index. Do not edit.
43207
43559
  */
43208
43560
 
43209
- export { ACCORDION_DEFAULT_ACTION_ARIA_LABEL, ACCORDION_DEFAULT_CACHE, ACCORDION_DEFAULT_INFO_ARIA_LABEL, ACCORDION_DEFAULT_MULTIPLE, ACCORDION_DEFAULT_SWITCH_ARIA_LABEL, ACCORDION_DEFAULT_TOGGLE_ARIA_LABEL, ACCORDION_DEFAULT_VALIDATION_ICON, ACCORDION_DEFAULT_VALIDATION_ICON_COLOR, ALERT_DEFAULT_CLOSE_ARIA_LABEL, ALERT_DEFAULT_SEVERITY, AUTOCOMPLETE_DEFAULT_DELAY, AUTOCOMPLETE_DEFAULT_EMPTY_MESSAGE_KEY, AUTOCOMPLETE_DEFAULT_MIN_LENGTH, AUTOCOMPLETE_DEFAULT_PLACEHOLDER_KEY, AccordionComponent, AccordionItemComponent, AlertComponent, AutocompleteComponent, BADGE_DEFAULT_COLOR, BADGE_DEFAULT_ICON_POSITION, BADGE_DEFAULT_INFO_ARIA_LABEL, BADGE_DEFAULT_TYPE, BIGNUMBER_INPUT_DEFAULT_PRECISION, BIGNUMBER_INPUT_DEFAULT_SCALE, BREADCRUMB_ACTIVE_EXACT_OPTIONS, BREADCRUMB_ACTIVE_SUBSET_OPTIONS, BREADCRUMB_DEFAULT_TARGET_HOME, BREADCRUMB_HOME_ICON_CLASS, BREADCRUMB_INDEX_ZERO, BadgeComponent, BignumberInputComponent, BreadcrumbComponent, ButtonComponent, CALENDAR_MASK_DEFAULT_FORMAT, CARD_COLLAPSE_CATEGORY_ARIA_LABEL_KEY, CARD_COLLAPSE_DESCRIPTION_ARIA_LABEL_KEY, CARD_COLLAPSE_NAME_ARIA_LABEL_KEY, CARD_DEFAULT_CATEGORY_MAX_LENGTH, CARD_DEFAULT_DESCRIPTION_MAX_LENGTH, CARD_DEFAULT_NAME_MAX_LENGTH, CARD_EXPAND_CATEGORY_ARIA_LABEL_KEY, CARD_EXPAND_DESCRIPTION_ARIA_LABEL_KEY, CARD_EXPAND_NAME_ARIA_LABEL_KEY, CARD_LIST_FIRST_PAGE, CARD_LIST_MIN_ROWS, CARD_LIST_MIN_SKELETON_CARDS, CARD_SHOW_LESS_LABEL_KEY, CARD_SURFACE_DEFAULT_BANNER_ALT_KEY, CARD_SURFACE_TEMPLATE_BODY, CARD_SURFACE_TEMPLATE_FOOTER, CARD_SURFACE_TEMPLATE_HEADER, CHIPS_DEFAULT_INPUT_ID_PREFIX, CHIPS_DEFAULT_MAX, CHIPS_DEFAULT_MAX_LENGTH, CHIPS_DEFAULT_MAX_LENGTH_WITHOUT_TOOLTIP, CHIPS_DEFAULT_REMOVE_ARIA_LABEL, CODE_EDITOR_COPY_ERROR_MESSAGE_KEY, CODE_EDITOR_COPY_ERROR_TITLE_KEY, CODE_EDITOR_COPY_SUCCESS_MESSAGE_KEY, CODE_EDITOR_COPY_SUCCESS_TITLE_KEY, CODE_EDITOR_DEFAULT_LANGUAGE, COLLAPSE_LINK_DEFAULT_COLLAPSED_LABEL, COLLAPSE_LINK_DEFAULT_EXPANDED_LABEL, COLOR_PICKER_ACCESSIBLE_LABEL_KEY, COLOR_PICKER_DEFAULT_COLOR, COLOR_PICKER_DEFAULT_PLACEHOLDER, COLOR_PICKER_TRIGGER_LABEL_KEY, COMBOBOX_CLEAR_FIELD_LABEL_KEY, COMBOBOX_DEFAULT_MAX_SELECTED_LABELS, COMBOBOX_DEFAULT_PANEL_MAX_HEIGHT, COMBOBOX_DEFAULT_Z_INDEX, COMBOBOX_EMPTY_TEXT_KEY, COMBOBOX_EMPTY_TITLE_KEY, COMBOBOX_REMOVE_CHIP_LABEL_KEY, COMBOBOX_SELECTED_ITEMS_LABEL_KEY, CONSTANTS, CONTEXT_SELECTOR_DEFAULT_FOOTER_BUTTON_LABEL_KEY, CONTROL_ERRORS_DEFAULT_SHOW_WHEN, COUNTRY_PHONE_PICKER_DEFAULT_COUNTRIES, COUNTRY_PHONE_PICKER_DEFAULT_ORDINATION, CURRENCY_INPUT_DEFAULT_CODE, CURRENCY_SCALE_BY_CODE, CalendarMaskComponent, CardComponent, CardListComponent, CardTemplateDirective, ChatComponent, CheckboxComponent, CheckboxListComponent, ChipsComponent, CodeEditorComponent, CollapseLinkComponent, ColorPickerComponent, ComboboxComponent, ConfirmComponent, ContextSelectorComponent, ControlErrorsComponent, CountryPhonePickerComponent, CurrencyComponent, DEFAULT_CARD_LIST_OPTIONS, DEFAULT_CURRENCY_CODE, DEFAULT_FALSE_BOOLEAN_STRINGS, DEFAULT_HYPERLINK_APPEARANCE, DEFAULT_HYPERLINK_ARIA_LABEL, DEFAULT_HYPERLINK_BUTTON_HOVER_PADDING, DEFAULT_HYPERLINK_BUTTON_HOVER_RADIUS, DEFAULT_HYPERLINK_DISABLED, DEFAULT_HYPERLINK_DOMAIN_FILTER_TOKEN, DEFAULT_HYPERLINK_HOVER_STYLE, DEFAULT_HYPERLINK_HREF, DEFAULT_HYPERLINK_ICON, DEFAULT_HYPERLINK_ICON_POSITION, DEFAULT_HYPERLINK_REL, DEFAULT_HYPERLINK_TARGET, DEFAULT_HYPERLINK_TEXT, DEFAULT_HYPERLINK_UNDERLINE, DEFAULT_LOADING_STATE_BLOCK_DELAY_MS, DEFAULT_LOADING_STATE_FULLSCREEN_Z_INDEX, DEFAULT_LOADING_STATE_ID_PREFIX, DEFAULT_LOADING_STATE_INDICATOR, DEFAULT_LOADING_STATE_UNBLOCK_DELAY_MS, DEFAULT_MODAL_CLOSABLE, DEFAULT_MODAL_FOOTER_BUTTONS, DEFAULT_MODAL_HEADER, DEFAULT_MODAL_HEIGHT, DEFAULT_MODAL_ID_PREFIX, DEFAULT_MODAL_MAXIMIZABLE, DEFAULT_MODAL_MAXIMIZE, DEFAULT_MODAL_RESIZABLE, DEFAULT_MODAL_RESPONSIVE, DEFAULT_MODAL_WIDTH, DEFAULT_MODAL_Z_INDEX, DEFAULT_ROW_CARD_LIST_OPTIONS, DEFAULT_TABLE_OPTIONS, DYNAMIC_VIEW_BUILDER_COMPONENT_SELECTOR, DYNAMIC_VIEW_BUILDER_DEFAULT_CONFIG, DYNAMIC_VIEW_BUILDER_DEFAULT_TABLE_ROWS, DYNAMIC_VIEW_BUILDER_KIND, DYNAMIC_VIEW_BUILDER_SECTION_IDS, DYNAMIC_VIEW_BUILDER_TRANSLATION_PREFIX, DYNAMIC_VIEW_BUILDER_VIEW_MODE, DatepickerComponent, DoubleClickDirective, DynamicFormComponent, DynamicFormFieldDirective, DynamicFormRegistry, VisualSqlEditorComponent as DynamicViewBuilderComponent, EDITABLE_OVERLAY_CANCEL_KEY, EDITABLE_OVERLAY_EDIT_KEY, EDITABLE_OVERLAY_EMPTY_KEY, EDITABLE_OVERLAY_SAVE_KEY, EDITOR_DEFAULT_TOOLBAR_BUTTONS, EMPTY_STATE_DEFAULT_ICON_CLASS, EditableOverlayComponent, EditableOverlayEditorDirective, EditorComponent, EmptyStateComponent, EnumSeverity, FILEUPLOAD_DEFAULT_ACCEPT, FILEUPLOAD_DEFAULT_MAX_SIZE, FILEUPLOAD_IMAGE_TYPES, FileUploadComponent, FiltersComponent, GANTT_BAR_HEIGHT, GANTT_DEFAULT_BAR_COLOR, GANTT_DEFAULT_COLUMN_TITLE_KEY, GANTT_DEFAULT_VIEW_MODE, GANTT_HEADER_HEIGHT, GANTT_ROW_HEIGHT, GanttComponent, GanttSideTableComponent, GridMenuComponent, HELP_POPOVER_CLOSE_ARIA_LABEL_KEY, HELP_POPOVER_DEFAULT_ARIA_LABEL_KEY, HELP_POPOVER_DEFAULT_ARROW_POSITION, HELP_POPOVER_DEFAULT_POSITION, HELP_POPOVER_PANEL_HOST_CLASS, HYPERLINK_COLOR_VAR, HYPERLINK_REL_NOOPENER, HelpPopoverComponent, HyperlinkComponent, INFO_SIGN_DEFAULT_ARIA_LABEL, INFO_SIGN_DEFAULT_ICON_CLASS, INLINE_EDIT_ADD_INFO_KEY, INLINE_EDIT_CANCEL_KEY, INLINE_EDIT_EDIT_KEY, INLINE_EDIT_SAVE_KEY, INPUT_MASK_DEFAULT_AUTO_CLEAR, INPUT_MASK_DEFAULT_CHARACTER_PATTERN, INPUT_MASK_DEFAULT_SLOT_CHAR, INPUT_MASK_DEFAULT_UNMASK, IconPickerComponent, ImageCropperComponent, ImageCropperService, InfiniteScrollDirective, InfoSignComponent, InlineEditComponent, InlineEditField, InlineEditNumberField, InlineEditTextAreaField, InlineEditTextField, InputMaskDirective, InteractiveContentDirective, KANBAN_DRAGGING_KEY, KANBAN_ITEMS_SELECTED_KEY, KanbanComponent, KanbanEventService, KanbanTemplateDirective, LABEL_VALUE_DEFAULT_DATE_FORMAT, LABEL_VALUE_DEFAULT_EMPTY_KEY, LIST_DEFAULT_ACTION_LABEL_KEY, LIST_DEFAULT_PRIORITY, LIST_DEFAULT_SKELETON_ROWS, LIST_MIN_SKELETON_ROWS, LIST_PRIORITY_OPTIONS, LOCALIZED_NUMBER_INPUT_DEFAULT_PRECISION, LabelValueComponent, ListComponent, LoadingStateComponent, LoadingStateDirective, LocalizedNumberInputComponent, LongPressDirective, LookupComponent, MASK_DEFAULT_EMIT_MODE, MASK_DEFAULT_FORMAT, MODALC_DEFAULT_TITLE_KEY, MODAL_BODY_OVERFLOW_HIDDEN, MODAL_BODY_OVERFLOW_PROPERTY, MODAL_ESCAPE_KEY, MODAL_FOCUSABLE_SELECTOR, MODAL_TAB_KEY, MaskComponent, ModalComponent, ModalcComponent, NAVIGATION_BUTTON_NEXT_ARIA_LABEL_KEY, NAVIGATION_BUTTON_OPEN_MENU_ARIA_LABEL_KEY, NAVIGATION_BUTTON_PREVIOUS_ARIA_LABEL_KEY, NUMBER_INPUT_DEFAULT_ALIGNMENT, NUMBER_INPUT_DEFAULT_ALLOW_NEGATIVE, NUMBER_INPUT_DEFAULT_DECIMAL_FALLBACK, NUMBER_INPUT_DEFAULT_GROUP_FALLBACK, NUMBER_INPUT_DEFAULT_PRECISION, NUMBER_INPUT_DEFAULT_SCALE, NUMBER_INPUT_MIN_INTEGER_DIGITS, NUMERIC_DEFAULT_CURRENCY, NUMERIC_DEFAULT_STYLE, NavigationButtonComponent, NumberInputComponent, NumericComponent, NumericPipe, NumericService, OBJECT_CARD_COLLAPSE_TOOLTIP_KEY, OBJECT_CARD_DEFAULT_FIELDS_MIN_WIDTH_PX, OBJECT_CARD_EXPAND_ICON_ESTIMATED_WIDTH_PX, OBJECT_CARD_EXPAND_TOOLTIP_KEY, OBJECT_CARD_FIELD_ID_PREFIX, OBJECT_CARD_ID_PREFIX, OBJECT_CARD_MAIN_DEFAULT_ICON_CLASS, OBJECT_CARD_MAIN_ID_PREFIX, OBJECT_CARD_MOBILE_BREAKPOINT_PX, ObjectCardComponent, ObjectCardFieldComponent, ObjectCardMainComponent, PAGINATOR_DEFAULT_IS_MOBILE, PAGINATOR_DEFAULT_ROWS_OPTIONS, PAGINATOR_DEFAULT_SHOW_ROWS_PER_PAGE_SELECTOR, PAGINATOR_DEFAULT_TOTAL_RECORDS_LABEL, PAGINATOR_DESKTOP_WINDOW_SIZE, PAGINATOR_FIRST_PAGE_INDEX, PAGINATOR_MIN_ROWS, PAGINATOR_MOBILE_WINDOW_SIZE, PASSWORD_STRENGTH_DEFAULT_LEVEL, PASSWORD_STRENGTH_DEFAULT_POSITION, PIN_CODE_FIELD_CHARACTER_ARIA_LABEL_KEY, PIN_CODE_FIELD_DEFAULT_ALPHANUMERIC, PIN_CODE_FIELD_DEFAULT_LENGTH, PIN_CODE_FIELD_DIGIT_ARIA_LABEL_KEY, PIN_CODE_FIELD_GROUP_ARIA_LABEL_KEY, POPOVER_DEFAULT_MAX_HEIGHT, POPOVER_DEFAULT_OFFSET, POPOVER_DEFAULT_PLACEMENT, POPOVER_DEFAULT_Z_INDEX, POPOVER_VIEWPORT_MARGIN, PROGRESSBAR_DEFAULT_ARIA_LABEL, PROGRESSBAR_DEFAULT_COLOR, PROGRESSBAR_DEFAULT_FORMAT_OPTIONS, PROGRESSBAR_DEFAULT_MODE, PROGRESSBAR_MAX_VALUE, PROGRESSBAR_MIN_VALUE, PaginatorComponent, PanelComponent, PasswordStrengthComponent, PicklistComponent, PinCodeFieldComponent, PopoverComponent, ProfilePicturePickerComponent, ProgressbarComponent, RADIO_NAVIGATION_KEYS, RADIO_OPTION_NOT_SELECTED_KEY, RADIO_OPTION_SELECTED_KEY, RATING_SCALE_ARIA_LABEL_KEY, ROW_CARD_LIST_FALLBACK_INITIAL_ROWS, ROW_CARD_LIST_FIRST_PAGE, ROW_CARD_LIST_MIN_SKELETON_ROWS, RadioComponent, RatingScaleComponent, RowCardListComponent, SIDEBAR_COMPACT_WIDTH, SIDEBAR_DEFAULT_HEADER_KEY, SIDEBAR_DEFAULT_WIDTH, SLIDER_DEFAULT_ARIA_LABEL, SLIDER_DEFAULT_MAX, SLIDER_DEFAULT_MIN, SLIDER_DEFAULT_STEP, SPLIT_BUTTON_DEFAULT_MENU_ARIA_LABEL, SPLIT_BUTTON_DEFAULT_PRIORITY, SPLIT_BUTTON_DEFAULT_TOGGLE_ARIA_LABEL, SPOTLIGHT_BACK_LABEL_KEY, SPOTLIGHT_CLOSE_LABEL_KEY, SPOTLIGHT_COMPLETE_LABEL_KEY, SPOTLIGHT_DO_NOT_SHOW_AGAIN_LABEL_KEY, SPOTLIGHT_NEXT_LABEL_KEY, SPOTLIGHT_STEP_COUNTER_LABEL_KEY, SPOTLIGHT_STEP_PROGRESS_LABEL_KEY, SPOTLIGHT_UNDERSTOOD_LABEL_KEY, SQL_HELPER, STAR_RATING_ARIA_LABEL_KEY, STAR_RATING_DEFAULT_MAX, STAR_RATING_STAR_LABEL_KEY, STATS_CARD_ANIMATION_DURATION_MS, STATS_CARD_DEFAULT_COLOR, STATS_CARD_DEFAULT_ICON_CLASS, STEPPER_DEFAULT_ACTIVE_INDEX, SWITCH_DEFAULT_FALSE_LABEL_KEY, SWITCH_DEFAULT_TRUE_LABEL_KEY, ScaffoldComponent, SearchboxComponent, SelectButtonComponent, SidebarComponent, SliderComponent, SpeechRecognitionComponent, SpeechRecognitionService, LoadingStateComponent as SpinnerComponent, SplitButtonComponent, SpotlightComponent, SpotlightStepDirective, SpotlightTourService, StarRatingComponent, StatsCardComponent, StepState, StepperComponent, StepperComponent as StepsComponent, SwitchComponent, TABLE_DEFAULT_LOADING_VERTICAL_PADDING_PX, TABLE_DEFAULT_MIN_LOADING_HEIGHT_PX, TABLE_DEFAULT_ROWS_PER_PAGE, TABLE_DEFAULT_ROW_HEIGHT_PX, TABLE_DEFAULT_ROW_ID_PREVIEW_LENGTH, TABLE_DISABLED_TAG_VALUES, TABLE_EMPTY_CELL_OPTIONS, TABLE_ENABLED_TAG_VALUES, TABLE_HEX_RADIX, TABLE_INDEX_ZERO, TABLE_MENU_GAP_PX, TABLE_RGB_MAX, TABLE_TAG_BACKGROUND_ALPHA, TABLE_TAG_FOREGROUND_DARKEN_AMOUNT, TAB_ACTIVE_SUFFIX_KEY, TAB_DEFAULT_ARIA_LABEL_KEY, TAB_DEFAULT_LABEL_KEY, TEXTAREA_DEFAULT_ROWS, THUMBNAILS_LISTEN_KEY, THUMBNAILS_SELECT_ITEM_KEY, THUMBNAILS_VIEW_KEY, THUMBNAILS_WATCH_KEY, THUMBNAIL_DEFAULT_ACTION_ICON_CLASS, THUMBNAIL_DEFAULT_ICON_CLASS, THUMBNAIL_ID_PREFIX, TIERED_MENU_DEFAULT_TRIGGER_EVENT, TIERED_MENU_MOBILE_BREAKPOINT_PX, TILE_DEFAULT_TAB_INDEX, TILE_SELECT_COLUMNS, TIMELINE_DEFAULT_ACTIVE_INDEX, TIMELINE_DEFAULT_INTERACTIVE, TIMELINE_DEFAULT_ORIENTATION, TIMELINE_DEFAULT_RESPONSIVE, TIMELINE_DEFAULT_SHOW_DESCRIPTIONS, TOKEN_LIST_ID_PREFIX, TOKEN_LIST_REMOVE_ARIA_LABEL_KEY, TOKEN_LIST_REMOVE_ARIA_LABEL_PLACEHOLDER, TabComponent, TabItemComponent, TableComponent, TextToSpeechService, TextareaComponent, TextboxComponent, ThumbnailComponent, ThumbnailsComponent, TieredMenuDirective, TileComponent, TileSelectComponent, TimelineComponent, ToastComponent, ToastService, TokenListComponent, TooltipComponent, TreeComponent, VisualSqlEditorComponent, CONTEXT_SELECTOR_DEFAULT_FOOTER_BUTTON_LABEL_KEY as WORKSPACE_SWITCH_DEFAULT_FOOTER_BUTTON_LABEL_KEY, ContextSelectorComponent as WorkspaceSwitchComponent, applyMaskFormat, buildNumberInputPlaceholder, calculateNumberInputMaxLength, characterLength, clampNumberInputValue, clampRovingIndex, coerceBooleanLike, countNumberInputDigits, createDynamicViewBuilderConfig, createSqlAutoCompletionHadler, disableBodyScroll, enableBodyScroll, extractMaskRaw, filterTextWithRegExp, findNextEnabledIndex, fixComboBoxOverlay, fixDialogMask, flattenTree, focusFirstDescendant, formatNumberInputValue, formatNumericValue, getCurrencySymbol, getDimensionStyles, getFocusableElements, getKeyFilterRegExp, getNumericLocale, humanizeText, isDesktop, isFocusableElement, isMaskComplete, isMobile, isSelectedValue, isTablet, isTextAllowedByRegExp, mockRowCardList, nextSequentialId, normalizeColorPickerValue, normalizeNumberInputValue, normalizeText$1 as normalizeText, parseBooleanAttribute, parseMaskPattern, parseNumberInputValue, provideCore, provideDataCoreLib, provideFeatures, provideGlobalStyles, provideTranslations, range, resolveColorPickerPreviewColor, resolveCurrencyScale, resolveNullableTranslatableText, resolveNumberInputSeparators, resolveTranslatableText, restoreFocus, sanitizeColorPickerInput, sanitizeNumberInputValue, serviceProviders, setSelectedValue, sqlDomainFilterDecorator, sqlFormatterHandler, sqlUppercaseHandler, stableStringify, toInteger, toPositiveInteger, toggleSelectedValue, trapFocusInContainer, truncateCharacters };
43561
+ export { ACCORDION_DEFAULT_ACTION_ARIA_LABEL, ACCORDION_DEFAULT_CACHE, ACCORDION_DEFAULT_INFO_ARIA_LABEL, ACCORDION_DEFAULT_MULTIPLE, ACCORDION_DEFAULT_SWITCH_ARIA_LABEL, ACCORDION_DEFAULT_TOGGLE_ARIA_LABEL, ACCORDION_DEFAULT_VALIDATION_ICON, ACCORDION_DEFAULT_VALIDATION_ICON_COLOR, ALERT_DEFAULT_CLOSE_ARIA_LABEL, ALERT_DEFAULT_SEVERITY, AUTOCOMPLETE_DEFAULT_DELAY, AUTOCOMPLETE_DEFAULT_EMPTY_MESSAGE_KEY, AUTOCOMPLETE_DEFAULT_MIN_LENGTH, AUTOCOMPLETE_DEFAULT_PLACEHOLDER_KEY, AccordionComponent, AccordionItemComponent, AlertComponent, AutocompleteComponent, BADGE_DEFAULT_COLOR, BADGE_DEFAULT_ICON_POSITION, BADGE_DEFAULT_INFO_ARIA_LABEL, BADGE_DEFAULT_TYPE, BIGNUMBER_INPUT_DEFAULT_PRECISION, BIGNUMBER_INPUT_DEFAULT_SCALE, BREADCRUMB_ACTIVE_EXACT_OPTIONS, BREADCRUMB_ACTIVE_SUBSET_OPTIONS, BREADCRUMB_DEFAULT_TARGET_HOME, BREADCRUMB_HOME_ICON_CLASS, BREADCRUMB_INDEX_ZERO, BadgeComponent, BignumberInputComponent, BreadcrumbComponent, ButtonComponent, CALENDAR_MASK_DEFAULT_FORMAT, CARD_COLLAPSE_CATEGORY_ARIA_LABEL_KEY, CARD_COLLAPSE_DESCRIPTION_ARIA_LABEL_KEY, CARD_COLLAPSE_NAME_ARIA_LABEL_KEY, CARD_DEFAULT_CATEGORY_MAX_LENGTH, CARD_DEFAULT_DESCRIPTION_MAX_LENGTH, CARD_DEFAULT_NAME_MAX_LENGTH, CARD_EXPAND_CATEGORY_ARIA_LABEL_KEY, CARD_EXPAND_DESCRIPTION_ARIA_LABEL_KEY, CARD_EXPAND_NAME_ARIA_LABEL_KEY, CARD_LIST_FIRST_PAGE, CARD_LIST_MIN_ROWS, CARD_LIST_MIN_SKELETON_CARDS, CARD_SHOW_LESS_LABEL_KEY, CARD_SURFACE_DEFAULT_BANNER_ALT_KEY, CARD_SURFACE_TEMPLATE_BODY, CARD_SURFACE_TEMPLATE_FOOTER, CARD_SURFACE_TEMPLATE_HEADER, CHIPS_DEFAULT_INPUT_ID_PREFIX, CHIPS_DEFAULT_MAX, CHIPS_DEFAULT_MAX_LENGTH, CHIPS_DEFAULT_MAX_LENGTH_WITHOUT_TOOLTIP, CHIPS_DEFAULT_REMOVE_ARIA_LABEL, CODE_EDITOR_COPY_ERROR_MESSAGE_KEY, CODE_EDITOR_COPY_ERROR_TITLE_KEY, CODE_EDITOR_COPY_SUCCESS_MESSAGE_KEY, CODE_EDITOR_COPY_SUCCESS_TITLE_KEY, CODE_EDITOR_DEFAULT_LANGUAGE, COLLAPSE_LINK_DEFAULT_COLLAPSED_LABEL, COLLAPSE_LINK_DEFAULT_EXPANDED_LABEL, COLOR_PICKER_ACCESSIBLE_LABEL_KEY, COLOR_PICKER_DEFAULT_COLOR, COLOR_PICKER_DEFAULT_PLACEHOLDER, COLOR_PICKER_TRIGGER_LABEL_KEY, COMBOBOX_CLEAR_FIELD_LABEL_KEY, COMBOBOX_DEFAULT_MAX_SELECTED_LABELS, COMBOBOX_DEFAULT_PANEL_MAX_HEIGHT, COMBOBOX_DEFAULT_Z_INDEX, COMBOBOX_EMPTY_TEXT_KEY, COMBOBOX_EMPTY_TITLE_KEY, COMBOBOX_REMOVE_CHIP_LABEL_KEY, COMBOBOX_SELECTED_ITEMS_LABEL_KEY, CONSTANTS, CONTEXT_SELECTOR_DEFAULT_FOOTER_BUTTON_LABEL_KEY, CONTROL_ERRORS_DEFAULT_SHOW_WHEN, COUNTRY_PHONE_PICKER_DEFAULT_COUNTRIES, COUNTRY_PHONE_PICKER_DEFAULT_ORDINATION, CURRENCY_INPUT_DEFAULT_CODE, CURRENCY_SCALE_BY_CODE, CalendarMaskComponent, CardComponent, CardListComponent, CardTemplateDirective, ChatComponent, CheckboxComponent, CheckboxListComponent, ChipsComponent, CodeEditorComponent, CollapseLinkComponent, ColorPickerComponent, ComboboxComponent, ConfirmComponent, ContextSelectorComponent, ControlErrorsComponent, CountryPhonePickerComponent, CurrencyComponent, DEFAULT_CARD_LIST_OPTIONS, DEFAULT_CURRENCY_CODE, DEFAULT_FALSE_BOOLEAN_STRINGS, DEFAULT_HYPERLINK_APPEARANCE, DEFAULT_HYPERLINK_ARIA_LABEL, DEFAULT_HYPERLINK_BUTTON_HOVER_PADDING, DEFAULT_HYPERLINK_BUTTON_HOVER_RADIUS, DEFAULT_HYPERLINK_DISABLED, DEFAULT_HYPERLINK_DOMAIN_FILTER_TOKEN, DEFAULT_HYPERLINK_HOVER_STYLE, DEFAULT_HYPERLINK_HREF, DEFAULT_HYPERLINK_ICON, DEFAULT_HYPERLINK_ICON_POSITION, DEFAULT_HYPERLINK_REL, DEFAULT_HYPERLINK_TARGET, DEFAULT_HYPERLINK_TEXT, DEFAULT_HYPERLINK_UNDERLINE, DEFAULT_LOADING_STATE_BLOCK_DELAY_MS, DEFAULT_LOADING_STATE_FULLSCREEN_Z_INDEX, DEFAULT_LOADING_STATE_ID_PREFIX, DEFAULT_LOADING_STATE_INDICATOR, DEFAULT_LOADING_STATE_UNBLOCK_DELAY_MS, DEFAULT_MODAL_CLOSABLE, DEFAULT_MODAL_FOOTER_BUTTONS, DEFAULT_MODAL_HEADER, DEFAULT_MODAL_HEIGHT, DEFAULT_MODAL_ID_PREFIX, DEFAULT_MODAL_MAXIMIZABLE, DEFAULT_MODAL_MAXIMIZE, DEFAULT_MODAL_RESIZABLE, DEFAULT_MODAL_RESPONSIVE, DEFAULT_MODAL_WIDTH, DEFAULT_MODAL_Z_INDEX, DEFAULT_ROW_CARD_LIST_OPTIONS, DEFAULT_TABLE_OPTIONS, DYNAMIC_VIEW_BUILDER_COMPONENT_SELECTOR, DYNAMIC_VIEW_BUILDER_DEFAULT_CONFIG, DYNAMIC_VIEW_BUILDER_DEFAULT_TABLE_ROWS, DYNAMIC_VIEW_BUILDER_KIND, DYNAMIC_VIEW_BUILDER_SECTION_IDS, DYNAMIC_VIEW_BUILDER_TRANSLATION_PREFIX, DYNAMIC_VIEW_BUILDER_VIEW_MODE, DatepickerComponent, DoubleClickDirective, DynamicFormComponent, DynamicFormFieldDirective, DynamicFormRegistry, VisualSqlEditorComponent as DynamicViewBuilderComponent, EDITABLE_OVERLAY_CANCEL_KEY, EDITABLE_OVERLAY_EDIT_KEY, EDITABLE_OVERLAY_EMPTY_KEY, EDITABLE_OVERLAY_SAVE_KEY, EDITOR_DEFAULT_TOOLBAR_BUTTONS, EMPTY_STATE_DEFAULT_ICON_CLASS, EditableOverlayComponent, EditableOverlayEditorDirective, EditorComponent, EmptyStateComponent, EnumSeverity, FILEUPLOAD_DEFAULT_ACCEPT, FILEUPLOAD_DEFAULT_MAX_SIZE, FILEUPLOAD_IMAGE_TYPES, FileUploadComponent, FiltersComponent, GANTT_BAR_HEIGHT, GANTT_DEFAULT_BAR_COLOR, GANTT_DEFAULT_COLUMN_TITLE_KEY, GANTT_DEFAULT_VIEW_MODE, GANTT_HEADER_HEIGHT, GANTT_ROW_HEIGHT, GanttComponent, GanttSideTableComponent, GridMenuComponent, HELP_POPOVER_CLOSE_ARIA_LABEL_KEY, HELP_POPOVER_DEFAULT_ARIA_LABEL_KEY, HELP_POPOVER_DEFAULT_ARROW_POSITION, HELP_POPOVER_DEFAULT_POSITION, HELP_POPOVER_PANEL_HOST_CLASS, HYPERLINK_COLOR_VAR, HYPERLINK_REL_NOOPENER, HelpPopoverComponent, HyperlinkComponent, INFO_SIGN_DEFAULT_ARIA_LABEL, INFO_SIGN_DEFAULT_ICON_CLASS, INLINE_EDIT_ADD_INFO_KEY, INLINE_EDIT_CANCEL_KEY, INLINE_EDIT_EDIT_KEY, INLINE_EDIT_SAVE_KEY, INPUT_MASK_DEFAULT_AUTO_CLEAR, INPUT_MASK_DEFAULT_CHARACTER_PATTERN, INPUT_MASK_DEFAULT_SLOT_CHAR, INPUT_MASK_DEFAULT_UNMASK, IconPickerComponent, ImageCropperComponent, ImageCropperService, InfiniteScrollDirective, InfoSignComponent, InlineEditComponent, InlineEditField, InlineEditNumberField, InlineEditTextAreaField, InlineEditTextField, InputMaskDirective, InteractiveContentDirective, KANBAN_DRAGGING_KEY, KANBAN_ITEMS_SELECTED_KEY, KanbanComponent, KanbanEventService, KanbanTemplateDirective, LABEL_VALUE_DEFAULT_DATE_FORMAT, LABEL_VALUE_DEFAULT_EMPTY_KEY, LIST_DEFAULT_ACTION_LABEL_KEY, LIST_DEFAULT_PRIORITY, LIST_DEFAULT_SKELETON_ROWS, LIST_MIN_SKELETON_ROWS, LIST_PRIORITY_OPTIONS, LOCALIZED_NUMBER_INPUT_DEFAULT_PRECISION, LabelValueComponent, ListComponent, LoadingStateComponent, LoadingStateDirective, LocalizedNumberInputComponent, LongPressDirective, LookupComponent, MASK_DEFAULT_EMIT_MODE, MASK_DEFAULT_FORMAT, MODALC_DEFAULT_TITLE_KEY, MODAL_BODY_OVERFLOW_HIDDEN, MODAL_BODY_OVERFLOW_PROPERTY, MODAL_ESCAPE_KEY, MODAL_FOCUSABLE_SELECTOR, MODAL_TAB_KEY, MaskComponent, ModalComponent, ModalcComponent, NAVIGATION_BUTTON_NEXT_ARIA_LABEL_KEY, NAVIGATION_BUTTON_OPEN_MENU_ARIA_LABEL_KEY, NAVIGATION_BUTTON_PREVIOUS_ARIA_LABEL_KEY, NUMBER_INPUT_DEFAULT_ALIGNMENT, NUMBER_INPUT_DEFAULT_ALLOW_NEGATIVE, NUMBER_INPUT_DEFAULT_DECIMAL_FALLBACK, NUMBER_INPUT_DEFAULT_GROUP_FALLBACK, NUMBER_INPUT_DEFAULT_PRECISION, NUMBER_INPUT_DEFAULT_SCALE, NUMBER_INPUT_MIN_INTEGER_DIGITS, NUMERIC_DEFAULT_CURRENCY, NUMERIC_DEFAULT_STYLE, NavigationButtonComponent, NestedTableComponent, NumberInputComponent, NumericComponent, NumericPipe, NumericService, OBJECT_CARD_COLLAPSE_TOOLTIP_KEY, OBJECT_CARD_DEFAULT_FIELDS_MIN_WIDTH_PX, OBJECT_CARD_EXPAND_ICON_ESTIMATED_WIDTH_PX, OBJECT_CARD_EXPAND_TOOLTIP_KEY, OBJECT_CARD_FIELD_ID_PREFIX, OBJECT_CARD_ID_PREFIX, OBJECT_CARD_MAIN_DEFAULT_ICON_CLASS, OBJECT_CARD_MAIN_ID_PREFIX, OBJECT_CARD_MOBILE_BREAKPOINT_PX, ObjectCardComponent, ObjectCardFieldComponent, ObjectCardMainComponent, PAGINATOR_DEFAULT_IS_MOBILE, PAGINATOR_DEFAULT_ROWS_OPTIONS, PAGINATOR_DEFAULT_SHOW_ROWS_PER_PAGE_SELECTOR, PAGINATOR_DEFAULT_TOTAL_RECORDS_LABEL, PAGINATOR_DESKTOP_WINDOW_SIZE, PAGINATOR_FIRST_PAGE_INDEX, PAGINATOR_MIN_ROWS, PAGINATOR_MOBILE_WINDOW_SIZE, PASSWORD_STRENGTH_DEFAULT_LEVEL, PASSWORD_STRENGTH_DEFAULT_POSITION, PIN_CODE_FIELD_CHARACTER_ARIA_LABEL_KEY, PIN_CODE_FIELD_DEFAULT_ALPHANUMERIC, PIN_CODE_FIELD_DEFAULT_LENGTH, PIN_CODE_FIELD_DIGIT_ARIA_LABEL_KEY, PIN_CODE_FIELD_GROUP_ARIA_LABEL_KEY, POPOVER_DEFAULT_MAX_HEIGHT, POPOVER_DEFAULT_OFFSET, POPOVER_DEFAULT_PLACEMENT, POPOVER_DEFAULT_Z_INDEX, POPOVER_VIEWPORT_MARGIN, PROGRESSBAR_DEFAULT_ARIA_LABEL, PROGRESSBAR_DEFAULT_COLOR, PROGRESSBAR_DEFAULT_FORMAT_OPTIONS, PROGRESSBAR_DEFAULT_MODE, PROGRESSBAR_MAX_VALUE, PROGRESSBAR_MIN_VALUE, PaginatorComponent, PanelComponent, PasswordStrengthComponent, PicklistComponent, PinCodeFieldComponent, PopoverComponent, ProfilePicturePickerComponent, ProgressbarComponent, RADIO_NAVIGATION_KEYS, RADIO_OPTION_NOT_SELECTED_KEY, RADIO_OPTION_SELECTED_KEY, RATING_SCALE_ARIA_LABEL_KEY, ROW_CARD_LIST_FALLBACK_INITIAL_ROWS, ROW_CARD_LIST_FIRST_PAGE, ROW_CARD_LIST_MIN_SKELETON_ROWS, RadioComponent, RatingScaleComponent, RowCardListComponent, SIDEBAR_COMPACT_WIDTH, SIDEBAR_DEFAULT_HEADER_KEY, SIDEBAR_DEFAULT_WIDTH, SLIDER_DEFAULT_ARIA_LABEL, SLIDER_DEFAULT_MAX, SLIDER_DEFAULT_MIN, SLIDER_DEFAULT_STEP, SPLIT_BUTTON_DEFAULT_MENU_ARIA_LABEL, SPLIT_BUTTON_DEFAULT_PRIORITY, SPLIT_BUTTON_DEFAULT_TOGGLE_ARIA_LABEL, SPOTLIGHT_BACK_LABEL_KEY, SPOTLIGHT_CLOSE_LABEL_KEY, SPOTLIGHT_COMPLETE_LABEL_KEY, SPOTLIGHT_DO_NOT_SHOW_AGAIN_LABEL_KEY, SPOTLIGHT_NEXT_LABEL_KEY, SPOTLIGHT_STEP_COUNTER_LABEL_KEY, SPOTLIGHT_STEP_PROGRESS_LABEL_KEY, SPOTLIGHT_UNDERSTOOD_LABEL_KEY, SQL_HELPER, STAR_RATING_ARIA_LABEL_KEY, STAR_RATING_DEFAULT_MAX, STAR_RATING_STAR_LABEL_KEY, STATS_CARD_ANIMATION_DURATION_MS, STATS_CARD_DEFAULT_COLOR, STATS_CARD_DEFAULT_ICON_CLASS, STEPPER_DEFAULT_ACTIVE_INDEX, SWITCH_DEFAULT_FALSE_LABEL_KEY, SWITCH_DEFAULT_TRUE_LABEL_KEY, ScaffoldComponent, SearchboxComponent, SelectButtonComponent, SidebarComponent, SliderComponent, SpeechRecognitionComponent, SpeechRecognitionService, LoadingStateComponent as SpinnerComponent, SplitButtonComponent, SpotlightComponent, SpotlightStepDirective, SpotlightTourService, StarRatingComponent, StatsCardComponent, StepState, StepperComponent, StepperComponent as StepsComponent, SwitchComponent, TABLE_DEFAULT_LOADING_VERTICAL_PADDING_PX, TABLE_DEFAULT_MIN_LOADING_HEIGHT_PX, TABLE_DEFAULT_ROWS_PER_PAGE, TABLE_DEFAULT_ROW_HEIGHT_PX, TABLE_DEFAULT_ROW_ID_PREVIEW_LENGTH, TABLE_DISABLED_TAG_VALUES, TABLE_EMPTY_CELL_OPTIONS, TABLE_ENABLED_TAG_VALUES, TABLE_HEX_RADIX, TABLE_INDEX_ZERO, TABLE_MENU_GAP_PX, TABLE_RGB_MAX, TABLE_TAG_BACKGROUND_ALPHA, TABLE_TAG_FOREGROUND_DARKEN_AMOUNT, TAB_ACTIVE_SUFFIX_KEY, TAB_DEFAULT_ARIA_LABEL_KEY, TAB_DEFAULT_LABEL_KEY, TEXTAREA_DEFAULT_ROWS, THUMBNAILS_LISTEN_KEY, THUMBNAILS_SELECT_ITEM_KEY, THUMBNAILS_VIEW_KEY, THUMBNAILS_WATCH_KEY, THUMBNAIL_DEFAULT_ACTION_ICON_CLASS, THUMBNAIL_DEFAULT_ICON_CLASS, THUMBNAIL_ID_PREFIX, TIERED_MENU_DEFAULT_TRIGGER_EVENT, TIERED_MENU_MOBILE_BREAKPOINT_PX, TILE_DEFAULT_TAB_INDEX, TILE_SELECT_COLUMNS, TIMELINE_DEFAULT_ACTIVE_INDEX, TIMELINE_DEFAULT_INTERACTIVE, TIMELINE_DEFAULT_ORIENTATION, TIMELINE_DEFAULT_RESPONSIVE, TIMELINE_DEFAULT_SHOW_DESCRIPTIONS, TOKEN_LIST_ID_PREFIX, TOKEN_LIST_REMOVE_ARIA_LABEL_KEY, TOKEN_LIST_REMOVE_ARIA_LABEL_PLACEHOLDER, TabComponent, TabItemComponent, TableComponent, TextToSpeechService, TextareaComponent, TextboxComponent, ThumbnailComponent, ThumbnailsComponent, TieredMenuDirective, TileComponent, TileSelectComponent, TimelineComponent, ToastComponent, ToastService, TokenListComponent, TooltipComponent, TreeComponent, VisualSqlEditorComponent, CONTEXT_SELECTOR_DEFAULT_FOOTER_BUTTON_LABEL_KEY as WORKSPACE_SWITCH_DEFAULT_FOOTER_BUTTON_LABEL_KEY, ContextSelectorComponent as WorkspaceSwitchComponent, applyMaskFormat, buildNumberInputPlaceholder, calculateNumberInputMaxLength, characterLength, clampNumberInputValue, clampRovingIndex, coerceBooleanLike, countNumberInputDigits, createDynamicViewBuilderConfig, createSqlAutoCompletionHadler, disableBodyScroll, enableBodyScroll, extractMaskRaw, filterTextWithRegExp, findNextEnabledIndex, fixComboBoxOverlay, fixDialogMask, flattenTree, focusFirstDescendant, formatNumberInputValue, formatNumericValue, getCurrencySymbol, getDimensionStyles, getFocusableElements, getKeyFilterRegExp, getNumericLocale, humanizeText, isDesktop, isFocusableElement, isMaskComplete, isMobile, isSelectedValue, isTablet, isTextAllowedByRegExp, mockRowCardList, nextSequentialId, normalizeColorPickerValue, normalizeNumberInputValue, normalizeText$1 as normalizeText, parseBooleanAttribute, parseMaskPattern, parseNumberInputValue, provideCore, provideDataCoreLib, provideFeatures, provideGlobalStyles, provideTranslations, range, resolveColorPickerPreviewColor, resolveCurrencyScale, resolveNullableTranslatableText, resolveNumberInputSeparators, resolveTranslatableText, restoreFocus, sanitizeColorPickerInput, sanitizeNumberInputValue, serviceProviders, setSelectedValue, sqlDomainFilterDecorator, sqlFormatterHandler, sqlUppercaseHandler, stableStringify, toInteger, toPositiveInteger, toggleSelectedValue, trapFocusInContainer, truncateCharacters };
43210
43562
  //# sourceMappingURL=seniorsistemas-data-seniorx-core.mjs.map