@clr/angular 17.7.1 → 17.8.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 (41) hide show
  1. package/clarity.api.md +49 -8
  2. package/data/datagrid/datagrid-virtual-scroll.directive.d.ts +4 -0
  3. package/data/datagrid/datagrid.d.ts +6 -2
  4. package/data/datagrid/utils/key-navigation-grid.controller.d.ts +19 -2
  5. package/esm2020/data/datagrid/datagrid-column.mjs +9 -9
  6. package/esm2020/data/datagrid/datagrid-row-detail.mjs +29 -7
  7. package/esm2020/data/datagrid/datagrid-row.mjs +3 -3
  8. package/esm2020/data/datagrid/datagrid-virtual-scroll.directive.mjs +14 -3
  9. package/esm2020/data/datagrid/datagrid.mjs +10 -6
  10. package/esm2020/data/datagrid/utils/key-navigation-grid.controller.mjs +238 -56
  11. package/esm2020/data/tree-view/tree-node.mjs +3 -3
  12. package/esm2020/emphasis/alert/alerts-pager.mjs +3 -3
  13. package/esm2020/forms/checkbox/checkbox-container.mjs +7 -3
  14. package/esm2020/forms/checkbox/checkbox-wrapper.mjs +8 -3
  15. package/esm2020/forms/checkbox/checkbox.mjs +5 -1
  16. package/esm2020/forms/datepicker/day.mjs +2 -2
  17. package/esm2020/forms/datepicker/yearpicker.mjs +6 -1
  18. package/esm2020/layout/breadcrumbs/index.mjs +2 -1
  19. package/esm2020/modal/modal.mjs +4 -3
  20. package/esm2020/modal/side-panel.mjs +5 -1
  21. package/esm2020/popover/signpost/signpost.mjs +9 -6
  22. package/esm2020/utils/conditional/if-expanded.directive.mjs +2 -1
  23. package/esm2020/utils/conditional/if-expanded.service.mjs +2 -1
  24. package/esm2020/utils/i18n/common-strings.default.mjs +2 -2
  25. package/esm2020/wizard/wizard-stepnav-item.mjs +34 -7
  26. package/esm2020/wizard/wizard-stepnav.mjs +30 -24
  27. package/esm2020/wizard/wizard.mjs +3 -3
  28. package/fesm2015/clr-angular.mjs +828 -550
  29. package/fesm2015/clr-angular.mjs.map +1 -1
  30. package/fesm2020/clr-angular.mjs +831 -549
  31. package/fesm2020/clr-angular.mjs.map +1 -1
  32. package/forms/checkbox/checkbox-container.d.ts +1 -0
  33. package/forms/checkbox/checkbox-wrapper.d.ts +3 -1
  34. package/forms/checkbox/checkbox.d.ts +2 -0
  35. package/forms/datepicker/yearpicker.d.ts +1 -0
  36. package/layout/breadcrumbs/index.d.ts +1 -0
  37. package/package.json +2 -2
  38. package/popover/signpost/signpost.d.ts +2 -1
  39. package/utils/conditional/if-expanded.service.d.ts +1 -0
  40. package/wizard/wizard-stepnav-item.d.ts +5 -0
  41. package/wizard/wizard-stepnav.d.ts +2 -1
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Directive, NgModule, Optional, Input, Injectable, Component, ChangeDetectionStrategy, EventEmitter, SkipSelf, HostBinding, Output, ContentChildren, PLATFORM_ID, Inject, ViewChild, HostListener, Renderer2, InjectionToken, ElementRef, NgZone, ChangeDetectorRef, ContentChild, ComponentFactoryResolver, KeyValueDiffers, Self, Attribute, TemplateRef, ViewContainerRef, LOCALE_ID, forwardRef, inject, Injector, VERSION, EnvironmentInjector, IterableDiffers } from '@angular/core';
2
+ import { Directive, NgModule, Optional, Input, Injectable, Component, ChangeDetectionStrategy, EventEmitter, SkipSelf, HostBinding, Output, ContentChildren, PLATFORM_ID, Inject, ViewChild, HostListener, Renderer2, InjectionToken, ElementRef, NgZone, ChangeDetectorRef, ContentChild, ComponentFactoryResolver, KeyValueDiffers, Self, forwardRef, Attribute, TemplateRef, ViewContainerRef, LOCALE_ID, inject, Injector, VERSION, EnvironmentInjector, IterableDiffers } from '@angular/core';
3
3
  import * as i5 from '@angular/common';
4
4
  import { CommonModule, isPlatformBrowser, DOCUMENT, NgForOf, getLocaleDayNames, FormStyle, TranslationWidth, getLocaleMonthNames, getLocaleFirstDayOfWeek, getLocaleDateFormat, FormatWidth } from '@angular/common';
5
5
  import { ClarityIcons, angleIcon, exclamationCircleIcon, checkCircleIcon, ellipsisHorizontalIcon, windowCloseIcon, infoCircleIcon, timesIcon, angleDoubleIcon, eventIcon, calendarIcon, folderOpenIcon, eyeHideIcon, eyeIcon, ellipsisVerticalIcon, viewColumnsIcon, arrowIcon, stepForward2Icon, filterGridCircleIcon, filterGridIcon, errorStandardIcon, helpIcon, infoStandardIcon, noteIcon, successStandardIcon, warningStandardIcon, circleIcon, dotCircleIcon } from '@cds/core/icon';
