@clr/angular 17.2.0 → 17.3.0

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 (122) hide show
  1. package/accordion/stepper/stepper-panel.d.ts +1 -1
  2. package/button/button-loading/loading-button.d.ts +2 -2
  3. package/clarity.api.md +86 -55
  4. package/data/datagrid/built-in/filters/datagrid-numeric-filter.d.ts +1 -1
  5. package/data/datagrid/built-in/filters/datagrid-string-filter.d.ts +1 -1
  6. package/data/datagrid/datagrid-detail-header.d.ts +4 -1
  7. package/data/datagrid/datagrid-detail.d.ts +5 -1
  8. package/data/datagrid/datagrid-filter.d.ts +5 -3
  9. package/data/datagrid/datagrid-if-detail.d.ts +9 -0
  10. package/data/datagrid/datagrid-pagination.d.ts +1 -1
  11. package/data/datagrid/datagrid-row.d.ts +5 -3
  12. package/data/datagrid/datagrid-virtual-scroll.directive.d.ts +5 -2
  13. package/data/datagrid/datagrid.d.ts +8 -2
  14. package/data/datagrid/enums/column-changes.enum.d.ts +2 -1
  15. package/data/datagrid/providers/column-resizer.service.d.ts +1 -1
  16. package/data/datagrid/providers/columns.service.d.ts +1 -0
  17. package/data/datagrid/providers/detail.service.d.ts +3 -0
  18. package/data/datagrid/render/cell-renderer.d.ts +1 -1
  19. package/data/datagrid/render/header-renderer.d.ts +1 -1
  20. package/data/datagrid/render/main-renderer.d.ts +2 -2
  21. package/data/datagrid/render/row-renderer.d.ts +2 -1
  22. package/data/datagrid/utils/key-navigation-grid.controller.d.ts +1 -0
  23. package/esm2020/accordion/stepper/stepper-panel.mjs +4 -1
  24. package/esm2020/button/button-loading/loading-button.mjs +1 -1
  25. package/esm2020/data/datagrid/built-in/filters/datagrid-numeric-filter.mjs +1 -1
  26. package/esm2020/data/datagrid/built-in/filters/datagrid-string-filter.mjs +1 -1
  27. package/esm2020/data/datagrid/datagrid-action-overflow.mjs +3 -1
  28. package/esm2020/data/datagrid/datagrid-column-separator.mjs +1 -1
  29. package/esm2020/data/datagrid/datagrid-detail-header.mjs +12 -6
  30. package/esm2020/data/datagrid/datagrid-detail.mjs +36 -8
  31. package/esm2020/data/datagrid/datagrid-filter.mjs +22 -13
  32. package/esm2020/data/datagrid/datagrid-if-detail.mjs +30 -7
  33. package/esm2020/data/datagrid/datagrid-pagination.mjs +2 -2
  34. package/esm2020/data/datagrid/datagrid-placeholder.mjs +5 -5
  35. package/esm2020/data/datagrid/datagrid-row.mjs +12 -4
  36. package/esm2020/data/datagrid/datagrid-virtual-scroll.directive.mjs +13 -5
  37. package/esm2020/data/datagrid/datagrid.mjs +43 -21
  38. package/esm2020/data/datagrid/enums/column-changes.enum.mjs +3 -2
  39. package/esm2020/data/datagrid/providers/column-resizer.service.mjs +1 -1
  40. package/esm2020/data/datagrid/providers/columns.service.mjs +9 -3
  41. package/esm2020/data/datagrid/providers/detail.service.mjs +10 -5
  42. package/esm2020/data/datagrid/render/cell-renderer.mjs +1 -3
  43. package/esm2020/data/datagrid/render/header-renderer.mjs +1 -1
  44. package/esm2020/data/datagrid/render/main-renderer.mjs +29 -19
  45. package/esm2020/data/datagrid/render/row-renderer.mjs +6 -3
  46. package/esm2020/data/datagrid/utils/key-navigation-grid.controller.mjs +7 -4
  47. package/esm2020/data/stack-view/stack-block.mjs +4 -2
  48. package/esm2020/data/tree-view/tree-node.mjs +2 -2
  49. package/esm2020/forms/checkbox/checkbox-container.mjs +9 -5
  50. package/esm2020/forms/checkbox/checkbox.mjs +1 -1
  51. package/esm2020/forms/combobox/combobox-container.mjs +1 -1
  52. package/esm2020/forms/combobox/combobox.mjs +1 -1
  53. package/esm2020/forms/combobox/option.mjs +5 -4
  54. package/esm2020/forms/combobox/options.mjs +1 -1
  55. package/esm2020/forms/common/abstract-container.mjs +5 -2
  56. package/esm2020/forms/datalist/datalist-input.mjs +1 -1
  57. package/esm2020/forms/datepicker/date-container.mjs +1 -1
  58. package/esm2020/forms/datepicker/date-input.mjs +1 -1
  59. package/esm2020/forms/datepicker/monthpicker.mjs +1 -1
  60. package/esm2020/forms/datepicker/yearpicker.mjs +1 -1
  61. package/esm2020/forms/password/password.mjs +1 -1
  62. package/esm2020/forms/radio/radio-container.mjs +9 -5
  63. package/esm2020/layout/nav/nav-level.mjs +16 -12
  64. package/esm2020/layout/tabs/tab-link.directive.mjs +1 -1
  65. package/esm2020/modal/modal.mjs +15 -5
  66. package/esm2020/modal/side-panel.mjs +4 -2
  67. package/esm2020/popover/common/abstract-popover.mjs +1 -1
  68. package/esm2020/popover/signpost/signpost-content.mjs +1 -1
  69. package/esm2020/popover/signpost/signpost-trigger.mjs +1 -1
  70. package/esm2020/popover/tooltip/tooltip-content.mjs +1 -1
  71. package/esm2020/timeline/timeline-step.mjs +3 -3
  72. package/esm2020/timeline/timeline.mjs +3 -3
  73. package/esm2020/utils/animations/expandable-animation/expandable-animation.mjs +1 -1
  74. package/esm2020/utils/cdk/cdk-drag.module.mjs +1 -1
  75. package/esm2020/utils/cdk/cdk-trap-focus.module.mjs +1 -1
  76. package/esm2020/utils/conditional/if-expanded.directive.mjs +1 -1
  77. package/esm2020/utils/focus/focus-on-view-init/focus-on-view-init.mjs +1 -1
  78. package/esm2020/utils/focus/focus-trap/standalone-cdk-trap-focus.directive.mjs +1 -1
  79. package/esm2020/utils/focus/key-focus/key-focus-item.mjs +1 -1
  80. package/esm2020/utils/focus/key-focus/roving-tabindex.mjs +1 -1
  81. package/esm2020/utils/i18n/common-strings.default.mjs +2 -2
  82. package/esm2020/utils/popover/popover-close-button.mjs +1 -1
  83. package/esm2020/utils/popover/providers/popover-events.service.mjs +1 -1
  84. package/esm2020/wizard/wizard-stepnav-item.mjs +13 -19
  85. package/esm2020/wizard/wizard.mjs +3 -3
  86. package/esm2020/wizard/wizard.module.mjs +3 -3
  87. package/fesm2015/clr-angular.mjs +482 -320
  88. package/fesm2015/clr-angular.mjs.map +1 -1
  89. package/fesm2020/clr-angular.mjs +473 -315
  90. package/fesm2020/clr-angular.mjs.map +1 -1
  91. package/forms/checkbox/checkbox.d.ts +1 -1
  92. package/forms/combobox/combobox-container.d.ts +1 -1
  93. package/forms/combobox/combobox.d.ts +4 -4
  94. package/forms/combobox/option.d.ts +3 -3
  95. package/forms/combobox/options.d.ts +1 -1
  96. package/forms/datalist/datalist-input.d.ts +1 -1
  97. package/forms/datepicker/date-input.d.ts +2 -2
  98. package/forms/datepicker/monthpicker.d.ts +1 -1
  99. package/forms/datepicker/yearpicker.d.ts +1 -1
  100. package/forms/password/password.d.ts +1 -1
  101. package/layout/nav/nav-level.d.ts +0 -1
  102. package/layout/tabs/tab-link.directive.d.ts +2 -2
  103. package/modal/modal.d.ts +3 -1
  104. package/modal/side-panel.d.ts +1 -1
  105. package/package.json +5 -5
  106. package/popover/common/abstract-popover.d.ts +1 -1
  107. package/popover/signpost/signpost-content.d.ts +1 -1
  108. package/popover/signpost/signpost-trigger.d.ts +1 -1
  109. package/popover/tooltip/tooltip-content.d.ts +1 -1
  110. package/src/utils/popover/README.md +1 -1
  111. package/timeline/timeline-step.d.ts +1 -1
  112. package/utils/animations/expandable-animation/expandable-animation.d.ts +1 -1
  113. package/utils/cdk/cdk-drag.module.d.ts +1 -1
  114. package/utils/cdk/cdk-trap-focus.module.d.ts +1 -1
  115. package/utils/conditional/if-expanded.directive.d.ts +1 -1
  116. package/utils/focus/focus-on-view-init/focus-on-view-init.d.ts +1 -1
  117. package/utils/focus/focus-trap/standalone-cdk-trap-focus.directive.d.ts +1 -1
  118. package/utils/focus/key-focus/key-focus-item.d.ts +2 -2
  119. package/utils/focus/key-focus/roving-tabindex.d.ts +1 -1
  120. package/utils/popover/popover-close-button.d.ts +1 -1
  121. package/utils/popover/providers/popover-events.service.d.ts +3 -3
  122. package/wizard/wizard.d.ts +1 -1
@@ -19,7 +19,6 @@ import { _RecycleViewRepeaterStrategy } from '@angular/cdk/collections';
19
19
  import * as i3$1 from '@angular/cdk/scrolling';
20
20
  import { FixedSizeVirtualScrollStrategy, CdkVirtualForOf, CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
21
21
  import * as i1$3 from '@angular/router';
22
- import '@cds/core/internal-components/close-button/register.js';
23
22
  import '@cds/core/icon/register';
24
23
 
25
24
  /*
@@ -327,7 +326,7 @@ const commonStringsDefault = {
327
326
  singleSelectionAriaLabel: 'Single selection header',
328
327
  singleActionableAriaLabel: 'Single actionable header',
329
328
  detailExpandableAriaLabel: 'Toggle more row content',
330
- datagridFilterAriaLabel: 'Toggle {COLUMN} filter',
329
+ datagridFilterAriaLabel: '{COLUMN} filter',
331
330
  datagridFilterDialogAriaLabel: 'Filter dialog',
332
331
  columnSeparatorAriaLabel: 'Column resize handle',
333
332
  columnSeparatorDescription: 'Use left or right key to resize the column',
@@ -1164,6 +1163,9 @@ class ClrStepperPanel extends ClrAccordionPanel {
1164
1163
  // set panel status on form status change only after the form becomes invalid
1165
1164
  const invalidStatusTrigger = this.formGroup.statusChanges.pipe(filter(status => status === 'INVALID'));
1166
1165
  this.subscriptions.push(this.formGroup.statusChanges.pipe(skipUntil(invalidStatusTrigger), distinctUntilChanged()).subscribe(status => {
1166
+ if (!this.formGroup.touched) {
1167
+ return;
1168
+ }
1167
1169
  if (status === 'VALID') {
1168
1170
  this.stepperService.setPanelValid(this.id);
1169
1171
  }
@@ -4771,7 +4773,10 @@ class ClrAbstractContainer {
4771
4773
  this.subscriptions = [];
4772
4774
  this.subscriptions.push(this.ifControlStateService.statusChanges.subscribe((state) => {
4773
4775
  this.state = state;
4774
- this.updateHelpers();
4776
+ // Make sure everything is updated before dispatching the values for helpers
4777
+ setTimeout(() => {
4778
+ this.updateHelpers();
4779
+ });
4775
4780
  }));
4776
4781
  this.subscriptions.push(this.ngControlService.controlChanges.subscribe(control => {
4777
4782
  this.control = control;
@@ -5639,8 +5644,10 @@ ClrCheckboxContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", v
5639
5644
  <label *ngIf="!label && addGrid()"></label>
5640
5645
  <div class="clr-control-container" [class.clr-control-inline]="clrInline" [ngClass]="controlClass()">
5641
5646
  <ng-content select="clr-checkbox-wrapper,clr-toggle-wrapper"></ng-content>
5642
- <div class="clr-subtext-wrapper">
5643
- <ng-content select="clr-control-helper" *ngIf="showHelper"></ng-content>
5647
+ <div *ngIf="showHelper" class="clr-subtext-wrapper">
5648
+ <ng-content select="clr-control-helper"></ng-content>
5649
+ </div>
5650
+ <div *ngIf="showInvalid || showValid" class="clr-subtext-wrapper">
5644
5651
  <cds-icon
5645
5652
  *ngIf="showInvalid"
5646
5653
  class="clr-validate-icon"
@@ -5669,8 +5676,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
5669
5676
  <label *ngIf="!label && addGrid()"></label>
5670
5677
  <div class="clr-control-container" [class.clr-control-inline]="clrInline" [ngClass]="controlClass()">
5671
5678
  <ng-content select="clr-checkbox-wrapper,clr-toggle-wrapper"></ng-content>
5672
- <div class="clr-subtext-wrapper">
5673
- <ng-content select="clr-control-helper" *ngIf="showHelper"></ng-content>
5679
+ <div *ngIf="showHelper" class="clr-subtext-wrapper">
5680
+ <ng-content select="clr-control-helper"></ng-content>
5681
+ </div>
5682
+ <div *ngIf="showInvalid || showValid" class="clr-subtext-wrapper">
5674
5683
  <cds-icon
5675
5684
  *ngIf="showInvalid"
5676
5685
  class="clr-validate-icon"
@@ -6860,7 +6869,8 @@ class ClrOption {
6860
6869
  this.optionProxy.id = this._id;
6861
6870
  }
6862
6871
  }
6863
- onClick() {
6872
+ onClick(event) {
6873
+ event.stopPropagation();
6864
6874
  if (this.optionSelectionService.multiselectable) {
6865
6875
  this.optionSelectionService.toggle(this.value);
6866
6876
  }
@@ -6875,7 +6885,7 @@ class ClrOption {
6875
6885
  }
6876
6886
  }
6877
6887
  ClrOption.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrOption, deps: [{ token: i0.ElementRef }, { token: ClrCommonStringsService }, { token: ComboboxFocusHandler }, { token: OptionSelectionService }], target: i0.ɵɵFactoryTarget.Component });
6878
- ClrOption.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrOption, selector: "clr-option", inputs: { optionId: ["id", "optionId"], value: ["clrValue", "value"] }, host: { listeners: { "click": "onClick()" }, properties: { "class.clr-combobox-option": "true", "attr.role": "\"option\"", "attr.tabindex": "-1", "attr.id": "optionId", "class.active": "this.selected", "class.clr-focus": "this.focusClass" } }, ngImport: i0, template: `
6888
+ ClrOption.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrOption, selector: "clr-option", inputs: { optionId: ["id", "optionId"], value: ["clrValue", "value"] }, host: { listeners: { "click": "onClick($event)" }, properties: { "class.clr-combobox-option": "true", "attr.role": "\"option\"", "attr.tabindex": "-1", "attr.id": "optionId", "class.active": "this.selected", "class.clr-focus": "this.focusClass" } }, ngImport: i0, template: `
6879
6889
  <ng-content></ng-content>
6880
6890
  <span *ngIf="selected" class="clr-sr-only">{{ commonStrings.keys.comboboxSelected }}</span>
6881
6891
  `, isInline: true, dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
@@ -6909,7 +6919,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
6909
6919
  args: ['class.clr-focus']
6910
6920
  }], onClick: [{
6911
6921
  type: HostListener,
6912
- args: ['click']
6922
+ args: ['click', ['$event']]
6913
6923
  }] } });
6914
6924
 
6915
6925
  /*
@@ -11089,8 +11099,10 @@ ClrRadioContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", vers
11089
11099
  <label *ngIf="!label && addGrid()"></label>
11090
11100
  <div class="clr-control-container" [class.clr-control-inline]="clrInline" [ngClass]="controlClass()">
11091
11101
  <ng-content select="clr-radio-wrapper"></ng-content>
11092
- <div class="clr-subtext-wrapper">
11093
- <ng-content select="clr-control-helper" *ngIf="showHelper"></ng-content>
11102
+ <div *ngIf="showHelper" class="clr-subtext-wrapper">
11103
+ <ng-content select="clr-control-helper"></ng-content>
11104
+ </div>
11105
+ <div *ngIf="showValid || showInvalid" class="clr-subtext-wrapper">
11094
11106
  <cds-icon
11095
11107
  *ngIf="showInvalid"
11096
11108
  class="clr-validate-icon"
@@ -11119,8 +11131,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
11119
11131
  <label *ngIf="!label && addGrid()"></label>
11120
11132
  <div class="clr-control-container" [class.clr-control-inline]="clrInline" [ngClass]="controlClass()">
11121
11133
  <ng-content select="clr-radio-wrapper"></ng-content>
11122
- <div class="clr-subtext-wrapper">
11123
- <ng-content select="clr-control-helper" *ngIf="showHelper"></ng-content>
11134
+ <div *ngIf="showHelper" class="clr-subtext-wrapper">
11135
+ <ng-content select="clr-control-helper"></ng-content>
11136
+ </div>
11137
+ <div *ngIf="showValid || showInvalid" class="clr-subtext-wrapper">
11124
11138
  <cds-icon
11125
11139
  *ngIf="showInvalid"
11126
11140
  class="clr-validate-icon"
@@ -12187,6 +12201,196 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12187
12201
  type: Directive
12188
12202
  }], ctorParameters: function () { return [{ type: FiltersProvider }]; } });
12189
12203
 
12204
+ /*
12205
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12206
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
12207
+ * This software is released under MIT license.
12208
+ * The full license information can be found in LICENSE in the root directory of this project.
12209
+ */
12210
+ function getTabableItems(el) {
12211
+ const tabableSelector = [
12212
+ 'a[href]',
12213
+ 'area[href]',
12214
+ 'input:not([disabled])',
12215
+ 'button:not([disabled])',
12216
+ 'select:not([disabled])',
12217
+ 'textarea:not([disabled])',
12218
+ 'iframe',
12219
+ 'object',
12220
+ 'embed',
12221
+ '*[tabindex]:not([disabled])',
12222
+ '*[contenteditable=true]',
12223
+ '[role=button]:not([disabled])',
12224
+ ].join(',');
12225
+ return Array.from(el.querySelectorAll(tabableSelector));
12226
+ }
12227
+ class KeyNavigationGridController {
12228
+ constructor(zone) {
12229
+ this.zone = zone;
12230
+ this.skipItemFocus = false;
12231
+ this.listenersAdded = false;
12232
+ this.destroy$ = new Subject();
12233
+ this._activeCell = null;
12234
+ this.config = {
12235
+ keyGridRows: '[role=row]:not(.datagrid-placeholder)',
12236
+ keyGridCells: '[role=gridcell]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), [role=columnheader]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), .datagrid-detail-caret',
12237
+ keyGrid: '[role=grid]',
12238
+ };
12239
+ }
12240
+ get grid() {
12241
+ var _a;
12242
+ return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelector(this.config.keyGrid);
12243
+ }
12244
+ get rows() {
12245
+ var _a;
12246
+ return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.config.keyGridRows);
12247
+ }
12248
+ get cells() {
12249
+ var _a;
12250
+ return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.config.keyGridCells);
12251
+ }
12252
+ ngOnDestroy() {
12253
+ this.destroy$.next();
12254
+ this.destroy$.complete();
12255
+ }
12256
+ addListeners() {
12257
+ if (this.listenersAdded) {
12258
+ return;
12259
+ }
12260
+ this.zone.runOutsideAngular(() => {
12261
+ fromEvent(this.grid, 'mousedown')
12262
+ .pipe(takeUntil(this.destroy$))
12263
+ .subscribe((e) => {
12264
+ // preserve right click for context menus & keyboard mouse control https://apple.stackexchange.com/questions/32715/how-do-i-open-the-context-menu-from-a-mac-keyboard
12265
+ if (e.buttons === 1 && !e.ctrlKey) {
12266
+ const activeCell = this.cells
12267
+ ? Array.from(this.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
12268
+ : null;
12269
+ if (activeCell) {
12270
+ this.setActiveCell(activeCell);
12271
+ }
12272
+ }
12273
+ });
12274
+ fromEvent(this.grid, 'wheel')
12275
+ .pipe(takeUntil(this.destroy$))
12276
+ .subscribe(() => {
12277
+ this.removeActiveCell();
12278
+ });
12279
+ fromEvent(this.grid, 'keydown')
12280
+ .pipe(takeUntil(this.destroy$))
12281
+ .subscribe((e) => {
12282
+ // Skip column resize events
12283
+ if (e.target.classList.contains('drag-handle') &&
12284
+ (e.code === 'ArrowLeft' || e.code === 'ArrowRight')) {
12285
+ return;
12286
+ }
12287
+ if (e.code === 'ArrowUp' ||
12288
+ e.code === 'ArrowDown' ||
12289
+ e.code === 'ArrowLeft' ||
12290
+ e.code === 'ArrowRight' ||
12291
+ e.code === 'End' ||
12292
+ e.code === 'Home' ||
12293
+ e.code === 'PageUp' ||
12294
+ e.code === 'PageDown') {
12295
+ const { x, y } = this.getNextItemCoordinate(e);
12296
+ const activeItem = this.rows
12297
+ ? Array.from(this.rows[y].querySelectorAll(this.config.keyGridCells))[x]
12298
+ : null;
12299
+ if (activeItem) {
12300
+ this.setActiveCell(activeItem);
12301
+ }
12302
+ e.preventDefault();
12303
+ }
12304
+ });
12305
+ });
12306
+ this.listenersAdded = true;
12307
+ }
12308
+ initializeKeyGrid(host) {
12309
+ this.host = host;
12310
+ this.addListeners();
12311
+ this.resetKeyGrid();
12312
+ }
12313
+ resetKeyGrid() {
12314
+ var _a;
12315
+ (_a = this.cells) === null || _a === void 0 ? void 0 : _a.forEach((i) => i.setAttribute('tabindex', '-1'));
12316
+ const firstCell = this.cells ? this.cells[0] : null;
12317
+ firstCell === null || firstCell === void 0 ? void 0 : firstCell.setAttribute('tabindex', '0');
12318
+ }
12319
+ removeActiveCell() {
12320
+ this._activeCell = null;
12321
+ }
12322
+ getActiveCell() {
12323
+ return this._activeCell;
12324
+ }
12325
+ setActiveCell(activeCell) {
12326
+ const prior = this.cells ? Array.from(this.cells).find(c => c.getAttribute('tabindex') === '0') : null;
12327
+ if (prior) {
12328
+ prior.setAttribute('tabindex', '-1');
12329
+ }
12330
+ activeCell.setAttribute('tabindex', '0');
12331
+ this._activeCell = activeCell;
12332
+ const items = getTabableItems(activeCell);
12333
+ const item = activeCell.getAttribute('role') !== 'columnheader' && items[0] ? items[0] : activeCell;
12334
+ if (!this.skipItemFocus) {
12335
+ item.focus();
12336
+ }
12337
+ }
12338
+ getNextItemCoordinate(e) {
12339
+ var _a;
12340
+ let currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
12341
+ if (e.code === 'Tab') {
12342
+ currentCell = document.activeElement;
12343
+ }
12344
+ const currentRow = this.rows && currentCell ? Array.from(this.rows).find(r => r.contains(currentCell)) : null;
12345
+ const numOfRows = this.rows ? this.rows.length - 1 : 0;
12346
+ const numOfColumns = this.cells ? Math.floor(this.cells.length / this.rows.length - 1) : 0;
12347
+ let x = currentRow && currentCell
12348
+ ? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell)
12349
+ : 0;
12350
+ let y = currentRow && currentCell && this.rows ? Array.from(this.rows).indexOf(currentRow) : 0;
12351
+ const dir = this.host.dir;
12352
+ const inlineStart = dir === 'rtl' ? 'ArrowRight' : 'ArrowLeft';
12353
+ const inlineEnd = dir === 'rtl' ? 'ArrowLeft' : 'ArrowRight';
12354
+ const itemsPerPage = Math.floor(((_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelector('.datagrid').clientHeight) / this.rows[0].clientHeight) - 1 || 0;
12355
+ if (e.code === 'ArrowUp' && y !== 0) {
12356
+ y = y - 1;
12357
+ }
12358
+ else if (e.code === 'ArrowDown' && y < numOfRows) {
12359
+ y = y + 1;
12360
+ }
12361
+ else if (e.code === inlineStart && x !== 0) {
12362
+ x = x - 1;
12363
+ }
12364
+ else if (e.code === inlineEnd && x < numOfColumns) {
12365
+ x = x + 1;
12366
+ }
12367
+ else if (e.code === 'End') {
12368
+ x = numOfColumns;
12369
+ if (e.ctrlKey) {
12370
+ y = numOfRows;
12371
+ }
12372
+ }
12373
+ else if (e.code === 'Home') {
12374
+ x = 0;
12375
+ if (e.ctrlKey) {
12376
+ y = 0;
12377
+ }
12378
+ }
12379
+ else if (e.code === 'PageUp') {
12380
+ y = y - itemsPerPage > 0 ? y - itemsPerPage + 1 : 1;
12381
+ }
12382
+ else if (e.code === 'PageDown') {
12383
+ y = y + itemsPerPage < numOfRows ? y + itemsPerPage : numOfRows;
12384
+ }
12385
+ return { x, y };
12386
+ }
12387
+ }
12388
+ KeyNavigationGridController.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
12389
+ KeyNavigationGridController.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController });
12390
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, decorators: [{
12391
+ type: Injectable
12392
+ }], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
12393
+
12190
12394
  /*
12191
12395
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12192
12396
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -12199,12 +12403,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12199
12403
  * since it can be anything (not just a text input).
12200
12404
  */
