@clr/angular 17.1.0 → 17.2.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 (75) hide show
  1. package/clarity.api.md +377 -141
  2. package/clr-angular.module.d.ts +7 -6
  3. package/data/datagrid/datagrid-virtual-scroll.directive.d.ts +59 -0
  4. package/data/datagrid/datagrid.d.ts +7 -4
  5. package/data/datagrid/datagrid.module.d.ts +31 -30
  6. package/data/datagrid/index.d.ts +1 -0
  7. package/data/datagrid/interfaces/column-state.interface.d.ts +1 -0
  8. package/data/datagrid/providers/detail.service.d.ts +1 -0
  9. package/data/datagrid/render/cell-renderer.d.ts +3 -6
  10. package/data/datagrid/render/header-renderer.d.ts +2 -3
  11. package/data/datagrid/render/main-renderer.d.ts +5 -1
  12. package/data/datagrid/render/row-renderer.d.ts +4 -3
  13. package/data/datagrid/utils/key-navigation-grid.controller.d.ts +4 -1
  14. package/esm2020/accordion/accordion-panel.mjs +3 -3
  15. package/esm2020/accordion/stepper/stepper-panel.mjs +8 -4
  16. package/esm2020/clr-angular.module.mjs +5 -1
  17. package/esm2020/data/datagrid/datagrid-row.mjs +3 -3
  18. package/esm2020/data/datagrid/datagrid-selection-cell.directive.mjs +2 -2
  19. package/esm2020/data/datagrid/datagrid-virtual-scroll.directive.mjs +225 -0
  20. package/esm2020/data/datagrid/datagrid.mjs +32 -10
  21. package/esm2020/data/datagrid/datagrid.module.mjs +5 -1
  22. package/esm2020/data/datagrid/index.mjs +2 -1
  23. package/esm2020/data/datagrid/interfaces/column-state.interface.mjs +1 -1
  24. package/esm2020/data/datagrid/providers/detail.service.mjs +6 -1
  25. package/esm2020/data/datagrid/render/cell-renderer.mjs +10 -33
  26. package/esm2020/data/datagrid/render/header-renderer.mjs +25 -43
  27. package/esm2020/data/datagrid/render/main-renderer.mjs +54 -9
  28. package/esm2020/data/datagrid/render/render-organizer.mjs +2 -2
  29. package/esm2020/data/datagrid/render/row-renderer.mjs +5 -5
  30. package/esm2020/data/datagrid/utils/key-navigation-grid.controller.mjs +17 -4
  31. package/esm2020/forms/combobox/combobox.mjs +3 -3
  32. package/esm2020/forms/datalist/datalist-container.mjs +1 -4
  33. package/esm2020/forms/datepicker/datepicker-view-manager.mjs +3 -3
  34. package/esm2020/forms/file-input/file-input-container.mjs +157 -0
  35. package/esm2020/forms/file-input/file-input-validator.mjs +72 -0
  36. package/esm2020/forms/file-input/file-input-value-accessor.mjs +53 -0
  37. package/esm2020/forms/file-input/file-input.helpers.mjs +22 -0
  38. package/esm2020/forms/file-input/file-input.mjs +68 -0
  39. package/esm2020/forms/file-input/file-input.module.mjs +43 -0
  40. package/esm2020/forms/file-input/index.mjs +12 -0
  41. package/esm2020/forms/forms.module.mjs +5 -1
  42. package/esm2020/forms/index.mjs +2 -1
  43. package/esm2020/modal/index.mjs +3 -1
  44. package/esm2020/modal/modal-configuration.service.mjs +20 -0
  45. package/esm2020/modal/modal.mjs +47 -18
  46. package/esm2020/modal/modal.module.mjs +4 -2
  47. package/esm2020/modal/side-panel.mjs +90 -0
  48. package/esm2020/modal/side-panel.module.mjs +28 -0
  49. package/esm2020/utils/animations/expandable-animation/expandable-animation.mjs +17 -12
  50. package/esm2020/utils/dom-adapter/dom-adapter.mjs +13 -4
  51. package/esm2020/utils/i18n/common-strings.default.mjs +6 -1
  52. package/esm2020/utils/i18n/common-strings.interface.mjs +1 -1
  53. package/esm2020/wizard/wizard.mjs +29 -6
  54. package/fesm2015/clr-angular.mjs +1123 -264
  55. package/fesm2015/clr-angular.mjs.map +1 -1
  56. package/fesm2020/clr-angular.mjs +1114 -266
  57. package/fesm2020/clr-angular.mjs.map +1 -1
  58. package/forms/file-input/file-input-container.d.ts +16 -0
  59. package/forms/file-input/file-input-validator.d.ts +12 -0
  60. package/forms/file-input/file-input-value-accessor.d.ts +15 -0
  61. package/forms/file-input/file-input.d.ts +21 -0
  62. package/forms/file-input/file-input.helpers.d.ts +3 -0
  63. package/forms/file-input/file-input.module.d.ts +14 -0
  64. package/forms/file-input/index.d.ts +5 -0
  65. package/forms/forms.module.d.ts +9 -8
  66. package/forms/index.d.ts +1 -0
  67. package/modal/index.d.ts +2 -0
  68. package/modal/modal-configuration.service.d.ts +7 -0
  69. package/modal/modal.d.ts +8 -2
  70. package/modal/side-panel.d.ts +26 -0
  71. package/modal/side-panel.module.d.ts +13 -0
  72. package/package.json +2 -2
  73. package/utils/animations/expandable-animation/expandable-animation.d.ts +5 -4
  74. package/utils/i18n/common-strings.interface.d.ts +4 -0
  75. package/wizard/wizard.d.ts +12 -2
@@ -1,19 +1,23 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Directive, NgModule, Optional, Input, Injectable, Component, ChangeDetectionStrategy, EventEmitter, HostBinding, Output, ContentChildren, PLATFORM_ID, Inject, ViewChild, HostListener, SkipSelf, Renderer2, InjectionToken, ElementRef, ContentChild, ComponentFactoryResolver, KeyValueDiffers, Self, Attribute, LOCALE_ID, ViewContainerRef, NgZone, ChangeDetectorRef, TemplateRef } from '@angular/core';
2
+ import { Directive, NgModule, Optional, Input, Injectable, Component, ChangeDetectionStrategy, EventEmitter, HostBinding, Output, ContentChildren, PLATFORM_ID, Inject, ViewChild, HostListener, SkipSelf, Renderer2, InjectionToken, ElementRef, ContentChild, ComponentFactoryResolver, KeyValueDiffers, Self, Attribute, LOCALE_ID, inject, forwardRef, ViewContainerRef, NgZone, ChangeDetectorRef, TemplateRef } 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
- import { ClarityIcons, angleIcon, exclamationCircleIcon, checkCircleIcon, ellipsisHorizontalIcon, windowCloseIcon, eventIcon, calendarIcon, eyeHideIcon, eyeIcon, ellipsisVerticalIcon, viewColumnsIcon, arrowIcon, timesIcon, stepForward2Icon, angleDoubleIcon, filterGridCircleIcon, filterGridIcon, errorStandardIcon, helpIcon, infoStandardIcon, noteIcon, successStandardIcon, warningStandardIcon, infoCircleIcon, circleIcon, dotCircleIcon } from '@cds/core/icon';
5
+ import { ClarityIcons, angleIcon, exclamationCircleIcon, checkCircleIcon, ellipsisHorizontalIcon, windowCloseIcon, eventIcon, calendarIcon, folderOpenIcon, eyeHideIcon, eyeIcon, ellipsisVerticalIcon, viewColumnsIcon, arrowIcon, timesIcon, stepForward2Icon, angleDoubleIcon, filterGridCircleIcon, filterGridIcon, errorStandardIcon, helpIcon, infoStandardIcon, noteIcon, successStandardIcon, warningStandardIcon, infoCircleIcon, circleIcon, dotCircleIcon } from '@cds/core/icon';
6
6
  import { map, tap, startWith, distinctUntilChanged, filter, skipUntil, debounceTime, takeUntil, take, first, switchMap } from 'rxjs/operators';
7
7
  import * as i3 from 'rxjs';
8
8
  import { Subject, BehaviorSubject, Observable, fromEvent, isObservable, of, ReplaySubject, combineLatest, merge } from 'rxjs';
9
9
  import { trigger, transition, style, animate, state, keyframes } from '@angular/animations';
10
10
  import * as i1 from '@angular/forms';
11
- import { FormControl, FormGroup, FormsModule, NG_VALIDATORS, SelectMultipleControlValueAccessor } from '@angular/forms';
11
+ import { FormControl, FormGroup, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, SelectMultipleControlValueAccessor } from '@angular/forms';
12
12
  import * as i1$1 from '@angular/cdk/a11y';
13
13
  import { CdkTrapFocus } from '@angular/cdk/a11y';
14
14
  import * as i2 from '@angular/cdk/drag-drop';
15
15
  import { CdkDrag, CDK_DROP_LIST, CDK_DRAG_CONFIG } from '@angular/cdk/drag-drop';
16
16
  import * as i1$2 from '@angular/cdk/bidi';
