@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
  /*
@@ -325,7 +324,7 @@ const commonStringsDefault = {
325
324
  singleSelectionAriaLabel: 'Single selection header',
326
325
  singleActionableAriaLabel: 'Single actionable header',
327
326
  detailExpandableAriaLabel: 'Toggle more row content',
328
- datagridFilterAriaLabel: 'Toggle {COLUMN} filter',
327
+ datagridFilterAriaLabel: '{COLUMN} filter',
329
328
  datagridFilterDialogAriaLabel: 'Filter dialog',
330
329
  columnSeparatorAriaLabel: 'Column resize handle',
331
330
  columnSeparatorDescription: 'Use left or right key to resize the column',
@@ -1160,6 +1159,9 @@ class ClrStepperPanel extends ClrAccordionPanel {
1160
1159
  // set panel status on form status change only after the form becomes invalid
1161
1160
  const invalidStatusTrigger = this.formGroup.statusChanges.pipe(filter(status => status === 'INVALID'));
1162
1161
  this.subscriptions.push(this.formGroup.statusChanges.pipe(skipUntil(invalidStatusTrigger), distinctUntilChanged()).subscribe(status => {
1162
+ if (!this.formGroup.touched) {
1163
+ return;
1164
+ }
1163
1165
  if (status === 'VALID') {
1164
1166
  this.stepperService.setPanelValid(this.id);
1165
1167
  }
@@ -4755,7 +4757,10 @@ class ClrAbstractContainer {
4755
4757
  this.subscriptions = [];
4756
4758
  this.subscriptions.push(this.ifControlStateService.statusChanges.subscribe((state) => {
4757
4759
  this.state = state;
4758
- this.updateHelpers();
4760
+ // Make sure everything is updated before dispatching the values for helpers
4761
+ setTimeout(() => {
4762
+ this.updateHelpers();
4763
+ });
4759
4764
  }));
4760
4765
  this.subscriptions.push(this.ngControlService.controlChanges.subscribe(control => {
4761
4766
  this.control = control;
@@ -5607,8 +5612,10 @@ ClrCheckboxContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", v
5607
5612
  <label *ngIf="!label && addGrid()"></label>
5608
5613
  <div class="clr-control-container" [class.clr-control-inline]="clrInline" [ngClass]="controlClass()">
5609
5614
  <ng-content select="clr-checkbox-wrapper,clr-toggle-wrapper"></ng-content>
5610
- <div class="clr-subtext-wrapper">
5611
- <ng-content select="clr-control-helper" *ngIf="showHelper"></ng-content>
5615
+ <div *ngIf="showHelper" class="clr-subtext-wrapper">
5616
+ <ng-content select="clr-control-helper"></ng-content>
5617
+ </div>
5618
+ <div *ngIf="showInvalid || showValid" class="clr-subtext-wrapper">
5612
5619
  <cds-icon
5613
5620
  *ngIf="showInvalid"
5614
5621
  class="clr-validate-icon"
@@ -5637,8 +5644,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
5637
5644
  <label *ngIf="!label && addGrid()"></label>
5638
5645
  <div class="clr-control-container" [class.clr-control-inline]="clrInline" [ngClass]="controlClass()">
5639
5646
  <ng-content select="clr-checkbox-wrapper,clr-toggle-wrapper"></ng-content>
5640
- <div class="clr-subtext-wrapper">
5641
- <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">
5642
5651
  <cds-icon
5643
5652
  *ngIf="showInvalid"
5644
5653
  class="clr-validate-icon"
@@ -6820,7 +6829,8 @@ class ClrOption {
6820
6829
  this.optionProxy.id = this._id;
6821
6830
  }
6822
6831
  }
6823
- onClick() {
6832
+ onClick(event) {
6833
+ event.stopPropagation();
6824
6834
  if (this.optionSelectionService.multiselectable) {
6825
6835
  this.optionSelectionService.toggle(this.value);
6826
6836
  }
@@ -6835,7 +6845,7 @@ class ClrOption {
6835
6845
  }
6836
6846
  }
6837
6847
  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 });
6838
- 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: `
6848
+ 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: `
6839
6849
  <ng-content></ng-content>
6840
6850
  <span *ngIf="selected" class="clr-sr-only">{{ commonStrings.keys.comboboxSelected }}</span>
6841
6851
  `, isInline: true, dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
@@ -6869,7 +6879,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
6869
6879
  args: ['class.clr-focus']
6870
6880
  }], onClick: [{
6871
6881
  type: HostListener,
6872
- args: ['click']
6882
+ args: ['click', ['$event']]
6873
6883
  }] } });
6874
6884
 
6875
6885
  /*
@@ -11009,8 +11019,10 @@ ClrRadioContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", vers
11009
11019
  <label *ngIf="!label && addGrid()"></label>
11010
11020
  <div class="clr-control-container" [class.clr-control-inline]="clrInline" [ngClass]="controlClass()">
11011
11021
  <ng-content select="clr-radio-wrapper"></ng-content>
11012
- <div class="clr-subtext-wrapper">
11013
- <ng-content select="clr-control-helper" *ngIf="showHelper"></ng-content>
11022
+ <div *ngIf="showHelper" class="clr-subtext-wrapper">
11023
+ <ng-content select="clr-control-helper"></ng-content>
11024
+ </div>
11025
+ <div *ngIf="showValid || showInvalid" class="clr-subtext-wrapper">
11014
11026
  <cds-icon
11015
11027
  *ngIf="showInvalid"
11016
11028
  class="clr-validate-icon"
@@ -11039,8 +11051,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
11039
11051
  <label *ngIf="!label && addGrid()"></label>
11040
11052
  <div class="clr-control-container" [class.clr-control-inline]="clrInline" [ngClass]="controlClass()">
11041
11053
  <ng-content select="clr-radio-wrapper"></ng-content>
11042
- <div class="clr-subtext-wrapper">
11043
- <ng-content select="clr-control-helper" *ngIf="showHelper"></ng-content>
11054
+ <div *ngIf="showHelper" class="clr-subtext-wrapper">
11055
+ <ng-content select="clr-control-helper"></ng-content>
11056
+ </div>
11057
+ <div *ngIf="showValid || showInvalid" class="clr-subtext-wrapper">
11044
11058
  <cds-icon
11045
11059
  *ngIf="showInvalid"
11046
11060
  class="clr-validate-icon"
@@ -12093,6 +12107,191 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12093
12107
  type: Directive
12094
12108
  }], ctorParameters: function () { return [{ type: FiltersProvider }]; } });
12095
12109
 
12110
+ /*
12111
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12112
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
12113
+ * This software is released under MIT license.
12114
+ * The full license information can be found in LICENSE in the root directory of this project.
12115
+ */
12116
+ function getTabableItems(el) {
12117
+ const tabableSelector = [
12118
+ 'a[href]',
12119
+ 'area[href]',
12120
+ 'input:not([disabled])',
12121
+ 'button:not([disabled])',
12122
+ 'select:not([disabled])',
12123
+ 'textarea:not([disabled])',
12124
+ 'iframe',
12125
+ 'object',
12126
+ 'embed',
12127
+ '*[tabindex]:not([disabled])',
12128
+ '*[contenteditable=true]',
12129
+ '[role=button]:not([disabled])',
12130
+ ].join(',');
12131
+ return Array.from(el.querySelectorAll(tabableSelector));
12132
+ }
12133
+ class KeyNavigationGridController {
12134
+ constructor(zone) {
12135
+ this.zone = zone;
12136
+ this.skipItemFocus = false;
12137
+ this.listenersAdded = false;
12138
+ this.destroy$ = new Subject();
12139
+ this._activeCell = null;
12140
+ this.config = {
12141
+ keyGridRows: '[role=row]:not(.datagrid-placeholder)',
12142
+ keyGridCells: '[role=gridcell]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), [role=columnheader]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), .datagrid-detail-caret',
12143
+ keyGrid: '[role=grid]',
12144
+ };
12145
+ }
12146
+ get grid() {
12147
+ return this.host?.querySelector(this.config.keyGrid);
12148
+ }
12149
+ get rows() {
12150
+ return this.host?.querySelectorAll(this.config.keyGridRows);
12151
+ }
12152
+ get cells() {
12153
+ return this.host?.querySelectorAll(this.config.keyGridCells);
12154
+ }
12155
+ ngOnDestroy() {
12156
+ this.destroy$.next();
12157
+ this.destroy$.complete();
12158
+ }
12159
+ addListeners() {
12160
+ if (this.listenersAdded) {
12161
+ return;
12162
+ }
12163
+ this.zone.runOutsideAngular(() => {
12164
+ fromEvent(this.grid, 'mousedown')
12165
+ .pipe(takeUntil(this.destroy$))
12166
+ .subscribe((e) => {
12167
+ // 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
12168
+ if (e.buttons === 1 && !e.ctrlKey) {
12169
+ const activeCell = this.cells
12170
+ ? Array.from(this.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
12171
+ : null;
12172
+ if (activeCell) {
12173
+ this.setActiveCell(activeCell);
12174
+ }
12175
+ }
12176
+ });
12177
+ fromEvent(this.grid, 'wheel')
12178
+ .pipe(takeUntil(this.destroy$))
12179
+ .subscribe(() => {
12180
+ this.removeActiveCell();
12181
+ });
12182
+ fromEvent(this.grid, 'keydown')
12183
+ .pipe(takeUntil(this.destroy$))
12184
+ .subscribe((e) => {
12185
+ // Skip column resize events
12186
+ if (e.target.classList.contains('drag-handle') &&
12187
+ (e.code === 'ArrowLeft' || e.code === 'ArrowRight')) {
12188
+ return;
12189
+ }
12190
+ if (e.code === 'ArrowUp' ||
12191
+ e.code === 'ArrowDown' ||
12192
+ e.code === 'ArrowLeft' ||
12193
+ e.code === 'ArrowRight' ||
12194
+ e.code === 'End' ||
12195
+ e.code === 'Home' ||
12196
+ e.code === 'PageUp' ||
12197
+ e.code === 'PageDown') {
12198
+ const { x, y } = this.getNextItemCoordinate(e);
12199
+ const activeItem = this.rows
12200
+ ? Array.from(this.rows[y].querySelectorAll(this.config.keyGridCells))[x]
12201
+ : null;
12202
+ if (activeItem) {
12203
+ this.setActiveCell(activeItem);
12204
+ }
12205
+ e.preventDefault();
12206
+ }
12207
+ });
12208
+ });
12209
+ this.listenersAdded = true;
12210
+ }
12211
+ initializeKeyGrid(host) {
12212
+ this.host = host;
12213
+ this.addListeners();
12214
+ this.resetKeyGrid();
12215
+ }
12216
+ resetKeyGrid() {
12217
+ this.cells?.forEach((i) => i.setAttribute('tabindex', '-1'));
12218
+ const firstCell = this.cells ? this.cells[0] : null;
12219
+ firstCell?.setAttribute('tabindex', '0');
12220
+ }
12221
+ removeActiveCell() {
12222
+ this._activeCell = null;
12223
+ }
12224
+ getActiveCell() {
12225
+ return this._activeCell;
12226
+ }
12227
+ setActiveCell(activeCell) {
12228
+ const prior = this.cells ? Array.from(this.cells).find(c => c.getAttribute('tabindex') === '0') : null;
12229
+ if (prior) {
12230
+ prior.setAttribute('tabindex', '-1');
12231
+ }
12232
+ activeCell.setAttribute('tabindex', '0');
12233
+ this._activeCell = activeCell;
12234
+ const items = getTabableItems(activeCell);
12235
+ const item = activeCell.getAttribute('role') !== 'columnheader' && items[0] ? items[0] : activeCell;
12236
+ if (!this.skipItemFocus) {
12237
+ item.focus();
12238
+ }
12239
+ }
12240
+ getNextItemCoordinate(e) {
12241
+ let currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
12242
+ if (e.code === 'Tab') {
12243
+ currentCell = document.activeElement;
12244
+ }
12245
+ const currentRow = this.rows && currentCell ? Array.from(this.rows).find(r => r.contains(currentCell)) : null;
12246
+ const numOfRows = this.rows ? this.rows.length - 1 : 0;
12247
+ const numOfColumns = this.cells ? Math.floor(this.cells.length / this.rows.length - 1) : 0;
12248
+ let x = currentRow && currentCell
12249
+ ? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell)
12250
+ : 0;
12251
+ let y = currentRow && currentCell && this.rows ? Array.from(this.rows).indexOf(currentRow) : 0;
12252
+ const dir = this.host.dir;
12253
+ const inlineStart = dir === 'rtl' ? 'ArrowRight' : 'ArrowLeft';
12254
+ const inlineEnd = dir === 'rtl' ? 'ArrowLeft' : 'ArrowRight';
12255
+ const itemsPerPage = Math.floor(this.host?.querySelector('.datagrid').clientHeight / this.rows[0].clientHeight) - 1 || 0;
12256
+ if (e.code === 'ArrowUp' && y !== 0) {
12257
+ y = y - 1;
12258
+ }
12259
+ else if (e.code === 'ArrowDown' && y < numOfRows) {
12260
+ y = y + 1;
12261
+ }
12262
+ else if (e.code === inlineStart && x !== 0) {
12263
+ x = x - 1;
12264
+ }
12265
+ else if (e.code === inlineEnd && x < numOfColumns) {
12266
+ x = x + 1;
12267
+ }
12268
+ else if (e.code === 'End') {
12269
+ x = numOfColumns;
12270
+ if (e.ctrlKey) {
12271
+ y = numOfRows;
12272
+ }
12273
+ }
12274
+ else if (e.code === 'Home') {
12275
+ x = 0;
12276
+ if (e.ctrlKey) {
12277
+ y = 0;
12278
+ }
12279
+ }
12280
+ else if (e.code === 'PageUp') {
12281
+ y = y - itemsPerPage > 0 ? y - itemsPerPage + 1 : 1;
12282
+ }
12283
+ else if (e.code === 'PageDown') {
12284
+ y = y + itemsPerPage < numOfRows ? y + itemsPerPage : numOfRows;
12285
+ }
12286
+ return { x, y };
12287
+ }
12288
+ }
12289
+ KeyNavigationGridController.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
12290
+ KeyNavigationGridController.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController });
12291
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, decorators: [{
12292
+ type: Injectable
12293
+ }], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
12294
+
12096
12295
  /*
12097
12296
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12098
12297
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -12105,12 +12304,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12105
12304
  * since it can be anything (not just a text input).
12106
12305
  */
12107
12306
  class ClrDatagridFilter extends DatagridFilterRegistrar {
12108
- constructor(_filters, commonStrings, smartToggleService, platformId, elementRef) {
12307
+ constructor(_filters, commonStrings, smartToggleService, platformId, elementRef, keyNavigation) {
12109
12308
  super(_filters);
12110
12309
  this.commonStrings = commonStrings;
12111
12310
  this.smartToggleService = smartToggleService;
12112
12311
  this.platformId = platformId;
12113
12312
  this.elementRef = elementRef;
12313
+ this.keyNavigation = keyNavigation;
12114
12314
  this.openChange = new EventEmitter(false);
12115
12315
  this.ariaExpanded = false;
12116
12316
  this.popoverId = uniqueIdFactory();
@@ -12139,6 +12339,9 @@ class ClrDatagridFilter extends DatagridFilterRegistrar {
12139
12339
  if (!open && isPlatformBrowser(this.platformId)) {
12140
12340
  this.anchor.nativeElement.focus();
12141
12341
  }
12342
+ if (this.keyNavigation) {
12343
+ this.keyNavigation.skipItemFocus = open;
12344
+ }
12142
12345
  // keep track of the state
12143
12346
  this._open = open;
12144
12347
  }
@@ -12153,7 +12356,9 @@ class ClrDatagridFilter extends DatagridFilterRegistrar {
12153
12356
  return !!this.filter && this.filter.isActive();
12154
12357
  }
12155
12358
  ngOnChanges() {
12156
- this.setToggleButtonAriaLabel();
12359
+ setTimeout(() => {
12360
+ this.setToggleButtonAriaLabel();
12361
+ });
12157
12362
  }
12158
12363
  ngOnDestroy() {
12159
12364
  super.ngOnDestroy();
@@ -12172,7 +12377,7 @@ class ClrDatagridFilter extends DatagridFilterRegistrar {
12172
12377
  });
12173
12378
  }
12174
12379
  }
12175
- 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 });
12380
+ 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 });
12176
12381
  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: `
12177
12382
  <button
12178
12383
  class="datagrid-filter-toggle"
@@ -12257,7 +12462,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12257
12462
  }], ctorParameters: function () { return [{ type: FiltersProvider }, { type: ClrCommonStringsService }, { type: ClrPopoverToggleService }, { type: undefined, decorators: [{
12258
12463
  type: Inject,
12259
12464
  args: [PLATFORM_ID]
12260
- }] }, { type: i0.ElementRef }]; }, propDecorators: { openChange: [{
12465
+ }] }, { type: i0.ElementRef }, { type: KeyNavigationGridController, decorators: [{
12466
+ type: Optional
12467
+ }] }]; }, propDecorators: { openChange: [{
12261
12468
  type: Output,
12262
12469
  args: ['clrDgFilterOpenChange']
12263
12470
  }], anchor: [{
@@ -13015,6 +13222,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
13015
13222
  class DetailService {
13016
13223
  constructor(modalStackService) {
13017
13224
  this.modalStackService = modalStackService;
13225
+ this.preventScroll = false;
13018
13226
  this.toggleState = false;
13019
13227
  this._enabled = false;
13020
13228
  this._state = new BehaviorSubject(this.toggleState);
@@ -13025,6 +13233,12 @@ class DetailService {
13025
13233
  set enabled(state) {
13026
13234
  this._enabled = state;
13027
13235
  }
13236
+ get preventFocusScroll() {
13237
+ return this.preventScroll;
13238
+ }
13239
+ set preventFocusScroll(preventScroll) {
13240
+ this.preventScroll = preventScroll;
13241
+ }
13028
13242
  get state() {
13029
13243
  return this.cache;
13030
13244
  }
@@ -13043,15 +13257,13 @@ class DetailService {
13043
13257
  }
13044
13258
  close() {
13045
13259
  this.toggleState = false;
13260
+ this.returnFocus();
13046
13261
  this._state.next(this.toggleState);
13047
13262
  this.modalStackService.trackModalClose(this);
13048
- // In the case of browser zoom greater than 250%, the detail pane toggle button is not visible on the page.
13049
- // Wait for the detail pane to close, and return focus to the detail toggle button.
13050
- setTimeout(() => this.returnFocus(), 0);
13051
13263
  }
13052
13264
  returnFocus() {
13053
13265
  if (this.button) {
13054
- this.button.focus();
13266
+ this.button.focus({ preventScroll: this.preventFocusScroll });
13055
13267
  this.button = null;
13056
13268
  }
13057
13269
  }
@@ -14256,9 +14468,9 @@ class ClrDatagridPlaceholder {
14256
14468
  }
14257
14469
  ClrDatagridPlaceholder.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridPlaceholder, deps: [{ token: Items }], target: i0.ɵɵFactoryTarget.Component });
14258
14470
  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: `