12201
12405
  class ClrDatagridFilter extends DatagridFilterRegistrar {
12202
- constructor(_filters, commonStrings, smartToggleService, platformId, elementRef) {
12406
+ constructor(_filters, commonStrings, smartToggleService, platformId, elementRef, keyNavigation) {
12203
12407
  super(_filters);
12204
12408
  this.commonStrings = commonStrings;
12205
12409
  this.smartToggleService = smartToggleService;
12206
12410
  this.platformId = platformId;
12207
12411
  this.elementRef = elementRef;
12412
+ this.keyNavigation = keyNavigation;
12208
12413
  this.openChange = new EventEmitter(false);
12209
12414
  this.ariaExpanded = false;
12210
12415
  this.popoverId = uniqueIdFactory();
@@ -12233,6 +12438,9 @@ class ClrDatagridFilter extends DatagridFilterRegistrar {
12233
12438
  if (!open && isPlatformBrowser(this.platformId)) {
12234
12439
  this.anchor.nativeElement.focus();
12235
12440
  }
12441
+ if (this.keyNavigation) {
12442
+ this.keyNavigation.skipItemFocus = open;
12443
+ }
12236
12444
  // keep track of the state
12237
12445
  this._open = open;
12238
12446
  }
@@ -12247,7 +12455,9 @@ class ClrDatagridFilter extends DatagridFilterRegistrar {
12247
12455
  return !!this.filter && this.filter.isActive();
12248
12456
  }
12249
12457
  ngOnChanges() {
12250
- this.setToggleButtonAriaLabel();
12458
+ setTimeout(() => {
12459
+ this.setToggleButtonAriaLabel();
12460
+ });
12251
12461
  }
12252
12462
  ngOnDestroy() {
12253
12463
  super.ngOnDestroy();
@@ -12267,7 +12477,7 @@ class ClrDatagridFilter extends DatagridFilterRegistrar {
12267
12477
  });
12268
12478
  }
12269
12479
  }
12270
- ClrDatagridFilter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridFilter, deps: [{ token: FiltersProvider }, { token: ClrCommonStringsService }, { token: ClrPopoverToggleService }, { token: PLATFORM_ID }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
12480
+ ClrDatagridFilter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridFilter, deps: [{ token: FiltersProvider }, { token: ClrCommonStringsService }, { token: ClrPopoverToggleService }, { token: PLATFORM_ID }, { token: i0.ElementRef }, { token: KeyNavigationGridController, optional: true }], target: i0.ɵɵFactoryTarget.Component });
12271
12481
  ClrDatagridFilter.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridFilter, selector: "clr-dg-filter", inputs: { open: ["clrDgFilterOpen", "open"], customFilter: ["clrDgFilter", "customFilter"] }, outputs: { openChange: "clrDgFilterOpenChange" }, providers: [{ provide: CustomFilter, useExisting: ClrDatagridFilter }], viewQueries: [{ propertyName: "anchor", first: true, predicate: ["anchor"], descendants: true, read: ElementRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `
12272
12482
  <button
12273
12483
  class="datagrid-filter-toggle"
@@ -12353,7 +12563,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12353
12563
  return [{ type: FiltersProvider }, { type: ClrCommonStringsService }, { type: ClrPopoverToggleService }, { type: undefined, decorators: [{
12354
12564
  type: Inject,
12355
12565
  args: [PLATFORM_ID]
12356
- }] }, { type: i0.ElementRef }];
12566
+ }] }, { type: i0.ElementRef }, { type: KeyNavigationGridController, decorators: [{
12567
+ type: Optional
12568
+ }] }];
12357
12569
  }, propDecorators: { openChange: [{
12358
12570
  type: Output,
12359
12571
  args: ['clrDgFilterOpenChange']
@@ -13116,6 +13328,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
13116
13328
  class DetailService {
13117
13329
  constructor(modalStackService) {
13118
13330
  this.modalStackService = modalStackService;
13331
+ this.preventScroll = false;
13119
13332
  this.toggleState = false;
13120
13333
  this._enabled = false;
13121
13334
  this._state = new BehaviorSubject(this.toggleState);
@@ -13126,6 +13339,12 @@ class DetailService {
13126
13339
  set enabled(state) {
13127
13340
  this._enabled = state;
13128
13341
  }
13342
+ get preventFocusScroll() {
13343
+ return this.preventScroll;
13344
+ }
13345
+ set preventFocusScroll(preventScroll) {
13346
+ this.preventScroll = preventScroll;
13347
+ }
13129
13348
  get state() {
13130
13349
  return this.cache;
13131
13350
  }
@@ -13144,15 +13363,13 @@ class DetailService {
13144
13363
  }
13145
13364
  close() {
13146
13365
  this.toggleState = false;
13366
+ this.returnFocus();
13147
13367
  this._state.next(this.toggleState);
13148
13368
  this.modalStackService.trackModalClose(this);
13149
- // In the case of browser zoom greater than 250%, the detail pane toggle button is not visible on the page.
13150
- // Wait for the detail pane to close, and return focus to the detail toggle button.
13151
- setTimeout(() => this.returnFocus(), 0);
13152
13369
  }
13153
13370
  returnFocus() {
13154
13371
  if (this.button) {
13155
- this.button.focus();
13372
+ this.button.focus({ preventScroll: this.preventFocusScroll });
13156
13373
  this.button = null;
13157
13374
  }
13158
13375
  }
@@ -14363,9 +14580,9 @@ class ClrDatagridPlaceholder {
14363
14580
  }
14364
14581
  ClrDatagridPlaceholder.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridPlaceholder, deps: [{ token: Items }], target: i0.ɵɵFactoryTarget.Component });
14365
14582
  ClrDatagridPlaceholder.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridPlaceholder, selector: "clr-dg-placeholder", host: { properties: { "class.datagrid-placeholder-container": "true" } }, ngImport: i0, template: `
14366
- <div class="datagrid-placeholder" [class.datagrid-empty]="emptyDatagrid" role="row">
14583
+ <div class="datagrid-placeholder" [class.datagrid-empty]="emptyDatagrid">
14367
14584
  <div class="datagrid-placeholder-image" *ngIf="emptyDatagrid"></div>
14368
- <span role="gridcell" class="datagrid-placeholder-content"><ng-content *ngIf="emptyDatagrid"></ng-content></span>
14585
+ <span class="datagrid-placeholder-content"><ng-content *ngIf="emptyDatagrid"></ng-content></span>
14369
14586
  </div>
14370
14587
  `, isInline: true, dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
14371
14588
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridPlaceholder, decorators: [{
@@ -14373,9 +14590,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
14373
14590
  args: [{
14374
14591
  selector: 'clr-dg-placeholder',
14375
14592
  template: `
14376
- <div class="datagrid-placeholder" [class.datagrid-empty]="emptyDatagrid" role="row">
14593
+ <div class="datagrid-placeholder" [class.datagrid-empty]="emptyDatagrid">
14377
14594
  <div class="datagrid-placeholder-image" *ngIf="emptyDatagrid"></div>
14378
- <span role="gridcell" class="datagrid-placeholder-content"><ng-content *ngIf="emptyDatagrid"></ng-content></span>
14595
+ <span class="datagrid-placeholder-content"><ng-content *ngIf="emptyDatagrid"></ng-content></span>
14379
14596
  </div>
14380
14597
  `,
14381
14598
  host: { '[class.datagrid-placeholder-container]': 'true' },
@@ -15222,6 +15439,8 @@ class ClrDatagridRow {
15222
15439
  this.document = document;
15223
15440
  this.selectedChanged = new EventEmitter(false);
15224
15441
  this.expandedChange = new EventEmitter(false);
15442
+ this.detailDisabled = false;
15443
+ this.detailHidden = false;
15225
15444
  this.displayCells = false;
15226
15445
  this.expandAnimationTrigger = false;
15227
15446
  /* reference to the enum so that template can access */
@@ -15449,11 +15668,11 @@ class ClrDatagridRow {
15449
15668
  }
15450
15669
  }
15451
15670
  ClrDatagridRow.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridRow, deps: [{ token: Selection }, { token: RowActionService }, { token: ExpandableRowsCount }, { token: DatagridIfExpandService }, { token: DetailService }, { token: DisplayModeService }, { token: i0.ViewContainerRef }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: ClrCommonStringsService }, { token: Items }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });
15452
- ClrDatagridRow.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridRow, selector: "clr-dg-row", inputs: { item: ["clrDgItem", "item"], clrDgSelectable: "clrDgSelectable", selected: ["clrDgSelected", "selected"], expanded: ["clrDgExpanded", "expanded"], clrDgDetailOpenLabel: "clrDgDetailOpenLabel", clrDgDetailCloseLabel: "clrDgDetailCloseLabel", clrDgRowSelectionLabel: "clrDgRowSelectionLabel" }, outputs: { selectedChanged: "clrDgSelectedChange", expandedChange: "clrDgExpandedChange" }, host: { attributes: { "role": "rowgroup" }, properties: { "class.datagrid-row": "true", "class.datagrid-selected": "selected", "attr.aria-owns": "id" } }, providers: [
15671
+ ClrDatagridRow.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridRow, selector: "clr-dg-row", inputs: { detailDisabled: ["clrDgDetailDisabled", "detailDisabled"], detailHidden: ["clrDgDetailHidden", "detailHidden"], item: ["clrDgItem", "item"], clrDgSelectable: "clrDgSelectable", selected: ["clrDgSelected", "selected"], expanded: ["clrDgExpanded", "expanded"], clrDgDetailOpenLabel: "clrDgDetailOpenLabel", clrDgDetailCloseLabel: "clrDgDetailCloseLabel", clrDgRowSelectionLabel: "clrDgRowSelectionLabel" }, outputs: { selectedChanged: "clrDgSelectedChange", expandedChange: "clrDgExpandedChange" }, host: { attributes: { "role": "rowgroup" }, properties: { "class.datagrid-row": "true", "class.datagrid-selected": "selected", "attr.aria-owns": "id" } }, providers: [
15453
15672
  DatagridIfExpandService,
15454
15673
  { provide: IfExpandService, useExisting: DatagridIfExpandService },
15455
15674
  { provide: LoadingListener, useExisting: DatagridIfExpandService },
15456
- ], queries: [{ propertyName: "dgCells", predicate: ClrDatagridCell }], viewQueries: [{ propertyName: "expandAnimation", first: true, predicate: ClrExpandableAnimation, descendants: true }, { propertyName: "detailButton", first: true, predicate: ["detailButton"], descendants: true }, { propertyName: "_stickyCells", first: true, predicate: ["stickyCells"], descendants: true, read: ViewContainerRef }, { propertyName: "_scrollableCells", first: true, predicate: ["scrollableCells"], descendants: true, read: ViewContainerRef }, { propertyName: "_calculatedCells", first: true, predicate: ["calculatedCells"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!--\n We need to wrap the #rowContent in label element if we are in rowSelectionMode.\n Clicking of that wrapper label will equate to clicking on the whole row, which triggers the checkbox to toggle.\n-->\n<div\n class=\"datagrid-row-clickable\"\n *ngIf=\"selection.rowSelectionMode\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n>\n <clr-expandable-animation [clrExpandTrigger]=\"expandAnimationTrigger\" *ngIf=\"expand.expandable\">\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n </clr-expandable-animation>\n <ng-template [ngTemplateOutlet]=\"rowContent\" *ngIf=\"!expand.expandable\"></ng-template>\n</div>\n\n<clr-expandable-animation\n *ngIf=\"!selection.rowSelectionMode && expand.expandable\"\n [clrExpandTrigger]=\"expandAnimationTrigger\"\n>\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n</clr-expandable-animation>\n\n<ng-template *ngIf=\"!selection.rowSelectionMode && !expand.expandable\" [ngTemplateOutlet]=\"rowContent\"></ng-template>\n\n<!--\n We need the \"project into template\" hacks because we need this in 2 different places\n depending on whether the details replace the row or not.\n-->\n<ng-template #detail>\n <ng-content select=\"clr-dg-row-detail\"></ng-content>\n</ng-template>\n\n<ng-template #rowContent>\n <div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [class.datagrid-row-detail-open]=\"detailService.isRowOpen(item)\"\n >\n <div class=\"datagrid-row-sticky\">\n <!-- Sticky elements here -->\n <ng-container #stickyCells>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-checkbox-wrapper>\n <input\n type=\"checkbox\"\n clrCheckbox\n [ngModel]=\"selected\"\n (ngModelChange)=\"toggle($event)\"\n [id]=\"checkboxId\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"checkboxId\" class=\"clr-control-label clr-col-null\" (click)=\"clearRanges($event)\">\n <span class=\"clr-sr-only\">{{clrDgRowSelectionLabel || commonStrings.keys.select}}</span>\n </label>\n </clr-checkbox-wrapper>\n </div>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-radio-wrapper>\n <input\n type=\"radio\"\n clrRadio\n [id]=\"radioId\"\n [name]=\"selection.id + '-radio'\"\n [value]=\"item\"\n [(ngModel)]=\"selection.currentSingle\"\n [checked]=\"selection.currentSingle === item\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <label class=\"clr-control-label clr-col-null\" [for]=\"radioId\">\n <span class=\"clr-sr-only\">{{ clrDgRowSelectionLabel || commonStrings.keys.select }}</span>\n </label>\n </clr-radio-wrapper>\n </div>\n <div\n *ngIf=\"rowActionService.hasActionableRow\"\n class=\"datagrid-row-actions datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-content select=\"clr-dg-action-overflow\"></ng-content>\n </div>\n <div\n *ngIf=\"globalExpandable.hasExpandableRow\"\n class=\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-container *ngIf=\"expand.expandable\">\n <button\n *ngIf=\"!expand.loading\"\n (click)=\"toggleExpand()\"\n type=\"button\"\n class=\"datagrid-expandable-caret-button\"\n [attr.aria-expanded]=\"expand.expanded\"\n [attr.aria-label]=\"expand.expanded ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-controls]=\"expandableId\"\n >\n <cds-icon\n shape=\"angle\"\n class=\"datagrid-expandable-caret-icon\"\n [attr.direction]=\"expand.expanded ? 'down' : 'right'\"\n [attr.title]=\"expand.expanded ? commonStrings.keys.collapse : commonStrings.keys.expand\"\n ></cds-icon>\n </button>\n <clr-spinner *ngIf=\"expand.loading\" clrSmall>{{ commonStrings.keys.loading }}</clr-spinner>\n </ng-container>\n </div>\n <div\n *ngIf=\"detailService.enabled\"\n class=\"datagrid-detail-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <button\n (click)=\"detailService.toggle(item, detailButton)\"\n type=\"button\"\n #detailButton\n class=\"datagrid-detail-caret-button\"\n [class.is-open]=\"detailService.isRowOpen(item)\"\n [attr.aria-label]=\"detailService.isRowOpen(item) ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-expanded]=\"detailService.isRowOpen(item)\"\n [attr.aria-controls]=\"detailService.id\"\n aria-haspopup=\"dialog\"\n >\n <cds-icon\n shape=\"angle-double\"\n [attr.direction]=\"detailService.isRowOpen(item) ? 'left' : 'right'\"\n class=\"datagrid-detail-caret-icon\"\n [attr.title]=\"detailService.isRowOpen(item) ? commonStrings.keys.close: commonStrings.keys.open\"\n ></cds-icon>\n </button>\n </div>\n </ng-container>\n <!-- placeholder for projecting other sticky cells as pinned-->\n </div>\n <div class=\"datagrid-row-scrollable\" [ngClass]=\"{'is-replaced': replaced && expanded}\">\n <div class=\"datagrid-scrolling-cells\">\n <ng-content select=\"clr-dg-cell\"></ng-content>\n <ng-container #scrollableCells></ng-container>\n </div>\n <!-- details here when replace, re-visit when sticky container is used for pinned cells -->\n <ng-template *ngIf=\"replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n <ng-template *ngIf=\"!replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n </div>\n </div>\n</ng-template>\n\n<ng-container #calculatedCells></ng-container>\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "directive", type: ClrLabel, selector: "label", inputs: ["for"] }, { kind: "directive", type: ClrCheckbox, selector: "[clrCheckbox],[clrToggle]" }, { kind: "component", type: ClrCheckboxWrapper, selector: "clr-checkbox-wrapper,clr-toggle-wrapper" }, { kind: "directive", type: ClrRadio, selector: "[clrRadio]" }, { kind: "component", type: ClrRadioWrapper, selector: "clr-radio-wrapper" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ClrExpandableAnimation, selector: "clr-expandable-animation", inputs: ["clrExpandTrigger"] }, { kind: "component", type: ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }, { kind: "directive", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select" }] });
15675
+ ], queries: [{ propertyName: "dgCells", predicate: ClrDatagridCell }], viewQueries: [{ propertyName: "expandAnimation", first: true, predicate: ClrExpandableAnimation, descendants: true }, { propertyName: "detailButton", first: true, predicate: ["detailButton"], descendants: true }, { propertyName: "_stickyCells", first: true, predicate: ["stickyCells"], descendants: true, read: ViewContainerRef }, { propertyName: "_scrollableCells", first: true, predicate: ["scrollableCells"], descendants: true, read: ViewContainerRef }, { propertyName: "_calculatedCells", first: true, predicate: ["calculatedCells"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!--\n We need to wrap the #rowContent in label element if we are in rowSelectionMode.\n Clicking of that wrapper label will equate to clicking on the whole row, which triggers the checkbox to toggle.\n-->\n<div\n class=\"datagrid-row-clickable\"\n *ngIf=\"selection.rowSelectionMode\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n>\n <clr-expandable-animation [clrExpandTrigger]=\"expandAnimationTrigger\" *ngIf=\"expand.expandable\">\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n </clr-expandable-animation>\n <ng-template [ngTemplateOutlet]=\"rowContent\" *ngIf=\"!expand.expandable\"></ng-template>\n</div>\n\n<clr-expandable-animation\n *ngIf=\"!selection.rowSelectionMode && expand.expandable\"\n [clrExpandTrigger]=\"expandAnimationTrigger\"\n>\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n</clr-expandable-animation>\n\n<ng-template *ngIf=\"!selection.rowSelectionMode && !expand.expandable\" [ngTemplateOutlet]=\"rowContent\"></ng-template>\n\n<!--\n We need the \"project into template\" hacks because we need this in 2 different places\n depending on whether the details replace the row or not.\n-->\n<ng-template #detail>\n <ng-content select=\"clr-dg-row-detail\"></ng-content>\n</ng-template>\n\n<ng-template #rowContent>\n <div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [class.datagrid-row-detail-open]=\"detailService.isRowOpen(item)\"\n >\n <div class=\"datagrid-row-sticky\">\n <!-- Sticky elements here -->\n <ng-container #stickyCells>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-checkbox-wrapper>\n <input\n tabindex=\"-1\"\n type=\"checkbox\"\n clrCheckbox\n [ngModel]=\"selected\"\n (ngModelChange)=\"toggle($event)\"\n [id]=\"checkboxId\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"checkboxId\" class=\"clr-control-label clr-col-null\" (click)=\"clearRanges($event)\">\n <span class=\"clr-sr-only\">{{clrDgRowSelectionLabel || commonStrings.keys.select}}</span>\n </label>\n </clr-checkbox-wrapper>\n </div>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-radio-wrapper>\n <input\n tabindex=\"-1\"\n type=\"radio\"\n clrRadio\n [id]=\"radioId\"\n [name]=\"selection.id + '-radio'\"\n [value]=\"item\"\n [(ngModel)]=\"selection.currentSingle\"\n [checked]=\"selection.currentSingle === item\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <label class=\"clr-control-label clr-col-null\" [for]=\"radioId\">\n <span class=\"clr-sr-only\">{{ clrDgRowSelectionLabel || commonStrings.keys.select }}</span>\n </label>\n </clr-radio-wrapper>\n </div>\n <div\n *ngIf=\"rowActionService.hasActionableRow\"\n class=\"datagrid-row-actions datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-content select=\"clr-dg-action-overflow\"></ng-content>\n </div>\n <div\n *ngIf=\"globalExpandable.hasExpandableRow\"\n class=\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-container *ngIf=\"expand.expandable\">\n <button\n tabindex=\"-1\"\n *ngIf=\"!expand.loading\"\n (click)=\"toggleExpand()\"\n type=\"button\"\n class=\"datagrid-expandable-caret-button\"\n [attr.aria-expanded]=\"expand.expanded\"\n [attr.aria-label]=\"expand.expanded ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-controls]=\"expandableId\"\n >\n <cds-icon\n shape=\"angle\"\n class=\"datagrid-expandable-caret-icon\"\n [attr.direction]=\"expand.expanded ? 'down' : 'right'\"\n [attr.title]=\"expand.expanded ? commonStrings.keys.collapse : commonStrings.keys.expand\"\n ></cds-icon>\n </button>\n <clr-spinner *ngIf=\"expand.loading\" clrSmall>{{ commonStrings.keys.loading }}</clr-spinner>\n </ng-container>\n </div>\n <div\n *ngIf=\"detailService.enabled\"\n class=\"datagrid-detail-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <button\n tabindex=\"-1\"\n (click)=\"detailService.toggle(item, detailButton)\"\n type=\"button\"\n #detailButton\n class=\"datagrid-detail-caret-button\"\n [disabled]=\"detailDisabled\"\n *ngIf=\"!detailHidden\"\n [class.is-open]=\"detailService.isRowOpen(item)\"\n [attr.aria-label]=\"detailService.isRowOpen(item) ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-expanded]=\"detailService.isRowOpen(item)\"\n [attr.aria-controls]=\"detailService.id\"\n aria-haspopup=\"dialog\"\n >\n <cds-icon\n shape=\"angle-double\"\n [attr.direction]=\"detailService.isRowOpen(item) ? 'left' : 'right'\"\n class=\"datagrid-detail-caret-icon\"\n [attr.title]=\"detailService.isRowOpen(item) ? commonStrings.keys.close: commonStrings.keys.open\"\n ></cds-icon>\n </button>\n </div>\n </ng-container>\n <!-- placeholder for projecting other sticky cells as pinned-->\n </div>\n <div class=\"datagrid-row-scrollable\" [ngClass]=\"{'is-replaced': replaced && expanded}\">\n <div class=\"datagrid-scrolling-cells\">\n <ng-content select=\"clr-dg-cell\"></ng-content>\n <ng-container #scrollableCells></ng-container>\n </div>\n <!-- details here when replace, re-visit when sticky container is used for pinned cells -->\n <ng-template *ngIf=\"replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n <ng-template *ngIf=\"!replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n </div>\n </div>\n</ng-template>\n\n<ng-container #calculatedCells></ng-container>\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "directive", type: ClrLabel, selector: "label", inputs: ["for"] }, { kind: "directive", type: ClrCheckbox, selector: "[clrCheckbox],[clrToggle]" }, { kind: "component", type: ClrCheckboxWrapper, selector: "clr-checkbox-wrapper,clr-toggle-wrapper" }, { kind: "directive", type: ClrRadio, selector: "[clrRadio]" }, { kind: "component", type: ClrRadioWrapper, selector: "clr-radio-wrapper" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ClrExpandableAnimation, selector: "clr-expandable-animation", inputs: ["clrExpandTrigger"] }, { kind: "component", type: ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }, { kind: "directive", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select" }] });
15457
15676
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridRow, decorators: [{
15458
15677
  type: Component,
15459
15678
  args: [{ selector: 'clr-dg-row', host: {
@@ -15465,7 +15684,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15465
15684
  DatagridIfExpandService,
15466
15685
  { provide: IfExpandService, useExisting: DatagridIfExpandService },
15467
15686
  { provide: LoadingListener, useExisting: DatagridIfExpandService },
15468
- ], template: "<!--\n We need to wrap the #rowContent in label element if we are in rowSelectionMode.\n Clicking of that wrapper label will equate to clicking on the whole row, which triggers the checkbox to toggle.\n-->\n<div\n class=\"datagrid-row-clickable\"\n *ngIf=\"selection.rowSelectionMode\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n>\n <clr-expandable-animation [clrExpandTrigger]=\"expandAnimationTrigger\" *ngIf=\"expand.expandable\">\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n </clr-expandable-animation>\n <ng-template [ngTemplateOutlet]=\"rowContent\" *ngIf=\"!expand.expandable\"></ng-template>\n</div>\n\n<clr-expandable-animation\n *ngIf=\"!selection.rowSelectionMode && expand.expandable\"\n [clrExpandTrigger]=\"expandAnimationTrigger\"\n>\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n</clr-expandable-animation>\n\n<ng-template *ngIf=\"!selection.rowSelectionMode && !expand.expandable\" [ngTemplateOutlet]=\"rowContent\"></ng-template>\n\n<!--\n We need the \"project into template\" hacks because we need this in 2 different places\n depending on whether the details replace the row or not.\n-->\n<ng-template #detail>\n <ng-content select=\"clr-dg-row-detail\"></ng-content>\n</ng-template>\n\n<ng-template #rowContent>\n <div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [class.datagrid-row-detail-open]=\"detailService.isRowOpen(item)\"\n >\n <div class=\"datagrid-row-sticky\">\n <!-- Sticky elements here -->\n <ng-container #stickyCells>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-checkbox-wrapper>\n <input\n type=\"checkbox\"\n clrCheckbox\n [ngModel]=\"selected\"\n (ngModelChange)=\"toggle($event)\"\n [id]=\"checkboxId\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"checkboxId\" class=\"clr-control-label clr-col-null\" (click)=\"clearRanges($event)\">\n <span class=\"clr-sr-only\">{{clrDgRowSelectionLabel || commonStrings.keys.select}}</span>\n </label>\n </clr-checkbox-wrapper>\n </div>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-radio-wrapper>\n <input\n type=\"radio\"\n clrRadio\n [id]=\"radioId\"\n [name]=\"selection.id + '-radio'\"\n [value]=\"item\"\n [(ngModel)]=\"selection.currentSingle\"\n [checked]=\"selection.currentSingle === item\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <label class=\"clr-control-label clr-col-null\" [for]=\"radioId\">\n <span class=\"clr-sr-only\">{{ clrDgRowSelectionLabel || commonStrings.keys.select }}</span>\n </label>\n </clr-radio-wrapper>\n </div>\n <div\n *ngIf=\"rowActionService.hasActionableRow\"\n class=\"datagrid-row-actions datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-content select=\"clr-dg-action-overflow\"></ng-content>\n </div>\n <div\n *ngIf=\"globalExpandable.hasExpandableRow\"\n class=\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-container *ngIf=\"expand.expandable\">\n <button\n *ngIf=\"!expand.loading\"\n (click)=\"toggleExpand()\"\n type=\"button\"\n class=\"datagrid-expandable-caret-button\"\n [attr.aria-expanded]=\"expand.expanded\"\n [attr.aria-label]=\"expand.expanded ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-controls]=\"expandableId\"\n >\n <cds-icon\n shape=\"angle\"\n class=\"datagrid-expandable-caret-icon\"\n [attr.direction]=\"expand.expanded ? 'down' : 'right'\"\n [attr.title]=\"expand.expanded ? commonStrings.keys.collapse : commonStrings.keys.expand\"\n ></cds-icon>\n </button>\n <clr-spinner *ngIf=\"expand.loading\" clrSmall>{{ commonStrings.keys.loading }}</clr-spinner>\n </ng-container>\n </div>\n <div\n *ngIf=\"detailService.enabled\"\n class=\"datagrid-detail-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <button\n (click)=\"detailService.toggle(item, detailButton)\"\n type=\"button\"\n #detailButton\n class=\"datagrid-detail-caret-button\"\n [class.is-open]=\"detailService.isRowOpen(item)\"\n [attr.aria-label]=\"detailService.isRowOpen(item) ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-expanded]=\"detailService.isRowOpen(item)\"\n [attr.aria-controls]=\"detailService.id\"\n aria-haspopup=\"dialog\"\n >\n <cds-icon\n shape=\"angle-double\"\n [attr.direction]=\"detailService.isRowOpen(item) ? 'left' : 'right'\"\n class=\"datagrid-detail-caret-icon\"\n [attr.title]=\"detailService.isRowOpen(item) ? commonStrings.keys.close: commonStrings.keys.open\"\n ></cds-icon>\n </button>\n </div>\n </ng-container>\n <!-- placeholder for projecting other sticky cells as pinned-->\n </div>\n <div class=\"datagrid-row-scrollable\" [ngClass]=\"{'is-replaced': replaced && expanded}\">\n <div class=\"datagrid-scrolling-cells\">\n <ng-content select=\"clr-dg-cell\"></ng-content>\n <ng-container #scrollableCells></ng-container>\n </div>\n <!-- details here when replace, re-visit when sticky container is used for pinned cells -->\n <ng-template *ngIf=\"replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n <ng-template *ngIf=\"!replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n </div>\n </div>\n</ng-template>\n\n<ng-container #calculatedCells></ng-container>\n" }]
15687
+ ], template: "<!--\n We need to wrap the #rowContent in label element if we are in rowSelectionMode.\n Clicking of that wrapper label will equate to clicking on the whole row, which triggers the checkbox to toggle.\n-->\n<div\n class=\"datagrid-row-clickable\"\n *ngIf=\"selection.rowSelectionMode\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n>\n <clr-expandable-animation [clrExpandTrigger]=\"expandAnimationTrigger\" *ngIf=\"expand.expandable\">\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n </clr-expandable-animation>\n <ng-template [ngTemplateOutlet]=\"rowContent\" *ngIf=\"!expand.expandable\"></ng-template>\n</div>\n\n<clr-expandable-animation\n *ngIf=\"!selection.rowSelectionMode && expand.expandable\"\n [clrExpandTrigger]=\"expandAnimationTrigger\"\n>\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n</clr-expandable-animation>\n\n<ng-template *ngIf=\"!selection.rowSelectionMode && !expand.expandable\" [ngTemplateOutlet]=\"rowContent\"></ng-template>\n\n<!--\n We need the \"project into template\" hacks because we need this in 2 different places\n depending on whether the details replace the row or not.\n-->\n<ng-template #detail>\n <ng-content select=\"clr-dg-row-detail\"></ng-content>\n</ng-template>\n\n<ng-template #rowContent>\n <div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [class.datagrid-row-detail-open]=\"detailService.isRowOpen(item)\"\n >\n <div class=\"datagrid-row-sticky\">\n <!-- Sticky elements here -->\n <ng-container #stickyCells>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-checkbox-wrapper>\n <input\n tabindex=\"-1\"\n type=\"checkbox\"\n clrCheckbox\n [ngModel]=\"selected\"\n (ngModelChange)=\"toggle($event)\"\n [id]=\"checkboxId\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"checkboxId\" class=\"clr-control-label clr-col-null\" (click)=\"clearRanges($event)\">\n <span class=\"clr-sr-only\">{{clrDgRowSelectionLabel || commonStrings.keys.select}}</span>\n </label>\n </clr-checkbox-wrapper>\n </div>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-radio-wrapper>\n <input\n tabindex=\"-1\"\n type=\"radio\"\n clrRadio\n [id]=\"radioId\"\n [name]=\"selection.id + '-radio'\"\n [value]=\"item\"\n [(ngModel)]=\"selection.currentSingle\"\n [checked]=\"selection.currentSingle === item\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <label class=\"clr-control-label clr-col-null\" [for]=\"radioId\">\n <span class=\"clr-sr-only\">{{ clrDgRowSelectionLabel || commonStrings.keys.select }}</span>\n </label>\n </clr-radio-wrapper>\n </div>\n <div\n *ngIf=\"rowActionService.hasActionableRow\"\n class=\"datagrid-row-actions datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-content select=\"clr-dg-action-overflow\"></ng-content>\n </div>\n <div\n *ngIf=\"globalExpandable.hasExpandableRow\"\n class=\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-container *ngIf=\"expand.expandable\">\n <button\n tabindex=\"-1\"\n *ngIf=\"!expand.loading\"\n (click)=\"toggleExpand()\"\n type=\"button\"\n class=\"datagrid-expandable-caret-button\"\n [attr.aria-expanded]=\"expand.expanded\"\n [attr.aria-label]=\"expand.expanded ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-controls]=\"expandableId\"\n >\n <cds-icon\n shape=\"angle\"\n class=\"datagrid-expandable-caret-icon\"\n [attr.direction]=\"expand.expanded ? 'down' : 'right'\"\n [attr.title]=\"expand.expanded ? commonStrings.keys.collapse : commonStrings.keys.expand\"\n ></cds-icon>\n </button>\n <clr-spinner *ngIf=\"expand.loading\" clrSmall>{{ commonStrings.keys.loading }}</clr-spinner>\n </ng-container>\n </div>\n <div\n *ngIf=\"detailService.enabled\"\n class=\"datagrid-detail-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <button\n tabindex=\"-1\"\n (click)=\"detailService.toggle(item, detailButton)\"\n type=\"button\"\n #detailButton\n class=\"datagrid-detail-caret-button\"\n [disabled]=\"detailDisabled\"\n *ngIf=\"!detailHidden\"\n [class.is-open]=\"detailService.isRowOpen(item)\"\n [attr.aria-label]=\"detailService.isRowOpen(item) ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-expanded]=\"detailService.isRowOpen(item)\"\n [attr.aria-controls]=\"detailService.id\"\n aria-haspopup=\"dialog\"\n >\n <cds-icon\n shape=\"angle-double\"\n [attr.direction]=\"detailService.isRowOpen(item) ? 'left' : 'right'\"\n class=\"datagrid-detail-caret-icon\"\n [attr.title]=\"detailService.isRowOpen(item) ? commonStrings.keys.close: commonStrings.keys.open\"\n ></cds-icon>\n </button>\n </div>\n </ng-container>\n <!-- placeholder for projecting other sticky cells as pinned-->\n </div>\n <div class=\"datagrid-row-scrollable\" [ngClass]=\"{'is-replaced': replaced && expanded}\">\n <div class=\"datagrid-scrolling-cells\">\n <ng-content select=\"clr-dg-cell\"></ng-content>\n <ng-container #scrollableCells></ng-container>\n </div>\n <!-- details here when replace, re-visit when sticky container is used for pinned cells -->\n <ng-template *ngIf=\"replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n <ng-template *ngIf=\"!replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n </div>\n </div>\n</ng-template>\n\n<ng-container #calculatedCells></ng-container>\n" }]
15469
15688
  }], ctorParameters: function () {
15470
15689
  return [{ type: Selection }, { type: RowActionService }, { type: ExpandableRowsCount }, { type: DatagridIfExpandService }, { type: DetailService }, { type: DisplayModeService }, { type: i0.ViewContainerRef }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: ClrCommonStringsService }, { type: Items }, { type: undefined, decorators: [{
15471
15690
  type: Inject,
@@ -15477,6 +15696,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15477
15696
  }], expandedChange: [{
15478
15697
  type: Output,
15479
15698
  args: ['clrDgExpandedChange']
15699
+ }], detailDisabled: [{
15700
+ type: Input,
15701
+ args: ['clrDgDetailDisabled']
15702
+ }], detailHidden: [{
15703
+ type: Input,
15704
+ args: ['clrDgDetailHidden']
15480
15705
  }], dgCells: [{
15481
15706
  type: ContentChildren,
15482
15707
  args: [ClrDatagridCell]
@@ -15525,10 +15750,11 @@ var DatagridColumnChanges;
15525
15750
  (function (DatagridColumnChanges) {
15526
15751
  DatagridColumnChanges[DatagridColumnChanges["WIDTH"] = 0] = "WIDTH";
15527
15752
  DatagridColumnChanges[DatagridColumnChanges["HIDDEN"] = 1] = "HIDDEN";
15753
+ DatagridColumnChanges[DatagridColumnChanges["INITIALIZE"] = 2] = "INITIALIZE";
15528
15754
  })(DatagridColumnChanges || (DatagridColumnChanges = {}));
15529
15755
  const ALL_COLUMN_CHANGES = Object.keys(DatagridColumnChanges)
15530
15756
  .map(key => DatagridColumnChanges[key])
15531
- .filter(key => key === parseInt(key, 10)); // extracts only integer keys
15757
+ .filter(key => key === parseInt(key, 10) && key !== DatagridColumnChanges.INITIALIZE); // extracts only integer keys
15532
15758
 
15533
15759
  /*
15534
15760
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
@@ -15539,6 +15765,7 @@ const ALL_COLUMN_CHANGES = Object.keys(DatagridColumnChanges)
15539
15765
  class ColumnsService {
15540
15766
  constructor() {
15541
15767
  this.columns = [];
15768
+ this.columnsStateChange = new BehaviorSubject(null);
15542
15769
  this._cache = [];
15543
15770
  }
15544
15771
  get columnStates() {
@@ -15560,7 +15787,9 @@ class ColumnsService {
15560
15787
  resetToLastCache() {
15561
15788
  this._cache.forEach((state, index) => {
15562
15789
  // Just emit the exact value from the cache
15563
- this.columns[index].next(Object.assign(Object.assign({}, state), { changes: ALL_COLUMN_CHANGES }));
15790
+ const cachedState = Object.assign(Object.assign({}, state), { changes: ALL_COLUMN_CHANGES });
15791
+ this.columns[index].next(cachedState);
15792
+ this.columnsStateChange.next(cachedState);
15564
15793
  });
15565
15794
  this._cache = [];
15566
15795
  }
@@ -15572,7 +15801,9 @@ class ColumnsService {
15572
15801
  this.emitStateChange(this.columns[columnIndex], diff);
15573
15802
  }
15574
15803
  emitStateChange(column, diff) {
15575
- column.next(Object.assign(Object.assign({}, column.value), diff));
15804
+ const changedState = Object.assign(Object.assign({}, column.value), diff);
15805
+ column.next(changedState);
15806
+ this.columnsStateChange.next(changedState);
15576
15807
  }
15577
15808
  }
15578
15809
  ColumnsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ColumnsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -15648,193 +15879,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15648
15879
  type: Injectable
15649
15880
  }], ctorParameters: function () { return [{ type: FiltersProvider }, { type: Sort }, { type: Page }, { type: StateDebouncer }]; } });
15650
15881
 
15651
- /*
15652
- * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
15653
- * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
15654
- * This software is released under MIT license.
15655
- * The full license information can be found in LICENSE in the root directory of this project.
15656
- */
15657
- function getTabableItems(el) {
15658
- const tabableSelector = [
15659
- 'a[href]',
15660
- 'area[href]',
15661
- 'input:not([disabled])',
15662
- 'button:not([disabled])',
15663
- 'select:not([disabled])',
15664
- 'textarea:not([disabled])',
15665
- 'iframe',
15666
- 'object',
15667
- 'embed',
15668
- '*[tabindex]',
15669
- '*[contenteditable=true]',
15670
- '[role=button]:not([disabled])',
15671
- ].join(',');
15672
- return Array.from(el.querySelectorAll(tabableSelector));
15673
- }
15674
- class KeyNavigationGridController {
15675
- constructor(zone) {
15676
- this.zone = zone;
15677
- this.listenersAdded = false;
15678
- this.destroy$ = new Subject();
15679
- this._activeCell = null;
15680
- this.config = {
15681
- keyGridRows: '[role=row]:not(.datagrid-placeholder)',
15682
- keyGridCells: '[role=gridcell]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), [role=columnheader]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), .datagrid-detail-caret',
15683
- keyGrid: '[role=grid]',
15684
- };
15685
- }
15686
- get grid() {
15687
- var _a;
15688
- return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelector(this.config.keyGrid);
15689
- }
15690
- get rows() {
15691
- var _a;
15692
- return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.config.keyGridRows);
15693
- }
15694
- get cells() {
15695
- var _a;
15696
- return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.config.keyGridCells);
15697
- }
15698
- ngOnDestroy() {
15699
- this.destroy$.next();
15700
- this.destroy$.complete();
15701
- }
15702
- addListeners() {
15703
- if (this.listenersAdded) {
15704
- return;
15705
- }
15706
- this.zone.runOutsideAngular(() => {
15707
- fromEvent(this.grid, 'mousedown')
15708
- .pipe(takeUntil(this.destroy$))
15709
- .subscribe((e) => {
15710
- // preserve right click for context menus & keyboard mouse control https://apple.stackexchange.com/questions/32715/how-do-i-open-the-context-menu-from-a-mac-keyboard
15711
- if (e.buttons === 1 && !e.ctrlKey) {
15712
- const activeCell = this.cells
15713
- ? Array.from(this.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
15714
- : null;
15715
- if (activeCell) {
15716
- this.setActiveCell(activeCell);
15717
- }
15718
- }
15719
- });
15720
- fromEvent(this.grid, 'wheel')
15721
- .pipe(takeUntil(this.destroy$))
15722
- .subscribe(() => {
15723
- this.removeActiveCell();
15724
- });
15725
- fromEvent(this.grid, 'keydown')
15726
- .pipe(takeUntil(this.destroy$))
15727
- .subscribe((e) => {
15728
- // Skip column resize events
15729
- if (e.target.classList.contains('drag-handle') &&
15730
- (e.code === 'ArrowLeft' || e.code === 'ArrowRight')) {
15731
- return;
15732
- }
15733
- if (e.code === 'ArrowUp' ||
15734
- e.code === 'ArrowDown' ||
15735
- e.code === 'ArrowLeft' ||
15736
- e.code === 'ArrowRight' ||
15737
- e.code === 'End' ||
15738
- e.code === 'Home' ||
15739
- e.code === 'PageUp' ||
15740
- e.code === 'PageDown') {
15741
- const { x, y } = this.getNextItemCoordinate(e);
15742
- const activeItem = this.rows
15743
- ? Array.from(this.rows[y].querySelectorAll(this.config.keyGridCells))[x]
15744
- : null;
15745
- if (activeItem) {
15746
- this.setActiveCell(activeItem);
15747
- }
15748
- e.preventDefault();
15749
- }
15750
- });
15751
- });
15752
- this.listenersAdded = true;
15753
- }
15754
- initializeKeyGrid(host) {
15755
- this.host = host;
15756
- this.addListeners();
15757
- this.resetKeyGrid();
15758
- }
15759
- resetKeyGrid() {
15760
- var _a;
15761
- (_a = this.cells) === null || _a === void 0 ? void 0 : _a.forEach((i) => i.setAttribute('tabindex', '-1'));
15762
- const firstCell = this.cells ? this.cells[0] : null;
15763
- firstCell === null || firstCell === void 0 ? void 0 : firstCell.setAttribute('tabindex', '0');
15764
- }
15765
- removeActiveCell() {
15766
- this._activeCell = null;
15767
- }
15768
- getActiveCell() {
15769
- return this._activeCell;
15770
- }
15771
- setActiveCell(activeCell) {
15772
- const prior = this.cells ? Array.from(this.cells).find(c => c.getAttribute('tabindex') === '0') : null;
15773
- if (prior) {
15774
- prior.setAttribute('tabindex', '-1');
15775
- }
15776
- activeCell.setAttribute('tabindex', '0');
15777
- const items = getTabableItems(activeCell);
15778
- const item = activeCell.getAttribute('role') !== 'columnheader' && items[0] ? items[0] : activeCell;
15779
- item.focus();
15780
- this._activeCell = item;
15781
- }
15782
- getNextItemCoordinate(e) {
15783
- var _a;
15784
- let currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
15785
- if (e.code === 'Tab') {
15786
- currentCell = document.activeElement;
15787
- }
15788
- const currentRow = this.rows && currentCell ? Array.from(this.rows).find(r => r.contains(currentCell)) : null;
15789
- const numOfRows = this.rows ? this.rows.length - 1 : 0;
15790
- const numOfColumns = this.cells ? Math.floor(this.cells.length / this.rows.length - 1) : 0;
15791
- let x = currentRow && currentCell
15792
- ? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell)
15793
- : 0;
15794
- let y = currentRow && currentCell && this.rows ? Array.from(this.rows).indexOf(currentRow) : 0;
15795
- const dir = this.host.dir;
15796
- const inlineStart = dir === 'rtl' ? 'ArrowRight' : 'ArrowLeft';
15797
- const inlineEnd = dir === 'rtl' ? 'ArrowLeft' : 'ArrowRight';
15798
- const itemsPerPage = Math.floor(((_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelector('.datagrid').clientHeight) / this.rows[0].clientHeight) - 1 || 0;
15799
- if (e.code === 'ArrowUp' && y !== 0) {
15800
- y = y - 1;
15801
- }
15802
- else if (e.code === 'ArrowDown' && y < numOfRows) {
15803
- y = y + 1;
15804
- }
15805
- else if (e.code === inlineStart && x !== 0) {
15806
- x = x - 1;
15807
- }
15808
- else if (e.code === inlineEnd && x < numOfColumns) {
15809
- x = x + 1;
15810
- }
15811
- else if (e.code === 'End') {
15812
- x = numOfColumns;
15813
- if (e.ctrlKey) {
15814
- y = numOfRows;
15815
- }
15816
- }
15817
- else if (e.code === 'Home') {
15818
- x = 0;
15819
- if (e.ctrlKey) {
15820
- y = 0;
15821
- }
15822
- }
15823
- else if (e.code === 'PageUp') {
15824
- y = y - itemsPerPage > 0 ? y - itemsPerPage + 1 : 1;
15825
- }
15826
- else if (e.code === 'PageDown') {
15827
- y = y + itemsPerPage < numOfRows ? y + itemsPerPage : numOfRows;
15828
- }
15829
- return { x, y };
15830
- }
15831
- }
15832
- KeyNavigationGridController.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
15833
- KeyNavigationGridController.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController });
15834
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, decorators: [{
15835
- type: Injectable
15836
- }], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
15837
-
15838
15882
  /*
15839
15883
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
15840
15884
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -15868,7 +15912,6 @@ class DatagridCellRenderer {
15868
15912
  }
15869
15913
  }
15870
15914
  resetState(state) {
15871
- state.changes = ALL_COLUMN_CHANGES;
15872
15915
  this.setWidth(state);
15873
15916
  this.setHidden(state);
15874
15917
  }
@@ -15949,7 +15992,7 @@ class DatagridRowRenderer {
15949
15992
  }
15950
15993
  }
15951
15994
  DatagridRowRenderer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridRowRenderer, deps: [{ token: ColumnsService }], target: i0.ɵɵFactoryTarget.Directive });
15952
- DatagridRowRenderer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: DatagridRowRenderer, selector: "clr-dg-row, clr-dg-row-detail", queries: [{ propertyName: "cells", predicate: DatagridCellRenderer }], ngImport: i0 });
15995
+ DatagridRowRenderer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: DatagridRowRenderer, selector: "clr-dg-row, clr-dg-row-detail", queries: [{ propertyName: "expandableRow", first: true, predicate: i0.forwardRef(function () { return DatagridRowRenderer; }), descendants: true }, { propertyName: "cells", predicate: DatagridCellRenderer }], ngImport: i0 });
15953
15996
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridRowRenderer, decorators: [{
15954
15997
  type: Directive,
15955
15998
  args: [{
@@ -15958,6 +16001,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15958
16001
  }], ctorParameters: function () { return [{ type: ColumnsService }]; }, propDecorators: { cells: [{
15959
16002
  type: ContentChildren,
15960
16003
  args: [DatagridCellRenderer]
16004
+ }], expandableRow: [{
16005
+ type: ContentChild,
16006
+ args: [forwardRef(() => DatagridRowRenderer)]
15961
16007
  }] } });
15962
16008
 
15963
16009
  /*
@@ -16093,26 +16139,17 @@ class ClrDatagrid {
16093
16139
  this.rows.forEach(row => {
16094
16140
  this._displayedRows.insert(row._view);
16095
16141
  });
16096
- // Try to update only when there is something cached and its open.
16097
- if (this.detailService.state && this.detailService.isOpen) {
16098
- const row = this.rows.find(row => this.items.trackBy(row.item) === this.items.trackBy(this.detailService.state));
16099
- /**
16100
- * Reopen updated row or close it
16101
- */
16102
- if (row) {
16103
- this.detailService.open(row.item, row.detailButton.nativeElement);
16104
- }
16105
- else if (!this.hasVirtualScroller || !row) {
16106
- this.detailService.close();
16142
+ this.updateDetailState();
16143
+ // retain active cell when navigating with Up/Down Arrows, PageUp and PageDown buttons in virtual scroller
16144
+ if (this.hasVirtualScroller) {
16145
+ const active = this.keyNavigation.getActiveCell();
16146
+ const isFocusInsideDatagrid = this.datagrid.nativeElement.contains(document.activeElement);
16147
+ if (active && isFocusInsideDatagrid) {
16148
+ this.zone.runOutsideAngular(() => {
16149
+ setTimeout(() => this.keyNavigation.setActiveCell(active));
16150
+ });
16107
16151
  }
16108
16152
  }
16109
- // retain active cell when navigating with PageUp and PageDown buttons in virtual scroller
16110
- const active = this.keyNavigation.getActiveCell();
16111
- if (active) {
16112
- this.zone.runOutsideAngular(() => {
16113
- setTimeout(() => this.keyNavigation.setActiveCell(active));
16114
- });
16115
- }
16116
16153
  }));
16117
16154
  }
16118
16155
  /**
@@ -16120,6 +16157,7 @@ class ClrDatagrid {
16120
16157
  */
16121
16158
  ngAfterViewInit() {
16122
16159
  this.keyNavigation.initializeKeyGrid(this.el.nativeElement);
16160
+ this.updateDetailState();
16123
16161
  // TODO: determine if we can get rid of provider wiring in view init so that subscriptions can be done earlier
16124
16162
  this.refresh.emit(this.stateProvider.state);
16125
16163
  this._subscriptions.push(this.stateProvider.change.subscribe(state => this.refresh.emit(state)), this.selection.change.subscribe(s => {
@@ -16193,9 +16231,39 @@ class ClrDatagrid {
16193
16231
  ngOnDestroy() {
16194
16232
  this._subscriptions.forEach((sub) => sub.unsubscribe());
16195
16233
  }
16234
+ toggleAllSelected($event) {
16235
+ $event.preventDefault();
16236
+ if (this.hasVirtualScroller) {
16237
+ return;
16238
+ }
16239
+ this.allSelected = !this.allSelected;
16240
+ }
16196
16241
  resize() {
16197
16242
  this.organizer.resize();
16198
16243
  }
16244
+ /**
16245
+ * Checks the state of detail panel and if it's opened then
16246
+ * find the matching row and trigger the detail panel
16247
+ */
16248
+ updateDetailState() {
16249
+ // Try to update only when there is something cached and its open.
16250
+ if (this.detailService.state && this.detailService.isOpen) {
16251
+ const row = this.rows.find(row => this.items.trackBy(row.item) === this.items.trackBy(this.detailService.state));
16252
+ /**
16253
+ * Reopen updated row or close it
16254
+ */
16255
+ if (row) {
16256
+ this.detailService.open(row.item, row.detailButton.nativeElement);
16257
+ // always keep open when virtual scroll is available otherwise close it
16258
+ }
16259
+ else if (!this.hasVirtualScroller) {
16260
+ // Using setTimeout to make sure the inner cycles in rows are done
16261
+ setTimeout(() => {
16262
+ this.detailService.close();
16263
+ });
16264
+ }
16265
+ }
16266
+ }
16199
16267
  /**
16200
16268
  * Public method to re-trigger the computation of displayed items manually
16201
16269
  */
@@ -16220,7 +16288,7 @@ ClrDatagrid.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
16220
16288
  ColumnsService,
16221
16289
  DisplayModeService,
16222
16290
  KeyNavigationGridController,
16223
- ], queries: [{ propertyName: "iterator", first: true, predicate: ClrDatagridItems, descendants: true }, { propertyName: "placeholder", first: true, predicate: ClrDatagridPlaceholder, descendants: true }, { propertyName: "columns", predicate: ClrDatagridColumn }, { propertyName: "rows", predicate: ClrDatagridRow }], viewQueries: [{ propertyName: "datagrid", first: true, predicate: ["datagrid"], descendants: true, read: ElementRef }, { propertyName: "datagridTable", first: true, predicate: ["datagridTable"], descendants: true, read: ElementRef }, { propertyName: "scrollableColumns", first: true, predicate: ["scrollableColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_projectedDisplayColumns", first: true, predicate: ["projectedDisplayColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_projectedCalculationColumns", first: true, predicate: ["projectedCalculationColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_displayedRows", first: true, predicate: ["displayedRows"], descendants: true, read: ViewContainerRef }, { propertyName: "_calculationRows", first: true, predicate: ["calculationRows"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<ng-content select=\"clr-dg-action-bar\"></ng-content>\n<div class=\"datagrid-outer-wrapper\">\n <div class=\"datagrid-inner-wrapper\">\n <div class=\"datagrid\" #datagrid [attr.aria-hidden]=\"detailService.isOpen ? true : null\">\n <div class=\"datagrid-table-wrapper\">\n <div role=\"grid\" class=\"datagrid-table\" tabindex=\"-1\" #datagridTable>\n <div role=\"rowgroup\" class=\"datagrid-header\">\n <div role=\"row\" class=\"datagrid-row\">\n <div class=\"datagrid-row-master datagrid-row-flex\">\n <div class=\"datagrid-row-sticky\">\n <!--header for datagrid where you can select multiple rows -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n (keydown.space)=\"allSelected = !allSelected; $event.preventDefault()\"\n >\n <div *ngIf=\"!hasVirtualScroller\" class=\"clr-checkbox-wrapper\">\n <!-- We need to move focus and space-key handling to the parent because of keyboard arrow key navigation,\n which is not able to transfer focus directly on the input when focused with the tab key -->\n <input\n type=\"checkbox\"\n [id]=\"selectAllId\"\n [(ngModel)]=\"allSelected\"\n [attr.aria-label]=\"commonStrings.keys.selectAll\"\n tabindex=\"-1\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"selectAllId\" class=\"clr-control-label clr-col-null\">\n <span class=\"clr-sr-only\">{{commonStrings.keys.selectAll}}</span>\n </label>\n </div>\n\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for datagrid where you can select one row only -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleSelectionAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for single row action; only displayType if we have at least one actionable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-row-actions datagrid-fixed-column\"\n *ngIf=\"rowActionService.hasActionableRow\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleActionableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for carets; only displayType if we have at least one expandable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-expandable-caret datagrid-fixed-column\"\n *ngIf=\"expandableRows.hasExpandableRow || detailService.enabled\"\n >\n <div class=\"clr-sr-only\">{{clrDetailExpandableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n </div>\n <div class=\"datagrid-row-scrollable\">\n <ng-container #projectedDisplayColumns></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div role=\"presentation\" class=\"datagrid-rows\">\n <clr-dg-row class=\"datagrid-loading-more-items-row\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell class=\"datagrid-loading-more-items-cell\">\n <clr-spinner [clrMedium]=\"true\"></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <ng-container #displayedRows></ng-container>\n\n <clr-dg-row class=\"datagrid-loading-more-items-row\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell class=\"datagrid-loading-more-items-cell\">\n <clr-spinner [clrMedium]=\"true\"></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <!-- Custom placeholder overrides the default empty one -->\n <ng-content select=\"clr-dg-placeholder\"></ng-content>\n <clr-dg-placeholder *ngIf=\"!placeholder\"></clr-dg-placeholder>\n </div>\n </div>\n </div>\n </div>\n <ng-content select=\"clr-dg-footer\"></ng-content>\n <div class=\"datagrid-spinner\" *ngIf=\"loading\">\n <clr-spinner clrMedium>Loading</clr-spinner>\n </div>\n </div>\n <ng-content select=\"[clrIfDetail],clr-dg-detail\"></ng-content>\n</div>\n\n<div class=\"datagrid-calculation-table\">\n <div class=\"datagrid-calculation-header\">\n <ng-container #projectedCalculationColumns></ng-container>\n </div>\n <ng-container #calculationRows></ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: ClrLabel, selector: "label", inputs: ["for"] }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }, { kind: "component", type: ClrDatagridCell, selector: "clr-dg-cell" }, { kind: "component", type: ClrDatagridPlaceholder, selector: "clr-dg-placeholder" }, { kind: "component", type: ClrDatagridRow, selector: "clr-dg-row", inputs: ["clrDgItem", "clrDgSelectable", "clrDgSelected", "clrDgExpanded", "clrDgDetailOpenLabel", "clrDgDetailCloseLabel", "clrDgRowSelectionLabel"], outputs: ["clrDgSelectedChange", "clrDgExpandedChange"] }, { kind: "directive", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select" }, { kind: "directive", type: DatagridCellRenderer, selector: "clr-dg-cell" }, { kind: "directive", type: DatagridRowRenderer, selector: "clr-dg-row, clr-dg-row-detail" }, { kind: "directive", type: ActionableOompaLoompa, selector: "clr-datagrid, clr-dg-row" }, { kind: "directive", type: ExpandableOompaLoompa, selector: "clr-datagrid, clr-dg-row" }] });
16291
+ ], queries: [{ propertyName: "iterator", first: true, predicate: ClrDatagridItems, descendants: true }, { propertyName: "placeholder", first: true, predicate: ClrDatagridPlaceholder, descendants: true }, { propertyName: "columns", predicate: ClrDatagridColumn }, { propertyName: "rows", predicate: ClrDatagridRow }], viewQueries: [{ propertyName: "datagrid", first: true, predicate: ["datagrid"], descendants: true, read: ElementRef }, { propertyName: "datagridTable", first: true, predicate: ["datagridTable"], descendants: true, read: ElementRef }, { propertyName: "scrollableColumns", first: true, predicate: ["scrollableColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_projectedDisplayColumns", first: true, predicate: ["projectedDisplayColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_projectedCalculationColumns", first: true, predicate: ["projectedCalculationColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_displayedRows", first: true, predicate: ["displayedRows"], descendants: true, read: ViewContainerRef }, { propertyName: "_calculationRows", first: true, predicate: ["calculationRows"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<ng-content select=\"clr-dg-action-bar\"></ng-content>\n<div class=\"datagrid-outer-wrapper\">\n <div class=\"datagrid-inner-wrapper\">\n <div class=\"datagrid\" #datagrid [attr.aria-hidden]=\"detailService.isOpen ? true : null\">\n <div class=\"datagrid-table-wrapper\">\n <div role=\"grid\" class=\"datagrid-table\" tabindex=\"-1\" #datagridTable>\n <div role=\"rowgroup\" class=\"datagrid-header\">\n <div role=\"row\" class=\"datagrid-row\">\n <div class=\"datagrid-row-master datagrid-row-flex\">\n <div class=\"datagrid-row-sticky\">\n <!--header for datagrid where you can select multiple rows -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n (keydown.space)=\"toggleAllSelected($event)\"\n >\n <div *ngIf=\"!hasVirtualScroller\" class=\"clr-checkbox-wrapper\">\n <!-- We need to move focus and space-key handling to the parent because of keyboard arrow key navigation,\n which is not able to transfer focus directly on the input when focused with the tab key -->\n <input\n type=\"checkbox\"\n [id]=\"selectAllId\"\n [(ngModel)]=\"allSelected\"\n [attr.aria-label]=\"commonStrings.keys.selectAll\"\n tabindex=\"-1\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"selectAllId\" class=\"clr-control-label clr-col-null\">\n <span class=\"clr-sr-only\">{{commonStrings.keys.selectAll}}</span>\n </label>\n </div>\n\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for datagrid where you can select one row only -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleSelectionAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for single row action; only displayType if we have at least one actionable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-row-actions datagrid-fixed-column\"\n *ngIf=\"rowActionService.hasActionableRow\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleActionableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for carets; only displayType if we have at least one expandable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-expandable-caret datagrid-fixed-column\"\n *ngIf=\"expandableRows.hasExpandableRow || detailService.enabled\"\n >\n <div class=\"clr-sr-only\">{{clrDetailExpandableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n </div>\n <div class=\"datagrid-row-scrollable\">\n <ng-container #projectedDisplayColumns></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div role=\"presentation\" class=\"datagrid-rows\">\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <ng-container #displayedRows></ng-container>\n\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <!-- Custom placeholder overrides the default empty one -->\n <ng-content select=\"clr-dg-placeholder\"></ng-content>\n <clr-dg-placeholder *ngIf=\"!placeholder\"></clr-dg-placeholder>\n </div>\n </div>\n </div>\n </div>\n <ng-content select=\"clr-dg-footer\"></ng-content>\n <div class=\"datagrid-spinner\" *ngIf=\"loading\">\n <clr-spinner clrMedium>Loading</clr-spinner>\n </div>\n </div>\n <ng-content select=\"[clrIfDetail],clr-dg-detail\"></ng-content>\n</div>\n\n<div class=\"datagrid-calculation-table\">\n <div class=\"datagrid-calculation-header\">\n <ng-container #projectedCalculationColumns></ng-container>\n </div>\n <ng-container #calculationRows></ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: ClrLabel, selector: "label", inputs: ["for"] }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }, { kind: "component", type: ClrDatagridCell, selector: "clr-dg-cell" }, { kind: "component", type: ClrDatagridPlaceholder, selector: "clr-dg-placeholder" }, { kind: "component", type: ClrDatagridRow, selector: "clr-dg-row", inputs: ["clrDgDetailDisabled", "clrDgDetailHidden", "clrDgItem", "clrDgSelectable", "clrDgSelected", "clrDgExpanded", "clrDgDetailOpenLabel", "clrDgDetailCloseLabel", "clrDgRowSelectionLabel"], outputs: ["clrDgSelectedChange", "clrDgExpandedChange"] }, { kind: "directive", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select" }, { kind: "directive", type: DatagridCellRenderer, selector: "clr-dg-cell" }, { kind: "directive", type: DatagridRowRenderer, selector: "clr-dg-row, clr-dg-row-detail" }, { kind: "directive", type: ActionableOompaLoompa, selector: "clr-datagrid, clr-dg-row" }, { kind: "directive", type: ExpandableOompaLoompa, selector: "clr-datagrid, clr-dg-row" }] });
16224
16292
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagrid, decorators: [{
16225
16293
  type: Component,
16226
16294
  args: [{ selector: 'clr-datagrid', providers: [
@@ -16242,7 +16310,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
16242
16310
  ], host: {
16243
16311
  '[class.datagrid-host]': 'true',
16244
16312
  '[class.datagrid-detail-open]': 'detailService.isOpen',
16245
- }, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<ng-content select=\"clr-dg-action-bar\"></ng-content>\n<div class=\"datagrid-outer-wrapper\">\n <div class=\"datagrid-inner-wrapper\">\n <div class=\"datagrid\" #datagrid [attr.aria-hidden]=\"detailService.isOpen ? true : null\">\n <div class=\"datagrid-table-wrapper\">\n <div role=\"grid\" class=\"datagrid-table\" tabindex=\"-1\" #datagridTable>\n <div role=\"rowgroup\" class=\"datagrid-header\">\n <div role=\"row\" class=\"datagrid-row\">\n <div class=\"datagrid-row-master datagrid-row-flex\">\n <div class=\"datagrid-row-sticky\">\n <!--header for datagrid where you can select multiple rows -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n (keydown.space)=\"allSelected = !allSelected; $event.preventDefault()\"\n >\n <div *ngIf=\"!hasVirtualScroller\" class=\"clr-checkbox-wrapper\">\n <!-- We need to move focus and space-key handling to the parent because of keyboard arrow key navigation,\n which is not able to transfer focus directly on the input when focused with the tab key -->\n <input\n type=\"checkbox\"\n [id]=\"selectAllId\"\n [(ngModel)]=\"allSelected\"\n [attr.aria-label]=\"commonStrings.keys.selectAll\"\n tabindex=\"-1\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"selectAllId\" class=\"clr-control-label clr-col-null\">\n <span class=\"clr-sr-only\">{{commonStrings.keys.selectAll}}</span>\n </label>\n </div>\n\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for datagrid where you can select one row only -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleSelectionAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for single row action; only displayType if we have at least one actionable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-row-actions datagrid-fixed-column\"\n *ngIf=\"rowActionService.hasActionableRow\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleActionableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for carets; only displayType if we have at least one expandable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-expandable-caret datagrid-fixed-column\"\n *ngIf=\"expandableRows.hasExpandableRow || detailService.enabled\"\n >\n <div class=\"clr-sr-only\">{{clrDetailExpandableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n </div>\n <div class=\"datagrid-row-scrollable\">\n <ng-container #projectedDisplayColumns></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div role=\"presentation\" class=\"datagrid-rows\">\n <clr-dg-row class=\"datagrid-loading-more-items-row\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell class=\"datagrid-loading-more-items-cell\">\n <clr-spinner [clrMedium]=\"true\"></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <ng-container #displayedRows></ng-container>\n\n <clr-dg-row class=\"datagrid-loading-more-items-row\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell class=\"datagrid-loading-more-items-cell\">\n <clr-spinner [clrMedium]=\"true\"></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <!-- Custom placeholder overrides the default empty one -->\n <ng-content select=\"clr-dg-placeholder\"></ng-content>\n <clr-dg-placeholder *ngIf=\"!placeholder\"></clr-dg-placeholder>\n </div>\n </div>\n </div>\n </div>\n <ng-content select=\"clr-dg-footer\"></ng-content>\n <div class=\"datagrid-spinner\" *ngIf=\"loading\">\n <clr-spinner clrMedium>Loading</clr-spinner>\n </div>\n </div>\n <ng-content select=\"[clrIfDetail],clr-dg-detail\"></ng-content>\n</div>\n\n<div class=\"datagrid-calculation-table\">\n <div class=\"datagrid-calculation-header\">\n <ng-container #projectedCalculationColumns></ng-container>\n </div>\n <ng-container #calculationRows></ng-container>\n</div>\n" }]
16313
+ }, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<ng-content select=\"clr-dg-action-bar\"></ng-content>\n<div class=\"datagrid-outer-wrapper\">\n <div class=\"datagrid-inner-wrapper\">\n <div class=\"datagrid\" #datagrid [attr.aria-hidden]=\"detailService.isOpen ? true : null\">\n <div class=\"datagrid-table-wrapper\">\n <div role=\"grid\" class=\"datagrid-table\" tabindex=\"-1\" #datagridTable>\n <div role=\"rowgroup\" class=\"datagrid-header\">\n <div role=\"row\" class=\"datagrid-row\">\n <div class=\"datagrid-row-master datagrid-row-flex\">\n <div class=\"datagrid-row-sticky\">\n <!--header for datagrid where you can select multiple rows -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n (keydown.space)=\"toggleAllSelected($event)\"\n >\n <div *ngIf=\"!hasVirtualScroller\" class=\"clr-checkbox-wrapper\">\n <!-- We need to move focus and space-key handling to the parent because of keyboard arrow key navigation,\n which is not able to transfer focus directly on the input when focused with the tab key -->\n <input\n type=\"checkbox\"\n [id]=\"selectAllId\"\n [(ngModel)]=\"allSelected\"\n [attr.aria-label]=\"commonStrings.keys.selectAll\"\n tabindex=\"-1\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"selectAllId\" class=\"clr-control-label clr-col-null\">\n <span class=\"clr-sr-only\">{{commonStrings.keys.selectAll}}</span>\n </label>\n </div>\n\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for datagrid where you can select one row only -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleSelectionAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for single row action; only displayType if we have at least one actionable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-row-actions datagrid-fixed-column\"\n *ngIf=\"rowActionService.hasActionableRow\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleActionableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for carets; only displayType if we have at least one expandable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-expandable-caret datagrid-fixed-column\"\n *ngIf=\"expandableRows.hasExpandableRow || detailService.enabled\"\n >\n <div class=\"clr-sr-only\">{{clrDetailExpandableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n </div>\n <div class=\"datagrid-row-scrollable\">\n <ng-container #projectedDisplayColumns></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div role=\"presentation\" class=\"datagrid-rows\">\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <ng-container #displayedRows></ng-container>\n\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <!-- Custom placeholder overrides the default empty one -->\n <ng-content select=\"clr-dg-placeholder\"></ng-content>\n <clr-dg-placeholder *ngIf=\"!placeholder\"></clr-dg-placeholder>\n </div>\n </div>\n </div>\n </div>\n <ng-content select=\"clr-dg-footer\"></ng-content>\n <div class=\"datagrid-spinner\" *ngIf=\"loading\">\n <clr-spinner clrMedium>Loading</clr-spinner>\n </div>\n </div>\n <ng-content select=\"[clrIfDetail],clr-dg-detail\"></ng-content>\n</div>\n\n<div class=\"datagrid-calculation-table\">\n <div class=\"datagrid-calculation-header\">\n <ng-container #projectedCalculationColumns></ng-container>\n </div>\n <ng-container #calculationRows></ng-container>\n</div>\n" }]
16246
16314
  }], ctorParameters: function () {
16247
16315
  return [{ type: DatagridRenderOrganizer }, { type: Items }, { type: ExpandableRowsCount }, { type: Selection }, { type: RowActionService }, { type: StateProvider }, { type: DisplayModeService }, { type: i0.Renderer2 }, { type: DetailService }, { type: undefined, decorators: [{
16248
16316
  type: Inject,
@@ -16413,6 +16481,7 @@ class ClrDatagridActionOverflow {
16413
16481
  ClrDatagridActionOverflow.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridActionOverflow, deps: [{ token: RowActionService }, { token: ClrCommonStringsService }, { token: PLATFORM_ID }, { token: i0.NgZone }, { token: ClrPopoverToggleService }], target: i0.ɵɵFactoryTarget.Component });
16414
16482
  ClrDatagridActionOverflow.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridActionOverflow, selector: "clr-dg-action-overflow", inputs: { buttonLabel: ["clrDgActionOverflowButtonLabel", "buttonLabel"], open: ["clrDgActionOverflowOpen", "open"] }, outputs: { openChange: "clrDgActionOverflowOpenChange" }, viewQueries: [{ propertyName: "keyFocus", first: true, predicate: ClrKeyFocus, descendants: true }], hostDirectives: [{ directive: ClrPopoverHostDirective }], ngImport: i0, template: `
16415
16483
  <button
16484
+ tabindex="-1"
16416
16485
  class="datagrid-action-toggle"
16417
16486
  type="button"
16418
16487
  role="button"
@@ -16447,6 +16516,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
16447
16516
  hostDirectives: [ClrPopoverHostDirective],
16448
16517
  template: `
16449
16518
  <button
16519
+ tabindex="-1"
16450
16520
  class="datagrid-action-toggle"
16451
16521
  type="button"
16452
16522
  role="button"
@@ -16754,10 +16824,13 @@ class ClrDatagridDetailHeader {
16754
16824
  get titleId() {
16755
16825
  return `${this.detailService.id}-title`;
16756
16826
  }
16827
+ ngAfterViewInit() {
16828
+ this.title.nativeElement.focus();
16829
+ }
16757
16830
  }
16758
16831
  ClrDatagridDetailHeader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridDetailHeader, deps: [{ token: DetailService }, { token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Component });
16759
- ClrDatagridDetailHeader.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridDetailHeader, selector: "clr-dg-detail-header", host: { properties: { "class.datagrid-detail-header": "true" } }, ngImport: i0, template: `
16760
- <div class="datagrid-detail-header-title" cdkFocusInitial tabindex="-1" [id]="titleId">
16832
+ ClrDatagridDetailHeader.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridDetailHeader, selector: "clr-dg-detail-header", host: { properties: { "class.datagrid-detail-header": "true" } }, viewQueries: [{ propertyName: "title", first: true, predicate: ["title"], descendants: true }], ngImport: i0, template: `
16833
+ <div #title class="datagrid-detail-header-title" tabindex="-1" [id]="titleId">
16761
16834
  <ng-content></ng-content>
16762
16835
  </div>
16763
16836
  <div class="datagrid-detail-pane-close">
@@ -16779,7 +16852,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
16779
16852
  '[class.datagrid-detail-header]': 'true',
16780
16853
  },
16781
16854
  template: `
16782
- <div class="datagrid-detail-header-title" cdkFocusInitial tabindex="-1" [id]="titleId">
16855
+ <div #title class="datagrid-detail-header-title" tabindex="-1" [id]="titleId">
16783
16856
  <ng-content></ng-content>
16784
16857
  </div>
16785
16858
  <div class="datagrid-detail-pane-close">
@@ -16794,7 +16867,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
16794
16867
  </div>
16795
16868
  `,
16796
16869
  }]
16797
- }], ctorParameters: function () { return [{ type: DetailService }, { type: ClrCommonStringsService }]; } });
16870
+ }], ctorParameters: function () { return [{ type: DetailService }, { type: ClrCommonStringsService }]; }, propDecorators: { title: [{
16871
+ type: ViewChild,
16872
+ args: ['title']
16873
+ }] } });
16798
16874
 
16799
16875
  /*
16800
16876
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
@@ -16807,21 +16883,43 @@ class ClrDatagridDetail {
16807
16883
  this.detailService = detailService;
16808
16884
  this.commonStrings = commonStrings;
16809
16885
  }
16886
+ get labelledBy() {
16887
+ var _a;
16888
+ if (this.ariaLabelledBy) {
16889
+ return this.header ? `${this.header.titleId} ${this.ariaLabelledBy}` : this.ariaLabelledBy;
16890
+ }
16891
+ else if (this.ariaLabel) {
16892
+ // If aria-label is set by the end user, do not set aria-labelledby
16893
+ return null;
16894
+ }
16895
+ else {
16896
+ return ((_a = this.header) === null || _a === void 0 ? void 0 : _a.titleId) || '';
16897
+ }
16898
+ }
16899
+ get label() {
16900
+ if (!this.ariaLabelledBy) {
16901
+ return this.ariaLabel || null;
16902
+ }
16903
+ else {
16904
+ return null;
16905
+ }
16906
+ }
16810
16907
  close() {
16811
16908
  this.detailService.close();
16812
16909
  }
16813
16910
  }
16814
16911
  ClrDatagridDetail.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridDetail, deps: [{ token: DetailService }, { token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Component });
16815
- ClrDatagridDetail.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridDetail, selector: "clr-dg-detail", host: { properties: { "class.datagrid-detail-pane": "true" } }, queries: [{ propertyName: "header", first: true, predicate: ClrDatagridDetailHeader, descendants: true }], ngImport: i0, template: `
16912
+ ClrDatagridDetail.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridDetail, selector: "clr-dg-detail", inputs: { ariaLabelledBy: ["clrDetailAriaLabelledBy", "ariaLabelledBy"], ariaLabel: ["clrDetailAriaLabel", "ariaLabel"] }, host: { properties: { "class.datagrid-detail-pane": "true" } }, queries: [{ propertyName: "header", first: true, predicate: ClrDatagridDetailHeader, descendants: true }], ngImport: i0, template: `
16816
16913
  <div
16817
16914
  cdkTrapFocus
16818
- [cdkTrapFocusAutoCapture]="true"
16915
+ [cdkTrapFocusAutoCapture]="!header"
16819
16916
  class="datagrid-detail-pane-content"
16820
16917
  *ngIf="detailService.isOpen"
16821
16918
  role="dialog"
16822
16919
  [id]="detailService.id"
16823
16920
  aria-modal="true"
16824
- [attr.aria-describedby]="header ? header.titleId : ''"
16921
+ [attr.aria-labelledby]="labelledBy"
16922
+ [attr.aria-label]="label"
16825
16923
  >
16826
16924
  <div class="clr-sr-only">{{ commonStrings.keys.detailPaneStart }}</div>
16827
16925
  <ng-content></ng-content>
@@ -16840,13 +16938,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
16840
16938
  template: `
16841
16939
  <div
16842
16940
  cdkTrapFocus
16843
- [cdkTrapFocusAutoCapture]="true"
16941
+ [cdkTrapFocusAutoCapture]="!header"
16844
16942
  class="datagrid-detail-pane-content"
16845
16943
  *ngIf="detailService.isOpen"
16846
16944
  role="dialog"
16847
16945
  [id]="detailService.id"
16848
16946
  aria-modal="true"
16849
- [attr.aria-describedby]="header ? header.titleId : ''"
16947
+ [attr.aria-labelledby]="labelledBy"
16948
+ [attr.aria-label]="label"
16850
16949
  >
16851
16950
  <div class="clr-sr-only">{{ commonStrings.keys.detailPaneStart }}</div>
16852
16951
  <ng-content></ng-content>
@@ -16854,7 +16953,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
16854
16953
  </div>
16855
16954
  `,
16856
16955
  }]
16857
- }], ctorParameters: function () { return [{ type: DetailService }, { type: ClrCommonStringsService }]; }, propDecorators: { header: [{
16956
+ }], ctorParameters: function () { return [{ type: DetailService }, { type: ClrCommonStringsService }]; }, propDecorators: { ariaLabelledBy: [{
16957
+ type: Input,
16958
+ args: ['clrDetailAriaLabelledBy']
16959
+ }], ariaLabel: [{
16960
+ type: Input,
16961
+ args: ['clrDetailAriaLabel']
16962
+ }], header: [{
16858
16963
  type: ContentChild,
16859
16964
  args: [ClrDatagridDetailHeader]
16860
16965
  }] } });
@@ -17132,6 +17237,9 @@ class ClrIfDetail {
17132
17237
  }
17133
17238
  this.skip = false;
17134
17239
  }
17240
+ get viewContext() {
17241
+ return { $implicit: this.detailService.state };
17242
+ }
17135
17243
  ngOnInit() {
17136
17244
  this.subscriptions.push(this.detailService.stateChange.subscribe(state => {
17137
17245
  if (state === true) {
@@ -17148,12 +17256,11 @@ class ClrIfDetail {
17148
17256
  togglePanel(showPanel) {
17149
17257
  let stateChangeParams = null;
17150
17258
  if (showPanel === true) {
17151
- const embeddedViewContext = { $implicit: this.detailService.state };
17152
- if (this.embeddedViewRef) {
17153
- this.embeddedViewRef.context = embeddedViewContext;
17154
- }
17155
- else {
17156
- this.embeddedViewRef = this.viewContainer.createEmbeddedView(this.templateRef, embeddedViewContext);
17259
+ if (!this.embeddedViewRef) {
17260
+ // Create a context forward `Proxy` that will always bind to the user-specified context,
17261
+ // without having to re-assign it whenever changes.
17262
+ const viewContext = this._createContextForwardProxy();
17263
+ this.embeddedViewRef = this.viewContainer.createEmbeddedView(this.templateRef, viewContext);
17157
17264
  }
17158
17265
  this.skip = true;
17159
17266
  stateChangeParams = this.detailService.state;
@@ -17164,6 +17271,27 @@ class ClrIfDetail {
17164
17271
  }
17165
17272
  this.stateChange.emit(stateChangeParams);
17166
17273
  }
17274
+ /**
17275
+ * For a given outlet instance, we create a proxy object that delegates
17276
+ * to the user-specified context. This allows changing, or swapping out
17277
+ * the context object completely without having to destroy/re-create the view.
17278
+ */
17279
+ _createContextForwardProxy() {
17280
+ return new Proxy({}, {
17281
+ set: (_target, prop, newValue) => {
17282
+ if (!this.viewContext) {
17283
+ return false;
17284
+ }
17285
+ return Reflect.set(this.viewContext, prop, newValue);
17286
+ },
17287
+ get: (_target, prop, receiver) => {
17288
+ if (!this.viewContext) {
17289
+ return undefined;
17290
+ }
17291
+ return Reflect.get(this.viewContext, prop, receiver);
17292
+ },
17293
+ });
17294
+ }
17167
17295
  }
17168
17296
  ClrIfDetail.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrIfDetail, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: DetailService }], target: i0.ɵɵFactoryTarget.Directive });
17169
17297
  ClrIfDetail.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrIfDetail, selector: "[clrIfDetail]", inputs: { state: ["clrIfDetail", "state"] }, outputs: { stateChange: "clrIfDetailChange" }, ngImport: i0 });
@@ -17375,7 +17503,7 @@ class ClrDatagridPagination {
17375
17503
  * Set the input's value to the new current page. This is needed because the code
17376
17504
  * above may have changed the value from what the user entered in.
17377
17505
  */
17378
- this.currentPageInputRef.nativeElement.value = this.page.current;
17506
+ this.currentPageInputRef.nativeElement.value = this.page.current.toString();
17379
17507
  }
17380
17508
  }
17381
17509
  ClrDatagridPagination.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridPagination, deps: [{ token: Page }, { token: ClrCommonStringsService }, { token: DetailService }], target: i0.ɵɵFactoryTarget.Component });
@@ -17696,7 +17824,7 @@ const defaultCdkFixedSizeVirtualScrollInputs = {
17696
17824
  maxBufferPx: 400,
17697
17825
  };
17698
17826
  class ClrDatagridVirtualScrollDirective {
17699
- constructor(changeDetectorRef, iterableDiffers, items, ngZone, templateRef, viewContainerRef, directionality, scrollDispatcher, viewportRuler, datagrid, injector) {
17827
+ constructor(changeDetectorRef, iterableDiffers, items, ngZone, templateRef, viewContainerRef, directionality, scrollDispatcher, viewportRuler, datagrid, columnsService, injector) {
17700
17828
  this.changeDetectorRef = changeDetectorRef;
17701
17829
  this.iterableDiffers = iterableDiffers;
17702
17830
  this.items = items;
@@ -17707,6 +17835,7 @@ class ClrDatagridVirtualScrollDirective {
17707
17835
  this.scrollDispatcher = scrollDispatcher;
17708
17836
  this.viewportRuler = viewportRuler;
17709
17837
  this.datagrid = datagrid;
17838
+ this.columnsService = columnsService;
17710
17839
  this.injector = injector;
17711
17840
  this.renderedRangeChange = new EventEmitter();
17712
17841
  this._cdkFixedSizeVirtualScrollInputs = Object.assign({}, defaultCdkFixedSizeVirtualScrollInputs);
@@ -17719,12 +17848,16 @@ class ClrDatagridVirtualScrollDirective {
17719
17848
  }
17720
17849
  });
17721
17850
  });
17851
+ this.viewRepeater = new _RecycleViewRepeaterStrategy();
17722
17852
  this.cdkVirtualForInputs = {
17723
17853
  cdkVirtualForTrackBy: index => index,
17724
17854
  };
17725
17855
  this.items.smartenUp();
17726
17856
  this.datagrid.hasVirtualScroller = true;
17857
+ this.datagrid.detailService.preventFocusScroll = true;
17727
17858
  this.datagridElementRef = this.datagrid.el;
17859
+ // default
17860
+ this.cdkVirtualForTemplateCacheSize = 20;
17728
17861
  this.mutationChanges.observe(this.datagridElementRef.nativeElement, {
17729
17862
  attributeFilter: ['class'],
17730
17863
  attributeOldValue: true,
@@ -17785,7 +17918,7 @@ class ClrDatagridVirtualScrollDirective {
17785
17918
  ngAfterViewInit() {
17786
17919
  this.injector.runInContext(() => {
17787
17920
  this.virtualScrollViewport = this.createVirtualScrollViewportForDatagrid(this.changeDetectorRef, this.ngZone, this.directionality, this.scrollDispatcher, this.viewportRuler, this.datagridElementRef, this.virtualScrollStrategy);
17788
- this.cdkVirtualFor = new CdkVirtualForOf(this.viewContainerRef, this.templateRef, this.iterableDiffers, new _RecycleViewRepeaterStrategy(), this.virtualScrollViewport, this.ngZone);
17921
+ this.cdkVirtualFor = new CdkVirtualForOf(this.viewContainerRef, this.templateRef, this.iterableDiffers, this.viewRepeater, this.virtualScrollViewport, this.ngZone);
17789
17922
  this.virtualScrollViewport.ngOnInit();
17790
17923
  });
17791
17924
  this.gridRoleElement = this.datagridElementRef.nativeElement.querySelector('[role="grid"]');
@@ -17800,6 +17933,8 @@ class ClrDatagridVirtualScrollDirective {
17800
17933
  if (datagridState.filters) {
17801
17934
  this.virtualScrollViewport.scrollToIndex(0);
17802
17935
  }
17936
+ }), this.columnsService.columnsStateChange.subscribe(() => {
17937
+ this.viewRepeater.detach();
17803
17938
  }));
17804
17939
  }
17805
17940
  ngDoCheck() {
@@ -17875,7 +18010,7 @@ class ClrDatagridVirtualScrollDirective {
17875
18010
  return virtualScrollViewport;
17876
18011
  }
17877
18012
  }
17878
- ClrDatagridVirtualScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.IterableDiffers }, { token: Items, skipSelf: true }, { token: i0.NgZone }, { token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: i1$2.Directionality }, { token: i3$1.ScrollDispatcher }, { token: i3$1.ViewportRuler }, { token: ClrDatagrid }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Directive });
18013
+ ClrDatagridVirtualScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.IterableDiffers }, { token: Items, skipSelf: true }, { token: i0.NgZone }, { token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: i1$2.Directionality }, { token: i3$1.ScrollDispatcher }, { token: i3$1.ViewportRuler }, { token: ClrDatagrid }, { token: ColumnsService }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Directive });
17879
18014
  ClrDatagridVirtualScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridVirtualScrollDirective, selector: "[ClrVirtualScroll]", inputs: { cdkVirtualForOf: ["clrVirtualRowsOf", "cdkVirtualForOf"], cdkVirtualForTrackBy: ["clrVirtualRowsTrackBy", "cdkVirtualForTrackBy"], cdkVirtualForTemplate: ["clrVirtualRowsTemplate", "cdkVirtualForTemplate"], cdkVirtualForTemplateCacheSize: ["clrVirtualRowsTemplateCacheSize", "cdkVirtualForTemplateCacheSize"], itemSize: ["clrVirtualRowsItemSize", "itemSize"], minBufferPx: ["clrVirtualRowsMinBufferPx", "minBufferPx"], maxBufferPx: ["clrVirtualRowsMaxBufferPx", "maxBufferPx"] }, outputs: { renderedRangeChange: "renderedRangeChange" }, providers: [Items], ngImport: i0 });
17880
18015
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, decorators: [{
17881
18016
  type: Directive,
@@ -17886,7 +18021,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17886
18021
  }], ctorParameters: function () {
17887
18022
  return [{ type: i0.ChangeDetectorRef }, { type: i0.IterableDiffers }, { type: Items, decorators: [{
17888
18023
  type: SkipSelf
17889
- }] }, { type: i0.NgZone }, { type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: i1$2.Directionality }, { type: i3$1.ScrollDispatcher }, { type: i3$1.ViewportRuler }, { type: ClrDatagrid }, { type: i0.EnvironmentInjector }];
18024
+ }] }, { type: i0.NgZone }, { type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: i1$2.Directionality }, { type: i3$1.ScrollDispatcher }, { type: i3$1.ViewportRuler }, { type: ClrDatagrid }, { type: ColumnsService }, { type: i0.EnvironmentInjector }];
17890
18025
  }, propDecorators: { renderedRangeChange: [{
17891
18026
  type: Output
17892
18027
  }], cdkVirtualForOf: [{
@@ -18114,6 +18249,9 @@ class DatagridMainRenderer {
18114
18249
  this.subscriptions.push(this.detailService.stateChange.subscribe(state => this.toggleDetailPane(state)));
18115
18250
  this.subscriptions.push(this.items.change.subscribe(() => (this.shouldStabilizeColumns = true)));
18116
18251
  }
18252
+ ngOnInit() {
18253
+ this.columnsService.columnsStateChange.subscribe(change => this.columnStateChanged(change));
18254
+ }
18117
18255
  ngAfterContentInit() {
18118
18256
  this.setupColumns();
18119
18257
  this.subscriptions.push(this.headers.changes.subscribe(() => {
@@ -18123,7 +18261,6 @@ class DatagridMainRenderer {
18123
18261
  this.columnsSizesStable = false;
18124
18262
  this.stabilizeColumns();
18125
18263
  }));
18126
- this.listenForColumnChanges();
18127
18264
  }
18128
18265
  // Initialize and set Table width for horizontal scrolling here.
18129
18266
  ngAfterViewInit() {
@@ -18131,7 +18268,9 @@ class DatagridMainRenderer {
18131
18268
  }
18132
18269
  ngAfterViewChecked() {
18133
18270
  if (this.shouldStabilizeColumns) {
18134
- this.stabilizeColumns();
18271
+ setTimeout(() => {
18272
+ this.stabilizeColumns();
18273
+ }, 0);
18135
18274
  }
18136
18275
  if (this.shouldComputeHeight()) {
18137
18276
  this.ngZone.runOutsideAngular(() => {
@@ -18165,7 +18304,10 @@ class DatagridMainRenderer {
18165
18304
  setupColumns() {
18166
18305
  this.headers.forEach((header, index) => header.setColumnState(index));
18167
18306
  this.columnsService.columns.splice(this.headers.length); // Trim any old columns
18168
- this.rows.forEach(row => row.setCellsState());
18307
+ // Sets columnIndex for each column
18308
+ this.columnsService.columns.forEach((column, index) => {
18309
+ this.columnsService.emitStateChange(column, { changes: [DatagridColumnChanges.INITIALIZE], columnIndex: index });
18310
+ });
18169
18311
  }
18170
18312
  shouldComputeHeight() {
18171
18313
  if (!this._heightSet && this.page.size > 0) {
@@ -18219,6 +18361,10 @@ class DatagridMainRenderer {
18219
18361
  });
18220
18362
  }
18221
18363
  columnStateChanged(state) {
18364
+ // eslint-disable-next-line eqeqeq
18365
+ if (!this.headers || state.columnIndex == null) {
18366
+ return;
18367
+ }
18222
18368
  const columnIndex = state.columnIndex;
18223
18369
  if (state.changes && state.changes.length) {
18224
18370
  state.changes.forEach(change => {
@@ -18226,37 +18372,40 @@ class DatagridMainRenderer {
18226
18372
  case DatagridColumnChanges.WIDTH:
18227
18373
  this.headers.get(columnIndex).setWidth(state);
18228
18374
  this.rows.forEach(row => {
18229
- if (row.cells && row.cells.length) {
18375
+ var _a, _b;
18376
+ if ((row === null || row === void 0 ? void 0 : row.cells.length) === this.columnsService.columns.length) {
18230
18377
  row.cells.get(columnIndex).setWidth(state);
18378
+ (_b = (_a = row.expandableRow) === null || _a === void 0 ? void 0 : _a.cells.get(columnIndex)) === null || _b === void 0 ? void 0 : _b.setWidth(state);
18231
18379
  }
18232
18380
  });
18233
18381
  break;
18234
18382
  case DatagridColumnChanges.HIDDEN:
18235
18383
  this.headers.get(columnIndex).setHidden(state);
18236
18384
  this.rows.forEach(row => {
18385
+ var _a, _b;
18237
18386
  if (row.cells && row.cells.length) {
18238
18387
  row.cells.get(columnIndex).setHidden(state);
18388
+ (_b = (_a = row.expandableRow) === null || _a === void 0 ? void 0 : _a.cells.get(columnIndex)) === null || _b === void 0 ? void 0 : _b.setHidden(state);
18239
18389
  }
18240
18390
  });
18241
18391
  this.keyNavigation.resetKeyGrid();
18242
18392
  break;
18393
+ case DatagridColumnChanges.INITIALIZE:
18394
+ if (state.hideable && state.hidden) {
18395
+ this.headers.get(columnIndex).setHidden(state);
18396
+ this.rows.forEach(row => {
18397
+ var _a;
18398
+ row.setCellsState();
18399
+ (_a = row.expandableRow) === null || _a === void 0 ? void 0 : _a.setCellsState();
18400
+ });
18401
+ }
18402
+ break;
18243
18403
  default:
18244
18404
  break;
18245
18405
  }
18246
18406
  });
18247
18407
  }
18248
18408
  }
18249
- listenForColumnChanges() {
18250
- this.columnsService.columns.forEach((column, index) => {
18251
- this.columnsService.emitStateChange(column, { changes: [], columnIndex: index });
18252
- });
18253
- /*
18254
- Merges all column subject so we can track them at once
18255
- and receive only the changed column as result
18256
- */
18257
- const columnChanges = merge(...this.columnsService.columns);
18258
- this.subscriptions.push(columnChanges.subscribe(change => this.columnStateChanged(change)));
18259
- }
18260
18409
  /**
18261
18410
  * Triggers a whole re-rendring cycle to set column sizes, if needed.
18262
18411
  */
@@ -18274,7 +18423,7 @@ class DatagridMainRenderer {
18274
18423
  }
18275
18424
  }
18276
18425
  DatagridMainRenderer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridMainRenderer, deps: [{ token: DatagridRenderOrganizer }, { token: Items }, { token: Page }, { token: DomAdapter }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: DetailService }, { token: TableSizeService }, { token: ColumnsService }, { token: i0.NgZone }, { token: KeyNavigationGridController }], target: i0.ɵɵFactoryTarget.Directive });
18277
- DatagridMainRenderer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: DatagridMainRenderer, selector: "clr-datagrid", providers: [{ provide: DomAdapter, useFactory: domAdapterFactory, deps: [PLATFORM_ID] }], queries: [{ propertyName: "headers", predicate: DatagridHeaderRenderer }, { propertyName: "rows", predicate: DatagridRowRenderer, descendants: true }], ngImport: i0 });
18426
+ DatagridMainRenderer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: DatagridMainRenderer, selector: "clr-datagrid", providers: [{ provide: DomAdapter, useFactory: domAdapterFactory, deps: [PLATFORM_ID] }], queries: [{ propertyName: "headers", predicate: DatagridHeaderRenderer }, { propertyName: "rows", predicate: DatagridRowRenderer }], ngImport: i0 });
18278
18427
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridMainRenderer, decorators: [{
18279
18428
  type: Directive,
18280
18429
  args: [{
@@ -18286,7 +18435,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
18286
18435
  args: [DatagridHeaderRenderer]
18287
18436
  }], rows: [{
18288
18437
  type: ContentChildren,
18289
- args: [DatagridRowRenderer, { descendants: true }]
18438
+ args: [DatagridRowRenderer]
18290
18439
  }] } });
18291
18440
 
18292
18441
  /*
@@ -18748,7 +18897,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
18748
18897
  }] } });
18749
18898
  function eventIsInputEvent(event) {
18750
18899
  const targetElement = event === null || event === void 0 ? void 0 : event.target;
18751
- return (targetElement === null || targetElement === void 0 ? void 0 : targetElement.tagName) === 'INPUT';
18900
+ return (targetElement === null || targetElement === void 0 ? void 0 : targetElement.tagName)
18901
+ ? ['INPUT', 'TEXTAREA', 'BUTTON', 'A', 'SELECT', 'OPTION'].includes(targetElement.tagName)
18902
+ : false;
18752
18903
  }
18753
18904
 
18754
18905
  /*
@@ -19722,7 +19873,7 @@ class ClrTreeNode {
19722
19873
  }
19723
19874
  setTabIndex(value) {
19724
19875
  this.contentContainerTabindex = value;
19725
- this.contentContainer.nativeElement.setAttribute('tabindex', value);
19876
+ this.contentContainer.nativeElement.setAttribute('tabindex', value.toString());
19726
19877
  }
19727
19878
  checkTabIndex(nodeId) {
19728
19879
  if (isPlatformBrowser(this.platformId) && this.nodeId !== nodeId && this.contentContainerTabindex !== -1) {
@@ -21982,18 +22133,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21982
22133
  * This software is released under MIT license.
21983
22134
  * The full license information can be found in LICENSE in the root directory of this project.
21984
22135
  */
21985
- const createCdsCloseButton = (document, ariaLabel) => {
21986
- const cdsCloseButton = document.createElement('cds-internal-close-button');
21987
- cdsCloseButton.setAttribute('icon-size', '32');
21988
- cdsCloseButton.setAttribute('aria-label', ariaLabel);
21989
- cdsCloseButton.setAttribute('aria-hidden', 'true');
21990
- cdsCloseButton.setAttribute('type', 'button');
22136
+ const createCloseButton = (document, ariaLabel) => {
22137
+ const closeButton = document.createElement('button');
22138
+ closeButton.setAttribute('aria-label', ariaLabel);
22139
+ closeButton.setAttribute('aria-hidden', 'true');
22140
+ closeButton.innerHTML = `
22141
+ <cds-icon
22142
+ inner-offset="1"
22143
+ shape="close"
22144
+ size="32"
22145
+ </cds-icon>
22146
+ `;
21991
22147
  /**
21992
22148
  * The button is hidden by default based on our Desktop-first approach.
21993
22149
  */
21994
- cdsCloseButton.setAttribute('hidden', 'true');
21995
- cdsCloseButton.className = 'clr-nav-close';
21996
- return cdsCloseButton;
22150
+ closeButton.setAttribute('hidden', 'true');
22151
+ closeButton.className = 'clr-nav-close';
22152
+ return closeButton;
21997
22153
  };
21998
22154
  class ClrNavLevel {
21999
22155
  constructor(platformId, cdkTrapFocus, responsiveNavService, elementRef, renderer, injector) {
@@ -22045,7 +22201,7 @@ class ClrNavLevel {
22045
22201
  this.addNavClass(this.level);
22046
22202
  }
22047
22203
  ngAfterViewInit() {
22048
- const closeButton = createCdsCloseButton(this._document, this.closeButtonAriaLabel);
22204
+ const closeButton = createCloseButton(this._document, this.closeButtonAriaLabel);
22049
22205
  this.renderer.listen(closeButton, 'click', this.close.bind(this));
22050
22206
  this.renderer.insertBefore(this.elementRef.nativeElement, closeButton, this.elementRef.nativeElement.firstChild); // Adding the button at the top of the nav
22051
22207
  if (this._document.body.clientWidth < LARGE_BREAKPOINT) {
@@ -23556,6 +23712,13 @@ class ClrModal {
23556
23712
  this._openChanged.emit(true);
23557
23713
  this.modalStackService.trackModalOpen(this);
23558
23714
  }
23715
+ backdropClick() {
23716
+ if (this.staticBackdrop) {
23717
+ this.title.nativeElement.focus();
23718
+ return;
23719
+ }
23720
+ this.close();
23721
+ }
23559
23722
  close() {
23560
23723
  if (this.stopClose) {
23561
23724
  this.altClose.emit(false);
@@ -23575,7 +23738,7 @@ class ClrModal {
23575
23738
  }
23576
23739
  }
23577
23740
  ClrModal.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModal, deps: [{ token: ScrollingService }, { token: ClrCommonStringsService }, { token: ModalStackService }, { token: ClrModalConfigurationService }], target: i0.ɵɵFactoryTarget.Component });
23578
- ClrModal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrModal, selector: "clr-modal", inputs: { _open: ["clrModalOpen", "_open"], closable: ["clrModalClosable", "closable"], closeButtonAriaLabel: ["clrModalCloseButtonAriaLabel", "closeButtonAriaLabel"], size: ["clrModalSize", "size"], staticBackdrop: ["clrModalStaticBackdrop", "staticBackdrop"], skipAnimation: ["clrModalSkipAnimation", "skipAnimation"], stopClose: ["clrModalPreventClose", "stopClose"], labelledBy: ["clrModalLabelledById", "labelledBy"], bypassScrollService: ["clrModalOverrideScrollService", "bypassScrollService"] }, outputs: { _openChanged: "clrModalOpenChange", altClose: "clrModalAlternateClose" }, host: { properties: { "class.open": "this._open" } }, usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<div *ngIf=\"_open\" class=\"modal\" [class.modal-full-screen]=\"size == 'full-screen'\">\n <!--fixme: revisit when ngClass works with exit animation-->\n <div\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n [@fadeMove]=\"fadeMove\"\n (@fadeMove.done)=\"fadeDone($event)\"\n class=\"modal-dialog\"\n [class.modal-sm]=\"size == 'sm'\"\n [class.modal-lg]=\"size == 'lg'\"\n [class.modal-xl]=\"size == 'xl'\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-hidden]=\"!_open\"\n [attr.aria-labelledby]=\"labelledBy || modalId\"\n >\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentStart}}</div>\n <div class=\"modal-content-wrapper\">\n <!-- only used in wizards -->\n <ng-content select=\".modal-nav\"></ng-content>\n\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <div class=\"modal-title-wrapper\" id=\"{{modalId}}\" cdkFocusInitial tabindex=\"-1\">\n <ng-content select=\".modal-title\"></ng-content>\n </div>\n <button\n type=\"button\"\n [attr.aria-label]=\"closeButtonAriaLabel || commonStrings.keys.close\"\n class=\"close\"\n *ngIf=\"closable\"\n (click)=\"close()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div class=\"modal-body-wrapper\">\n <ng-content select=\".modal-body\"></ng-content>\n </div>\n <ng-content select=\".modal-footer\"></ng-content>\n </div>\n </div>\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentEnd}}</div>\n </div>\n\n <div [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"staticBackdrop || close()\"></div>\n</div>\n", styles: [":host{display:none}:host.open{display:inline}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: CdkTrapFocusModule_CdkTrapFocus, selector: "[cdkTrapFocus]" }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }], viewProviders: [ScrollingService], animations: [
23741
+ ClrModal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrModal, selector: "clr-modal", inputs: { _open: ["clrModalOpen", "_open"], closable: ["clrModalClosable", "closable"], closeButtonAriaLabel: ["clrModalCloseButtonAriaLabel", "closeButtonAriaLabel"], size: ["clrModalSize", "size"], staticBackdrop: ["clrModalStaticBackdrop", "staticBackdrop"], skipAnimation: ["clrModalSkipAnimation", "skipAnimation"], stopClose: ["clrModalPreventClose", "stopClose"], labelledBy: ["clrModalLabelledById", "labelledBy"], bypassScrollService: ["clrModalOverrideScrollService", "bypassScrollService"] }, outputs: { _openChanged: "clrModalOpenChange", altClose: "clrModalAlternateClose" }, host: { properties: { "class.open": "this._open" } }, viewQueries: [{ propertyName: "title", first: true, predicate: ["title"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<div *ngIf=\"_open\" class=\"modal\" [class.modal-full-screen]=\"size == 'full-screen'\">\n <!--fixme: revisit when ngClass works with exit animation-->\n <div\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n [@fadeMove]=\"fadeMove\"\n (@fadeMove.done)=\"fadeDone($event)\"\n class=\"modal-dialog\"\n [class.modal-sm]=\"size == 'sm'\"\n [class.modal-lg]=\"size == 'lg'\"\n [class.modal-xl]=\"size == 'xl'\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-hidden]=\"!_open\"\n [attr.aria-labelledby]=\"labelledBy || modalId\"\n >\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentStart}}</div>\n <div class=\"modal-content-wrapper\">\n <!-- only used in wizards -->\n <ng-content select=\".modal-nav\"></ng-content>\n\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <div class=\"modal-title-wrapper\" #title id=\"{{modalId}}\" cdkFocusInitial tabindex=\"-1\">\n <ng-content select=\".modal-title\"></ng-content>\n </div>\n <button\n type=\"button\"\n [attr.aria-label]=\"closeButtonAriaLabel || commonStrings.keys.close\"\n class=\"close\"\n *ngIf=\"closable\"\n (click)=\"close()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div class=\"modal-body-wrapper\">\n <ng-content select=\".modal-body\"></ng-content>\n </div>\n <ng-content select=\".modal-footer\"></ng-content>\n </div>\n </div>\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentEnd}}</div>\n </div>\n\n <div [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"backdropClick()\"></div>\n</div>\n", styles: [":host{display:none}:host.open{display:inline}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: CdkTrapFocusModule_CdkTrapFocus, selector: "[cdkTrapFocus]" }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }], viewProviders: [ScrollingService], animations: [
23579
23742
  trigger('fadeMove', [
23580
23743
  transition('* => fadeDown', [
23581
23744
  style({ opacity: 0, transform: 'translate(0, -25%)' }),
@@ -23610,8 +23773,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
23610
23773
  transition('void => *', [style({ opacity: 0 }), animate('0.2s ease-in-out', style({ opacity: 0.85 }))]),
23611
23774
  transition('* => void', [animate('0.2s ease-in-out', style({ opacity: 0 }))]),
23612
23775
  ]),
23613
- ], template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<div *ngIf=\"_open\" class=\"modal\" [class.modal-full-screen]=\"size == 'full-screen'\">\n <!--fixme: revisit when ngClass works with exit animation-->\n <div\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n [@fadeMove]=\"fadeMove\"\n (@fadeMove.done)=\"fadeDone($event)\"\n class=\"modal-dialog\"\n [class.modal-sm]=\"size == 'sm'\"\n [class.modal-lg]=\"size == 'lg'\"\n [class.modal-xl]=\"size == 'xl'\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-hidden]=\"!_open\"\n [attr.aria-labelledby]=\"labelledBy || modalId\"\n >\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentStart}}</div>\n <div class=\"modal-content-wrapper\">\n <!-- only used in wizards -->\n <ng-content select=\".modal-nav\"></ng-content>\n\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <div class=\"modal-title-wrapper\" id=\"{{modalId}}\" cdkFocusInitial tabindex=\"-1\">\n <ng-content select=\".modal-title\"></ng-content>\n </div>\n <button\n type=\"button\"\n [attr.aria-label]=\"closeButtonAriaLabel || commonStrings.keys.close\"\n class=\"close\"\n *ngIf=\"closable\"\n (click)=\"close()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div class=\"modal-body-wrapper\">\n <ng-content select=\".modal-body\"></ng-content>\n </div>\n <ng-content select=\".modal-footer\"></ng-content>\n </div>\n </div>\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentEnd}}</div>\n </div>\n\n <div [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"staticBackdrop || close()\"></div>\n</div>\n", styles: [":host{display:none}:host.open{display:inline}\n"] }]
23614
- }], ctorParameters: function () { return [{ type: ScrollingService }, { type: ClrCommonStringsService }, { type: ModalStackService }, { type: ClrModalConfigurationService }]; }, propDecorators: { _open: [{
23776
+ ], template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<div *ngIf=\"_open\" class=\"modal\" [class.modal-full-screen]=\"size == 'full-screen'\">\n <!--fixme: revisit when ngClass works with exit animation-->\n <div\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n [@fadeMove]=\"fadeMove\"\n (@fadeMove.done)=\"fadeDone($event)\"\n class=\"modal-dialog\"\n [class.modal-sm]=\"size == 'sm'\"\n [class.modal-lg]=\"size == 'lg'\"\n [class.modal-xl]=\"size == 'xl'\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-hidden]=\"!_open\"\n [attr.aria-labelledby]=\"labelledBy || modalId\"\n >\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentStart}}</div>\n <div class=\"modal-content-wrapper\">\n <!-- only used in wizards -->\n <ng-content select=\".modal-nav\"></ng-content>\n\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <div class=\"modal-title-wrapper\" #title id=\"{{modalId}}\" cdkFocusInitial tabindex=\"-1\">\n <ng-content select=\".modal-title\"></ng-content>\n </div>\n <button\n type=\"button\"\n [attr.aria-label]=\"closeButtonAriaLabel || commonStrings.keys.close\"\n class=\"close\"\n *ngIf=\"closable\"\n (click)=\"close()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div class=\"modal-body-wrapper\">\n <ng-content select=\".modal-body\"></ng-content>\n </div>\n <ng-content select=\".modal-footer\"></ng-content>\n </div>\n </div>\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentEnd}}</div>\n </div>\n\n <div [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"backdropClick()\"></div>\n</div>\n", styles: [":host{display:none}:host.open{display:inline}\n"] }]
23777
+ }], ctorParameters: function () { return [{ type: ScrollingService }, { type: ClrCommonStringsService }, { type: ModalStackService }, { type: ClrModalConfigurationService }]; }, propDecorators: { title: [{
23778
+ type: ViewChild,
23779
+ args: ['title']
23780
+ }], _open: [{
23615
23781
  type: Input,
23616
23782
  args: ['clrModalOpen']
23617
23783
  }, {
@@ -23772,7 +23938,9 @@ class ClrSidePanel {
23772
23938
  this.modal.close();
23773
23939
  }
23774
23940
  documentClick(event) {
23775
- if (!this.element.nativeElement.contains(event.target) && this.modal._open && !this.configuration.backdrop) {
23941
+ if (!this.element.nativeElement.contains(event.target) &&
23942
+ this.modal._open &&
23943
+ !this.configuration.backdrop) {
23776
23944
  this.modal.close();
23777
23945
  }
23778
23946
  }
@@ -24663,13 +24831,13 @@ class ClrTimeline {
24663
24831
  }
24664
24832
  }
24665
24833
  ClrTimeline.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrTimeline, deps: [], target: i0.ɵɵFactoryTarget.Component });
24666
- ClrTimeline.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrTimeline, selector: "clr-timeline", inputs: { layout: ["clrLayout", "layout"] }, host: { properties: { "class.clr-timeline": "true", "class.clr-timeline-vertical": "this.isVertical" } }, providers: [TimelineIconAttributeService], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true });
24834
+ ClrTimeline.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrTimeline, selector: "clr-timeline", inputs: { layout: ["clrLayout", "layout"] }, host: { properties: { "class.clr-timeline": "true", "attr.role": "\"list\"", "class.clr-timeline-vertical": "this.isVertical" } }, providers: [TimelineIconAttributeService], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true });
24667
24835
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrTimeline, decorators: [{
24668
24836
  type: Component,
24669
24837
  args: [{
24670
24838
  selector: 'clr-timeline',
24671
24839
  template: `<ng-content></ng-content>`,
24672
- host: { '[class.clr-timeline]': 'true' },
24840
+ host: { '[class.clr-timeline]': 'true', '[attr.role]': '"list"' },
24673
24841
  providers: [TimelineIconAttributeService],
24674
24842
  }]
24675
24843
  }], propDecorators: { layout: [{
@@ -24740,7 +24908,7 @@ class ClrTimelineStep {
24740
24908
  }
24741
24909
  }
24742
24910
  ClrTimelineStep.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrTimelineStep, deps: [{ token: TimelineIconAttributeService }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
24743
- ClrTimelineStep.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrTimelineStep, selector: "clr-timeline-step", inputs: { state: ["clrState", "state"] }, host: { properties: { "class.clr-timeline-step": "true" } }, queries: [{ propertyName: "stepTitle", first: true, predicate: ClrTimelineStepTitle, descendants: true, read: ElementRef }], ngImport: i0, template: `
24911
+ ClrTimelineStep.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrTimelineStep, selector: "clr-timeline-step", inputs: { state: ["clrState", "state"] }, host: { properties: { "class.clr-timeline-step": "true", "attr.role": "\"listitem\"" } }, queries: [{ propertyName: "stepTitle", first: true, predicate: ClrTimelineStepTitle, descendants: true, read: ElementRef }], ngImport: i0, template: `
24744
24912
  <ng-content select="clr-timeline-step-header"></ng-content>
24745
24913
  <span class="clr-sr-only">{{ stepTitleText }}</span>
24746
24914
  <ng-container *ngIf="!isProcessing; else processing">
@@ -24784,7 +24952,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
24784
24952
  <clr-spinner clrMedium [attr.aria-label]="iconAriaLabel"></clr-spinner>
24785
24953
  </ng-template>
24786
24954
  `,
24787
- host: { '[class.clr-timeline-step]': 'true' },
24955
+ host: { '[class.clr-timeline-step]': 'true', '[attr.role]': '"listitem"' },
24788
24956
  }]