17
+ import { coerceNumberProperty } from '@angular/cdk/coercion';
18
+ import { _RecycleViewRepeaterStrategy } from '@angular/cdk/collections';
19
+ import * as i3$1 from '@angular/cdk/scrolling';
20
+ import { FixedSizeVirtualScrollStrategy, CdkVirtualForOf, CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
17
21
  import * as i1$3 from '@angular/router';
18
22
  import '@cds/core/internal-components/close-button/register.js';
19
23
  import '@cds/core/icon/register';
@@ -388,6 +392,11 @@ const commonStringsDefault = {
388
392
  // Accordion/Stepper
389
393
  stepComplete: 'Step {STEP} complete',
390
394
  stepError: 'Error in step {STEP}',
395
+ // File input
396
+ browse: 'Browse',
397
+ fileCount: '{COUNT} files',
398
+ clearFile: 'Clear {FILE}',
399
+ clearFiles: 'Clear {COUNT} files',
391
400
  };
392
401
 
393
402
  /*
@@ -641,10 +650,10 @@ class ClrAccordionPanel {
641
650
  }
642
651
  }
643
652
  ClrAccordionPanel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrAccordionPanel, deps: [{ token: ClrCommonStringsService }, { token: AccordionService }, { token: IfExpandService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
644
- ClrAccordionPanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrAccordionPanel, selector: "clr-accordion-panel", inputs: { disabled: ["clrAccordionPanelDisabled", "disabled"], panelOpen: ["clrAccordionPanelOpen", "panelOpen"] }, outputs: { panelOpenChange: "clrAccordionPanelOpenChange" }, host: { properties: { "class.clr-accordion-panel": "true", "class.clr-accordion-panel-disabled": "this.disabled" } }, providers: [IfExpandService], queries: [{ propertyName: "accordionDescription", predicate: ClrAccordionDescription }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [disabled]=\"isAccordion && panel.disabled\"\n [attr.aria-disabled]=\"!isAccordion && panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-sr-only\" role=\"status\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\"> {{ stepErrorText(panelNumber)}} </ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">\n {{ stepCompleteText(panelNumber)}}\n </ng-container>\n </span>\n <span class=\"clr-accordion-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle\"></cds-icon>\n <span class=\"clr-accordion-number\">{{panelNumber}}.</span>\n <cds-icon status=\"danger\" shape=\"exclamation-circle\" class=\"clr-accordion-error-icon\"></cds-icon>\n <cds-icon status=\"success\" shape=\"check-circle\" class=\"clr-accordion-complete-icon\"></cds-icon>\n </span>\n <ng-content select=\"clr-accordion-title, clr-step-title\"></ng-content>\n <ng-content select=\"clr-accordion-description, clr-step-description\"></ng-content>\n </button>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</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: CdsIconCustomTag, selector: "cds-icon" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], animations: panelAnimation, changeDetection: i0.ChangeDetectionStrategy.OnPush });
653
+ ClrAccordionPanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrAccordionPanel, selector: "clr-accordion-panel", inputs: { disabled: ["clrAccordionPanelDisabled", "disabled"], panelOpen: ["clrAccordionPanelOpen", "panelOpen"] }, outputs: { panelOpenChange: "clrAccordionPanelOpenChange" }, host: { properties: { "class.clr-accordion-panel": "true", "class.clr-accordion-panel-disabled": "this.disabled" } }, providers: [IfExpandService], queries: [{ propertyName: "accordionDescription", predicate: ClrAccordionDescription }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [disabled]=\"isAccordion && panel.disabled\"\n [attr.aria-disabled]=\"!isAccordion && panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-accordion-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle\"></cds-icon>\n <span class=\"clr-accordion-number\">{{panelNumber}}.</span>\n <cds-icon status=\"danger\" shape=\"exclamation-circle\" class=\"clr-accordion-error-icon\"></cds-icon>\n <cds-icon status=\"success\" shape=\"check-circle\" class=\"clr-accordion-complete-icon\"></cds-icon>\n </span>\n <ng-content select=\"clr-accordion-title, clr-step-title\"></ng-content>\n <ng-content select=\"clr-accordion-description, clr-step-description\"></ng-content>\n </button>\n <div class=\"clr-sr-only\" role=\"status\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\"> {{ stepErrorText(panelNumber)}} </ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">\n {{ stepCompleteText(panelNumber)}}\n </ng-container>\n </div>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</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: CdsIconCustomTag, selector: "cds-icon" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], animations: panelAnimation, changeDetection: i0.ChangeDetectionStrategy.OnPush });
645
654
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrAccordionPanel, decorators: [{
646
655
  type: Component,
647
- args: [{ selector: 'clr-accordion-panel', host: { '[class.clr-accordion-panel]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, animations: panelAnimation, providers: [IfExpandService], template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [disabled]=\"isAccordion && panel.disabled\"\n [attr.aria-disabled]=\"!isAccordion && panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-sr-only\" role=\"status\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\"> {{ stepErrorText(panelNumber)}} </ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">\n {{ stepCompleteText(panelNumber)}}\n </ng-container>\n </span>\n <span class=\"clr-accordion-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle\"></cds-icon>\n <span class=\"clr-accordion-number\">{{panelNumber}}.</span>\n <cds-icon status=\"danger\" shape=\"exclamation-circle\" class=\"clr-accordion-error-icon\"></cds-icon>\n <cds-icon status=\"success\" shape=\"check-circle\" class=\"clr-accordion-complete-icon\"></cds-icon>\n </span>\n <ng-content select=\"clr-accordion-title, clr-step-title\"></ng-content>\n <ng-content select=\"clr-accordion-description, clr-step-description\"></ng-content>\n </button>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n" }]
656
+ args: [{ selector: 'clr-accordion-panel', host: { '[class.clr-accordion-panel]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, animations: panelAnimation, providers: [IfExpandService], template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [disabled]=\"isAccordion && panel.disabled\"\n [attr.aria-disabled]=\"!isAccordion && panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-accordion-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle\"></cds-icon>\n <span class=\"clr-accordion-number\">{{panelNumber}}.</span>\n <cds-icon status=\"danger\" shape=\"exclamation-circle\" class=\"clr-accordion-error-icon\"></cds-icon>\n <cds-icon status=\"success\" shape=\"check-circle\" class=\"clr-accordion-complete-icon\"></cds-icon>\n </span>\n <ng-content select=\"clr-accordion-title, clr-step-title\"></ng-content>\n <ng-content select=\"clr-accordion-description, clr-step-description\"></ng-content>\n </button>\n <div class=\"clr-sr-only\" role=\"status\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\"> {{ stepErrorText(panelNumber)}} </ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">\n {{ stepCompleteText(panelNumber)}}\n </ng-container>\n </div>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n" }]
648
657
  }], ctorParameters: function () { return [{ type: ClrCommonStringsService }, { type: AccordionService }, { type: IfExpandService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { disabled: [{
649
658
  type: Input,
650
659
  args: ['clrAccordionPanelDisabled']
@@ -1170,7 +1179,11 @@ class ClrStepperPanel extends ClrAccordionPanel {
1170
1179
  listenToFocusChanges() {
1171
1180
  this.subscriptions.push(this.stepperService.activeStep
1172
1181
  .pipe(filter(panelId => isPlatformBrowser(this.platformId) && panelId === this.id))
1173
- .subscribe(() => this.headerButton.nativeElement.focus()));
1182
+ .subscribe(() => {
1183
+ //Adding timeout so that the status of the previous step is read by Voice Over on Safari,
1184
+ //before focusing on the next stepper panel header
1185
+ setTimeout(() => this.headerButton.nativeElement.focus(), 1500);
1186
+ }));
1174
1187
  }
1175
1188
  triggerAllFormControlValidationIfError(panel) {
1176
1189
  if (panel.status === AccordionStatus.Error) {
@@ -1179,10 +1192,10 @@ class ClrStepperPanel extends ClrAccordionPanel {
1179
1192
  }
1180
1193
  }
1181
1194
  ClrStepperPanel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrStepperPanel, deps: [{ token: PLATFORM_ID }, { token: ClrCommonStringsService }, { token: i1.FormGroupName, optional: true }, { token: i1.NgModelGroup, optional: true }, { token: StepperService }, { token: IfExpandService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1182
- ClrStepperPanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrStepperPanel, selector: "clr-stepper-panel", host: { properties: { "class.clr-accordion-panel": "true" } }, providers: [IfExpandService], viewQueries: [{ propertyName: "headerButton", first: true, predicate: ["headerButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [disabled]=\"isAccordion && panel.disabled\"\n [attr.aria-disabled]=\"!isAccordion && panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-sr-only\" role=\"status\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\"> {{ stepErrorText(panelNumber)}} </ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">\n {{ stepCompleteText(panelNumber)}}\n </ng-container>\n </span>\n <span class=\"clr-accordion-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle\"></cds-icon>\n <span class=\"clr-accordion-number\">{{panelNumber}}.</span>\n <cds-icon status=\"danger\" shape=\"exclamation-circle\" class=\"clr-accordion-error-icon\"></cds-icon>\n <cds-icon status=\"success\" shape=\"check-circle\" class=\"clr-accordion-complete-icon\"></cds-icon>\n </span>\n <ng-content select=\"clr-accordion-title, clr-step-title\"></ng-content>\n <ng-content select=\"clr-accordion-description, clr-step-description\"></ng-content>\n </button>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</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: CdsIconCustomTag, selector: "cds-icon" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], animations: stepAnimation, changeDetection: i0.ChangeDetectionStrategy.OnPush });
1195
+ ClrStepperPanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrStepperPanel, selector: "clr-stepper-panel", host: { properties: { "class.clr-accordion-panel": "true" } }, providers: [IfExpandService], viewQueries: [{ propertyName: "headerButton", first: true, predicate: ["headerButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [disabled]=\"isAccordion && panel.disabled\"\n [attr.aria-disabled]=\"!isAccordion && panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-accordion-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle\"></cds-icon>\n <span class=\"clr-accordion-number\">{{panelNumber}}.</span>\n <cds-icon status=\"danger\" shape=\"exclamation-circle\" class=\"clr-accordion-error-icon\"></cds-icon>\n <cds-icon status=\"success\" shape=\"check-circle\" class=\"clr-accordion-complete-icon\"></cds-icon>\n </span>\n <ng-content select=\"clr-accordion-title, clr-step-title\"></ng-content>\n <ng-content select=\"clr-accordion-description, clr-step-description\"></ng-content>\n </button>\n <div class=\"clr-sr-only\" role=\"status\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\"> {{ stepErrorText(panelNumber)}} </ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">\n {{ stepCompleteText(panelNumber)}}\n </ng-container>\n </div>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</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: CdsIconCustomTag, selector: "cds-icon" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], animations: stepAnimation, changeDetection: i0.ChangeDetectionStrategy.OnPush });
1183
1196
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrStepperPanel, decorators: [{
1184
1197
  type: Component,
1185
- args: [{ selector: 'clr-stepper-panel', host: { '[class.clr-accordion-panel]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, animations: stepAnimation, providers: [IfExpandService], template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [disabled]=\"isAccordion && panel.disabled\"\n [attr.aria-disabled]=\"!isAccordion && panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-sr-only\" role=\"status\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\"> {{ stepErrorText(panelNumber)}} </ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">\n {{ stepCompleteText(panelNumber)}}\n </ng-container>\n </span>\n <span class=\"clr-accordion-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle\"></cds-icon>\n <span class=\"clr-accordion-number\">{{panelNumber}}.</span>\n <cds-icon status=\"danger\" shape=\"exclamation-circle\" class=\"clr-accordion-error-icon\"></cds-icon>\n <cds-icon status=\"success\" shape=\"check-circle\" class=\"clr-accordion-complete-icon\"></cds-icon>\n </span>\n <ng-content select=\"clr-accordion-title, clr-step-title\"></ng-content>\n <ng-content select=\"clr-accordion-description, clr-step-description\"></ng-content>\n </button>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n" }]
1198
+ args: [{ selector: 'clr-stepper-panel', host: { '[class.clr-accordion-panel]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, animations: stepAnimation, providers: [IfExpandService], template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [disabled]=\"isAccordion && panel.disabled\"\n [attr.aria-disabled]=\"!isAccordion && panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-accordion-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle\"></cds-icon>\n <span class=\"clr-accordion-number\">{{panelNumber}}.</span>\n <cds-icon status=\"danger\" shape=\"exclamation-circle\" class=\"clr-accordion-error-icon\"></cds-icon>\n <cds-icon status=\"success\" shape=\"check-circle\" class=\"clr-accordion-complete-icon\"></cds-icon>\n </span>\n <ng-content select=\"clr-accordion-title, clr-step-title\"></ng-content>\n <ng-content select=\"clr-accordion-description, clr-step-description\"></ng-content>\n </button>\n <div class=\"clr-sr-only\" role=\"status\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\"> {{ stepErrorText(panelNumber)}} </ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">\n {{ stepCompleteText(panelNumber)}}\n </ng-container>\n </div>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n" }]
1186
1199
  }], ctorParameters: function () {
1187
1200
  return [{ type: undefined, decorators: [{
1188
1201
  type: Inject,
@@ -2965,10 +2978,19 @@ function collapse() {
2965
2978
  * The full license information can be found in LICENSE in the root directory of this project.
2966
2979
  */
2967
2980
  class DomAdapter {
2981
+ /*
2982
+ We clone the element and take its measurements from outside the grid
2983
+ so we don't trigger reflow for the whole datagrid.
2984
+ */
2968
2985
  userDefinedWidth(element) {
2969
- element.classList.add('datagrid-cell-width-zero');
2970
- const userDefinedWidth = this.clientRect(element).width;
2971
- element.classList.remove('datagrid-cell-width-zero');
2986
+ const clonedElement = element.cloneNode(true);
2987
+ if (clonedElement.id) {
2988
+ clonedElement.id = clonedElement.id + '-clone';
2989
+ }
2990
+ clonedElement.classList.add('datagrid-cell-width-zero');
2991
+ document.body.appendChild(clonedElement);
2992
+ const userDefinedWidth = this.clientRect(clonedElement).width;
2993
+ clonedElement.remove();
2972
2994
  return userDefinedWidth;
2973
2995
  }
2974
2996
  scrollBarWidth(element) {
@@ -3015,27 +3037,32 @@ class ClrExpandableAnimation {
3015
3037
  this.element = element;
3016
3038
  this.domAdapter = domAdapter;
3017
3039
  this.renderer = renderer;
3040
+ this.clrExpandTrigger = false;
3018
3041
  this.startHeight = 0;
3019
3042
  }
3020
3043
  get expandAnimation() {
3021
3044
  return { value: this.clrExpandTrigger, params: { startHeight: this.startHeight } };
3022
3045
  }
3023
- animationStart() {
3024
- this.renderer.setStyle(this.element.nativeElement, 'overflow', 'hidden');
3046
+ animationStart(event) {
3047
+ if (event.fromState !== 'void') {
3048
+ this.renderer.setStyle(this.element.nativeElement, 'overflow', 'hidden');
3049
+ }
3025
3050
  }
3026
- animationDone() {
3027
- this.renderer.removeStyle(this.element.nativeElement, 'overflow');
3028
- // A "safe" auto-update of the height ensuring basic OOTB user experience .
3029
- // Prone to small jumps in initial animation height if data was changed in the meantime, window was resized, etc.
3030
- // For optimal behavior call manually updateStartHeight() from the parent component before initiating the update.
3031
- this.updateStartHeight();
3051
+ animationDone(event) {
3052
+ if (event.fromState !== 'void') {
3053
+ this.renderer.removeStyle(this.element.nativeElement, 'overflow');
3054
+ // A "safe" auto-update of the height ensuring basic OOTB user experience .
3055
+ // Prone to small jumps in initial animation height if data was changed in the meantime, window was resized, etc.
3056
+ // For optimal behavior call manually updateStartHeight() from the parent component before initiating the update.
3057
+ this.updateStartHeight();
3058
+ }
3032
3059
  }
3033
3060
  updateStartHeight() {
3034
3061
  this.startHeight = this.domAdapter.computedHeight(this.element.nativeElement) || 0;
3035
3062
  }
3036
3063
  }
3037
3064
  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 });
3038
- 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()", "@expandAnimation.done": "animationDone()" }, properties: { "@expandAnimation": "this.expandAnimation" } }, providers: [DomAdapter], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, styles: [":host{display:block}\n"], animations: [
3065
+ 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: [
3039
3066
  trigger('expandAnimation', [
3040
3067
  transition('true <=> false', [
3041
3068
  style({ height: '{{startHeight}}px' }),
@@ -3060,10 +3087,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
3060
3087
  args: ['@expandAnimation']
3061
3088
  }], animationStart: [{
3062
3089
  type: HostListener,
3063
- args: ['@expandAnimation.start']
3090
+ args: ['@expandAnimation.start', ['$event']]
3064
3091
  }], animationDone: [{
3065
3092
  type: HostListener,
3066
- args: ['@expandAnimation.done']
3093
+ args: ['@expandAnimation.done', ['$event']]
3067
3094
  }] } });
3068
3095
 
3069
3096
  /*
@@ -7301,7 +7328,7 @@ ClrCombobox.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
7301
7328
  IF_ACTIVE_ID_PROVIDER,
7302
7329
  FOCUS_SERVICE_PROVIDER,
7303
7330
  COMBOBOX_FOCUS_HANDLER_PROVIDER,
7304
- ], queries: [{ propertyName: "optionSelected", first: true, predicate: ClrOptionSelected, descendants: true }, { propertyName: "options", first: true, predicate: ClrOptions, descendants: true }], viewQueries: [{ propertyName: "textbox", first: true, predicate: ["textboxInput"], descendants: true }, { propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }], usesInheritance: true, hostDirectives: [{ directive: ClrPopoverHostDirective }], ngImport: i0, template: "<!--\n* Copyright (c) 2016-2023 VMware, Inc. All Rights Reserved.\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<!-- The (click) handler is needed to auto-focus on input field which can not currently occupy the whole\n width of the component, after being wrapped to a new line -->\n<div\n class=\"clr-combobox-wrapper\"\n clrPopoverAnchor\n (click)=\"focusInput()\"\n [class.multi]=\"multiSelect\"\n [class.invalid]=\"invalid\"\n [class.disabled]=\"control?.disabled? true: null\"\n>\n <span\n *ngIf=\"multiSelect && optionSelectionService.selectionModel.model\"\n role=\"grid\"\n clrRovingTabindex\n [clrRovingTabindexDisabled]=\"control?.disabled\"\n clrDirection=\"both\"\n [attr.aria-label]=\"getSelectionAriaLabel()\"\n [attr.aria-disabled]=\"control?.disabled? true: null\"\n >\n <span *ngFor=\"let item of multiSelectModel; let i = index\" class=\"label label-combobox-pill\" role=\"row\">\n <span role=\"gridcell\">\n <span class=\"clr-combobox-pill-content\" clrKeyFocusItem>\n <ng-container\n *ngIf=\"optionSelected\"\n [ngTemplateOutlet]=\"optionSelected.template\"\n [ngTemplateOutletContext]=\"{$implicit: optionSelectionService.selectionModel.model[i]}\"\n ></ng-container>\n </span>\n </span>\n <span role=\"gridcell\">\n <button\n clrKeyFocusItem\n type=\"button\"\n class=\"clr-combobox-remove-btn\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxDelete + ' ' + optionSelectionService.selectionModel.toString(displayField, i)\"\n (click)=\"unselect(item)\"\n >\n <cds-icon shape=\"window-close\" size=\"12\"></cds-icon>\n </button>\n </span>\n </span>\n </span>\n\n <span class=\"clr-combobox-input-wrapper\">\n <input\n #textboxInput\n type=\"text\"\n role=\"combobox\"\n [id]=\"inputId()\"\n class=\"clr-input clr-combobox-input\"\n [(ngModel)]=\"searchText\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n [attr.aria-expanded]=\"openState\"\n [attr.aria-owns]=\"ariaOwns\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n [attr.aria-invalid]=\"control?.invalid? true: null\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-activedescendant]=\"getActiveDescendant()\"\n [attr.placeholder]=\"placeholder\"\n />\n </span>\n\n <!-- No click handler, as it uses the handler on the .clr-combobox-wrapper -->\n <button\n clrPopoverOpenCloseButton\n #trigger\n type=\"button\"\n class=\"clr-combobox-trigger\"\n tabindex=\"-1\"\n [disabled]=\"control?.disabled || null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxOpen\"\n >\n <cds-icon shape=\"angle\" direction=\"down\"></cds-icon>\n </button>\n\n <div class=\"clr-focus-indicator\" [class.clr-focus]=\"focused\"></div>\n</div>\n\n<!-- Both close handlers are handled manually due to issues in Edge browser.\n Additionally 'outsideClickToClose' has complex handling that's necessary\n to be manual due to the component architecture -->\n<div role=\"dialog\" *clrPopoverContent=\"openState at smartPosition; outsideClickToClose: false; scrollToClose: false\">\n <ng-content></ng-content>\n</div>\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: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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.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: CdsIconCustomTag, selector: "cds-icon" }, { kind: "component", type: ClrRovingTabindex, selector: "[clrRovingTabindex]", inputs: ["clrRovingTabindex", "clrRovingTabindexDisabled"] }, { kind: "directive", type: ClrKeyFocusItem, selector: "[clrKeyFocusItem]" }, { kind: "directive", type: ClrPopoverAnchor, selector: "[clrPopoverAnchor]" }, { kind: "directive", type: ClrPopoverOpenCloseButton, selector: "[clrPopoverOpenCloseButton]", outputs: ["clrPopoverOpenCloseChange"] }, { kind: "directive", type: ClrPopoverContent, selector: "[clrPopoverContent]", inputs: ["clrPopoverContent", "clrPopoverContentAt", "clrPopoverContentOutsideClickToClose", "clrPopoverContentScrollToClose"] }] });
7331
+ ], queries: [{ propertyName: "optionSelected", first: true, predicate: ClrOptionSelected, descendants: true }, { propertyName: "options", first: true, predicate: ClrOptions, descendants: true }], viewQueries: [{ propertyName: "textbox", first: true, predicate: ["textboxInput"], descendants: true }, { propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }], usesInheritance: true, hostDirectives: [{ directive: ClrPopoverHostDirective }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n-->\n\n<!-- The (click) handler is needed to auto-focus on input field which can not currently occupy the whole\n width of the component, after being wrapped to a new line -->\n<div\n class=\"clr-combobox-wrapper\"\n clrPopoverAnchor\n (click)=\"focusInput()\"\n [class.multi]=\"multiSelect\"\n [class.invalid]=\"invalid\"\n [class.disabled]=\"control?.disabled? true: null\"\n>\n <span\n *ngIf=\"multiSelect && optionSelectionService.selectionModel.model\"\n role=\"grid\"\n clrRovingTabindex\n [clrRovingTabindexDisabled]=\"control?.disabled\"\n clrDirection=\"both\"\n [attr.aria-label]=\"getSelectionAriaLabel()\"\n [attr.aria-disabled]=\"control?.disabled? true: null\"\n >\n <span *ngFor=\"let item of multiSelectModel; let i = index\" class=\"label label-combobox-pill\" role=\"row\">\n <span role=\"gridcell\">\n <span class=\"clr-combobox-pill-content\" clrKeyFocusItem>\n <ng-container\n *ngIf=\"optionSelected\"\n [ngTemplateOutlet]=\"optionSelected.template\"\n [ngTemplateOutletContext]=\"{$implicit: optionSelectionService.selectionModel.model[i]}\"\n ></ng-container>\n </span>\n </span>\n <span role=\"gridcell\">\n <button\n clrKeyFocusItem\n type=\"button\"\n class=\"clr-combobox-remove-btn\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxDelete + ' ' + optionSelectionService.selectionModel.toString(displayField, i)\"\n (click)=\"unselect(item)\"\n >\n <cds-icon shape=\"window-close\" size=\"12\"></cds-icon>\n </button>\n </span>\n </span>\n </span>\n\n <span class=\"clr-combobox-input-wrapper\">\n <input\n #textboxInput\n type=\"text\"\n role=\"combobox\"\n [id]=\"inputId()\"\n class=\"clr-input clr-combobox-input\"\n [(ngModel)]=\"searchText\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n [attr.aria-expanded]=\"openState\"\n [attr.aria-owns]=\"ariaOwns\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n [attr.aria-invalid]=\"control?.invalid? true: null\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-activedescendant]=\"getActiveDescendant()\"\n [attr.placeholder]=\"placeholder\"\n />\n </span>\n\n <!-- No click handler, as it uses the handler on the .clr-combobox-wrapper -->\n <button\n clrPopoverOpenCloseButton\n #trigger\n type=\"button\"\n class=\"clr-combobox-trigger\"\n tabindex=\"-1\"\n [disabled]=\"control?.disabled || null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxOpen\"\n >\n <cds-icon shape=\"angle\" direction=\"down\"></cds-icon>\n </button>\n\n <div class=\"clr-focus-indicator\" [class.clr-focus]=\"focused\"></div>\n</div>\n\n<!-- Both close handlers are handled manually due to issues in Edge browser.\n Additionally 'outsideClickToClose' has complex handling that's necessary\n to be manual due to the component architecture -->\n<div role=\"dialog\" *clrPopoverContent=\"openState at smartPosition; outsideClickToClose: false; scrollToClose: false\">\n <ng-content></ng-content>\n</div>\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: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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.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: CdsIconCustomTag, selector: "cds-icon" }, { kind: "component", type: ClrRovingTabindex, selector: "[clrRovingTabindex]", inputs: ["clrRovingTabindex", "clrRovingTabindexDisabled"] }, { kind: "directive", type: ClrKeyFocusItem, selector: "[clrKeyFocusItem]" }, { kind: "directive", type: ClrPopoverAnchor, selector: "[clrPopoverAnchor]" }, { kind: "directive", type: ClrPopoverOpenCloseButton, selector: "[clrPopoverOpenCloseButton]", outputs: ["clrPopoverOpenCloseChange"] }, { kind: "directive", type: ClrPopoverContent, selector: "[clrPopoverContent]", inputs: ["clrPopoverContent", "clrPopoverContentAt", "clrPopoverContentOutsideClickToClose", "clrPopoverContentScrollToClose"] }] });
7305
7332
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrCombobox, decorators: [{
7306
7333
  type: Component,
7307
7334
  args: [{ selector: 'clr-combobox', providers: [
@@ -7314,7 +7341,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
7314
7341
  '[class.aria-required]': 'true',
7315
7342
  '[class.clr-combobox]': 'true',
7316
7343
  '[class.clr-combobox-disabled]': 'control?.disabled',
7317
- }, template: "<!--\n* Copyright (c) 2016-2023 VMware, Inc. All Rights Reserved.\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<!-- The (click) handler is needed to auto-focus on input field which can not currently occupy the whole\n width of the component, after being wrapped to a new line -->\n<div\n class=\"clr-combobox-wrapper\"\n clrPopoverAnchor\n (click)=\"focusInput()\"\n [class.multi]=\"multiSelect\"\n [class.invalid]=\"invalid\"\n [class.disabled]=\"control?.disabled? true: null\"\n>\n <span\n *ngIf=\"multiSelect && optionSelectionService.selectionModel.model\"\n role=\"grid\"\n clrRovingTabindex\n [clrRovingTabindexDisabled]=\"control?.disabled\"\n clrDirection=\"both\"\n [attr.aria-label]=\"getSelectionAriaLabel()\"\n [attr.aria-disabled]=\"control?.disabled? true: null\"\n >\n <span *ngFor=\"let item of multiSelectModel; let i = index\" class=\"label label-combobox-pill\" role=\"row\">\n <span role=\"gridcell\">\n <span class=\"clr-combobox-pill-content\" clrKeyFocusItem>\n <ng-container\n *ngIf=\"optionSelected\"\n [ngTemplateOutlet]=\"optionSelected.template\"\n [ngTemplateOutletContext]=\"{$implicit: optionSelectionService.selectionModel.model[i]}\"\n ></ng-container>\n </span>\n </span>\n <span role=\"gridcell\">\n <button\n clrKeyFocusItem\n type=\"button\"\n class=\"clr-combobox-remove-btn\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxDelete + ' ' + optionSelectionService.selectionModel.toString(displayField, i)\"\n (click)=\"unselect(item)\"\n >\n <cds-icon shape=\"window-close\" size=\"12\"></cds-icon>\n </button>\n </span>\n </span>\n </span>\n\n <span class=\"clr-combobox-input-wrapper\">\n <input\n #textboxInput\n type=\"text\"\n role=\"combobox\"\n [id]=\"inputId()\"\n class=\"clr-input clr-combobox-input\"\n [(ngModel)]=\"searchText\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n [attr.aria-expanded]=\"openState\"\n [attr.aria-owns]=\"ariaOwns\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n [attr.aria-invalid]=\"control?.invalid? true: null\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-activedescendant]=\"getActiveDescendant()\"\n [attr.placeholder]=\"placeholder\"\n />\n </span>\n\n <!-- No click handler, as it uses the handler on the .clr-combobox-wrapper -->\n <button\n clrPopoverOpenCloseButton\n #trigger\n type=\"button\"\n class=\"clr-combobox-trigger\"\n tabindex=\"-1\"\n [disabled]=\"control?.disabled || null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxOpen\"\n >\n <cds-icon shape=\"angle\" direction=\"down\"></cds-icon>\n </button>\n\n <div class=\"clr-focus-indicator\" [class.clr-focus]=\"focused\"></div>\n</div>\n\n<!-- Both close handlers are handled manually due to issues in Edge browser.\n Additionally 'outsideClickToClose' has complex handling that's necessary\n to be manual due to the component architecture -->\n<div role=\"dialog\" *clrPopoverContent=\"openState at smartPosition; outsideClickToClose: false; scrollToClose: false\">\n <ng-content></ng-content>\n</div>\n" }]
7344
+ }, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n-->\n\n<!-- The (click) handler is needed to auto-focus on input field which can not currently occupy the whole\n width of the component, after being wrapped to a new line -->\n<div\n class=\"clr-combobox-wrapper\"\n clrPopoverAnchor\n (click)=\"focusInput()\"\n [class.multi]=\"multiSelect\"\n [class.invalid]=\"invalid\"\n [class.disabled]=\"control?.disabled? true: null\"\n>\n <span\n *ngIf=\"multiSelect && optionSelectionService.selectionModel.model\"\n role=\"grid\"\n clrRovingTabindex\n [clrRovingTabindexDisabled]=\"control?.disabled\"\n clrDirection=\"both\"\n [attr.aria-label]=\"getSelectionAriaLabel()\"\n [attr.aria-disabled]=\"control?.disabled? true: null\"\n >\n <span *ngFor=\"let item of multiSelectModel; let i = index\" class=\"label label-combobox-pill\" role=\"row\">\n <span role=\"gridcell\">\n <span class=\"clr-combobox-pill-content\" clrKeyFocusItem>\n <ng-container\n *ngIf=\"optionSelected\"\n [ngTemplateOutlet]=\"optionSelected.template\"\n [ngTemplateOutletContext]=\"{$implicit: optionSelectionService.selectionModel.model[i]}\"\n ></ng-container>\n </span>\n </span>\n <span role=\"gridcell\">\n <button\n clrKeyFocusItem\n type=\"button\"\n class=\"clr-combobox-remove-btn\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxDelete + ' ' + optionSelectionService.selectionModel.toString(displayField, i)\"\n (click)=\"unselect(item)\"\n >\n <cds-icon shape=\"window-close\" size=\"12\"></cds-icon>\n </button>\n </span>\n </span>\n </span>\n\n <span class=\"clr-combobox-input-wrapper\">\n <input\n #textboxInput\n type=\"text\"\n role=\"combobox\"\n [id]=\"inputId()\"\n class=\"clr-input clr-combobox-input\"\n [(ngModel)]=\"searchText\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n [attr.aria-expanded]=\"openState\"\n [attr.aria-owns]=\"ariaOwns\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n [attr.aria-invalid]=\"control?.invalid? true: null\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-activedescendant]=\"getActiveDescendant()\"\n [attr.placeholder]=\"placeholder\"\n />\n </span>\n\n <!-- No click handler, as it uses the handler on the .clr-combobox-wrapper -->\n <button\n clrPopoverOpenCloseButton\n #trigger\n type=\"button\"\n class=\"clr-combobox-trigger\"\n tabindex=\"-1\"\n [disabled]=\"control?.disabled || null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxOpen\"\n >\n <cds-icon shape=\"angle\" direction=\"down\"></cds-icon>\n </button>\n\n <div class=\"clr-focus-indicator\" [class.clr-focus]=\"focused\"></div>\n</div>\n\n<!-- Both close handlers are handled manually due to issues in Edge browser.\n Additionally 'outsideClickToClose' has complex handling that's necessary\n to be manual due to the component architecture -->\n<div role=\"dialog\" *clrPopoverContent=\"openState at smartPosition; outsideClickToClose: false; scrollToClose: false\">\n <ng-content></ng-content>\n</div>\n" }]
7318
7345
  }], ctorParameters: function () {
7319
7346
  return [{ type: i0.ViewContainerRef }, { type: i0.Injector }, { type: i1.NgControl, decorators: [{
7320
7347
  type: Self
@@ -7769,7 +7796,6 @@ class ClrDatalistContainer extends ClrAbstractContainer {
7769
7796
  ClrDatalistContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatalistContainer, deps: [{ token: ControlClassService }, { token: LayoutService, optional: true }, { token: NgControlService }, { token: FocusService }, { token: IfControlStateService }], target: i0.ɵɵFactoryTarget.Component });
7770
7797
  ClrDatalistContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatalistContainer, selector: "clr-datalist-container", host: { properties: { "class.clr-form-control": "true", "class.clr-form-control-disabled": "control?.disabled", "class.clr-row": "addGrid()" } }, providers: [
7771
7798
  ControlClassService,
7772
- LayoutService,
7773
7799
  ControlIdService,
7774
7800
  FocusService,
7775
7801
  NgControlService,
@@ -7846,7 +7872,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
7846
7872
  },
7847
7873
  providers: [
7848
7874
  ControlClassService,
7849
- LayoutService,
7850
7875
  ControlIdService,
7851
7876
  FocusService,
7852
7877
  NgControlService,
@@ -9657,7 +9682,7 @@ class ClrDatepickerViewManager {
9657
9682
  }
9658
9683
  }
9659
9684
  ClrDatepickerViewManager.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatepickerViewManager, deps: [{ token: ClrCommonStringsService }, { token: ViewManagerService }], target: i0.ɵɵFactoryTarget.Component });
9660
- ClrDatepickerViewManager.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatepickerViewManager, selector: "clr-datepicker-view-manager", host: { attributes: { "role": "dialog" }, properties: { "class.datepicker": "true", "attr.aria-modal": "true", "attr.aria-label": "commonStrings.keys.datepickerDialogLabel" } }, providers: [DatepickerFocusService], ngImport: i0, template: "<!--\n* Copyright (c) 2016-2023 VMware, Inc. All Rights Reserved.\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-monthpicker *ngIf=\"isMonthView\"></clr-monthpicker>\n<clr-yearpicker *ngIf=\"isYearView\"></clr-yearpicker>\n<clr-daypicker *ngIf=\"isDayView\"></clr-daypicker>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ClrMonthpicker, selector: "clr-monthpicker" }, { kind: "component", type: ClrYearpicker, selector: "clr-yearpicker" }, { kind: "component", type: ClrDaypicker, selector: "clr-daypicker" }] });
9685
+ ClrDatepickerViewManager.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatepickerViewManager, selector: "clr-datepicker-view-manager", host: { attributes: { "role": "dialog" }, properties: { "class.datepicker": "true", "attr.aria-modal": "true", "attr.aria-label": "commonStrings.keys.datepickerDialogLabel" } }, providers: [DatepickerFocusService], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n-->\n\n<clr-monthpicker *ngIf=\"isMonthView\"></clr-monthpicker>\n<clr-yearpicker *ngIf=\"isYearView\"></clr-yearpicker>\n<clr-daypicker *ngIf=\"isDayView\"></clr-daypicker>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ClrMonthpicker, selector: "clr-monthpicker" }, { kind: "component", type: ClrYearpicker, selector: "clr-yearpicker" }, { kind: "component", type: ClrDaypicker, selector: "clr-daypicker" }] });
9661
9686
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatepickerViewManager, decorators: [{
9662
9687
  type: Component,
9663
9688
  args: [{ selector: 'clr-datepicker-view-manager', providers: [DatepickerFocusService], host: {
@@ -9665,7 +9690,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
9665
9690
  '[attr.aria-modal]': 'true',
9666
9691
  '[attr.aria-label]': 'commonStrings.keys.datepickerDialogLabel',
9667
9692
  role: 'dialog',
9668
- }, template: "<!--\n* Copyright (c) 2016-2023 VMware, Inc. All Rights Reserved.\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-monthpicker *ngIf=\"isMonthView\"></clr-monthpicker>\n<clr-yearpicker *ngIf=\"isYearView\"></clr-yearpicker>\n<clr-daypicker *ngIf=\"isDayView\"></clr-daypicker>\n" }]
9693
+ }, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n-->\n\n<clr-monthpicker *ngIf=\"isMonthView\"></clr-monthpicker>\n<clr-yearpicker *ngIf=\"isYearView\"></clr-yearpicker>\n<clr-daypicker *ngIf=\"isDayView\"></clr-daypicker>\n" }]
9669
9694
  }], ctorParameters: function () { return [{ type: ClrCommonStringsService }, { type: ViewManagerService }]; } });
9670
9695
 
9671
9696
  /*
@@ -10294,6 +10319,395 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
10294
10319
  }]
10295
10320
  }], ctorParameters: function () { return []; } });
10296
10321
 
10322
+ /*
10323
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
10324
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
10325
+ * This software is released under MIT license.
10326
+ * The full license information can be found in LICENSE in the root directory of this project.
10327
+ */
10328
+ class ClrFileInputContainer extends ClrAbstractContainer {
10329
+ constructor() {
10330
+ super(...arguments);
10331
+ this.commonStrings = inject(ClrCommonStringsService);
10332
+ }
10333
+ get disabled() {
10334
+ return this.fileInput.elementRef.nativeElement.disabled;
10335
+ }
10336
+ get browseButtonDescribedBy() {
10337
+ return this.fileInput.elementRef.nativeElement.getAttribute('aria-describedby');
10338
+ }
10339
+ browse() {
10340
+ this.fileInput.elementRef.nativeElement.click();
10341
+ }
10342
+ clearSelectedFiles() {
10343
+ this.fileInput.elementRef.nativeElement.value = '';
10344
+ this.fileInput.elementRef.nativeElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
10345
+ this.browseButtonElementRef.nativeElement.focus();
10346
+ }
10347
+ }
10348
+ ClrFileInputContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputContainer, deps: null, target: i0.ɵɵFactoryTarget.Component });
10349
+ ClrFileInputContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrFileInputContainer, selector: "clr-file-input-container", inputs: { customButtonLabel: ["clrButtonLabel", "customButtonLabel"] }, host: { properties: { "class.clr-form-control": "true", "class.clr-form-control-disabled": "disabled", "class.clr-row": "addGrid()" } }, providers: [IfControlStateService, NgControlService, ControlIdService, ControlClassService], queries: [{ propertyName: "fileInput", first: true, predicate: i0.forwardRef(function () { return ClrFileInput; }), descendants: true }], viewQueries: [{ propertyName: "browseButtonElementRef", first: true, predicate: ["browseButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
10350
+ <ng-content select="label"></ng-content>
10351
+ <label *ngIf="!label && addGrid()"></label>
10352
+ <div class="clr-control-container" [ngClass]="controlClass()">
10353
+ <div class="clr-file-input-wrapper">
10354
+ <ng-content select="[clrFileInput]"></ng-content>
10355
+ <button
10356
+ #browseButton
10357
+ type="button"
10358
+ class="btn btn-sm clr-file-input-browse-button"
10359
+ [attr.aria-describedby]="browseButtonDescribedBy"
10360
+ [disabled]="disabled"
10361
+ (click)="browse()"
10362
+ >
10363
+ <cds-icon shape="folder-open"></cds-icon>
10364
+ <span class="clr-file-input-browse-button-text">
10365
+ {{ fileInput?.selection?.buttonLabel || customButtonLabel || commonStrings.keys.browse }}
10366
+ </span>
10367
+ </button>
10368
+ <button
10369
+ *ngIf="fileInput?.selection?.fileCount"
10370
+ type="button"
10371
+ class="btn btn-sm clr-file-input-clear-button"
10372
+ [attr.aria-label]="fileInput?.selection?.clearFilesButtonLabel"
10373
+ (click)="clearSelectedFiles()"
10374
+ >
10375
+ <cds-icon shape="times" status="neutral" size="md"></cds-icon>
10376
+ </button>
10377
+ <cds-icon
10378
+ *ngIf="showInvalid"
10379
+ class="clr-validate-icon"
10380
+ shape="exclamation-circle"
10381
+ status="danger"
10382
+ aria-hidden="true"
10383
+ ></cds-icon>
10384
+ <cds-icon
10385
+ *ngIf="showValid"
10386
+ class="clr-validate-icon"
10387
+ shape="check-circle"
10388
+ status="success"
10389
+ aria-hidden="true"
10390
+ ></cds-icon>
10391
+ </div>
10392
+ <ng-content select="clr-control-helper" *ngIf="showHelper"></ng-content>
10393
+ <ng-content select="clr-control-error" *ngIf="showInvalid"></ng-content>
10394
+ <ng-content select="clr-control-success" *ngIf="showValid"></ng-content>
10395
+ </div>
10396
+ `, isInline: true, 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: CdsIconCustomTag, selector: "cds-icon" }, { kind: "directive", type: ClrLabel, selector: "label", inputs: ["for"] }] });
10397
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputContainer, decorators: [{
10398
+ type: Component,
10399
+ args: [{
10400
+ selector: 'clr-file-input-container',
10401
+ template: `
10402
+ <ng-content select="label"></ng-content>
10403
+ <label *ngIf="!label && addGrid()"></label>
10404
+ <div class="clr-control-container" [ngClass]="controlClass()">
10405
+ <div class="clr-file-input-wrapper">
10406
+ <ng-content select="[clrFileInput]"></ng-content>
10407
+ <button
10408
+ #browseButton
10409
+ type="button"
10410
+ class="btn btn-sm clr-file-input-browse-button"
10411
+ [attr.aria-describedby]="browseButtonDescribedBy"
10412
+ [disabled]="disabled"
10413
+ (click)="browse()"
10414
+ >
10415
+ <cds-icon shape="folder-open"></cds-icon>
10416
+ <span class="clr-file-input-browse-button-text">
10417
+ {{ fileInput?.selection?.buttonLabel || customButtonLabel || commonStrings.keys.browse }}
10418
+ </span>
10419
+ </button>
10420
+ <button
10421
+ *ngIf="fileInput?.selection?.fileCount"
10422
+ type="button"
10423
+ class="btn btn-sm clr-file-input-clear-button"
10424
+ [attr.aria-label]="fileInput?.selection?.clearFilesButtonLabel"
10425
+ (click)="clearSelectedFiles()"
10426
+ >
10427
+ <cds-icon shape="times" status="neutral" size="md"></cds-icon>
10428
+ </button>
10429
+ <cds-icon
10430
+ *ngIf="showInvalid"
10431
+ class="clr-validate-icon"
10432
+ shape="exclamation-circle"
10433
+ status="danger"
10434
+ aria-hidden="true"
10435
+ ></cds-icon>
10436
+ <cds-icon
10437
+ *ngIf="showValid"
10438
+ class="clr-validate-icon"
10439
+ shape="check-circle"
10440
+ status="success"
10441
+ aria-hidden="true"
10442
+ ></cds-icon>
10443
+ </div>
10444
+ <ng-content select="clr-control-helper" *ngIf="showHelper"></ng-content>
10445
+ <ng-content select="clr-control-error" *ngIf="showInvalid"></ng-content>
10446
+ <ng-content select="clr-control-success" *ngIf="showValid"></ng-content>
10447
+ </div>
10448
+ `,
10449
+ host: {
10450
+ '[class.clr-form-control]': 'true',
10451
+ '[class.clr-form-control-disabled]': 'disabled',
10452
+ '[class.clr-row]': 'addGrid()',
10453
+ },
10454
+ providers: [IfControlStateService, NgControlService, ControlIdService, ControlClassService],
10455
+ }]
10456
+ }], propDecorators: { customButtonLabel: [{
10457
+ type: Input,
10458
+ args: ['clrButtonLabel']
10459
+ }], fileInput: [{
10460
+ type: ContentChild,
10461
+ args: [forwardRef(() => ClrFileInput)]
10462
+ }], browseButtonElementRef: [{
10463
+ type: ViewChild,
10464
+ args: ['browseButton']
10465
+ }] } });
10466
+
10467
+ /*
10468
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
10469
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
10470
+ * This software is released under MIT license.
10471
+ * The full license information can be found in LICENSE in the root directory of this project.
10472
+ */
10473
+ class ClrFileInput extends WrappedFormControl {
10474
+ constructor(injector, renderer, viewContainerRef, elementRef, control, commonStrings) {
10475
+ super(viewContainerRef, ClrFileInputContainer, injector, control, renderer, elementRef);
10476
+ this.elementRef = elementRef;
10477
+ this.commonStrings = commonStrings;
10478
+ this.selection = undefined;
10479
+ }
10480
+ handleChange() {
10481
+ this.updateSelection();
10482
+ }
10483
+ updateSelection() {
10484
+ const files = this.elementRef.nativeElement.files;
10485
+ let selectionButtonLabel;
10486
+ let clearFilesButtonLabel;
10487
+ if ((files === null || files === void 0 ? void 0 : files.length) === 1) {
10488
+ const filename = files[0].name;
10489
+ selectionButtonLabel = filename;
10490
+ clearFilesButtonLabel = this.commonStrings.parse(this.commonStrings.keys.clearFile, {
10491
+ FILE: filename,
10492
+ });
10493
+ }
10494
+ else if ((files === null || files === void 0 ? void 0 : files.length) > 1) {
10495
+ const fileCount = files.length.toString();
10496
+ selectionButtonLabel = this.commonStrings.parse(this.commonStrings.keys.fileCount, {
10497
+ COUNT: fileCount,
10498
+ });
10499
+ clearFilesButtonLabel = this.commonStrings.parse(this.commonStrings.keys.clearFiles, {
10500
+ COUNT: fileCount,
10501
+ });
10502
+ }
10503
+ this.selection = {
10504
+ fileCount: files.length,
10505
+ buttonLabel: selectionButtonLabel,
10506
+ clearFilesButtonLabel,
10507
+ };
10508
+ }
10509
+ }
10510
+ ClrFileInput.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInput, deps: [{ token: i0.Injector }, { token: i0.Renderer2 }, { token: i0.ViewContainerRef }, { token: i0.ElementRef }, { token: i1.NgControl, optional: true, self: true }, { token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Directive });
10511
+ ClrFileInput.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrFileInput, selector: "input[type=\"file\"][clrFileInput]", host: { listeners: { "change": "handleChange()" }, properties: { "class.clr-file-input": "true" } }, usesInheritance: true, ngImport: i0 });
10512
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInput, decorators: [{
10513
+ type: Directive,
10514
+ args: [{
10515
+ selector: 'input[type="file"][clrFileInput]',
10516
+ host: {
10517
+ '[class.clr-file-input]': 'true',
10518
+ },
10519
+ }]
10520
+ }], ctorParameters: function () {
10521
+ return [{ type: i0.Injector }, { type: i0.Renderer2 }, { type: i0.ViewContainerRef }, { type: i0.ElementRef }, { type: i1.NgControl, decorators: [{
10522
+ type: Self
10523
+ }, {
10524
+ type: Optional
10525
+ }] }, { type: ClrCommonStringsService }];
10526
+ }, propDecorators: { handleChange: [{
10527
+ type: HostListener,
10528
+ args: ['change']
10529
+ }] } });
10530
+
10531
+ /*
10532
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
10533
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
10534
+ * This software is released under MIT license.
10535
+ * The full license information can be found in LICENSE in the root directory of this project.
10536
+ */
10537
+ class ClrFileInputValidator {
10538
+ constructor(elementRef) {
10539
+ this.elementRef = elementRef;
10540
+ }
10541
+ validate(control) {
10542
+ const files = control.value;
10543
+ const fileInputElement = this.elementRef.nativeElement;
10544
+ const errors = {};
10545
+ // required validation (native attribute)
10546
+ if (fileInputElement.required && (files === null || files === void 0 ? void 0 : files.length) === 0) {
10547
+ errors.required = true;
10548
+ }
10549
+ // accept validation (native attribute)
10550
+ if (fileInputElement.accept && (files === null || files === void 0 ? void 0 : files.length) > 0) {
10551
+ const accept = fileInputElement.accept.split(',').map(type => type.trim());
10552
+ for (let i = 0; i < files.length; i++) {
10553
+ const file = files.item(i);
10554
+ const [fileExtension] = file.name.match(/\..+$/);
10555
+ if (!accept.includes(file.type) && !accept.includes(fileExtension)) {
10556
+ errors.accept = errors.accept || [];
10557
+ errors.accept.push({ name: file.name, accept, type: file.type, extension: fileExtension });
10558
+ }
10559
+ }
10560
+ }
10561
+ // min file validation (custom input)
10562
+ if (this.minFileSize && (files === null || files === void 0 ? void 0 : files.length) > 0) {
10563
+ for (let i = 0; i < files.length; i++) {
10564
+ const file = files.item(i);
10565
+ if (file.size < this.minFileSize) {
10566
+ errors.minFileSize = errors.minFileSize || [];
10567
+ errors.minFileSize.push({ name: file.name, minFileSize: this.minFileSize, actualFileSize: file.size });
10568
+ }
10569
+ }
10570
+ }
10571
+ // max file validation (custom input)
10572
+ if (this.maxFileSize && (files === null || files === void 0 ? void 0 : files.length) > 0) {
10573
+ for (let i = 0; i < files.length; i++) {
10574
+ const file = files.item(i);
10575
+ if (file.size > this.maxFileSize) {
10576
+ errors.maxFileSize = errors.maxFileSize || [];
10577
+ errors.maxFileSize.push({ name: file.name, maxFileSize: this.maxFileSize, actualFileSize: file.size });
10578
+ }
10579
+ }
10580
+ }
10581
+ return Object.keys(errors).length ? errors : null;
10582
+ }
10583
+ }
10584
+ ClrFileInputValidator.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputValidator, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
10585
+ ClrFileInputValidator.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrFileInputValidator, selector: "input[type=\"file\"][clrFileInput]", inputs: { minFileSize: ["clrMinFileSize", "minFileSize"], maxFileSize: ["clrMaxFileSize", "maxFileSize"] }, providers: [{ provide: NG_VALIDATORS, useExisting: ClrFileInputValidator, multi: true }], ngImport: i0 });
10586
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputValidator, decorators: [{
10587
+ type: Directive,
10588
+ args: [{
10589
+ selector: 'input[type="file"][clrFileInput]',
10590
+ providers: [{ provide: NG_VALIDATORS, useExisting: ClrFileInputValidator, multi: true }],
10591
+ }]
10592
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { minFileSize: [{
10593
+ type: Input,
10594
+ args: ['clrMinFileSize']
10595
+ }], maxFileSize: [{
10596
+ type: Input,
10597
+ args: ['clrMaxFileSize']
10598
+ }] } });
10599
+
10600
+ /*
10601
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
10602
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
10603
+ * This software is released under MIT license.
10604
+ * The full license information can be found in LICENSE in the root directory of this project.
10605
+ */
10606
+ function buildFileList(files) {
10607
+ const dataTransfer = new DataTransfer();
10608
+ for (const file of files) {
10609
+ dataTransfer.items.add(file);
10610
+ }
10611
+ return dataTransfer.files;
10612
+ }
10613
+ function selectFiles(fileInputElement, files) {
10614
+ fileInputElement.files = files instanceof FileList ? files : buildFileList(files);
10615
+ fileInputElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
10616
+ }
10617
+ function clearFiles(fileInputElement) {
10618
+ fileInputElement.value = '';
10619
+ fileInputElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
10620
+ }
10621
+
10622
+ /*
10623
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
10624
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
10625
+ * This software is released under MIT license.
10626
+ * The full license information can be found in LICENSE in the root directory of this project.
10627
+ */
10628
+ class ClrFileInputValueAccessor {
10629
+ constructor(elementRef) {
10630
+ this.elementRef = elementRef;
10631
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
10632
+ this.onChange = (_value) => { };
10633
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
10634
+ this.onTouched = () => { };
10635
+ }
10636
+ writeValue(value) {
10637
+ if (value !== undefined && value !== null && !(value instanceof FileList)) {
10638
+ throw new Error('The value of a file input control must be a FileList.');
10639
+ }
10640
+ if (value) {
10641
+ selectFiles(this.elementRef.nativeElement, value);
10642
+ }
10643
+ else if (this.elementRef.nativeElement.files.length) {
10644
+ clearFiles(this.elementRef.nativeElement);
10645
+ }
10646
+ }
10647
+ registerOnChange(fn) {
10648
+ this.onChange = fn;
10649
+ }
10650
+ registerOnTouched(fn) {
10651
+ this.onTouched = fn;
10652
+ }
10653
+ handleChange() {
10654
+ this.onTouched();
10655
+ this.onChange(this.elementRef.nativeElement.files);
10656
+ }
10657
+ }
10658
+ ClrFileInputValueAccessor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputValueAccessor, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
10659
+ ClrFileInputValueAccessor.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrFileInputValueAccessor, selector: "input[type=\"file\"][clrFileInput]", host: { listeners: { "change": "handleChange()" } }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: ClrFileInputValueAccessor, multi: true }], ngImport: i0 });
10660
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputValueAccessor, decorators: [{
10661
+ type: Directive,
10662
+ args: [{
10663
+ selector: 'input[type="file"][clrFileInput]',
10664
+ providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: ClrFileInputValueAccessor, multi: true }],
10665
+ }]
10666
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { handleChange: [{
10667
+ type: HostListener,
10668
+ args: ['change']
10669
+ }] } });
10670
+
10671
+ /*
10672
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
10673
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
10674
+ * This software is released under MIT license.
10675
+ * The full license information can be found in LICENSE in the root directory of this project.
10676
+ */
10677
+ class ClrFileInputModule {
10678
+ constructor() {
10679
+ ClarityIcons.addIcons(folderOpenIcon);
10680
+ }
10681
+ }
10682
+ ClrFileInputModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
10683
+ ClrFileInputModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputModule, declarations: [ClrFileInput, ClrFileInputContainer, ClrFileInputValidator, ClrFileInputValueAccessor], imports: [CommonModule, ClrIconModule, ClrCommonFormsModule], exports: [ClrCommonFormsModule,
10684
+ ClrFileInput,
10685
+ ClrFileInputContainer,
10686
+ ClrFileInputValidator,
10687
+ ClrFileInputValueAccessor] });
10688
+ ClrFileInputModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputModule, imports: [CommonModule, ClrIconModule, ClrCommonFormsModule, ClrCommonFormsModule] });
10689
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputModule, decorators: [{
10690
+ type: NgModule,
10691
+ args: [{
10692
+ imports: [CommonModule, ClrIconModule, ClrCommonFormsModule],
10693
+ declarations: [ClrFileInput, ClrFileInputContainer, ClrFileInputValidator, ClrFileInputValueAccessor],
10694
+ exports: [
10695
+ ClrCommonFormsModule,
10696
+ ClrFileInput,
10697
+ ClrFileInputContainer,
10698
+ ClrFileInputValidator,
10699
+ ClrFileInputValueAccessor,
10700
+ ],
10701
+ }]
10702
+ }], ctorParameters: function () { return []; } });
10703
+
10704
+ /*
10705
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
10706
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
10707
+ * This software is released under MIT license.
10708
+ * The full license information can be found in LICENSE in the root directory of this project.
10709
+ */
10710
+
10297
10711
  /*
10298
10712
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
10299
10713
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -11236,6 +11650,7 @@ ClrFormsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version:
11236
11650
  ClrCheckboxModule,
11237
11651
  ClrComboboxModule,
11238
11652
  ClrDatepickerModule,
11653
+ ClrFileInputModule,
11239
11654
  ClrInputModule,
11240
11655
  ClrPasswordModule,
11241
11656
  ClrRadioModule,
@@ -11247,6 +11662,7 @@ ClrFormsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version:
11247
11662
  ClrCheckboxModule,
11248
11663
  ClrComboboxModule,
11249
11664
  ClrDatepickerModule,
11665
+ ClrFileInputModule,
11250
11666
  ClrInputModule,
11251
11667
  ClrPasswordModule,
11252
11668
  ClrRadioModule,
@@ -11263,6 +11679,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
11263
11679
  ClrCheckboxModule,
11264
11680
  ClrComboboxModule,
11265
11681
  ClrDatepickerModule,
11682
+ ClrFileInputModule,
11266
11683
  ClrInputModule,
11267
11684
  ClrPasswordModule,
11268
11685
  ClrRadioModule,
@@ -12729,6 +13146,11 @@ class DetailService {
12729
13146
  this.toggleState = false;
12730
13147
  this._state.next(this.toggleState);
12731
13148
  this.modalStackService.trackModalClose(this);
13149
+ // In the case of browser zoom greater than 250%, the detail pane toggle button is not visible on the page.
13150
+ // Wait for the detail pane to close, and return focus to the detail toggle button.
13151
+ setTimeout(() => this.returnFocus(), 0);
13152
+ }
13153
+ returnFocus() {
12732
13154
  if (this.button) {
12733
13155
  this.button.focus();
12734
13156
  this.button = null;
@@ -13038,7 +13460,7 @@ class DatagridRenderOrganizer {
13038
13460
  this._renderStep.next(DatagridRenderStep.CLEAR_WIDTHS);
13039
13461
  }
13040
13462
  this._renderStep.next(DatagridRenderStep.COMPUTE_COLUMN_WIDTHS);
13041
- this._renderStep.next(DatagridRenderStep.ALIGN_COLUMNS);
13463
+ this._renderStep.next(DatagridRenderStep.ALIGN_COLUMNS); // NOT USED
13042
13464
  this.alreadySized = true;
13043
13465
  this._renderStep.next(DatagridRenderStep.CALCULATE_MODE_OFF);
13044
13466
  }
@@ -14753,6 +15175,7 @@ class ClrDatagridSelectionCellDirective {
14753
15175
  this.selection = selection;
14754
15176
  }
14755
15177
  onSelectionCellClick(event) {
15178
+ var _a;
14756
15179
  // We want to effectively expand the selection click target to the entire selection cell.
14757
15180
  // If row selection is enabled, do nothing because the entire selection cell is already clickable.
14758
15181
  if (this.selection.rowSelectionMode) {
@@ -14760,7 +15183,7 @@ class ClrDatagridSelectionCellDirective {
14760
15183
  }
14761
15184
  // If click was outside the label/input, forward the click to the input.
14762
15185
  if (event.target.tagName !== 'LABEL' && event.target.tagName !== 'INPUT') {
14763
- event.target.querySelector('input').click();
15186
+ (_a = event.target.querySelector('input')) === null || _a === void 0 ? void 0 : _a.click();
14764
15187
  }
14765
15188
  }
14766
15189
  }
@@ -15030,7 +15453,7 @@ ClrDatagridRow.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version
15030
15453
  DatagridIfExpandService,
15031
15454
  { provide: IfExpandService, useExisting: DatagridIfExpandService },
15032
15455
  { provide: LoadingListener, useExisting: DatagridIfExpandService },
15033
- ], queries: [{ propertyName: "dgCells", predicate: ClrDatagridCell }], viewQueries: [{ propertyName: "expandAnimation", first: true, predicate: ClrExpandableAnimation, descendants: true }, { propertyName: "detailButton", first: true, predicate: ["detailButton"], descendants: true }, { propertyName: "_stickyCells", first: true, predicate: ["stickyCells"], descendants: true, read: ViewContainerRef }, { propertyName: "_scrollableCells", first: true, predicate: ["scrollableCells"], descendants: true, read: ViewContainerRef }, { propertyName: "_calculatedCells", first: true, predicate: ["calculatedCells"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!--\n We need to wrap the #rowContent in label element if we are in rowSelectionMode.\n Clicking of that wrapper label will equate to clicking on the whole row, which triggers the checkbox to toggle.\n-->\n<div\n class=\"datagrid-row-clickable\"\n *ngIf=\"selection.rowSelectionMode\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n>\n <clr-expandable-animation [clrExpandTrigger]=\"expandAnimationTrigger\" *ngIf=\"expand.expandable\">\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n </clr-expandable-animation>\n <ng-template [ngTemplateOutlet]=\"rowContent\" *ngIf=\"!expand.expandable\"></ng-template>\n</div>\n\n<clr-expandable-animation\n *ngIf=\"!selection.rowSelectionMode && expand.expandable\"\n [clrExpandTrigger]=\"expandAnimationTrigger\"\n>\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n</clr-expandable-animation>\n\n<ng-template *ngIf=\"!selection.rowSelectionMode && !expand.expandable\" [ngTemplateOutlet]=\"rowContent\"></ng-template>\n\n<!--\n We need the \"project into template\" hacks because we need this in 2 different places\n depending on whether the details replace the row or not.\n-->\n<ng-template #detail>\n <ng-content select=\"clr-dg-row-detail\"></ng-content>\n</ng-template>\n\n<ng-template #rowContent>\n <div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [class.datagrid-row-detail-open]=\"detailService.isRowOpen(item)\"\n >\n <div class=\"datagrid-row-sticky\">\n <!-- Sticky elements here -->\n <ng-container #stickyCells>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-checkbox-wrapper>\n <input\n type=\"checkbox\"\n clrCheckbox\n [ngModel]=\"selected\"\n (ngModelChange)=\"toggle($event)\"\n [id]=\"checkboxId\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"checkboxId\" class=\"clr-control-label clr-col-null\" (click)=\"clearRanges($event)\">\n <span class=\"clr-sr-only\">{{clrDgRowSelectionLabel || commonStrings.keys.select}}</span>\n </label>\n </clr-checkbox-wrapper>\n </div>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-radio-wrapper>\n <input\n type=\"radio\"\n clrRadio\n [id]=\"radioId\"\n [name]=\"selection.id + '-radio'\"\n [value]=\"item\"\n [(ngModel)]=\"selection.currentSingle\"\n [checked]=\"selection.currentSingle === item\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <label class=\"clr-control-label clr-col-null\" [for]=\"radioId\">\n <span class=\"clr-sr-only\">{{ clrDgRowSelectionLabel || commonStrings.keys.select }}</span>\n </label>\n </clr-radio-wrapper>\n </div>\n <div\n *ngIf=\"rowActionService.hasActionableRow\"\n class=\"datagrid-row-actions datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-content select=\"clr-dg-action-overflow\"></ng-content>\n </div>\n <div\n *ngIf=\"globalExpandable.hasExpandableRow\"\n class=\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-container *ngIf=\"expand.expandable\">\n <button\n *ngIf=\"!expand.loading\"\n (click)=\"toggleExpand()\"\n type=\"button\"\n class=\"datagrid-expandable-caret-button\"\n [attr.aria-expanded]=\"expand.expanded\"\n [attr.aria-label]=\"expand.expanded ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-controls]=\"expandableId\"\n >\n <cds-icon\n shape=\"angle\"\n class=\"datagrid-expandable-caret-icon\"\n [attr.direction]=\"expand.expanded ? 'down' : 'right'\"\n [attr.title]=\"expand.expanded ? commonStrings.keys.collapse : commonStrings.keys.expand\"\n ></cds-icon>\n </button>\n <clr-spinner *ngIf=\"expand.loading\" clrSmall>{{ commonStrings.keys.loading }}</clr-spinner>\n </ng-container>\n </div>\n <div *ngIf=\"detailService.enabled\" class=\"datagrid-detail-caret datagrid-fixed-column datagrid-cell\">\n <button\n (click)=\"detailService.toggle(item, detailButton)\"\n type=\"button\"\n #detailButton\n class=\"datagrid-detail-caret-button\"\n [class.is-open]=\"detailService.isRowOpen(item)\"\n [attr.aria-label]=\"detailService.isRowOpen(item) ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-expanded]=\"detailService.isOpen\"\n [attr.aria-controls]=\"detailService.id\"\n aria-haspopup=\"dialog\"\n >\n <cds-icon\n shape=\"angle-double\"\n [attr.direction]=\"detailService.isRowOpen(item) ? 'left' : 'right'\"\n class=\"datagrid-detail-caret-icon\"\n [attr.title]=\"detailService.isRowOpen(item) ? commonStrings.keys.close: commonStrings.keys.open\"\n ></cds-icon>\n </button>\n </div>\n </ng-container>\n <!-- placeholder for projecting other sticky cells as pinned-->\n </div>\n <div class=\"datagrid-row-scrollable\" [ngClass]=\"{'is-replaced': replaced && expanded}\">\n <div class=\"datagrid-scrolling-cells\">\n <ng-content select=\"clr-dg-cell\"></ng-content>\n <ng-container #scrollableCells></ng-container>\n </div>\n <!-- details here when replace, re-visit when sticky container is used for pinned cells -->\n <ng-template *ngIf=\"replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n <ng-template *ngIf=\"!replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n </div>\n </div>\n</ng-template>\n\n<ng-container #calculatedCells></ng-container>\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "directive", type: ClrLabel, selector: "label", inputs: ["for"] }, { kind: "directive", type: ClrCheckbox, selector: "[clrCheckbox],[clrToggle]" }, { kind: "component", type: ClrCheckboxWrapper, selector: "clr-checkbox-wrapper,clr-toggle-wrapper" }, { kind: "directive", type: ClrRadio, selector: "[clrRadio]" }, { kind: "component", type: ClrRadioWrapper, selector: "clr-radio-wrapper" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ClrExpandableAnimation, selector: "clr-expandable-animation", inputs: ["clrExpandTrigger"] }, { kind: "component", type: ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }, { kind: "directive", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select" }] });
15456
+ ], queries: [{ propertyName: "dgCells", predicate: ClrDatagridCell }], viewQueries: [{ propertyName: "expandAnimation", first: true, predicate: ClrExpandableAnimation, descendants: true }, { propertyName: "detailButton", first: true, predicate: ["detailButton"], descendants: true }, { propertyName: "_stickyCells", first: true, predicate: ["stickyCells"], descendants: true, read: ViewContainerRef }, { propertyName: "_scrollableCells", first: true, predicate: ["scrollableCells"], descendants: true, read: ViewContainerRef }, { propertyName: "_calculatedCells", first: true, predicate: ["calculatedCells"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!--\n We need to wrap the #rowContent in label element if we are in rowSelectionMode.\n Clicking of that wrapper label will equate to clicking on the whole row, which triggers the checkbox to toggle.\n-->\n<div\n class=\"datagrid-row-clickable\"\n *ngIf=\"selection.rowSelectionMode\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n>\n <clr-expandable-animation [clrExpandTrigger]=\"expandAnimationTrigger\" *ngIf=\"expand.expandable\">\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n </clr-expandable-animation>\n <ng-template [ngTemplateOutlet]=\"rowContent\" *ngIf=\"!expand.expandable\"></ng-template>\n</div>\n\n<clr-expandable-animation\n *ngIf=\"!selection.rowSelectionMode && expand.expandable\"\n [clrExpandTrigger]=\"expandAnimationTrigger\"\n>\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n</clr-expandable-animation>\n\n<ng-template *ngIf=\"!selection.rowSelectionMode && !expand.expandable\" [ngTemplateOutlet]=\"rowContent\"></ng-template>\n\n<!--\n We need the \"project into template\" hacks because we need this in 2 different places\n depending on whether the details replace the row or not.\n-->\n<ng-template #detail>\n <ng-content select=\"clr-dg-row-detail\"></ng-content>\n</ng-template>\n\n<ng-template #rowContent>\n <div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [class.datagrid-row-detail-open]=\"detailService.isRowOpen(item)\"\n >\n <div class=\"datagrid-row-sticky\">\n <!-- Sticky elements here -->\n <ng-container #stickyCells>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-checkbox-wrapper>\n <input\n type=\"checkbox\"\n clrCheckbox\n [ngModel]=\"selected\"\n (ngModelChange)=\"toggle($event)\"\n [id]=\"checkboxId\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"checkboxId\" class=\"clr-control-label clr-col-null\" (click)=\"clearRanges($event)\">\n <span class=\"clr-sr-only\">{{clrDgRowSelectionLabel || commonStrings.keys.select}}</span>\n </label>\n </clr-checkbox-wrapper>\n </div>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-radio-wrapper>\n <input\n type=\"radio\"\n clrRadio\n [id]=\"radioId\"\n [name]=\"selection.id + '-radio'\"\n [value]=\"item\"\n [(ngModel)]=\"selection.currentSingle\"\n [checked]=\"selection.currentSingle === item\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <label class=\"clr-control-label clr-col-null\" [for]=\"radioId\">\n <span class=\"clr-sr-only\">{{ clrDgRowSelectionLabel || commonStrings.keys.select }}</span>\n </label>\n </clr-radio-wrapper>\n </div>\n <div\n *ngIf=\"rowActionService.hasActionableRow\"\n class=\"datagrid-row-actions datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-content select=\"clr-dg-action-overflow\"></ng-content>\n </div>\n <div\n *ngIf=\"globalExpandable.hasExpandableRow\"\n class=\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-container *ngIf=\"expand.expandable\">\n <button\n *ngIf=\"!expand.loading\"\n (click)=\"toggleExpand()\"\n type=\"button\"\n class=\"datagrid-expandable-caret-button\"\n [attr.aria-expanded]=\"expand.expanded\"\n [attr.aria-label]=\"expand.expanded ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-controls]=\"expandableId\"\n >\n <cds-icon\n shape=\"angle\"\n class=\"datagrid-expandable-caret-icon\"\n [attr.direction]=\"expand.expanded ? 'down' : 'right'\"\n [attr.title]=\"expand.expanded ? commonStrings.keys.collapse : commonStrings.keys.expand\"\n ></cds-icon>\n </button>\n <clr-spinner *ngIf=\"expand.loading\" clrSmall>{{ commonStrings.keys.loading }}</clr-spinner>\n </ng-container>\n </div>\n <div\n *ngIf=\"detailService.enabled\"\n class=\"datagrid-detail-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <button\n (click)=\"detailService.toggle(item, detailButton)\"\n type=\"button\"\n #detailButton\n class=\"datagrid-detail-caret-button\"\n [class.is-open]=\"detailService.isRowOpen(item)\"\n [attr.aria-label]=\"detailService.isRowOpen(item) ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-expanded]=\"detailService.isRowOpen(item)\"\n [attr.aria-controls]=\"detailService.id\"\n aria-haspopup=\"dialog\"\n >\n <cds-icon\n shape=\"angle-double\"\n [attr.direction]=\"detailService.isRowOpen(item) ? 'left' : 'right'\"\n class=\"datagrid-detail-caret-icon\"\n [attr.title]=\"detailService.isRowOpen(item) ? commonStrings.keys.close: commonStrings.keys.open\"\n ></cds-icon>\n </button>\n </div>\n </ng-container>\n <!-- placeholder for projecting other sticky cells as pinned-->\n </div>\n <div class=\"datagrid-row-scrollable\" [ngClass]=\"{'is-replaced': replaced && expanded}\">\n <div class=\"datagrid-scrolling-cells\">\n <ng-content select=\"clr-dg-cell\"></ng-content>\n <ng-container #scrollableCells></ng-container>\n </div>\n <!-- details here when replace, re-visit when sticky container is used for pinned cells -->\n <ng-template *ngIf=\"replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n <ng-template *ngIf=\"!replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n </div>\n </div>\n</ng-template>\n\n<ng-container #calculatedCells></ng-container>\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "directive", type: ClrLabel, selector: "label", inputs: ["for"] }, { kind: "directive", type: ClrCheckbox, selector: "[clrCheckbox],[clrToggle]" }, { kind: "component", type: ClrCheckboxWrapper, selector: "clr-checkbox-wrapper,clr-toggle-wrapper" }, { kind: "directive", type: ClrRadio, selector: "[clrRadio]" }, { kind: "component", type: ClrRadioWrapper, selector: "clr-radio-wrapper" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ClrExpandableAnimation, selector: "clr-expandable-animation", inputs: ["clrExpandTrigger"] }, { kind: "component", type: ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }, { kind: "directive", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select" }] });
15034
15457
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridRow, decorators: [{
15035
15458
  type: Component,
15036
15459
  args: [{ selector: 'clr-dg-row', host: {
@@ -15042,7 +15465,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15042
15465
  DatagridIfExpandService,
15043
15466
  { provide: IfExpandService, useExisting: DatagridIfExpandService },
15044
15467
  { provide: LoadingListener, useExisting: DatagridIfExpandService },
15045
- ], template: "<!--\n We need to wrap the #rowContent in label element if we are in rowSelectionMode.\n Clicking of that wrapper label will equate to clicking on the whole row, which triggers the checkbox to toggle.\n-->\n<div\n class=\"datagrid-row-clickable\"\n *ngIf=\"selection.rowSelectionMode\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n>\n <clr-expandable-animation [clrExpandTrigger]=\"expandAnimationTrigger\" *ngIf=\"expand.expandable\">\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n </clr-expandable-animation>\n <ng-template [ngTemplateOutlet]=\"rowContent\" *ngIf=\"!expand.expandable\"></ng-template>\n</div>\n\n<clr-expandable-animation\n *ngIf=\"!selection.rowSelectionMode && expand.expandable\"\n [clrExpandTrigger]=\"expandAnimationTrigger\"\n>\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n</clr-expandable-animation>\n\n<ng-template *ngIf=\"!selection.rowSelectionMode && !expand.expandable\" [ngTemplateOutlet]=\"rowContent\"></ng-template>\n\n<!--\n We need the \"project into template\" hacks because we need this in 2 different places\n depending on whether the details replace the row or not.\n-->\n<ng-template #detail>\n <ng-content select=\"clr-dg-row-detail\"></ng-content>\n</ng-template>\n\n<ng-template #rowContent>\n <div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [class.datagrid-row-detail-open]=\"detailService.isRowOpen(item)\"\n >\n <div class=\"datagrid-row-sticky\">\n <!-- Sticky elements here -->\n <ng-container #stickyCells>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-checkbox-wrapper>\n <input\n type=\"checkbox\"\n clrCheckbox\n [ngModel]=\"selected\"\n (ngModelChange)=\"toggle($event)\"\n [id]=\"checkboxId\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"checkboxId\" class=\"clr-control-label clr-col-null\" (click)=\"clearRanges($event)\">\n <span class=\"clr-sr-only\">{{clrDgRowSelectionLabel || commonStrings.keys.select}}</span>\n </label>\n </clr-checkbox-wrapper>\n </div>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-radio-wrapper>\n <input\n type=\"radio\"\n clrRadio\n [id]=\"radioId\"\n [name]=\"selection.id + '-radio'\"\n [value]=\"item\"\n [(ngModel)]=\"selection.currentSingle\"\n [checked]=\"selection.currentSingle === item\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <label class=\"clr-control-label clr-col-null\" [for]=\"radioId\">\n <span class=\"clr-sr-only\">{{ clrDgRowSelectionLabel || commonStrings.keys.select }}</span>\n </label>\n </clr-radio-wrapper>\n </div>\n <div\n *ngIf=\"rowActionService.hasActionableRow\"\n class=\"datagrid-row-actions datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-content select=\"clr-dg-action-overflow\"></ng-content>\n </div>\n <div\n *ngIf=\"globalExpandable.hasExpandableRow\"\n class=\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-container *ngIf=\"expand.expandable\">\n <button\n *ngIf=\"!expand.loading\"\n (click)=\"toggleExpand()\"\n type=\"button\"\n class=\"datagrid-expandable-caret-button\"\n [attr.aria-expanded]=\"expand.expanded\"\n [attr.aria-label]=\"expand.expanded ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-controls]=\"expandableId\"\n >\n <cds-icon\n shape=\"angle\"\n class=\"datagrid-expandable-caret-icon\"\n [attr.direction]=\"expand.expanded ? 'down' : 'right'\"\n [attr.title]=\"expand.expanded ? commonStrings.keys.collapse : commonStrings.keys.expand\"\n ></cds-icon>\n </button>\n <clr-spinner *ngIf=\"expand.loading\" clrSmall>{{ commonStrings.keys.loading }}</clr-spinner>\n </ng-container>\n </div>\n <div *ngIf=\"detailService.enabled\" class=\"datagrid-detail-caret datagrid-fixed-column datagrid-cell\">\n <button\n (click)=\"detailService.toggle(item, detailButton)\"\n type=\"button\"\n #detailButton\n class=\"datagrid-detail-caret-button\"\n [class.is-open]=\"detailService.isRowOpen(item)\"\n [attr.aria-label]=\"detailService.isRowOpen(item) ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-expanded]=\"detailService.isOpen\"\n [attr.aria-controls]=\"detailService.id\"\n aria-haspopup=\"dialog\"\n >\n <cds-icon\n shape=\"angle-double\"\n [attr.direction]=\"detailService.isRowOpen(item) ? 'left' : 'right'\"\n class=\"datagrid-detail-caret-icon\"\n [attr.title]=\"detailService.isRowOpen(item) ? commonStrings.keys.close: commonStrings.keys.open\"\n ></cds-icon>\n </button>\n </div>\n </ng-container>\n <!-- placeholder for projecting other sticky cells as pinned-->\n </div>\n <div class=\"datagrid-row-scrollable\" [ngClass]=\"{'is-replaced': replaced && expanded}\">\n <div class=\"datagrid-scrolling-cells\">\n <ng-content select=\"clr-dg-cell\"></ng-content>\n <ng-container #scrollableCells></ng-container>\n </div>\n <!-- details here when replace, re-visit when sticky container is used for pinned cells -->\n <ng-template *ngIf=\"replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n <ng-template *ngIf=\"!replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n </div>\n </div>\n</ng-template>\n\n<ng-container #calculatedCells></ng-container>\n" }]
15468
+ ], template: "<!--\n We need to wrap the #rowContent in label element if we are in rowSelectionMode.\n Clicking of that wrapper label will equate to clicking on the whole row, which triggers the checkbox to toggle.\n-->\n<div\n class=\"datagrid-row-clickable\"\n *ngIf=\"selection.rowSelectionMode\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n>\n <clr-expandable-animation [clrExpandTrigger]=\"expandAnimationTrigger\" *ngIf=\"expand.expandable\">\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n </clr-expandable-animation>\n <ng-template [ngTemplateOutlet]=\"rowContent\" *ngIf=\"!expand.expandable\"></ng-template>\n</div>\n\n<clr-expandable-animation\n *ngIf=\"!selection.rowSelectionMode && expand.expandable\"\n [clrExpandTrigger]=\"expandAnimationTrigger\"\n>\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n</clr-expandable-animation>\n\n<ng-template *ngIf=\"!selection.rowSelectionMode && !expand.expandable\" [ngTemplateOutlet]=\"rowContent\"></ng-template>\n\n<!--\n We need the \"project into template\" hacks because we need this in 2 different places\n depending on whether the details replace the row or not.\n-->\n<ng-template #detail>\n <ng-content select=\"clr-dg-row-detail\"></ng-content>\n</ng-template>\n\n<ng-template #rowContent>\n <div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [class.datagrid-row-detail-open]=\"detailService.isRowOpen(item)\"\n >\n <div class=\"datagrid-row-sticky\">\n <!-- Sticky elements here -->\n <ng-container #stickyCells>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-checkbox-wrapper>\n <input\n type=\"checkbox\"\n clrCheckbox\n [ngModel]=\"selected\"\n (ngModelChange)=\"toggle($event)\"\n [id]=\"checkboxId\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"checkboxId\" class=\"clr-control-label clr-col-null\" (click)=\"clearRanges($event)\">\n <span class=\"clr-sr-only\">{{clrDgRowSelectionLabel || commonStrings.keys.select}}</span>\n </label>\n </clr-checkbox-wrapper>\n </div>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-radio-wrapper>\n <input\n type=\"radio\"\n clrRadio\n [id]=\"radioId\"\n [name]=\"selection.id + '-radio'\"\n [value]=\"item\"\n [(ngModel)]=\"selection.currentSingle\"\n [checked]=\"selection.currentSingle === item\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <label class=\"clr-control-label clr-col-null\" [for]=\"radioId\">\n <span class=\"clr-sr-only\">{{ clrDgRowSelectionLabel || commonStrings.keys.select }}</span>\n </label>\n </clr-radio-wrapper>\n </div>\n <div\n *ngIf=\"rowActionService.hasActionableRow\"\n class=\"datagrid-row-actions datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-content select=\"clr-dg-action-overflow\"></ng-content>\n </div>\n <div\n *ngIf=\"globalExpandable.hasExpandableRow\"\n class=\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-container *ngIf=\"expand.expandable\">\n <button\n *ngIf=\"!expand.loading\"\n (click)=\"toggleExpand()\"\n type=\"button\"\n class=\"datagrid-expandable-caret-button\"\n [attr.aria-expanded]=\"expand.expanded\"\n [attr.aria-label]=\"expand.expanded ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-controls]=\"expandableId\"\n >\n <cds-icon\n shape=\"angle\"\n class=\"datagrid-expandable-caret-icon\"\n [attr.direction]=\"expand.expanded ? 'down' : 'right'\"\n [attr.title]=\"expand.expanded ? commonStrings.keys.collapse : commonStrings.keys.expand\"\n ></cds-icon>\n </button>\n <clr-spinner *ngIf=\"expand.loading\" clrSmall>{{ commonStrings.keys.loading }}</clr-spinner>\n </ng-container>\n </div>\n <div\n *ngIf=\"detailService.enabled\"\n class=\"datagrid-detail-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <button\n (click)=\"detailService.toggle(item, detailButton)\"\n type=\"button\"\n #detailButton\n class=\"datagrid-detail-caret-button\"\n [class.is-open]=\"detailService.isRowOpen(item)\"\n [attr.aria-label]=\"detailService.isRowOpen(item) ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-expanded]=\"detailService.isRowOpen(item)\"\n [attr.aria-controls]=\"detailService.id\"\n aria-haspopup=\"dialog\"\n >\n <cds-icon\n shape=\"angle-double\"\n [attr.direction]=\"detailService.isRowOpen(item) ? 'left' : 'right'\"\n class=\"datagrid-detail-caret-icon\"\n [attr.title]=\"detailService.isRowOpen(item) ? commonStrings.keys.close: commonStrings.keys.open\"\n ></cds-icon>\n </button>\n </div>\n </ng-container>\n <!-- placeholder for projecting other sticky cells as pinned-->\n </div>\n <div class=\"datagrid-row-scrollable\" [ngClass]=\"{'is-replaced': replaced && expanded}\">\n <div class=\"datagrid-scrolling-cells\">\n <ng-content select=\"clr-dg-cell\"></ng-content>\n <ng-container #scrollableCells></ng-container>\n </div>\n <!-- details here when replace, re-visit when sticky container is used for pinned cells -->\n <ng-template *ngIf=\"replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n <ng-template *ngIf=\"!replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n </div>\n </div>\n</ng-template>\n\n<ng-container #calculatedCells></ng-container>\n" }]
15046
15469
  }], ctorParameters: function () {
15047
15470
  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: [{
15048
15471
  type: Inject,
@@ -15253,6 +15676,7 @@ class KeyNavigationGridController {
15253
15676
  this.zone = zone;
15254
15677
  this.listenersAdded = false;
15255
15678
  this.destroy$ = new Subject();
15679
+ this._activeCell = null;
15256
15680
  this.config = {
15257
15681
  keyGridRows: '[role=row]:not(.datagrid-placeholder)',
15258
15682
  keyGridCells: '[role=gridcell]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), [role=columnheader]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), .datagrid-detail-caret',
@@ -15293,6 +15717,11 @@ class KeyNavigationGridController {
15293
15717
  }
15294
15718
  }
15295
15719
  });
15720
+ fromEvent(this.grid, 'wheel')
15721
+ .pipe(takeUntil(this.destroy$))
15722
+ .subscribe(() => {
15723
+ this.removeActiveCell();
15724
+ });
15296
15725
  fromEvent(this.grid, 'keydown')
15297
15726
  .pipe(takeUntil(this.destroy$))
15298
15727
  .subscribe((e) => {
@@ -15333,6 +15762,12 @@ class KeyNavigationGridController {
15333
15762
  const firstCell = this.cells ? this.cells[0] : null;
15334
15763
  firstCell === null || firstCell === void 0 ? void 0 : firstCell.setAttribute('tabindex', '0');
15335
15764
  }
15765
+ removeActiveCell() {
15766
+ this._activeCell = null;
15767
+ }
15768
+ getActiveCell() {
15769
+ return this._activeCell;
15770
+ }
15336
15771
  setActiveCell(activeCell) {
15337
15772
  const prior = this.cells ? Array.from(this.cells).find(c => c.getAttribute('tabindex') === '0') : null;
15338
15773
  if (prior) {
@@ -15342,15 +15777,17 @@ class KeyNavigationGridController {
15342
15777
  const items = getTabableItems(activeCell);
15343
15778
  const item = activeCell.getAttribute('role') !== 'columnheader' && items[0] ? items[0] : activeCell;
15344
15779
  item.focus();
15780
+ this._activeCell = item;
15345
15781
  }
15346
15782
  getNextItemCoordinate(e) {
15783
+ var _a;
15347
15784
  let currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
15348
15785
  if (e.code === 'Tab') {
15349
15786
  currentCell = document.activeElement;
15350
15787
  }
15351
15788
  const currentRow = this.rows && currentCell ? Array.from(this.rows).find(r => r.contains(currentCell)) : null;
15352
15789
  const numOfRows = this.rows ? this.rows.length - 1 : 0;
15353
- const numOfColumns = this.cells ? this.cells.length / this.rows.length - 1 : 0;
15790
+ const numOfColumns = this.cells ? Math.floor(this.cells.length / this.rows.length - 1) : 0;
15354
15791
  let x = currentRow && currentCell
15355
15792
  ? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell)
15356
15793
  : 0;
@@ -15358,7 +15795,7 @@ class KeyNavigationGridController {
15358
15795
  const dir = this.host.dir;
15359
15796
  const inlineStart = dir === 'rtl' ? 'ArrowRight' : 'ArrowLeft';
15360
15797
  const inlineEnd = dir === 'rtl' ? 'ArrowLeft' : 'ArrowRight';
15361
- const itemsPerPage = this.rows.length || 0;
15798
+ const itemsPerPage = Math.floor(((_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelector('.datagrid').clientHeight) / this.rows[0].clientHeight) - 1 || 0;
15362
15799
  if (e.code === 'ArrowUp' && y !== 0) {
15363
15800
  y = y - 1;
15364
15801
  }
@@ -15384,7 +15821,7 @@ class KeyNavigationGridController {
15384
15821
  }
15385
15822
  }
15386
15823
  else if (e.code === 'PageUp') {
15387
- y = y - itemsPerPage > 0 ? y - itemsPerPage : 0;
15824
+ y = y - itemsPerPage > 0 ? y - itemsPerPage + 1 : 1;
15388
15825
  }
15389
15826
  else if (e.code === 'PageDown') {
15390
15827
  y = y + itemsPerPage < numOfRows ? y + itemsPerPage : numOfRows;
@@ -15404,27 +15841,152 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15404
15841
  * This software is released under MIT license.
15405
15842
  * The full license information can be found in LICENSE in the root directory of this project.
15406
15843
  */
15407
- class ClrDatagrid {
15408
- constructor(organizer, items, expandableRows, selection, rowActionService, stateProvider, displayMode, renderer, detailService, document, el, page, commonStrings, columnsService, keyNavigation, zone) {
15409
- this.organizer = organizer;
15410
- this.items = items;
15411
- this.expandableRows = expandableRows;
15412
- this.selection = selection;
15413
- this.rowActionService = rowActionService;
15414
- this.stateProvider = stateProvider;
15415
- this.displayMode = displayMode;
15416
- this.renderer = renderer;
15417
- this.detailService = detailService;
15418
- this.document = document;
15844
+ // @TODO The top two are not used now, which is probably a performance drag that was broken along the way.
15845
+ // There was a previous pattern to hide everything to do computation then display, for Firefox, needs revisiting.
15846
+ const NO_LAYOUT_CLASS = 'datagrid-no-layout';
15847
+ const COMPUTE_WIDTH_CLASS = 'datagrid-computing-columns-width';
15848
+ const STRICT_WIDTH_CLASS = 'datagrid-fixed-width';
15849
+ const HIDDEN_COLUMN_CLASS = 'datagrid-hidden-column';
15850
+
15851
+ /*
15852
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
15853
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
15854
+ * This software is released under MIT license.
15855
+ * The full license information can be found in LICENSE in the root directory of this project.
15856
+ */
15857
+ class DatagridCellRenderer {
15858
+ constructor(el, renderer, organizer) {
15419
15859
  this.el = el;
15420
- this.page = page;
15421
- this.commonStrings = commonStrings;
15422
- this.columnsService = columnsService;
15423
- this.keyNavigation = keyNavigation;
15424
- this.zone = zone;
15425
- this.clrDgSingleSelectionAriaLabel = this.commonStrings.keys.singleSelectionAriaLabel;
15426
- this.clrDgSingleActionableAriaLabel = this.commonStrings.keys.singleActionableAriaLabel;
15427
- this.clrDetailExpandableAriaLabel = this.commonStrings.keys.detailExpandableAriaLabel;
15860
+ this.renderer = renderer;
15861
+ this.subscriptions = [];
15862
+ this.subscriptions.push(organizer.filterRenderSteps(DatagridRenderStep.CLEAR_WIDTHS).subscribe(() => this.clearWidth()));
15863
+ }
15864
+ ngOnDestroy() {
15865
+ this.subscriptions.forEach(sub => sub.unsubscribe());
15866
+ if (this.stateSubscription) {
15867
+ this.stateSubscription.unsubscribe();
15868
+ }
15869
+ }
15870
+ resetState(state) {
15871
+ state.changes = ALL_COLUMN_CHANGES;
15872
+ this.setWidth(state);
15873
+ this.setHidden(state);
15874
+ }
15875
+ setWidth(state) {
15876
+ if (state.strictWidth) {
15877
+ this.renderer.addClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
15878
+ }
15879
+ else {
15880
+ this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
15881
+ }
15882
+ this.renderer.setStyle(this.el.nativeElement, 'width', state.width + 'px');
15883
+ }
15884
+ setHidden(state) {
15885
+ if (state.hidden) {
15886
+ this.renderer.addClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
15887
+ }
15888
+ else {
15889
+ this.renderer.removeClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
15890
+ }
15891
+ }
15892
+ clearWidth() {
15893
+ this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
15894
+ this.renderer.setStyle(this.el.nativeElement, 'width', null);
15895
+ }
15896
+ }
15897
+ DatagridCellRenderer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridCellRenderer, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: DatagridRenderOrganizer }], target: i0.ɵɵFactoryTarget.Directive });
15898
+ DatagridCellRenderer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: DatagridCellRenderer, selector: "clr-dg-cell", ngImport: i0 });
15899
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridCellRenderer, decorators: [{
15900
+ type: Directive,
15901
+ args: [{
15902
+ selector: 'clr-dg-cell',
15903
+ }]
15904
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: DatagridRenderOrganizer }]; } });
15905
+
15906
+ /*
15907
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
15908
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
15909
+ * This software is released under MIT license.
15910
+ * The full license information can be found in LICENSE in the root directory of this project.
15911
+ */
15912
+ class DatagridRowRenderer {
15913
+ constructor(columnsService) {
15914
+ this.columnsService = columnsService;
15915
+ this.subscriptions = [];
15916
+ }
15917
+ ngAfterContentInit() {
15918
+ this.setCellsState(); // case #3 and #4
15919
+ this.subscriptions.push(this.cells.changes.subscribe(() => {
15920
+ this.setCellsState(); // case #2
15921
+ // Note on case #2: In the case of dynamic columns, when one column (header/cell together) gets deleted,
15922
+ // this.cells.changes emits before this.columnsService.columns gets updated in MainRenderer
15923
+ // when this.headers.changes emits as well. So that means there will be n+1 column state providers
15924
+ // when this.cells.changes emits. Hence, we should quit earlier there. But this method will be called
15925
+ // right after again when this.headers.changes emits. By then, there will be the same number of column state
15926
+ // providers as column headers.
15927
+ }));
15928
+ }
15929
+ ngOnDestroy() {
15930
+ this.subscriptions.forEach(sub => sub.unsubscribe());
15931
+ }
15932
+ setCellsState() {
15933
+ // This method runs in four cases:
15934
+ // 1. When the initial rows appear on the first page.
15935
+ // In this case, the method will be called in DatagridMainRenderer.
15936
+ // 2. When columns (corresponding header/cells) get added and deleted.
15937
+ // In this case, the method will be called in DatagridMainRenderer. (Read the note on this case above).
15938
+ // 3. When rows load asynchronously.
15939
+ // In this case, the method will be called in this class.
15940
+ // 4. When rows load after switching pages.
15941
+ // In this case, the method will be called in this class (Basically, same as the case 3).
15942
+ if (this.cells.length === this.columnsService.columns.length) {
15943
+ this.cells.forEach((cell, index) => {
15944
+ if (this.columnsService.columns[index]) {
15945
+ cell.resetState(this.columnsService.columns[index].value);
15946
+ }
15947
+ });
15948
+ }
15949
+ }
15950
+ }
15951
+ DatagridRowRenderer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridRowRenderer, deps: [{ token: ColumnsService }], target: i0.ɵɵFactoryTarget.Directive });
15952
+ DatagridRowRenderer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: DatagridRowRenderer, selector: "clr-dg-row, clr-dg-row-detail", queries: [{ propertyName: "cells", predicate: DatagridCellRenderer }], ngImport: i0 });
15953
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridRowRenderer, decorators: [{
15954
+ type: Directive,
15955
+ args: [{
15956
+ selector: 'clr-dg-row, clr-dg-row-detail',
15957
+ }]
15958
+ }], ctorParameters: function () { return [{ type: ColumnsService }]; }, propDecorators: { cells: [{
15959
+ type: ContentChildren,
15960
+ args: [DatagridCellRenderer]
15961
+ }] } });
15962
+
15963
+ /*
15964
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
15965
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
15966
+ * This software is released under MIT license.
15967
+ * The full license information can be found in LICENSE in the root directory of this project.
15968
+ */
15969
+ class ClrDatagrid {
15970
+ constructor(organizer, items, expandableRows, selection, rowActionService, stateProvider, displayMode, renderer, detailService, document, el, page, commonStrings, columnsService, keyNavigation, zone) {
15971
+ this.organizer = organizer;
15972
+ this.items = items;
15973
+ this.expandableRows = expandableRows;
15974
+ this.selection = selection;
15975
+ this.rowActionService = rowActionService;
15976
+ this.stateProvider = stateProvider;
15977
+ this.displayMode = displayMode;
15978
+ this.renderer = renderer;
15979
+ this.detailService = detailService;
15980
+ this.document = document;
15981
+ this.el = el;
15982
+ this.page = page;
15983
+ this.commonStrings = commonStrings;
15984
+ this.columnsService = columnsService;
15985
+ this.keyNavigation = keyNavigation;
15986
+ this.zone = zone;
15987
+ this.clrDgSingleSelectionAriaLabel = this.commonStrings.keys.singleSelectionAriaLabel;
15988
+ this.clrDgSingleActionableAriaLabel = this.commonStrings.keys.singleActionableAriaLabel;
15989
+ this.clrDetailExpandableAriaLabel = this.commonStrings.keys.detailExpandableAriaLabel;
15428
15990
  // Allows disabling of the auto focus on page/state changes (excludes focus management inside of popups)
15429
15991
  this.clrDgDisablePageFocus = false;
15430
15992
  this.selectedChanged = new EventEmitter(false);
@@ -15537,7 +16099,19 @@ class ClrDatagrid {
15537
16099
  /**
15538
16100
  * Reopen updated row or close it
15539
16101
  */
15540
- row ? this.detailService.open(row.item, row.detailButton.nativeElement) : this.detailService.close();
16102
+ if (row) {
16103
+ this.detailService.open(row.item, row.detailButton.nativeElement);
16104
+ }
16105
+ else if (!this.hasVirtualScroller || !row) {
16106
+ this.detailService.close();
16107
+ }
16108
+ }
16109
+ // retain active cell when navigating with PageUp and PageDown buttons in virtual scroller
16110
+ const active = this.keyNavigation.getActiveCell();
16111
+ if (active) {
16112
+ this.zone.runOutsideAngular(() => {
16113
+ setTimeout(() => this.keyNavigation.setActiveCell(active));
16114
+ });
15541
16115
  }
15542
16116
  }));
15543
16117
  }
@@ -15563,8 +16137,6 @@ class ClrDatagrid {
15563
16137
  this.datagridTable.nativeElement.focus();
15564
16138
  }
15565
16139
  }),
15566
- // Reinitialize arrow key navigation on hide/unhide columns
15567
- combineLatest(this.columnsService.columns).subscribe(() => { var _a; return (_a = this.keyNavigation) === null || _a === void 0 ? void 0 : _a.resetKeyGrid(); }),
15568
16140
  // A subscription that listens for displayMode changes on the datagrid
15569
16141
  this.displayMode.view.subscribe(viewChange => {
15570
16142
  // Remove any projected columns from the projectedDisplayColumns container
@@ -15632,7 +16204,7 @@ class ClrDatagrid {
15632
16204
  }
15633
16205
  }
15634
16206
  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: ColumnsService }, { token: KeyNavigationGridController }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
15635
- ClrDatagrid.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagrid, selector: "clr-datagrid", inputs: { 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: [
16207
+ 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: [
15636
16208
  Selection,
15637
16209
  Sort,
15638
16210
  FiltersProvider,
@@ -15648,7 +16220,7 @@ ClrDatagrid.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
15648
16220
  ColumnsService,
15649
16221
  DisplayModeService,
15650
16222
  KeyNavigationGridController,
15651
- ], queries: [{ propertyName: "iterator", first: true, predicate: ClrDatagridItems, descendants: true }, { propertyName: "placeholder", first: true, predicate: ClrDatagridPlaceholder, descendants: true }, { propertyName: "columns", predicate: ClrDatagridColumn }, { propertyName: "rows", predicate: ClrDatagridRow }], viewQueries: [{ propertyName: "datagridTable", first: true, predicate: ["datagridTable"], descendants: true, read: ElementRef }, { propertyName: "scrollableColumns", first: true, predicate: ["scrollableColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_projectedDisplayColumns", first: true, predicate: ["projectedDisplayColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_projectedCalculationColumns", first: true, predicate: ["projectedCalculationColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_displayedRows", first: true, predicate: ["displayedRows"], descendants: true, read: ViewContainerRef }, { propertyName: "_calculationRows", first: true, predicate: ["calculationRows"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<ng-content select=\"clr-dg-action-bar\"></ng-content>\n<div class=\"datagrid-outer-wrapper\">\n <div class=\"datagrid-inner-wrapper\">\n <div class=\"datagrid\" #datagrid [attr.aria-hidden]=\"detailService.isOpen ? true : null\">\n <div class=\"datagrid-table-wrapper\">\n <div role=\"grid\" class=\"datagrid-table\" tabindex=\"-1\" #datagridTable>\n <div role=\"rowgroup\" class=\"datagrid-header\">\n <div role=\"row\" class=\"datagrid-row\">\n <div class=\"datagrid-row-master datagrid-row-flex\">\n <div class=\"datagrid-row-sticky\">\n <!--header for datagrid where you can select multiple rows -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n (keydown.space)=\"allSelected = !allSelected; $event.preventDefault()\"\n >\n <div 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 [attr.aria-label]=\"clrDgSingleSelectionAriaLabel\"\n >\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 [attr.aria-label]=\"clrDgSingleActionableAriaLabel\"\n >\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 [attr.aria-label]=\"clrDetailExpandableAriaLabel\"\n >\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 <ng-container #displayedRows></ng-container>\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 <ng-content select=\"clr-dg-footer\"></ng-content>\n <div class=\"datagrid-spinner\" *ngIf=\"loading\">\n <clr-spinner clrMedium>Loading</clr-spinner>\n </div>\n </div>\n <ng-content select=\"[clrIfDetail],clr-dg-detail\"></ng-content>\n</div>\n\n<div class=\"datagrid-calculation-table\">\n <div class=\"datagrid-calculation-header\">\n <ng-container #projectedCalculationColumns></ng-container>\n </div>\n <ng-container #calculationRows></ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: ClrLabel, selector: "label", inputs: ["for"] }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }, { kind: "component", type: ClrDatagridPlaceholder, selector: "clr-dg-placeholder" }, { kind: "directive", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select" }] });
16223
+ ], queries: [{ propertyName: "iterator", first: true, predicate: ClrDatagridItems, descendants: true }, { propertyName: "placeholder", first: true, predicate: ClrDatagridPlaceholder, descendants: true }, { propertyName: "columns", predicate: ClrDatagridColumn }, { propertyName: "rows", predicate: ClrDatagridRow }], viewQueries: [{ propertyName: "datagrid", first: true, predicate: ["datagrid"], descendants: true, read: ElementRef }, { propertyName: "datagridTable", first: true, predicate: ["datagridTable"], descendants: true, read: ElementRef }, { propertyName: "scrollableColumns", first: true, predicate: ["scrollableColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_projectedDisplayColumns", first: true, predicate: ["projectedDisplayColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_projectedCalculationColumns", first: true, predicate: ["projectedCalculationColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_displayedRows", first: true, predicate: ["displayedRows"], descendants: true, read: ViewContainerRef }, { propertyName: "_calculationRows", first: true, predicate: ["calculationRows"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<ng-content select=\"clr-dg-action-bar\"></ng-content>\n<div class=\"datagrid-outer-wrapper\">\n <div class=\"datagrid-inner-wrapper\">\n <div class=\"datagrid\" #datagrid [attr.aria-hidden]=\"detailService.isOpen ? true : null\">\n <div class=\"datagrid-table-wrapper\">\n <div role=\"grid\" class=\"datagrid-table\" tabindex=\"-1\" #datagridTable>\n <div role=\"rowgroup\" class=\"datagrid-header\">\n <div role=\"row\" class=\"datagrid-row\">\n <div class=\"datagrid-row-master datagrid-row-flex\">\n <div class=\"datagrid-row-sticky\">\n <!--header for datagrid where you can select multiple rows -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n (keydown.space)=\"allSelected = !allSelected; $event.preventDefault()\"\n >\n <div *ngIf=\"!hasVirtualScroller\" class=\"clr-checkbox-wrapper\">\n <!-- We need to move focus and space-key handling to the parent because of keyboard arrow key navigation,\n which is not able to transfer focus directly on the input when focused with the tab key -->\n <input\n type=\"checkbox\"\n [id]=\"selectAllId\"\n [(ngModel)]=\"allSelected\"\n [attr.aria-label]=\"commonStrings.keys.selectAll\"\n tabindex=\"-1\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"selectAllId\" class=\"clr-control-label clr-col-null\">\n <span class=\"clr-sr-only\">{{commonStrings.keys.selectAll}}</span>\n </label>\n </div>\n\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for datagrid where you can select one row only -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleSelectionAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for single row action; only displayType if we have at least one actionable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-row-actions datagrid-fixed-column\"\n *ngIf=\"rowActionService.hasActionableRow\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleActionableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for carets; only displayType if we have at least one expandable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-expandable-caret datagrid-fixed-column\"\n *ngIf=\"expandableRows.hasExpandableRow || detailService.enabled\"\n >\n <div class=\"clr-sr-only\">{{clrDetailExpandableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n </div>\n <div class=\"datagrid-row-scrollable\">\n <ng-container #projectedDisplayColumns></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div role=\"presentation\" class=\"datagrid-rows\">\n <clr-dg-row class=\"datagrid-loading-more-items-row\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell class=\"datagrid-loading-more-items-cell\">\n <clr-spinner [clrMedium]=\"true\"></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <ng-container #displayedRows></ng-container>\n\n <clr-dg-row class=\"datagrid-loading-more-items-row\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell class=\"datagrid-loading-more-items-cell\">\n <clr-spinner [clrMedium]=\"true\"></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <!-- Custom placeholder overrides the default empty one -->\n <ng-content select=\"clr-dg-placeholder\"></ng-content>\n <clr-dg-placeholder *ngIf=\"!placeholder\"></clr-dg-placeholder>\n </div>\n </div>\n </div>\n </div>\n <ng-content select=\"clr-dg-footer\"></ng-content>\n <div class=\"datagrid-spinner\" *ngIf=\"loading\">\n <clr-spinner clrMedium>Loading</clr-spinner>\n </div>\n </div>\n <ng-content select=\"[clrIfDetail],clr-dg-detail\"></ng-content>\n</div>\n\n<div class=\"datagrid-calculation-table\">\n <div class=\"datagrid-calculation-header\">\n <ng-container #projectedCalculationColumns></ng-container>\n </div>\n <ng-container #calculationRows></ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: ClrLabel, selector: "label", inputs: ["for"] }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }, { kind: "component", type: ClrDatagridCell, selector: "clr-dg-cell" }, { kind: "component", type: ClrDatagridPlaceholder, selector: "clr-dg-placeholder" }, { kind: "component", type: ClrDatagridRow, selector: "clr-dg-row", inputs: ["clrDgItem", "clrDgSelectable", "clrDgSelected", "clrDgExpanded", "clrDgDetailOpenLabel", "clrDgDetailCloseLabel", "clrDgRowSelectionLabel"], outputs: ["clrDgSelectedChange", "clrDgExpandedChange"] }, { kind: "directive", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select" }, { kind: "directive", type: DatagridCellRenderer, selector: "clr-dg-cell" }, { kind: "directive", type: DatagridRowRenderer, selector: "clr-dg-row, clr-dg-row-detail" }, { kind: "directive", type: ActionableOompaLoompa, selector: "clr-datagrid, clr-dg-row" }, { kind: "directive", type: ExpandableOompaLoompa, selector: "clr-datagrid, clr-dg-row" }] });
15652
16224
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagrid, decorators: [{
15653
16225
  type: Component,
15654
16226
  args: [{ selector: 'clr-datagrid', providers: [
@@ -15670,13 +16242,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15670
16242
  ], host: {
15671
16243
  '[class.datagrid-host]': 'true',
15672
16244
  '[class.datagrid-detail-open]': 'detailService.isOpen',
15673
- }, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<ng-content select=\"clr-dg-action-bar\"></ng-content>\n<div class=\"datagrid-outer-wrapper\">\n <div class=\"datagrid-inner-wrapper\">\n <div class=\"datagrid\" #datagrid [attr.aria-hidden]=\"detailService.isOpen ? true : null\">\n <div class=\"datagrid-table-wrapper\">\n <div role=\"grid\" class=\"datagrid-table\" tabindex=\"-1\" #datagridTable>\n <div role=\"rowgroup\" class=\"datagrid-header\">\n <div role=\"row\" class=\"datagrid-row\">\n <div class=\"datagrid-row-master datagrid-row-flex\">\n <div class=\"datagrid-row-sticky\">\n <!--header for datagrid where you can select multiple rows -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n (keydown.space)=\"allSelected = !allSelected; $event.preventDefault()\"\n >\n <div 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 [attr.aria-label]=\"clrDgSingleSelectionAriaLabel\"\n >\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 [attr.aria-label]=\"clrDgSingleActionableAriaLabel\"\n >\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 [attr.aria-label]=\"clrDetailExpandableAriaLabel\"\n >\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 <ng-container #displayedRows></ng-container>\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 <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" }]
16245
+ }, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<ng-content select=\"clr-dg-action-bar\"></ng-content>\n<div class=\"datagrid-outer-wrapper\">\n <div class=\"datagrid-inner-wrapper\">\n <div class=\"datagrid\" #datagrid [attr.aria-hidden]=\"detailService.isOpen ? true : null\">\n <div class=\"datagrid-table-wrapper\">\n <div role=\"grid\" class=\"datagrid-table\" tabindex=\"-1\" #datagridTable>\n <div role=\"rowgroup\" class=\"datagrid-header\">\n <div role=\"row\" class=\"datagrid-row\">\n <div class=\"datagrid-row-master datagrid-row-flex\">\n <div class=\"datagrid-row-sticky\">\n <!--header for datagrid where you can select multiple rows -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n (keydown.space)=\"allSelected = !allSelected; $event.preventDefault()\"\n >\n <div *ngIf=\"!hasVirtualScroller\" class=\"clr-checkbox-wrapper\">\n <!-- We need to move focus and space-key handling to the parent because of keyboard arrow key navigation,\n which is not able to transfer focus directly on the input when focused with the tab key -->\n <input\n type=\"checkbox\"\n [id]=\"selectAllId\"\n [(ngModel)]=\"allSelected\"\n [attr.aria-label]=\"commonStrings.keys.selectAll\"\n tabindex=\"-1\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"selectAllId\" class=\"clr-control-label clr-col-null\">\n <span class=\"clr-sr-only\">{{commonStrings.keys.selectAll}}</span>\n </label>\n </div>\n\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for datagrid where you can select one row only -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleSelectionAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for single row action; only displayType if we have at least one actionable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-row-actions datagrid-fixed-column\"\n *ngIf=\"rowActionService.hasActionableRow\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleActionableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for carets; only displayType if we have at least one expandable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-expandable-caret datagrid-fixed-column\"\n *ngIf=\"expandableRows.hasExpandableRow || detailService.enabled\"\n >\n <div class=\"clr-sr-only\">{{clrDetailExpandableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n </div>\n <div class=\"datagrid-row-scrollable\">\n <ng-container #projectedDisplayColumns></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div role=\"presentation\" class=\"datagrid-rows\">\n <clr-dg-row class=\"datagrid-loading-more-items-row\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell class=\"datagrid-loading-more-items-cell\">\n <clr-spinner [clrMedium]=\"true\"></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <ng-container #displayedRows></ng-container>\n\n <clr-dg-row class=\"datagrid-loading-more-items-row\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell class=\"datagrid-loading-more-items-cell\">\n <clr-spinner [clrMedium]=\"true\"></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <!-- Custom placeholder overrides the default empty one -->\n <ng-content select=\"clr-dg-placeholder\"></ng-content>\n <clr-dg-placeholder *ngIf=\"!placeholder\"></clr-dg-placeholder>\n </div>\n </div>\n </div>\n </div>\n <ng-content select=\"clr-dg-footer\"></ng-content>\n <div class=\"datagrid-spinner\" *ngIf=\"loading\">\n <clr-spinner clrMedium>Loading</clr-spinner>\n </div>\n </div>\n <ng-content select=\"[clrIfDetail],clr-dg-detail\"></ng-content>\n</div>\n\n<div class=\"datagrid-calculation-table\">\n <div class=\"datagrid-calculation-header\">\n <ng-container #projectedCalculationColumns></ng-container>\n </div>\n <ng-container #calculationRows></ng-container>\n</div>\n" }]
15674
16246
  }], ctorParameters: function () {
15675
16247
  return [{ type: DatagridRenderOrganizer }, { type: Items }, { type: ExpandableRowsCount }, { type: Selection }, { type: RowActionService }, { type: StateProvider }, { type: DisplayModeService }, { type: i0.Renderer2 }, { type: DetailService }, { type: undefined, decorators: [{
15676
16248
  type: Inject,
15677
16249
  args: [DOCUMENT]
15678
16250
  }] }, { type: i0.ElementRef }, { type: Page }, { type: ClrCommonStringsService }, { type: ColumnsService }, { type: KeyNavigationGridController }, { type: i0.NgZone }];
15679
- }, propDecorators: { clrDgSingleSelectionAriaLabel: [{
16251
+ }, propDecorators: { loadingMoreItems: [{
16252
+ type: Input,
16253
+ args: ['clrLoadingMoreItems']
16254
+ }], clrDgSingleSelectionAriaLabel: [{
15680
16255
  type: Input
15681
16256
  }], clrDgSingleActionableAriaLabel: [{
15682
16257
  type: Input
@@ -15705,6 +16280,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15705
16280
  }], rows: [{
15706
16281
  type: ContentChildren,
15707
16282
  args: [ClrDatagridRow]
16283
+ }], datagrid: [{
16284
+ type: ViewChild,
16285
+ args: ['datagrid', { read: ElementRef }]
15708
16286
  }], datagridTable: [{
15709
16287
  type: ViewChild,
15710
16288
  args: ['datagridTable', { read: ElementRef }]
@@ -17112,96 +17690,227 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17112
17690
  args: ['clrDgReplace']
17113
17691
  }] } });
17114
17692
 
17115
- /*
17116
- * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
17117
- * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
17118
- * This software is released under MIT license.
17119
- * The full license information can be found in LICENSE in the root directory of this project.
17120
- */
17121
- // @TODO The top two are not used now, which is probably a performance drag that was broken along the way.
17122
- // There was a previous pattern to hide everything to do computation then display, for Firefox, needs revisiting.
17123
- const NO_LAYOUT_CLASS = 'datagrid-no-layout';
17124
- const COMPUTE_WIDTH_CLASS = 'datagrid-computing-columns-width';
17125
- const STRICT_WIDTH_CLASS = 'datagrid-fixed-width';
17126
- const HIDDEN_COLUMN_CLASS = 'datagrid-hidden-column';
17127
-
17128
- /*
17129
- * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
17130
- * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
17131
- * This software is released under MIT license.
17132
- * The full license information can be found in LICENSE in the root directory of this project.
17133
- */
17134
- class DatagridCellRenderer {
17135
- constructor(el, renderer, organizer) {
17136
- this.el = el;
17137
- this.renderer = renderer;
17693
+ const defaultCdkFixedSizeVirtualScrollInputs = {
17694
+ itemSize: 32,
17695
+ minBufferPx: 200,
17696
+ maxBufferPx: 400,
17697
+ };
17698
+ class ClrDatagridVirtualScrollDirective {
17699
+ constructor(changeDetectorRef, iterableDiffers, items, ngZone, templateRef, viewContainerRef, directionality, scrollDispatcher, viewportRuler, datagrid, injector) {
17700
+ this.changeDetectorRef = changeDetectorRef;
17701
+ this.iterableDiffers = iterableDiffers;
17702
+ this.items = items;
17703
+ this.ngZone = ngZone;
17704
+ this.templateRef = templateRef;
17705
+ this.viewContainerRef = viewContainerRef;
17706
+ this.directionality = directionality;
17707
+ this.scrollDispatcher = scrollDispatcher;
17708
+ this.viewportRuler = viewportRuler;
17709
+ this.datagrid = datagrid;
17710
+ this.injector = injector;
17711
+ this.renderedRangeChange = new EventEmitter();
17712
+ this._cdkFixedSizeVirtualScrollInputs = Object.assign({}, defaultCdkFixedSizeVirtualScrollInputs);
17138
17713
  this.subscriptions = [];
17139
- this.subscriptions.push(organizer.filterRenderSteps(DatagridRenderStep.CLEAR_WIDTHS).subscribe(() => this.clearWidth()));
17714
+ this.mutationChanges = new MutationObserver((mutations) => {
17715
+ mutations.forEach((mutation) => {
17716
+ // it is possible this to be called twice because the old class is removed and the new added
17717
+ if (mutation.target.classList.contains('datagrid-compact') && this.itemSize > 24) {
17718
+ this.itemSize = 24;
17719
+ }
17720
+ });
17721
+ });
17722
+ this.cdkVirtualForInputs = {
17723
+ cdkVirtualForTrackBy: index => index,
17724
+ };
17725
+ this.items.smartenUp();
17726
+ this.datagrid.hasVirtualScroller = true;
17727
+ this.datagridElementRef = this.datagrid.el;
17728
+ this.mutationChanges.observe(this.datagridElementRef.nativeElement, {
17729
+ attributeFilter: ['class'],
17730
+ attributeOldValue: true,
17731
+ });
17732
+ this.virtualScrollStrategy = new FixedSizeVirtualScrollStrategy(this._cdkFixedSizeVirtualScrollInputs.itemSize, this._cdkFixedSizeVirtualScrollInputs.minBufferPx, this._cdkFixedSizeVirtualScrollInputs.maxBufferPx);
17140
17733
  }
17141
- // @TODO(JEREMY) Work out how to dedupe some of this code between header and cell renderers
17142
- set columnState(columnState) {
17143
- if (this.stateSubscription) {
17144
- this.stateSubscription.unsubscribe();
17145
- }
17146
- this.runAllChanges = ALL_COLUMN_CHANGES;
17147
- this.stateSubscription = columnState.subscribe(state => this.stateChanges(state));
17734
+ get cdkVirtualForOf() {
17735
+ return this.cdkVirtualForInputs.cdkVirtualForOf;
17736
+ }
17737
+ set cdkVirtualForOf(value) {
17738
+ this.cdkVirtualForInputs.cdkVirtualForOf = value;
17739
+ this.items.all = value;
17740
+ this.updateCdkVirtualForInputs();
17741
+ }
17742
+ get cdkVirtualForTrackBy() {
17743
+ return this.cdkVirtualForInputs.cdkVirtualForTrackBy;
17744
+ }
17745
+ set cdkVirtualForTrackBy(value) {
17746
+ this.cdkVirtualForInputs.cdkVirtualForTrackBy = value;
17747
+ this.updateCdkVirtualForInputs();
17748
+ }
17749
+ get cdkVirtualForTemplate() {
17750
+ var _a;
17751
+ return (_a = this === null || this === void 0 ? void 0 : this.cdkVirtualForInputs) === null || _a === void 0 ? void 0 : _a.cdkVirtualForTemplate;
17752
+ }
17753
+ set cdkVirtualForTemplate(value) {
17754
+ this.cdkVirtualForInputs.cdkVirtualForTemplate = value;
17755
+ this.updateCdkVirtualForInputs();
17756
+ }
17757
+ get cdkVirtualForTemplateCacheSize() {
17758
+ return this.cdkVirtualForInputs.cdkVirtualForTemplateCacheSize;
17759
+ }
17760
+ set cdkVirtualForTemplateCacheSize(value) {
17761
+ this.cdkVirtualForInputs.cdkVirtualForTemplateCacheSize = coerceNumberProperty(value);
17762
+ this.updateCdkVirtualForInputs();
17763
+ }
17764
+ get itemSize() {
17765
+ return this._cdkFixedSizeVirtualScrollInputs.itemSize;
17766
+ }
17767
+ set itemSize(value) {
17768
+ this._cdkFixedSizeVirtualScrollInputs.itemSize = coerceNumberProperty(value);
17769
+ this.updateFixedSizeVirtualScrollInputs();
17770
+ }
17771
+ get minBufferPx() {
17772
+ return this._cdkFixedSizeVirtualScrollInputs.minBufferPx;
17773
+ }
17774
+ set minBufferPx(value) {
17775
+ this._cdkFixedSizeVirtualScrollInputs.minBufferPx = coerceNumberProperty(value);
17776
+ this.updateFixedSizeVirtualScrollInputs();
17777
+ }
17778
+ get maxBufferPx() {
17779
+ return this._cdkFixedSizeVirtualScrollInputs.maxBufferPx;
17780
+ }
17781
+ set maxBufferPx(value) {
17782
+ this._cdkFixedSizeVirtualScrollInputs.maxBufferPx = coerceNumberProperty(value);
17783
+ this.updateFixedSizeVirtualScrollInputs();
17784
+ }
17785
+ ngAfterViewInit() {
17786
+ this.injector.runInContext(() => {
17787
+ this.virtualScrollViewport = this.createVirtualScrollViewportForDatagrid(this.changeDetectorRef, this.ngZone, this.directionality, this.scrollDispatcher, this.viewportRuler, this.datagridElementRef, this.virtualScrollStrategy);
17788
+ this.cdkVirtualFor = new CdkVirtualForOf(this.viewContainerRef, this.templateRef, this.iterableDiffers, new _RecycleViewRepeaterStrategy(), this.virtualScrollViewport, this.ngZone);
17789
+ this.virtualScrollViewport.ngOnInit();
17790
+ });
17791
+ this.gridRoleElement = this.datagridElementRef.nativeElement.querySelector('[role="grid"]');
17792
+ this.updateCdkVirtualForInputs();
17793
+ this.subscriptions.push(this.items.change.subscribe(newItems => {
17794
+ this.cdkVirtualFor.cdkVirtualForOf = newItems;
17795
+ }), this.cdkVirtualFor.dataStream.subscribe(data => {
17796
+ this.updateAriaRowCount(data.length);
17797
+ }), this.virtualScrollViewport.renderedRangeStream.subscribe(renderedRange => {
17798
+ this.renderedRangeChange.emit(renderedRange);
17799
+ }), this.datagrid.refresh.subscribe(datagridState => {
17800
+ if (datagridState.filters) {
17801
+ this.virtualScrollViewport.scrollToIndex(0);
17802
+ }
17803
+ }));
17804
+ }
17805
+ ngDoCheck() {
17806
+ var _a;
17807
+ (_a = this.cdkVirtualFor) === null || _a === void 0 ? void 0 : _a.ngDoCheck();
17808
+ this.updateAriaRowIndexes();
17148
17809
  }
17149
17810
  ngOnDestroy() {
17150
- this.subscriptions.forEach(sub => sub.unsubscribe());
17151
- if (this.stateSubscription) {
17152
- this.stateSubscription.unsubscribe();
17153
- }
17811
+ var _a, _b, _c;
17812
+ (_a = this.cdkVirtualFor) === null || _a === void 0 ? void 0 : _a.ngOnDestroy();
17813
+ (_b = this.virtualScrollViewport) === null || _b === void 0 ? void 0 : _b.ngOnDestroy();
17814
+ (_c = this.mutationChanges) === null || _c === void 0 ? void 0 : _c.disconnect();
17815
+ this.subscriptions.forEach(subscription => {
17816
+ subscription.unsubscribe();
17817
+ });
17154
17818
  }
17155
- stateChanges(state) {
17156
- if (this.runAllChanges) {
17157
- state.changes = this.runAllChanges;
17158
- delete this.runAllChanges;
17159
- }
17160
- if (state.changes && state.changes.length) {
17161
- state.changes.forEach(change => {
17162
- switch (change) {
17163
- case DatagridColumnChanges.WIDTH:
17164
- this.setWidth(state);
17165
- break;
17166
- case DatagridColumnChanges.HIDDEN:
17167
- this.setHidden(state);
17168
- break;
17169
- default:
17170
- break;
17819
+ updateCdkVirtualForInputs() {
17820
+ if (this.cdkVirtualFor) {
17821
+ for (const cdkVirtualForInputKey of Object.keys(this.cdkVirtualForInputs)) {
17822
+ if (this.cdkVirtualFor[cdkVirtualForInputKey] !== this.cdkVirtualForInputs[cdkVirtualForInputKey]) {
17823
+ this.cdkVirtualFor[cdkVirtualForInputKey] = this.cdkVirtualForInputs[cdkVirtualForInputKey];
17171
17824
  }
17172
- });
17825
+ }
17173
17826
  }
17174
17827
  }
17175
- clearWidth() {
17176
- this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
17177
- this.renderer.setStyle(this.el.nativeElement, 'width', null);
17178
- }
17179
- setWidth(state) {
17180
- if (state.strictWidth) {
17181
- this.renderer.addClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
17828
+ updateFixedSizeVirtualScrollInputs() {
17829
+ if (this.virtualScrollStrategy) {
17830
+ this.virtualScrollStrategy.updateItemAndBufferSize(this._cdkFixedSizeVirtualScrollInputs.itemSize, this._cdkFixedSizeVirtualScrollInputs.minBufferPx, this._cdkFixedSizeVirtualScrollInputs.maxBufferPx);
17182
17831
  }
17183
- else {
17184
- this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
17185
- }
17186
- this.renderer.setStyle(this.el.nativeElement, 'width', state.width + 'px');
17187
17832
  }
17188
- setHidden(state) {
17189
- if (state.hidden) {
17190
- this.renderer.addClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
17191
- }
17192
- else {
17193
- this.renderer.removeClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
17194
- }
17833
+ updateAriaRowCount(rowCount) {
17834
+ var _a;
17835
+ (_a = this.gridRoleElement) === null || _a === void 0 ? void 0 : _a.setAttribute('aria-rowcount', rowCount.toString());
17836
+ }
17837
+ updateAriaRowIndexes() {
17838
+ for (let i = 0; i < this.viewContainerRef.length; i++) {
17839
+ const viewRef = this.viewContainerRef.get(i);
17840
+ const rootElements = viewRef.rootNodes;
17841
+ const datagridRowElement = rootElements.find(rowElement => rowElement.tagName === 'CLR-DG-ROW');
17842
+ const rowRoleElement = datagridRowElement === null || datagridRowElement === void 0 ? void 0 : datagridRowElement.querySelector('[role="row"]');
17843
+ // aria-rowindex should start with one, not zero, so we have to add one to the zero-based index
17844
+ rowRoleElement === null || rowRoleElement === void 0 ? void 0 : rowRoleElement.setAttribute('aria-rowindex', (viewRef.context.index + 1).toString());
17845
+ }
17846
+ }
17847
+ createVirtualScrollViewportForDatagrid(changeDetectorRef, ngZone, directionality, scrollDispatcher, viewportRuler, datagridElementRef, virtualScrollStrategy) {
17848
+ const datagridDivElement = datagridElementRef.nativeElement.querySelector('.datagrid');
17849
+ const datagridTableElement = datagridElementRef.nativeElement.querySelector('.datagrid-table');
17850
+ const datagridRowsElement = datagridElementRef.nativeElement.querySelector('.datagrid-rows');
17851
+ const datagridDivElementRef = { nativeElement: datagridDivElement };
17852
+ let topOffset = 0;
17853
+ let totalContentSize = 0;
17854
+ function updateDatagridElementStyles() {
17855
+ datagridRowsElement.style.transform = `translateY(${topOffset}px)`;
17856
+ datagridRowsElement.style.height = `${totalContentSize - topOffset}px`;
17857
+ }
17858
+ const virtualScrollViewport = new CdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, null);
17859
+ virtualScrollViewport._contentWrapper = {
17860
+ nativeElement: {
17861
+ style: {
17862
+ set transform(value) {
17863
+ var _a;
17864
+ topOffset = value === undefined ? 0 : +((_a = /translateY\(([0-9]+)px\)/.exec(value)) === null || _a === void 0 ? void 0 : _a[1]);
17865
+ updateDatagridElementStyles();
17866
+ },
17867
+ },
17868
+ },
17869
+ };
17870
+ virtualScrollViewport.setTotalContentSize = (value) => {
17871
+ totalContentSize = value;
17872
+ datagridTableElement.style.height = `${totalContentSize}px`;
17873
+ updateDatagridElementStyles();
17874
+ };
17875
+ return virtualScrollViewport;
17195
17876
  }
17196
17877
  }
17197
- DatagridCellRenderer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridCellRenderer, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: DatagridRenderOrganizer }], target: i0.ɵɵFactoryTarget.Directive });
17198
- DatagridCellRenderer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: DatagridCellRenderer, selector: "clr-dg-cell", ngImport: i0 });
17199
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridCellRenderer, decorators: [{
17878
+ ClrDatagridVirtualScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.IterableDiffers }, { token: Items, skipSelf: true }, { token: i0.NgZone }, { token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: i1$2.Directionality }, { token: i3$1.ScrollDispatcher }, { token: i3$1.ViewportRuler }, { token: ClrDatagrid }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Directive });
17879
+ ClrDatagridVirtualScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridVirtualScrollDirective, selector: "[ClrVirtualScroll]", inputs: { cdkVirtualForOf: ["clrVirtualRowsOf", "cdkVirtualForOf"], cdkVirtualForTrackBy: ["clrVirtualRowsTrackBy", "cdkVirtualForTrackBy"], cdkVirtualForTemplate: ["clrVirtualRowsTemplate", "cdkVirtualForTemplate"], cdkVirtualForTemplateCacheSize: ["clrVirtualRowsTemplateCacheSize", "cdkVirtualForTemplateCacheSize"], itemSize: ["clrVirtualRowsItemSize", "itemSize"], minBufferPx: ["clrVirtualRowsMinBufferPx", "minBufferPx"], maxBufferPx: ["clrVirtualRowsMaxBufferPx", "maxBufferPx"] }, outputs: { renderedRangeChange: "renderedRangeChange" }, providers: [Items], ngImport: i0 });
17880
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, decorators: [{
17200
17881
  type: Directive,
17201
17882
  args: [{
17202
- selector: 'clr-dg-cell',
17883
+ selector: '[ClrVirtualScroll]',
17884
+ providers: [Items],
17203
17885
  }]
17204
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: DatagridRenderOrganizer }]; } });
17886
+ }], ctorParameters: function () {
17887
+ return [{ type: i0.ChangeDetectorRef }, { type: i0.IterableDiffers }, { type: Items, decorators: [{
17888
+ type: SkipSelf
17889
+ }] }, { type: i0.NgZone }, { type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: i1$2.Directionality }, { type: i3$1.ScrollDispatcher }, { type: i3$1.ViewportRuler }, { type: ClrDatagrid }, { type: i0.EnvironmentInjector }];
17890
+ }, propDecorators: { renderedRangeChange: [{
17891
+ type: Output
17892
+ }], cdkVirtualForOf: [{
17893
+ type: Input,
17894
+ args: ['clrVirtualRowsOf']
17895
+ }], cdkVirtualForTrackBy: [{
17896
+ type: Input,
17897
+ args: ['clrVirtualRowsTrackBy']
17898
+ }], cdkVirtualForTemplate: [{
17899
+ type: Input,
17900
+ args: ['clrVirtualRowsTemplate']
17901
+ }], cdkVirtualForTemplateCacheSize: [{
17902
+ type: Input,
17903
+ args: ['clrVirtualRowsTemplateCacheSize']
17904
+ }], itemSize: [{
17905
+ type: Input,
17906
+ args: ['clrVirtualRowsItemSize']
17907
+ }], minBufferPx: [{
17908
+ type: Input,
17909
+ args: ['clrVirtualRowsMinBufferPx']
17910
+ }], maxBufferPx: [{
17911
+ type: Input,
17912
+ args: ['clrVirtualRowsMaxBufferPx']
17913
+ }] } });
17205
17914
 
17206
17915
  /*
17207
17916
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
@@ -17226,7 +17935,6 @@ class DatagridHeaderRenderer {
17226
17935
  this.autoSet = false;
17227
17936
  this.subscriptions = [];
17228
17937
  this.subscriptions.push(this.organizer.filterRenderSteps(DatagridRenderStep.CLEAR_WIDTHS).subscribe(() => this.clearWidth()));
17229
- this.subscriptions.push(columnState.subscribe(state => this.stateChanges(state)));
17230
17938
  }
17231
17939
  ngOnDestroy() {
17232
17940
  this.subscriptions.forEach(sub => sub.unsubscribe());
@@ -17241,20 +17949,30 @@ class DatagridHeaderRenderer {
17241
17949
  setColumnState(index) {
17242
17950
  this.columnsService.columns[index] = this.columnState;
17243
17951
  }
17244
- stateChanges(state) {
17245
- if (state.changes && state.changes.length) {
17246
- state.changes.forEach(change => {
17247
- switch (change) {
17248
- case DatagridColumnChanges.WIDTH:
17249
- this.setWidth(state);
17250
- break;
17251
- case DatagridColumnChanges.HIDDEN:
17252
- this.setHidden(state);
17253
- break;
17254
- default:
17255
- break;
17256
- }
17257
- });
17952
+ setWidth(state) {
17953
+ if (state.strictWidth) {
17954
+ if (this.columnResizerService.resizedBy) {
17955
+ this.resizeEmitter.emit(state.width);
17956
+ this.renderer.setStyle(this.el.nativeElement, 'width', state.width + 'px');
17957
+ this.widthSet = false;
17958
+ }
17959
+ // Don't set width if there is a user-defined one. Just add the strict width class.
17960
+ this.renderer.addClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
17961
+ this.autoSet = false;
17962
+ }
17963
+ else {
17964
+ this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
17965
+ this.renderer.setStyle(this.el.nativeElement, 'width', state.width + 'px');
17966
+ this.widthSet = true;
17967
+ this.autoSet = true;
17968
+ }
17969
+ }
17970
+ setHidden(state) {
17971
+ if (state.hidden) {
17972
+ this.renderer.addClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
17973
+ }
17974
+ else {
17975
+ this.renderer.removeClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
17258
17976
  }
17259
17977
  }
17260
17978
  clearWidth() {
@@ -17284,32 +18002,6 @@ class DatagridHeaderRenderer {
17284
18002
  }
17285
18003
  return width;
17286
18004
  }
17287
- setWidth(state) {
17288
- if (state.strictWidth) {
17289
- if (this.columnResizerService.resizedBy) {
17290
- this.resizeEmitter.emit(state.width);
17291
- this.renderer.setStyle(this.el.nativeElement, 'width', state.width + 'px');
17292
- this.widthSet = false;
17293
- }
17294
- // Don't set width if there is a user-defined one. Just add the strict width class.
17295
- this.renderer.addClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
17296
- this.autoSet = false;
17297
- }
17298
- else {
17299
- this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
17300
- this.renderer.setStyle(this.el.nativeElement, 'width', state.width + 'px');
17301
- this.widthSet = true;
17302
- this.autoSet = true;
17303
- }
17304
- }
17305
- setHidden(state) {
17306
- if (state.hidden) {
17307
- this.renderer.addClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
17308
- }
17309
- else {
17310
- this.renderer.removeClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
17311
- }
17312
- }
17313
18005
  }
17314
18006
  DatagridHeaderRenderer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridHeaderRenderer, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: DatagridRenderOrganizer }, { token: DomAdapter }, { token: ColumnResizerService }, { token: ColumnsService }, { token: COLUMN_STATE }], target: i0.ɵɵFactoryTarget.Directive });
17315
18007
  DatagridHeaderRenderer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: DatagridHeaderRenderer, selector: "clr-dg-column", outputs: { resizeEmitter: "clrDgColumnResize" }, providers: [ColumnResizerService, COLUMN_STATE_PROVIDER], ngImport: i0 });
@@ -17371,63 +18063,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17371
18063
  type: Injectable
17372
18064
  }] });
17373
18065
 
17374
- /*
17375
- * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
17376
- * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
17377
- * This software is released under MIT license.
17378
- * The full license information can be found in LICENSE in the root directory of this project.
17379
- */
17380
- class DatagridRowRenderer {
17381
- constructor(columnsService) {
17382
- this.columnsService = columnsService;
17383
- this.subscriptions = [];
17384
- }
17385
- ngAfterContentInit() {
17386
- this.setColumnState(); // case #3 and #4
17387
- this.subscriptions.push(this.cells.changes.subscribe(() => {
17388
- this.setColumnState(); // case #2
17389
- // Note on case #2: In the case of dynamic columns, when one column (header/cell together) gets deleted,
17390
- // this.cells.changes emits before this.columnsService.columns gets updated in MainRenderer
17391
- // when this.headers.changes emits as well. So that means there will be n+1 column state providers
17392
- // when this.cells.changes emits. Hence, we should quit earlier there. But this method will be called
17393
- // right after again when this.headers.changes emits. By then, there will be the same number of column state
17394
- // providers as column headers.
17395
- }));
17396
- }
17397
- ngOnDestroy() {
17398
- this.subscriptions.forEach(sub => sub.unsubscribe());
17399
- }
17400
- setColumnState() {
17401
- // This method runs in four cases:
17402
- // 1. When the initial rows appear on the first page.
17403
- // In this case, the method will be called in DatagridMainRenderer.
17404
- // 2. When columns (corresponding header/cells) get added and deleted.
17405
- // In this case, the method will be called in DatagridMainRenderer. (Read the note on this case above).
17406
- // 3. When rows load asynchronously.
17407
- // In this case, the method will be called in this class.
17408
- // 4. When rows load after switching pages.
17409
- // In this case, the method will be called in this class (Basically, same as the case 3).
17410
- if (this.cells.length === this.columnsService.columns.length) {
17411
- this.cells.forEach((cell, index) => {
17412
- if (this.columnsService.columns[index]) {
17413
- cell.columnState = this.columnsService.columns[index];
17414
- }
17415
- });
17416
- }
17417
- }
17418
- }
17419
- DatagridRowRenderer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridRowRenderer, deps: [{ token: ColumnsService }], target: i0.ɵɵFactoryTarget.Directive });
17420
- DatagridRowRenderer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: DatagridRowRenderer, selector: "clr-dg-row, clr-dg-row-detail", queries: [{ propertyName: "cells", predicate: DatagridCellRenderer }], ngImport: i0 });
17421
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridRowRenderer, decorators: [{
17422
- type: Directive,
17423
- args: [{
17424
- selector: 'clr-dg-row, clr-dg-row-detail',
17425
- }]
17426
- }], ctorParameters: function () { return [{ type: ColumnsService }]; }, propDecorators: { cells: [{
17427
- type: ContentChildren,
17428
- args: [DatagridCellRenderer]
17429
- }] } });
17430
-
17431
18066
  /*
17432
18067
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
17433
18068
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -17447,7 +18082,7 @@ const domAdapterFactory = (platformId) => {
17447
18082
  // Fixes build error
17448
18083
  // @dynamic (https://github.com/angular/angular/issues/19698#issuecomment-338340211)
17449
18084
  class DatagridMainRenderer {
17450
- constructor(organizer, items, page, domAdapter, el, renderer, detailService, tableSizeService, columnsService, ngZone) {
18085
+ constructor(organizer, items, page, domAdapter, el, renderer, detailService, tableSizeService, columnsService, ngZone, keyNavigation) {
17451
18086
  this.organizer = organizer;
17452
18087
  this.items = items;
17453
18088
  this.page = page;
@@ -17458,6 +18093,7 @@ class DatagridMainRenderer {
17458
18093
  this.tableSizeService = tableSizeService;
17459
18094
  this.columnsService = columnsService;
17460
18095
  this.ngZone = ngZone;
18096
+ this.keyNavigation = keyNavigation;
17461
18097
  this._heightSet = false;
17462
18098
  this.shouldStabilizeColumns = true;
17463
18099
  this.subscriptions = [];
@@ -17487,6 +18123,7 @@ class DatagridMainRenderer {
17487
18123
  this.columnsSizesStable = false;
17488
18124
  this.stabilizeColumns();
17489
18125
  }));
18126
+ this.listenForColumnChanges();
17490
18127
  }
17491
18128
  // Initialize and set Table width for horizontal scrolling here.
17492
18129
  ngAfterViewInit() {
@@ -17528,7 +18165,7 @@ class DatagridMainRenderer {
17528
18165
  setupColumns() {
17529
18166
  this.headers.forEach((header, index) => header.setColumnState(index));
17530
18167
  this.columnsService.columns.splice(this.headers.length); // Trim any old columns
17531
- this.rows.forEach(row => row.setColumnState());
18168
+ this.rows.forEach(row => row.setCellsState());
17532
18169
  }
17533
18170
  shouldComputeHeight() {
17534
18171
  if (!this._heightSet && this.page.size > 0) {
@@ -17549,9 +18186,8 @@ class DatagridMainRenderer {
17549
18186
  * Refer: http://stackoverflow.com/questions/24396205/flex-grow-not-working-in-internet-explorer-11-0
17550
18187
  */
17551
18188
  computeDatagridHeight() {
17552
- // IE doesn't return correct value for getComputedStyle(element).getPropertyValue("height")
17553
- const value = this.domAdapter.clientRect(this.el.nativeElement).height;
17554
- this.renderer.setStyle(this.el.nativeElement, 'height', value + 'px');
18189
+ const height = window.getComputedStyle(this.el.nativeElement).height;
18190
+ this.renderer.setStyle(this.el.nativeElement, 'height', height);
17555
18191
  this._heightSet = true;
17556
18192
  }
17557
18193
  resetDatagridHeight() {
@@ -17563,13 +18199,16 @@ class DatagridMainRenderer {
17563
18199
  */
17564
18200
  computeHeadersWidth() {
17565
18201
  const nbColumns = this.headers.length;
18202
+ const headerWidths = this.headers.map(header => {
18203
+ return header.getColumnWidthState();
18204
+ });
17566
18205
  let allStrict = true;
17567
18206
  this.headers.forEach((header, index) => {
17568
18207
  // On the last header column check whether all columns have strict widths.
17569
18208
  // If all columns have strict widths, remove the strict width from the last column and make it the column's
17570
18209
  // minimum width so that when all previous columns shrink, it will get a flexible width and cover the empty
17571
18210
  // gap in the Datagrid.
17572
- const state = Object.assign({ changes: [DatagridColumnChanges.WIDTH] }, header.getColumnWidthState());
18211
+ const state = Object.assign({ changes: [DatagridColumnChanges.WIDTH] }, headerWidths[index]);
17573
18212
  if (!state.strictWidth) {
17574
18213
  allStrict = false;
17575
18214
  }
@@ -17579,6 +18218,45 @@ class DatagridMainRenderer {
17579
18218
  this.columnsService.emitStateChangeAt(index, state);
17580
18219
  });
17581
18220
  }
18221
+ columnStateChanged(state) {
18222
+ const columnIndex = state.columnIndex;
18223
+ if (state.changes && state.changes.length) {
18224
+ state.changes.forEach(change => {
18225
+ switch (change) {
18226
+ case DatagridColumnChanges.WIDTH:
18227
+ this.headers.get(columnIndex).setWidth(state);
18228
+ this.rows.forEach(row => {
18229
+ if (row.cells && row.cells.length) {
18230
+ row.cells.get(columnIndex).setWidth(state);
18231
+ }
18232
+ });
18233
+ break;
18234
+ case DatagridColumnChanges.HIDDEN:
18235
+ this.headers.get(columnIndex).setHidden(state);
18236
+ this.rows.forEach(row => {
18237
+ if (row.cells && row.cells.length) {
18238
+ row.cells.get(columnIndex).setHidden(state);
18239
+ }
18240
+ });
18241
+ this.keyNavigation.resetKeyGrid();
18242
+ break;
18243
+ default:
18244
+ break;
18245
+ }
18246
+ });
18247
+ }
18248
+ }
18249
+ listenForColumnChanges() {
18250
+ this.columnsService.columns.forEach((column, index) => {
18251
+ this.columnsService.emitStateChange(column, { changes: [], columnIndex: index });
18252
+ });
18253
+ /*
18254
+ Merges all column subject so we can track them at once
18255
+ and receive only the changed column as result
18256
+ */
18257
+ const columnChanges = merge(...this.columnsService.columns);
18258
+ this.subscriptions.push(columnChanges.subscribe(change => this.columnStateChanged(change)));
18259
+ }
17582
18260
  /**
17583
18261
  * Triggers a whole re-rendring cycle to set column sizes, if needed.
17584
18262
  */
@@ -17595,7 +18273,7 @@ class DatagridMainRenderer {
17595
18273
  }
17596
18274
  }
17597
18275
  }
17598
- DatagridMainRenderer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridMainRenderer, deps: [{ token: DatagridRenderOrganizer }, { token: Items }, { token: Page }, { token: DomAdapter }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: DetailService }, { token: TableSizeService }, { token: ColumnsService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
18276
+ DatagridMainRenderer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridMainRenderer, deps: [{ token: DatagridRenderOrganizer }, { token: Items }, { token: Page }, { token: DomAdapter }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: DetailService }, { token: TableSizeService }, { token: ColumnsService }, { token: i0.NgZone }, { token: KeyNavigationGridController }], target: i0.ɵɵFactoryTarget.Directive });
17599
18277
  DatagridMainRenderer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: DatagridMainRenderer, selector: "clr-datagrid", providers: [{ provide: DomAdapter, useFactory: domAdapterFactory, deps: [PLATFORM_ID] }], queries: [{ propertyName: "headers", predicate: DatagridHeaderRenderer }, { propertyName: "rows", predicate: DatagridRowRenderer, descendants: true }], ngImport: i0 });
17600
18278
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridMainRenderer, decorators: [{
17601
18279
  type: Directive,
@@ -17603,7 +18281,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17603
18281
  selector: 'clr-datagrid',
17604
18282
  providers: [{ provide: DomAdapter, useFactory: domAdapterFactory, deps: [PLATFORM_ID] }],
17605
18283
  }]
17606
- }], ctorParameters: function () { return [{ type: DatagridRenderOrganizer }, { type: Items }, { type: Page }, { type: DomAdapter }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: DetailService }, { type: TableSizeService }, { type: ColumnsService }, { type: i0.NgZone }]; }, propDecorators: { headers: [{
18284
+ }], ctorParameters: function () { return [{ type: DatagridRenderOrganizer }, { type: Items }, { type: Page }, { type: DomAdapter }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: DetailService }, { type: TableSizeService }, { type: ColumnsService }, { type: i0.NgZone }, { type: KeyNavigationGridController }]; }, propDecorators: { headers: [{
17607
18285
  type: ContentChildren,
17608
18286
  args: [DatagridHeaderRenderer]
17609
18287
  }], rows: [{
@@ -17638,6 +18316,7 @@ const CLR_DATAGRID_DIRECTIVES = [
17638
18316
  ClrDatagridRow,
17639
18317
  ClrDatagridRowDetail,
17640
18318
  ClrDatagridSelectionCellDirective,
18319
+ ClrDatagridVirtualScrollDirective,
17641
18320
  ClrIfDetail,
17642
18321
  DatagridDetailRegisterer,
17643
18322
  WrappedCell,
@@ -17684,6 +18363,7 @@ ClrDatagridModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", versi
17684
18363
  ClrDatagridRow,
17685
18364
  ClrDatagridRowDetail,
17686
18365
  ClrDatagridSelectionCellDirective,
18366
+ ClrDatagridVirtualScrollDirective,
17687
18367
  ClrIfDetail,
17688
18368
  DatagridDetailRegisterer,
17689
18369
  WrappedCell,
@@ -17734,6 +18414,7 @@ ClrDatagridModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", versi
17734
18414
  ClrDatagridRow,
17735
18415
  ClrDatagridRowDetail,
17736
18416
  ClrDatagridSelectionCellDirective,
18417
+ ClrDatagridVirtualScrollDirective,
17737
18418
  ClrIfDetail,
17738
18419
  DatagridDetailRegisterer,
17739
18420
  WrappedCell,
@@ -22801,6 +23482,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22801
23482
  }] }];
22802
23483
  } });
22803
23484
 
23485
+ /*
23486
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
23487
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
23488
+ * This software is released under MIT license.
23489
+ * The full license information can be found in LICENSE in the root directory of this project.
23490
+ */
23491
+ class ClrModalConfigurationService {
23492
+ constructor() {
23493
+ this.fadeMove = 'fadeDown';
23494
+ this.backdrop = true;
23495
+ }
23496
+ }
23497
+ ClrModalConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalConfigurationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
23498
+ ClrModalConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalConfigurationService });
23499
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalConfigurationService, decorators: [{
23500
+ type: Injectable
23501
+ }] });
23502
+
22804
23503
  /*
22805
23504
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
22806
23505
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -22808,10 +23507,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22808
23507
  * The full license information can be found in LICENSE in the root directory of this project.
22809
23508
  */
22810
23509
  class ClrModal {
22811
- constructor(_scrollingService, commonStrings, modalStackService) {
23510
+ constructor(_scrollingService, commonStrings, modalStackService, configuration) {
22812
23511
  this._scrollingService = _scrollingService;
22813
23512
  this.commonStrings = commonStrings;
22814
23513
  this.modalStackService = modalStackService;
23514
+ this.configuration = configuration;
22815
23515
  this.modalId = uniqueIdFactory();
22816
23516
  this._open = false;
22817
23517
  this._openChanged = new EventEmitter(false);
@@ -22821,13 +23521,23 @@ class ClrModal {
22821
23521
  this.skipAnimation = 'false';
22822
23522
  this.stopClose = false;
22823
23523
  this.altClose = new EventEmitter(false);
22824
- this.labelledBy = this.modalId;
23524
+ // presently this is only used by inline wizards
23525
+ this.bypassScrollService = false;
23526
+ }
23527
+ get fadeMove() {
23528
+ return this.skipAnimation ? '' : this.configuration.fadeMove;
23529
+ }
23530
+ set fadeMove(move) {
23531
+ this.configuration.fadeMove = move;
23532
+ }
23533
+ get backdrop() {
23534
+ return this.configuration.backdrop;
22825
23535
  }
22826
23536
  // Detect when _open is set to true and set no-scrolling to true
22827
23537
  ngOnChanges(changes) {
22828
- if (changes && Object.prototype.hasOwnProperty.call(changes, '_open')) {
23538
+ if (!this.bypassScrollService && changes && Object.prototype.hasOwnProperty.call(changes, '_open')) {
22829
23539
  if (changes._open.currentValue) {
22830
- this._scrollingService.stopScrolling();
23540
+ this.backdrop && this._scrollingService.stopScrolling();
22831
23541
  this.modalStackService.trackModalOpen(this);
22832
23542
  }
22833
23543
  else {
@@ -22864,11 +23574,18 @@ class ClrModal {
22864
23574
  }
22865
23575
  }
22866
23576
  }
22867
- ClrModal.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModal, deps: [{ token: ScrollingService }, { token: ClrCommonStringsService }, { token: ModalStackService }], target: i0.ɵɵFactoryTarget.Component });
22868
- 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"] }, outputs: { _openChanged: "clrModalOpenChange", altClose: "clrModalAlternateClose" }, host: { properties: { "class.open": "this._open" } }, usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<div *ngIf=\"_open\" class=\"modal\" [class.modal-full-screen]=\"size == 'full-screen'\">\n <!--fixme: revisit when ngClass works with exit animation-->\n <div\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n [@fadeDown]=\"skipAnimation\"\n (@fadeDown.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\"\n >\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentStart}}</div>\n <div class=\"modal-content-wrapper\">\n <!-- only used in wizards -->\n <ng-content select=\".modal-nav\"></ng-content>\n\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <div class=\"modal-title-wrapper\" id=\"{{modalId}}\" cdkFocusInitial tabindex=\"-1\">\n <ng-content select=\".modal-title\"></ng-content>\n </div>\n <button\n type=\"button\"\n [attr.aria-label]=\"closeButtonAriaLabel || commonStrings.keys.close\"\n class=\"close\"\n *ngIf=\"closable\"\n (click)=\"close()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div class=\"modal-body-wrapper\">\n <ng-content select=\".modal-body\"></ng-content>\n </div>\n <ng-content select=\".modal-footer\"></ng-content>\n </div>\n </div>\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentEnd}}</div>\n </div>\n\n <div [@fade] class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"staticBackdrop || close()\"></div>\n</div>\n", styles: [":host{display:none}:host.open{display:inline}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: CdkTrapFocusModule_CdkTrapFocus, selector: "[cdkTrapFocus]" }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }], viewProviders: [ScrollingService], animations: [
22869
- trigger('fadeDown', [
22870
- transition('* => false', [style({ opacity: 0, transform: 'translate(0, -25%)' }), animate('0.2s ease-in-out')]),
22871
- transition('false => *', [animate('0.2s ease-in-out', style({ opacity: 0, transform: 'translate(0, -25%)' }))]),
23577
+ ClrModal.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModal, deps: [{ token: ScrollingService }, { token: ClrCommonStringsService }, { token: ModalStackService }, { token: ClrModalConfigurationService }], target: i0.ɵɵFactoryTarget.Component });
23578
+ ClrModal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrModal, selector: "clr-modal", inputs: { _open: ["clrModalOpen", "_open"], closable: ["clrModalClosable", "closable"], closeButtonAriaLabel: ["clrModalCloseButtonAriaLabel", "closeButtonAriaLabel"], size: ["clrModalSize", "size"], staticBackdrop: ["clrModalStaticBackdrop", "staticBackdrop"], skipAnimation: ["clrModalSkipAnimation", "skipAnimation"], stopClose: ["clrModalPreventClose", "stopClose"], labelledBy: ["clrModalLabelledById", "labelledBy"], bypassScrollService: ["clrModalOverrideScrollService", "bypassScrollService"] }, outputs: { _openChanged: "clrModalOpenChange", altClose: "clrModalAlternateClose" }, host: { properties: { "class.open": "this._open" } }, usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<div *ngIf=\"_open\" class=\"modal\" [class.modal-full-screen]=\"size == 'full-screen'\">\n <!--fixme: revisit when ngClass works with exit animation-->\n <div\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n [@fadeMove]=\"fadeMove\"\n (@fadeMove.done)=\"fadeDone($event)\"\n class=\"modal-dialog\"\n [class.modal-sm]=\"size == 'sm'\"\n [class.modal-lg]=\"size == 'lg'\"\n [class.modal-xl]=\"size == 'xl'\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-hidden]=\"!_open\"\n [attr.aria-labelledby]=\"labelledBy || modalId\"\n >\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentStart}}</div>\n <div class=\"modal-content-wrapper\">\n <!-- only used in wizards -->\n <ng-content select=\".modal-nav\"></ng-content>\n\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <div class=\"modal-title-wrapper\" id=\"{{modalId}}\" cdkFocusInitial tabindex=\"-1\">\n <ng-content select=\".modal-title\"></ng-content>\n </div>\n <button\n type=\"button\"\n [attr.aria-label]=\"closeButtonAriaLabel || commonStrings.keys.close\"\n class=\"close\"\n *ngIf=\"closable\"\n (click)=\"close()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div class=\"modal-body-wrapper\">\n <ng-content select=\".modal-body\"></ng-content>\n </div>\n <ng-content select=\".modal-footer\"></ng-content>\n </div>\n </div>\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentEnd}}</div>\n </div>\n\n <div [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"staticBackdrop || close()\"></div>\n</div>\n", styles: [":host{display:none}:host.open{display:inline}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: CdkTrapFocusModule_CdkTrapFocus, selector: "[cdkTrapFocus]" }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }], viewProviders: [ScrollingService], animations: [
23579
+ trigger('fadeMove', [
23580
+ transition('* => fadeDown', [
23581
+ style({ opacity: 0, transform: 'translate(0, -25%)' }),
23582
+ animate('0.2s ease-in-out'),
23583
+ ]),
23584
+ transition('fadeDown => *', [
23585
+ animate('0.2s ease-in-out', style({ opacity: 0, transform: 'translate(0, -25%)' })),
23586
+ ]),
23587
+ transition('* => fadeLeft', [style({ opacity: 0, transform: 'translate(25%, 0)' }), animate('0.2s ease-in-out')]),
23588
+ transition('fadeLeft => *', [animate('0.2s ease-in-out', style({ opacity: 0, transform: 'translate(25%, 0)' }))]),
22872
23589
  ]),
22873
23590
  trigger('fade', [
22874
23591
  transition('void => *', [style({ opacity: 0 }), animate('0.2s ease-in-out', style({ opacity: 0.85 }))]),
@@ -22878,16 +23595,23 @@ ClrModal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.
22878
23595
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModal, decorators: [{
22879
23596
  type: Component,
22880
23597
  args: [{ selector: 'clr-modal', viewProviders: [ScrollingService], animations: [
22881
- trigger('fadeDown', [
22882
- transition('* => false', [style({ opacity: 0, transform: 'translate(0, -25%)' }), animate('0.2s ease-in-out')]),
22883
- transition('false => *', [animate('0.2s ease-in-out', style({ opacity: 0, transform: 'translate(0, -25%)' }))]),
23598
+ trigger('fadeMove', [
23599
+ transition('* => fadeDown', [
23600
+ style({ opacity: 0, transform: 'translate(0, -25%)' }),
23601
+ animate('0.2s ease-in-out'),
23602
+ ]),
23603
+ transition('fadeDown => *', [
23604
+ animate('0.2s ease-in-out', style({ opacity: 0, transform: 'translate(0, -25%)' })),
23605
+ ]),
23606
+ transition('* => fadeLeft', [style({ opacity: 0, transform: 'translate(25%, 0)' }), animate('0.2s ease-in-out')]),
23607
+ transition('fadeLeft => *', [animate('0.2s ease-in-out', style({ opacity: 0, transform: 'translate(25%, 0)' }))]),
22884
23608
  ]),
22885
23609
  trigger('fade', [
22886
23610
  transition('void => *', [style({ opacity: 0 }), animate('0.2s ease-in-out', style({ opacity: 0.85 }))]),
22887
23611
  transition('* => void', [animate('0.2s ease-in-out', style({ opacity: 0 }))]),
22888
23612
  ]),
22889
- ], template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<div *ngIf=\"_open\" class=\"modal\" [class.modal-full-screen]=\"size == 'full-screen'\">\n <!--fixme: revisit when ngClass works with exit animation-->\n <div\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n [@fadeDown]=\"skipAnimation\"\n (@fadeDown.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\"\n >\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentStart}}</div>\n <div class=\"modal-content-wrapper\">\n <!-- only used in wizards -->\n <ng-content select=\".modal-nav\"></ng-content>\n\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <div class=\"modal-title-wrapper\" id=\"{{modalId}}\" cdkFocusInitial tabindex=\"-1\">\n <ng-content select=\".modal-title\"></ng-content>\n </div>\n <button\n type=\"button\"\n [attr.aria-label]=\"closeButtonAriaLabel || commonStrings.keys.close\"\n class=\"close\"\n *ngIf=\"closable\"\n (click)=\"close()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div class=\"modal-body-wrapper\">\n <ng-content select=\".modal-body\"></ng-content>\n </div>\n <ng-content select=\".modal-footer\"></ng-content>\n </div>\n </div>\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentEnd}}</div>\n </div>\n\n <div [@fade] class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"staticBackdrop || close()\"></div>\n</div>\n", styles: [":host{display:none}:host.open{display:inline}\n"] }]
22890
- }], ctorParameters: function () { return [{ type: ScrollingService }, { type: ClrCommonStringsService }, { type: ModalStackService }]; }, propDecorators: { _open: [{
23613
+ ], template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<div *ngIf=\"_open\" class=\"modal\" [class.modal-full-screen]=\"size == 'full-screen'\">\n <!--fixme: revisit when ngClass works with exit animation-->\n <div\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n [@fadeMove]=\"fadeMove\"\n (@fadeMove.done)=\"fadeDone($event)\"\n class=\"modal-dialog\"\n [class.modal-sm]=\"size == 'sm'\"\n [class.modal-lg]=\"size == 'lg'\"\n [class.modal-xl]=\"size == 'xl'\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-hidden]=\"!_open\"\n [attr.aria-labelledby]=\"labelledBy || modalId\"\n >\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentStart}}</div>\n <div class=\"modal-content-wrapper\">\n <!-- only used in wizards -->\n <ng-content select=\".modal-nav\"></ng-content>\n\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <div class=\"modal-title-wrapper\" id=\"{{modalId}}\" cdkFocusInitial tabindex=\"-1\">\n <ng-content select=\".modal-title\"></ng-content>\n </div>\n <button\n type=\"button\"\n [attr.aria-label]=\"closeButtonAriaLabel || commonStrings.keys.close\"\n class=\"close\"\n *ngIf=\"closable\"\n (click)=\"close()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div class=\"modal-body-wrapper\">\n <ng-content select=\".modal-body\"></ng-content>\n </div>\n <ng-content select=\".modal-footer\"></ng-content>\n </div>\n </div>\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentEnd}}</div>\n </div>\n\n <div [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"staticBackdrop || close()\"></div>\n</div>\n", styles: [":host{display:none}:host.open{display:inline}\n"] }]
23614
+ }], ctorParameters: function () { return [{ type: ScrollingService }, { type: ClrCommonStringsService }, { type: ModalStackService }, { type: ClrModalConfigurationService }]; }, propDecorators: { _open: [{
22891
23615
  type: Input,
22892
23616
  args: ['clrModalOpen']
22893
23617
  }, {
@@ -22920,6 +23644,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22920
23644
  }], labelledBy: [{
22921
23645
  type: Input,
22922
23646
  args: ['clrModalLabelledById']
23647
+ }], bypassScrollService: [{
23648
+ type: Input,
23649
+ args: ['clrModalOverrideScrollService']
22923
23650
  }] } });
22924
23651
 
22925
23652
  /*
@@ -22999,16 +23726,122 @@ class ClrModalModule {
22999
23726
  }
23000
23727
  ClrModalModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
23001
23728
  ClrModalModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.2", ngImport: i0, type: ClrModalModule, declarations: [ClrModal, ClrModalBody], imports: [CommonModule, CdkTrapFocusModule, ClrIconModule], exports: [ClrModal, ClrModalBody, ClrIconModule] });
23002
- ClrModalModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalModule, imports: [CommonModule, CdkTrapFocusModule, ClrIconModule, ClrIconModule] });
23729
+ ClrModalModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalModule, providers: [ClrModalConfigurationService], imports: [CommonModule, CdkTrapFocusModule, ClrIconModule, ClrIconModule] });
23003
23730
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalModule, decorators: [{
23004
23731
  type: NgModule,
23005
23732
  args: [{
23006
23733
  imports: [CommonModule, CdkTrapFocusModule, ClrIconModule],
23007
23734
  declarations: [CLR_MODAL_DIRECTIVES],
23008
23735
  exports: [CLR_MODAL_DIRECTIVES, ClrIconModule],
23736
+ providers: [ClrModalConfigurationService],
23009
23737
  }]
23010
23738
  }], ctorParameters: function () { return []; } });
23011
23739
 
23740
+ /*
23741
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
23742
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
23743
+ * This software is released under MIT license.
23744
+ * The full license information can be found in LICENSE in the root directory of this project.
23745
+ */
23746
+ class ClrSidePanel {
23747
+ constructor(element, configuration) {
23748
+ this.element = element;
23749
+ this.configuration = configuration;
23750
+ this._open = false;
23751
+ this.openChange = new EventEmitter(false);
23752
+ this.skipAnimation = 'false';
23753
+ this.staticBackdrop = false;
23754
+ this.preventClose = false;
23755
+ this.altClose = new EventEmitter(false);
23756
+ }
23757
+ get clrSidePanelBackdrop() {
23758
+ return this.configuration.backdrop;
23759
+ }
23760
+ set clrSidePanelBackdrop(backdrop) {
23761
+ if (backdrop !== undefined) {
23762
+ this.configuration.backdrop = backdrop;
23763
+ }
23764
+ }
23765
+ ngOnInit() {
23766
+ this.configuration.fadeMove = 'fadeLeft';
23767
+ }
23768
+ open() {
23769
+ this.modal.open();
23770
+ }
23771
+ close() {
23772
+ this.modal.close();
23773
+ }
23774
+ documentClick(event) {
23775
+ if (!this.element.nativeElement.contains(event.target) && this.modal._open && !this.configuration.backdrop) {
23776
+ this.modal.close();
23777
+ }
23778
+ }
23779
+ }
23780
+ ClrSidePanel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrSidePanel, deps: [{ token: i0.ElementRef }, { token: ClrModalConfigurationService }], target: i0.ɵɵFactoryTarget.Component });
23781
+ ClrSidePanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrSidePanel, selector: "clr-side-panel", inputs: { _open: ["clrSidePanelOpen", "_open"], closeButtonAriaLabel: ["clrSidePanelCloseButtonAriaLabel", "closeButtonAriaLabel"], size: ["clrSidePanelSize", "size"], skipAnimation: ["clrSidePanelSkipAnimation", "skipAnimation"], labelledById: ["clrSidePanelLabelledById", "labelledById"], staticBackdrop: ["clrSidePanelStaticBackdrop", "staticBackdrop"], preventClose: ["clrSidePanelPreventClose", "preventClose"], clrSidePanelBackdrop: "clrSidePanelBackdrop" }, outputs: { openChange: "clrSidePanelOpenChange", altClose: "clrSidePanelAlternateClose" }, host: { listeners: { "document:pointerup": "documentClick($event)" }, properties: { "class.side-panel": "true" } }, viewQueries: [{ propertyName: "modal", first: true, predicate: ClrModal, descendants: true }], ngImport: i0, template: "<clr-modal\n [clrModalOpen]=\"_open\"\n (clrModalOpenChange)=\"openChange.emit($event)\"\n [clrModalCloseButtonAriaLabel]=\"closeButtonAriaLabel\"\n [clrModalSize]=\"size\"\n [clrModalSkipAnimation]=\"skipAnimation\"\n [clrModalStaticBackdrop]=\"staticBackdrop\"\n [clrModalLabelledById]=\"labelledById\"\n [clrModalPreventClose]=\"preventClose\"\n (clrModalAlternateClose)=\"altClose.emit($event)\"\n>\n <div class=\"modal-title\"><ng-content select=\".side-panel-title\"></ng-content></div>\n <div class=\"modal-body\"><ng-content select=\".side-panel-body\"></ng-content></div>\n <div class=\"modal-footer\"><ng-content select=\".side-panel-footer\"></ng-content></div>\n</clr-modal>\n", dependencies: [{ 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" }] });
23782
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrSidePanel, decorators: [{
23783
+ type: Component,
23784
+ args: [{ selector: 'clr-side-panel', host: {
23785
+ '[class.side-panel]': 'true',
23786
+ }, template: "<clr-modal\n [clrModalOpen]=\"_open\"\n (clrModalOpenChange)=\"openChange.emit($event)\"\n [clrModalCloseButtonAriaLabel]=\"closeButtonAriaLabel\"\n [clrModalSize]=\"size\"\n [clrModalSkipAnimation]=\"skipAnimation\"\n [clrModalStaticBackdrop]=\"staticBackdrop\"\n [clrModalLabelledById]=\"labelledById\"\n [clrModalPreventClose]=\"preventClose\"\n (clrModalAlternateClose)=\"altClose.emit($event)\"\n>\n <div class=\"modal-title\"><ng-content select=\".side-panel-title\"></ng-content></div>\n <div class=\"modal-body\"><ng-content select=\".side-panel-body\"></ng-content></div>\n <div class=\"modal-footer\"><ng-content select=\".side-panel-footer\"></ng-content></div>\n</clr-modal>\n" }]
23787
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: ClrModalConfigurationService }]; }, propDecorators: { _open: [{
23788
+ type: Input,
23789
+ args: ['clrSidePanelOpen']
23790
+ }], openChange: [{
23791
+ type: Output,
23792
+ args: ['clrSidePanelOpenChange']
23793
+ }], closeButtonAriaLabel: [{
23794
+ type: Input,
23795
+ args: ['clrSidePanelCloseButtonAriaLabel']
23796
+ }], size: [{
23797
+ type: Input,
23798
+ args: ['clrSidePanelSize']
23799
+ }], skipAnimation: [{
23800
+ type: Input,
23801
+ args: ['clrSidePanelSkipAnimation']
23802
+ }], labelledById: [{
23803
+ type: Input,
23804
+ args: ['clrSidePanelLabelledById']
23805
+ }], staticBackdrop: [{
23806
+ type: Input,
23807
+ args: ['clrSidePanelStaticBackdrop']
23808
+ }], preventClose: [{
23809
+ type: Input,
23810
+ args: ['clrSidePanelPreventClose']
23811
+ }], altClose: [{
23812
+ type: Output,
23813
+ args: ['clrSidePanelAlternateClose']
23814
+ }], modal: [{
23815
+ type: ViewChild,
23816
+ args: [ClrModal]
23817
+ }], clrSidePanelBackdrop: [{
23818
+ type: Input
23819
+ }], documentClick: [{
23820
+ type: HostListener,
23821
+ args: ['document:pointerup', ['$event']]
23822
+ }] } });
23823
+
23824
+ /*
23825
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
23826
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
23827
+ * This software is released under MIT license.
23828
+ * The full license information can be found in LICENSE in the root directory of this project.
23829
+ */
23830
+ const CLR_SIDEPANEL_DIRECTIVES = [ClrSidePanel];
23831
+ class ClrSidePanelModule {
23832
+ }
23833
+ ClrSidePanelModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrSidePanelModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
23834
+ ClrSidePanelModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.2", ngImport: i0, type: ClrSidePanelModule, declarations: [ClrSidePanel], imports: [CommonModule, CdkTrapFocusModule, ClrIconModule, ClrModalModule], exports: [ClrSidePanel, ClrIconModule] });
23835
+ ClrSidePanelModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrSidePanelModule, imports: [CommonModule, CdkTrapFocusModule, ClrIconModule, ClrModalModule, ClrIconModule] });
23836
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrSidePanelModule, decorators: [{
23837
+ type: NgModule,
23838
+ args: [{
23839
+ imports: [CommonModule, CdkTrapFocusModule, ClrIconModule, ClrModalModule],
23840
+ declarations: [CLR_SIDEPANEL_DIRECTIVES],
23841
+ exports: [CLR_SIDEPANEL_DIRECTIVES, ClrIconModule],
23842
+ }]
23843
+ }] });
23844
+
23012
23845
  /*
23013
23846
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
23014
23847
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -26057,13 +26890,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26057
26890
  * The full license information can be found in LICENSE in the root directory of this project.
26058
26891
  */
26059
26892
  class ClrWizard {
26060
- constructor(platformId, commonStrings, navService, pageCollection, buttonService, headerActionService, differs) {
26893
+ constructor(platformId, commonStrings, navService, pageCollection, buttonService, headerActionService, elementRef, differs) {
26061
26894
  this.platformId = platformId;
26062
26895
  this.commonStrings = commonStrings;
26063
26896
  this.navService = navService;
26064
26897
  this.pageCollection = pageCollection;
26065
26898
  this.buttonService = buttonService;
26066
26899
  this.headerActionService = headerActionService;
26900
+ this.elementRef = elementRef;
26067
26901
  /**
26068
26902
  * Set the aria-label for the stepnav section of the wizard. Set using `[clrWizardStepnavAriaLabel]` input.
26069
26903
  */
@@ -26077,6 +26911,12 @@ class ClrWizard {
26077
26911
  * in the top right corner. Set using `[clrWizardClosable]` input.
26078
26912
  */
26079
26913
  this.closable = true;
26914
+ /**
26915
+ * Used to communicate to the underlying modal that animations are not
26916
+ * wanted. Primary use is for the display of static/inline wizards.
26917
+ * Set using `[clrWizardPreventModalAnimation]` input.
26918
+ */
26919
+ this._stopModalAnimations = false;
26080
26920
  /**
26081
26921
  * Emits when the wizard is opened or closed.
26082
26922
  * Listen via `(clrWizardOpenChange)` event.
@@ -26215,9 +27055,16 @@ class ClrWizard {
26215
27055
  get isFirst() {
26216
27056
  return this.navService.currentPageIsFirst;
26217
27057
  }
27058
+ get isInline() {
27059
+ return this.elementRef.nativeElement.classList.contains('clr-wizard--inline');
27060
+ }
27061
+ get stopModalAnimations() {
27062
+ return this._stopModalAnimations ? 'true' : 'false';
27063
+ }
26218
27064
  ngAfterContentInit() {
26219
27065
  this.pageCollection.pages = this.pages;
26220
27066
  this.headerActionService.wizardHeaderActions = this.headerActions;
27067
+ this.initializeButtons();
26221
27068
  }
26222
27069
  ngDoCheck() {
26223
27070
  this.updateNavOnPageChanges();
@@ -26422,6 +27269,12 @@ class ClrWizard {
26422
27269
  changes.forEachRemovedItem(() => this.navService.updateNavigation());
26423
27270
  }
26424
27271
  }
27272
+ initializeButtons() {
27273
+ // Only trigger buttons ready if default is open (inlined)
27274
+ if (this._open) {
27275
+ this.buttonService.buttonsReady = true;
27276
+ }
27277
+ }
26425
27278
  emitWizardFinished() {
26426
27279
  if (!this.stopNext) {
26427
27280
  this.forceFinish();
@@ -26429,8 +27282,8 @@ class ClrWizard {
26429
27282
  this.wizardFinished.emit();
26430
27283
  }
26431
27284
  }
26432
- 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.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component });
26433
- 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"], forceForward: ["clrWizardForceForwardNavigation", "forceForward"], clrWizardOpen: "clrWizardOpen", stopNext: ["clrWizardPreventDefaultNext", "stopNext"], stopCancel: ["clrWizardPreventDefaultCancel", "stopCancel"], stopNavigation: ["clrWizardPreventNavigation", "stopNavigation"], disableStepnav: ["clrWizardDisableStepnav", "disableStepnav"] }, outputs: { _openChanged: "clrWizardOpenChange", onCancel: "clrWizardOnCancel", wizardFinished: "clrWizardOnFinish", onReset: "clrWizardOnReset", currentPageChanged: "clrWizardCurrentPageChanged", onMoveNext: "clrWizardOnNext", onMovePrevious: "clrWizardOnPrevious" }, host: { properties: { "class.clr-wizard": "true", "class.wizard-md": "size == 'md'", "class.wizard-lg": "size == 'lg'", "class.wizard-xl": "size == 'xl'", "class.lastPage": "navService.currentPageIsLast" } }, providers: [WizardNavigationService, PageCollectionService, ButtonHubService, HeaderActionService], queries: [{ propertyName: "wizardTitle", first: true, predicate: ClrWizardTitle, descendants: true }, { propertyName: "pages", predicate: ClrWizardPage, descendants: true }, { propertyName: "headerActions", predicate: ClrWizardHeaderAction }], viewQueries: [{ propertyName: "pageTitle", first: true, predicate: ["pageTitle"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<clr-modal\n [clrModalOpen]=\"_open\"\n [clrModalSize]=\"size\"\n [clrModalClosable]=\"closable\"\n [clrModalStaticBackdrop]=\"true\"\n [clrModalPreventClose]=\"true\"\n (clrModalAlternateClose)=\"modalCancel()\"\n [clrModalLabelledById]=\"wizardId\"\n>\n <div class=\"modal-nav clr-wizard-stepnav-wrapper\" role=\"region\" [attr.aria-label]=\"stepnavAriaLabel\">\n <div class=\"clr-wizard-title\" id=\"{{wizardId}}\" role=\"heading\" [attr.aria-level]=\"wizardTitle.headingLevel || 1\">\n <ng-content select=\"clr-wizard-title\"></ng-content>\n </div>\n <clr-wizard-stepnav></clr-wizard-stepnav>\n </div>\n\n <div class=\"modal-title\" role=\"heading\" [attr.aria-level]=\"navService.currentPage.pageTitle.headingLevel || 2\">\n <span tabindex=\"-1\" #pageTitle class=\"modal-title-text\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPageTitle\"></ng-template>\n </span>\n\n <div class=\"modal-header-actions-wrapper\" *ngIf=\"headerActionService.displayHeaderActionsWrapper\">\n <div *ngIf=\"headerActionService.showWizardHeaderActions\">\n <ng-content select=\"clr-wizard-header-action\"></ng-content>\n </div>\n <div *ngIf=\"headerActionService.currentPageHasHeaderActions\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.headerActions\"></ng-template>\n </div>\n </div>\n </div>\n\n <div class=\"modal-body\">\n <main clr-wizard-pages-wrapper class=\"clr-wizard-content\">\n <ng-content></ng-content>\n </main>\n </div>\n <div class=\"modal-footer clr-wizard-footer\">\n <div class=\"clr-wizard-footer-buttons\">\n <div\n *ngIf=\"navService.currentPage && !navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-content select=\"clr-wizard-button\"></ng-content>\n </div>\n <div\n *ngIf=\"navService.currentPage && navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.buttons\"></ng-template>\n </div>\n </div>\n </div>\n</clr-modal>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ClrModal, selector: "clr-modal", inputs: ["clrModalOpen", "clrModalClosable", "clrModalCloseButtonAriaLabel", "clrModalSize", "clrModalStaticBackdrop", "clrModalSkipAnimation", "clrModalPreventClose", "clrModalLabelledById"], outputs: ["clrModalOpenChange", "clrModalAlternateClose"] }, { kind: "directive", type: ClrModalBody, selector: ".modal-body" }, { kind: "component", type: ClrWizardStepnav, selector: "clr-wizard-stepnav" }] });
27285
+ ClrWizard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrWizard, deps: [{ token: PLATFORM_ID }, { token: ClrCommonStringsService }, { token: WizardNavigationService }, { token: PageCollectionService }, { token: ButtonHubService }, { token: HeaderActionService }, { token: i0.ElementRef }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component });
27286
+ ClrWizard.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrWizard, selector: "clr-wizard", inputs: { stepnavAriaLabel: ["clrWizardStepnavAriaLabel", "stepnavAriaLabel"], size: ["clrWizardSize", "size"], closable: ["clrWizardClosable", "closable"], _stopModalAnimations: ["clrWizardPreventModalAnimation", "_stopModalAnimations"], forceForward: ["clrWizardForceForwardNavigation", "forceForward"], clrWizardOpen: "clrWizardOpen", stopNext: ["clrWizardPreventDefaultNext", "stopNext"], stopCancel: ["clrWizardPreventDefaultCancel", "stopCancel"], stopNavigation: ["clrWizardPreventNavigation", "stopNavigation"], disableStepnav: ["clrWizardDisableStepnav", "disableStepnav"] }, outputs: { _openChanged: "clrWizardOpenChange", onCancel: "clrWizardOnCancel", wizardFinished: "clrWizardOnFinish", onReset: "clrWizardOnReset", currentPageChanged: "clrWizardCurrentPageChanged", onMoveNext: "clrWizardOnNext", onMovePrevious: "clrWizardOnPrevious" }, host: { properties: { "class.clr-wizard": "true", "class.wizard-md": "size == 'md'", "class.wizard-lg": "size == 'lg'", "class.wizard-xl": "size == 'xl'", "class.lastPage": "navService.currentPageIsLast" } }, providers: [WizardNavigationService, PageCollectionService, ButtonHubService, HeaderActionService], queries: [{ propertyName: "wizardTitle", first: true, predicate: ClrWizardTitle, descendants: true }, { propertyName: "pages", predicate: ClrWizardPage, descendants: true }, { propertyName: "headerActions", predicate: ClrWizardHeaderAction }], viewQueries: [{ propertyName: "pageTitle", first: true, predicate: ["pageTitle"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<clr-modal\n [clrModalOpen]=\"_open\"\n [clrModalSize]=\"size\"\n [clrModalClosable]=\"closable\"\n [clrModalStaticBackdrop]=\"true\"\n [clrModalSkipAnimation]=\"stopModalAnimations\"\n [clrModalOverrideScrollService]=\"isInline\"\n [clrModalPreventClose]=\"true\"\n (clrModalAlternateClose)=\"modalCancel()\"\n [clrModalLabelledById]=\"wizardId\"\n>\n <div class=\"modal-nav clr-wizard-stepnav-wrapper\" role=\"region\" [attr.aria-label]=\"stepnavAriaLabel\">\n <div class=\"clr-wizard-title\" id=\"{{wizardId}}\" role=\"heading\" [attr.aria-level]=\"wizardTitle.headingLevel || 1\">\n <ng-content select=\"clr-wizard-title\"></ng-content>\n </div>\n <clr-wizard-stepnav></clr-wizard-stepnav>\n </div>\n\n <div class=\"modal-title\" role=\"heading\" [attr.aria-level]=\"navService.currentPage.pageTitle.headingLevel || 2\">\n <span tabindex=\"-1\" #pageTitle class=\"modal-title-text\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPageTitle\"></ng-template>\n </span>\n\n <div class=\"modal-header-actions-wrapper\" *ngIf=\"headerActionService.displayHeaderActionsWrapper\">\n <div *ngIf=\"headerActionService.showWizardHeaderActions\">\n <ng-content select=\"clr-wizard-header-action\"></ng-content>\n </div>\n <div *ngIf=\"headerActionService.currentPageHasHeaderActions\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.headerActions\"></ng-template>\n </div>\n </div>\n </div>\n\n <div class=\"modal-body\">\n <main clr-wizard-pages-wrapper class=\"clr-wizard-content\">\n <ng-content></ng-content>\n </main>\n </div>\n <div class=\"modal-footer clr-wizard-footer\">\n <div class=\"clr-wizard-footer-buttons\">\n <div\n *ngIf=\"navService.currentPage && !navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-content select=\"clr-wizard-button\"></ng-content>\n </div>\n <div\n *ngIf=\"navService.currentPage && navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.buttons\"></ng-template>\n </div>\n </div>\n </div>\n</clr-modal>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ClrModal, selector: "clr-modal", inputs: ["clrModalOpen", "clrModalClosable", "clrModalCloseButtonAriaLabel", "clrModalSize", "clrModalStaticBackdrop", "clrModalSkipAnimation", "clrModalPreventClose", "clrModalLabelledById", "clrModalOverrideScrollService"], outputs: ["clrModalOpenChange", "clrModalAlternateClose"] }, { kind: "directive", type: ClrModalBody, selector: ".modal-body" }, { kind: "component", type: ClrWizardStepnav, selector: "clr-wizard-stepnav" }] });
26434
27287
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrWizard, decorators: [{
26435
27288
  type: Component,
26436
27289
  args: [{ selector: 'clr-wizard', providers: [WizardNavigationService, PageCollectionService, ButtonHubService, HeaderActionService], host: {
@@ -26439,12 +27292,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26439
27292
  '[class.wizard-lg]': "size == 'lg'",
26440
27293
  '[class.wizard-xl]': "size == 'xl'",
26441
27294
  '[class.lastPage]': 'navService.currentPageIsLast',
26442
- }, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<clr-modal\n [clrModalOpen]=\"_open\"\n [clrModalSize]=\"size\"\n [clrModalClosable]=\"closable\"\n [clrModalStaticBackdrop]=\"true\"\n [clrModalPreventClose]=\"true\"\n (clrModalAlternateClose)=\"modalCancel()\"\n [clrModalLabelledById]=\"wizardId\"\n>\n <div class=\"modal-nav clr-wizard-stepnav-wrapper\" role=\"region\" [attr.aria-label]=\"stepnavAriaLabel\">\n <div class=\"clr-wizard-title\" id=\"{{wizardId}}\" role=\"heading\" [attr.aria-level]=\"wizardTitle.headingLevel || 1\">\n <ng-content select=\"clr-wizard-title\"></ng-content>\n </div>\n <clr-wizard-stepnav></clr-wizard-stepnav>\n </div>\n\n <div class=\"modal-title\" role=\"heading\" [attr.aria-level]=\"navService.currentPage.pageTitle.headingLevel || 2\">\n <span tabindex=\"-1\" #pageTitle class=\"modal-title-text\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPageTitle\"></ng-template>\n </span>\n\n <div class=\"modal-header-actions-wrapper\" *ngIf=\"headerActionService.displayHeaderActionsWrapper\">\n <div *ngIf=\"headerActionService.showWizardHeaderActions\">\n <ng-content select=\"clr-wizard-header-action\"></ng-content>\n </div>\n <div *ngIf=\"headerActionService.currentPageHasHeaderActions\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.headerActions\"></ng-template>\n </div>\n </div>\n </div>\n\n <div class=\"modal-body\">\n <main clr-wizard-pages-wrapper class=\"clr-wizard-content\">\n <ng-content></ng-content>\n </main>\n </div>\n <div class=\"modal-footer clr-wizard-footer\">\n <div class=\"clr-wizard-footer-buttons\">\n <div\n *ngIf=\"navService.currentPage && !navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-content select=\"clr-wizard-button\"></ng-content>\n </div>\n <div\n *ngIf=\"navService.currentPage && navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.buttons\"></ng-template>\n </div>\n </div>\n </div>\n</clr-modal>\n" }]
27295
+ }, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<clr-modal\n [clrModalOpen]=\"_open\"\n [clrModalSize]=\"size\"\n [clrModalClosable]=\"closable\"\n [clrModalStaticBackdrop]=\"true\"\n [clrModalSkipAnimation]=\"stopModalAnimations\"\n [clrModalOverrideScrollService]=\"isInline\"\n [clrModalPreventClose]=\"true\"\n (clrModalAlternateClose)=\"modalCancel()\"\n [clrModalLabelledById]=\"wizardId\"\n>\n <div class=\"modal-nav clr-wizard-stepnav-wrapper\" role=\"region\" [attr.aria-label]=\"stepnavAriaLabel\">\n <div class=\"clr-wizard-title\" id=\"{{wizardId}}\" role=\"heading\" [attr.aria-level]=\"wizardTitle.headingLevel || 1\">\n <ng-content select=\"clr-wizard-title\"></ng-content>\n </div>\n <clr-wizard-stepnav></clr-wizard-stepnav>\n </div>\n\n <div class=\"modal-title\" role=\"heading\" [attr.aria-level]=\"navService.currentPage.pageTitle.headingLevel || 2\">\n <span tabindex=\"-1\" #pageTitle class=\"modal-title-text\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPageTitle\"></ng-template>\n </span>\n\n <div class=\"modal-header-actions-wrapper\" *ngIf=\"headerActionService.displayHeaderActionsWrapper\">\n <div *ngIf=\"headerActionService.showWizardHeaderActions\">\n <ng-content select=\"clr-wizard-header-action\"></ng-content>\n </div>\n <div *ngIf=\"headerActionService.currentPageHasHeaderActions\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.headerActions\"></ng-template>\n </div>\n </div>\n </div>\n\n <div class=\"modal-body\">\n <main clr-wizard-pages-wrapper class=\"clr-wizard-content\">\n <ng-content></ng-content>\n </main>\n </div>\n <div class=\"modal-footer clr-wizard-footer\">\n <div class=\"clr-wizard-footer-buttons\">\n <div\n *ngIf=\"navService.currentPage && !navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-content select=\"clr-wizard-button\"></ng-content>\n </div>\n <div\n *ngIf=\"navService.currentPage && navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.buttons\"></ng-template>\n </div>\n </div>\n </div>\n</clr-modal>\n" }]
26443
27296
  }], ctorParameters: function () {
26444
27297
  return [{ type: undefined, decorators: [{
26445
27298
  type: Inject,
26446
27299
  args: [PLATFORM_ID]
26447
- }] }, { type: ClrCommonStringsService }, { type: WizardNavigationService }, { type: PageCollectionService }, { type: ButtonHubService }, { type: HeaderActionService }, { type: i0.IterableDiffers }];
27300
+ }] }, { type: ClrCommonStringsService }, { type: WizardNavigationService }, { type: PageCollectionService }, { type: ButtonHubService }, { type: HeaderActionService }, { type: i0.ElementRef }, { type: i0.IterableDiffers }];
26448
27301
  }, propDecorators: { stepnavAriaLabel: [{
26449
27302
  type: Input,
26450
27303
  args: ['clrWizardStepnavAriaLabel']
@@ -26454,6 +27307,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26454
27307
  }], closable: [{
26455
27308
  type: Input,
26456
27309
  args: ['clrWizardClosable']
27310
+ }], _stopModalAnimations: [{
27311
+ type: Input,
27312
+ args: ['clrWizardPreventModalAnimation']
26457
27313
  }], _openChanged: [{
26458
27314
  type: Output,
26459
27315
  args: ['clrWizardOpenChange']
@@ -26768,6 +27624,7 @@ ClarityModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version:
26768
27624
  ClrLayoutModule,
26769
27625
  ClrPopoverModule,
26770
27626
  ClrWizardModule,
27627
+ ClrSidePanelModule,
26771
27628
  ClrStepperModule,
26772
27629
  ClrSpinnerModule,
26773
27630
  ClrProgressBarModule,
@@ -26785,6 +27642,7 @@ ClarityModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version:
26785
27642
  ClrLayoutModule,
26786
27643
  ClrPopoverModule,
26787
27644
  ClrWizardModule,
27645
+ ClrSidePanelModule,
26788
27646
  ClrStepperModule,
26789
27647
  ClrSpinnerModule,
26790
27648
  ClrProgressBarModule,
@@ -26806,6 +27664,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26806
27664
  ClrLayoutModule,
26807
27665
  ClrPopoverModule,
26808
27666
  ClrWizardModule,
27667
+ ClrSidePanelModule,
26809
27668
  ClrStepperModule,
26810
27669
  ClrSpinnerModule,
26811
27670
  ClrProgressBarModule,
@@ -27102,5 +27961,5 @@ const CLR_MENU_POSITIONS = [
27102
27961
  * Generated bundle index. Do not edit.
27103
27962
  */
27104
27963
 
27105
- export { CHANGE_KEYS, CLR_ALERT_DIRECTIVES, CLR_BUTTON_GROUP_DIRECTIVES, CLR_DATAGRID_DIRECTIVES, CLR_DATEPICKER_DIRECTIVES, CLR_DROPDOWN_DIRECTIVES, 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_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, 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, ClrDateInputValidator, ClrDatepickerModule, ClrDatepickerViewManager, ClrDay, ClrDaypicker, ClrDestroyService, ClrDropdown, ClrDropdownItem, ClrDropdownMenu, ClrDropdownModule, ClrDropdownTrigger, ClrEmphasisModule, ClrExpandableAnimation, 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, ClrModalModule, ClrMonthpicker, ClrNavLevel, ClrNavigationModule, 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, ClrSignpost, ClrSignpostContent, ClrSignpostModule, ClrSignpostTrigger, ClrSpinner, ClrSpinnerModule, ClrStackBlock, ClrStackContentInput, ClrStackHeader, ClrStackView, ClrStackViewCustomTags, ClrStackViewLabel, ClrStackViewModule, ClrStandaloneCdkTrapFocus, ClrStepButton, ClrStepButtonType, ClrStepper, ClrStepperModule, ClrStepperPanel, ClrStopEscapePropagationDirective, ClrTab, ClrTabContent, ClrTabLink, ClrTabOverflowContent, ClrTabs, 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, DatagridWillyWonka as ÇlrDatagridWillyWonka, ExpandableOompaLoompa as ÇlrExpandableOompaLoompa, StepperOompaLoompa as ÇlrStepperOompaLoompa, StepperWillyWonka as ÇlrStepperWillyWonka, TabsWillyWonka as ÇlrTabsWillyWonka, WrappedCell as ÇlrWrappedCell, WrappedColumn as ÇlrWrappedColumn, WrappedRow as ÇlrWrappedRow };
27964
+ export { CHANGE_KEYS, CLR_ALERT_DIRECTIVES, CLR_BUTTON_GROUP_DIRECTIVES, CLR_DATAGRID_DIRECTIVES, CLR_DATEPICKER_DIRECTIVES, CLR_DROPDOWN_DIRECTIVES, 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, 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, ClrDateInputValidator, ClrDatepickerModule, ClrDatepickerViewManager, ClrDay, ClrDaypicker, ClrDestroyService, ClrDropdown, ClrDropdownItem, ClrDropdownMenu, ClrDropdownModule, ClrDropdownTrigger, ClrEmphasisModule, ClrExpandableAnimation, ClrFileInput, ClrFileInputContainer, ClrFileInputModule, ClrFileInputValidator, ClrFileInputValueAccessor, 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, ClrModalModule, ClrMonthpicker, ClrNavLevel, ClrNavigationModule, 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, ClrSignpostTrigger, ClrSpinner, ClrSpinnerModule, ClrStackBlock, ClrStackContentInput, ClrStackHeader, ClrStackView, ClrStackViewCustomTags, ClrStackViewLabel, ClrStackViewModule, ClrStandaloneCdkTrapFocus, ClrStepButton, ClrStepButtonType, ClrStepper, ClrStepperModule, ClrStepperPanel, ClrStopEscapePropagationDirective, ClrTab, ClrTabContent, ClrTabLink, ClrTabOverflowContent, ClrTabs, 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 };
27106
27965
  //# sourceMappingURL=clr-angular.mjs.map