14259
- <div class="datagrid-placeholder" [class.datagrid-empty]="emptyDatagrid" role="row">
14471
+ <div class="datagrid-placeholder" [class.datagrid-empty]="emptyDatagrid">
14260
14472
  <div class="datagrid-placeholder-image" *ngIf="emptyDatagrid"></div>
14261
- <span role="gridcell" class="datagrid-placeholder-content"><ng-content *ngIf="emptyDatagrid"></ng-content></span>
14473
+ <span class="datagrid-placeholder-content"><ng-content *ngIf="emptyDatagrid"></ng-content></span>
14262
14474
  </div>
14263
14475
  `, isInline: true, dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
14264
14476
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridPlaceholder, decorators: [{
@@ -14266,9 +14478,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
14266
14478
  args: [{
14267
14479
  selector: 'clr-dg-placeholder',
14268
14480
  template: `
14269
- <div class="datagrid-placeholder" [class.datagrid-empty]="emptyDatagrid" role="row">
14481
+ <div class="datagrid-placeholder" [class.datagrid-empty]="emptyDatagrid">
14270
14482
  <div class="datagrid-placeholder-image" *ngIf="emptyDatagrid"></div>
14271
- <span role="gridcell" class="datagrid-placeholder-content"><ng-content *ngIf="emptyDatagrid"></ng-content></span>
14483
+ <span class="datagrid-placeholder-content"><ng-content *ngIf="emptyDatagrid"></ng-content></span>
14272
14484
  </div>