24789
24957
  }], ctorParameters: function () {
24790
24958
  return [{ type: TimelineIconAttributeService }, { type: undefined, decorators: [{
@@ -26778,15 +26946,12 @@ ClrWizardStepnavItem.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", v
26778
26946
  (click)="click()"
26779
26947
  [attr.disabled]="isDisabled ? '' : null"
26780
26948
  >
26781
- <span class="clr-wizard-stepnav-link-suffix">
26782
- <cds-icon
26783
- shape="error-standard"
26784
- status="danger"
26785
- class="clr-wizard-stepnav-item-error-icon"
26786
- *ngIf="hasError"
26787
- ></cds-icon>
26788
- <ng-content *ngIf="!hasError"></ng-content>
26789
- </span>
26949
+ <div class="clr-wizard-stepnav-link-icon">
26950
+ <cds-icon *ngIf="hasError" shape="error-standard" aria-label="error"></cds-icon>
26951
+ <cds-icon *ngIf="!hasError && isComplete" shape="success-standard" aria-label="complete"></cds-icon>
26952
+ </div>
26953
+
26954
+ <div class="clr-wizard-stepnav-link-page-number"><ng-content></ng-content></div>
26790
26955
  <span class="clr-wizard-stepnav-link-title">
26791
26956
  <ng-template [ngTemplateOutlet]="page.navTitle"></ng-template>
26792
26957
  </span>
@@ -26805,15 +26970,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26805
26970
  (click)="click()"
26806
26971
  [attr.disabled]="isDisabled ? '' : null"
26807
26972
  >
26808
- <span class="clr-wizard-stepnav-link-suffix">
26809
- <cds-icon
26810
- shape="error-standard"
26811
- status="danger"
26812
- class="clr-wizard-stepnav-item-error-icon"
26813
- *ngIf="hasError"
26814
- ></cds-icon>
26815
- <ng-content *ngIf="!hasError"></ng-content>
26816
- </span>
26973
+ <div class="clr-wizard-stepnav-link-icon">
26974
+ <cds-icon *ngIf="hasError" shape="error-standard" aria-label="error"></cds-icon>
26975
+ <cds-icon *ngIf="!hasError && isComplete" shape="success-standard" aria-label="complete"></cds-icon>
26976
+ </div>
26977
+
26978
+ <div class="clr-wizard-stepnav-link-page-number"><ng-content></ng-content></div>
26817
26979
  <span class="clr-wizard-stepnav-link-title">
26818
26980
  <ng-template [ngTemplateOutlet]="page.navTitle"></ng-template>
26819
26981
  </span>
@@ -27283,7 +27445,7 @@ class ClrWizard {
27283
27445
  }
27284
27446
  }
27285
27447
  ClrWizard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrWizard, deps: [{ token: PLATFORM_ID }, { token: ClrCommonStringsService }, { token: WizardNavigationService }, { token: PageCollectionService }, { token: ButtonHubService }, { token: HeaderActionService }, { token: i0.ElementRef }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component });
27286
- ClrWizard.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrWizard, selector: "clr-wizard", inputs: { stepnavAriaLabel: ["clrWizardStepnavAriaLabel", "stepnavAriaLabel"], size: ["clrWizardSize", "size"], closable: ["clrWizardClosable", "closable"], _stopModalAnimations: ["clrWizardPreventModalAnimation", "_stopModalAnimations"], forceForward: ["clrWizardForceForwardNavigation", "forceForward"], clrWizardOpen: "clrWizardOpen", stopNext: ["clrWizardPreventDefaultNext", "stopNext"], stopCancel: ["clrWizardPreventDefaultCancel", "stopCancel"], stopNavigation: ["clrWizardPreventNavigation", "stopNavigation"], disableStepnav: ["clrWizardDisableStepnav", "disableStepnav"] }, outputs: { _openChanged: "clrWizardOpenChange", onCancel: "clrWizardOnCancel", wizardFinished: "clrWizardOnFinish", onReset: "clrWizardOnReset", currentPageChanged: "clrWizardCurrentPageChanged", onMoveNext: "clrWizardOnNext", onMovePrevious: "clrWizardOnPrevious" }, host: { properties: { "class.clr-wizard": "true", "class.wizard-md": "size == 'md'", "class.wizard-lg": "size == 'lg'", "class.wizard-xl": "size == 'xl'", "class.lastPage": "navService.currentPageIsLast" } }, providers: [WizardNavigationService, PageCollectionService, ButtonHubService, HeaderActionService], queries: [{ propertyName: "wizardTitle", first: true, predicate: ClrWizardTitle, descendants: true }, { propertyName: "pages", predicate: ClrWizardPage, descendants: true }, { propertyName: "headerActions", predicate: ClrWizardHeaderAction }], viewQueries: [{ propertyName: "pageTitle", first: true, predicate: ["pageTitle"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<clr-modal\n [clrModalOpen]=\"_open\"\n [clrModalSize]=\"size\"\n [clrModalClosable]=\"closable\"\n [clrModalStaticBackdrop]=\"true\"\n [clrModalSkipAnimation]=\"stopModalAnimations\"\n [clrModalOverrideScrollService]=\"isInline\"\n [clrModalPreventClose]=\"true\"\n (clrModalAlternateClose)=\"modalCancel()\"\n [clrModalLabelledById]=\"wizardId\"\n>\n <div class=\"modal-nav clr-wizard-stepnav-wrapper\" role=\"region\" [attr.aria-label]=\"stepnavAriaLabel\">\n <div class=\"clr-wizard-title\" id=\"{{wizardId}}\" role=\"heading\" [attr.aria-level]=\"wizardTitle.headingLevel || 1\">\n <ng-content select=\"clr-wizard-title\"></ng-content>\n </div>\n <clr-wizard-stepnav></clr-wizard-stepnav>\n </div>\n\n <div class=\"modal-title\" role=\"heading\" [attr.aria-level]=\"navService.currentPage.pageTitle.headingLevel || 2\">\n <span tabindex=\"-1\" #pageTitle class=\"modal-title-text\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPageTitle\"></ng-template>\n </span>\n\n <div class=\"modal-header-actions-wrapper\" *ngIf=\"headerActionService.displayHeaderActionsWrapper\">\n <div *ngIf=\"headerActionService.showWizardHeaderActions\">\n <ng-content select=\"clr-wizard-header-action\"></ng-content>\n </div>\n <div *ngIf=\"headerActionService.currentPageHasHeaderActions\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.headerActions\"></ng-template>\n </div>\n </div>\n </div>\n\n <div class=\"modal-body\">\n <main clr-wizard-pages-wrapper class=\"clr-wizard-content\">\n <ng-content></ng-content>\n </main>\n </div>\n <div class=\"modal-footer clr-wizard-footer\">\n <div class=\"clr-wizard-footer-buttons\">\n <div\n *ngIf=\"navService.currentPage && !navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-content select=\"clr-wizard-button\"></ng-content>\n </div>\n <div\n *ngIf=\"navService.currentPage && navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.buttons\"></ng-template>\n </div>\n </div>\n </div>\n</clr-modal>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ClrModal, selector: "clr-modal", inputs: ["clrModalOpen", "clrModalClosable", "clrModalCloseButtonAriaLabel", "clrModalSize", "clrModalStaticBackdrop", "clrModalSkipAnimation", "clrModalPreventClose", "clrModalLabelledById", "clrModalOverrideScrollService"], outputs: ["clrModalOpenChange", "clrModalAlternateClose"] }, { kind: "directive", type: ClrModalBody, selector: ".modal-body" }, { kind: "component", type: ClrWizardStepnav, selector: "clr-wizard-stepnav" }] });
27448
+ ClrWizard.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrWizard, selector: "clr-wizard", inputs: { stepnavAriaLabel: ["clrWizardStepnavAriaLabel", "stepnavAriaLabel"], size: ["clrWizardSize", "size"], closable: ["clrWizardClosable", "closable"], _stopModalAnimations: ["clrWizardPreventModalAnimation", "_stopModalAnimations"], forceForward: ["clrWizardForceForwardNavigation", "forceForward"], clrWizardOpen: "clrWizardOpen", stopNext: ["clrWizardPreventDefaultNext", "stopNext"], stopCancel: ["clrWizardPreventDefaultCancel", "stopCancel"], stopNavigation: ["clrWizardPreventNavigation", "stopNavigation"], disableStepnav: ["clrWizardDisableStepnav", "disableStepnav"] }, outputs: { _openChanged: "clrWizardOpenChange", onCancel: "clrWizardOnCancel", wizardFinished: "clrWizardOnFinish", onReset: "clrWizardOnReset", currentPageChanged: "clrWizardCurrentPageChanged", onMoveNext: "clrWizardOnNext", onMovePrevious: "clrWizardOnPrevious" }, host: { properties: { "class.clr-wizard": "true", "class.wizard-md": "size == 'md'", "class.wizard-lg": "size == 'lg'", "class.wizard-xl": "size == 'xl'", "class.lastPage": "navService.currentPageIsLast" } }, providers: [WizardNavigationService, PageCollectionService, ButtonHubService, HeaderActionService], queries: [{ propertyName: "wizardTitle", first: true, predicate: ClrWizardTitle, descendants: true }, { propertyName: "pages", predicate: ClrWizardPage, descendants: true }, { propertyName: "headerActions", predicate: ClrWizardHeaderAction }], viewQueries: [{ propertyName: "pageTitle", first: true, predicate: ["pageTitle"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<clr-modal\n [clrModalOpen]=\"_open\"\n [clrModalSize]=\"size\"\n [clrModalClosable]=\"closable\"\n [clrModalStaticBackdrop]=\"true\"\n [clrModalSkipAnimation]=\"stopModalAnimations\"\n [clrModalOverrideScrollService]=\"isInline\"\n [clrModalPreventClose]=\"true\"\n (clrModalAlternateClose)=\"modalCancel()\"\n [clrModalLabelledById]=\"wizardId\"\n>\n <div class=\"modal-nav clr-wizard-stepnav-wrapper\" role=\"region\" [attr.aria-label]=\"stepnavAriaLabel\">\n <div class=\"clr-wizard-title\" id=\"{{wizardId}}\" role=\"heading\" [attr.aria-level]=\"wizardTitle.headingLevel || 1\">\n <ng-content select=\"clr-wizard-title\"></ng-content>\n </div>\n <clr-wizard-stepnav></clr-wizard-stepnav>\n </div>\n\n <div class=\"modal-title\" role=\"heading\" [attr.aria-level]=\"navService.currentPage?.pageTitle.headingLevel || 2\">\n <span tabindex=\"-1\" #pageTitle class=\"modal-title-text\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPageTitle\"></ng-template>\n </span>\n\n <div class=\"modal-header-actions-wrapper\" *ngIf=\"headerActionService.displayHeaderActionsWrapper\">\n <div *ngIf=\"headerActionService.showWizardHeaderActions\">\n <ng-content select=\"clr-wizard-header-action\"></ng-content>\n </div>\n <div *ngIf=\"headerActionService.currentPageHasHeaderActions\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.headerActions\"></ng-template>\n </div>\n </div>\n </div>\n\n <div class=\"modal-body\">\n <main clr-wizard-pages-wrapper class=\"clr-wizard-content\">\n <ng-content></ng-content>\n </main>\n </div>\n <div class=\"modal-footer clr-wizard-footer\">\n <div class=\"clr-wizard-footer-buttons\">\n <div\n *ngIf=\"navService.currentPage && !navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-content select=\"clr-wizard-button\"></ng-content>\n </div>\n <div\n *ngIf=\"navService.currentPage && navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.buttons\"></ng-template>\n </div>\n </div>\n </div>\n</clr-modal>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ClrModal, selector: "clr-modal", inputs: ["clrModalOpen", "clrModalClosable", "clrModalCloseButtonAriaLabel", "clrModalSize", "clrModalStaticBackdrop", "clrModalSkipAnimation", "clrModalPreventClose", "clrModalLabelledById", "clrModalOverrideScrollService"], outputs: ["clrModalOpenChange", "clrModalAlternateClose"] }, { kind: "directive", type: ClrModalBody, selector: ".modal-body" }, { kind: "component", type: ClrWizardStepnav, selector: "clr-wizard-stepnav" }] });
27287
27449
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrWizard, decorators: [{
27288
27450
  type: Component,
27289
27451
  args: [{ selector: 'clr-wizard', providers: [WizardNavigationService, PageCollectionService, ButtonHubService, HeaderActionService], host: {
@@ -27292,7 +27454,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
27292
27454
  '[class.wizard-lg]': "size == 'lg'",
27293
27455
  '[class.wizard-xl]': "size == 'xl'",
27294
27456
  '[class.lastPage]': 'navService.currentPageIsLast',
27295
- }, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<clr-modal\n [clrModalOpen]=\"_open\"\n [clrModalSize]=\"size\"\n [clrModalClosable]=\"closable\"\n [clrModalStaticBackdrop]=\"true\"\n [clrModalSkipAnimation]=\"stopModalAnimations\"\n [clrModalOverrideScrollService]=\"isInline\"\n [clrModalPreventClose]=\"true\"\n (clrModalAlternateClose)=\"modalCancel()\"\n [clrModalLabelledById]=\"wizardId\"\n>\n <div class=\"modal-nav clr-wizard-stepnav-wrapper\" role=\"region\" [attr.aria-label]=\"stepnavAriaLabel\">\n <div class=\"clr-wizard-title\" id=\"{{wizardId}}\" role=\"heading\" [attr.aria-level]=\"wizardTitle.headingLevel || 1\">\n <ng-content select=\"clr-wizard-title\"></ng-content>\n </div>\n <clr-wizard-stepnav></clr-wizard-stepnav>\n </div>\n\n <div class=\"modal-title\" role=\"heading\" [attr.aria-level]=\"navService.currentPage.pageTitle.headingLevel || 2\">\n <span tabindex=\"-1\" #pageTitle class=\"modal-title-text\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPageTitle\"></ng-template>\n </span>\n\n <div class=\"modal-header-actions-wrapper\" *ngIf=\"headerActionService.displayHeaderActionsWrapper\">\n <div *ngIf=\"headerActionService.showWizardHeaderActions\">\n <ng-content select=\"clr-wizard-header-action\"></ng-content>\n </div>\n <div *ngIf=\"headerActionService.currentPageHasHeaderActions\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.headerActions\"></ng-template>\n </div>\n </div>\n </div>\n\n <div class=\"modal-body\">\n <main clr-wizard-pages-wrapper class=\"clr-wizard-content\">\n <ng-content></ng-content>\n </main>\n </div>\n <div class=\"modal-footer clr-wizard-footer\">\n <div class=\"clr-wizard-footer-buttons\">\n <div\n *ngIf=\"navService.currentPage && !navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-content select=\"clr-wizard-button\"></ng-content>\n </div>\n <div\n *ngIf=\"navService.currentPage && navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.buttons\"></ng-template>\n </div>\n </div>\n </div>\n</clr-modal>\n" }]
27457
+ }, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<clr-modal\n [clrModalOpen]=\"_open\"\n [clrModalSize]=\"size\"\n [clrModalClosable]=\"closable\"\n [clrModalStaticBackdrop]=\"true\"\n [clrModalSkipAnimation]=\"stopModalAnimations\"\n [clrModalOverrideScrollService]=\"isInline\"\n [clrModalPreventClose]=\"true\"\n (clrModalAlternateClose)=\"modalCancel()\"\n [clrModalLabelledById]=\"wizardId\"\n>\n <div class=\"modal-nav clr-wizard-stepnav-wrapper\" role=\"region\" [attr.aria-label]=\"stepnavAriaLabel\">\n <div class=\"clr-wizard-title\" id=\"{{wizardId}}\" role=\"heading\" [attr.aria-level]=\"wizardTitle.headingLevel || 1\">\n <ng-content select=\"clr-wizard-title\"></ng-content>\n </div>\n <clr-wizard-stepnav></clr-wizard-stepnav>\n </div>\n\n <div class=\"modal-title\" role=\"heading\" [attr.aria-level]=\"navService.currentPage?.pageTitle.headingLevel || 2\">\n <span tabindex=\"-1\" #pageTitle class=\"modal-title-text\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPageTitle\"></ng-template>\n </span>\n\n <div class=\"modal-header-actions-wrapper\" *ngIf=\"headerActionService.displayHeaderActionsWrapper\">\n <div *ngIf=\"headerActionService.showWizardHeaderActions\">\n <ng-content select=\"clr-wizard-header-action\"></ng-content>\n </div>\n <div *ngIf=\"headerActionService.currentPageHasHeaderActions\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.headerActions\"></ng-template>\n </div>\n </div>\n </div>\n\n <div class=\"modal-body\">\n <main clr-wizard-pages-wrapper class=\"clr-wizard-content\">\n <ng-content></ng-content>\n </main>\n </div>\n <div class=\"modal-footer clr-wizard-footer\">\n <div class=\"clr-wizard-footer-buttons\">\n <div\n *ngIf=\"navService.currentPage && !navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-content select=\"clr-wizard-button\"></ng-content>\n </div>\n <div\n *ngIf=\"navService.currentPage && navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.buttons\"></ng-template>\n </div>\n </div>\n </div>\n</clr-modal>\n" }]
27296
27458
  }], ctorParameters: function () {
27297
27459
  return [{ type: undefined, decorators: [{
27298
27460
  type: Inject,
@@ -27568,7 +27730,7 @@ const CLR_WIZARD_DIRECTIVES = [
27568
27730
  ];
27569
27731
  class ClrWizardModule {
27570
27732
  constructor() {
27571
- ClarityIcons.addIcons(errorStandardIcon);
27733
+ ClarityIcons.addIcons(errorStandardIcon, successStandardIcon);
27572
27734
  }
27573
27735
  }
27574
27736
  ClrWizardModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrWizardModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });