@clr/angular 17.9.0 → 17.10.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 (50) hide show
  1. package/clarity.api.md +92 -52
  2. package/data/datagrid/datagrid-row.d.ts +5 -4
  3. package/data/datagrid/datagrid-virtual-scroll.directive.d.ts +3 -7
  4. package/data/datagrid/datagrid.d.ts +11 -3
  5. package/data/datagrid/index.d.ts +1 -0
  6. package/data/datagrid/interfaces/key-nav-grid-strategy.interface.d.ts +11 -0
  7. package/data/datagrid/interfaces/virtual-scroll-data-range.interface.d.ts +5 -0
  8. package/data/datagrid/providers/items.d.ts +1 -0
  9. package/data/datagrid/utils/key-navigation-grid.controller.d.ts +1 -16
  10. package/data/datagrid/utils/key-navigation-strategies/default.d.ts +15 -0
  11. package/data/datagrid/utils/key-navigation-strategies/expanded-columns-row.d.ts +14 -0
  12. package/data/datagrid/utils/key-navigation-strategies/expanded-row.d.ts +14 -0
  13. package/data/datagrid/utils/key-navigation-utils.d.ts +22 -0
  14. package/esm2020/data/datagrid/datagrid-column.mjs +8 -12
  15. package/esm2020/data/datagrid/datagrid-row.mjs +21 -8
  16. package/esm2020/data/datagrid/datagrid-virtual-scroll.directive.mjs +23 -20
  17. package/esm2020/data/datagrid/datagrid.mjs +48 -17
  18. package/esm2020/data/datagrid/index.mjs +2 -1
  19. package/esm2020/data/datagrid/interfaces/key-nav-grid-strategy.interface.mjs +8 -0
  20. package/esm2020/data/datagrid/interfaces/virtual-scroll-data-range.interface.mjs +8 -0
  21. package/esm2020/data/datagrid/providers/items.mjs +5 -1
  22. package/esm2020/data/datagrid/utils/key-navigation-grid.controller.mjs +18 -243
  23. package/esm2020/data/datagrid/utils/key-navigation-strategies/default.mjs +132 -0
  24. package/esm2020/data/datagrid/utils/key-navigation-strategies/expanded-columns-row.mjs +132 -0
  25. package/esm2020/data/datagrid/utils/key-navigation-strategies/expanded-row.mjs +168 -0
  26. package/esm2020/data/datagrid/utils/key-navigation-utils.mjs +108 -0
  27. package/esm2020/layout/breadcrumbs/breadcrumbs.mjs +2 -2
  28. package/esm2020/modal/modal.mjs +7 -4
  29. package/esm2020/popover/common/popover.mjs +2 -2
  30. package/esm2020/utils/animations/constants.mjs +7 -1
  31. package/esm2020/utils/animations/expandable-animation/base-expandable-animation.mjs +38 -0
  32. package/esm2020/utils/animations/expandable-animation/expandable-animation.directive.mjs +56 -0
  33. package/esm2020/utils/animations/expandable-animation/expandable-animation.mjs +10 -32
  34. package/esm2020/utils/animations/expandable-animation/expandable-animation.module.mjs +3 -2
  35. package/esm2020/utils/animations/expandable-animation/index.mjs +4 -2
  36. package/esm2020/utils/focus/focusable-item/basic-focusable-item.service.mjs +2 -2
  37. package/esm2020/wizard/wizard.mjs +29 -6
  38. package/fesm2015/clr-angular.mjs +790 -338
  39. package/fesm2015/clr-angular.mjs.map +1 -1
  40. package/fesm2020/clr-angular.mjs +788 -334
  41. package/fesm2020/clr-angular.mjs.map +1 -1
  42. package/modal/modal.d.ts +3 -2
  43. package/package.json +2 -2
  44. package/utils/animations/constants.d.ts +1 -0
  45. package/utils/animations/expandable-animation/base-expandable-animation.d.ts +13 -0
  46. package/utils/animations/expandable-animation/expandable-animation.d.ts +2 -6
  47. package/utils/animations/expandable-animation/expandable-animation.directive.d.ts +16 -0
  48. package/utils/animations/expandable-animation/expandable-animation.module.d.ts +3 -2
  49. package/utils/animations/expandable-animation/index.d.ts +1 -0
  50. package/wizard/wizard.d.ts +12 -2
@@ -1,19 +1,20 @@
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, forwardRef, Attribute, TemplateRef, ViewContainerRef, LOCALE_ID, 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, ViewChildren } 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, minusIcon, plusIcon, eyeHideIcon, eyeIcon, ellipsisVerticalIcon, viewColumnsIcon, arrowIcon, stepForward2Icon, filterGridCircleIcon, filterGridIcon, errorStandardIcon, helpIcon, infoStandardIcon, noteIcon, successStandardIcon, warningStandardIcon, circleIcon, dotCircleIcon } from '@cds/core/icon';
6
6
  import { map, tap, startWith, distinctUntilChanged, filter, skipUntil, debounceTime, takeUntil, take, first, switchMap as switchMap$1 } from 'rxjs/operators';
7
7
  import * as i3 from 'rxjs';
8
8
  import { Subject, BehaviorSubject, Observable, fromEvent, isObservable, of, shareReplay, combineLatest, startWith as startWith$1, switchMap, merge, map as map$1, EMPTY, ReplaySubject, tap as tap$1 } from 'rxjs';
9
- import { trigger, transition, style, animate, state, keyframes } from '@angular/animations';
9
+ import * as i2 from '@angular/animations';
10
+ import { animation, style, animate, trigger, transition, state, useAnimation, keyframes } from '@angular/animations';
10
11
  import * as i1 from '@angular/forms';
11
12
  import { FormControl, FormGroup, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, SelectMultipleControlValueAccessor } from '@angular/forms';
12
13
  import * as i1$1 from '@angular/router';
13
14
  import { RouterModule } from '@angular/router';
14
15
  import * as i1$2 from '@angular/cdk/a11y';
15
16
  import { CdkTrapFocus } from '@angular/cdk/a11y';
16
- import * as i2 from '@angular/cdk/drag-drop';
17
+ import * as i2$1 from '@angular/cdk/drag-drop';
17
18
  import { CdkDrag, CDK_DROP_LIST, CDK_DRAG_CONFIG } from '@angular/cdk/drag-drop';
18
19
  import * as i1$3 from '@angular/cdk/bidi';
19
20
  import { Directionality } from '@angular/cdk/bidi';
@@ -233,6 +234,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
233
234
  * The full license information can be found in LICENSE in the root directory of this project.
234
235
  */
235
236
  const defaultAnimationTiming = '0.2s ease-in-out';
237
+ const defaultExpandAnimation = animation([style({ height: '{{ startHeight }}px' }), animate(defaultAnimationTiming, style({ height: '*' }))], {
238
+ params: {
239
+ startHeight: 0, // default
240
+ },
241
+ });
236
242
 
237
243
  /*
238
244
  * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
@@ -3104,54 +3110,68 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
3104
3110
  * This software is released under MIT license.
3105
3111
  * The full license information can be found in LICENSE in the root directory of this project.
3106
3112
  */
3107
- class ClrExpandableAnimation {
3113
+ class BaseExpandableAnimation {
3108
3114
  constructor(element, domAdapter, renderer) {
3109
3115
  this.element = element;
3110
3116
  this.domAdapter = domAdapter;
3111
3117
  this.renderer = renderer;
3112
- this.clrExpandTrigger = false;
3113
3118
  this.startHeight = 0;
3114
3119
  }
3120
+ updateStartHeight() {
3121
+ this.startHeight = this.domAdapter.computedHeight(this.element.nativeElement) || 0;
3122
+ }
3123
+ initAnimationEffects() {
3124
+ this.renderer.setStyle(this.element.nativeElement, 'overflow', 'hidden');
3125
+ }
3126
+ cleanupAnimationEffects(cancelAnimations = false) {
3127
+ this.renderer.removeStyle(this.element.nativeElement, 'overflow');
3128
+ // A "safe" auto-update of the height ensuring basic OOTB user experience .
3129
+ // Prone to small jumps in initial animation height if data was changed in the meantime, the window was resized, etc.
3130
+ // For optimal behavior call manually updateStartHeight() from the parent component before initiating the update.
3131
+ this.updateStartHeight();
3132
+ if (cancelAnimations) {
3133
+ this.cancelElementAnimations();
3134
+ }
3135
+ }
3136
+ cancelElementAnimations() {
3137
+ this.element.nativeElement.getAnimations().forEach(animation => {
3138
+ if (animation.playState === 'finished') {
3139
+ animation.cancel(); // clears animation-style set on the element
3140
+ }
3141
+ });
3142
+ }
3143
+ }
3144
+
3145
+ /*
3146
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
3147
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
3148
+ * This software is released under MIT license.
3149
+ * The full license information can be found in LICENSE in the root directory of this project.
3150
+ */
3151
+ class ClrExpandableAnimation extends BaseExpandableAnimation {
3152
+ constructor(element, domAdapter, renderer) {
3153
+ super(element, domAdapter, renderer);
3154
+ this.clrExpandTrigger = false;
3155
+ }
3115
3156
  get expandAnimation() {
3116
3157
  return { value: this.clrExpandTrigger, params: { startHeight: this.startHeight } };
3117
3158
  }
3118
3159
  animationStart(event) {
3119
3160
  if (event.fromState !== 'void') {
3120
- this.renderer.setStyle(this.element.nativeElement, 'overflow', 'hidden');
3161
+ this.initAnimationEffects();
3121
3162
  }
3122
3163
  }
3123
3164
  animationDone(event) {
3124
3165
  if (event.fromState !== 'void') {
3125
- this.renderer.removeStyle(this.element.nativeElement, 'overflow');
3126
- // A "safe" auto-update of the height ensuring basic OOTB user experience .
3127
- // Prone to small jumps in initial animation height if data was changed in the meantime, window was resized, etc.
3128
- // For optimal behavior call manually updateStartHeight() from the parent component before initiating the update.
3129
- this.updateStartHeight();
3166
+ this.cleanupAnimationEffects();
3130
3167
  }
3131
3168
  }
3132
- updateStartHeight() {
3133
- this.startHeight = this.domAdapter.computedHeight(this.element.nativeElement) || 0;
3134
- }
3135
3169
  }
3136
3170
  ClrExpandableAnimation.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimation, deps: [{ token: i0.ElementRef }, { token: DomAdapter }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
3137
- ClrExpandableAnimation.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrExpandableAnimation, selector: "clr-expandable-animation", inputs: { clrExpandTrigger: "clrExpandTrigger" }, host: { listeners: { "@expandAnimation.start": "animationStart($event)", "@expandAnimation.done": "animationDone($event)" }, properties: { "@expandAnimation": "this.expandAnimation" } }, providers: [DomAdapter], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, styles: [":host{display:block}\n"], animations: [
3138
- trigger('expandAnimation', [
3139
- transition('true <=> false', [
3140
- style({ height: '{{startHeight}}px' }),
3141
- animate('0.2s ease-in-out', style({ height: '*' })),
3142
- ]),
3143
- ]),
3144
- ] });
3171
+ ClrExpandableAnimation.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrExpandableAnimation, selector: "clr-expandable-animation", inputs: { clrExpandTrigger: "clrExpandTrigger" }, host: { listeners: { "@expandAnimation.start": "animationStart($event)", "@expandAnimation.done": "animationDone($event)" }, properties: { "@expandAnimation": "this.expandAnimation" } }, providers: [DomAdapter], usesInheritance: true, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, styles: [":host{display:block}\n"], animations: [trigger('expandAnimation', [transition('true <=> false', [useAnimation(defaultExpandAnimation)])])] });
3145
3172
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimation, decorators: [{
3146
3173
  type: Component,
3147
- args: [{ selector: 'clr-expandable-animation', template: `<ng-content></ng-content>`, animations: [
3148
- trigger('expandAnimation', [
3149
- transition('true <=> false', [
3150
- style({ height: '{{startHeight}}px' }),
3151
- animate('0.2s ease-in-out', style({ height: '*' })),
3152
- ]),
3153
- ]),
3154
- ], providers: [DomAdapter], styles: [":host{display:block}\n"] }]
3174
+ args: [{ selector: 'clr-expandable-animation', template: `<ng-content></ng-content>`, animations: [trigger('expandAnimation', [transition('true <=> false', [useAnimation(defaultExpandAnimation)])])], providers: [DomAdapter], styles: [":host{display:block}\n"] }]
3155
3175
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: DomAdapter }, { type: i0.Renderer2 }]; }, propDecorators: { clrExpandTrigger: [{
3156
3176
  type: Input
3157
3177
  }], expandAnimation: [{
@@ -3171,7 +3191,55 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
3171
3191
  * This software is released under MIT license.
3172
3192
  * The full license information can be found in LICENSE in the root directory of this project.
3173
3193
  */
3174
- const EXPANDABLE_ANIMATION_DIRECTIVES = [ClrExpandableAnimation];
3194
+ class ClrExpandableAnimationDirective extends BaseExpandableAnimation {
3195
+ constructor(element, domAdapter, renderer, builder) {
3196
+ super(element, domAdapter, renderer);
3197
+ this.builder = builder;
3198
+ this.expanded = false;
3199
+ }
3200
+ ngOnChanges(changes) {
3201
+ if (changes['expanded'] && !changes['expanded'].firstChange) {
3202
+ Promise.resolve().then(() => this.playAnimation());
3203
+ }
3204
+ }
3205
+ ngOnDestroy() {
3206
+ this.player?.destroy();
3207
+ }
3208
+ playAnimation() {
3209
+ if (this.player) {
3210
+ this.player.destroy();
3211
+ }
3212
+ this.player = this.builder
3213
+ .build([useAnimation(defaultExpandAnimation, { params: { startHeight: this.startHeight } })])
3214
+ .create(this.element.nativeElement);
3215
+ this.player.onStart(() => this.initAnimationEffects());
3216
+ this.player.onDone(() => this.cleanupAnimationEffects(true));
3217
+ this.player.play();
3218
+ }
3219
+ }
3220
+ ClrExpandableAnimationDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationDirective, deps: [{ token: i0.ElementRef }, { token: DomAdapter }, { token: i0.Renderer2 }, { token: i2.AnimationBuilder }], target: i0.ɵɵFactoryTarget.Directive });
3221
+ ClrExpandableAnimationDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrExpandableAnimationDirective, selector: "[clrExpandableAnimation]", inputs: { expanded: ["clrExpandableAnimation", "expanded"] }, host: { properties: { "class.clr-expandable-animation": "true" } }, providers: [DomAdapter], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
3222
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationDirective, decorators: [{
3223
+ type: Directive,
3224
+ args: [{
3225
+ selector: '[clrExpandableAnimation]',
3226
+ providers: [DomAdapter],
3227
+ host: {
3228
+ '[class.clr-expandable-animation]': 'true',
3229
+ },
3230
+ }]
3231
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: DomAdapter }, { type: i0.Renderer2 }, { type: i2.AnimationBuilder }]; }, propDecorators: { expanded: [{
3232
+ type: Input,
3233
+ args: ['clrExpandableAnimation']
3234
+ }] } });
3235
+
3236
+ /*
3237
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
3238
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
3239
+ * This software is released under MIT license.
3240
+ * The full license information can be found in LICENSE in the root directory of this project.
3241
+ */
3242
+ const EXPANDABLE_ANIMATION_DIRECTIVES = [ClrExpandableAnimation, ClrExpandableAnimationDirective];
3175
3243
 
3176
3244
  /*
3177
3245
  * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
@@ -5167,7 +5235,7 @@ class Popover {
5167
5235
  this._scroll = new Subject();
5168
5236
  const anchor = e;
5169
5237
  let current = e;
5170
- while (current && current !== document) {
5238
+ while (current && current !== document && current.nodeType === Node.ELEMENT_NODE) {
5171
5239
  if (this.scrolls(current)) {
5172
5240
  current.addEventListener('scroll', this.boundOnScrollListener);
5173
5241
  this.scrollableElements.push(current);
@@ -5494,7 +5562,7 @@ class BasicFocusableItem {
5494
5562
  if (isPlatformBrowser(this.platformId)) {
5495
5563
  this.renderer.setAttribute(this.el.nativeElement, 'tabindex', '0');
5496
5564
  this.el.nativeElement.focus();
5497
- this.el.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' });
5565
+ this.el.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' });
5498
5566
  }
5499
5567
  }
5500
5568
  blur() {
@@ -9965,14 +10033,14 @@ class ClrBreadcrumbs {
9965
10033
  }
9966
10034
  }
9967
10035
  ClrBreadcrumbs.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrBreadcrumbs, deps: [{ token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Component });
9968
- ClrBreadcrumbs.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrBreadcrumbs, selector: "clr-breadcrumbs", inputs: { items: "items" }, outputs: { clrBreadcrumbItemClick: "clrBreadcrumbItemClick" }, host: { properties: { "attr.aria-label": "commonStrings.keys.breadcrumbsLabel", "attr.role": "\"navigation\"" }, classAttribute: "clr-breadcrumb" }, ngImport: i0, template: "<div *ngIf=\"items?.length\" role=\"list\" class=\"clr-breadcrumb-menu\">\n <clr-breadcrumb-item *ngIf=\"items.length > max && !isExpanded\">\n <button\n [attr.aria-label]=\"commonStrings.keys.expandBreadcrumbsLabel\"\n class=\"btn btn-link btn-sm clr-breadcrumb-expand\"\n (click)=\"expand()\"\n (keydown)=\"expand()\"\n >\n <cds-icon shape=\"ellipsis-horizontal\"></cds-icon>\n </button>\n </clr-breadcrumb-item>\n <clr-breadcrumb-item *ngFor=\"let breadcrumb of items | slice: -limit : items.length; let isLastItem=last\">\n <span *ngIf=\"isLastItem; else breadcrumbLinks\" aria-current=\"page\">{{ breadcrumb.label }}</span>\n\n <ng-template #breadcrumbLinks>\n <a\n *ngIf=\"breadcrumb.routerLink\"\n [routerLink]=\"breadcrumb.routerLink\"\n [queryParams]=\"breadcrumb.queryParams\"\n [target]=\"breadcrumb.target || '_self'\"\n (click)=\"handleItemClick(breadcrumb)\"\n >\n {{ breadcrumb.label }}\n </a>\n <a\n *ngIf=\"breadcrumb.href\"\n [href]=\"breadcrumb.href\"\n [target]=\"breadcrumb.target || '_self'\"\n (click)=\"handleItemClick(breadcrumb)\"\n >\n {{ breadcrumb.label }}\n </a>\n </ng-template>\n </clr-breadcrumb-item>\n</div>\n", styles: [":root [cds-theme]{--clr-breadcrumb-item-space: var(--cds-global-space-5)}.clr-breadcrumb-menu{display:flex;flex-wrap:wrap;align-items:center}.clr-breadcrumb-menu .clr-breadcrumb-item{display:flex;align-items:center;font-size:var(--cds-alias-typography-secondary-font-size);font-weight:var(--cds-alias-typography-secondary-font-weight);line-height:var(--cds-alias-typography-secondary-line-height);letter-spacing:var(--cds-alias-typography-secondary-letter-spacing)}.clr-breadcrumb-menu .clr-breadcrumb-item a{text-decoration:none;text-align:center;line-height:var(--cds-global-space-9)}.clr-breadcrumb-menu .clr-breadcrumb-item:not(:last-child):after{content:\"/\";margin:0 var(--clr-breadcrumb-item-space);color:var(--cds-alias-typography-color-400)}.clr-breadcrumb-menu .clr-breadcrumb-item:last-child{color:var(--cds-alias-typography-color-400)}.clr-breadcrumb-menu .clr-breadcrumb-expand{margin:0;padding:0;gap:0;min-width:-moz-fit-content;min-width:fit-content}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: ClrBreadcrumbItem, selector: "clr-breadcrumb-item" }, { kind: "pipe", type: i5.SlicePipe, name: "slice" }] });
10036
+ ClrBreadcrumbs.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrBreadcrumbs, selector: "clr-breadcrumbs", inputs: { items: "items" }, outputs: { clrBreadcrumbItemClick: "clrBreadcrumbItemClick" }, host: { properties: { "attr.aria-label": "commonStrings.keys.breadcrumbsLabel", "attr.role": "\"navigation\"" }, classAttribute: "clr-breadcrumb" }, ngImport: i0, template: "<div *ngIf=\"items?.length\" role=\"list\" class=\"clr-breadcrumb-menu\">\n <clr-breadcrumb-item *ngIf=\"items.length > max && !isExpanded\">\n <button\n [attr.aria-label]=\"commonStrings.keys.expandBreadcrumbsLabel\"\n class=\"btn btn-link btn-sm clr-breadcrumb-expand\"\n (click)=\"expand()\"\n (keydown)=\"expand()\"\n >\n <cds-icon shape=\"ellipsis-horizontal\"></cds-icon>\n </button>\n </clr-breadcrumb-item>\n <clr-breadcrumb-item *ngFor=\"let breadcrumb of items | slice: -limit : items.length; let isLastItem=last\">\n <span *ngIf=\"isLastItem; else breadcrumbLinks\" aria-current=\"page\">{{ breadcrumb.label }}</span>\n\n <ng-template #breadcrumbLinks>\n <a\n *ngIf=\"breadcrumb.routerLink\"\n [routerLink]=\"breadcrumb.routerLink\"\n [queryParams]=\"breadcrumb.queryParams\"\n [target]=\"breadcrumb.target || '_self'\"\n (click)=\"handleItemClick(breadcrumb)\"\n >\n {{ breadcrumb.label }}\n </a>\n <a\n *ngIf=\"breadcrumb.href\"\n [href]=\"breadcrumb.href\"\n [target]=\"breadcrumb.target || '_self'\"\n (click)=\"handleItemClick(breadcrumb)\"\n >\n {{ breadcrumb.label }}\n </a>\n </ng-template>\n </clr-breadcrumb-item>\n</div>\n", styles: [":root [cds-theme]{--clr-breadcrumb-item-space: var(--cds-global-space-5)}.clr-breadcrumb-menu{display:flex;flex-wrap:wrap;align-items:center}.clr-breadcrumb-menu .clr-breadcrumb-item{display:flex;align-items:center;font-size:var(--cds-alias-typography-secondary-font-size);font-weight:var(--cds-alias-typography-secondary-font-weight);line-height:var(--cds-alias-typography-secondary-line-height);letter-spacing:var(--cds-alias-typography-secondary-letter-spacing)}.clr-breadcrumb-menu .clr-breadcrumb-item a{text-decoration:none;text-align:center;line-height:var(--cds-global-space-9)}.clr-breadcrumb-menu .clr-breadcrumb-item a:visited{color:var(--clr-link-color)}.clr-breadcrumb-menu .clr-breadcrumb-item a:visited:hover{color:var(--clr-link-hover-color)}.clr-breadcrumb-menu .clr-breadcrumb-item:not(:last-child):after{content:\"/\";margin:0 var(--clr-breadcrumb-item-space);color:var(--cds-alias-typography-color-400)}.clr-breadcrumb-menu .clr-breadcrumb-item:last-child{color:var(--cds-alias-typography-color-400)}.clr-breadcrumb-menu .clr-breadcrumb-expand{margin:0;padding:0;gap:0;min-width:-moz-fit-content;min-width:fit-content}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: ClrBreadcrumbItem, selector: "clr-breadcrumb-item" }, { kind: "pipe", type: i5.SlicePipe, name: "slice" }] });
9969
10037
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrBreadcrumbs, decorators: [{
9970
10038
  type: Component,
9971
10039
  args: [{ selector: 'clr-breadcrumbs', host: {
9972
10040
  class: 'clr-breadcrumb',
9973
10041
  '[attr.aria-label]': 'commonStrings.keys.breadcrumbsLabel',
9974
10042
  '[attr.role]': '"navigation"',
9975
- }, template: "<div *ngIf=\"items?.length\" role=\"list\" class=\"clr-breadcrumb-menu\">\n <clr-breadcrumb-item *ngIf=\"items.length > max && !isExpanded\">\n <button\n [attr.aria-label]=\"commonStrings.keys.expandBreadcrumbsLabel\"\n class=\"btn btn-link btn-sm clr-breadcrumb-expand\"\n (click)=\"expand()\"\n (keydown)=\"expand()\"\n >\n <cds-icon shape=\"ellipsis-horizontal\"></cds-icon>\n </button>\n </clr-breadcrumb-item>\n <clr-breadcrumb-item *ngFor=\"let breadcrumb of items | slice: -limit : items.length; let isLastItem=last\">\n <span *ngIf=\"isLastItem; else breadcrumbLinks\" aria-current=\"page\">{{ breadcrumb.label }}</span>\n\n <ng-template #breadcrumbLinks>\n <a\n *ngIf=\"breadcrumb.routerLink\"\n [routerLink]=\"breadcrumb.routerLink\"\n [queryParams]=\"breadcrumb.queryParams\"\n [target]=\"breadcrumb.target || '_self'\"\n (click)=\"handleItemClick(breadcrumb)\"\n >\n {{ breadcrumb.label }}\n </a>\n <a\n *ngIf=\"breadcrumb.href\"\n [href]=\"breadcrumb.href\"\n [target]=\"breadcrumb.target || '_self'\"\n (click)=\"handleItemClick(breadcrumb)\"\n >\n {{ breadcrumb.label }}\n </a>\n </ng-template>\n </clr-breadcrumb-item>\n</div>\n", styles: [":root [cds-theme]{--clr-breadcrumb-item-space: var(--cds-global-space-5)}.clr-breadcrumb-menu{display:flex;flex-wrap:wrap;align-items:center}.clr-breadcrumb-menu .clr-breadcrumb-item{display:flex;align-items:center;font-size:var(--cds-alias-typography-secondary-font-size);font-weight:var(--cds-alias-typography-secondary-font-weight);line-height:var(--cds-alias-typography-secondary-line-height);letter-spacing:var(--cds-alias-typography-secondary-letter-spacing)}.clr-breadcrumb-menu .clr-breadcrumb-item a{text-decoration:none;text-align:center;line-height:var(--cds-global-space-9)}.clr-breadcrumb-menu .clr-breadcrumb-item:not(:last-child):after{content:\"/\";margin:0 var(--clr-breadcrumb-item-space);color:var(--cds-alias-typography-color-400)}.clr-breadcrumb-menu .clr-breadcrumb-item:last-child{color:var(--cds-alias-typography-color-400)}.clr-breadcrumb-menu .clr-breadcrumb-expand{margin:0;padding:0;gap:0;min-width:-moz-fit-content;min-width:fit-content}\n"] }]
10043
+ }, template: "<div *ngIf=\"items?.length\" role=\"list\" class=\"clr-breadcrumb-menu\">\n <clr-breadcrumb-item *ngIf=\"items.length > max && !isExpanded\">\n <button\n [attr.aria-label]=\"commonStrings.keys.expandBreadcrumbsLabel\"\n class=\"btn btn-link btn-sm clr-breadcrumb-expand\"\n (click)=\"expand()\"\n (keydown)=\"expand()\"\n >\n <cds-icon shape=\"ellipsis-horizontal\"></cds-icon>\n </button>\n </clr-breadcrumb-item>\n <clr-breadcrumb-item *ngFor=\"let breadcrumb of items | slice: -limit : items.length; let isLastItem=last\">\n <span *ngIf=\"isLastItem; else breadcrumbLinks\" aria-current=\"page\">{{ breadcrumb.label }}</span>\n\n <ng-template #breadcrumbLinks>\n <a\n *ngIf=\"breadcrumb.routerLink\"\n [routerLink]=\"breadcrumb.routerLink\"\n [queryParams]=\"breadcrumb.queryParams\"\n [target]=\"breadcrumb.target || '_self'\"\n (click)=\"handleItemClick(breadcrumb)\"\n >\n {{ breadcrumb.label }}\n </a>\n <a\n *ngIf=\"breadcrumb.href\"\n [href]=\"breadcrumb.href\"\n [target]=\"breadcrumb.target || '_self'\"\n (click)=\"handleItemClick(breadcrumb)\"\n >\n {{ breadcrumb.label }}\n </a>\n </ng-template>\n </clr-breadcrumb-item>\n</div>\n", styles: [":root [cds-theme]{--clr-breadcrumb-item-space: var(--cds-global-space-5)}.clr-breadcrumb-menu{display:flex;flex-wrap:wrap;align-items:center}.clr-breadcrumb-menu .clr-breadcrumb-item{display:flex;align-items:center;font-size:var(--cds-alias-typography-secondary-font-size);font-weight:var(--cds-alias-typography-secondary-font-weight);line-height:var(--cds-alias-typography-secondary-line-height);letter-spacing:var(--cds-alias-typography-secondary-letter-spacing)}.clr-breadcrumb-menu .clr-breadcrumb-item a{text-decoration:none;text-align:center;line-height:var(--cds-global-space-9)}.clr-breadcrumb-menu .clr-breadcrumb-item a:visited{color:var(--clr-link-color)}.clr-breadcrumb-menu .clr-breadcrumb-item a:visited:hover{color:var(--clr-link-hover-color)}.clr-breadcrumb-menu .clr-breadcrumb-item:not(:last-child):after{content:\"/\";margin:0 var(--clr-breadcrumb-item-space);color:var(--cds-alias-typography-color-400)}.clr-breadcrumb-menu .clr-breadcrumb-item:last-child{color:var(--cds-alias-typography-color-400)}.clr-breadcrumb-menu .clr-breadcrumb-expand{margin:0;padding:0;gap:0;min-width:-moz-fit-content;min-width:fit-content}\n"] }]
9976
10044
  }], ctorParameters: function () { return [{ type: ClrCommonStringsService }]; }, propDecorators: { items: [{
9977
10045
  type: Input
9978
10046
  }], clrBreadcrumbItemClick: [{
@@ -17180,7 +17248,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17180
17248
  class ClrExpandableAnimationModule {
17181
17249
  }
17182
17250
  ClrExpandableAnimationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
17183
- ClrExpandableAnimationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationModule, declarations: [ClrExpandableAnimation], imports: [CommonModule], exports: [ClrExpandableAnimation] });
17251
+ ClrExpandableAnimationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationModule, declarations: [ClrExpandableAnimation, ClrExpandableAnimationDirective], imports: [CommonModule], exports: [ClrExpandableAnimation, ClrExpandableAnimationDirective] });
17184
17252
  ClrExpandableAnimationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationModule, imports: [CommonModule] });
17185
17253
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationModule, decorators: [{
17186
17254
  type: NgModule,
@@ -17204,7 +17272,7 @@ class CdkDragModule_CdkDrag extends CdkDrag {
17204
17272
  super(elementRef, dropContainer, document, ngZone, viewContainerRef, config, dir, dragDrop, changeDetectorRef);
17205
17273
  }
17206
17274
  }
17207
- CdkDragModule_CdkDrag.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: CdkDragModule_CdkDrag, deps: [{ token: i0.ElementRef }, { token: CDK_DROP_LIST, optional: true }, { token: DOCUMENT, optional: true }, { token: i0.NgZone }, { token: i0.ViewContainerRef }, { token: CDK_DRAG_CONFIG, optional: true }, { token: i1$3.Directionality }, { token: i2.DragDrop }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
17275
+ CdkDragModule_CdkDrag.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: CdkDragModule_CdkDrag, deps: [{ token: i0.ElementRef }, { token: CDK_DROP_LIST, optional: true }, { token: DOCUMENT, optional: true }, { token: i0.NgZone }, { token: i0.ViewContainerRef }, { token: CDK_DRAG_CONFIG, optional: true }, { token: i1$3.Directionality }, { token: i2$1.DragDrop }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
17208
17276
  CdkDragModule_CdkDrag.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: CdkDragModule_CdkDrag, selector: "[cdkDrag]", usesInheritance: true, ngImport: i0 });
17209
17277
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: CdkDragModule_CdkDrag, decorators: [{
17210
17278
  type: Directive,
@@ -17226,7 +17294,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17226
17294
  }, {
17227
17295
  type: Inject,
17228
17296
  args: [CDK_DRAG_CONFIG]
17229
- }] }, { type: i1$3.Directionality }, { type: i2.DragDrop }, { type: i0.ChangeDetectorRef }]; } });
17297
+ }] }, { type: i1$3.Directionality }, { type: i2$1.DragDrop }, { type: i0.ChangeDetectorRef }]; } });
17230
17298
  /**
17231
17299
  * This module allows us to avoid importing all of CdkDragDropModule which results in a smaller application bundle.
17232
17300
  */
@@ -17665,6 +17733,540 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17665
17733
  type: Directive
17666
17734
  }], ctorParameters: function () { return [{ type: FiltersProvider }]; } });
17667
17735
 
17736
+ /*
17737
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
17738
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
17739
+ * This software is released under MIT license.
17740
+ * The full license information can be found in LICENSE in the root directory of this project.
17741
+ */
17742
+ class DefaultKeyNavigationStrategy {
17743
+ constructor(utils) {
17744
+ this.utils = utils;
17745
+ }
17746
+ keyUp(currentCellCoords) {
17747
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17748
+ if (currentCellCoords.y === 0) {
17749
+ return nextCellCoords;
17750
+ }
17751
+ nextCellCoords.y = currentCellCoords.y - 1;
17752
+ const isActionCell = this.utils.isActionCell(currentCellCoords);
17753
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y) &&
17754
+ !isActionCell &&
17755
+ this.utils.isDetailsRow(nextCellCoords.y)) {
17756
+ nextCellCoords.x = 0;
17757
+ }
17758
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
17759
+ if (isActionCell) {
17760
+ nextCellCoords.y = nextCellCoords.y - 1;
17761
+ }
17762
+ else {
17763
+ nextCellCoords.x = nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
17764
+ }
17765
+ }
17766
+ return nextCellCoords;
17767
+ }
17768
+ keyDown(currentCellCoords) {
17769
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17770
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
17771
+ if (currentCellCoords.y >= numOfRows) {
17772
+ return nextCellCoords;
17773
+ }
17774
+ const isActionCell = this.utils.isActionCell(currentCellCoords);
17775
+ nextCellCoords.y = currentCellCoords.y + 1;
17776
+ if (!isActionCell && this.utils.isRowReplaced(nextCellCoords.y)) {
17777
+ nextCellCoords.y = nextCellCoords.y + 1;
17778
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
17779
+ ? 0
17780
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
17781
+ }
17782
+ return nextCellCoords;
17783
+ }
17784
+ keyLeft(currentCellCoords) {
17785
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17786
+ if (currentCellCoords.x === 0) {
17787
+ return nextCellCoords;
17788
+ }
17789
+ nextCellCoords.x = currentCellCoords.x - 1;
17790
+ return nextCellCoords;
17791
+ }
17792
+ keyRight(currentCellCoords) {
17793
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17794
+ // calculate numOfColumns based on header cells.
17795
+ const numOfColumns = this.utils.rows?.length - 1 ? this.utils.getCellsForRow(0).length - 1 : 0;
17796
+ nextCellCoords.x = currentCellCoords.x < numOfColumns ? nextCellCoords.x + 1 : nextCellCoords.x;
17797
+ return nextCellCoords;
17798
+ }
17799
+ keyEnd(currentCellCoords, ctrlKey) {
17800
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17801
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
17802
+ // calculate X based on header cells.
17803
+ nextCellCoords.x = numOfRows ? this.utils.getCellsForRow(0).length - 1 : 0;
17804
+ if (ctrlKey) {
17805
+ nextCellCoords.y = numOfRows;
17806
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
17807
+ nextCellCoords.x = this.utils.getCellsForRow(nextCellCoords.y).length - 1;
17808
+ }
17809
+ }
17810
+ return nextCellCoords;
17811
+ }
17812
+ keyHome(currentCellCoords, ctrlKey) {
17813
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17814
+ nextCellCoords.x = 0;
17815
+ if (ctrlKey) {
17816
+ nextCellCoords.y = 0;
17817
+ }
17818
+ return nextCellCoords;
17819
+ }
17820
+ keyPageUp(currentCellCoords) {
17821
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17822
+ const itemsPerPage = this.utils.itemsPerPage;
17823
+ nextCellCoords.y = currentCellCoords.y - itemsPerPage > 0 ? currentCellCoords.y - itemsPerPage + 1 : 1;
17824
+ if (!this.utils.isActionCell(currentCellCoords)) {
17825
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
17826
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
17827
+ ? 0
17828
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
17829
+ }
17830
+ else if (this.utils.isRowReplaced(nextCellCoords.y)) {
17831
+ nextCellCoords.y = nextCellCoords.y + 1;
17832
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
17833
+ ? 0
17834
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
17835
+ }
17836
+ }
17837
+ else {
17838
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
17839
+ nextCellCoords.y = nextCellCoords.y - 1;
17840
+ }
17841
+ }
17842
+ return nextCellCoords;
17843
+ }
17844
+ keyPageDown(currentCellCoords) {
17845
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17846
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
17847
+ const itemsPerPage = this.utils.itemsPerPage;
17848
+ nextCellCoords.y = currentCellCoords.y + itemsPerPage >= numOfRows ? numOfRows : currentCellCoords.y + itemsPerPage;
17849
+ if (this.utils.isActionCell(currentCellCoords) && this.utils.isDetailsRow(nextCellCoords.y)) {
17850
+ nextCellCoords.y = nextCellCoords.y - 1;
17851
+ }
17852
+ else if (this.utils.isDetailsRow(nextCellCoords.y) && this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
17853
+ nextCellCoords.x = 0;
17854
+ }
17855
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
17856
+ nextCellCoords.x = nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
17857
+ }
17858
+ else if (this.utils.isRowReplaced(nextCellCoords.y)) {
17859
+ nextCellCoords.y = nextCellCoords.y + 1;
17860
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
17861
+ ? 0
17862
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
17863
+ }
17864
+ return nextCellCoords;
17865
+ }
17866
+ }
17867
+
17868
+ /*
17869
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
17870
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
17871
+ * This software is released under MIT license.
17872
+ * The full license information can be found in LICENSE in the root directory of this project.
17873
+ */
17874
+ class ExpandedRowKeyNavigationStrategy extends DefaultKeyNavigationStrategy {
17875
+ constructor(utils) {
17876
+ super(utils);
17877
+ }
17878
+ keyUp(currentCellCoords) {
17879
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17880
+ if (currentCellCoords.y === 0) {
17881
+ return nextCellCoords;
17882
+ }
17883
+ nextCellCoords.y = currentCellCoords.y - 1;
17884
+ if (!this.utils.isActionCell(currentCellCoords)) {
17885
+ if (this.utils.isRowReplaced(currentCellCoords.y)) {
17886
+ nextCellCoords.y = nextCellCoords.y - 1;
17887
+ }
17888
+ switch (true) {
17889
+ case this.utils.isDetailsRow(nextCellCoords.y):
17890
+ nextCellCoords.x = 0;
17891
+ break;
17892
+ case this.utils.isDetailsRow(currentCellCoords.y) === false:
17893
+ nextCellCoords.x = currentCellCoords.x;
17894
+ break;
17895
+ default:
17896
+ nextCellCoords.x = this.utils.actionCellCount(nextCellCoords.y);
17897
+ }
17898
+ }
17899
+ else if (this.utils.isDetailsRow(nextCellCoords.y) && nextCellCoords.y > 0) {
17900
+ nextCellCoords.y = nextCellCoords.y - 1;
17901
+ }
17902
+ return nextCellCoords;
17903
+ }
17904
+ keyDown(currentCellCoords) {
17905
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17906
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
17907
+ if (currentCellCoords.y >= numOfRows) {
17908
+ return nextCellCoords;
17909
+ }
17910
+ nextCellCoords.y = currentCellCoords.y + 1;
17911
+ if (!this.utils.isActionCell(currentCellCoords)) {
17912
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
17913
+ nextCellCoords.y = nextCellCoords.y + 1;
17914
+ }
17915
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
17916
+ nextCellCoords.x = 0;
17917
+ }
17918
+ else {
17919
+ nextCellCoords.x = this.utils.actionCellCount(nextCellCoords.y);
17920
+ }
17921
+ }
17922
+ else {
17923
+ nextCellCoords.y = nextCellCoords.y < numOfRows ? nextCellCoords.y + 1 : nextCellCoords.y;
17924
+ }
17925
+ return nextCellCoords;
17926
+ }
17927
+ keyLeft(currentCellCoords) {
17928
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17929
+ if (!this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isRowReplaced(currentCellCoords.y)) {
17930
+ return super.keyLeft(currentCellCoords);
17931
+ }
17932
+ if (currentCellCoords.x !== 0) {
17933
+ nextCellCoords.x = currentCellCoords.x - 1;
17934
+ }
17935
+ else if (!this.utils.isActionCell(currentCellCoords)) {
17936
+ nextCellCoords.y = currentCellCoords.y - 1;
17937
+ nextCellCoords.x = this.utils.actionCellCount(nextCellCoords.y) - 1;
17938
+ }
17939
+ return nextCellCoords;
17940
+ }
17941
+ keyRight(currentCellCoords) {
17942
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17943
+ if (!this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isRowReplaced(currentCellCoords.y)) {
17944
+ return super.keyRight(currentCellCoords);
17945
+ }
17946
+ // calculate numOfColumns based on header cells.
17947
+ const numOfColumns = this.utils.rows?.length - 1 ? this.utils.getCellsForRow(0).length - 1 : 0;
17948
+ if (currentCellCoords.x >= numOfColumns) {
17949
+ return nextCellCoords;
17950
+ }
17951
+ if (this.utils.isActionCell(currentCellCoords) &&
17952
+ currentCellCoords.x === this.utils.actionCellCount(currentCellCoords.x) - 1 &&
17953
+ this.utils.isRowReplaced(currentCellCoords.y) &&
17954
+ !this.utils.isDetailsRow(currentCellCoords.y)) {
17955
+ nextCellCoords.y = currentCellCoords.y + 1;
17956
+ nextCellCoords.x = 0;
17957
+ }
17958
+ else {
17959
+ nextCellCoords.x = currentCellCoords.x + 1;
17960
+ }
17961
+ return nextCellCoords;
17962
+ }
17963
+ keyEnd(currentCellCoords, ctrlKey) {
17964
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17965
+ if ((!this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isRowReplaced(currentCellCoords.y)) || ctrlKey) {
17966
+ return super.keyEnd(currentCellCoords, ctrlKey);
17967
+ }
17968
+ nextCellCoords.x = this.utils.getCellsForRow(currentCellCoords.y).length - 1;
17969
+ return nextCellCoords;
17970
+ }
17971
+ keyHome(currentCellCoords, ctrlKey) {
17972
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17973
+ if (!this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isRowReplaced(currentCellCoords.y)) {
17974
+ return super.keyHome(currentCellCoords, ctrlKey);
17975
+ }
17976
+ nextCellCoords.x = 0;
17977
+ nextCellCoords.y = currentCellCoords.y - 1;
17978
+ if (ctrlKey) {
17979
+ nextCellCoords.y = 0;
17980
+ }
17981
+ return nextCellCoords;
17982
+ }
17983
+ keyPageUp(currentCellCoords) {
17984
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17985
+ const itemsPerPage = this.utils.itemsPerPage;
17986
+ nextCellCoords.y = currentCellCoords.y - itemsPerPage > 0 ? currentCellCoords.y - itemsPerPage + 1 : 1;
17987
+ if (!this.utils.isActionCell(currentCellCoords)) {
17988
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
17989
+ if (!this.utils.isDetailsRow(nextCellCoords.y)) {
17990
+ nextCellCoords.y = nextCellCoords.y + 1;
17991
+ nextCellCoords.x = 0;
17992
+ }
17993
+ }
17994
+ else if (!this.utils.isDetailsRow(currentCellCoords.y)) {
17995
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
17996
+ nextCellCoords.x = 0;
17997
+ }
17998
+ }
17999
+ else if (this.utils.isDetailsRow(currentCellCoords.y)) {
18000
+ if (!this.utils.isDetailsRow(nextCellCoords.y)) {
18001
+ nextCellCoords.x = this.utils.actionCellCount(nextCellCoords.y);
18002
+ }
18003
+ }
18004
+ }
18005
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18006
+ nextCellCoords.y = nextCellCoords.y - 1;
18007
+ }
18008
+ return nextCellCoords;
18009
+ }
18010
+ keyPageDown(currentCellCoords) {
18011
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18012
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
18013
+ const itemsPerPage = this.utils.itemsPerPage;
18014
+ nextCellCoords.y = currentCellCoords.y + itemsPerPage >= numOfRows ? numOfRows : currentCellCoords.y + itemsPerPage;
18015
+ if (!this.utils.isActionCell(currentCellCoords)) {
18016
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
18017
+ if (nextCellCoords.y < numOfRows && !this.utils.isDetailsRow(nextCellCoords.y)) {
18018
+ nextCellCoords.y = nextCellCoords.y + 1;
18019
+ }
18020
+ }
18021
+ else if (this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18022
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18023
+ }
18024
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18025
+ nextCellCoords.x = 0;
18026
+ }
18027
+ }
18028
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18029
+ nextCellCoords.y = nextCellCoords.y - 1;
18030
+ }
18031
+ return nextCellCoords;
18032
+ }
18033
+ }
18034
+
18035
+ /*
18036
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
18037
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
18038
+ * This software is released under MIT license.
18039
+ * The full license information can be found in LICENSE in the root directory of this project.
18040
+ */
18041
+ class ExpandedColumnsRowKeyNavigationStrategy extends ExpandedRowKeyNavigationStrategy {
18042
+ constructor(utils) {
18043
+ super(utils);
18044
+ }
18045
+ keyUp(currentCellCoords) {
18046
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18047
+ if (currentCellCoords.y === 0) {
18048
+ return nextCellCoords;
18049
+ }
18050
+ nextCellCoords.y = currentCellCoords.y - 1;
18051
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
18052
+ return super.keyUp(currentCellCoords);
18053
+ }
18054
+ const isActionCell = this.utils.isActionCell(currentCellCoords);
18055
+ if (isActionCell && this.utils.isDetailsRow(nextCellCoords.y)) {
18056
+ nextCellCoords.y = nextCellCoords.y - 1;
18057
+ }
18058
+ else if (this.utils.isRowReplaced(nextCellCoords.y)) {
18059
+ nextCellCoords.y = nextCellCoords.y - 1;
18060
+ if (!this.utils.isDetailsRow(nextCellCoords.y)) {
18061
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18062
+ }
18063
+ }
18064
+ else if (this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18065
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18066
+ }
18067
+ else if (!isActionCell && this.utils.isDetailsRow(nextCellCoords.y)) {
18068
+ nextCellCoords.x = currentCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18069
+ }
18070
+ return nextCellCoords;
18071
+ }
18072
+ keyDown(currentCellCoords) {
18073
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18074
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
18075
+ const numOfColumns = numOfRows ? this.utils.getCellsForRow(0).length - 1 : 0;
18076
+ if (currentCellCoords.y >= numOfRows) {
18077
+ return nextCellCoords;
18078
+ }
18079
+ nextCellCoords.y = currentCellCoords.y + 1;
18080
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
18081
+ return super.keyDown(currentCellCoords);
18082
+ }
18083
+ if (!this.utils.isActionCell(currentCellCoords)) {
18084
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
18085
+ nextCellCoords.y = nextCellCoords.y < numOfRows ? nextCellCoords.y + 1 : nextCellCoords.y - 1;
18086
+ }
18087
+ else if (this.utils.getCellsForRow(currentCellCoords.y).length > numOfColumns) {
18088
+ nextCellCoords.x = currentCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18089
+ }
18090
+ else {
18091
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18092
+ }
18093
+ }
18094
+ else {
18095
+ nextCellCoords.y = nextCellCoords.y < numOfRows ? nextCellCoords.y + 1 : nextCellCoords.y - 1;
18096
+ }
18097
+ return nextCellCoords;
18098
+ }
18099
+ keyLeft(currentCellCoords) {
18100
+ return super.keyLeft(currentCellCoords);
18101
+ }
18102
+ keyRight(currentCellCoords) {
18103
+ return super.keyRight(currentCellCoords);
18104
+ }
18105
+ keyEnd(currentCellCoords, ctrlKey) {
18106
+ return super.keyEnd(currentCellCoords, ctrlKey);
18107
+ }
18108
+ keyHome(currentCellCoords, ctrlKey) {
18109
+ return super.keyHome(currentCellCoords, ctrlKey);
18110
+ }
18111
+ keyPageUp(currentCellCoords) {
18112
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18113
+ const itemsPerPage = this.utils.itemsPerPage;
18114
+ nextCellCoords.y = currentCellCoords.y - itemsPerPage > 0 ? currentCellCoords.y - itemsPerPage + 1 : 1;
18115
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
18116
+ return super.keyPageUp(currentCellCoords);
18117
+ }
18118
+ if (!this.utils.isActionCell(currentCellCoords)) {
18119
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
18120
+ if (!this.utils.isDetailsRow(nextCellCoords.y)) {
18121
+ nextCellCoords.y = nextCellCoords.y + 1;
18122
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18123
+ }
18124
+ }
18125
+ else if (this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18126
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18127
+ }
18128
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18129
+ nextCellCoords.x = currentCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18130
+ }
18131
+ }
18132
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18133
+ nextCellCoords.y = nextCellCoords.y - 1;
18134
+ }
18135
+ return nextCellCoords;
18136
+ }
18137
+ keyPageDown(currentCellCoords) {
18138
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18139
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
18140
+ const itemsPerPage = this.utils.itemsPerPage;
18141
+ nextCellCoords.y = currentCellCoords.y + itemsPerPage >= numOfRows ? numOfRows : currentCellCoords.y + itemsPerPage;
18142
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
18143
+ return super.keyPageDown(currentCellCoords);
18144
+ }
18145
+ if (!this.utils.isActionCell(currentCellCoords)) {
18146
+ if (this.utils.isRowReplaced(nextCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18147
+ if (nextCellCoords.y < numOfRows) {
18148
+ nextCellCoords.y = nextCellCoords.y + 1;
18149
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18150
+ }
18151
+ }
18152
+ else if (this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18153
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18154
+ }
18155
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18156
+ nextCellCoords.x = currentCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18157
+ }
18158
+ }
18159
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18160
+ nextCellCoords.y = nextCellCoords.y - 1;
18161
+ }
18162
+ return nextCellCoords;
18163
+ }
18164
+ }
18165
+
18166
+ /*
18167
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
18168
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
18169
+ * This software is released under MIT license.
18170
+ * The full license information can be found in LICENSE in the root directory of this project.
18171
+ */
18172
+ class KeyNavigationUtils {
18173
+ constructor(host, config) {
18174
+ this.host = host;
18175
+ this.config = config;
18176
+ }
18177
+ get grid() {
18178
+ return this.host?.querySelector(this.config.keyGrid);
18179
+ }
18180
+ get rows() {
18181
+ return this.host?.querySelectorAll(this.config.keyGridRows);
18182
+ }
18183
+ get cells() {
18184
+ return this.host?.querySelectorAll(this.config.keyGridCells);
18185
+ }
18186
+ get currentCellCoordinates() {
18187
+ const currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
18188
+ const currentRow = currentCell ? currentCell.closest(this.config.keyGridRows) : null;
18189
+ const coordinates = {
18190
+ x: currentRow && currentCell
18191
+ ? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell)
18192
+ : 0,
18193
+ y: currentRow && currentCell && this.rows ? Array.from(this.rows).indexOf(currentRow) : 0,
18194
+ };
18195
+ return coordinates;
18196
+ }
18197
+ get itemsPerPage() {
18198
+ return Math.floor(this.host?.querySelector('.datagrid').clientHeight / this.rows[0].clientHeight) - 1 || 0;
18199
+ }
18200
+ getNextItemCoordinate(e) {
18201
+ const currentCellCoords = this.currentCellCoordinates;
18202
+ const strategy = this.getNavStrategy(currentCellCoords);
18203
+ const inlineStart = this.host.dir === 'rtl' ? Keys.ArrowRight : Keys.ArrowLeft;
18204
+ const inlineEnd = this.host.dir === 'rtl' ? Keys.ArrowLeft : Keys.ArrowRight;
18205
+ switch (e.key) {
18206
+ case Keys.ArrowUp:
18207
+ return strategy.keyUp(currentCellCoords);
18208
+ case Keys.ArrowDown:
18209
+ return strategy.keyDown(currentCellCoords);
18210
+ case inlineStart:
18211
+ return strategy.keyLeft(currentCellCoords);
18212
+ case inlineEnd:
18213
+ return strategy.keyRight(currentCellCoords);
18214
+ case Keys.Home:
18215
+ return strategy.keyHome(currentCellCoords, e.ctrlKey);
18216
+ case Keys.End:
18217
+ return strategy.keyEnd(currentCellCoords, e.ctrlKey);
18218
+ case Keys.PageUp:
18219
+ return strategy.keyPageUp(currentCellCoords);
18220
+ case Keys.PageDown:
18221
+ return strategy.keyPageDown(currentCellCoords);
18222
+ default:
18223
+ return currentCellCoords;
18224
+ }
18225
+ }
18226
+ getCellsForRow(index) {
18227
+ return this.rows[index].querySelectorAll(this.config.keyGridCells);
18228
+ }
18229
+ isExpandedRow(index) {
18230
+ const selectedElement = this.rows[index].querySelector('.datagrid-row-detail');
18231
+ return selectedElement ? selectedElement.style.display !== 'none' : false;
18232
+ }
18233
+ isDetailsRow(index) {
18234
+ return this.rows[index].classList.contains('datagrid-row-detail');
18235
+ }
18236
+ isRowReplaced(index) {
18237
+ return !!this.rows[index].closest('clr-dg-row.datagrid-row-replaced');
18238
+ }
18239
+ isSingleCellExpandedRow(index) {
18240
+ return this.rows[index]?.querySelectorAll(this.config.keyGridCells).length === 1;
18241
+ }
18242
+ actionCellCount(index) {
18243
+ return this.actionCellsAsArray(index).length;
18244
+ }
18245
+ actionCellsAsArray(index) {
18246
+ return Array.from(this.rows[index].querySelectorAll('.datagrid-row-sticky .datagrid-cell, .datagrid-row-sticky .datagrid-column'));
18247
+ }
18248
+ isActionCell(cellCoords) {
18249
+ return !!this.actionCellsAsArray(cellCoords.y)[cellCoords.x];
18250
+ }
18251
+ createNextCellCoords(cellCoords) {
18252
+ return {
18253
+ x: cellCoords.x,
18254
+ y: cellCoords.y,
18255
+ };
18256
+ }
18257
+ getNavStrategy(currentCellCoords) {
18258
+ switch (true) {
18259
+ case this.isSingleCellExpandedRow(currentCellCoords.y):
18260
+ return new ExpandedRowKeyNavigationStrategy(this);
18261
+ case this.isDetailsRow(currentCellCoords.y):
18262
+ case this.isExpandedRow(currentCellCoords.y):
18263
+ return new ExpandedColumnsRowKeyNavigationStrategy(this);
18264
+ default:
18265
+ return new DefaultKeyNavigationStrategy(this);
18266
+ }
18267
+ }
18268
+ }
18269
+
17668
18270
  /*
17669
18271
  * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
17670
18272
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -17706,15 +18308,6 @@ class KeyNavigationGridController {
17706
18308
  keyGrid: '[role=grid]',
17707
18309
  };
17708
18310
  }
17709
- get grid() {
17710
- return this.host?.querySelector(this.config.keyGrid);
17711
- }
17712
- get rows() {
17713
- return this.host?.querySelectorAll(this.config.keyGridRows);
17714
- }
17715
- get cells() {
17716
- return this.host?.querySelectorAll(this.config.keyGridCells);
17717
- }
17718
18311
  ngOnDestroy() {
17719
18312
  this.destroy$.next();
17720
18313
  this.destroy$.complete();
@@ -17724,33 +18317,33 @@ class KeyNavigationGridController {
17724
18317
  return;
17725
18318
  }
17726
18319
  this.zone.runOutsideAngular(() => {
17727
- fromEvent(this.grid, 'mousedown')
18320
+ fromEvent(this.keyNavUtils.grid, 'mousedown')
17728
18321
  .pipe(takeUntil(this.destroy$))
17729
18322
  .subscribe((e) => {
17730
18323
  // preserve right click for context menus & keyboard mouse control https://apple.stackexchange.com/questions/32715/how-do-i-open-the-context-menu-from-a-mac-keyboard
17731
18324
  if (e.buttons === 1 && !e.ctrlKey) {
17732
- const activeCell = this.cells
17733
- ? Array.from(this.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
18325
+ const activeCell = this.keyNavUtils.cells
18326
+ ? Array.from(this.keyNavUtils.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
17734
18327
  : null;
17735
18328
  if (activeCell) {
17736
18329
  this.setActiveCell(activeCell, { keepFocus: isActionableItem(e.target) });
17737
18330
  }
17738
18331
  }
17739
18332
  });
17740
- fromEvent(this.grid, 'wheel')
18333
+ fromEvent(this.keyNavUtils.grid, 'wheel')
17741
18334
  .pipe(takeUntil(this.destroy$))
17742
18335
  .subscribe(() => {
17743
18336
  this.removeActiveCell();
17744
18337
  });
17745
- fromEvent(this.grid, 'focusout')
18338
+ fromEvent(this.keyNavUtils.grid, 'focusout')
17746
18339
  .pipe(debounceTime(0), takeUntil(this.destroy$))
17747
18340
  .subscribe(() => {
17748
- if (this.grid.contains(document.activeElement)) {
18341
+ if (this.keyNavUtils.grid.contains(document.activeElement)) {
17749
18342
  return;
17750
18343
  }
17751
18344
  this.removeActiveCell();
17752
18345
  });
17753
- fromEvent(this.grid, 'keydown')
18346
+ fromEvent(this.keyNavUtils.grid, 'keydown')
17754
18347
  .pipe(takeUntil(this.destroy$))
17755
18348
  .subscribe((e) => {
17756
18349
  // Skip column resize events
@@ -17766,12 +18359,9 @@ class KeyNavigationGridController {
17766
18359
  e.key === Keys.Home ||
17767
18360
  e.key === Keys.PageUp ||
17768
18361
  e.key === Keys.PageDown) {
17769
- const currentCellCoords = this.getCurrentCellCoordinates();
17770
- const nextCellCoords = this.isExpandedRow(currentCellCoords.y) || this.isDetailsRow(currentCellCoords.y)
17771
- ? this.getNextForExpandedRowCoordinate(e, currentCellCoords)
17772
- : this.getNextItemCoordinate(e, currentCellCoords);
17773
- const activeItem = this.rows
17774
- ? Array.from(this.getCellsForRow(nextCellCoords.y))[nextCellCoords.x]
18362
+ const nextCellCoords = this.keyNavUtils.getNextItemCoordinate(e);
18363
+ const activeItem = this.keyNavUtils.rows
18364
+ ? Array.from(this.keyNavUtils.getCellsForRow(nextCellCoords.y))[nextCellCoords.x]
17775
18365
  : null;
17776
18366
  if (activeItem) {
17777
18367
  this.setActiveCell(activeItem);
@@ -17783,13 +18373,13 @@ class KeyNavigationGridController {
17783
18373
  this.listenersAdded = true;
17784
18374
  }
17785
18375
  initializeKeyGrid(host) {
17786
- this.host = host;
18376
+ this.keyNavUtils = new KeyNavigationUtils(host, this.config);
17787
18377
  this.addListeners();
17788
18378
  this.resetKeyGrid();
17789
18379
  }
17790
18380
  resetKeyGrid() {
17791
- this.cells?.forEach((i) => i.setAttribute('tabindex', '-1'));
17792
- const firstCell = this.cells ? this.cells[0] : null;
18381
+ this.keyNavUtils.cells?.forEach((i) => i.setAttribute('tabindex', '-1'));
18382
+ const firstCell = this.keyNavUtils.cells ? this.keyNavUtils.cells[0] : null;
17793
18383
  firstCell?.setAttribute('tabindex', '0');
17794
18384
  }
17795
18385
  removeActiveCell() {
@@ -17799,7 +18389,9 @@ class KeyNavigationGridController {
17799
18389
  return this._activeCell;
17800
18390
  }
17801
18391
  setActiveCell(activeCell, { keepFocus } = { keepFocus: false }) {
17802
- const prior = this.cells ? Array.from(this.cells).find(c => c.getAttribute('tabindex') === '0') : null;
18392
+ const prior = this.keyNavUtils.cells
18393
+ ? Array.from(this.keyNavUtils.cells).find(c => c.getAttribute('tabindex') === '0')
18394
+ : null;
17803
18395
  if (prior) {
17804
18396
  prior.setAttribute('tabindex', '-1');
17805
18397
  }
@@ -17817,222 +18409,6 @@ class KeyNavigationGridController {
17817
18409
  elementToFocus.focus();
17818
18410
  }
17819
18411
  }
17820
- getNextForExpandedRowCoordinate(e, currentCellCoords) {
17821
- if (e.key === Keys.PageUp || e.key === Keys.PageDown) {
17822
- return this.getNextItemCoordinate(e, currentCellCoords);
17823
- }
17824
- if (!this.isDetailsRow(currentCellCoords.y) &&
17825
- !this.isRowReplaced(currentCellCoords.y) &&
17826
- (e.key === Keys.Home || e.key === Keys.End || e.key === Keys.ArrowRight || e.key === Keys.ArrowLeft)) {
17827
- return this.getNextItemCoordinate(e, currentCellCoords);
17828
- }
17829
- const { numOfRows, numOfColumns, inlineStart, inlineEnd, isActionCell, nextCellCoords } = this.getCalcVariables(currentCellCoords);
17830
- const isSingleCellExpandedRow = this.isSingleCellExpandedRow(currentCellCoords.y);
17831
- if (e.key === Keys.ArrowUp && currentCellCoords.y !== 0) {
17832
- nextCellCoords.y = currentCellCoords.y - 1;
17833
- if (isSingleCellExpandedRow && !isActionCell) {
17834
- if (this.isRowReplaced(currentCellCoords.y)) {
17835
- nextCellCoords.y = nextCellCoords.y - 1;
17836
- }
17837
- if (this.isDetailsRow(nextCellCoords.y)) {
17838
- nextCellCoords.x = 0;
17839
- }
17840
- else if (this.isDetailsRow(currentCellCoords.y) === false) {
17841
- // false check is intentional, the ! operator may be missed easily in this case
17842
- nextCellCoords.x = currentCellCoords.x;
17843
- }
17844
- else {
17845
- nextCellCoords.x = this.actionCellCount(nextCellCoords.y);
17846
- }
17847
- return nextCellCoords;
17848
- }
17849
- if (isActionCell && this.isDetailsRow(nextCellCoords.y)) {
17850
- nextCellCoords.y = nextCellCoords.y - 1;
17851
- }
17852
- else if (this.isRowReplaced(nextCellCoords.y)) {
17853
- nextCellCoords.y = nextCellCoords.y - 1;
17854
- if (!this.isDetailsRow(nextCellCoords.y)) {
17855
- nextCellCoords.x = currentCellCoords.x + this.actionCellCount(nextCellCoords.y);
17856
- }
17857
- }
17858
- else if (this.isDetailsRow(currentCellCoords.y) && !this.isDetailsRow(nextCellCoords.y)) {
17859
- nextCellCoords.x = currentCellCoords.x + this.actionCellCount(nextCellCoords.y);
17860
- }
17861
- else if (!isActionCell && this.isDetailsRow(nextCellCoords.y)) {
17862
- nextCellCoords.x = currentCellCoords.x - this.actionCellCount(currentCellCoords.y);
17863
- }
17864
- }
17865
- else if (e.key === Keys.ArrowDown && currentCellCoords.y < numOfRows) {
17866
- nextCellCoords.y = currentCellCoords.y + 1;
17867
- if (isSingleCellExpandedRow && !isActionCell) {
17868
- if (this.isRowReplaced(nextCellCoords.y)) {
17869
- nextCellCoords.y = nextCellCoords.y + 1;
17870
- }
17871
- if (this.isDetailsRow(nextCellCoords.y)) {
17872
- nextCellCoords.x = 0;
17873
- }
17874
- else {
17875
- nextCellCoords.x = this.actionCellCount(nextCellCoords.y);
17876
- }
17877
- return nextCellCoords;
17878
- }
17879
- if (isActionCell || this.isRowReplaced(nextCellCoords.y)) {
17880
- nextCellCoords.y = nextCellCoords.y + 1;
17881
- }
17882
- else if (this.getCellsForRow(currentCellCoords.y).length > numOfColumns) {
17883
- nextCellCoords.x = currentCellCoords.x - this.actionCellCount(currentCellCoords.y);
17884
- }
17885
- else {
17886
- nextCellCoords.x = currentCellCoords.x + this.actionCellCount(nextCellCoords.y);
17887
- }
17888
- }
17889
- else if (e.key === inlineStart) {
17890
- if (currentCellCoords.x !== 0) {
17891
- nextCellCoords.x = currentCellCoords.x - 1;
17892
- }
17893
- else if (!isActionCell) {
17894
- nextCellCoords.y = currentCellCoords.y - 1;
17895
- nextCellCoords.x = this.actionCellCount(nextCellCoords.y) - 1;
17896
- }
17897
- }
17898
- else if (e.key === inlineEnd && currentCellCoords.x < numOfColumns) {
17899
- if (isActionCell &&
17900
- currentCellCoords.x === this.actionCellCount(currentCellCoords.x) - 1 &&
17901
- this.isRowReplaced(currentCellCoords.y) &&
17902
- !this.isDetailsRow(currentCellCoords.y)) {
17903
- nextCellCoords.y = currentCellCoords.y + 1;
17904
- nextCellCoords.x = 0;
17905
- }
17906
- else {
17907
- nextCellCoords.x = currentCellCoords.x + 1;
17908
- }
17909
- }
17910
- else if (e.key === Keys.End) {
17911
- nextCellCoords.x = this.getCellsForRow(currentCellCoords.y).length - 1;
17912
- if (e.ctrlKey) {
17913
- nextCellCoords.x = numOfColumns;
17914
- nextCellCoords.y = numOfRows;
17915
- }
17916
- }
17917
- else if (e.key === Keys.Home) {
17918
- nextCellCoords.x = 0;
17919
- nextCellCoords.y = currentCellCoords.y - 1;
17920
- if (e.ctrlKey) {
17921
- nextCellCoords.y = 0;
17922
- }
17923
- }
17924
- return nextCellCoords;
17925
- }
17926
- getNextItemCoordinate(e, currentCellCoords) {
17927
- const { numOfRows, numOfColumns, inlineStart, inlineEnd, itemsPerPage, isActionCell, nextCellCoords } = this.getCalcVariables(currentCellCoords);
17928
- if (e.key === Keys.ArrowUp && currentCellCoords.y !== 0) {
17929
- nextCellCoords.y = currentCellCoords.y - 1;
17930
- if (this.isSingleCellExpandedRow(nextCellCoords.y) && !isActionCell && this.isDetailsRow(nextCellCoords.y)) {
17931
- nextCellCoords.x = 0;
17932
- return nextCellCoords;
17933
- }
17934
- if (this.isDetailsRow(nextCellCoords.y)) {
17935
- if (isActionCell) {
17936
- nextCellCoords.y = nextCellCoords.y - 1;
17937
- }
17938
- else {
17939
- nextCellCoords.x = nextCellCoords.x - this.actionCellCount(currentCellCoords.y);
17940
- }
17941
- }
17942
- }
17943
- else if (e.key === Keys.ArrowDown && currentCellCoords.y < numOfRows) {
17944
- nextCellCoords.y = currentCellCoords.y + 1;
17945
- if (this.isSingleCellExpandedRow(nextCellCoords.y) && !isActionCell && this.isRowReplaced(nextCellCoords.y)) {
17946
- nextCellCoords.x = 0;
17947
- nextCellCoords.y = nextCellCoords.y + 1;
17948
- return nextCellCoords;
17949
- }
17950
- if (!isActionCell && this.isRowReplaced(nextCellCoords.y)) {
17951
- nextCellCoords.y = nextCellCoords.y + 1;
17952
- nextCellCoords.x = nextCellCoords.x - this.actionCellCount(currentCellCoords.y);
17953
- }
17954
- }
17955
- else if (e.key === inlineStart && currentCellCoords.x !== 0) {
17956
- nextCellCoords.x = currentCellCoords.x - 1;
17957
- }
17958
- else if (e.key === inlineEnd && currentCellCoords.x < numOfColumns) {
17959
- nextCellCoords.x = currentCellCoords.x + 1;
17960
- }
17961
- else if (e.key === Keys.End) {
17962
- nextCellCoords.x = numOfColumns;
17963
- if (e.ctrlKey) {
17964
- nextCellCoords.y = numOfRows;
17965
- }
17966
- }
17967
- else if (e.key === Keys.Home) {
17968
- nextCellCoords.x = 0;
17969
- if (e.ctrlKey) {
17970
- nextCellCoords.y = 0;
17971
- }
17972
- }
17973
- else if (e.key === Keys.PageUp) {
17974
- nextCellCoords.y = currentCellCoords.y - itemsPerPage > 0 ? currentCellCoords.y - itemsPerPage + 1 : 1;
17975
- }
17976
- else if (e.key === Keys.PageDown) {
17977
- nextCellCoords.y =
17978
- currentCellCoords.y + itemsPerPage < numOfRows ? currentCellCoords.y + itemsPerPage : numOfRows;
17979
- }
17980
- return nextCellCoords;
17981
- }
17982
- getCalcVariables(currentCellCoords) {
17983
- const numOfRows = this.rows ? this.rows.length - 1 : 0;
17984
- // calculate numOfColumns based on header cells.
17985
- const numOfColumns = numOfRows ? this.getCellsForRow(0).length - 1 : 0;
17986
- const dir = this.host.dir;
17987
- const inlineStart = dir === 'rtl' ? Keys.ArrowRight : Keys.ArrowLeft;
17988
- const inlineEnd = dir === 'rtl' ? Keys.ArrowLeft : Keys.ArrowRight;
17989
- const itemsPerPage = Math.floor(this.host?.querySelector('.datagrid').clientHeight / this.rows[0].clientHeight) - 1 || 0;
17990
- const isActionCell = this.isActionCell(currentCellCoords);
17991
- const nextCellCoords = {
17992
- x: currentCellCoords.x,
17993
- y: currentCellCoords.y,
17994
- };
17995
- return { numOfRows, numOfColumns, inlineStart, inlineEnd, itemsPerPage, isActionCell, nextCellCoords };
17996
- }
17997
- getCurrentCellCoordinates() {
17998
- const currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
17999
- const currentRow = currentCell ? currentCell.closest(this.config.keyGridRows) : null;
18000
- const coordinates = {
18001
- x: currentRow && currentCell
18002
- ? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell)
18003
- : 0,
18004
- y: currentRow && currentCell && this.rows ? Array.from(this.rows).indexOf(currentRow) : 0,
18005
- };
18006
- return coordinates;
18007
- }
18008
- getCellsForRow(index) {
18009
- return this.rows[index].querySelectorAll(this.config.keyGridCells);
18010
- }
18011
- isExpandedRow(index) {
18012
- const selectedElement = this.rows[index].querySelector('.datagrid-row-detail');
18013
- return selectedElement ? selectedElement.style.display !== 'none' : false;
18014
- }
18015
- isDetailsRow(index) {
18016
- return this.rows[index].classList.contains('datagrid-row-detail');
18017
- }
18018
- isRowReplaced(index) {
18019
- return !!this.rows[index].closest('clr-dg-row.datagrid-row-replaced');
18020
- }
18021
- isSingleCellExpandedRow(index) {
18022
- const row = this.rows[index].classList.contains('datagrid-row-detail')
18023
- ? this.rows[index]
18024
- : this.rows[index].querySelector('.datagrid-row-detail');
18025
- return row?.querySelectorAll(this.config.keyGridCells).length === 1;
18026
- }
18027
- actionCellCount(index) {
18028
- return this.actionCellsAsArray(index).length;
18029
- }
18030
- actionCellsAsArray(index) {
18031
- return Array.from(this.rows[index].querySelectorAll('.datagrid-row-sticky .datagrid-cell, .datagrid-row-sticky .datagrid-column'));
18032
- }
18033
- isActionCell(cellCoords) {
18034
- return !!this.actionCellsAsArray(cellCoords.y)[cellCoords.x];
18035
- }
18036
18412
  }
18037
18413
  KeyNavigationGridController.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
18038
18414
  KeyNavigationGridController.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController });
@@ -19730,18 +20106,14 @@ class ClrDatagridColumn extends DatagridFilterRegistrar {
19730
20106
  if (typeof comparator === 'string') {
19731
20107
  this._sortBy = new DatagridPropertyComparator(comparator);
19732
20108
  }
20109
+ else if (comparator) {
20110
+ this._sortBy = comparator;
20111
+ }
20112
+ else if (this.field) {
20113
+ this._sortBy = new DatagridPropertyComparator(this.field);
20114
+ }
19733
20115
  else {
19734
- if (comparator) {
19735
- this._sortBy = comparator;
19736
- }
19737
- else {
19738
- if (this.field) {
19739
- this._sortBy = new DatagridPropertyComparator(this.field);
19740
- }
19741
- else {
19742
- delete this._sortBy;
19743
- }
19744
- }
20116
+ delete this._sortBy;
19745
20117
  }
19746
20118
  }
19747
20119
  get sortOrder() {
@@ -20124,6 +20496,10 @@ class Items {
20124
20496
  this._pageSub.unsubscribe();
20125
20497
  }
20126
20498
  }
20499
+ smartenDown() {
20500
+ this._smart = false;
20501
+ this.destroy();
20502
+ }
20127
20503
  smartenUp() {
20128
20504
  this._smart = true;
20129
20505
  /*
@@ -21125,6 +21501,16 @@ class ClrDatagridRow {
21125
21501
  }
21126
21502
  if (viewChange === DatagridDisplayMode.CALCULATE) {
21127
21503
  this.displayCells = false;
21504
+ // Inserts a fixed cell if any of these conditions are true.
21505
+ const fixedCellConditions = [
21506
+ this.selection.selectionType !== this.SELECTION_TYPE.None,
21507
+ this.rowActionService.hasActionableRow,
21508
+ this.globalExpandable.hasExpandableRow,
21509
+ this.detailService.enabled,
21510
+ ];
21511
+ fixedCellConditions
21512
+ .filter(Boolean)
21513
+ .forEach(() => this._calculatedCells.insert(this._fixedCellTemplate.createEmbeddedView(null)));
21128
21514
  this.dgCells.forEach(cell => {
21129
21515
  if (!cell._view.destroyed) {
21130
21516
  this._calculatedCells.insert(cell._view);
@@ -21166,7 +21552,7 @@ class ClrDatagridRow {
21166
21552
  * selection browser functionality, which is inconsistently implemented in browsers anyway.
21167
21553
  */
21168
21554
  clearRanges(event) {
21169
- if (event.shiftKey) {
21555
+ if (this.selection.rowSelectionMode && event.shiftKey) {
21170
21556
  this.document.getSelection().removeAllRanges();
21171
21557
  // Firefox is too persistent about its text-selection behaviour. So we need to add a preventDefault();
21172
21558
  // We should not try to enforce this on the other browsers, though, because their toggle cycle does not get canceled by
@@ -21183,7 +21569,7 @@ class ClrDatagridRow {
21183
21569
  selectRow(selected = !this.selected, $event) {
21184
21570
  // The label also captures clicks that bubble up to the row event listener, causing
21185
21571
  // this handler to run twice. This exits early to prevent toggling the checkbox twice.
21186
- if ($event.target.tagName === 'LABEL') {
21572
+ if (!this.selection.rowSelectionMode || $event.target.tagName === 'LABEL') {
21187
21573
  return;
21188
21574
  }
21189
21575
  if (this.selection.selectionType === this.SELECTION_TYPE.Single) {
@@ -21222,7 +21608,7 @@ ClrDatagridRow.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version
21222
21608
  DatagridIfExpandService,
21223
21609
  { provide: IfExpandService, useExisting: DatagridIfExpandService },
21224
21610
  { provide: LoadingListener, useExisting: DatagridIfExpandService },
21225
- ], 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 <clr-dg-cell class=\"skeleton-loading\" *ngIf=\"skeletonLoading\"></clr-dg-cell>\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: "component", type: ClrDatagridCell, selector: "clr-dg-cell" }, { kind: "directive", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select" }, { kind: "directive", type: DatagridCellRenderer, selector: "clr-dg-cell" }] });
21611
+ ], queries: [{ propertyName: "dgCells", predicate: ClrDatagridCell }], viewQueries: [{ propertyName: "expandAnimation", first: true, predicate: ClrExpandableAnimationDirective, 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 }, { propertyName: "_fixedCellTemplate", first: true, predicate: ["fixedCellTemplate"], descendants: true }], ngImport: i0, template: "<div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [clrExpandableAnimation]=\"expandAnimationTrigger\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n [class.datagrid-row-clickable]=\"selection.rowSelectionMode\"\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 <clr-dg-cell class=\"skeleton-loading\" *ngIf=\"skeletonLoading\"></clr-dg-cell>\n</div>\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-container #calculatedCells></ng-container>\n\n<ng-template #fixedCellTemplate>\n <div class=\"datagrid-fixed-column datagrid-cell\" role=\"gridcell\"></div>\n</ng-template>\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: "directive", type: ClrExpandableAnimationDirective, selector: "[clrExpandableAnimation]", inputs: ["clrExpandableAnimation"] }, { kind: "component", type: ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }, { kind: "component", type: ClrDatagridCell, selector: "clr-dg-cell" }, { kind: "directive", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select" }, { kind: "directive", type: DatagridCellRenderer, selector: "clr-dg-cell" }] });
21226
21612
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridRow, decorators: [{
21227
21613
  type: Component,
21228
21614
  args: [{ selector: 'clr-dg-row', host: {
@@ -21235,7 +21621,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21235
21621
  DatagridIfExpandService,
21236
21622
  { provide: IfExpandService, useExisting: DatagridIfExpandService },
21237
21623
  { provide: LoadingListener, useExisting: DatagridIfExpandService },
21238
- ], 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 <clr-dg-cell class=\"skeleton-loading\" *ngIf=\"skeletonLoading\"></clr-dg-cell>\n </div>\n</ng-template>\n\n<ng-container #calculatedCells></ng-container>\n" }]
21624
+ ], template: "<div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [clrExpandableAnimation]=\"expandAnimationTrigger\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n [class.datagrid-row-clickable]=\"selection.rowSelectionMode\"\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 <clr-dg-cell class=\"skeleton-loading\" *ngIf=\"skeletonLoading\"></clr-dg-cell>\n</div>\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-container #calculatedCells></ng-container>\n\n<ng-template #fixedCellTemplate>\n <div class=\"datagrid-fixed-column datagrid-cell\" role=\"gridcell\"></div>\n</ng-template>\n" }]
21239
21625
  }], ctorParameters: function () { return [{ type: Selection }, { type: RowActionService }, { type: ExpandableRowsCount }, { type: DatagridIfExpandService }, { type: DetailService }, { type: DisplayModeService }, { type: i0.ViewContainerRef }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: ClrCommonStringsService }, { type: Items }, { type: undefined, decorators: [{
21240
21626
  type: Inject,
21241
21627
  args: [DOCUMENT]
@@ -21259,7 +21645,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21259
21645
  args: [ClrDatagridCell]
21260
21646
  }], expandAnimation: [{
21261
21647
  type: ViewChild,
21262
- args: [ClrExpandableAnimation]
21648
+ args: [ClrExpandableAnimationDirective]
21263
21649
  }], detailButton: [{
21264
21650
  type: ViewChild,
21265
21651
  args: ['detailButton']
@@ -21272,6 +21658,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21272
21658
  }], _calculatedCells: [{
21273
21659
  type: ViewChild,
21274
21660
  args: ['calculatedCells', { read: ViewContainerRef }]
21661
+ }], _fixedCellTemplate: [{
21662
+ type: ViewChild,
21663
+ args: ['fixedCellTemplate']
21275
21664
  }], item: [{
21276
21665
  type: Input,
21277
21666
  args: ['clrDgItem']
@@ -21472,6 +21861,12 @@ class ClrDatagridVirtualScrollDirective {
21472
21861
  this.updateFixedSizeVirtualScrollInputs();
21473
21862
  }
21474
21863
  set dataRange(range) {
21864
+ if (!range) {
21865
+ return;
21866
+ }
21867
+ if (this.items.smart) {
21868
+ this.items.smartenDown();
21869
+ }
21475
21870
  this.totalItems = range.total;
21476
21871
  this.updateDataRange(range.skip, range.data);
21477
21872
  }
@@ -21479,11 +21874,7 @@ class ClrDatagridVirtualScrollDirective {
21479
21874
  return this._totalItems;
21480
21875
  }
21481
21876
  set totalItems(value) {
21482
- if (this._totalItems === value) {
21483
- return;
21484
- }
21485
21877
  this._totalItems = value;
21486
- this.populatePlaceholderData();
21487
21878
  }
21488
21879
  ngAfterViewInit() {
21489
21880
  this.injector.runInContext(() => {
@@ -21494,7 +21885,9 @@ class ClrDatagridVirtualScrollDirective {
21494
21885
  this.gridRoleElement = this.datagridElementRef.nativeElement.querySelector('[role="grid"]');
21495
21886
  this.updateCdkVirtualForInputs();
21496
21887
  this.subscriptions.push(this.items.change.subscribe(newItems => {
21497
- this.cdkVirtualFor.cdkVirtualForOf = newItems;
21888
+ if (this.items.smart) {
21889
+ this.cdkVirtualFor.cdkVirtualForOf = newItems;
21890
+ }
21498
21891
  }), this.cdkVirtualFor.dataStream.subscribe(data => {
21499
21892
  this.updateAriaRowCount(data.length);
21500
21893
  }), this.virtualScrollViewport.scrolledIndexChange.subscribe(index => {
@@ -21530,16 +21923,13 @@ class ClrDatagridVirtualScrollDirective {
21530
21923
  scrollToIndex(index, behavior = 'auto') {
21531
21924
  this.virtualScrollViewport?.scrollToIndex(index, behavior);
21532
21925
  }
21533
- populatePlaceholderData() {
21534
- this.cdkVirtualForOf = Array(this.totalItems);
21535
- }
21536
21926
  updateDataRange(skip, data) {
21537
- if (!this.persistItems) {
21538
- this.populatePlaceholderData();
21927
+ let items = this.cdkVirtualForOf;
21928
+ if (!this.persistItems || !items || items?.length !== this.totalItems) {
21929
+ items = Array(this.totalItems);
21539
21930
  }
21540
- const items = this.items.all;
21541
21931
  items.splice(skip, data.length, ...data);
21542
- this.items.all = items;
21932
+ this.cdkVirtualForOf = Array.from(items);
21543
21933
  }
21544
21934
  updateCdkVirtualForInputs() {
21545
21935
  if (this.cdkVirtualFor) {
@@ -21598,7 +21988,7 @@ class ClrDatagridVirtualScrollDirective {
21598
21988
  return virtualScrollViewport;
21599
21989
  }
21600
21990
  }
21601
- 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 });
21991
+ 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 }, { 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: forwardRef(() => ClrDatagrid) }, { token: ColumnsService }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Directive });
21602
21992
  ClrDatagridVirtualScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridVirtualScrollDirective, selector: "[clrVirtualScroll],[ClrVirtualScroll]", inputs: { persistItems: ["clrVirtualPersistItems", "persistItems"], cdkVirtualForOf: ["clrVirtualRowsOf", "cdkVirtualForOf"], cdkVirtualForTrackBy: ["clrVirtualRowsTrackBy", "cdkVirtualForTrackBy"], cdkVirtualForTemplate: ["clrVirtualRowsTemplate", "cdkVirtualForTemplate"], cdkVirtualForTemplateCacheSize: ["clrVirtualRowsTemplateCacheSize", "cdkVirtualForTemplateCacheSize"], itemSize: ["clrVirtualRowsItemSize", "itemSize"], minBufferPx: ["clrVirtualRowsMinBufferPx", "minBufferPx"], maxBufferPx: ["clrVirtualRowsMaxBufferPx", "maxBufferPx"], dataRange: ["clrVirtualDataRange", "dataRange"] }, outputs: { renderedRangeChange: "renderedRangeChange" }, providers: [Items], ngImport: i0 });
21603
21993
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, decorators: [{
21604
21994
  type: Directive,
@@ -21606,9 +21996,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21606
21996
  selector: '[clrVirtualScroll],[ClrVirtualScroll]',
21607
21997
  providers: [Items],
21608
21998
  }]
21609
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.IterableDiffers }, { type: Items, decorators: [{
21610
- type: SkipSelf
21611
- }] }, { 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 }]; }, propDecorators: { renderedRangeChange: [{
21999
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.IterableDiffers }, { type: Items }, { 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, decorators: [{
22000
+ type: Inject,
22001
+ args: [forwardRef(() => ClrDatagrid)]
22002
+ }] }, { type: ColumnsService }, { type: i0.EnvironmentInjector }]; }, propDecorators: { renderedRangeChange: [{
21612
22003
  type: Output
21613
22004
  }], persistItems: [{
21614
22005
  type: Input,
@@ -21846,6 +22237,11 @@ class ClrDatagrid {
21846
22237
  * Output emitted whenever the data needs to be refreshed, based on user action or external ones
21847
22238
  */
21848
22239
  this.refresh = new EventEmitter(false);
22240
+ /**
22241
+ * The application can provide custom select all logic.
22242
+ */
22243
+ this.customSelectAllEnabled = false;
22244
+ this.customSelectAll = new EventEmitter();
21849
22245
  /* reference to the enum so that template can access */
21850
22246
  this.SELECTION_TYPE = SelectionType;
21851
22247
  /**
@@ -21912,13 +22308,18 @@ class ClrDatagrid {
21912
22308
  get allSelected() {
21913
22309
  return this.selection.isAllSelected();
21914
22310
  }
21915
- set allSelected(_value) {
21916
- /**
21917
- * This is a setter but we ignore the value.
21918
- * It's strange, but it lets us have an indeterminate state where only
21919
- * some of the items are selected.
21920
- */
21921
- this.selection.toggleAll();
22311
+ set allSelected(value) {
22312
+ if (this.customSelectAllEnabled) {
22313
+ this.customSelectAll.emit(value);
22314
+ }
22315
+ else {
22316
+ /**
22317
+ * This is a setter but we ignore the value.
22318
+ * It's strange, but it lets us have an indeterminate state where only
22319
+ * some of the items are selected.
22320
+ */
22321
+ this.selection.toggleAll();
22322
+ }
21922
22323
  }
21923
22324
  ngAfterContentInit() {
21924
22325
  if (!this.items.smart) {
@@ -21964,7 +22365,7 @@ class ClrDatagrid {
21964
22365
  this.updateDetailState();
21965
22366
  // TODO: determine if we can get rid of provider wiring in view init so that subscriptions can be done earlier
21966
22367
  this.refresh.emit(this.stateProvider.state);
21967
- this._subscriptions.push(this.stateProvider.change.subscribe(state => this.refresh.emit(state)), this.selection.change.subscribe(s => {
22368
+ this._subscriptions.push(this.stickyHeaders.changes.subscribe(() => this.resize()), this.stateProvider.change.subscribe(state => this.refresh.emit(state)), this.selection.change.subscribe(s => {
21968
22369
  if (this.selection.selectionType === SelectionType.Single) {
21969
22370
  this.singleSelectedChanged.emit(s);
21970
22371
  }
@@ -22010,6 +22411,15 @@ class ClrDatagrid {
22010
22411
  else {
22011
22412
  // Set state, style for the datagrid to CALCULATE and insert row & columns into containers
22012
22413
  this.renderer.addClass(this.el.nativeElement, 'datagrid-calculate-mode');
22414
+ // Inserts a fixed column if any of these conditions are true.
22415
+ const fixedColumnConditions = [
22416
+ this.rowActionService.hasActionableRow,
22417
+ this.selection.selectionType !== this.SELECTION_TYPE.None,
22418
+ this.expandableRows.hasExpandableRow || this.detailService.enabled,
22419
+ ];
22420
+ fixedColumnConditions
22421
+ .filter(Boolean)
22422
+ .forEach(() => this._projectedCalculationColumns.insert(this._fixedColumnTemplate.createEmbeddedView(null)));
22013
22423
  this.columns.forEach(column => {
22014
22424
  this._projectedCalculationColumns.insert(column._view);
22015
22425
  });
@@ -22037,10 +22447,7 @@ class ClrDatagrid {
22037
22447
  }
22038
22448
  toggleAllSelected($event) {
22039
22449
  $event.preventDefault();
22040
- if (this.virtualScroll) {
22041
- return;
22042
- }
22043
- this.allSelected = !this.allSelected;
22450
+ this.selectAllCheckbox?.nativeElement.click();
22044
22451
  }
22045
22452
  resize() {
22046
22453
  this.organizer.resize();
@@ -22076,7 +22483,7 @@ class ClrDatagrid {
22076
22483
  }
22077
22484
  }
22078
22485
  ClrDatagrid.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagrid, deps: [{ token: DatagridRenderOrganizer }, { token: Items }, { token: ExpandableRowsCount }, { token: Selection }, { token: RowActionService }, { token: StateProvider }, { token: DisplayModeService }, { token: i0.Renderer2 }, { token: DetailService }, { token: DOCUMENT }, { token: i0.ElementRef }, { token: Page }, { token: ClrCommonStringsService }, { token: KeyNavigationGridController }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
22079
- ClrDatagrid.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagrid, selector: "clr-datagrid", inputs: { loadingMoreItems: ["clrLoadingMoreItems", "loadingMoreItems"], clrDgSingleSelectionAriaLabel: "clrDgSingleSelectionAriaLabel", clrDgSingleActionableAriaLabel: "clrDgSingleActionableAriaLabel", clrDetailExpandableAriaLabel: "clrDetailExpandableAriaLabel", clrDgDisablePageFocus: "clrDgDisablePageFocus", loading: ["clrDgLoading", "loading"], selected: ["clrDgSelected", "selected"], singleSelected: ["clrDgSingleSelected", "singleSelected"], clrDgPreserveSelection: "clrDgPreserveSelection", rowSelectionMode: ["clrDgRowSelection", "rowSelectionMode"], trackBy: ["clrDgItemsTrackBy", "trackBy"] }, outputs: { selectedChanged: "clrDgSelectedChange", singleSelectedChanged: "clrDgSingleSelectedChange", refresh: "clrDgRefresh" }, host: { properties: { "class.datagrid-host": "true", "class.datagrid-detail-open": "detailService.isOpen" } }, providers: [
22486
+ ClrDatagrid.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagrid, selector: "clr-datagrid", inputs: { loadingMoreItems: ["clrLoadingMoreItems", "loadingMoreItems"], clrDgSingleSelectionAriaLabel: "clrDgSingleSelectionAriaLabel", clrDgSingleActionableAriaLabel: "clrDgSingleActionableAriaLabel", clrDetailExpandableAriaLabel: "clrDetailExpandableAriaLabel", clrDgDisablePageFocus: "clrDgDisablePageFocus", customSelectAllEnabled: ["clrDgCustomSelectAllEnabled", "customSelectAllEnabled"], loading: ["clrDgLoading", "loading"], selected: ["clrDgSelected", "selected"], singleSelected: ["clrDgSingleSelected", "singleSelected"], clrDgPreserveSelection: "clrDgPreserveSelection", rowSelectionMode: ["clrDgRowSelection", "rowSelectionMode"], trackBy: ["clrDgItemsTrackBy", "trackBy"] }, outputs: { selectedChanged: "clrDgSelectedChange", singleSelectedChanged: "clrDgSingleSelectedChange", refresh: "clrDgRefresh", customSelectAll: "clrDgCustomSelectAll" }, host: { properties: { "class.datagrid-host": "true", "class.datagrid-detail-open": "detailService.isOpen" } }, providers: [
22080
22487
  Selection,
22081
22488
  Sort,
22082
22489
  FiltersProvider,
@@ -22092,7 +22499,7 @@ ClrDatagrid.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
22092
22499
  ColumnsService,
22093
22500
  DisplayModeService,
22094
22501
  KeyNavigationGridController,
22095
- ], 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", "clrDgSkeletonLoading", "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" }] });
22502
+ ], 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 }, { propertyName: "_fixedColumnTemplate", first: true, predicate: ["fixedColumnTemplate"], descendants: true }, { propertyName: "selectAllCheckbox", first: true, predicate: ["selectAllCheckbox"], descendants: true }, { propertyName: "stickyHeaders", predicate: ["stickyHeader"], 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<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 #stickyHeader\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 || customSelectAllEnabled\" 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 #selectAllCheckbox\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 #stickyHeader\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 #stickyHeader\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 #stickyHeader\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\n<ng-template #fixedColumnTemplate>\n <div class=\"datagrid-column datagrid-fixed-column\"></div>\n</ng-template>\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", "clrDgSkeletonLoading", "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" }] });
22096
22503
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagrid, decorators: [{
22097
22504
  type: Component,
22098
22505
  args: [{ selector: 'clr-datagrid', providers: [
@@ -22114,7 +22521,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22114
22521
  ], host: {
22115
22522
  '[class.datagrid-host]': 'true',
22116
22523
  '[class.datagrid-detail-open]': 'detailService.isOpen',
22117
- }, 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" }]
22524
+ }, 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 #stickyHeader\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 || customSelectAllEnabled\" 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 #selectAllCheckbox\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 #stickyHeader\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 #stickyHeader\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 #stickyHeader\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\n<ng-template #fixedColumnTemplate>\n <div class=\"datagrid-column datagrid-fixed-column\"></div>\n</ng-template>\n" }]
22118
22525
  }], ctorParameters: function () { return [{ type: DatagridRenderOrganizer }, { type: Items }, { type: ExpandableRowsCount }, { type: Selection }, { type: RowActionService }, { type: StateProvider }, { type: DisplayModeService }, { type: i0.Renderer2 }, { type: DetailService }, { type: undefined, decorators: [{
22119
22526
  type: Inject,
22120
22527
  args: [DOCUMENT]
@@ -22138,6 +22545,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22138
22545
  }], refresh: [{
22139
22546
  type: Output,
22140
22547
  args: ['clrDgRefresh']
22548
+ }], customSelectAllEnabled: [{
22549
+ type: Input,
22550
+ args: ['clrDgCustomSelectAllEnabled']
22551
+ }], customSelectAll: [{
22552
+ type: Output,
22553
+ args: ['clrDgCustomSelectAll']
22141
22554
  }], virtualScroll: [{
22142
22555
  type: ContentChild,
22143
22556
  args: [ClrDatagridVirtualScrollDirective]
@@ -22174,6 +22587,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22174
22587
  }], _calculationRows: [{
22175
22588
  type: ViewChild,
22176
22589
  args: ['calculationRows', { read: ViewContainerRef }]
22590
+ }], _fixedColumnTemplate: [{
22591
+ type: ViewChild,
22592
+ args: ['fixedColumnTemplate']
22593
+ }], stickyHeaders: [{
22594
+ type: ViewChildren,
22595
+ args: ['stickyHeader', { emitDistinctChangesOnly: true }]
22596
+ }], selectAllCheckbox: [{
22597
+ type: ViewChild,
22598
+ args: ['selectAllCheckbox']
22177
22599
  }], loading: [{
22178
22600
  type: Input,
22179
22601
  args: ['clrDgLoading']
@@ -26468,7 +26890,7 @@ class ClrModal {
26468
26890
  }
26469
26891
  }
26470
26892
  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 });
26471
- 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: [
26893
+ 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" } }, queries: [{ propertyName: "modalContentTemplate", first: true, predicate: ["clrInternalModalContentTemplate"], descendants: true }], 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 <!-- This wizard is tightly coupled to the modal styles, so changes here could require changes in the wizard. -->\n <div *ngIf=\"!modalContentTemplate; else modalContentTemplate\" class=\"modal-content-wrapper\">\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: [
26472
26894
  trigger('fadeMove', [
26473
26895
  transition('* => fadeDown', [
26474
26896
  style({ opacity: 0, transform: 'translate(0, -25%)' }),
@@ -26503,7 +26925,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26503
26925
  transition('void => *', [style({ opacity: 0 }), animate('0.2s ease-in-out', style({ opacity: 0.85 }))]),
26504
26926
  transition('* => void', [animate('0.2s ease-in-out', style({ opacity: 0 }))]),
26505
26927
  ]),
26506
- ], 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"] }]
26928
+ ], 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 <!-- This wizard is tightly coupled to the modal styles, so changes here could require changes in the wizard. -->\n <div *ngIf=\"!modalContentTemplate; else modalContentTemplate\" class=\"modal-content-wrapper\">\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"] }]
26507
26929
  }], ctorParameters: function () { return [{ type: ScrollingService }, { type: ClrCommonStringsService }, { type: ModalStackService }, { type: ClrModalConfigurationService }]; }, propDecorators: { title: [{
26508
26930
  type: ViewChild,
26509
26931
  args: ['title']
@@ -26543,6 +26965,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26543
26965
  }], bypassScrollService: [{
26544
26966
  type: Input,
26545
26967
  args: ['clrModalOverrideScrollService']
26968
+ }], modalContentTemplate: [{
26969
+ type: ContentChild,
26970
+ args: ['clrInternalModalContentTemplate']
26546
26971
  }], bodyElementRef: [{
26547
26972
  type: ViewChild,
26548
26973
  args: ['body']
@@ -29410,6 +29835,15 @@ class ClrWizard {
29410
29835
  * Set the modal size of the wizard. Set using `[clrWizardSize]` input.
29411
29836
  */
29412
29837
  this.size = 'xl';
29838
+ /**
29839
+ * Enable "in page" wizard. Set using `[clrWizardInPage]` input.
29840
+ */
29841
+ this.inPage = false;
29842
+ /**
29843
+ * Make an "in page" wizard fill the `.content-area`. Set using `[clrWizardInPageFillContentArea]` input.
29844
+ * If you can't use this option, you will likely need to provide custom CSS to set the wizard's height and margins.
29845
+ */
29846
+ this.inPageFillContentArea = false;
29413
29847
  /**
29414
29848
  * Tells the modal part of the wizard whether it should have a close "X"
29415
29849
  * in the top right corner. Set using `[clrWizardClosable]` input.
@@ -29568,6 +30002,9 @@ class ClrWizard {
29568
30002
  ngAfterContentInit() {
29569
30003
  this.pageCollection.pages = this.pages;
29570
30004
  this.headerActionService.wizardHeaderActions = this.headerActions;
30005
+ if (this.inPage) {
30006
+ this.open();
30007
+ }
29571
30008
  this.initializeButtons();
29572
30009
  }
29573
30010
  ngDoCheck() {
@@ -29762,7 +30199,7 @@ class ClrWizard {
29762
30199
  this.pageTitle?.nativeElement.focus();
29763
30200
  this.currentPageChanged.emit();
29764
30201
  // scroll to top of page in case there is long page content
29765
- this.modal?.scrollTop();
30202
+ this.bodyElementRef?.nativeElement.scrollTo(0, 0);
29766
30203
  });
29767
30204
  }
29768
30205
  updateNavOnPageChanges() {
@@ -29786,7 +30223,7 @@ class ClrWizard {
29786
30223
  }
29787
30224
  }
29788
30225
  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 });
29789
- 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"] }] });
30226
+ ClrWizard.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrWizard, selector: "clr-wizard", inputs: { stepnavAriaLabel: ["clrWizardStepnavAriaLabel", "stepnavAriaLabel"], size: ["clrWizardSize", "size"], inPage: ["clrWizardInPage", "inPage"], inPageFillContentArea: ["clrWizardInPageFillContentArea", "inPageFillContentArea"], 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.wizard-in-page": "inPage", "class.wizard-in-page--fill-content-area": "inPage && inPageFillContentArea" } }, 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: "bodyElementRef", first: true, predicate: ["body"], 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<ng-container *ngIf=\"inPage; then wizardTemplate; else wizardModalTemplate\"></ng-container>\n\n<ng-template #wizardModalTemplate>\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 <ng-template #clrInternalModalContentTemplate>\n <ng-container [ngTemplateOutlet]=\"wizardTemplate\"></ng-container>\n </ng-template>\n </clr-modal>\n</ng-template>\n\n<!-- This template is tightly coupled to the modal styles. -->\n<ng-template #wizardTemplate>\n <div class=\"modal-content-wrapper\">\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-content\">\n <div class=\"modal-header--accessible\">\n <div class=\"modal-title-wrapper\" #title cdkFocusInitial tabindex=\"-1\">\n <div\n class=\"modal-title\"\n role=\"heading\"\n [attr.aria-level]=\"navService.currentPage?.pageTitle.headingLevel || 2\"\n >\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 </div>\n <button\n *ngIf=\"closable && !inPage\"\n type=\"button\"\n class=\"close\"\n [attr.aria-label]=\"commonStrings.keys.close\"\n (click)=\"modalCancel()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div #body class=\"modal-body-wrapper\">\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>\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 </div>\n </div>\n</ng-template>\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: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "component", type: ClrWizardStepnav, selector: "clr-wizard-stepnav", inputs: ["label"] }] });
29790
30227
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrWizard, decorators: [{
29791
30228
  type: Component,
29792
30229
  args: [{ selector: 'clr-wizard', providers: [WizardNavigationService, PageCollectionService, ButtonHubService, HeaderActionService], host: {
@@ -29794,8 +30231,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
29794
30231
  '[class.wizard-md]': "size == 'md'",
29795
30232
  '[class.wizard-lg]': "size == 'lg'",
29796
30233
  '[class.wizard-xl]': "size == 'xl'",
29797
- '[class.lastPage]': 'navService.currentPageIsLast',
29798
- }, 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" }]
30234
+ '[class.wizard-in-page]': 'inPage',
30235
+ '[class.wizard-in-page--fill-content-area]': 'inPage && inPageFillContentArea',
30236
+ }, 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-container *ngIf=\"inPage; then wizardTemplate; else wizardModalTemplate\"></ng-container>\n\n<ng-template #wizardModalTemplate>\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 <ng-template #clrInternalModalContentTemplate>\n <ng-container [ngTemplateOutlet]=\"wizardTemplate\"></ng-container>\n </ng-template>\n </clr-modal>\n</ng-template>\n\n<!-- This template is tightly coupled to the modal styles. -->\n<ng-template #wizardTemplate>\n <div class=\"modal-content-wrapper\">\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-content\">\n <div class=\"modal-header--accessible\">\n <div class=\"modal-title-wrapper\" #title cdkFocusInitial tabindex=\"-1\">\n <div\n class=\"modal-title\"\n role=\"heading\"\n [attr.aria-level]=\"navService.currentPage?.pageTitle.headingLevel || 2\"\n >\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 </div>\n <button\n *ngIf=\"closable && !inPage\"\n type=\"button\"\n class=\"close\"\n [attr.aria-label]=\"commonStrings.keys.close\"\n (click)=\"modalCancel()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div #body class=\"modal-body-wrapper\">\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>\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 </div>\n </div>\n</ng-template>\n" }]
29799
30237
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
29800
30238
  type: Inject,
29801
30239
  args: [PLATFORM_ID]
@@ -29805,6 +30243,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
29805
30243
  }], size: [{
29806
30244
  type: Input,
29807
30245
  args: ['clrWizardSize']
30246
+ }], inPage: [{
30247
+ type: Input,
30248
+ args: ['clrWizardInPage']
30249
+ }], inPageFillContentArea: [{
30250
+ type: Input,
30251
+ args: ['clrWizardInPageFillContentArea']
29808
30252
  }], closable: [{
29809
30253
  type: Input,
29810
30254
  args: ['clrWizardClosable']
@@ -29844,6 +30288,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
29844
30288
  }], wizardTitle: [{
29845
30289
  type: ContentChild,
29846
30290
  args: [ClrWizardTitle]
30291
+ }], bodyElementRef: [{
30292
+ type: ViewChild,
30293
+ args: ['body']
29847
30294
  }], modal: [{
29848
30295
  type: ViewChild,
29849
30296
  args: [ClrModal]
@@ -30423,9 +30870,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
30423
30870
  * The full license information can be found in LICENSE in the root directory of this project.
30424
30871
  */
30425
30872
 
30873
+ /*
30874
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
30875
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
30876
+ * This software is released under MIT license.
30877
+ * The full license information can be found in LICENSE in the root directory of this project.
30878
+ */
30879
+
30426
30880
  /**
30427
30881
  * Generated bundle index. Do not edit.
30428
30882
  */
30429
30883
 
30430
- export { CHANGE_KEYS, CLR_ALERT_DIRECTIVES, CLR_BUTTON_GROUP_DIRECTIVES, CLR_DATAGRID_DIRECTIVES, CLR_DATEPICKER_DIRECTIVES, CLR_DROPDOWN_DIRECTIVES, CLR_FILE_MESSAGES_TEMPLATE_CONTEXT, CLR_ICON_DIRECTIVES, CLR_LAYOUT_DIRECTIVES, CLR_LOADING_BUTTON_DIRECTIVES, CLR_LOADING_DIRECTIVES, CLR_MENU_POSITIONS, CLR_MODAL_DIRECTIVES, CLR_NAVIGATION_DIRECTIVES, CLR_PROGRESS_BAR_DIRECTIVES, CLR_SIDEPANEL_DIRECTIVES, CLR_SIGNPOST_DIRECTIVES, CLR_SPINNER_DIRECTIVES, CLR_STACK_VIEW_DIRECTIVES, CLR_TABS_DIRECTIVES, CLR_TOOLTIP_DIRECTIVES, CLR_TREE_VIEW_DIRECTIVES, CLR_VERTICAL_NAV_DIRECTIVES, CLR_WIZARD_DIRECTIVES, CONDITIONAL_DIRECTIVES, CUSTOM_BUTTON_TYPES, CdsIconCustomTag, ClarityModule, ClrAbstractContainer, ClrAccordion, ClrAccordionContent, ClrAccordionDescription, ClrAccordionModule, ClrAccordionPanel, ClrAccordionTitle, ClrAlert, ClrAlertItem, ClrAlertModule, ClrAlertText, ClrAlerts, ClrAlertsPager, ClrAlignment, ClrAriaCurrentLink, ClrAxis, ClrBreadcrumbItem, ClrBreadcrumbs, ClrBreadcrumbsModule, ClrButton, ClrButtonGroup, ClrButtonGroupModule, ClrButtonModule, ClrCalendar, ClrCheckbox, ClrCheckboxContainer, ClrCheckboxModule, ClrCheckboxWrapper, ClrCombobox, ClrComboboxContainer, ClrComboboxModule, ClrCommonFormsModule, ClrCommonStringsService, ClrConditionalModule, ClrControl, ClrControlContainer, ClrControlError, ClrControlHelper, ClrControlSuccess, ClrDataModule, ClrDatagrid, ClrDatagridActionBar, ClrDatagridActionOverflow, ClrDatagridCell, ClrDatagridColumn, ClrDatagridColumnSeparator, ClrDatagridColumnToggle, ClrDatagridColumnToggleButton, ClrDatagridDetail, ClrDatagridDetailBody, ClrDatagridDetailHeader, ClrDatagridFilter, ClrDatagridFooter, ClrDatagridHideableColumn, ClrDatagridItems, ClrDatagridModule, ClrDatagridPageSize, ClrDatagridPagination, ClrDatagridPlaceholder, ClrDatagridRow, ClrDatagridRowDetail, ClrDatagridSortOrder, ClrDatalist, ClrDatalistContainer, ClrDatalistInput, ClrDatalistModule, ClrDateContainer, ClrDateInput, ClrDateInputBase, ClrDateInputValidator, ClrDatepickerActions, ClrDatepickerModule, ClrDatepickerViewManager, ClrDay, ClrDaypicker, ClrDestroyService, ClrDropdown, ClrDropdownItem, ClrDropdownMenu, ClrDropdownModule, ClrDropdownTrigger, ClrEmphasisModule, ClrEndDateInput, ClrEndDateInputValidator, ClrExpandableAnimation, ClrFileError, ClrFileInfo, ClrFileInput, ClrFileInputContainer, ClrFileInputModule, ClrFileInputValidator, ClrFileInputValueAccessor, ClrFileList, ClrFileMessagesTemplate, ClrFileSuccess, ClrFocusOnViewInit, ClrFocusOnViewInitModule, ClrForm, ClrFormLayout, ClrFormsModule, ClrHeader, ClrIconCustomTag, ClrIconModule, ClrIfActive, ClrIfDetail, ClrIfError, ClrIfExpanded, ClrIfOpen, ClrIfSuccess, ClrInput, ClrInputContainer, ClrInputModule, ClrLabel, ClrLayout, ClrLayoutModule, ClrLoading, ClrLoadingButton, ClrLoadingButtonModule, ClrLoadingModule, ClrLoadingState, ClrMainContainer, ClrMainContainerModule, ClrModal, ClrModalBody, ClrModalConfigurationService, ClrModalHostDirective, ClrModalModule, ClrMonthpicker, ClrNavLevel, ClrNavigationModule, ClrNumberInput, ClrNumberInputContainer, ClrNumberInputModule, ClrOption, ClrOptionItems, ClrOptionSelected, ClrOptions, ClrPassword, ClrPasswordContainer, ClrPasswordModule, ClrPopoverAnchor, ClrPopoverContent, ClrPopoverEventsService, ClrPopoverHostDirective, ClrPopoverModule, ClrPopoverPositionService, ClrPopoverToggleService, ClrProgressBar, ClrProgressBarModule, ClrRadio, ClrRadioContainer, ClrRadioModule, ClrRadioWrapper, ClrRange, ClrRangeContainer, ClrRangeModule, ClrRecursiveForOf, ClrSelect, ClrSelectContainer, ClrSelectModule, ClrSelectedState, ClrSide, ClrSidePanel, ClrSidePanelModule, ClrSignpost, ClrSignpostContent, ClrSignpostModule, ClrSignpostTitle, ClrSignpostTrigger, ClrSpinner, ClrSpinnerModule, ClrStackBlock, ClrStackContentInput, ClrStackHeader, ClrStackView, ClrStackViewCustomTags, ClrStackViewLabel, ClrStackViewModule, ClrStandaloneCdkTrapFocus, ClrStartDateInput, ClrStartDateInputValidator, ClrStepButton, ClrStepButtonType, ClrStepper, ClrStepperModule, ClrStepperPanel, ClrStopEscapePropagationDirective, ClrTab, ClrTabAction, ClrTabContent, ClrTabLink, ClrTabOverflowContent, ClrTabs, ClrTabsActions, ClrTabsModule, ClrTextarea, ClrTextareaContainer, ClrTextareaModule, ClrTimeline, ClrTimelineLayout, ClrTimelineModule, ClrTimelineStep, ClrTimelineStepDescription, ClrTimelineStepHeader, ClrTimelineStepState, ClrTimelineStepTitle, ClrTooltip, ClrTooltipContent, ClrTooltipModule, ClrTooltipTrigger, ClrTree, ClrTreeNode, ClrTreeNodeLink, ClrTreeViewModule, ClrVerticalNav, ClrVerticalNavGroup, ClrVerticalNavGroupChildren, ClrVerticalNavIcon, ClrVerticalNavLink, ClrVerticalNavModule, ClrWizard, ClrWizardButton, ClrWizardHeaderAction, ClrWizardModule, ClrWizardPage, ClrWizardPageButtons, ClrWizardPageHeaderActions, ClrWizardPageNavTitle, ClrWizardPageTitle, ClrWizardStepnav, ClrWizardStepnavItem, ClrWizardTitle, ClrYearpicker, DEFAULT_BUTTON_TYPES, DatagridNumericFilter, DatagridPropertyComparator, DatagridPropertyNumericFilter, DatagridPropertyStringFilter, DatagridStringFilter, EXPANDABLE_ANIMATION_DIRECTIVES, FOCUS_ON_VIEW_INIT, FOCUS_ON_VIEW_INIT_DIRECTIVES, IS_TOGGLE, IS_TOGGLE_PROVIDER, LoadingListener, MainContainerWillyWonka, NavDetectionOompaLoompa, TOGGLE_SERVICE, TOGGLE_SERVICE_PROVIDER, ToggleServiceFactory, WrappedFormControl, collapse, commonStringsDefault, fade, fadeSlide, isToggleFactory, slide, AccordionOompaLoompa as ÇlrAccordionOompaLoompa, AccordionWillyWonka as ÇlrAccordionWillyWonka, ActionableOompaLoompa as ÇlrActionableOompaLoompa, ActiveOompaLoompa as ÇlrActiveOompaLoompa, ClrPopoverCloseButton as ÇlrClrPopoverCloseButton, ClrPopoverModuleNext as ÇlrClrPopoverModuleNext, ClrPopoverOpenCloseButton as ÇlrClrPopoverOpenCloseButton, DatagridCellRenderer as ÇlrDatagridCellRenderer, DatagridDetailRegisterer as ÇlrDatagridDetailRegisterer, DatagridHeaderRenderer as ÇlrDatagridHeaderRenderer, DatagridMainRenderer as ÇlrDatagridMainRenderer, DatagridRowRenderer as ÇlrDatagridRowRenderer, ClrDatagridSelectionCellDirective as ÇlrDatagridSelectionCellDirective, ClrDatagridVirtualScrollDirective as ÇlrDatagridVirtualScrollDirective, DatagridWillyWonka as ÇlrDatagridWillyWonka, ExpandableOompaLoompa as ÇlrExpandableOompaLoompa, StepperOompaLoompa as ÇlrStepperOompaLoompa, StepperWillyWonka as ÇlrStepperWillyWonka, TabsWillyWonka as ÇlrTabsWillyWonka, WrappedCell as ÇlrWrappedCell, WrappedColumn as ÇlrWrappedColumn, WrappedRow as ÇlrWrappedRow };
30884
+ export { BaseExpandableAnimation, CHANGE_KEYS, CLR_ALERT_DIRECTIVES, CLR_BUTTON_GROUP_DIRECTIVES, CLR_DATAGRID_DIRECTIVES, CLR_DATEPICKER_DIRECTIVES, CLR_DROPDOWN_DIRECTIVES, CLR_FILE_MESSAGES_TEMPLATE_CONTEXT, CLR_ICON_DIRECTIVES, CLR_LAYOUT_DIRECTIVES, CLR_LOADING_BUTTON_DIRECTIVES, CLR_LOADING_DIRECTIVES, CLR_MENU_POSITIONS, CLR_MODAL_DIRECTIVES, CLR_NAVIGATION_DIRECTIVES, CLR_PROGRESS_BAR_DIRECTIVES, CLR_SIDEPANEL_DIRECTIVES, CLR_SIGNPOST_DIRECTIVES, CLR_SPINNER_DIRECTIVES, CLR_STACK_VIEW_DIRECTIVES, CLR_TABS_DIRECTIVES, CLR_TOOLTIP_DIRECTIVES, CLR_TREE_VIEW_DIRECTIVES, CLR_VERTICAL_NAV_DIRECTIVES, CLR_WIZARD_DIRECTIVES, CONDITIONAL_DIRECTIVES, CUSTOM_BUTTON_TYPES, CdsIconCustomTag, ClarityModule, ClrAbstractContainer, ClrAccordion, ClrAccordionContent, ClrAccordionDescription, ClrAccordionModule, ClrAccordionPanel, ClrAccordionTitle, ClrAlert, ClrAlertItem, ClrAlertModule, ClrAlertText, ClrAlerts, ClrAlertsPager, ClrAlignment, ClrAriaCurrentLink, ClrAxis, ClrBreadcrumbItem, ClrBreadcrumbs, ClrBreadcrumbsModule, ClrButton, ClrButtonGroup, ClrButtonGroupModule, ClrButtonModule, ClrCalendar, ClrCheckbox, ClrCheckboxContainer, ClrCheckboxModule, ClrCheckboxWrapper, ClrCombobox, ClrComboboxContainer, ClrComboboxModule, ClrCommonFormsModule, ClrCommonStringsService, ClrConditionalModule, ClrControl, ClrControlContainer, ClrControlError, ClrControlHelper, ClrControlSuccess, ClrDataModule, ClrDatagrid, ClrDatagridActionBar, ClrDatagridActionOverflow, ClrDatagridCell, ClrDatagridColumn, ClrDatagridColumnSeparator, ClrDatagridColumnToggle, ClrDatagridColumnToggleButton, ClrDatagridDetail, ClrDatagridDetailBody, ClrDatagridDetailHeader, ClrDatagridFilter, ClrDatagridFooter, ClrDatagridHideableColumn, ClrDatagridItems, ClrDatagridModule, ClrDatagridPageSize, ClrDatagridPagination, ClrDatagridPlaceholder, ClrDatagridRow, ClrDatagridRowDetail, ClrDatagridSortOrder, ClrDatalist, ClrDatalistContainer, ClrDatalistInput, ClrDatalistModule, ClrDateContainer, ClrDateInput, ClrDateInputBase, ClrDateInputValidator, ClrDatepickerActions, ClrDatepickerModule, ClrDatepickerViewManager, ClrDay, ClrDaypicker, ClrDestroyService, ClrDropdown, ClrDropdownItem, ClrDropdownMenu, ClrDropdownModule, ClrDropdownTrigger, ClrEmphasisModule, ClrEndDateInput, ClrEndDateInputValidator, ClrExpandableAnimation, ClrFileError, ClrFileInfo, ClrFileInput, ClrFileInputContainer, ClrFileInputModule, ClrFileInputValidator, ClrFileInputValueAccessor, ClrFileList, ClrFileMessagesTemplate, ClrFileSuccess, ClrFocusOnViewInit, ClrFocusOnViewInitModule, ClrForm, ClrFormLayout, ClrFormsModule, ClrHeader, ClrIconCustomTag, ClrIconModule, ClrIfActive, ClrIfDetail, ClrIfError, ClrIfExpanded, ClrIfOpen, ClrIfSuccess, ClrInput, ClrInputContainer, ClrInputModule, ClrLabel, ClrLayout, ClrLayoutModule, ClrLoading, ClrLoadingButton, ClrLoadingButtonModule, ClrLoadingModule, ClrLoadingState, ClrMainContainer, ClrMainContainerModule, ClrModal, ClrModalBody, ClrModalConfigurationService, ClrModalHostDirective, ClrModalModule, ClrMonthpicker, ClrNavLevel, ClrNavigationModule, ClrNumberInput, ClrNumberInputContainer, ClrNumberInputModule, ClrOption, ClrOptionItems, ClrOptionSelected, ClrOptions, ClrPassword, ClrPasswordContainer, ClrPasswordModule, ClrPopoverAnchor, ClrPopoverContent, ClrPopoverEventsService, ClrPopoverHostDirective, ClrPopoverModule, ClrPopoverPositionService, ClrPopoverToggleService, ClrProgressBar, ClrProgressBarModule, ClrRadio, ClrRadioContainer, ClrRadioModule, ClrRadioWrapper, ClrRange, ClrRangeContainer, ClrRangeModule, ClrRecursiveForOf, ClrSelect, ClrSelectContainer, ClrSelectModule, ClrSelectedState, ClrSide, ClrSidePanel, ClrSidePanelModule, ClrSignpost, ClrSignpostContent, ClrSignpostModule, ClrSignpostTitle, ClrSignpostTrigger, ClrSpinner, ClrSpinnerModule, ClrStackBlock, ClrStackContentInput, ClrStackHeader, ClrStackView, ClrStackViewCustomTags, ClrStackViewLabel, ClrStackViewModule, ClrStandaloneCdkTrapFocus, ClrStartDateInput, ClrStartDateInputValidator, ClrStepButton, ClrStepButtonType, ClrStepper, ClrStepperModule, ClrStepperPanel, ClrStopEscapePropagationDirective, ClrTab, ClrTabAction, ClrTabContent, ClrTabLink, ClrTabOverflowContent, ClrTabs, ClrTabsActions, ClrTabsModule, ClrTextarea, ClrTextareaContainer, ClrTextareaModule, ClrTimeline, ClrTimelineLayout, ClrTimelineModule, ClrTimelineStep, ClrTimelineStepDescription, ClrTimelineStepHeader, ClrTimelineStepState, ClrTimelineStepTitle, ClrTooltip, ClrTooltipContent, ClrTooltipModule, ClrTooltipTrigger, ClrTree, ClrTreeNode, ClrTreeNodeLink, ClrTreeViewModule, ClrVerticalNav, ClrVerticalNavGroup, ClrVerticalNavGroupChildren, ClrVerticalNavIcon, ClrVerticalNavLink, ClrVerticalNavModule, ClrWizard, ClrWizardButton, ClrWizardHeaderAction, ClrWizardModule, ClrWizardPage, ClrWizardPageButtons, ClrWizardPageHeaderActions, ClrWizardPageNavTitle, ClrWizardPageTitle, ClrWizardStepnav, ClrWizardStepnavItem, ClrWizardTitle, ClrYearpicker, DEFAULT_BUTTON_TYPES, DatagridNumericFilter, DatagridPropertyComparator, DatagridPropertyNumericFilter, DatagridPropertyStringFilter, DatagridStringFilter, EXPANDABLE_ANIMATION_DIRECTIVES, FOCUS_ON_VIEW_INIT, FOCUS_ON_VIEW_INIT_DIRECTIVES, IS_TOGGLE, IS_TOGGLE_PROVIDER, LoadingListener, MainContainerWillyWonka, NavDetectionOompaLoompa, TOGGLE_SERVICE, TOGGLE_SERVICE_PROVIDER, ToggleServiceFactory, WrappedFormControl, collapse, commonStringsDefault, fade, fadeSlide, isToggleFactory, slide, AccordionOompaLoompa as ÇlrAccordionOompaLoompa, AccordionWillyWonka as ÇlrAccordionWillyWonka, ActionableOompaLoompa as ÇlrActionableOompaLoompa, ActiveOompaLoompa as ÇlrActiveOompaLoompa, ClrPopoverCloseButton as ÇlrClrPopoverCloseButton, ClrPopoverModuleNext as ÇlrClrPopoverModuleNext, ClrPopoverOpenCloseButton as ÇlrClrPopoverOpenCloseButton, DatagridCellRenderer as ÇlrDatagridCellRenderer, DatagridDetailRegisterer as ÇlrDatagridDetailRegisterer, DatagridHeaderRenderer as ÇlrDatagridHeaderRenderer, DatagridMainRenderer as ÇlrDatagridMainRenderer, DatagridRowRenderer as ÇlrDatagridRowRenderer, ClrDatagridSelectionCellDirective as ÇlrDatagridSelectionCellDirective, ClrDatagridVirtualScrollDirective as ÇlrDatagridVirtualScrollDirective, DatagridWillyWonka as ÇlrDatagridWillyWonka, ExpandableOompaLoompa as ÇlrExpandableOompaLoompa, StepperOompaLoompa as ÇlrStepperOompaLoompa, StepperWillyWonka as ÇlrStepperWillyWonka, TabsWillyWonka as ÇlrTabsWillyWonka, WrappedCell as ÇlrWrappedCell, WrappedColumn as ÇlrWrappedColumn, WrappedRow as ÇlrWrappedRow };
30431
30885
  //# sourceMappingURL=clr-angular.mjs.map