14273
14485
  `,
14274
14486
  host: { '[class.datagrid-placeholder-container]': 'true' },
@@ -15112,6 +15324,8 @@ class ClrDatagridRow {
15112
15324
  this.document = document;
15113
15325
  this.selectedChanged = new EventEmitter(false);
15114
15326
  this.expandedChange = new EventEmitter(false);
15327
+ this.detailDisabled = false;
15328
+ this.detailHidden = false;
15115
15329
  this.displayCells = false;
15116
15330
  this.expandAnimationTrigger = false;
15117
15331
  /* reference to the enum so that template can access */
@@ -15339,11 +15553,11 @@ class ClrDatagridRow {
15339
15553
  }
15340
15554
  }
15341
15555
  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 });
15342
- 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: [
15556
+ 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: [
15343
15557
  DatagridIfExpandService,
15344
15558
  { provide: IfExpandService, useExisting: DatagridIfExpandService },
15345
15559
  { provide: LoadingListener, useExisting: DatagridIfExpandService },
15346
- ], 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" }] });
15560
+ ], 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" }] });
15347
15561
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridRow, decorators: [{
15348
15562
  type: Component,
15349
15563
  args: [{ selector: 'clr-dg-row', host: {
@@ -15355,7 +15569,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15355
15569
  DatagridIfExpandService,
15356
15570
  { provide: IfExpandService, useExisting: DatagridIfExpandService },
15357
15571
  { provide: LoadingListener, useExisting: DatagridIfExpandService },
15358
- ], 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" }]
15572
+ ], 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" }]
15359
15573
  }], ctorParameters: function () { 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: [{
15360
15574
  type: Inject,
15361
15575
  args: [DOCUMENT]
@@ -15365,6 +15579,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15365
15579
  }], expandedChange: [{
15366
15580
  type: Output,
15367
15581
  args: ['clrDgExpandedChange']
15582
+ }], detailDisabled: [{
15583
+ type: Input,
15584
+ args: ['clrDgDetailDisabled']
15585
+ }], detailHidden: [{
15586
+ type: Input,
15587
+ args: ['clrDgDetailHidden']
15368
15588
  }], dgCells: [{
15369
15589
  type: ContentChildren,
15370
15590
  args: [ClrDatagridCell]
@@ -15413,10 +15633,11 @@ var DatagridColumnChanges;
15413
15633
  (function (DatagridColumnChanges) {
15414
15634
  DatagridColumnChanges[DatagridColumnChanges["WIDTH"] = 0] = "WIDTH";
15415
15635
  DatagridColumnChanges[DatagridColumnChanges["HIDDEN"] = 1] = "HIDDEN";
15636
+ DatagridColumnChanges[DatagridColumnChanges["INITIALIZE"] = 2] = "INITIALIZE";
15416
15637
  })(DatagridColumnChanges || (DatagridColumnChanges = {}));
15417
15638
  const ALL_COLUMN_CHANGES = Object.keys(DatagridColumnChanges)
15418
15639
  .map(key => DatagridColumnChanges[key])
15419
- .filter(key => key === parseInt(key, 10)); // extracts only integer keys
15640
+ .filter(key => key === parseInt(key, 10) && key !== DatagridColumnChanges.INITIALIZE); // extracts only integer keys
15420
15641
 
15421
15642
  /*
15422
15643
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
@@ -15427,6 +15648,7 @@ const ALL_COLUMN_CHANGES = Object.keys(DatagridColumnChanges)
15427
15648
  class ColumnsService {
15428
15649
  constructor() {
15429
15650
  this.columns = [];
15651
+ this.columnsStateChange = new BehaviorSubject(null);
15430
15652
  this._cache = [];
15431
15653
  }
15432
15654
  get columnStates() {
@@ -15448,7 +15670,9 @@ class ColumnsService {
15448
15670
  resetToLastCache() {
15449
15671
  this._cache.forEach((state, index) => {
15450
15672
  // Just emit the exact value from the cache
15451
- this.columns[index].next({ ...state, changes: ALL_COLUMN_CHANGES });
15673
+ const cachedState = { ...state, changes: ALL_COLUMN_CHANGES };
15674
+ this.columns[index].next(cachedState);
15675
+ this.columnsStateChange.next(cachedState);
15452
15676
  });
15453
15677
  this._cache = [];
15454
15678
  }
@@ -15460,7 +15684,9 @@ class ColumnsService {
15460
15684
  this.emitStateChange(this.columns[columnIndex], diff);
15461
15685
  }
15462
15686
  emitStateChange(column, diff) {
15463
- column.next({ ...column.value, ...diff });
15687
+ const changedState = { ...column.value, ...diff };
15688
+ column.next(changedState);
15689
+ this.columnsStateChange.next(changedState);
15464
15690
  }
15465
15691
  }
15466
15692
  ColumnsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ColumnsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -15536,188 +15762,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15536
15762
  type: Injectable
15537
15763
  }], ctorParameters: function () { return [{ type: FiltersProvider }, { type: Sort }, { type: Page }, { type: StateDebouncer }]; } });
15538
15764
 
15539
- /*
15540
- * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
15541
- * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
15542
- * This software is released under MIT license.
15543
- * The full license information can be found in LICENSE in the root directory of this project.
15544
- */
15545
- function getTabableItems(el) {
15546
- const tabableSelector = [
15547
- 'a[href]',
15548
- 'area[href]',
15549
- 'input:not([disabled])',
15550
- 'button:not([disabled])',
15551
- 'select:not([disabled])',
15552
- 'textarea:not([disabled])',
15553
- 'iframe',
15554
- 'object',
15555
- 'embed',
15556
- '*[tabindex]',
15557
- '*[contenteditable=true]',
15558
- '[role=button]:not([disabled])',
15559
- ].join(',');
15560
- return Array.from(el.querySelectorAll(tabableSelector));
15561
- }
15562
- class KeyNavigationGridController {
15563
- constructor(zone) {
15564
- this.zone = zone;
15565
- this.listenersAdded = false;
15566
- this.destroy$ = new Subject();
15567
- this._activeCell = null;
15568
- this.config = {
15569
- keyGridRows: '[role=row]:not(.datagrid-placeholder)',
15570
- keyGridCells: '[role=gridcell]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), [role=columnheader]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), .datagrid-detail-caret',
15571
- keyGrid: '[role=grid]',
15572
- };
15573
- }
15574
- get grid() {
15575
- return this.host?.querySelector(this.config.keyGrid);
15576
- }
15577
- get rows() {
15578
- return this.host?.querySelectorAll(this.config.keyGridRows);
15579
- }
15580
- get cells() {
15581
- return this.host?.querySelectorAll(this.config.keyGridCells);
15582
- }
15583
- ngOnDestroy() {
15584
- this.destroy$.next();
15585
- this.destroy$.complete();
15586
- }
15587
- addListeners() {
15588
- if (this.listenersAdded) {
15589
- return;
15590
- }
15591
- this.zone.runOutsideAngular(() => {
15592
- fromEvent(this.grid, 'mousedown')
15593
- .pipe(takeUntil(this.destroy$))
15594
- .subscribe((e) => {
15595
- // 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
15596
- if (e.buttons === 1 && !e.ctrlKey) {
15597
- const activeCell = this.cells
15598
- ? Array.from(this.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
15599
- : null;
15600
- if (activeCell) {
15601
- this.setActiveCell(activeCell);
15602
- }
15603
- }
15604
- });
15605
- fromEvent(this.grid, 'wheel')
15606
- .pipe(takeUntil(this.destroy$))
15607
- .subscribe(() => {
15608
- this.removeActiveCell();
15609
- });
15610
- fromEvent(this.grid, 'keydown')
15611
- .pipe(takeUntil(this.destroy$))
15612
- .subscribe((e) => {
15613
- // Skip column resize events
15614
- if (e.target.classList.contains('drag-handle') &&
15615
- (e.code === 'ArrowLeft' || e.code === 'ArrowRight')) {
15616
- return;
15617
- }
15618
- if (e.code === 'ArrowUp' ||
15619
- e.code === 'ArrowDown' ||
15620
- e.code === 'ArrowLeft' ||
15621
- e.code === 'ArrowRight' ||
15622
- e.code === 'End' ||
15623
- e.code === 'Home' ||
15624
- e.code === 'PageUp' ||
15625
- e.code === 'PageDown') {
15626
- const { x, y } = this.getNextItemCoordinate(e);
15627
- const activeItem = this.rows
15628
- ? Array.from(this.rows[y].querySelectorAll(this.config.keyGridCells))[x]
15629
- : null;
15630
- if (activeItem) {
15631
- this.setActiveCell(activeItem);
15632
- }
15633
- e.preventDefault();
15634
- }
15635
- });
15636
- });
15637
- this.listenersAdded = true;
15638
- }
15639
- initializeKeyGrid(host) {
15640
- this.host = host;
15641
- this.addListeners();
15642
- this.resetKeyGrid();
15643
- }
15644
- resetKeyGrid() {
15645
- this.cells?.forEach((i) => i.setAttribute('tabindex', '-1'));
15646
- const firstCell = this.cells ? this.cells[0] : null;
15647
- firstCell?.setAttribute('tabindex', '0');
15648
- }
15649
- removeActiveCell() {
15650
- this._activeCell = null;
15651
- }
15652
- getActiveCell() {
15653
- return this._activeCell;
15654
- }
15655
- setActiveCell(activeCell) {
15656
- const prior = this.cells ? Array.from(this.cells).find(c => c.getAttribute('tabindex') === '0') : null;
15657
- if (prior) {
15658
- prior.setAttribute('tabindex', '-1');
15659
- }
15660
- activeCell.setAttribute('tabindex', '0');
15661
- const items = getTabableItems(activeCell);
15662
- const item = activeCell.getAttribute('role') !== 'columnheader' && items[0] ? items[0] : activeCell;
15663
- item.focus();
15664
- this._activeCell = item;
15665
- }
15666
- getNextItemCoordinate(e) {
15667
- let currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
15668
- if (e.code === 'Tab') {
15669
- currentCell = document.activeElement;
15670
- }
15671
- const currentRow = this.rows && currentCell ? Array.from(this.rows).find(r => r.contains(currentCell)) : null;
15672
- const numOfRows = this.rows ? this.rows.length - 1 : 0;
15673
- const numOfColumns = this.cells ? Math.floor(this.cells.length / this.rows.length - 1) : 0;
15674
- let x = currentRow && currentCell
15675
- ? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell)
15676
- : 0;
15677
- let y = currentRow && currentCell && this.rows ? Array.from(this.rows).indexOf(currentRow) : 0;
15678
- const dir = this.host.dir;
15679
- const inlineStart = dir === 'rtl' ? 'ArrowRight' : 'ArrowLeft';
15680
- const inlineEnd = dir === 'rtl' ? 'ArrowLeft' : 'ArrowRight';
15681
- const itemsPerPage = Math.floor(this.host?.querySelector('.datagrid').clientHeight / this.rows[0].clientHeight) - 1 || 0;
15682
- if (e.code === 'ArrowUp' && y !== 0) {
15683
- y = y - 1;
15684
- }
15685
- else if (e.code === 'ArrowDown' && y < numOfRows) {
15686
- y = y + 1;
15687
- }
15688
- else if (e.code === inlineStart && x !== 0) {
15689
- x = x - 1;
15690
- }
15691
- else if (e.code === inlineEnd && x < numOfColumns) {
15692
- x = x + 1;
15693
- }
15694
- else if (e.code === 'End') {
15695
- x = numOfColumns;
15696
- if (e.ctrlKey) {
15697
- y = numOfRows;
15698
- }
15699
- }
15700
- else if (e.code === 'Home') {
15701
- x = 0;
15702
- if (e.ctrlKey) {
15703
- y = 0;
15704
- }
15705
- }
15706
- else if (e.code === 'PageUp') {
15707
- y = y - itemsPerPage > 0 ? y - itemsPerPage + 1 : 1;
15708
- }
15709
- else if (e.code === 'PageDown') {
15710
- y = y + itemsPerPage < numOfRows ? y + itemsPerPage : numOfRows;
15711
- }
15712
- return { x, y };
15713
- }
15714
- }
15715
- KeyNavigationGridController.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
15716
- KeyNavigationGridController.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController });
15717
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, decorators: [{
15718
- type: Injectable
15719
- }], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
15720
-
15721
15765
  /*
15722
15766
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
15723
15767
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -15751,7 +15795,6 @@ class DatagridCellRenderer {
15751
15795
  }
15752
15796
  }
15753
15797
  resetState(state) {
15754
- state.changes = ALL_COLUMN_CHANGES;
15755
15798
  this.setWidth(state);
15756
15799
  this.setHidden(state);
15757
15800
  }
@@ -15832,7 +15875,7 @@ class DatagridRowRenderer {
15832
15875
  }
15833
15876
  }
15834
15877
  DatagridRowRenderer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridRowRenderer, deps: [{ token: ColumnsService }], target: i0.ɵɵFactoryTarget.Directive });
15835
- 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 });
15878
+ 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 });
15836
15879
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridRowRenderer, decorators: [{
15837
15880
  type: Directive,
15838
15881
  args: [{
@@ -15841,6 +15884,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15841
15884
  }], ctorParameters: function () { return [{ type: ColumnsService }]; }, propDecorators: { cells: [{
15842
15885
  type: ContentChildren,
15843
15886
  args: [DatagridCellRenderer]
15887
+ }], expandableRow: [{
15888
+ type: ContentChild,
15889
+ args: [forwardRef(() => DatagridRowRenderer)]
15844
15890
  }] } });
15845
15891
 
15846
15892
  /*
@@ -15976,26 +16022,17 @@ class ClrDatagrid {
15976
16022
  this.rows.forEach(row => {
15977
16023
  this._displayedRows.insert(row._view);
15978
16024
  });
15979
- // Try to update only when there is something cached and its open.
15980
- if (this.detailService.state && this.detailService.isOpen) {
15981
- const row = this.rows.find(row => this.items.trackBy(row.item) === this.items.trackBy(this.detailService.state));
15982
- /**
15983
- * Reopen updated row or close it
15984
- */
15985
- if (row) {
15986
- this.detailService.open(row.item, row.detailButton.nativeElement);
15987
- }
15988
- else if (!this.hasVirtualScroller || !row) {
15989
- this.detailService.close();
16025
+ this.updateDetailState();
16026
+ // retain active cell when navigating with Up/Down Arrows, PageUp and PageDown buttons in virtual scroller
16027
+ if (this.hasVirtualScroller) {
16028
+ const active = this.keyNavigation.getActiveCell();
16029
+ const isFocusInsideDatagrid = this.datagrid.nativeElement.contains(document.activeElement);
16030
+ if (active && isFocusInsideDatagrid) {
16031
+ this.zone.runOutsideAngular(() => {
16032
+ setTimeout(() => this.keyNavigation.setActiveCell(active));
16033
+ });
15990
16034
  }
15991
16035
  }
15992
- // retain active cell when navigating with PageUp and PageDown buttons in virtual scroller
15993
- const active = this.keyNavigation.getActiveCell();
15994
- if (active) {
15995
- this.zone.runOutsideAngular(() => {
15996
- setTimeout(() => this.keyNavigation.setActiveCell(active));
15997
- });
15998
- }
15999
16036
  }));
16000
16037
  }
16001
16038
  /**
@@ -16003,6 +16040,7 @@ class ClrDatagrid {
16003
16040
  */
16004
16041
  ngAfterViewInit() {
16005
16042
  this.keyNavigation.initializeKeyGrid(this.el.nativeElement);
16043
+ this.updateDetailState();
16006
16044
  // TODO: determine if we can get rid of provider wiring in view init so that subscriptions can be done earlier
16007
16045
  this.refresh.emit(this.stateProvider.state);
16008
16046
  this._subscriptions.push(this.stateProvider.change.subscribe(state => this.refresh.emit(state)), this.selection.change.subscribe(s => {
@@ -16076,9 +16114,39 @@ class ClrDatagrid {
16076
16114
  ngOnDestroy() {
16077
16115
  this._subscriptions.forEach((sub) => sub.unsubscribe());
16078
16116
  }
16117
+ toggleAllSelected($event) {
16118
+ $event.preventDefault();
16119
+ if (this.hasVirtualScroller) {
16120
+ return;
16121
+ }
16122
+ this.allSelected = !this.allSelected;
16123
+ }
16079
16124
  resize() {
16080
16125
  this.organizer.resize();
16081
16126
  }
16127
+ /**
16128
+ * Checks the state of detail panel and if it's opened then
16129
+ * find the matching row and trigger the detail panel
16130
+ */
16131
+ updateDetailState() {
16132
+ // Try to update only when there is something cached and its open.
16133
+ if (this.detailService.state && this.detailService.isOpen) {
16134
+ const row = this.rows.find(row => this.items.trackBy(row.item) === this.items.trackBy(this.detailService.state));
16135
+ /**
16136
+ * Reopen updated row or close it
16137
+ */
16138
+ if (row) {
16139
+ this.detailService.open(row.item, row.detailButton.nativeElement);
16140
+ // always keep open when virtual scroll is available otherwise close it
16141
+ }
16142
+ else if (!this.hasVirtualScroller) {
16143
+ // Using setTimeout to make sure the inner cycles in rows are done
16144
+ setTimeout(() => {
16145
+ this.detailService.close();
16146
+ });
16147
+ }
16148
+ }
16149
+ }
16082
16150
  /**
16083
16151
  * Public method to re-trigger the computation of displayed items manually
16084
16152
  */
@@ -16103,7 +16171,7 @@ ClrDatagrid.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
16103
16171
  ColumnsService,
16104
16172
  DisplayModeService,
16105
16173
  KeyNavigationGridController,
16106
- ], 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" }] });
16174
+ ], 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" }] });
16107
16175
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagrid, decorators: [{
16108
16176
  type: Component,
16109
16177
  args: [{ selector: 'clr-datagrid', providers: [
@@ -16125,7 +16193,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
16125
16193
  ], host: {
16126
16194
  '[class.datagrid-host]': 'true',
16127
16195
  '[class.datagrid-detail-open]': 'detailService.isOpen',
16128
- }, 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" }]
16196
+ }, 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" }]
16129
16197
  }], ctorParameters: function () { return [{ type: DatagridRenderOrganizer }, { type: Items }, { type: ExpandableRowsCount }, { type: Selection }, { type: RowActionService }, { type: StateProvider }, { type: DisplayModeService }, { type: i0.Renderer2 }, { type: DetailService }, { type: undefined, decorators: [{
16130
16198
  type: Inject,
16131
16199
  args: [DOCUMENT]
@@ -16294,6 +16362,7 @@ class ClrDatagridActionOverflow {
16294
16362
  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 });
16295
16363
  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: `