@@ -150,6 +150,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
150
150
  class IfExpandService {
151
151
  constructor() {
152
152
  this.expandable = 0;
153
+ this.hasExpandTemplate = false;
153
154
  this._loading = false;
154
155
  this._expanded = false;
155
156
  this._expandChange = new Subject();
@@ -373,7 +374,7 @@ const commonStringsDefault = {
373
374
  wizardStep: 'Step',
374
375
  wizardStepSuccess: 'Completed',
375
376
  wizardStepError: 'Error',
376
- wizardStepnavAriaLabel: 'Step navigation',
377
+ wizardStepnavAriaLabel: 'Wizard steps',
377
378
  /**
378
379
  * Password Input
379
380
  * Screen-reader text for the hide/show password field button
@@ -3577,6 +3578,7 @@ class ClrIfExpanded {
3577
3578
  this.updateView();
3578
3579
  this.expandedChange.emit(expand.expanded);
3579
3580
  }));
3581
+ expand.hasExpandTemplate = !!template;
3580
3582
  }
3581
3583
  get expanded() {
3582
3584
  return this._expanded;
@@ -5858,13 +5860,13 @@ class ClrSignpost {
5858
5860
  }
5859
5861
  }
5860
5862
  ClrSignpost.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrSignpost, deps: [{ token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Component });
5861
- ClrSignpost.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrSignpost, selector: "clr-signpost", host: { properties: { "class.signpost": "true" } }, providers: [SignpostFocusManager, SignpostIdService], queries: [{ propertyName: "customTrigger", first: true, predicate: ClrSignpostTrigger, descendants: true }], hostDirectives: [{ directive: ClrPopoverHostDirective }], ngImport: i0, template: `
5863
+ ClrSignpost.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrSignpost, selector: "clr-signpost", inputs: { signpostTriggerAriaLabel: ["clrSignpostTriggerAriaLabel", "signpostTriggerAriaLabel"] }, host: { properties: { "class.signpost": "true" } }, providers: [SignpostFocusManager, SignpostIdService], queries: [{ propertyName: "customTrigger", first: true, predicate: ClrSignpostTrigger, descendants: true }], hostDirectives: [{ directive: ClrPopoverHostDirective }], ngImport: i0, template: `
5862
5864
  <ng-container *ngIf="!useCustomTrigger">
5863
5865
  <button
5864
5866
  type="button"
5865
5867
  class="signpost-action btn btn-sm btn-icon btn-link"
5866
5868
  clrSignpostTrigger
5867
- [attr.aria-label]="commonStrings.keys.signpostToggle"
5869
+ [attr.aria-label]="signpostTriggerAriaLabel || commonStrings.keys.signpostToggle"
5868
5870
  >
5869
5871
  <cds-icon shape="info-circle" [attr.title]="commonStrings.keys.info"></cds-icon>
5870
5872
  </button>
@@ -5882,7 +5884,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
5882
5884
  type="button"
5883
5885
  class="signpost-action btn btn-sm btn-icon btn-link"
5884
5886
  clrSignpostTrigger
5885
- [attr.aria-label]="commonStrings.keys.signpostToggle"
5887
+ [attr.aria-label]="signpostTriggerAriaLabel || commonStrings.keys.signpostToggle"
5886
5888
  >
5887
5889
  <cds-icon shape="info-circle" [attr.title]="commonStrings.keys.info"></cds-icon>
5888
5890
  </button>
@@ -5894,7 +5896,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
5894
5896
  providers: [SignpostFocusManager, SignpostIdService],
5895
5897
  hostDirectives: [ClrPopoverHostDirective],
5896
5898
  }]
5897
- }], ctorParameters: function () { return [{ type: ClrCommonStringsService }]; }, propDecorators: { customTrigger: [{
5899
+ }], ctorParameters: function () { return [{ type: ClrCommonStringsService }]; }, propDecorators: { signpostTriggerAriaLabel: [{
5900
+ type: Input,
5901
+ args: ['clrSignpostTriggerAriaLabel']
5902
+ }], customTrigger: [{
5898
5903
  type: ContentChild,
5899
5904
  args: [ClrSignpostTrigger]
5900
5905
  }] } });
@@ -7529,7 +7534,7 @@ class ClrCheckboxWrapper {
7529
7534
  }
7530
7535
  }
7531
7536
  ClrCheckboxWrapper.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrCheckboxWrapper, deps: [{ token: IS_TOGGLE }], target: i0.ɵɵFactoryTarget.Component });
7532
- ClrCheckboxWrapper.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrCheckboxWrapper, selector: "clr-checkbox-wrapper,clr-toggle-wrapper", host: { properties: { "class.clr-checkbox-wrapper": "!toggle", "class.clr-toggle-wrapper": "toggle" } }, providers: [ControlIdService, IS_TOGGLE_PROVIDER], queries: [{ propertyName: "label", first: true, predicate: ClrLabel, descendants: true, static: true }], ngImport: i0, template: `
7537
+ ClrCheckboxWrapper.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrCheckboxWrapper, selector: "clr-checkbox-wrapper,clr-toggle-wrapper", host: { properties: { "class.clr-checkbox-wrapper": "!toggle", "class.clr-checkbox-wrapper-disabled": "checkbox?.controlDisabled", "class.clr-toggle-wrapper": "toggle" } }, providers: [ControlIdService, IS_TOGGLE_PROVIDER], queries: [{ propertyName: "label", first: true, predicate: ClrLabel, descendants: true, static: true }, { propertyName: "checkbox", first: true, predicate: i0.forwardRef(function () { return ClrCheckbox; }), descendants: true, static: true }], ngImport: i0, template: `
7533
7538
  <ng-content select="[clrCheckbox],[clrToggle]"></ng-content>
7534
7539
  <ng-content select="label"></ng-content>
7535
7540
  <label *ngIf="!label"></label>
@@ -7545,6 +7550,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
7545
7550
  `,
7546
7551
  host: {
7547
7552
  '[class.clr-checkbox-wrapper]': '!toggle',
7553
+ '[class.clr-checkbox-wrapper-disabled]': 'checkbox?.controlDisabled',
7548
7554
  '[class.clr-toggle-wrapper]': 'toggle',
7549
7555
  },
7550
7556
  providers: [ControlIdService, IS_TOGGLE_PROVIDER],
@@ -7557,6 +7563,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
7557
7563
  }, propDecorators: { label: [{
7558
7564
  type: ContentChild,
7559
7565
  args: [ClrLabel, { static: true }]
7566
+ }], checkbox: [{
7567
+ type: ContentChild,
7568
+ args: [forwardRef(() => ClrCheckbox), { static: true }]
7560
7569
  }] } });
7561
7570
 
7562
7571
  /*
@@ -7574,8 +7583,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
7574
7583
  class ClrCheckbox extends WrappedFormControl {
7575
7584
  constructor(vcr, injector, control, renderer, el, toggle) {
7576
7585
  super(vcr, ClrCheckboxWrapper, injector, control, renderer, el);
7586
+ this.control = control;
7577
7587
  this.toggle = toggle;
7578
7588
  }
7589
+ get controlDisabled() {
7590
+ var _a;
7591
+ return (_a = this.control) === null || _a === void 0 ? void 0 : _a.disabled;
7592
+ }
7579
7593
  ngOnInit() {
7580
7594
  super.ngOnInit();
7581
7595
  const toggleService = this.getProviderFromContainer(IS_TOGGLE, null);
@@ -7634,6 +7648,11 @@ class ClrCheckboxContainer extends ClrAbstractContainer {
7634
7648
  this.inline = !!value;
7635
7649
  }
7636
7650
  }
7651
+ get allCheckboxesDisabled() {
7652
+ var _a, _b;
7653
+ return (((_a = this.control) === null || _a === void 0 ? void 0 : _a.disabled) &&
7654
+ (!((_b = this.additionalControls) === null || _b === void 0 ? void 0 : _b.length) || this.additionalControls.every(control => control.disabled)));
7655
+ }
7637
7656
  ngAfterContentInit() {
7638
7657
  this.setAriaRoles();
7639
7658
  }
@@ -7642,7 +7661,7 @@ class ClrCheckboxContainer extends ClrAbstractContainer {
7642
7661
  }
7643
7662
  }
7644
7663
  ClrCheckboxContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrCheckboxContainer, deps: [{ token: LayoutService, optional: true }, { token: ControlClassService }, { token: NgControlService }, { token: IfControlStateService }], target: i0.ɵɵFactoryTarget.Component });
7645
- ClrCheckboxContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrCheckboxContainer, selector: "clr-checkbox-container,clr-toggle-container", inputs: { clrInline: "clrInline" }, host: { properties: { "class.clr-form-control": "true", "class.clr-form-control-disabled": "control?.disabled", "class.clr-row": "addGrid()", "attr.role": "role" } }, providers: [IfControlStateService, NgControlService, ControlClassService, ContainerIdService], queries: [{ propertyName: "checkboxes", predicate: ClrCheckbox, descendants: true }], usesInheritance: true, ngImport: i0, template: `
7664
+ ClrCheckboxContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrCheckboxContainer, selector: "clr-checkbox-container,clr-toggle-container", inputs: { clrInline: "clrInline" }, host: { properties: { "class.clr-form-control": "true", "class.clr-form-control-disabled": "allCheckboxesDisabled", "class.clr-row": "addGrid()", "attr.role": "role" } }, providers: [IfControlStateService, NgControlService, ControlClassService, ContainerIdService], queries: [{ propertyName: "checkboxes", predicate: ClrCheckbox, descendants: true }], usesInheritance: true, ngImport: i0, template: `
7646
7665
  <ng-content select="label"></ng-content>
7647
7666
  <label *ngIf="!label && addGrid()"></label>
7648
7667
  <div class="clr-control-container" [class.clr-control-inline]="clrInline" [ngClass]="controlClass()">
@@ -7704,7 +7723,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
7704
7723
  `,
7705
7724
  host: {
7706
7725
  '[class.clr-form-control]': 'true',
7707
- '[class.clr-form-control-disabled]': 'control?.disabled',
7726
+ '[class.clr-form-control-disabled]': 'allCheckboxesDisabled',
7708
7727
  '[class.clr-row]': 'addGrid()',
7709
7728
  '[attr.role]': 'role',
7710
7729
  },
@@ -13226,7 +13245,7 @@ class ClrDay {
13226
13245
  }
13227
13246
  else if (this._dateNavigationService.selectedDay && !this._dateNavigationService.selectedEndDay) {
13228
13247
  return (((_c = this._dayView.dayModel) === null || _c === void 0 ? void 0 : _c.isAfter(this._dateNavigationService.selectedDay)) &&
13229
- ((_d = this._dayView.dayModel) === null || _d === void 0 ? void 0 : _d.isBefore(this._dateNavigationService.hoveredDay)));
13248
+ ((_d = this._dayView.dayModel) === null || _d === void 0 ? void 0 : _d.isBefore(this._dateNavigationService.hoveredDay, true)));
13230
13249
  }
13231
13250
  else {
13232
13251
  return false;
@@ -14399,6 +14418,9 @@ class ClrYearpicker {
14399
14418
  get calendarYear() {
14400
14419
  return this._dateNavigationService.displayedCalendar.year;
14401
14420
  }
14421
+ isCurrentCalendarYear(year) {
14422
+ return year === new Date().getFullYear();
14423
+ }
14402
14424
  getIsRangeStartYear(year) {
14403
14425
  var _a;
14404
14426
  return this._dateNavigationService.isRangePicker && year === ((_a = this._dateNavigationService.selectedDay) === null || _a === void 0 ? void 0 : _a.year);
@@ -14585,6 +14607,7 @@ ClrYearpicker.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version:
14585
14607
  [class.is-start-range]="getIsRangeStartYear(year)"
14586
14608
  [class.is-end-range]="getIsRangeEndYear(year)"
14587
14609
  [class.in-range]="isInRange(year)"
14610
+ [class.is-today]="isCurrentCalendarYear(year)"
14588
14611
  (click)="changeYear(year)"
14589
14612
  (mouseenter)="onHover(year)"
14590
14613
  >
@@ -14645,6 +14668,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
14645
14668
  [class.is-start-range]="getIsRangeStartYear(year)"
14646
14669
  [class.is-end-range]="getIsRangeEndYear(year)"
14647
14670
  [class.in-range]="isInRange(year)"
14671
+ [class.is-today]="isCurrentCalendarYear(year)"
14648
14672
  (click)="changeYear(year)"
14649
14673
  (mouseenter)="onHover(year)"
14650
14674
  >
@@ -17804,22 +17828,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17804
17828
  * This software is released under MIT license.
17805
17829
  * The full license information can be found in LICENSE in the root directory of this project.
17806
17830
  */
17807
- function getTabableItems(el) {
17808
- const tabableSelector = [
17809
- 'a[href]',
17810
- 'area[href]',
17811
- 'input:not([disabled])',
17812
- 'button:not([disabled])',
17813
- 'select:not([disabled])',
17814
- 'textarea:not([disabled])',
17815
- 'iframe',
17816
- 'object',
17817
- 'embed',
17818
- '*[tabindex]:not([disabled])',
17819
- '*[contenteditable=true]',
17820
- '[role=button]:not([disabled])',
17821
- ].join(',');
17822
- return Array.from(el.querySelectorAll(tabableSelector));
17831
+ const actionableItemSelectors = [
17832
+ 'a[href]',
17833
+ 'area[href]',
17834
+ 'input:not([disabled])',
17835
+ 'button:not([disabled])',
17836
+ 'select:not([disabled])',
17837
+ 'textarea:not([disabled])',
17838
+ 'iframe',
17839
+ 'object',
17840
+ 'embed',
17841
+ '[contenteditable=true]',
17842
+ '[role=button]:not([disabled])',
17843
+ ];
17844
+ function getTabbableItems(el) {
17845
+ const tabbableItemSelectors = [...actionableItemSelectors, '[tabindex="0"]:not([disabled])'];
17846
+ const tabbableSelector = tabbableItemSelectors.join(',');
17847
+ return Array.from(el.querySelectorAll(tabbableSelector));
17848
+ }
17849
+ function isActionableItem(el) {
17850
+ const actionableSelector = actionableItemSelectors.join(',');
17851
+ return el.matches(actionableSelector);
17823
17852
  }
17824
17853
  class KeyNavigationGridController {
17825
17854
  constructor(zone) {
@@ -17829,7 +17858,7 @@ class KeyNavigationGridController {
17829
17858
  this.destroy$ = new Subject();
17830
17859
  this._activeCell = null;
17831
17860
  this.config = {
17832
- keyGridRows: '[role=row]:not(.datagrid-placeholder)',
17861
+ keyGridRows: '[role=row]:not(.datagrid-placeholder):not([style*="display: none"])',
17833
17862
  keyGridCells: '[role=gridcell]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), [role=columnheader]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), .datagrid-detail-caret',
17834
17863
  keyGrid: '[role=grid]',
17835
17864
  };
@@ -17864,7 +17893,7 @@ class KeyNavigationGridController {
17864
17893
  ? Array.from(this.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
17865
17894
  : null;
17866
17895
  if (activeCell) {
17867
- this.setActiveCell(activeCell);
17896
+ this.setActiveCell(activeCell, { keepFocus: isActionableItem(e.target) });
17868
17897
  }
17869
17898
  }
17870
17899
  });
@@ -17897,9 +17926,12 @@ class KeyNavigationGridController {
17897
17926
  e.key === Keys.Home ||
17898
17927
  e.key === Keys.PageUp ||
17899
17928
  e.key === Keys.PageDown) {
17900
- const { x, y } = this.getNextItemCoordinate(e);
17929
+ const currentCellCoords = this.getCurrentCellCoordinates();
17930
+ const nextCellCoords = this.isExpandedRow(currentCellCoords.y) || this.isDetailsRow(currentCellCoords.y)
17931
+ ? this.getNextForExpandedRowCoordinate(e, currentCellCoords)
17932
+ : this.getNextItemCoordinate(e, currentCellCoords);
17901
17933
  const activeItem = this.rows
17902
- ? Array.from(this.rows[y].querySelectorAll(this.config.keyGridCells))[x]
17934
+ ? Array.from(this.getCellsForRow(nextCellCoords.y))[nextCellCoords.x]
17903
17935
  : null;
17904
17936
  if (activeItem) {
17905
17937
  this.setActiveCell(activeItem);
@@ -17927,67 +17959,241 @@ class KeyNavigationGridController {
17927
17959
  getActiveCell() {
17928
17960
  return this._activeCell;
17929
17961
  }
17930
- setActiveCell(activeCell) {
17962
+ setActiveCell(activeCell, { keepFocus } = { keepFocus: false }) {
17931
17963
  const prior = this.cells ? Array.from(this.cells).find(c => c.getAttribute('tabindex') === '0') : null;
17932
17964
  if (prior) {
17933
17965
  prior.setAttribute('tabindex', '-1');
17934
17966
  }
17935
17967
  activeCell.setAttribute('tabindex', '0');
17936
17968
  this._activeCell = activeCell;
17937
- const items = getTabableItems(activeCell);
17938
- const item = activeCell.getAttribute('role') !== 'columnheader' && items[0] ? items[0] : activeCell;
17939
- if (!this.skipItemFocus) {
17940
- item.focus();
17969
+ if (!this.skipItemFocus && !keepFocus) {
17970
+ let elementToFocus;
17971
+ if (activeCell.getAttribute('role') === 'columnheader') {
17972
+ elementToFocus = activeCell;
17973
+ }
17974
+ else {
17975
+ const tabbableElements = getTabbableItems(activeCell);
17976
+ elementToFocus = tabbableElements.length ? tabbableElements[0] : activeCell;
17977
+ }
17978
+ elementToFocus.focus();
17941
17979
  }
17942
17980
  }
17943
- getNextItemCoordinate(e) {
17944
- var _a;
17945
- let currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
17946
- if (e.key === Keys.Tab) {
17947
- currentCell = document.activeElement;
17981
+ getNextForExpandedRowCoordinate(e, currentCellCoords) {
17982
+ if (e.key === Keys.PageUp || e.key === Keys.PageDown) {
17983
+ return this.getNextItemCoordinate(e, currentCellCoords);
17948
17984
  }
17949
- const currentRow = this.rows && currentCell ? Array.from(this.rows).find(r => r.contains(currentCell)) : null;
17950
- const numOfRows = this.rows ? this.rows.length - 1 : 0;
17951
- const numOfColumns = this.cells ? Math.floor(this.cells.length / this.rows.length - 1) : 0;
17952
- let x = currentRow && currentCell
17953
- ? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell)
17954
- : 0;
17955
- let y = currentRow && currentCell && this.rows ? Array.from(this.rows).indexOf(currentRow) : 0;
17956
- const dir = this.host.dir;
17957
- const inlineStart = dir === 'rtl' ? Keys.ArrowRight : Keys.ArrowLeft;
17958
- const inlineEnd = dir === 'rtl' ? Keys.ArrowLeft : Keys.ArrowRight;
17959
- const itemsPerPage = Math.floor(((_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelector('.datagrid').clientHeight) / this.rows[0].clientHeight) - 1 || 0;
17960
- if (e.key === Keys.ArrowUp && y !== 0) {
17961
- y = y - 1;
17985
+ if (!this.isDetailsRow(currentCellCoords.y) &&
17986
+ !this.isRowReplaced(currentCellCoords.y) &&
17987
+ (e.key === Keys.Home || e.key === Keys.End || e.key === Keys.ArrowRight || e.key === Keys.ArrowLeft)) {
17988
+ return this.getNextItemCoordinate(e, currentCellCoords);
17989
+ }
17990
+ const { numOfRows, numOfColumns, inlineStart, inlineEnd, isActionCell, nextCellCoords } = this.getCalcVariables(currentCellCoords);
17991
+ const isSingleCellExpandedRow = this.isSingleCellExpandedRow(currentCellCoords.y);
17992
+ if (e.key === Keys.ArrowUp && currentCellCoords.y !== 0) {
17993
+ nextCellCoords.y = currentCellCoords.y - 1;
17994
+ if (isSingleCellExpandedRow && !isActionCell) {
17995
+ if (this.isRowReplaced(currentCellCoords.y)) {
17996
+ nextCellCoords.y = nextCellCoords.y - 1;
17997
+ }
17998
+ if (this.isDetailsRow(nextCellCoords.y)) {
17999
+ nextCellCoords.x = 0;
18000
+ }
18001
+ else if (this.isDetailsRow(currentCellCoords.y) === false) {
18002
+ // false check is intentional, the ! operator may be missed easily in this case
18003
+ nextCellCoords.x = currentCellCoords.x;
18004
+ }
18005
+ else {
18006
+ nextCellCoords.x = this.actionCellCount(nextCellCoords.y);
18007
+ }
18008
+ return nextCellCoords;
18009
+ }
18010
+ if (isActionCell && this.isDetailsRow(nextCellCoords.y)) {
18011
+ nextCellCoords.y = nextCellCoords.y - 1;
18012
+ }
18013
+ else if (this.isRowReplaced(nextCellCoords.y)) {
18014
+ nextCellCoords.y = nextCellCoords.y - 1;
18015
+ if (!this.isDetailsRow(nextCellCoords.y)) {
18016
+ nextCellCoords.x = currentCellCoords.x + this.actionCellCount(nextCellCoords.y);
18017
+ }
18018
+ }
18019
+ else if (this.isDetailsRow(currentCellCoords.y) && !this.isDetailsRow(nextCellCoords.y)) {
18020
+ nextCellCoords.x = currentCellCoords.x + this.actionCellCount(nextCellCoords.y);
18021
+ }
18022
+ else if (!isActionCell && this.isDetailsRow(nextCellCoords.y)) {
18023
+ nextCellCoords.x = currentCellCoords.x - this.actionCellCount(currentCellCoords.y);
18024
+ }
18025
+ }
18026
+ else if (e.key === Keys.ArrowDown && currentCellCoords.y < numOfRows) {
18027
+ nextCellCoords.y = currentCellCoords.y + 1;
18028
+ if (isSingleCellExpandedRow && !isActionCell) {
18029
+ if (this.isRowReplaced(nextCellCoords.y)) {
18030
+ nextCellCoords.y = nextCellCoords.y + 1;
18031
+ }
18032
+ if (this.isDetailsRow(nextCellCoords.y)) {
18033
+ nextCellCoords.x = 0;
18034
+ }
18035
+ else {
18036
+ nextCellCoords.x = this.actionCellCount(nextCellCoords.y);
18037
+ }
18038
+ return nextCellCoords;
18039
+ }
18040
+ if (isActionCell || this.isRowReplaced(nextCellCoords.y)) {
18041
+ nextCellCoords.y = nextCellCoords.y + 1;
18042
+ }
18043
+ else if (this.getCellsForRow(currentCellCoords.y).length > numOfColumns) {
18044
+ nextCellCoords.x = currentCellCoords.x - this.actionCellCount(currentCellCoords.y);
18045
+ }
18046
+ else {
18047
+ nextCellCoords.x = currentCellCoords.x + this.actionCellCount(nextCellCoords.y);
18048
+ }
18049
+ }
18050
+ else if (e.key === inlineStart) {
18051
+ if (currentCellCoords.x !== 0) {
18052
+ nextCellCoords.x = currentCellCoords.x - 1;
18053
+ }
18054
+ else if (!isActionCell) {
18055
+ nextCellCoords.y = currentCellCoords.y - 1;
18056
+ nextCellCoords.x = this.actionCellCount(nextCellCoords.y) - 1;
18057
+ }
18058
+ }
18059
+ else if (e.key === inlineEnd && currentCellCoords.x < numOfColumns) {
18060
+ if (isActionCell &&
18061
+ currentCellCoords.x === this.actionCellCount(currentCellCoords.x) - 1 &&
18062
+ this.isRowReplaced(currentCellCoords.y) &&
18063
+ !this.isDetailsRow(currentCellCoords.y)) {
18064
+ nextCellCoords.y = currentCellCoords.y + 1;
18065
+ nextCellCoords.x = 0;
18066
+ }
18067
+ else {
18068
+ nextCellCoords.x = currentCellCoords.x + 1;
18069
+ }
18070
+ }
18071
+ else if (e.key === Keys.End) {
18072
+ nextCellCoords.x = this.getCellsForRow(currentCellCoords.y).length - 1;
18073
+ if (e.ctrlKey) {
18074
+ nextCellCoords.x = numOfColumns;
18075
+ nextCellCoords.y = numOfRows;
18076
+ }
18077
+ }
18078
+ else if (e.key === Keys.Home) {
18079
+ nextCellCoords.x = 0;
18080
+ nextCellCoords.y = currentCellCoords.y - 1;
18081
+ if (e.ctrlKey) {
18082
+ nextCellCoords.y = 0;
18083
+ }
18084
+ }
18085
+ return nextCellCoords;
18086
+ }
18087
+ getNextItemCoordinate(e, currentCellCoords) {
18088
+ const { numOfRows, numOfColumns, inlineStart, inlineEnd, itemsPerPage, isActionCell, nextCellCoords } = this.getCalcVariables(currentCellCoords);
18089
+ if (e.key === Keys.ArrowUp && currentCellCoords.y !== 0) {
18090
+ nextCellCoords.y = currentCellCoords.y - 1;
18091
+ if (this.isSingleCellExpandedRow(nextCellCoords.y) && !isActionCell && this.isDetailsRow(nextCellCoords.y)) {
18092
+ nextCellCoords.x = 0;
18093
+ return nextCellCoords;
18094
+ }
18095
+ if (this.isDetailsRow(nextCellCoords.y)) {
18096
+ if (isActionCell) {
18097
+ nextCellCoords.y = nextCellCoords.y - 1;
18098
+ }
18099
+ else {
18100
+ nextCellCoords.x = nextCellCoords.x - this.actionCellCount(currentCellCoords.y);
18101
+ }
18102
+ }
17962
18103
  }
17963
- else if (e.key === Keys.ArrowDown && y < numOfRows) {
17964
- y = y + 1;
18104
+ else if (e.key === Keys.ArrowDown && currentCellCoords.y < numOfRows) {
18105
+ nextCellCoords.y = currentCellCoords.y + 1;
18106
+ if (this.isSingleCellExpandedRow(nextCellCoords.y) && !isActionCell && this.isRowReplaced(nextCellCoords.y)) {
18107
+ nextCellCoords.x = 0;
18108
+ nextCellCoords.y = nextCellCoords.y + 1;
18109
+ return nextCellCoords;
18110
+ }
18111
+ if (!isActionCell && this.isRowReplaced(nextCellCoords.y)) {
18112
+ nextCellCoords.y = nextCellCoords.y + 1;
18113
+ nextCellCoords.x = nextCellCoords.x - this.actionCellCount(currentCellCoords.y);
18114
+ }
17965
18115
  }
17966
- else if (e.key === inlineStart && x !== 0) {
17967
- x = x - 1;
18116
+ else if (e.key === inlineStart && currentCellCoords.x !== 0) {
18117
+ nextCellCoords.x = currentCellCoords.x - 1;
17968
18118
  }
17969
- else if (e.key === inlineEnd && x < numOfColumns) {
17970
- x = x + 1;
18119
+ else if (e.key === inlineEnd && currentCellCoords.x < numOfColumns) {
18120
+ nextCellCoords.x = currentCellCoords.x + 1;
17971
18121
  }
17972
18122
  else if (e.key === Keys.End) {
17973
- x = numOfColumns;
18123
+ nextCellCoords.x = numOfColumns;
17974
18124
  if (e.ctrlKey) {
17975
- y = numOfRows;
18125
+ nextCellCoords.y = numOfRows;
17976
18126
  }
17977
18127
  }
17978
18128
  else if (e.key === Keys.Home) {
17979
- x = 0;
18129
+ nextCellCoords.x = 0;
17980
18130
  if (e.ctrlKey) {
17981
- y = 0;
18131
+ nextCellCoords.y = 0;
17982
18132
  }
17983
18133
  }
17984
18134
  else if (e.key === Keys.PageUp) {
17985
- y = y - itemsPerPage > 0 ? y - itemsPerPage + 1 : 1;
18135
+ nextCellCoords.y = currentCellCoords.y - itemsPerPage > 0 ? currentCellCoords.y - itemsPerPage + 1 : 1;
17986
18136
  }
17987
18137
  else if (e.key === Keys.PageDown) {
17988
- y = y + itemsPerPage < numOfRows ? y + itemsPerPage : numOfRows;
18138
+ nextCellCoords.y =
18139
+ currentCellCoords.y + itemsPerPage < numOfRows ? currentCellCoords.y + itemsPerPage : numOfRows;
17989
18140
  }
17990
- return { x, y };
18141
+ return nextCellCoords;
18142
+ }
18143
+ getCalcVariables(currentCellCoords) {
18144
+ var _a;
18145
+ const numOfRows = this.rows ? this.rows.length - 1 : 0;
18146
+ // calculate numOfColumns based on header cells.
18147
+ const numOfColumns = numOfRows ? this.getCellsForRow(0).length - 1 : 0;
18148
+ const dir = this.host.dir;
18149
+ const inlineStart = dir === 'rtl' ? Keys.ArrowRight : Keys.ArrowLeft;
18150
+ const inlineEnd = dir === 'rtl' ? Keys.ArrowLeft : Keys.ArrowRight;
18151
+ const itemsPerPage = Math.floor(((_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelector('.datagrid').clientHeight) / this.rows[0].clientHeight) - 1 || 0;
18152
+ const isActionCell = this.isActionCell(currentCellCoords);
18153
+ const nextCellCoords = {
18154
+ x: currentCellCoords.x,
18155
+ y: currentCellCoords.y,
18156
+ };
18157
+ return { numOfRows, numOfColumns, inlineStart, inlineEnd, itemsPerPage, isActionCell, nextCellCoords };
18158
+ }
18159
+ getCurrentCellCoordinates() {
18160
+ const currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
18161
+ const currentRow = currentCell ? currentCell.closest(this.config.keyGridRows) : null;
18162
+ const coordinates = {
18163
+ x: currentRow && currentCell
18164
+ ? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell)
18165
+ : 0,
18166
+ y: currentRow && currentCell && this.rows ? Array.from(this.rows).indexOf(currentRow) : 0,
18167
+ };
18168
+ return coordinates;
18169
+ }
18170
+ getCellsForRow(index) {
18171
+ return this.rows[index].querySelectorAll(this.config.keyGridCells);
18172
+ }
18173
+ isExpandedRow(index) {
18174
+ const selectedElement = this.rows[index].querySelector('.datagrid-row-detail');
18175
+ return selectedElement ? selectedElement.style.display !== 'none' : false;
18176
+ }
18177
+ isDetailsRow(index) {
18178
+ return this.rows[index].classList.contains('datagrid-row-detail');
18179
+ }
18180
+ isRowReplaced(index) {
18181
+ return !!this.rows[index].closest('clr-dg-row.datagrid-row-replaced');
18182
+ }
18183
+ isSingleCellExpandedRow(index) {
18184
+ const row = this.rows[index].classList.contains('datagrid-row-detail')
18185
+ ? this.rows[index]
18186
+ : this.rows[index].querySelector('.datagrid-row-detail');
18187
+ return (row === null || row === void 0 ? void 0 : row.querySelectorAll(this.config.keyGridCells).length) === 1;
18188
+ }
18189
+ actionCellCount(index) {
18190
+ return this.actionCellsAsArray(index).length;
18191
+ }
18192
+ actionCellsAsArray(index) {
18193
+ return Array.from(this.rows[index].querySelectorAll('.datagrid-row-sticky .datagrid-cell, .datagrid-row-sticky .datagrid-column'));
18194
+ }
18195
+ isActionCell(cellCoords) {
18196
+ return !!this.actionCellsAsArray(cellCoords.y)[cellCoords.x];
17991
18197
  }
17992
18198
  }
17993
18199
  KeyNavigationGridController.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
@@ -19726,17 +19932,17 @@ class ClrDatagridColumn extends DatagridFilterRegistrar {
19726
19932
  return;
19727
19933
  }
19728
19934
  switch (value) {
19729
- // the Unsorted case happens when the current state is either Asc or Desc
19730
- default:
19731
- case ClrDatagridSortOrder.UNSORTED:
19732
- this._sort.clear();
19733
- break;
19734
19935
  case ClrDatagridSortOrder.ASC:
19735
19936
  this.sort(false);
19736
19937
  break;
19737
19938
  case ClrDatagridSortOrder.DESC:
19738
19939
  this.sort(true);
19739
19940
  break;
19941
+ // the Unsorted case happens when the current state is neither Asc or Desc
19942
+ case ClrDatagridSortOrder.UNSORTED:
19943
+ default:
19944
+ this._sort.clear();
19945
+ break;
19740
19946
  }
19741
19947
  }
19742
19948
  set updateFilterValue(newValue) {
@@ -19776,13 +19982,13 @@ class ClrDatagridColumn extends DatagridFilterRegistrar {
19776
19982
  }
19777
19983
  get ariaSort() {
19778
19984
  switch (this._sortOrder) {
19779
- default:
19780
- case ClrDatagridSortOrder.UNSORTED:
19781
- return 'none';
19782
19985
  case ClrDatagridSortOrder.ASC:
19783
19986
  return 'ascending';
19784
19987
  case ClrDatagridSortOrder.DESC:
19785
19988
  return 'descending';
19989
+ case ClrDatagridSortOrder.UNSORTED:
19990
+ default:
19991
+ return 'none';
19786
19992
  }
19787
19993
  }
19788
19994
  get sortDirection() {
@@ -21138,7 +21344,7 @@ ClrDatagridRow.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version
21138
21344
  DatagridIfExpandService,
21139
21345
  { provide: IfExpandService, useExisting: DatagridIfExpandService },
21140
21346
  { provide: LoadingListener, useExisting: DatagridIfExpandService },
21141
- ], 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 <div class=\"clr-checkbox-wrapper\">\n <input\n tabindex=\"-1\"\n type=\"checkbox\"\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 </div>\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: ["id", "for"] }, { 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" }] });
21347
+ ], 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 <div class=\"clr-checkbox-wrapper\">\n <input\n tabindex=\"-1\"\n type=\"checkbox\"\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 </div>\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]=\"expand.hasExpandTemplate && !expand.expanded ? null : 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: ["id", "for"] }, { 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" }] });
21142
21348
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridRow, decorators: [{
21143
21349
  type: Component,
21144
21350
  args: [{ selector: 'clr-dg-row', host: {
@@ -21150,7 +21356,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21150
21356
  DatagridIfExpandService,
21151
21357
  { provide: IfExpandService, useExisting: DatagridIfExpandService },
21152
21358
  { provide: LoadingListener, useExisting: DatagridIfExpandService },
21153
- ], 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 <div class=\"clr-checkbox-wrapper\">\n <input\n tabindex=\"-1\"\n type=\"checkbox\"\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 </div>\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" }]
21359
+ ], 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 <div class=\"clr-checkbox-wrapper\">\n <input\n tabindex=\"-1\"\n type=\"checkbox\"\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 </div>\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]=\"expand.hasExpandTemplate && !expand.expanded ? null : 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" }]
21154
21360
  }], ctorParameters: function () {
21155
21361
  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: [{
21156
21362
  type: Inject,
@@ -21287,110 +21493,404 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21287
21493
  * This software is released under MIT license.
21288
21494
  * The full license information can be found in LICENSE in the root directory of this project.
21289
21495
  */
21290
- /**
21291
- * This provider aggregates state changes from the various providers of the Datagrid
21292
- */
21293
- class StateProvider {
21294
- constructor(filters, sort, page, debouncer) {
21295
- this.filters = filters;
21296
- this.sort = sort;
21297
- this.page = page;
21298
- this.debouncer = debouncer;
21299
- /**
21300
- * The Observable that lets other classes subscribe to global state changes
21301
- */
21302
- this.change = this.debouncer.change.pipe(map(() => this.state));
21303
- }
21304
- /*
21305
- * By making this a getter, we open the possibility for a setter in the future.
21306
- * It's been requested a couple times.
21307
- */
21308
- get state() {
21309
- const state = {};
21310
- if (this.page.size > 0) {
21311
- state.page = {
21312
- from: this.page.firstItem,
21313
- to: this.page.lastItem,
21314
- size: this.page.size,
21315
- current: this.page.current,
21316
- };
21317
- }
21318
- if (this.sort.comparator) {
21319
- if (this.sort.comparator instanceof DatagridPropertyComparator) {
21320
- /*
21321
- * Special case for the default object property comparator,
21322
- * we give the property name instead of the actual comparator.
21323
- */
21324
- state.sort = { by: this.sort.comparator.prop, reverse: this.sort.reverse };
21325
- }
21326
- else {
21327
- state.sort = { by: this.sort.comparator, reverse: this.sort.reverse };
21328
- }
21329
- }
21330
- const activeFilters = this.filters.getActiveFilters();
21331
- if (activeFilters.length > 0) {
21332
- state.filters = [];
21333
- for (const filter of activeFilters) {
21334
- if (filter.state) {
21335
- state.filters.push(filter.state);
21336
- }
21337
- else {
21338
- state.filters.push(filter);
21496
+ const defaultCdkFixedSizeVirtualScrollInputs = {
21497
+ itemSize: 32,
21498
+ minBufferPx: 200,
21499
+ maxBufferPx: 400,
21500
+ };
21501
+ class ClrDatagridVirtualScrollDirective {
21502
+ constructor(changeDetectorRef, iterableDiffers, items, ngZone, renderer2, templateRef, viewContainerRef, directionality, scrollDispatcher, viewportRuler, datagrid, columnsService, injector) {
21503
+ this.changeDetectorRef = changeDetectorRef;
21504
+ this.iterableDiffers = iterableDiffers;
21505
+ this.items = items;
21506
+ this.ngZone = ngZone;
21507
+ this.renderer2 = renderer2;
21508
+ this.templateRef = templateRef;
21509
+ this.viewContainerRef = viewContainerRef;
21510
+ this.directionality = directionality;
21511
+ this.scrollDispatcher = scrollDispatcher;
21512
+ this.viewportRuler = viewportRuler;
21513
+ this.datagrid = datagrid;
21514
+ this.columnsService = columnsService;
21515
+ this.injector = injector;
21516
+ this.renderedRangeChange = new EventEmitter();
21517
+ this._cdkFixedSizeVirtualScrollInputs = Object.assign({}, defaultCdkFixedSizeVirtualScrollInputs);
21518
+ this.subscriptions = [];
21519
+ this.topIndex = 0;
21520
+ this.mutationChanges = new MutationObserver((mutations) => {
21521
+ mutations.forEach((mutation) => {
21522
+ // it is possible this to be called twice because the old class is removed and the new added
21523
+ if (mutation.target.classList.contains('datagrid-compact') && this.itemSize > 24) {
21524
+ this.itemSize = 24;
21339
21525
  }
21340
- }
21341
- }
21342
- return state;
21526
+ });
21527
+ });
21528
+ this.viewRepeater = new _RecycleViewRepeaterStrategy();
21529
+ this.cdkVirtualForInputs = {
21530
+ cdkVirtualForTrackBy: index => index,
21531
+ };
21532
+ items.smartenUp();
21533
+ datagrid.detailService.preventFocusScroll = true;
21534
+ this.datagridElementRef = datagrid.el;
21535
+ // default
21536
+ this.cdkVirtualForTemplateCacheSize = 20;
21537
+ this.mutationChanges.observe(this.datagridElementRef.nativeElement, {
21538
+ attributeFilter: ['class'],
21539
+ attributeOldValue: true,
21540
+ });
21541
+ this.virtualScrollStrategy = new FixedSizeVirtualScrollStrategy(this._cdkFixedSizeVirtualScrollInputs.itemSize, this._cdkFixedSizeVirtualScrollInputs.minBufferPx, this._cdkFixedSizeVirtualScrollInputs.maxBufferPx);
21343
21542
  }
21344
- }
21345
- StateProvider.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: StateProvider, deps: [{ token: FiltersProvider }, { token: Sort }, { token: Page }, { token: StateDebouncer }], target: i0.ɵɵFactoryTarget.Injectable });
21346
- StateProvider.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: StateProvider });
21347
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: StateProvider, decorators: [{
21348
- type: Injectable
21349
- }], ctorParameters: function () { return [{ type: FiltersProvider }, { type: Sort }, { type: Page }, { type: StateDebouncer }]; } });
21350
-
21351
- /*
21352
- * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
21353
- * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
21354
- * This software is released under MIT license.
21355
- * The full license information can be found in LICENSE in the root directory of this project.
21356
- */
21357
- class DatagridCellRenderer {
21358
- constructor(el, renderer, organizer) {
21359
- this.el = el;
21360
- this.renderer = renderer;
21361
- this.subscriptions = [];
21362
- this.subscriptions.push(organizer.filterRenderSteps(DatagridRenderStep.CLEAR_WIDTHS).subscribe(() => this.clearWidth()));
21543
+ get cdkVirtualForOf() {
21544
+ return this.cdkVirtualForInputs.cdkVirtualForOf;
21363
21545
  }
21364
- ngOnDestroy() {
21365
- this.subscriptions.forEach(sub => sub.unsubscribe());
21366
- if (this.stateSubscription) {
21367
- this.stateSubscription.unsubscribe();
21368
- }
21546
+ set cdkVirtualForOf(value) {
21547
+ this.cdkVirtualForInputs.cdkVirtualForOf = value;
21548
+ this.items.all = value;
21549
+ this.updateCdkVirtualForInputs();
21369
21550
  }
21370
- resetState(state) {
21371
- this.setWidth(state);
21372
- this.setHidden(state);
21551
+ get cdkVirtualForTrackBy() {
21552
+ return this.cdkVirtualForInputs.cdkVirtualForTrackBy;
21373
21553
  }
21374
- setWidth(state) {
21375
- if (state.strictWidth) {
21376
- this.renderer.addClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
21377
- }
21378
- else {
21379
- this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
21380
- }
21381
- this.renderer.setStyle(this.el.nativeElement, 'width', state.width + 'px');
21554
+ set cdkVirtualForTrackBy(value) {
21555
+ this.cdkVirtualForInputs.cdkVirtualForTrackBy = value;
21556
+ this.updateCdkVirtualForInputs();
21382
21557
  }
21383
- setHidden(state) {
21384
- if (state.hidden) {
21385
- this.renderer.addClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
21386
- }
21387
- else {
21388
- this.renderer.removeClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
21389
- }
21558
+ get cdkVirtualForTemplate() {
21559
+ var _a;
21560
+ return (_a = this === null || this === void 0 ? void 0 : this.cdkVirtualForInputs) === null || _a === void 0 ? void 0 : _a.cdkVirtualForTemplate;
21390
21561
  }
21391
- clearWidth() {
21392
- this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
21393
- this.renderer.setStyle(this.el.nativeElement, 'width', null);
21562
+ set cdkVirtualForTemplate(value) {
21563
+ this.cdkVirtualForInputs.cdkVirtualForTemplate = value;
21564
+ this.updateCdkVirtualForInputs();
21565
+ }
21566
+ get cdkVirtualForTemplateCacheSize() {
21567
+ return this.cdkVirtualForInputs.cdkVirtualForTemplateCacheSize;
21568
+ }
21569
+ set cdkVirtualForTemplateCacheSize(value) {
21570
+ this.cdkVirtualForInputs.cdkVirtualForTemplateCacheSize = coerceNumberProperty(value);
21571
+ this.updateCdkVirtualForInputs();
21572
+ }
21573
+ get itemSize() {
21574
+ return this._cdkFixedSizeVirtualScrollInputs.itemSize;
21575
+ }
21576
+ set itemSize(value) {
21577
+ this._cdkFixedSizeVirtualScrollInputs.itemSize = coerceNumberProperty(value);
21578
+ this.updateFixedSizeVirtualScrollInputs();
21579
+ }
21580
+ get minBufferPx() {
21581
+ return this._cdkFixedSizeVirtualScrollInputs.minBufferPx;
21582
+ }
21583
+ set minBufferPx(value) {
21584
+ this._cdkFixedSizeVirtualScrollInputs.minBufferPx = coerceNumberProperty(value);
21585
+ this.updateFixedSizeVirtualScrollInputs();
21586
+ }
21587
+ get maxBufferPx() {
21588
+ return this._cdkFixedSizeVirtualScrollInputs.maxBufferPx;
21589
+ }
21590
+ set maxBufferPx(value) {
21591
+ this._cdkFixedSizeVirtualScrollInputs.maxBufferPx = coerceNumberProperty(value);
21592
+ this.updateFixedSizeVirtualScrollInputs();
21593
+ }
21594
+ ngAfterViewInit() {
21595
+ this.injector.runInContext(() => {
21596
+ this.virtualScrollViewport = this.createVirtualScrollViewportForDatagrid(this.changeDetectorRef, this.ngZone, this.renderer2, this.directionality, this.scrollDispatcher, this.viewportRuler, this.datagridElementRef, this.virtualScrollStrategy);
21597
+ this.cdkVirtualFor = createCdkVirtualForOfDirective(this.viewContainerRef, this.templateRef, this.iterableDiffers, this.viewRepeater, this.virtualScrollViewport, this.ngZone);
21598
+ this.virtualScrollViewport.ngOnInit();
21599
+ });
21600
+ this.gridRoleElement = this.datagridElementRef.nativeElement.querySelector('[role="grid"]');
21601
+ this.updateCdkVirtualForInputs();
21602
+ this.subscriptions.push(this.items.change.subscribe(newItems => {
21603
+ this.cdkVirtualFor.cdkVirtualForOf = newItems;
21604
+ }), this.cdkVirtualFor.dataStream.subscribe(data => {
21605
+ this.updateAriaRowCount(data.length);
21606
+ }), this.virtualScrollViewport.scrolledIndexChange.subscribe(index => {
21607
+ this.topIndex = index;
21608
+ }), this.virtualScrollViewport.renderedRangeStream.subscribe(renderedRange => {
21609
+ this.renderedRangeChange.emit(renderedRange);
21610
+ }), this.datagrid.refresh.subscribe(datagridState => {
21611
+ if (datagridState.filters) {
21612
+ this.scrollToIndex(0);
21613
+ }
21614
+ }), this.columnsService.columnsStateChange.subscribe(() => {
21615
+ this.viewRepeater.detach();
21616
+ }));
21617
+ }
21618
+ ngDoCheck() {
21619
+ var _a;
21620
+ (_a = this.cdkVirtualFor) === null || _a === void 0 ? void 0 : _a.ngDoCheck();
21621
+ this.updateAriaRowIndexes();
21622
+ }
21623
+ ngOnDestroy() {
21624
+ var _a, _b, _c;
21625
+ (_a = this.cdkVirtualFor) === null || _a === void 0 ? void 0 : _a.ngOnDestroy();
21626
+ (_b = this.virtualScrollViewport) === null || _b === void 0 ? void 0 : _b.ngOnDestroy();
21627
+ (_c = this.mutationChanges) === null || _c === void 0 ? void 0 : _c.disconnect();
21628
+ this.subscriptions.forEach(subscription => {
21629
+ subscription.unsubscribe();
21630
+ });
21631
+ }
21632
+ scrollUp(offset, behavior = 'auto') {
21633
+ this.scrollToIndex(this.topIndex - offset, behavior);
21634
+ }
21635
+ scrollDown(offset, behavior = 'auto') {
21636
+ this.scrollToIndex(this.topIndex + offset, behavior);
21637
+ }
21638
+ scrollToIndex(index, behavior = 'auto') {
21639
+ var _a;
21640
+ (_a = this.virtualScrollViewport) === null || _a === void 0 ? void 0 : _a.scrollToIndex(index, behavior);
21641
+ }
21642
+ updateCdkVirtualForInputs() {
21643
+ if (this.cdkVirtualFor) {
21644
+ for (const cdkVirtualForInputKey of Object.keys(this.cdkVirtualForInputs)) {
21645
+ if (this.cdkVirtualFor[cdkVirtualForInputKey] !== this.cdkVirtualForInputs[cdkVirtualForInputKey]) {
21646
+ this.cdkVirtualFor[cdkVirtualForInputKey] = this.cdkVirtualForInputs[cdkVirtualForInputKey];
21647
+ }
21648
+ }
21649
+ }
21650
+ }
21651
+ updateFixedSizeVirtualScrollInputs() {
21652
+ if (this.virtualScrollStrategy) {
21653
+ this.virtualScrollStrategy.updateItemAndBufferSize(this._cdkFixedSizeVirtualScrollInputs.itemSize, this._cdkFixedSizeVirtualScrollInputs.minBufferPx, this._cdkFixedSizeVirtualScrollInputs.maxBufferPx);
21654
+ }
21655
+ }
21656
+ updateAriaRowCount(rowCount) {
21657
+ var _a;
21658
+ (_a = this.gridRoleElement) === null || _a === void 0 ? void 0 : _a.setAttribute('aria-rowcount', rowCount.toString());
21659
+ }
21660
+ updateAriaRowIndexes() {
21661
+ for (let i = 0; i < this.viewContainerRef.length; i++) {
21662
+ const viewRef = this.viewContainerRef.get(i);
21663
+ const rootElements = viewRef.rootNodes;
21664
+ const datagridRowElement = rootElements.find(rowElement => rowElement.tagName === 'CLR-DG-ROW');
21665
+ const rowRoleElement = datagridRowElement === null || datagridRowElement === void 0 ? void 0 : datagridRowElement.querySelector('[role="row"]');
21666
+ // aria-rowindex should start with one, not zero, so we have to add one to the zero-based index
21667
+ rowRoleElement === null || rowRoleElement === void 0 ? void 0 : rowRoleElement.setAttribute('aria-rowindex', (viewRef.context.index + 1).toString());
21668
+ }
21669
+ }
21670
+ createVirtualScrollViewportForDatagrid(changeDetectorRef, ngZone, renderer2, directionality, scrollDispatcher, viewportRuler, datagridElementRef, virtualScrollStrategy) {
21671
+ const datagridDivElement = datagridElementRef.nativeElement.querySelector('.datagrid');
21672
+ const datagridTableElement = datagridElementRef.nativeElement.querySelector('.datagrid-table');
21673
+ const datagridRowsElement = datagridElementRef.nativeElement.querySelector('.datagrid-rows');
21674
+ const datagridDivElementRef = { nativeElement: datagridDivElement };
21675
+ let topOffset = 0;
21676
+ let totalContentSize = 0;
21677
+ function updateDatagridElementStyles() {
21678
+ datagridRowsElement.style.transform = `translateY(${topOffset}px)`;
21679
+ datagridRowsElement.style.height = `${totalContentSize - topOffset}px`;
21680
+ }
21681
+ const virtualScrollViewport = createCdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, renderer2, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, null);
21682
+ virtualScrollViewport._contentWrapper = {
21683
+ nativeElement: {
21684
+ style: {
21685
+ set transform(value) {
21686
+ var _a;
21687
+ topOffset = value === undefined ? 0 : +((_a = /translateY\(([0-9]+)px\)/.exec(value)) === null || _a === void 0 ? void 0 : _a[1]);
21688
+ updateDatagridElementStyles();
21689
+ },
21690
+ },
21691
+ },
21692
+ };
21693
+ virtualScrollViewport.setTotalContentSize = (value) => {
21694
+ totalContentSize = value;
21695
+ datagridTableElement.style.height = `${totalContentSize}px`;
21696
+ updateDatagridElementStyles();
21697
+ };
21698
+ return virtualScrollViewport;
21699
+ }
21700
+ }
21701
+ 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.Renderer2 }, { token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: i1$3.Directionality }, { token: i3$1.ScrollDispatcher }, { token: i3$1.ViewportRuler }, { token: ClrDatagrid }, { token: ColumnsService }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Directive });
21702
+ ClrDatagridVirtualScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridVirtualScrollDirective, selector: "[clrVirtualScroll],[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 });
21703
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, decorators: [{
21704
+ type: Directive,
21705
+ args: [{
21706
+ selector: '[clrVirtualScroll],[ClrVirtualScroll]',
21707
+ providers: [Items],
21708
+ }]
21709
+ }], ctorParameters: function () {
21710
+ return [{ type: i0.ChangeDetectorRef }, { type: i0.IterableDiffers }, { type: Items, decorators: [{
21711
+ type: SkipSelf
21712
+ }] }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: i1$3.Directionality }, { type: i3$1.ScrollDispatcher }, { type: i3$1.ViewportRuler }, { type: ClrDatagrid }, { type: ColumnsService }, { type: i0.EnvironmentInjector }];
21713
+ }, propDecorators: { renderedRangeChange: [{
21714
+ type: Output
21715
+ }], cdkVirtualForOf: [{
21716
+ type: Input,
21717
+ args: ['clrVirtualRowsOf']
21718
+ }], cdkVirtualForTrackBy: [{
21719
+ type: Input,
21720
+ args: ['clrVirtualRowsTrackBy']
21721
+ }], cdkVirtualForTemplate: [{
21722
+ type: Input,
21723
+ args: ['clrVirtualRowsTemplate']
21724
+ }], cdkVirtualForTemplateCacheSize: [{
21725
+ type: Input,
21726
+ args: ['clrVirtualRowsTemplateCacheSize']
21727
+ }], itemSize: [{
21728
+ type: Input,
21729
+ args: ['clrVirtualRowsItemSize']
21730
+ }], minBufferPx: [{
21731
+ type: Input,
21732
+ args: ['clrVirtualRowsMinBufferPx']
21733
+ }], maxBufferPx: [{
21734
+ type: Input,
21735
+ args: ['clrVirtualRowsMaxBufferPx']
21736
+ }] } });
21737
+ function createCdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, renderer2, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, scrollable) {
21738
+ if (+VERSION.major < 19) {
21739
+ return new CdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, scrollable);
21740
+ }
21741
+ else {
21742
+ const virtualScrollViewportInjector = Injector.create({
21743
+ parent: inject(EnvironmentInjector),
21744
+ providers: [
21745
+ { provide: ElementRef, useValue: datagridDivElementRef },
21746
+ { provide: ChangeDetectorRef, useValue: changeDetectorRef },
21747
+ { provide: NgZone, useValue: ngZone },
21748
+ { provide: Renderer2, useValue: renderer2 },
21749
+ { provide: VIRTUAL_SCROLL_STRATEGY, useValue: virtualScrollStrategy },
21750
+ { provide: Directionality, useValue: directionality },
21751
+ { provide: ScrollDispatcher, useValue: scrollDispatcher },
21752
+ { provide: ViewportRuler, useValue: viewportRuler },
21753
+ { provide: CdkVirtualScrollable, useValue: scrollable },
21754
+ { provide: CdkVirtualScrollViewport, useClass: CdkVirtualScrollViewport },
21755
+ ],
21756
+ });
21757
+ return virtualScrollViewportInjector.get(CdkVirtualScrollViewport);
21758
+ }
21759
+ }
21760
+ function createCdkVirtualForOfDirective(viewContainerRef, templateRef, iterableDiffers, viewRepeater, virtualScrollViewport, ngZone) {
21761
+ if (+VERSION.major < 19) {
21762
+ return new CdkVirtualForOf(viewContainerRef, templateRef, iterableDiffers, viewRepeater, virtualScrollViewport, ngZone);
21763
+ }
21764
+ else {
21765
+ const virtualScrollViewportInjector = Injector.create({
21766
+ parent: inject(EnvironmentInjector),
21767
+ providers: [{ provide: CdkVirtualScrollViewport, useValue: virtualScrollViewport }],
21768
+ });
21769
+ const cdkVirtualForInjector = Injector.create({
21770
+ parent: virtualScrollViewportInjector,
21771
+ providers: [
21772
+ { provide: ViewContainerRef, useValue: viewContainerRef },
21773
+ { provide: TemplateRef, useValue: templateRef },
21774
+ { provide: IterableDiffers, useValue: iterableDiffers },
21775
+ { provide: _VIEW_REPEATER_STRATEGY, useValue: viewRepeater },
21776
+ { provide: NgZone, useValue: ngZone },
21777
+ { provide: CdkVirtualForOf, useClass: CdkVirtualForOf },
21778
+ ],
21779
+ });
21780
+ return cdkVirtualForInjector.get(CdkVirtualForOf);
21781
+ }
21782
+ }
21783
+
21784
+ /*
21785
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
21786
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
21787
+ * This software is released under MIT license.
21788
+ * The full license information can be found in LICENSE in the root directory of this project.
21789
+ */
21790
+ /**
21791
+ * This provider aggregates state changes from the various providers of the Datagrid
21792
+ */
21793
+ class StateProvider {
21794
+ constructor(filters, sort, page, debouncer) {
21795
+ this.filters = filters;
21796
+ this.sort = sort;
21797
+ this.page = page;
21798
+ this.debouncer = debouncer;
21799
+ /**
21800
+ * The Observable that lets other classes subscribe to global state changes
21801
+ */
21802
+ this.change = this.debouncer.change.pipe(map(() => this.state));
21803
+ }
21804
+ /*
21805
+ * By making this a getter, we open the possibility for a setter in the future.
21806
+ * It's been requested a couple times.
21807
+ */
21808
+ get state() {
21809
+ const state = {};
21810
+ if (this.page.size > 0) {
21811
+ state.page = {
21812
+ from: this.page.firstItem,
21813
+ to: this.page.lastItem,
21814
+ size: this.page.size,
21815
+ current: this.page.current,
21816
+ };
21817
+ }
21818
+ if (this.sort.comparator) {
21819
+ if (this.sort.comparator instanceof DatagridPropertyComparator) {
21820
+ /*
21821
+ * Special case for the default object property comparator,
21822
+ * we give the property name instead of the actual comparator.
21823
+ */
21824
+ state.sort = { by: this.sort.comparator.prop, reverse: this.sort.reverse };
21825
+ }
21826
+ else {
21827
+ state.sort = { by: this.sort.comparator, reverse: this.sort.reverse };
21828
+ }
21829
+ }
21830
+ const activeFilters = this.filters.getActiveFilters();
21831
+ if (activeFilters.length > 0) {
21832
+ state.filters = [];
21833
+ for (const filter of activeFilters) {
21834
+ if (filter.state) {
21835
+ state.filters.push(filter.state);
21836
+ }
21837
+ else {
21838
+ state.filters.push(filter);
21839
+ }
21840
+ }
21841
+ }
21842
+ return state;
21843
+ }
21844
+ }
21845
+ StateProvider.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: StateProvider, deps: [{ token: FiltersProvider }, { token: Sort }, { token: Page }, { token: StateDebouncer }], target: i0.ɵɵFactoryTarget.Injectable });
21846
+ StateProvider.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: StateProvider });
21847
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: StateProvider, decorators: [{
21848
+ type: Injectable
21849
+ }], ctorParameters: function () { return [{ type: FiltersProvider }, { type: Sort }, { type: Page }, { type: StateDebouncer }]; } });
21850
+
21851
+ /*
21852
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
21853
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
21854
+ * This software is released under MIT license.
21855
+ * The full license information can be found in LICENSE in the root directory of this project.
21856
+ */
21857
+ class DatagridCellRenderer {
21858
+ constructor(el, renderer, organizer) {
21859
+ this.el = el;
21860
+ this.renderer = renderer;
21861
+ this.subscriptions = [];
21862
+ this.subscriptions.push(organizer.filterRenderSteps(DatagridRenderStep.CLEAR_WIDTHS).subscribe(() => this.clearWidth()));
21863
+ }
21864
+ ngOnDestroy() {
21865
+ this.subscriptions.forEach(sub => sub.unsubscribe());
21866
+ if (this.stateSubscription) {
21867
+ this.stateSubscription.unsubscribe();
21868
+ }
21869
+ }
21870
+ resetState(state) {
21871
+ this.setWidth(state);
21872
+ this.setHidden(state);
21873
+ }
21874
+ setWidth(state) {
21875
+ if (state.strictWidth) {
21876
+ this.renderer.addClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
21877
+ }
21878
+ else {
21879
+ this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
21880
+ }
21881
+ this.renderer.setStyle(this.el.nativeElement, 'width', state.width + 'px');
21882
+ }
21883
+ setHidden(state) {
21884
+ if (state.hidden) {
21885
+ this.renderer.addClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
21886
+ }
21887
+ else {
21888
+ this.renderer.removeClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
21889
+ }
21890
+ }
21891
+ clearWidth() {
21892
+ this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
21893
+ this.renderer.setStyle(this.el.nativeElement, 'width', null);
21394
21894
  }
21395
21895
  }