16296
16364
  <button
16365
+ tabindex="-1"
16297
16366
  class="datagrid-action-toggle"
16298
16367
  type="button"
16299
16368
  role="button"
@@ -16328,6 +16397,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
16328
16397
  hostDirectives: [ClrPopoverHostDirective],
16329
16398
  template: `
16330
16399
  <button
16400
+ tabindex="-1"
16331
16401
  class="datagrid-action-toggle"
16332
16402
  type="button"
16333
16403
  role="button"
@@ -16633,10 +16703,13 @@ class ClrDatagridDetailHeader {
16633
16703
  get titleId() {
16634
16704
  return `${this.detailService.id}-title`;
16635
16705
  }
16706
+ ngAfterViewInit() {
16707
+ this.title.nativeElement.focus();
16708
+ }
16636
16709
  }
16637
16710
  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 });
16638
- 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: `
16639
- <div class="datagrid-detail-header-title" cdkFocusInitial tabindex="-1" [id]="titleId">
16711
+ 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: `
16712
+ <div #title class="datagrid-detail-header-title" tabindex="-1" [id]="titleId">
16640
16713
  <ng-content></ng-content>
16641
16714
  </div>
16642
16715
  <div class="datagrid-detail-pane-close">
@@ -16658,7 +16731,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
16658
16731
  '[class.datagrid-detail-header]': 'true',
16659
16732
  },
16660
16733
  template: `
16661
- <div class="datagrid-detail-header-title" cdkFocusInitial tabindex="-1" [id]="titleId">
16734
+ <div #title class="datagrid-detail-header-title" tabindex="-1" [id]="titleId">
16662
16735
  <ng-content></ng-content>
16663
16736
  </div>
16664
16737
  <div class="datagrid-detail-pane-close">
@@ -16673,7 +16746,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
16673
16746
  </div>
16674
16747
  `,
16675
16748
  }]
16676
- }], ctorParameters: function () { return [{ type: DetailService }, { type: ClrCommonStringsService }]; } });
16749
+ }], ctorParameters: function () { return [{ type: DetailService }, { type: ClrCommonStringsService }]; }, propDecorators: { title: [{
16750
+ type: ViewChild,
16751
+ args: ['title']
16752
+ }] } });
16677
16753
 
16678
16754
  /*
16679
16755
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
@@ -16686,21 +16762,42 @@ class ClrDatagridDetail {
16686
16762
  this.detailService = detailService;
16687
16763
  this.commonStrings = commonStrings;
16688
16764
  }
16765
+ get labelledBy() {
16766
+ if (this.ariaLabelledBy) {
16767
+ return this.header ? `${this.header.titleId} ${this.ariaLabelledBy}` : this.ariaLabelledBy;
16768
+ }
16769
+ else if (this.ariaLabel) {
16770
+ // If aria-label is set by the end user, do not set aria-labelledby
16771
+ return null;
16772
+ }
16773
+ else {
16774
+ return this.header?.titleId || '';
16775
+ }
16776
+ }
16777
+ get label() {
16778
+ if (!this.ariaLabelledBy) {
16779
+ return this.ariaLabel || null;
16780
+ }
16781
+ else {
16782
+ return null;
16783
+ }
16784
+ }
16689
16785
  close() {
16690
16786
  this.detailService.close();
16691
16787
  }
16692
16788
  }
16693
16789
  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 });
16694
- 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: `
16790
+ 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: `
16695
16791
  <div
16696
16792
  cdkTrapFocus
16697
- [cdkTrapFocusAutoCapture]="true"
16793
+ [cdkTrapFocusAutoCapture]="!header"
16698
16794
  class="datagrid-detail-pane-content"
16699
16795
  *ngIf="detailService.isOpen"
16700
16796
  role="dialog"
16701
16797
  [id]="detailService.id"
16702
16798
  aria-modal="true"
16703
- [attr.aria-describedby]="header ? header.titleId : ''"
16799
+ [attr.aria-labelledby]="labelledBy"
16800
+ [attr.aria-label]="label"
16704
16801
  >
16705
16802
  <div class="clr-sr-only">{{ commonStrings.keys.detailPaneStart }}</div>
16706
16803
  <ng-content></ng-content>
@@ -16719,13 +16816,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
16719
16816
  template: `
16720
16817
  <div
16721
16818
  cdkTrapFocus
16722
- [cdkTrapFocusAutoCapture]="true"
16819
+ [cdkTrapFocusAutoCapture]="!header"
16723
16820
  class="datagrid-detail-pane-content"
16724
16821
  *ngIf="detailService.isOpen"
16725
16822
  role="dialog"
16726
16823
  [id]="detailService.id"
16727
16824
  aria-modal="true"
16728
- [attr.aria-describedby]="header ? header.titleId : ''"
16825
+ [attr.aria-labelledby]="labelledBy"
16826
+ [attr.aria-label]="label"
16729
16827
  >
16730
16828
  <div class="clr-sr-only">{{ commonStrings.keys.detailPaneStart }}</div>
16731
16829
  <ng-content></ng-content>
@@ -16733,7 +16831,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
16733
16831
  </div>
16734
16832
  `,
16735
16833
  }]
16736
- }], ctorParameters: function () { return [{ type: DetailService }, { type: ClrCommonStringsService }]; }, propDecorators: { header: [{
16834
+ }], ctorParameters: function () { return [{ type: DetailService }, { type: ClrCommonStringsService }]; }, propDecorators: { ariaLabelledBy: [{
16835
+ type: Input,
16836
+ args: ['clrDetailAriaLabelledBy']
16837
+ }], ariaLabel: [{
16838
+ type: Input,
16839
+ args: ['clrDetailAriaLabel']
16840
+ }], header: [{
16737
16841
  type: ContentChild,
16738
16842
  args: [ClrDatagridDetailHeader]
16739
16843
  }] } });
@@ -17007,6 +17111,9 @@ class ClrIfDetail {
17007
17111
  }
17008
17112
  this.skip = false;
17009
17113
  }
17114
+ get viewContext() {
17115
+ return { $implicit: this.detailService.state };
17116
+ }
17010
17117
  ngOnInit() {
17011
17118
  this.subscriptions.push(this.detailService.stateChange.subscribe(state => {
17012
17119
  if (state === true) {
@@ -17023,12 +17130,11 @@ class ClrIfDetail {
17023
17130
  togglePanel(showPanel) {
17024
17131
  let stateChangeParams = null;
17025
17132
  if (showPanel === true) {
17026
- const embeddedViewContext = { $implicit: this.detailService.state };
17027
- if (this.embeddedViewRef) {
17028
- this.embeddedViewRef.context = embeddedViewContext;
17029
- }
17030
- else {
17031
- this.embeddedViewRef = this.viewContainer.createEmbeddedView(this.templateRef, embeddedViewContext);
17133
+ if (!this.embeddedViewRef) {
17134
+ // Create a context forward `Proxy` that will always bind to the user-specified context,
17135
+ // without having to re-assign it whenever changes.
17136
+ const viewContext = this._createContextForwardProxy();
17137
+ this.embeddedViewRef = this.viewContainer.createEmbeddedView(this.templateRef, viewContext);
17032
17138
  }
17033
17139
  this.skip = true;
17034
17140
  stateChangeParams = this.detailService.state;
@@ -17039,6 +17145,27 @@ class ClrIfDetail {
17039
17145
  }
17040
17146
  this.stateChange.emit(stateChangeParams);
17041
17147
  }
17148
+ /**
17149
+ * For a given outlet instance, we create a proxy object that delegates
17150
+ * to the user-specified context. This allows changing, or swapping out
17151
+ * the context object completely without having to destroy/re-create the view.
17152
+ */
17153
+ _createContextForwardProxy() {
17154
+ return new Proxy({}, {
17155
+ set: (_target, prop, newValue) => {
17156
+ if (!this.viewContext) {
17157
+ return false;
17158
+ }
17159
+ return Reflect.set(this.viewContext, prop, newValue);
17160
+ },
17161
+ get: (_target, prop, receiver) => {
17162
+ if (!this.viewContext) {
17163
+ return undefined;
17164
+ }
17165
+ return Reflect.get(this.viewContext, prop, receiver);
17166
+ },
17167
+ });
17168
+ }
17042
17169
  }
17043
17170
  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 });
17044
17171
  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 });
@@ -17250,7 +17377,7 @@ class ClrDatagridPagination {
17250
17377
  * Set the input's value to the new current page. This is needed because the code
17251
17378
  * above may have changed the value from what the user entered in.
17252
17379
  */
17253
- this.currentPageInputRef.nativeElement.value = this.page.current;
17380
+ this.currentPageInputRef.nativeElement.value = this.page.current.toString();
17254
17381
  }
17255
17382
  }
17256
17383
  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 });
@@ -17571,7 +17698,7 @@ const defaultCdkFixedSizeVirtualScrollInputs = {
17571
17698
  maxBufferPx: 400,
17572
17699
  };
17573
17700
  class ClrDatagridVirtualScrollDirective {
17574
- constructor(changeDetectorRef, iterableDiffers, items, ngZone, templateRef, viewContainerRef, directionality, scrollDispatcher, viewportRuler, datagrid, injector) {
17701
+ constructor(changeDetectorRef, iterableDiffers, items, ngZone, templateRef, viewContainerRef, directionality, scrollDispatcher, viewportRuler, datagrid, columnsService, injector) {
17575
17702
  this.changeDetectorRef = changeDetectorRef;
17576
17703
  this.iterableDiffers = iterableDiffers;
17577
17704
  this.items = items;
@@ -17582,6 +17709,7 @@ class ClrDatagridVirtualScrollDirective {
17582
17709
  this.scrollDispatcher = scrollDispatcher;
17583
17710
  this.viewportRuler = viewportRuler;
17584
17711
  this.datagrid = datagrid;
17712
+ this.columnsService = columnsService;
17585
17713
  this.injector = injector;
17586
17714
  this.renderedRangeChange = new EventEmitter();
17587
17715
  this._cdkFixedSizeVirtualScrollInputs = { ...defaultCdkFixedSizeVirtualScrollInputs };
@@ -17594,12 +17722,16 @@ class ClrDatagridVirtualScrollDirective {
17594
17722
  }
17595
17723
  });
17596
17724
  });
17725
+ this.viewRepeater = new _RecycleViewRepeaterStrategy();
17597
17726
  this.cdkVirtualForInputs = {
17598
17727
  cdkVirtualForTrackBy: index => index,
17599
17728
  };
17600
17729
  this.items.smartenUp();
17601
17730
  this.datagrid.hasVirtualScroller = true;
17731
+ this.datagrid.detailService.preventFocusScroll = true;
17602
17732
  this.datagridElementRef = this.datagrid.el;
17733
+ // default
17734
+ this.cdkVirtualForTemplateCacheSize = 20;
17603
17735
  this.mutationChanges.observe(this.datagridElementRef.nativeElement, {
17604
17736
  attributeFilter: ['class'],
17605
17737
  attributeOldValue: true,
@@ -17659,7 +17791,7 @@ class ClrDatagridVirtualScrollDirective {
17659
17791
  ngAfterViewInit() {
17660
17792
  this.injector.runInContext(() => {
17661
17793
  this.virtualScrollViewport = this.createVirtualScrollViewportForDatagrid(this.changeDetectorRef, this.ngZone, this.directionality, this.scrollDispatcher, this.viewportRuler, this.datagridElementRef, this.virtualScrollStrategy);
17662
- this.cdkVirtualFor = new CdkVirtualForOf(this.viewContainerRef, this.templateRef, this.iterableDiffers, new _RecycleViewRepeaterStrategy(), this.virtualScrollViewport, this.ngZone);
17794
+ this.cdkVirtualFor = new CdkVirtualForOf(this.viewContainerRef, this.templateRef, this.iterableDiffers, this.viewRepeater, this.virtualScrollViewport, this.ngZone);
17663
17795
  this.virtualScrollViewport.ngOnInit();
17664
17796
  });
17665
17797
  this.gridRoleElement = this.datagridElementRef.nativeElement.querySelector('[role="grid"]');
@@ -17674,6 +17806,8 @@ class ClrDatagridVirtualScrollDirective {
17674
17806
  if (datagridState.filters) {
17675
17807
  this.virtualScrollViewport.scrollToIndex(0);
17676
17808
  }
17809
+ }), this.columnsService.columnsStateChange.subscribe(() => {
17810
+ this.viewRepeater.detach();
17677
17811
  }));
17678
17812
  }
17679
17813
  ngDoCheck() {
@@ -17745,7 +17879,7 @@ class ClrDatagridVirtualScrollDirective {
17745
17879
  return virtualScrollViewport;
17746
17880
  }
17747
17881
  }
17748
- 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 });
17882
+ 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 });
17749
17883
  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 });
17750
17884
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, decorators: [{
17751
17885
  type: Directive,
@@ -17755,7 +17889,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17755
17889
  }]
17756
17890
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.IterableDiffers }, { type: Items, decorators: [{
17757
17891
  type: SkipSelf
17758
- }] }, { 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 }]; }, propDecorators: { renderedRangeChange: [{
17892
+ }] }, { 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 }]; }, propDecorators: { renderedRangeChange: [{
17759
17893
  type: Output
17760
17894
  }], cdkVirtualForOf: [{
17761
17895
  type: Input,
@@ -17980,6 +18114,9 @@ class DatagridMainRenderer {
17980
18114
  this.subscriptions.push(this.detailService.stateChange.subscribe(state => this.toggleDetailPane(state)));
17981
18115
  this.subscriptions.push(this.items.change.subscribe(() => (this.shouldStabilizeColumns = true)));
17982
18116
  }
18117
+ ngOnInit() {
18118
+ this.columnsService.columnsStateChange.subscribe(change => this.columnStateChanged(change));
18119
+ }
17983
18120
  ngAfterContentInit() {
17984
18121
  this.setupColumns();
17985
18122
  this.subscriptions.push(this.headers.changes.subscribe(() => {
@@ -17989,7 +18126,6 @@ class DatagridMainRenderer {
17989
18126
  this.columnsSizesStable = false;
17990
18127
  this.stabilizeColumns();
17991
18128
  }));
17992
- this.listenForColumnChanges();
17993
18129
  }
17994
18130
  // Initialize and set Table width for horizontal scrolling here.
17995
18131
  ngAfterViewInit() {
@@ -17997,7 +18133,9 @@ class DatagridMainRenderer {
17997
18133
  }
17998
18134
  ngAfterViewChecked() {
17999
18135
  if (this.shouldStabilizeColumns) {
18000
- this.stabilizeColumns();
18136
+ setTimeout(() => {
18137
+ this.stabilizeColumns();
18138
+ }, 0);
18001
18139
  }
18002
18140
  if (this.shouldComputeHeight()) {
18003
18141
  this.ngZone.runOutsideAngular(() => {
@@ -18031,7 +18169,10 @@ class DatagridMainRenderer {
18031
18169
  setupColumns() {
18032
18170
  this.headers.forEach((header, index) => header.setColumnState(index));
18033
18171
  this.columnsService.columns.splice(this.headers.length); // Trim any old columns
18034
- this.rows.forEach(row => row.setCellsState());
18172
+ // Sets columnIndex for each column
18173
+ this.columnsService.columns.forEach((column, index) => {
18174
+ this.columnsService.emitStateChange(column, { changes: [DatagridColumnChanges.INITIALIZE], columnIndex: index });
18175
+ });
18035
18176
  }
18036
18177
  shouldComputeHeight() {
18037
18178
  if (!this._heightSet && this.page.size > 0) {
@@ -18088,6 +18229,10 @@ class DatagridMainRenderer {
18088
18229
  });
18089
18230
  }
18090
18231
  columnStateChanged(state) {
18232
+ // eslint-disable-next-line eqeqeq
18233
+ if (!this.headers || state.columnIndex == null) {
18234
+ return;
18235
+ }
18091
18236
  const columnIndex = state.columnIndex;
18092
18237
  if (state.changes && state.changes.length) {
18093
18238
  state.changes.forEach(change => {
@@ -18095,8 +18240,9 @@ class DatagridMainRenderer {
18095
18240
  case DatagridColumnChanges.WIDTH:
18096
18241
  this.headers.get(columnIndex).setWidth(state);
18097
18242
  this.rows.forEach(row => {
18098
- if (row.cells && row.cells.length) {
18243
+ if (row?.cells.length === this.columnsService.columns.length) {
18099
18244
  row.cells.get(columnIndex).setWidth(state);
18245
+ row.expandableRow?.cells.get(columnIndex)?.setWidth(state);
18100
18246
  }
18101
18247
  });
18102
18248
  break;
@@ -18105,27 +18251,26 @@ class DatagridMainRenderer {
18105
18251
  this.rows.forEach(row => {
18106
18252
  if (row.cells && row.cells.length) {
18107
18253
  row.cells.get(columnIndex).setHidden(state);
18254
+ row.expandableRow?.cells.get(columnIndex)?.setHidden(state);
18108
18255
  }
18109
18256
  });
18110
18257
  this.keyNavigation.resetKeyGrid();
18111
18258
  break;
18259
+ case DatagridColumnChanges.INITIALIZE:
18260
+ if (state.hideable && state.hidden) {
18261
+ this.headers.get(columnIndex).setHidden(state);
18262
+ this.rows.forEach(row => {
18263
+ row.setCellsState();
18264
+ row.expandableRow?.setCellsState();
18265
+ });
18266
+ }
18267
+ break;
18112
18268
  default:
18113
18269
  break;
18114
18270
  }
18115
18271
  });
18116
18272
  }
18117
18273
  }
18118
- listenForColumnChanges() {
18119
- this.columnsService.columns.forEach((column, index) => {
18120
- this.columnsService.emitStateChange(column, { changes: [], columnIndex: index });
18121
- });
18122
- /*
18123
- Merges all column subject so we can track them at once
18124
- and receive only the changed column as result
18125
- */
18126
- const columnChanges = merge(...this.columnsService.columns);
18127
- this.subscriptions.push(columnChanges.subscribe(change => this.columnStateChanged(change)));
18128
- }
18129
18274
  /**
18130
18275
  * Triggers a whole re-rendring cycle to set column sizes, if needed.
18131
18276
  */
@@ -18143,7 +18288,7 @@ class DatagridMainRenderer {
18143
18288
  }
18144
18289
  }
18145
18290
  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 });
18146
- 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 });
18291
+ 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 });
18147
18292
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridMainRenderer, decorators: [{
18148
18293
  type: Directive,
18149
18294
  args: [{
@@ -18155,7 +18300,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
18155
18300
  args: [DatagridHeaderRenderer]
18156
18301
  }], rows: [{
18157
18302
  type: ContentChildren,
18158
- args: [DatagridRowRenderer, { descendants: true }]
18303
+ args: [DatagridRowRenderer]
18159
18304
  }] } });
18160
18305
 
18161
18306
  /*
@@ -18613,7 +18758,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
18613
18758
  }] } });
18614
18759
  function eventIsInputEvent(event) {
18615
18760
  const targetElement = event?.target;
18616
- return targetElement?.tagName === 'INPUT';
18761
+ return targetElement?.tagName
18762
+ ? ['INPUT', 'TEXTAREA', 'BUTTON', 'A', 'SELECT', 'OPTION'].includes(targetElement.tagName)
18763
+ : false;
18617
18764
  }
18618
18765
 
18619
18766
  /*
@@ -19583,7 +19730,7 @@ class ClrTreeNode {
19583
19730
  }
19584
19731
  setTabIndex(value) {
19585
19732
  this.contentContainerTabindex = value;
19586
- this.contentContainer.nativeElement.setAttribute('tabindex', value);
19733
+ this.contentContainer.nativeElement.setAttribute('tabindex', value.toString());
19587
19734
  }
19588
19735
  checkTabIndex(nodeId) {
19589
19736
  if (isPlatformBrowser(this.platformId) && this.nodeId !== nodeId && this.contentContainerTabindex !== -1) {
@@ -21826,18 +21973,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21826
21973
  * This software is released under MIT license.
21827
21974
  * The full license information can be found in LICENSE in the root directory of this project.
21828
21975
  */
21829
- const createCdsCloseButton = (document, ariaLabel) => {
21830
- const cdsCloseButton = document.createElement('cds-internal-close-button');
21831
- cdsCloseButton.setAttribute('icon-size', '32');
21832
- cdsCloseButton.setAttribute('aria-label', ariaLabel);
21833
- cdsCloseButton.setAttribute('aria-hidden', 'true');
21834
- cdsCloseButton.setAttribute('type', 'button');
21976
+ const createCloseButton = (document, ariaLabel) => {
21977
+ const closeButton = document.createElement('button');
21978
+ closeButton.setAttribute('aria-label', ariaLabel);
21979
+ closeButton.setAttribute('aria-hidden', 'true');
21980
+ closeButton.innerHTML = `
21981
+ <cds-icon
21982
+ inner-offset="1"
21983
+ shape="close"
21984
+ size="32"
21985
+ </cds-icon>
21986
+ `;
21835
21987
  /**
21836
21988
  * The button is hidden by default based on our Desktop-first approach.
21837
21989
  */
21838
- cdsCloseButton.setAttribute('hidden', 'true');
21839
- cdsCloseButton.className = 'clr-nav-close';
21840
- return cdsCloseButton;
21990
+ closeButton.setAttribute('hidden', 'true');
21991
+ closeButton.className = 'clr-nav-close';
21992
+ return closeButton;
21841
21993
  };
21842
21994
  class ClrNavLevel {
21843
21995
  constructor(platformId, cdkTrapFocus, responsiveNavService, elementRef, renderer, injector) {
@@ -21889,7 +22041,7 @@ class ClrNavLevel {
21889
22041
  this.addNavClass(this.level);
21890
22042
  }
21891
22043
  ngAfterViewInit() {
21892
- const closeButton = createCdsCloseButton(this._document, this.closeButtonAriaLabel);
22044
+ const closeButton = createCloseButton(this._document, this.closeButtonAriaLabel);
21893
22045
  this.renderer.listen(closeButton, 'click', this.close.bind(this));
21894
22046
  this.renderer.insertBefore(this.elementRef.nativeElement, closeButton, this.elementRef.nativeElement.firstChild); // Adding the button at the top of the nav
21895
22047
  if (this._document.body.clientWidth < LARGE_BREAKPOINT) {
@@ -23382,6 +23534,13 @@ class ClrModal {
23382
23534
  this._openChanged.emit(true);
23383
23535
  this.modalStackService.trackModalOpen(this);
23384
23536
  }
23537
+ backdropClick() {
23538
+ if (this.staticBackdrop) {
23539
+ this.title.nativeElement.focus();
23540
+ return;
23541
+ }
23542
+ this.close();
23543
+ }
23385
23544
  close() {
23386
23545
  if (this.stopClose) {
23387
23546
  this.altClose.emit(false);
@@ -23401,7 +23560,7 @@ class ClrModal {
23401
23560
  }
23402
23561
  }
23403
23562
  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 });
23404
- 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: [
23563
+ 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: [
23405
23564
  trigger('fadeMove', [
23406
23565
  transition('* => fadeDown', [
23407
23566
  style({ opacity: 0, transform: 'translate(0, -25%)' }),
@@ -23436,8 +23595,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
23436
23595
  transition('void => *', [style({ opacity: 0 }), animate('0.2s ease-in-out', style({ opacity: 0.85 }))]),
23437
23596
  transition('* => void', [animate('0.2s ease-in-out', style({ opacity: 0 }))]),
23438
23597
  ]),
23439
- ], 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"] }]
23440
- }], ctorParameters: function () { return [{ type: ScrollingService }, { type: ClrCommonStringsService }, { type: ModalStackService }, { type: ClrModalConfigurationService }]; }, propDecorators: { _open: [{
23598
+ ], 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"] }]
23599
+ }], ctorParameters: function () { return [{ type: ScrollingService }, { type: ClrCommonStringsService }, { type: ModalStackService }, { type: ClrModalConfigurationService }]; }, propDecorators: { title: [{
23600
+ type: ViewChild,
23601
+ args: ['title']
23602
+ }], _open: [{
23441
23603
  type: Input,
23442
23604
  args: ['clrModalOpen']
23443
23605
  }, {
@@ -23598,7 +23760,9 @@ class ClrSidePanel {
23598
23760
  this.modal.close();
23599
23761
  }
23600
23762
  documentClick(event) {
23601
- if (!this.element.nativeElement.contains(event.target) && this.modal._open && !this.configuration.backdrop) {
23763
+ if (!this.element.nativeElement.contains(event.target) &&
23764
+ this.modal._open &&
23765
+ !this.configuration.backdrop) {
23602
23766
  this.modal.close();
23603
23767
  }
23604
23768
  }
@@ -24485,13 +24649,13 @@ class ClrTimeline {
24485
24649
  }
24486
24650
  }
24487
24651
  ClrTimeline.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrTimeline, deps: [], target: i0.ɵɵFactoryTarget.Component });
24488
- 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 });
24652
+ 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 });
24489
24653
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrTimeline, decorators: [{
24490
24654
  type: Component,
24491
24655
  args: [{
24492
24656
  selector: 'clr-timeline',
24493
24657
  template: `<ng-content></ng-content>`,
24494
- host: { '[class.clr-timeline]': 'true' },
24658
+ host: { '[class.clr-timeline]': 'true', '[attr.role]': '"list"' },
24495
24659
  providers: [TimelineIconAttributeService],
24496
24660
  }]
24497
24661
  }], propDecorators: { layout: [{
@@ -24562,7 +24726,7 @@ class ClrTimelineStep {
24562
24726
  }
24563
24727
  }
24564
24728
  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 });
24565
- 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: `
24729
+ 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: `
24566
24730
  <ng-content select="clr-timeline-step-header"></ng-content>
24567
24731
  <span class="clr-sr-only">{{ stepTitleText }}</span>
24568
24732
  <ng-container *ngIf="!isProcessing; else processing">
@@ -24606,7 +24770,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
24606
24770
  <clr-spinner clrMedium [attr.aria-label]="iconAriaLabel"></clr-spinner>
24607
24771
  </ng-template>
24608
24772
  `,