21396
21896
  DatagridCellRenderer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridCellRenderer, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: DatagridRenderOrganizer }], target: i0.ɵɵFactoryTarget.Directive });
@@ -21596,7 +22096,7 @@ class ClrDatagrid {
21596
22096
  });
21597
22097
  this.updateDetailState();
21598
22098
  // retain active cell when navigating with Up/Down Arrows, PageUp and PageDown buttons in virtual scroller
21599
- if (this.hasVirtualScroller) {
22099
+ if (this.virtualScroll) {
21600
22100
  const active = this.keyNavigation.getActiveCell();
21601
22101
  if (active) {
21602
22102
  this.zone.runOutsideAngular(() => {
@@ -21687,7 +22187,7 @@ class ClrDatagrid {
21687
22187
  }
21688
22188
  toggleAllSelected($event) {
21689
22189
  $event.preventDefault();
21690
- if (this.hasVirtualScroller) {
22190
+ if (this.virtualScroll) {
21691
22191
  return;
21692
22192
  }
21693
22193
  this.allSelected = !this.allSelected;
@@ -21710,7 +22210,7 @@ class ClrDatagrid {
21710
22210
  this.detailService.open(row.item, row.detailButton.nativeElement);
21711
22211
  // always keep open when virtual scroll is available otherwise close it
21712
22212
  }
21713
- else if (!this.hasVirtualScroller) {
22213
+ else if (!this.virtualScroll) {
21714
22214
  // Using setTimeout to make sure the inner cycles in rows are done
21715
22215
  setTimeout(() => {
21716
22216
  this.detailService.close();
@@ -21742,7 +22242,7 @@ ClrDatagrid.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
21742
22242
  ColumnsService,
21743
22243
  DisplayModeService,
21744
22244
  KeyNavigationGridController,
21745
- ], 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-2025 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: ["id", "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" }] });
22245
+ ], queries: [{ propertyName: "virtualScroll", first: true, predicate: ClrDatagridVirtualScrollDirective, descendants: true }, { 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-2025 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=\"!virtualScroll\" 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: ["id", "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" }] });
21746
22246
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagrid, decorators: [{
21747
22247
  type: Component,
21748
22248
  args: [{ selector: 'clr-datagrid', providers: [
@@ -21764,7 +22264,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21764
22264
  ], host: {
21765
22265
  '[class.datagrid-host]': 'true',
21766
22266
  '[class.datagrid-detail-open]': 'detailService.isOpen',
21767
- }, template: "<!--\n ~ Copyright (c) 2016-2025 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" }]
22267
+ }, template: "<!--\n ~ Copyright (c) 2016-2025 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=\"!virtualScroll\" 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" }]
21768
22268
  }], ctorParameters: function () {
21769
22269
  return [{ type: DatagridRenderOrganizer }, { type: Items }, { type: ExpandableRowsCount }, { type: Selection }, { type: RowActionService }, { type: StateProvider }, { type: DisplayModeService }, { type: i0.Renderer2 }, { type: DetailService }, { type: undefined, decorators: [{
21770
22270
  type: Inject,
@@ -21790,6 +22290,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21790
22290
  }], refresh: [{
21791
22291
  type: Output,
21792
22292
  args: ['clrDgRefresh']
22293
+ }], virtualScroll: [{
22294
+ type: ContentChild,
22295
+ args: [ClrDatagridVirtualScrollDirective]
21793
22296
  }], iterator: [{
21794
22297
  type: ContentChild,
21795
22298
  args: [ClrDatagridItems]
@@ -23199,357 +23702,94 @@ class ClrDatagridRowDetail {
23199
23702
  this.selection = selection;
23200
23703
  this.rowActionService = rowActionService;
23201
23704
  this.expand = expand;
23202
- this.expandableRows = expandableRows;
23203
- this.commonStrings = commonStrings;
23204
- this.replacedRow = false;
23205
- /* reference to the enum so that template can access it */
23206
- this.SELECTION_TYPE = SelectionType;
23207
- this.subscriptions = [];
23208
- }
23209
- set replace(value) {
23210
- this.expand.setReplace(!!value);
23211
- }
23212
- get beginningOfExpandableContentAriaText() {
23213
- return (this._beginningOfExpandableContentAriaText ||
23214
- `${this.commonStrings.keys.datagridExpandableBeginningOf} ${this.commonStrings.keys.datagridExpandableRowContent}`);
23215
- }
23216
- get endOfExpandableContentAriaText() {
23217
- return (this._endOfExpandableContentAriaText ||
23218
- `${this.commonStrings.keys.datagridExpandableEndOf} ${this.commonStrings.keys.datagridExpandableRowContent}`);
23219
- }
23220
- ngAfterContentInit() {
23221
- this.subscriptions.push(this.expand.replace.subscribe(replaceChange => {
23222
- this.replacedRow = replaceChange;
23223
- }));
23224
- }
23225
- ngOnDestroy() {
23226
- this.subscriptions.forEach(sub => sub.unsubscribe());
23227
- }
23228
- }
23229
- ClrDatagridRowDetail.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridRowDetail, deps: [{ token: Selection }, { token: RowActionService }, { token: DatagridIfExpandService }, { token: ExpandableRowsCount }, { token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Component });
23230
- ClrDatagridRowDetail.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridRowDetail, selector: "clr-dg-row-detail", inputs: { _beginningOfExpandableContentAriaText: ["clrRowDetailBeginningAriaText", "_beginningOfExpandableContentAriaText"], _endOfExpandableContentAriaText: ["clrRowDetailEndAriaText", "_endOfExpandableContentAriaText"], replace: ["clrDgReplace", "replace"] }, host: { attributes: { "role": "gridcell" }, properties: { "class.datagrid-row-flex": "true", "class.datagrid-row-detail": "true", "class.datagrid-container": "cells.length === 0", "attr.id": "expand.expandableId" } }, queries: [{ propertyName: "cells", predicate: ClrDatagridCell }], ngImport: i0, template: `
23231
- <div class="clr-sr-only">
23232
- {{ beginningOfExpandableContentAriaText }}
23233
- {{ commonStrings.keys.datagridExpandableRowsHelperText }}
23234
- </div>
23235
- <ng-content></ng-content>
23236
- <div class="clr-sr-only">{{ endOfExpandableContentAriaText }}</div>
23237
- `, isInline: true });
23238
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridRowDetail, decorators: [{
23239
- type: Component,
23240
- args: [{
23241
- selector: 'clr-dg-row-detail',
23242
- template: `
23243
- <div class="clr-sr-only">
23244
- {{ beginningOfExpandableContentAriaText }}
23245
- {{ commonStrings.keys.datagridExpandableRowsHelperText }}
23246
- </div>
23247
- <ng-content></ng-content>
23248
- <div class="clr-sr-only">{{ endOfExpandableContentAriaText }}</div>
23249
- `,
23250
- host: {
23251
- '[class.datagrid-row-flex]': 'true',
23252
- '[class.datagrid-row-detail]': 'true',
23253
- '[class.datagrid-container]': 'cells.length === 0',
23254
- '[attr.id]': 'expand.expandableId',
23255
- role: 'gridcell',
23256
- },
23257
- }]
23258
- }], ctorParameters: function () { return [{ type: Selection }, { type: RowActionService }, { type: DatagridIfExpandService }, { type: ExpandableRowsCount }, { type: ClrCommonStringsService }]; }, propDecorators: { _beginningOfExpandableContentAriaText: [{
23259
- type: Input,
23260
- args: ['clrRowDetailBeginningAriaText']
23261
- }], _endOfExpandableContentAriaText: [{
23262
- type: Input,
23263
- args: ['clrRowDetailEndAriaText']
23264
- }], cells: [{
23265
- type: ContentChildren,
23266
- args: [ClrDatagridCell]
23267
- }], replace: [{
23268
- type: Input,
23269
- args: ['clrDgReplace']
23270
- }] } });
23271
-
23272
- /*
23273
- * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
23274
- * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
23275
- * This software is released under MIT license.
23276
- * The full license information can be found in LICENSE in the root directory of this project.
23277
- */
23278
- const defaultCdkFixedSizeVirtualScrollInputs = {
23279
- itemSize: 32,
23280
- minBufferPx: 200,
23281
- maxBufferPx: 400,
23282
- };
23283
- class ClrDatagridVirtualScrollDirective {
23284
- constructor(changeDetectorRef, iterableDiffers, items, ngZone, renderer2, templateRef, viewContainerRef, directionality, scrollDispatcher, viewportRuler, datagrid, columnsService, injector) {
23285
- this.changeDetectorRef = changeDetectorRef;
23286
- this.iterableDiffers = iterableDiffers;
23287
- this.items = items;
23288
- this.ngZone = ngZone;
23289
- this.renderer2 = renderer2;
23290
- this.templateRef = templateRef;
23291
- this.viewContainerRef = viewContainerRef;
23292
- this.directionality = directionality;
23293
- this.scrollDispatcher = scrollDispatcher;
23294
- this.viewportRuler = viewportRuler;
23295
- this.datagrid = datagrid;
23296
- this.columnsService = columnsService;
23297
- this.injector = injector;
23298
- this.renderedRangeChange = new EventEmitter();
23299
- this._cdkFixedSizeVirtualScrollInputs = Object.assign({}, defaultCdkFixedSizeVirtualScrollInputs);
23300
- this.subscriptions = [];
23301
- this.mutationChanges = new MutationObserver((mutations) => {
23302
- mutations.forEach((mutation) => {
23303
- // it is possible this to be called twice because the old class is removed and the new added
23304
- if (mutation.target.classList.contains('datagrid-compact') && this.itemSize > 24) {
23305
- this.itemSize = 24;
23306
- }
23307
- });
23308
- });
23309
- this.viewRepeater = new _RecycleViewRepeaterStrategy();
23310
- this.cdkVirtualForInputs = {
23311
- cdkVirtualForTrackBy: index => index,
23312
- };
23313
- items.smartenUp();
23314
- datagrid.hasVirtualScroller = true;
23315
- datagrid.detailService.preventFocusScroll = true;
23316
- this.datagridElementRef = datagrid.el;
23317
- // default
23318
- this.cdkVirtualForTemplateCacheSize = 20;
23319
- this.mutationChanges.observe(this.datagridElementRef.nativeElement, {
23320
- attributeFilter: ['class'],
23321
- attributeOldValue: true,
23322
- });
23323
- this.virtualScrollStrategy = new FixedSizeVirtualScrollStrategy(this._cdkFixedSizeVirtualScrollInputs.itemSize, this._cdkFixedSizeVirtualScrollInputs.minBufferPx, this._cdkFixedSizeVirtualScrollInputs.maxBufferPx);
23324
- }
23325
- get cdkVirtualForOf() {
23326
- return this.cdkVirtualForInputs.cdkVirtualForOf;
23327
- }
23328
- set cdkVirtualForOf(value) {
23329
- this.cdkVirtualForInputs.cdkVirtualForOf = value;
23330
- this.items.all = value;
23331
- this.updateCdkVirtualForInputs();
23332
- }
23333
- get cdkVirtualForTrackBy() {
23334
- return this.cdkVirtualForInputs.cdkVirtualForTrackBy;
23335
- }
23336
- set cdkVirtualForTrackBy(value) {
23337
- this.cdkVirtualForInputs.cdkVirtualForTrackBy = value;
23338
- this.updateCdkVirtualForInputs();
23339
- }
23340
- get cdkVirtualForTemplate() {
23341
- var _a;
23342
- return (_a = this === null || this === void 0 ? void 0 : this.cdkVirtualForInputs) === null || _a === void 0 ? void 0 : _a.cdkVirtualForTemplate;
23343
- }
23344
- set cdkVirtualForTemplate(value) {
23345
- this.cdkVirtualForInputs.cdkVirtualForTemplate = value;
23346
- this.updateCdkVirtualForInputs();
23347
- }
23348
- get cdkVirtualForTemplateCacheSize() {
23349
- return this.cdkVirtualForInputs.cdkVirtualForTemplateCacheSize;
23350
- }
23351
- set cdkVirtualForTemplateCacheSize(value) {
23352
- this.cdkVirtualForInputs.cdkVirtualForTemplateCacheSize = coerceNumberProperty(value);
23353
- this.updateCdkVirtualForInputs();
23354
- }
23355
- get itemSize() {
23356
- return this._cdkFixedSizeVirtualScrollInputs.itemSize;
23357
- }
23358
- set itemSize(value) {
23359
- this._cdkFixedSizeVirtualScrollInputs.itemSize = coerceNumberProperty(value);
23360
- this.updateFixedSizeVirtualScrollInputs();
23361
- }
23362
- get minBufferPx() {
23363
- return this._cdkFixedSizeVirtualScrollInputs.minBufferPx;
23705
+ this.expandableRows = expandableRows;
23706
+ this.commonStrings = commonStrings;
23707
+ this.replacedRow = false;
23708
+ /* reference to the enum so that template can access it */
23709
+ this.SELECTION_TYPE = SelectionType;
23710
+ this.subscriptions = [];
23364
23711
  }
23365
- set minBufferPx(value) {
23366
- this._cdkFixedSizeVirtualScrollInputs.minBufferPx = coerceNumberProperty(value);
23367
- this.updateFixedSizeVirtualScrollInputs();
23712
+ set replace(value) {
23713
+ this.expand.setReplace(!!value);
23368
23714
  }
23369
- get maxBufferPx() {
23370
- return this._cdkFixedSizeVirtualScrollInputs.maxBufferPx;
23715
+ get beginningOfExpandableContentAriaText() {
23716
+ return (this._beginningOfExpandableContentAriaText ||
23717
+ `${this.commonStrings.keys.datagridExpandableBeginningOf} ${this.commonStrings.keys.datagridExpandableRowContent}`);
23371
23718
  }
23372
- set maxBufferPx(value) {
23373
- this._cdkFixedSizeVirtualScrollInputs.maxBufferPx = coerceNumberProperty(value);
23374
- this.updateFixedSizeVirtualScrollInputs();
23719
+ get endOfExpandableContentAriaText() {
23720
+ return (this._endOfExpandableContentAriaText ||
23721
+ `${this.commonStrings.keys.datagridExpandableEndOf} ${this.commonStrings.keys.datagridExpandableRowContent}`);
23375
23722
  }
23376
- ngAfterViewInit() {
23377
- this.injector.runInContext(() => {
23378
- this.virtualScrollViewport = this.createVirtualScrollViewportForDatagrid(this.changeDetectorRef, this.ngZone, this.renderer2, this.directionality, this.scrollDispatcher, this.viewportRuler, this.datagridElementRef, this.virtualScrollStrategy);
23379
- this.cdkVirtualFor = createCdkVirtualForOfDirective(this.viewContainerRef, this.templateRef, this.iterableDiffers, this.viewRepeater, this.virtualScrollViewport, this.ngZone);
23380
- this.virtualScrollViewport.ngOnInit();
23381
- });
23382
- this.gridRoleElement = this.datagridElementRef.nativeElement.querySelector('[role="grid"]');
23383
- this.updateCdkVirtualForInputs();
23384
- this.subscriptions.push(this.items.change.subscribe(newItems => {
23385
- this.cdkVirtualFor.cdkVirtualForOf = newItems;
23386
- }), this.cdkVirtualFor.dataStream.subscribe(data => {
23387
- this.updateAriaRowCount(data.length);
23388
- }), this.virtualScrollViewport.renderedRangeStream.subscribe(renderedRange => {
23389
- this.renderedRangeChange.emit(renderedRange);
23390
- }), this.datagrid.refresh.subscribe(datagridState => {
23391
- if (datagridState.filters) {
23392
- this.virtualScrollViewport.scrollToIndex(0);
23393
- }
23394
- }), this.columnsService.columnsStateChange.subscribe(() => {
23395
- this.viewRepeater.detach();
23723
+ ngAfterContentInit() {
23724
+ this.subscriptions.push(this.expand.replace.subscribe(replaceChange => {
23725
+ this.replacedRow = replaceChange;
23396
23726
  }));
23397
23727
  }
23398
- ngDoCheck() {
23399
- var _a;
23400
- (_a = this.cdkVirtualFor) === null || _a === void 0 ? void 0 : _a.ngDoCheck();
23401
- this.updateAriaRowIndexes();
23402
- }
23403
23728
  ngOnDestroy() {
23404
- var _a, _b, _c;
23405
- (_a = this.cdkVirtualFor) === null || _a === void 0 ? void 0 : _a.ngOnDestroy();
23406
- (_b = this.virtualScrollViewport) === null || _b === void 0 ? void 0 : _b.ngOnDestroy();
23407
- (_c = this.mutationChanges) === null || _c === void 0 ? void 0 : _c.disconnect();
23408
- this.subscriptions.forEach(subscription => {
23409
- subscription.unsubscribe();
23410
- });
23411
- }
23412
- updateCdkVirtualForInputs() {
23413
- if (this.cdkVirtualFor) {
23414
- for (const cdkVirtualForInputKey of Object.keys(this.cdkVirtualForInputs)) {
23415
- if (this.cdkVirtualFor[cdkVirtualForInputKey] !== this.cdkVirtualForInputs[cdkVirtualForInputKey]) {
23416
- this.cdkVirtualFor[cdkVirtualForInputKey] = this.cdkVirtualForInputs[cdkVirtualForInputKey];
23417
- }
23418
- }
23419
- }
23420
- }
23421
- updateFixedSizeVirtualScrollInputs() {
23422
- if (this.virtualScrollStrategy) {
23423
- this.virtualScrollStrategy.updateItemAndBufferSize(this._cdkFixedSizeVirtualScrollInputs.itemSize, this._cdkFixedSizeVirtualScrollInputs.minBufferPx, this._cdkFixedSizeVirtualScrollInputs.maxBufferPx);
23424
- }
23425
- }
23426
- updateAriaRowCount(rowCount) {
23427
- var _a;
23428
- (_a = this.gridRoleElement) === null || _a === void 0 ? void 0 : _a.setAttribute('aria-rowcount', rowCount.toString());
23429
- }
23430
- updateAriaRowIndexes() {
23431
- for (let i = 0; i < this.viewContainerRef.length; i++) {
23432
- const viewRef = this.viewContainerRef.get(i);
23433
- const rootElements = viewRef.rootNodes;
23434
- const datagridRowElement = rootElements.find(rowElement => rowElement.tagName === 'CLR-DG-ROW');
23435
- const rowRoleElement = datagridRowElement === null || datagridRowElement === void 0 ? void 0 : datagridRowElement.querySelector('[role="row"]');
23436
- // aria-rowindex should start with one, not zero, so we have to add one to the zero-based index
23437
- rowRoleElement === null || rowRoleElement === void 0 ? void 0 : rowRoleElement.setAttribute('aria-rowindex', (viewRef.context.index + 1).toString());
23438
- }
23439
- }
23440
- createVirtualScrollViewportForDatagrid(changeDetectorRef, ngZone, renderer2, directionality, scrollDispatcher, viewportRuler, datagridElementRef, virtualScrollStrategy) {
23441
- const datagridDivElement = datagridElementRef.nativeElement.querySelector('.datagrid');
23442
- const datagridTableElement = datagridElementRef.nativeElement.querySelector('.datagrid-table');
23443
- const datagridRowsElement = datagridElementRef.nativeElement.querySelector('.datagrid-rows');
23444
- const datagridDivElementRef = { nativeElement: datagridDivElement };
23445
- let topOffset = 0;
23446
- let totalContentSize = 0;
23447
- function updateDatagridElementStyles() {
23448
- datagridRowsElement.style.transform = `translateY(${topOffset}px)`;
23449
- datagridRowsElement.style.height = `${totalContentSize - topOffset}px`;
23450
- }
23451
- const virtualScrollViewport = createCdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, renderer2, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, null);
23452
- virtualScrollViewport._contentWrapper = {
23453
- nativeElement: {
23454
- style: {
23455
- set transform(value) {
23456
- var _a;
23457
- topOffset = value === undefined ? 0 : +((_a = /translateY\(([0-9]+)px\)/.exec(value)) === null || _a === void 0 ? void 0 : _a[1]);
23458
- updateDatagridElementStyles();
23459
- },
23460
- },
23461
- },
23462
- };
23463
- virtualScrollViewport.setTotalContentSize = (value) => {
23464
- totalContentSize = value;
23465
- datagridTableElement.style.height = `${totalContentSize}px`;
23466
- updateDatagridElementStyles();
23467
- };
23468
- return virtualScrollViewport;
23729
+ this.subscriptions.forEach(sub => sub.unsubscribe());
23469
23730
  }
23470
23731
  }
23471
- 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.Renderer2 }, { token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: i1$3.Directionality }, { token: i3$1.ScrollDispatcher }, { token: i3$1.ViewportRuler }, { token: ClrDatagrid }, { token: ColumnsService }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Directive });
23472
- ClrDatagridVirtualScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridVirtualScrollDirective, selector: "[clrVirtualScroll],[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 });
23473
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, decorators: [{
23474
- type: Directive,
23732
+ ClrDatagridRowDetail.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridRowDetail, deps: [{ token: Selection }, { token: RowActionService }, { token: DatagridIfExpandService }, { token: ExpandableRowsCount }, { token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Component });
23733
+ ClrDatagridRowDetail.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridRowDetail, selector: "clr-dg-row-detail", inputs: { _beginningOfExpandableContentAriaText: ["clrRowDetailBeginningAriaText", "_beginningOfExpandableContentAriaText"], _endOfExpandableContentAriaText: ["clrRowDetailEndAriaText", "_endOfExpandableContentAriaText"], replace: ["clrDgReplace", "replace"] }, host: { attributes: { "role": "row" }, properties: { "class.datagrid-row-flex": "true", "class.datagrid-row-detail": "true", "attr.id": "expand.expandableId" } }, queries: [{ propertyName: "cells", predicate: ClrDatagridCell }], ngImport: i0, template: `
23734
+ <div class="clr-sr-only">
23735
+ {{ beginningOfExpandableContentAriaText }}
23736
+ {{ commonStrings.keys.datagridExpandableRowsHelperText }}
23737
+ </div>
23738
+ <ng-container *ngIf="this.cells?.length > 0" [ngTemplateOutlet]="noCells"></ng-container>
23739
+
23740
+ <ng-container *ngIf="this.cells?.length === 0">
23741
+ <clr-dg-cell class="datagrid-container">
23742
+ <ng-container [ngTemplateOutlet]="noCells"></ng-container>
23743
+ </clr-dg-cell>
23744
+ </ng-container>
23745
+
23746
+ <ng-template #noCells>
23747
+ <ng-content></ng-content>
23748
+ </ng-template>
23749
+ <div class="clr-sr-only">{{ endOfExpandableContentAriaText }}</div>
23750
+ `, isInline: true, 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: ClrDatagridCell, selector: "clr-dg-cell" }, { kind: "directive", type: DatagridCellRenderer, selector: "clr-dg-cell" }] });
23751
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridRowDetail, decorators: [{
23752
+ type: Component,
23475
23753
  args: [{
23476
- selector: '[clrVirtualScroll],[ClrVirtualScroll]',
23477
- providers: [Items],
23754
+ selector: 'clr-dg-row-detail',
23755
+ template: `
23756
+ <div class="clr-sr-only">
23757
+ {{ beginningOfExpandableContentAriaText }}
23758
+ {{ commonStrings.keys.datagridExpandableRowsHelperText }}
23759
+ </div>
23760
+ <ng-container *ngIf="this.cells?.length > 0" [ngTemplateOutlet]="noCells"></ng-container>
23761
+
23762
+ <ng-container *ngIf="this.cells?.length === 0">
23763
+ <clr-dg-cell class="datagrid-container">
23764
+ <ng-container [ngTemplateOutlet]="noCells"></ng-container>
23765
+ </clr-dg-cell>
23766
+ </ng-container>
23767
+
23768
+ <ng-template #noCells>
23769
+ <ng-content></ng-content>
23770
+ </ng-template>
23771
+ <div class="clr-sr-only">{{ endOfExpandableContentAriaText }}</div>
23772
+ `,
23773
+ host: {
23774
+ '[class.datagrid-row-flex]': 'true',
23775
+ '[class.datagrid-row-detail]': 'true',
23776
+ '[attr.id]': 'expand.expandableId',
23777
+ role: 'row',
23778
+ },
23478
23779
  }]
23479
- }], ctorParameters: function () {
23480
- return [{ type: i0.ChangeDetectorRef }, { type: i0.IterableDiffers }, { type: Items, decorators: [{
23481
- type: SkipSelf
23482
- }] }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: i1$3.Directionality }, { type: i3$1.ScrollDispatcher }, { type: i3$1.ViewportRuler }, { type: ClrDatagrid }, { type: ColumnsService }, { type: i0.EnvironmentInjector }];
23483
- }, propDecorators: { renderedRangeChange: [{
23484
- type: Output
23485
- }], cdkVirtualForOf: [{
23486
- type: Input,
23487
- args: ['clrVirtualRowsOf']
23488
- }], cdkVirtualForTrackBy: [{
23489
- type: Input,
23490
- args: ['clrVirtualRowsTrackBy']
23491
- }], cdkVirtualForTemplate: [{
23492
- type: Input,
23493
- args: ['clrVirtualRowsTemplate']
23494
- }], cdkVirtualForTemplateCacheSize: [{
23495
- type: Input,
23496
- args: ['clrVirtualRowsTemplateCacheSize']
23497
- }], itemSize: [{
23780
+ }], ctorParameters: function () { return [{ type: Selection }, { type: RowActionService }, { type: DatagridIfExpandService }, { type: ExpandableRowsCount }, { type: ClrCommonStringsService }]; }, propDecorators: { _beginningOfExpandableContentAriaText: [{
23498
23781
  type: Input,
23499
- args: ['clrVirtualRowsItemSize']
23500
- }], minBufferPx: [{
23782
+ args: ['clrRowDetailBeginningAriaText']
23783
+ }], _endOfExpandableContentAriaText: [{
23501
23784
  type: Input,
23502
- args: ['clrVirtualRowsMinBufferPx']
23503
- }], maxBufferPx: [{
23785
+ args: ['clrRowDetailEndAriaText']
23786
+ }], cells: [{
23787
+ type: ContentChildren,
23788
+ args: [ClrDatagridCell]
23789
+ }], replace: [{
23504
23790
  type: Input,
23505
- args: ['clrVirtualRowsMaxBufferPx']
23791
+ args: ['clrDgReplace']
23506
23792
  }] } });
23507
- function createCdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, renderer2, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, scrollable) {
23508
- if (+VERSION.major < 19) {
23509
- return new CdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, scrollable);
23510
- }
23511
- else {
23512
- const virtualScrollViewportInjector = Injector.create({
23513
- parent: inject(EnvironmentInjector),
23514
- providers: [
23515
- { provide: ElementRef, useValue: datagridDivElementRef },
23516
- { provide: ChangeDetectorRef, useValue: changeDetectorRef },
23517
- { provide: NgZone, useValue: ngZone },
23518
- { provide: Renderer2, useValue: renderer2 },
23519
- { provide: VIRTUAL_SCROLL_STRATEGY, useValue: virtualScrollStrategy },
23520
- { provide: Directionality, useValue: directionality },
23521
- { provide: ScrollDispatcher, useValue: scrollDispatcher },
23522
- { provide: ViewportRuler, useValue: viewportRuler },
23523
- { provide: CdkVirtualScrollable, useValue: scrollable },
23524
- { provide: CdkVirtualScrollViewport, useClass: CdkVirtualScrollViewport },
23525
- ],
23526
- });
23527
- return virtualScrollViewportInjector.get(CdkVirtualScrollViewport);
23528
- }
23529
- }
23530
- function createCdkVirtualForOfDirective(viewContainerRef, templateRef, iterableDiffers, viewRepeater, virtualScrollViewport, ngZone) {
23531
- if (+VERSION.major < 19) {
23532
- return new CdkVirtualForOf(viewContainerRef, templateRef, iterableDiffers, viewRepeater, virtualScrollViewport, ngZone);
23533
- }
23534
- else {
23535
- const virtualScrollViewportInjector = Injector.create({
23536
- parent: inject(EnvironmentInjector),
23537
- providers: [{ provide: CdkVirtualScrollViewport, useValue: virtualScrollViewport }],
23538
- });
23539
- const cdkVirtualForInjector = Injector.create({
23540
- parent: virtualScrollViewportInjector,
23541
- providers: [
23542
- { provide: ViewContainerRef, useValue: viewContainerRef },
23543
- { provide: TemplateRef, useValue: templateRef },
23544
- { provide: IterableDiffers, useValue: iterableDiffers },
23545
- { provide: _VIEW_REPEATER_STRATEGY, useValue: viewRepeater },
23546
- { provide: NgZone, useValue: ngZone },
23547
- { provide: CdkVirtualForOf, useClass: CdkVirtualForOf },
23548
- ],
23549
- });
23550
- return cdkVirtualForInjector.get(CdkVirtualForOf);
23551
- }
23552
- }
23553
23793
 
23554
23794
  /*
23555
23795
  * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
@@ -25458,7 +25698,7 @@ class ClrTreeNode {
25458
25698
  }
25459
25699
  }
25460
25700
  ClrTreeNode.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrTreeNode, deps: [{ token: PLATFORM_ID }, { token: ClrTreeNode, optional: true, skipSelf: true }, { token: TreeFeaturesService }, { token: IfExpandService }, { token: ClrCommonStringsService }, { token: TreeFocusManagerService }, { token: i0.ElementRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
25461
- ClrTreeNode.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrTreeNode, selector: "clr-tree-node", inputs: { expandable: ["clrExpandable", "expandable"], disabled: ["clrDisabled", "disabled"], selected: ["clrSelected", "selected"], expanded: ["clrExpanded", "expanded"], clrForTypeAhead: "clrForTypeAhead" }, outputs: { selectedChange: "clrSelectedChange", expandedChange: "clrExpandedChange" }, host: { properties: { "class.clr-tree-node": "true", "class.disabled": "this._model.disabled" } }, providers: [TREE_FEATURES_PROVIDER, IfExpandService, { provide: LoadingListener, useExisting: IfExpandService }], queries: [{ propertyName: "treeNodeLinkList", predicate: ClrTreeNodeLink }], viewQueries: [{ propertyName: "contentContainer", first: true, predicate: ["contentContainer"], descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2025 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\n #contentContainer\n role=\"treeitem\"\n class=\"clr-tree-node-content-container\"\n tabindex=\"-1\"\n [class.clr-form-control-disabled]=\"disabled\"\n [attr.aria-disabled]=\"disabled\"\n [attr.aria-expanded]=\"isExpandable() ? expanded : null\"\n [attr.aria-selected]=\"ariaSelected\"\n (keydown)=\"onKeyDown($event)\"\n (focus)=\"broadcastFocusOnContainer()\"\n>\n <button\n *ngIf=\"isExpandable() && !isModelLoading && !expandService.loading\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"clr-treenode-caret\"\n (click)=\"expandService.toggle();\"\n (focus)=\"focusTreeNode()\"\n [disabled]=\"disabled\"\n >\n <cds-icon\n class=\"clr-treenode-caret-icon\"\n shape=\"angle\"\n [attr.direction]=\"expandService.expanded ? 'down' : 'right'\"\n ></cds-icon>\n </button>\n <div class=\"clr-treenode-spinner-container\" *ngIf=\"expandService.loading || isModelLoading\">\n <span class=\"clr-treenode-spinner spinner\"></span>\n </div>\n <div class=\"clr-checkbox-wrapper clr-treenode-checkbox\" *ngIf=\"featuresService.selectable\">\n <input\n aria-hidden=\"true\"\n type=\"checkbox\"\n id=\"{{nodeId}}-check\"\n class=\"clr-checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"_model.selected.value === STATES.SELECTED\"\n [indeterminate]=\"_model.selected.value === STATES.INDETERMINATE\"\n (change)=\"_model.toggleSelection(featuresService.eager)\"\n (focus)=\"focusTreeNode()\"\n tabindex=\"-1\"\n />\n <label for=\"{{nodeId}}-check\" class=\"clr-control-label\">\n <ng-container [ngTemplateOutlet]=\"treenodeContent\"></ng-container>\n </label>\n </div>\n <div\n class=\"clr-treenode-content\"\n [class.clr-treenode-text-only]=\"treeNodeContentTextOnly\"\n (mouseup)=\"focusTreeNode()\"\n *ngIf=\"!featuresService.selectable\"\n >\n <ng-container [ngTemplateOutlet]=\"treenodeContent\"></ng-container>\n </div>\n\n <ng-template #treenodeContent>\n <ng-content></ng-content>\n <div class=\"clr-sr-only\" *ngIf=\"featuresService.selectable || ariaSelected\">\n <span> {{ariaSelected ? commonStrings.keys.selectedTreeNode : commonStrings.keys.unselectedTreeNode}}</span>\n </div>\n </ng-template>\n</div>\n<div\n class=\"clr-treenode-children\"\n [@toggleChildrenAnim]=\"expandService.expanded ? 'expanded' : 'collapsed'\"\n [attr.role]=\"isExpandable() && !featuresService.recursion ? 'group' : null\"\n>\n <ng-content select=\"clr-tree-node\"></ng-content>\n <ng-content select=\"[clrIfExpanded]\"></ng-content>\n <clr-recursive-children [parent]=\"_model\"></clr-recursive-children>\n</div>\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: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "component", type: RecursiveChildren, selector: "clr-recursive-children", inputs: ["parent", "children"] }], animations: [
25701
+ ClrTreeNode.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrTreeNode, selector: "clr-tree-node", inputs: { expandable: ["clrExpandable", "expandable"], disabled: ["clrDisabled", "disabled"], selected: ["clrSelected", "selected"], expanded: ["clrExpanded", "expanded"], clrForTypeAhead: "clrForTypeAhead" }, outputs: { selectedChange: "clrSelectedChange", expandedChange: "clrExpandedChange" }, host: { properties: { "class.clr-tree-node": "true", "class.disabled": "this._model.disabled" } }, providers: [TREE_FEATURES_PROVIDER, IfExpandService, { provide: LoadingListener, useExisting: IfExpandService }], queries: [{ propertyName: "treeNodeLinkList", predicate: ClrTreeNodeLink }], viewQueries: [{ propertyName: "contentContainer", first: true, predicate: ["contentContainer"], descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2025 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\n #contentContainer\n role=\"treeitem\"\n class=\"clr-tree-node-content-container\"\n tabindex=\"-1\"\n [class.clr-form-control-disabled]=\"disabled\"\n [attr.aria-disabled]=\"disabled\"\n [attr.aria-expanded]=\"isExpandable() ? expanded : null\"\n [attr.aria-selected]=\"ariaSelected\"\n (keydown)=\"onKeyDown($event)\"\n (focus)=\"broadcastFocusOnContainer()\"\n>\n <button\n *ngIf=\"isExpandable() && !isModelLoading && !expandService.loading\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"clr-treenode-caret\"\n (click)=\"expandService.toggle();\"\n (focus)=\"focusTreeNode()\"\n [disabled]=\"disabled\"\n >\n <cds-icon\n class=\"clr-treenode-caret-icon\"\n shape=\"angle\"\n [attr.direction]=\"expandService.expanded ? 'down' : 'right'\"\n ></cds-icon>\n </button>\n <div class=\"clr-treenode-spinner-container\" *ngIf=\"expandService.loading || isModelLoading\">\n <span class=\"clr-treenode-spinner spinner\"></span>\n </div>\n <div class=\"clr-checkbox-wrapper clr-treenode-checkbox\" *ngIf=\"featuresService.selectable\">\n <input\n aria-hidden=\"true\"\n type=\"checkbox\"\n [id]=\"nodeId + '-check'\"\n class=\"clr-checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"_model.selected.value === STATES.SELECTED\"\n [indeterminate]=\"_model.selected.value === STATES.INDETERMINATE\"\n (change)=\"_model.toggleSelection(featuresService.eager)\"\n (focus)=\"focusTreeNode()\"\n tabindex=\"-1\"\n />\n <label [for]=\"nodeId + '-check'\" class=\"clr-control-label\">\n <ng-container [ngTemplateOutlet]=\"treenodeContent\"></ng-container>\n </label>\n </div>\n <div\n class=\"clr-treenode-content\"\n [class.clr-treenode-text-only]=\"treeNodeContentTextOnly\"\n (mouseup)=\"focusTreeNode()\"\n *ngIf=\"!featuresService.selectable\"\n >\n <ng-container [ngTemplateOutlet]=\"treenodeContent\"></ng-container>\n </div>\n\n <ng-template #treenodeContent>\n <ng-content></ng-content>\n <div class=\"clr-sr-only\" *ngIf=\"featuresService.selectable || ariaSelected\">\n <span> {{ariaSelected ? commonStrings.keys.selectedTreeNode : commonStrings.keys.unselectedTreeNode}}</span>\n </div>\n </ng-template>\n</div>\n<div\n class=\"clr-treenode-children\"\n [@toggleChildrenAnim]=\"expandService.expanded ? 'expanded' : 'collapsed'\"\n [attr.role]=\"isExpandable() && !featuresService.recursion ? 'group' : null\"\n>\n <ng-content select=\"clr-tree-node\"></ng-content>\n <ng-content select=\"[clrIfExpanded]\"></ng-content>\n <clr-recursive-children [parent]=\"_model\"></clr-recursive-children>\n</div>\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: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "component", type: RecursiveChildren, selector: "clr-recursive-children", inputs: ["parent", "children"] }], animations: [
25462
25702
  trigger('toggleChildrenAnim', [
25463
25703
  transition('collapsed => expanded', [style({ height: 0 }), animate(200, style({ height: '*' }))]),
25464
25704
  transition('expanded => collapsed', [style({ height: '*' }), animate(200, style({ height: 0 }))]),
@@ -25478,7 +25718,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
25478
25718
  ], host: {
25479
25719
  '[class.clr-tree-node]': 'true',
25480
25720
  '[class.disabled]': 'this._model.disabled',
25481
- }, template: "<!--\n ~ Copyright (c) 2016-2025 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\n #contentContainer\n role=\"treeitem\"\n class=\"clr-tree-node-content-container\"\n tabindex=\"-1\"\n [class.clr-form-control-disabled]=\"disabled\"\n [attr.aria-disabled]=\"disabled\"\n [attr.aria-expanded]=\"isExpandable() ? expanded : null\"\n [attr.aria-selected]=\"ariaSelected\"\n (keydown)=\"onKeyDown($event)\"\n (focus)=\"broadcastFocusOnContainer()\"\n>\n <button\n *ngIf=\"isExpandable() && !isModelLoading && !expandService.loading\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"clr-treenode-caret\"\n (click)=\"expandService.toggle();\"\n (focus)=\"focusTreeNode()\"\n [disabled]=\"disabled\"\n >\n <cds-icon\n class=\"clr-treenode-caret-icon\"\n shape=\"angle\"\n [attr.direction]=\"expandService.expanded ? 'down' : 'right'\"\n ></cds-icon>\n </button>\n <div class=\"clr-treenode-spinner-container\" *ngIf=\"expandService.loading || isModelLoading\">\n <span class=\"clr-treenode-spinner spinner\"></span>\n </div>\n <div class=\"clr-checkbox-wrapper clr-treenode-checkbox\" *ngIf=\"featuresService.selectable\">\n <input\n aria-hidden=\"true\"\n type=\"checkbox\"\n id=\"{{nodeId}}-check\"\n class=\"clr-checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"_model.selected.value === STATES.SELECTED\"\n [indeterminate]=\"_model.selected.value === STATES.INDETERMINATE\"\n (change)=\"_model.toggleSelection(featuresService.eager)\"\n (focus)=\"focusTreeNode()\"\n tabindex=\"-1\"\n />\n <label for=\"{{nodeId}}-check\" class=\"clr-control-label\">\n <ng-container [ngTemplateOutlet]=\"treenodeContent\"></ng-container>\n </label>\n </div>\n <div\n class=\"clr-treenode-content\"\n [class.clr-treenode-text-only]=\"treeNodeContentTextOnly\"\n (mouseup)=\"focusTreeNode()\"\n *ngIf=\"!featuresService.selectable\"\n >\n <ng-container [ngTemplateOutlet]=\"treenodeContent\"></ng-container>\n </div>\n\n <ng-template #treenodeContent>\n <ng-content></ng-content>\n <div class=\"clr-sr-only\" *ngIf=\"featuresService.selectable || ariaSelected\">\n <span> {{ariaSelected ? commonStrings.keys.selectedTreeNode : commonStrings.keys.unselectedTreeNode}}</span>\n </div>\n </ng-template>\n</div>\n<div\n class=\"clr-treenode-children\"\n [@toggleChildrenAnim]=\"expandService.expanded ? 'expanded' : 'collapsed'\"\n [attr.role]=\"isExpandable() && !featuresService.recursion ? 'group' : null\"\n>\n <ng-content select=\"clr-tree-node\"></ng-content>\n <ng-content select=\"[clrIfExpanded]\"></ng-content>\n <clr-recursive-children [parent]=\"_model\"></clr-recursive-children>\n</div>\n" }]
25721
+ }, template: "<!--\n ~ Copyright (c) 2016-2025 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\n #contentContainer\n role=\"treeitem\"\n class=\"clr-tree-node-content-container\"\n tabindex=\"-1\"\n [class.clr-form-control-disabled]=\"disabled\"\n [attr.aria-disabled]=\"disabled\"\n [attr.aria-expanded]=\"isExpandable() ? expanded : null\"\n [attr.aria-selected]=\"ariaSelected\"\n (keydown)=\"onKeyDown($event)\"\n (focus)=\"broadcastFocusOnContainer()\"\n>\n <button\n *ngIf=\"isExpandable() && !isModelLoading && !expandService.loading\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"clr-treenode-caret\"\n (click)=\"expandService.toggle();\"\n (focus)=\"focusTreeNode()\"\n [disabled]=\"disabled\"\n >\n <cds-icon\n class=\"clr-treenode-caret-icon\"\n shape=\"angle\"\n [attr.direction]=\"expandService.expanded ? 'down' : 'right'\"\n ></cds-icon>\n </button>\n <div class=\"clr-treenode-spinner-container\" *ngIf=\"expandService.loading || isModelLoading\">\n <span class=\"clr-treenode-spinner spinner\"></span>\n </div>\n <div class=\"clr-checkbox-wrapper clr-treenode-checkbox\" *ngIf=\"featuresService.selectable\">\n <input\n aria-hidden=\"true\"\n type=\"checkbox\"\n [id]=\"nodeId + '-check'\"\n class=\"clr-checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"_model.selected.value === STATES.SELECTED\"\n [indeterminate]=\"_model.selected.value === STATES.INDETERMINATE\"\n (change)=\"_model.toggleSelection(featuresService.eager)\"\n (focus)=\"focusTreeNode()\"\n tabindex=\"-1\"\n />\n <label [for]=\"nodeId + '-check'\" class=\"clr-control-label\">\n <ng-container [ngTemplateOutlet]=\"treenodeContent\"></ng-container>\n </label>\n </div>\n <div\n class=\"clr-treenode-content\"\n [class.clr-treenode-text-only]=\"treeNodeContentTextOnly\"\n (mouseup)=\"focusTreeNode()\"\n *ngIf=\"!featuresService.selectable\"\n >\n <ng-container [ngTemplateOutlet]=\"treenodeContent\"></ng-container>\n </div>\n\n <ng-template #treenodeContent>\n <ng-content></ng-content>\n <div class=\"clr-sr-only\" *ngIf=\"featuresService.selectable || ariaSelected\">\n <span> {{ariaSelected ? commonStrings.keys.selectedTreeNode : commonStrings.keys.unselectedTreeNode}}</span>\n </div>\n </ng-template>\n</div>\n<div\n class=\"clr-treenode-children\"\n [@toggleChildrenAnim]=\"expandService.expanded ? 'expanded' : 'collapsed'\"\n [attr.role]=\"isExpandable() && !featuresService.recursion ? 'group' : null\"\n>\n <ng-content select=\"clr-tree-node\"></ng-content>\n <ng-content select=\"[clrIfExpanded]\"></ng-content>\n <clr-recursive-children [parent]=\"_model\"></clr-recursive-children>\n</div>\n" }]
25482
25722
  }], ctorParameters: function () {
25483
25723
  return [{ type: undefined, decorators: [{
25484
25724
  type: Inject,
@@ -26118,10 +26358,10 @@ class ClrAlertsPager {
26118
26358
  }
26119
26359
  }
26120
26360
  ClrAlertsPager.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrAlertsPager, deps: [{ token: MultiAlertService }, { token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Component });
26121
- ClrAlertsPager.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrAlertsPager, selector: "clr-alerts-pager", inputs: { currentAlert: ["clrCurrentAlert", "currentAlert"], currentAlertIndex: ["clrCurrentAlertIndex", "currentAlertIndex"] }, outputs: { currentAlertChange: "clrCurrentAlertChange", currentAlertIndexChange: "clrCurrentAlertIndexChange" }, host: { properties: { "class.alerts-pager": "true" } }, ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2025 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 class=\"alerts-pager-control\">\n <div class=\"alerts-page-down\">\n <button class=\"alerts-pager-button\" type=\"button\" (click)=\"pageDown()\" [attr.aria-label]=\"previousAlertAriaLabel\">\n <cds-icon shape=\"angle\" direction=\"left\"></cds-icon>\n </button>\n </div>\n <div class=\"alerts-pager-text\">{{this.multiAlertService.current+1}} / {{this.multiAlertService.count}}</div>\n <div class=\"alerts-page-up\">\n <button class=\"alerts-pager-button\" type=\"button\" (click)=\"pageUp()\" [attr.aria-label]=\"nextAlertAriaLabel\">\n <cds-icon shape=\"angle\" direction=\"right\"></cds-icon>\n </button>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }] });
26361
+ ClrAlertsPager.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrAlertsPager, selector: "clr-alerts-pager", inputs: { currentAlert: ["clrCurrentAlert", "currentAlert"], currentAlertIndex: ["clrCurrentAlertIndex", "currentAlertIndex"] }, outputs: { currentAlertChange: "clrCurrentAlertChange", currentAlertIndexChange: "clrCurrentAlertIndexChange" }, host: { properties: { "class.alerts-pager": "true" } }, ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2025 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 class=\"alerts-pager-control\">\n <div class=\"alerts-page-down\">\n <button class=\"alerts-pager-button\" type=\"button\" (click)=\"pageDown()\" [attr.aria-label]=\"previousAlertAriaLabel\">\n <cds-icon shape=\"angle\" direction=\"left\" [attr.title]=\"commonStrings.keys.previous\"></cds-icon>\n </button>\n </div>\n <div class=\"alerts-pager-text\">{{this.multiAlertService.current+1}} / {{this.multiAlertService.count}}</div>\n <div class=\"alerts-page-up\">\n <button class=\"alerts-pager-button\" type=\"button\" (click)=\"pageUp()\" [attr.aria-label]=\"nextAlertAriaLabel\">\n <cds-icon shape=\"angle\" direction=\"right\" [attr.title]=\"commonStrings.keys.next\"></cds-icon>\n </button>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }] });
26122
26362
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrAlertsPager, decorators: [{
26123
26363
  type: Component,
26124
- args: [{ selector: 'clr-alerts-pager', host: { '[class.alerts-pager]': 'true' }, template: "<!--\n ~ Copyright (c) 2016-2025 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 class=\"alerts-pager-control\">\n <div class=\"alerts-page-down\">\n <button class=\"alerts-pager-button\" type=\"button\" (click)=\"pageDown()\" [attr.aria-label]=\"previousAlertAriaLabel\">\n <cds-icon shape=\"angle\" direction=\"left\"></cds-icon>\n </button>\n </div>\n <div class=\"alerts-pager-text\">{{this.multiAlertService.current+1}} / {{this.multiAlertService.count}}</div>\n <div class=\"alerts-page-up\">\n <button class=\"alerts-pager-button\" type=\"button\" (click)=\"pageUp()\" [attr.aria-label]=\"nextAlertAriaLabel\">\n <cds-icon shape=\"angle\" direction=\"right\"></cds-icon>\n </button>\n </div>\n</div>\n" }]
26364
+ args: [{ selector: 'clr-alerts-pager', host: { '[class.alerts-pager]': 'true' }, template: "<!--\n ~ Copyright (c) 2016-2025 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 class=\"alerts-pager-control\">\n <div class=\"alerts-page-down\">\n <button class=\"alerts-pager-button\" type=\"button\" (click)=\"pageDown()\" [attr.aria-label]=\"previousAlertAriaLabel\">\n <cds-icon shape=\"angle\" direction=\"left\" [attr.title]=\"commonStrings.keys.previous\"></cds-icon>\n </button>\n </div>\n <div class=\"alerts-pager-text\">{{this.multiAlertService.current+1}} / {{this.multiAlertService.count}}</div>\n <div class=\"alerts-page-up\">\n <button class=\"alerts-pager-button\" type=\"button\" (click)=\"pageUp()\" [attr.aria-label]=\"nextAlertAriaLabel\">\n <cds-icon shape=\"angle\" direction=\"right\" [attr.title]=\"commonStrings.keys.next\"></cds-icon>\n </button>\n </div>\n</div>\n" }]
26125
26365
  }], ctorParameters: function () { return [{ type: MultiAlertService }, { type: ClrCommonStringsService }]; }, propDecorators: { currentAlertChange: [{
26126
26366
  type: Output,
26127
26367
  args: ['clrCurrentAlertChange']
@@ -26339,6 +26579,7 @@ class ClrModal {
26339
26579
  this._openChanged = new EventEmitter(false);
26340
26580
  this.closable = true;
26341
26581
  this.closeButtonAriaLabel = this.commonStrings.keys.close;
26582
+ this.size = 'md';
26342
26583
  this.staticBackdrop = true;
26343
26584
  this.skipAnimation = false;
26344
26585
  this.stopClose = false;
@@ -26407,7 +26648,7 @@ class ClrModal {
26407
26648
  }
26408
26649
  }
26409
26650
  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 });
26410
- 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 }, { propertyName: "bodyElementRef", first: true, predicate: ["body"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2025 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 <ng-content select=\".leading-button\"></ng-content>\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 #body 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</div>\n\n<div [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"backdropClick()\"></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: [
26651
+ 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 }, { propertyName: "bodyElementRef", first: true, predicate: ["body"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2025 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 <ng-content select=\".leading-button\"></ng-content>\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 #body 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</div>\n\n<div [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"backdropClick()\"></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: [
26411
26652
  trigger('fadeMove', [
26412
26653
  transition('* => fadeDown', [
26413
26654
  style({ opacity: 0, transform: 'translate(0, -25%)' }),
@@ -26442,7 +26683,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26442
26683
  transition('void => *', [style({ opacity: 0 }), animate('0.2s ease-in-out', style({ opacity: 0.85 }))]),
26443
26684
  transition('* => void', [animate('0.2s ease-in-out', style({ opacity: 0 }))]),
26444
26685
  ]),
26445
- ], template: "<!--\n ~ Copyright (c) 2016-2025 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 <ng-content select=\".leading-button\"></ng-content>\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 #body 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</div>\n\n<div [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"backdropClick()\"></div>\n", styles: [":host{display:none}:host.open{display:inline}\n"] }]
26686
+ ], template: "<!--\n ~ Copyright (c) 2016-2025 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 <ng-content select=\".leading-button\"></ng-content>\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 #body 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</div>\n\n<div [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"backdropClick()\"></div>\n", styles: [":host{display:none}:host.open{display:inline}\n"] }]
26446
26687
  }], ctorParameters: function () { return [{ type: ScrollingService }, { type: ClrCommonStringsService }, { type: ModalStackService }, { type: ClrModalConfigurationService }]; }, propDecorators: { title: [{
26447
26688
  type: ViewChild,
26448
26689
  args: ['title']
@@ -26611,11 +26852,15 @@ class ClrSidePanel {
26611
26852
  this.altClose = new EventEmitter(false);
26612
26853
  this._pinnable = false;
26613
26854
  this._pinned = false;
26855
+ this._size = 'md';
26614
26856
  }
26615
26857
  get size() {
26616
26858
  return this._size;
26617
26859
  }
26618
26860
  set size(value) {
26861
+ if (!value) {
26862
+ value = 'md';
26863
+ }
26619
26864
  if (this._size !== value) {
26620
26865
  this._size = value;
26621
26866
  if (this.clrSidePanelPinnable && this.pinned) {
@@ -29152,6 +29397,23 @@ class ClrWizardStepnavItem {
29152
29397
  this.pageGuard();
29153
29398
  return this.pageCollection.previousPageIsCompleted(this.page);
29154
29399
  }
29400
+ get stepIconId() {
29401
+ return `${this.id}-step-icon`;
29402
+ }
29403
+ get stepTextId() {
29404
+ return `${this.id}-step-text`;
29405
+ }
29406
+ get stepNumberId() {
29407
+ return `${this.id}-step-number`;
29408
+ }
29409
+ get stepTitleId() {
29410
+ return `${this.id}-step-title`;
29411
+ }
29412
+ get labelledby() {
29413
+ const textIds = [this.stepTextId, this.stepNumberId, this.stepTitleId];
29414
+ const allIds = this.isComplete ? [this.stepIconId, ...textIds] : textIds;
29415
+ return allIds.join(' ');
29416
+ }
29155
29417
  click() {
29156
29418
  this.pageGuard();
29157
29419
  // if we click on our own stepnav or a disabled stepnav, we don't want to do anything
@@ -29173,25 +29435,30 @@ ClrWizardStepnavItem.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", v
29173
29435
  class="btn btn-link clr-wizard-stepnav-link"
29174
29436
  (click)="click()"
29175
29437
  [attr.disabled]="isDisabled ? '' : null"
29438
+ [attr.aria-labelledby]="labelledby"
29176
29439
  >
29177
29440
  <div class="clr-wizard-stepnav-link-icon">
29178
29441
  <cds-icon
29179
29442
  *ngIf="hasError"
29443
+ [id]="stepIconId"
29180
29444
  shape="error-standard"
29181
29445
  role="img"
29182
29446
  [attr.aria-label]="commonStrings.keys.wizardStepError"
29183
29447
  ></cds-icon>
29184
29448
  <cds-icon
29185
29449
  *ngIf="!hasError && isComplete"
29450
+ [id]="stepIconId"
29186
29451
  shape="success-standard"
29187
29452
  role="img"
29188
29453
  [attr.aria-label]="commonStrings.keys.wizardStepSuccess"
29189
29454
  ></cds-icon>
29190
29455
  </div>
29191
29456
 
29192
- <span class="clr-sr-only">{{ commonStrings.keys.wizardStep }}</span>
29193
- <div class="clr-wizard-stepnav-link-page-number"><ng-content></ng-content></div>
29194
- <span class="clr-wizard-stepnav-link-title">
29457
+ <span [id]="stepTextId" class="clr-sr-only">{{ commonStrings.keys.wizardStep }}</span>
29458
+ <div [id]="stepNumberId" class="clr-wizard-stepnav-link-page-number">
29459
+ <ng-content></ng-content>
29460
+ </div>
29461
+ <span [id]="stepTitleId" class="clr-wizard-stepnav-link-title">
29195
29462
  <ng-template [ngTemplateOutlet]="page.navTitle"></ng-template>
29196
29463
  </span>
29197
29464
  </button>
@@ -29206,25 +29473,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
29206
29473
  class="btn btn-link clr-wizard-stepnav-link"
29207
29474
  (click)="click()"
29208
29475
  [attr.disabled]="isDisabled ? '' : null"
29476
+ [attr.aria-labelledby]="labelledby"
29209
29477
  >
29210
29478
  <div class="clr-wizard-stepnav-link-icon">
29211
29479
  <cds-icon
29212
29480
  *ngIf="hasError"
29481
+ [id]="stepIconId"
29213
29482
  shape="error-standard"
29214
29483
  role="img"
29215
29484
  [attr.aria-label]="commonStrings.keys.wizardStepError"
29216
29485
  ></cds-icon>
29217
29486
  <cds-icon
29218
29487
  *ngIf="!hasError && isComplete"
29488
+ [id]="stepIconId"
29219
29489
  shape="success-standard"
29220
29490
  role="img"
29221
29491
  [attr.aria-label]="commonStrings.keys.wizardStepSuccess"
29222
29492
  ></cds-icon>
29223
29493
  </div>
29224
29494
 
29225
- <span class="clr-sr-only">{{ commonStrings.keys.wizardStep }}</span>
29226
- <div class="clr-wizard-stepnav-link-page-number"><ng-content></ng-content></div>
29227
- <span class="clr-wizard-stepnav-link-title">
29495
+ <span [id]="stepTextId" class="clr-sr-only">{{ commonStrings.keys.wizardStep }}</span>
29496
+ <div [id]="stepNumberId" class="clr-wizard-stepnav-link-page-number">
29497
+ <ng-content></ng-content>
29498
+ </div>
29499
+ <span [id]="stepTitleId" class="clr-wizard-stepnav-link-title">
29228
29500
  <ng-template [ngTemplateOutlet]="page.navTitle"></ng-template>
29229
29501
  </span>
29230
29502
  </button>
@@ -29259,37 +29531,43 @@ class ClrWizardStepnav {
29259
29531
  }
29260
29532
  }
29261
29533
  ClrWizardStepnav.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrWizardStepnav, deps: [{ token: PageCollectionService }], target: i0.ɵɵFactoryTarget.Component });
29262
- ClrWizardStepnav.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrWizardStepnav, selector: "clr-wizard-stepnav", host: { classAttribute: "clr-wizard-stepnav" }, ngImport: i0, template: `
29263
- <div class="clr-wizard-stepnav-list">
29264
- <div
29265
- *ngFor="let page of pageService.pages; let i = index"
29266
- clr-wizard-stepnav-item
29267
- [page]="page"
29268
- class="clr-wizard-stepnav-item"
29269
- >
29270
- {{ i + 1 }}
29271
- </div>
29272
- </div>
29534
+ ClrWizardStepnav.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrWizardStepnav, selector: "clr-wizard-stepnav", inputs: { label: "label" }, host: { classAttribute: "clr-wizard-stepnav" }, ngImport: i0, template: `
29535
+ <nav [attr.aria-label]="label">
29536
+ <ol class="clr-wizard-stepnav-list">
29537
+ <li
29538
+ *ngFor="let page of pageService.pages; let i = index"
29539
+ clr-wizard-stepnav-item
29540
+ [page]="page"
29541
+ class="clr-wizard-stepnav-item"
29542
+ >
29543
+ {{ i + 1 }}
29544
+ </li>
29545
+ </ol>
29546
+ </nav>
29273
29547
  `, isInline: true, dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ClrWizardStepnavItem, selector: "[clr-wizard-stepnav-item]", inputs: ["page"] }] });
29274
29548
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrWizardStepnav, decorators: [{
29275
29549
  type: Component,
29276
29550
  args: [{
29277
29551
  selector: 'clr-wizard-stepnav',
29278
29552
  template: `
29279
- <div class="clr-wizard-stepnav-list">
29280
- <div
29281
- *ngFor="let page of pageService.pages; let i = index"
29282
- clr-wizard-stepnav-item
29283
- [page]="page"
29284
- class="clr-wizard-stepnav-item"
29285
- >
29286
- {{ i + 1 }}
29287
- </div>
29288
- </div>
29553
+ <nav [attr.aria-label]="label">
29554
+ <ol class="clr-wizard-stepnav-list">
29555
+ <li
29556
+ *ngFor="let page of pageService.pages; let i = index"
29557
+ clr-wizard-stepnav-item
29558
+ [page]="page"
29559
+ class="clr-wizard-stepnav-item"
29560
+ >
29561
+ {{ i + 1 }}
29562
+ </li>
29563
+ </ol>
29564
+ </nav>
29289
29565
  `,
29290
29566
  host: { class: 'clr-wizard-stepnav' },
29291
29567
  }]
29292
- }], ctorParameters: function () { return [{ type: PageCollectionService }]; } });
29568
+ }], ctorParameters: function () { return [{ type: PageCollectionService }]; }, propDecorators: { label: [{
29569
+ type: Input
29570
+ }] } });
29293
29571
 
29294
29572
  /*
29295
29573
  * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
@@ -29693,7 +29971,7 @@ class ClrWizard {
29693
29971
  }
29694
29972
  }
29695
29973
  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 });
29696
- 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 }, { propertyName: "modal", first: true, predicate: ClrModal, descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2025 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" }] });
29974
+ 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 }, { propertyName: "modal", first: true, predicate: ClrModal, descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2025 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\">\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 [label]=\"stepnavAriaLabel\"></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", inputs: ["label"] }] });
29697
29975
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrWizard, decorators: [{
29698
29976
  type: Component,
29699
29977
  args: [{ selector: 'clr-wizard', providers: [WizardNavigationService, PageCollectionService, ButtonHubService, HeaderActionService], host: {
@@ -29702,7 +29980,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
29702
29980
  '[class.wizard-lg]': "size == 'lg'",
29703
29981
  '[class.wizard-xl]': "size == 'xl'",
29704
29982
  '[class.lastPage]': 'navService.currentPageIsLast',
29705
- }, template: "<!--\n ~ Copyright (c) 2016-2025 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" }]
29983
+ }, template: "<!--\n ~ Copyright (c) 2016-2025 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\">\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 [label]=\"stepnavAriaLabel\"></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" }]
29706
29984
  }], ctorParameters: function () {
29707
29985
  return [{ type: undefined, decorators: [{
29708
29986
  type: Inject,