24609
- host: { '[class.clr-timeline-step]': 'true' },
24773
+ host: { '[class.clr-timeline-step]': 'true', '[attr.role]': '"listitem"' },
24610
24774
  }]
24611
24775
  }], ctorParameters: function () { return [{ type: TimelineIconAttributeService }, { type: undefined, decorators: [{
24612
24776
  type: Inject,
@@ -26598,15 +26762,12 @@ ClrWizardStepnavItem.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", v
26598
26762
  (click)="click()"
26599
26763
  [attr.disabled]="isDisabled ? '' : null"
26600
26764
  >
26601
- <span class="clr-wizard-stepnav-link-suffix">
26602
- <cds-icon
26603
- shape="error-standard"
26604
- status="danger"
26605
- class="clr-wizard-stepnav-item-error-icon"
26606
- *ngIf="hasError"
26607
- ></cds-icon>
26608
- <ng-content *ngIf="!hasError"></ng-content>
26609
- </span>
26765
+ <div class="clr-wizard-stepnav-link-icon">
26766
+ <cds-icon *ngIf="hasError" shape="error-standard" aria-label="error"></cds-icon>
26767
+ <cds-icon *ngIf="!hasError && isComplete" shape="success-standard" aria-label="complete"></cds-icon>
26768
+ </div>
26769
+
26770
+ <div class="clr-wizard-stepnav-link-page-number"><ng-content></ng-content></div>
26610
26771
  <span class="clr-wizard-stepnav-link-title">
26611
26772
  <ng-template [ngTemplateOutlet]="page.navTitle"></ng-template>
26612
26773
  </span>
@@ -26625,15 +26786,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26625
26786
  (click)="click()"
26626
26787
  [attr.disabled]="isDisabled ? '' : null"
26627
26788
  >
26628
- <span class="clr-wizard-stepnav-link-suffix">
26629
- <cds-icon
26630
- shape="error-standard"
26631
- status="danger"
26632
- class="clr-wizard-stepnav-item-error-icon"
26633
- *ngIf="hasError"
26634
- ></cds-icon>
26635
- <ng-content *ngIf="!hasError"></ng-content>
26636
- </span>
26789
+ <div class="clr-wizard-stepnav-link-icon">
26790
+ <cds-icon *ngIf="hasError" shape="error-standard" aria-label="error"></cds-icon>
26791
+ <cds-icon *ngIf="!hasError && isComplete" shape="success-standard" aria-label="complete"></cds-icon>
26792
+ </div>
26793
+
26794
+ <div class="clr-wizard-stepnav-link-page-number"><ng-content></ng-content></div>
26637
26795
  <span class="clr-wizard-stepnav-link-title">
26638
26796
  <ng-template [ngTemplateOutlet]="page.navTitle"></ng-template>
26639
26797
  </span>
@@ -27100,7 +27258,7 @@ class ClrWizard {
27100
27258
  }
27101
27259
  }
27102
27260
  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 });
27103
- 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" }] });
27261
+ 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" }] });
27104
27262
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrWizard, decorators: [{
27105
27263
  type: Component,
27106
27264
  args: [{ selector: 'clr-wizard', providers: [WizardNavigationService, PageCollectionService, ButtonHubService, HeaderActionService], host: {
@@ -27109,7 +27267,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
27109
27267
  '[class.wizard-lg]': "size == 'lg'",
27110
27268
  '[class.wizard-xl]': "size == 'xl'",
27111
27269
  '[class.lastPage]': 'navService.currentPageIsLast',
27112
- }, 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" }]
27270
+ }, 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" }]
27113
27271
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
27114
27272
  type: Inject,
27115
27273
  args: [PLATFORM_ID]
@@ -27383,7 +27541,7 @@ const CLR_WIZARD_DIRECTIVES = [
27383
27541
  ];
27384
27542
  class ClrWizardModule {
27385
27543
  constructor() {
27386
- ClarityIcons.addIcons(errorStandardIcon);
27544
+ ClarityIcons.addIcons(errorStandardIcon, successStandardIcon);
27387
27545
  }
27388
27546
  }
27389
27547
  ClrWizardModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrWizardModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });