@clr/angular 17.1.0 → 17.2.1

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 (91) hide show
  1. package/clarity.api.md +401 -145
  2. package/clr-angular.module.d.ts +7 -6
  3. package/data/datagrid/datagrid-detail-header.d.ts +4 -1
  4. package/data/datagrid/datagrid-detail.d.ts +5 -1
  5. package/data/datagrid/datagrid-filter.d.ts +4 -2
  6. package/data/datagrid/datagrid-if-detail.d.ts +9 -0
  7. package/data/datagrid/datagrid-virtual-scroll.directive.d.ts +62 -0
  8. package/data/datagrid/datagrid.d.ts +8 -4
  9. package/data/datagrid/datagrid.module.d.ts +31 -30
  10. package/data/datagrid/enums/column-changes.enum.d.ts +2 -1
  11. package/data/datagrid/index.d.ts +1 -0
  12. package/data/datagrid/interfaces/column-state.interface.d.ts +1 -0
  13. package/data/datagrid/providers/columns.service.d.ts +1 -0
  14. package/data/datagrid/providers/detail.service.d.ts +4 -0
  15. package/data/datagrid/render/cell-renderer.d.ts +3 -6
  16. package/data/datagrid/render/header-renderer.d.ts +2 -3
  17. package/data/datagrid/render/main-renderer.d.ts +5 -1
  18. package/data/datagrid/render/row-renderer.d.ts +4 -3
  19. package/data/datagrid/utils/key-navigation-grid.controller.d.ts +5 -1
  20. package/esm2020/accordion/accordion-panel.mjs +3 -3
  21. package/esm2020/accordion/stepper/stepper-panel.mjs +8 -4
  22. package/esm2020/clr-angular.module.mjs +5 -1
  23. package/esm2020/data/datagrid/datagrid-action-overflow.mjs +3 -1
  24. package/esm2020/data/datagrid/datagrid-detail-header.mjs +12 -6
  25. package/esm2020/data/datagrid/datagrid-detail.mjs +36 -8
  26. package/esm2020/data/datagrid/datagrid-filter.mjs +22 -13
  27. package/esm2020/data/datagrid/datagrid-if-detail.mjs +30 -7
  28. package/esm2020/data/datagrid/datagrid-row.mjs +3 -3
  29. package/esm2020/data/datagrid/datagrid-selection-cell.directive.mjs +2 -2
  30. package/esm2020/data/datagrid/datagrid-virtual-scroll.directive.mjs +233 -0
  31. package/esm2020/data/datagrid/datagrid.mjs +43 -10
  32. package/esm2020/data/datagrid/datagrid.module.mjs +5 -1
  33. package/esm2020/data/datagrid/enums/column-changes.enum.mjs +3 -2
  34. package/esm2020/data/datagrid/index.mjs +2 -1
  35. package/esm2020/data/datagrid/interfaces/column-state.interface.mjs +1 -1
  36. package/esm2020/data/datagrid/providers/columns.service.mjs +9 -3
  37. package/esm2020/data/datagrid/providers/detail.service.mjs +12 -2
  38. package/esm2020/data/datagrid/render/cell-renderer.mjs +8 -33
  39. package/esm2020/data/datagrid/render/header-renderer.mjs +25 -43
  40. package/esm2020/data/datagrid/render/main-renderer.mjs +59 -9
  41. package/esm2020/data/datagrid/render/render-organizer.mjs +2 -2
  42. package/esm2020/data/datagrid/render/row-renderer.mjs +5 -5
  43. package/esm2020/data/datagrid/utils/key-navigation-grid.controller.mjs +21 -5
  44. package/esm2020/forms/combobox/combobox.mjs +3 -3
  45. package/esm2020/forms/common/abstract-container.mjs +5 -2
  46. package/esm2020/forms/datalist/datalist-container.mjs +1 -4
  47. package/esm2020/forms/datepicker/datepicker-view-manager.mjs +3 -3
  48. package/esm2020/forms/file-input/file-input-container.mjs +157 -0
  49. package/esm2020/forms/file-input/file-input-validator.mjs +72 -0
  50. package/esm2020/forms/file-input/file-input-value-accessor.mjs +53 -0
  51. package/esm2020/forms/file-input/file-input.helpers.mjs +22 -0
  52. package/esm2020/forms/file-input/file-input.mjs +68 -0
  53. package/esm2020/forms/file-input/file-input.module.mjs +43 -0
  54. package/esm2020/forms/file-input/index.mjs +12 -0
  55. package/esm2020/forms/forms.module.mjs +5 -1
  56. package/esm2020/forms/index.mjs +2 -1
  57. package/esm2020/modal/index.mjs +3 -1
  58. package/esm2020/modal/modal-configuration.service.mjs +20 -0
  59. package/esm2020/modal/modal.mjs +47 -18
  60. package/esm2020/modal/modal.module.mjs +4 -2
  61. package/esm2020/modal/side-panel.mjs +90 -0
  62. package/esm2020/modal/side-panel.module.mjs +28 -0
  63. package/esm2020/timeline/timeline-step.mjs +3 -3
  64. package/esm2020/timeline/timeline.mjs +3 -3
  65. package/esm2020/utils/animations/expandable-animation/expandable-animation.mjs +17 -12
  66. package/esm2020/utils/dom-adapter/dom-adapter.mjs +13 -4
  67. package/esm2020/utils/i18n/common-strings.default.mjs +7 -2
  68. package/esm2020/utils/i18n/common-strings.interface.mjs +1 -1
  69. package/esm2020/wizard/wizard.mjs +29 -6
  70. package/fesm2015/clr-angular.mjs +1435 -468
  71. package/fesm2015/clr-angular.mjs.map +1 -1
  72. package/fesm2020/clr-angular.mjs +1418 -463
  73. package/fesm2020/clr-angular.mjs.map +1 -1
  74. package/forms/file-input/file-input-container.d.ts +16 -0
  75. package/forms/file-input/file-input-validator.d.ts +12 -0
  76. package/forms/file-input/file-input-value-accessor.d.ts +15 -0
  77. package/forms/file-input/file-input.d.ts +21 -0
  78. package/forms/file-input/file-input.helpers.d.ts +3 -0
  79. package/forms/file-input/file-input.module.d.ts +14 -0
  80. package/forms/file-input/index.d.ts +5 -0
  81. package/forms/forms.module.d.ts +9 -8
  82. package/forms/index.d.ts +1 -0
  83. package/modal/index.d.ts +2 -0
  84. package/modal/modal-configuration.service.d.ts +7 -0
  85. package/modal/modal.d.ts +8 -2
  86. package/modal/side-panel.d.ts +26 -0
  87. package/modal/side-panel.module.d.ts +13 -0
  88. package/package.json +2 -2
  89. package/utils/animations/expandable-animation/expandable-animation.d.ts +5 -4
  90. package/utils/i18n/common-strings.interface.d.ts +4 -0
  91. 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';
@@ -323,7 +327,7 @@ const commonStringsDefault = {
323
327
  singleSelectionAriaLabel: 'Single selection header',
324
328
  singleActionableAriaLabel: 'Single actionable header',
325
329
  detailExpandableAriaLabel: 'Toggle more row content',
326
- datagridFilterAriaLabel: 'Toggle {COLUMN} filter',
330
+ datagridFilterAriaLabel: '{COLUMN} filter',
327
331
  datagridFilterDialogAriaLabel: 'Filter dialog',
328
332
  columnSeparatorAriaLabel: 'Column resize handle',
329
333
  columnSeparatorDescription: 'Use left or right key to resize the column',
@@ -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
  /*
@@ -4744,7 +4771,10 @@ class ClrAbstractContainer {
4744
4771
  this.subscriptions = [];
4745
4772
  this.subscriptions.push(this.ifControlStateService.statusChanges.subscribe((state) => {
4746
4773
  this.state = state;
4747
- this.updateHelpers();
4774
+ // Make sure everything is updated before dispatching the values for helpers
4775
+ setTimeout(() => {
4776
+ this.updateHelpers();
4777
+ });
4748
4778
  }));
4749
4779
  this.subscriptions.push(this.ngControlService.controlChanges.subscribe(control => {
4750
4780
  this.control = control;
@@ -7301,7 +7331,7 @@ ClrCombobox.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
7301
7331
  IF_ACTIVE_ID_PROVIDER,
7302
7332
  FOCUS_SERVICE_PROVIDER,
7303
7333
  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"] }] });
7334
+ ], 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
7335
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrCombobox, decorators: [{
7306
7336
  type: Component,
7307
7337
  args: [{ selector: 'clr-combobox', providers: [
@@ -7314,7 +7344,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
7314
7344
  '[class.aria-required]': 'true',
7315
7345
  '[class.clr-combobox]': 'true',
7316
7346
  '[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" }]
7347
+ }, 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
7348
  }], ctorParameters: function () {
7319
7349
  return [{ type: i0.ViewContainerRef }, { type: i0.Injector }, { type: i1.NgControl, decorators: [{
7320
7350
  type: Self
@@ -7769,7 +7799,6 @@ class ClrDatalistContainer extends ClrAbstractContainer {
7769
7799
  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
7800
  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
7801
  ControlClassService,
7772
- LayoutService,
7773
7802
  ControlIdService,
7774
7803
  FocusService,
7775
7804
  NgControlService,
@@ -7846,7 +7875,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
7846
7875
  },
7847
7876
  providers: [
7848
7877
  ControlClassService,
7849
- LayoutService,
7850
7878
  ControlIdService,
7851
7879
  FocusService,
7852
7880
  NgControlService,
@@ -9657,7 +9685,7 @@ class ClrDatepickerViewManager {
9657
9685
  }
9658
9686
  }
9659
9687
  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" }] });
9688
+ 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
9689
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatepickerViewManager, decorators: [{
9662
9690
  type: Component,
9663
9691
  args: [{ selector: 'clr-datepicker-view-manager', providers: [DatepickerFocusService], host: {
@@ -9665,7 +9693,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
9665
9693
  '[attr.aria-modal]': 'true',
9666
9694
  '[attr.aria-label]': 'commonStrings.keys.datepickerDialogLabel',
9667
9695
  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" }]
9696
+ }, 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
9697
  }], ctorParameters: function () { return [{ type: ClrCommonStringsService }, { type: ViewManagerService }]; } });
9670
9698
 
9671
9699
  /*
@@ -10294,6 +10322,395 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
10294
10322
  }]
10295
10323
  }], ctorParameters: function () { return []; } });
10296
10324
 
10325
+ /*
10326
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
10327
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
10328
+ * This software is released under MIT license.
10329
+ * The full license information can be found in LICENSE in the root directory of this project.
10330
+ */
10331
+ class ClrFileInputContainer extends ClrAbstractContainer {
10332
+ constructor() {
10333
+ super(...arguments);
10334
+ this.commonStrings = inject(ClrCommonStringsService);
10335
+ }
10336
+ get disabled() {
10337
+ return this.fileInput.elementRef.nativeElement.disabled;
10338
+ }
10339
+ get browseButtonDescribedBy() {
10340
+ return this.fileInput.elementRef.nativeElement.getAttribute('aria-describedby');
10341
+ }
10342
+ browse() {
10343
+ this.fileInput.elementRef.nativeElement.click();
10344
+ }
10345
+ clearSelectedFiles() {
10346
+ this.fileInput.elementRef.nativeElement.value = '';
10347
+ this.fileInput.elementRef.nativeElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
10348
+ this.browseButtonElementRef.nativeElement.focus();
10349
+ }
10350
+ }
10351
+ ClrFileInputContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputContainer, deps: null, target: i0.ɵɵFactoryTarget.Component });
10352
+ 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: `
10353
+ <ng-content select="label"></ng-content>
10354
+ <label *ngIf="!label && addGrid()"></label>
10355
+ <div class="clr-control-container" [ngClass]="controlClass()">
10356
+ <div class="clr-file-input-wrapper">
10357
+ <ng-content select="[clrFileInput]"></ng-content>
10358
+ <button
10359
+ #browseButton
10360
+ type="button"
10361
+ class="btn btn-sm clr-file-input-browse-button"
10362
+ [attr.aria-describedby]="browseButtonDescribedBy"
10363
+ [disabled]="disabled"
10364
+ (click)="browse()"
10365
+ >
10366
+ <cds-icon shape="folder-open"></cds-icon>
10367
+ <span class="clr-file-input-browse-button-text">
10368
+ {{ fileInput?.selection?.buttonLabel || customButtonLabel || commonStrings.keys.browse }}
10369
+ </span>
10370
+ </button>
10371
+ <button
10372
+ *ngIf="fileInput?.selection?.fileCount"
10373
+ type="button"
10374
+ class="btn btn-sm clr-file-input-clear-button"
10375
+ [attr.aria-label]="fileInput?.selection?.clearFilesButtonLabel"
10376
+ (click)="clearSelectedFiles()"
10377
+ >
10378
+ <cds-icon shape="times" status="neutral" size="md"></cds-icon>
10379
+ </button>
10380
+ <cds-icon
10381
+ *ngIf="showInvalid"
10382
+ class="clr-validate-icon"
10383
+ shape="exclamation-circle"
10384
+ status="danger"
10385
+ aria-hidden="true"
10386
+ ></cds-icon>
10387
+ <cds-icon
10388
+ *ngIf="showValid"
10389
+ class="clr-validate-icon"
10390
+ shape="check-circle"
10391
+ status="success"
10392
+ aria-hidden="true"
10393
+ ></cds-icon>
10394
+ </div>
10395
+ <ng-content select="clr-control-helper" *ngIf="showHelper"></ng-content>
10396
+ <ng-content select="clr-control-error" *ngIf="showInvalid"></ng-content>
10397
+ <ng-content select="clr-control-success" *ngIf="showValid"></ng-content>
10398
+ </div>
10399
+ `, 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"] }] });
10400
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputContainer, decorators: [{
10401
+ type: Component,
10402
+ args: [{
10403
+ selector: 'clr-file-input-container',
10404
+ template: `
10405
+ <ng-content select="label"></ng-content>
10406
+ <label *ngIf="!label && addGrid()"></label>
10407
+ <div class="clr-control-container" [ngClass]="controlClass()">
10408
+ <div class="clr-file-input-wrapper">
10409
+ <ng-content select="[clrFileInput]"></ng-content>
10410
+ <button
10411
+ #browseButton
10412
+ type="button"
10413
+ class="btn btn-sm clr-file-input-browse-button"
10414
+ [attr.aria-describedby]="browseButtonDescribedBy"
10415
+ [disabled]="disabled"
10416
+ (click)="browse()"
10417
+ >
10418
+ <cds-icon shape="folder-open"></cds-icon>
10419
+ <span class="clr-file-input-browse-button-text">
10420
+ {{ fileInput?.selection?.buttonLabel || customButtonLabel || commonStrings.keys.browse }}
10421
+ </span>
10422
+ </button>
10423
+ <button
10424
+ *ngIf="fileInput?.selection?.fileCount"
10425
+ type="button"
10426
+ class="btn btn-sm clr-file-input-clear-button"
10427
+ [attr.aria-label]="fileInput?.selection?.clearFilesButtonLabel"
10428
+ (click)="clearSelectedFiles()"
10429
+ >
10430
+ <cds-icon shape="times" status="neutral" size="md"></cds-icon>
10431
+ </button>
10432
+ <cds-icon
10433
+ *ngIf="showInvalid"
10434
+ class="clr-validate-icon"
10435
+ shape="exclamation-circle"
10436
+ status="danger"
10437
+ aria-hidden="true"
10438
+ ></cds-icon>
10439
+ <cds-icon
10440
+ *ngIf="showValid"
10441
+ class="clr-validate-icon"
10442
+ shape="check-circle"
10443
+ status="success"
10444
+ aria-hidden="true"
10445
+ ></cds-icon>
10446
+ </div>
10447
+ <ng-content select="clr-control-helper" *ngIf="showHelper"></ng-content>
10448
+ <ng-content select="clr-control-error" *ngIf="showInvalid"></ng-content>
10449
+ <ng-content select="clr-control-success" *ngIf="showValid"></ng-content>
10450
+ </div>
10451
+ `,
10452
+ host: {
10453
+ '[class.clr-form-control]': 'true',
10454
+ '[class.clr-form-control-disabled]': 'disabled',
10455
+ '[class.clr-row]': 'addGrid()',
10456
+ },
10457
+ providers: [IfControlStateService, NgControlService, ControlIdService, ControlClassService],
10458
+ }]
10459
+ }], propDecorators: { customButtonLabel: [{
10460
+ type: Input,
10461
+ args: ['clrButtonLabel']
10462
+ }], fileInput: [{
10463
+ type: ContentChild,
10464
+ args: [forwardRef(() => ClrFileInput)]
10465
+ }], browseButtonElementRef: [{
10466
+ type: ViewChild,
10467
+ args: ['browseButton']
10468
+ }] } });
10469
+
10470
+ /*
10471
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
10472
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
10473
+ * This software is released under MIT license.
10474
+ * The full license information can be found in LICENSE in the root directory of this project.
10475
+ */
10476
+ class ClrFileInput extends WrappedFormControl {
10477
+ constructor(injector, renderer, viewContainerRef, elementRef, control, commonStrings) {
10478
+ super(viewContainerRef, ClrFileInputContainer, injector, control, renderer, elementRef);
10479
+ this.elementRef = elementRef;
10480
+ this.commonStrings = commonStrings;
10481
+ this.selection = undefined;
10482
+ }
10483
+ handleChange() {
10484
+ this.updateSelection();
10485
+ }
10486
+ updateSelection() {
10487
+ const files = this.elementRef.nativeElement.files;
10488
+ let selectionButtonLabel;
10489
+ let clearFilesButtonLabel;
10490
+ if ((files === null || files === void 0 ? void 0 : files.length) === 1) {
10491
+ const filename = files[0].name;
10492
+ selectionButtonLabel = filename;
10493
+ clearFilesButtonLabel = this.commonStrings.parse(this.commonStrings.keys.clearFile, {
10494
+ FILE: filename,
10495
+ });
10496
+ }
10497
+ else if ((files === null || files === void 0 ? void 0 : files.length) > 1) {
10498
+ const fileCount = files.length.toString();
10499
+ selectionButtonLabel = this.commonStrings.parse(this.commonStrings.keys.fileCount, {
10500
+ COUNT: fileCount,
10501
+ });
10502
+ clearFilesButtonLabel = this.commonStrings.parse(this.commonStrings.keys.clearFiles, {
10503
+ COUNT: fileCount,
10504
+ });
10505
+ }
10506
+ this.selection = {
10507
+ fileCount: files.length,
10508
+ buttonLabel: selectionButtonLabel,
10509
+ clearFilesButtonLabel,
10510
+ };
10511
+ }
10512
+ }
10513
+ 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 });
10514
+ 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 });
10515
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInput, decorators: [{
10516
+ type: Directive,
10517
+ args: [{
10518
+ selector: 'input[type="file"][clrFileInput]',
10519
+ host: {
10520
+ '[class.clr-file-input]': 'true',
10521
+ },
10522
+ }]
10523
+ }], ctorParameters: function () {
10524
+ return [{ type: i0.Injector }, { type: i0.Renderer2 }, { type: i0.ViewContainerRef }, { type: i0.ElementRef }, { type: i1.NgControl, decorators: [{
10525
+ type: Self
10526
+ }, {
10527
+ type: Optional
10528
+ }] }, { type: ClrCommonStringsService }];
10529
+ }, propDecorators: { handleChange: [{
10530
+ type: HostListener,
10531
+ args: ['change']
10532
+ }] } });
10533
+
10534
+ /*
10535
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
10536
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
10537
+ * This software is released under MIT license.
10538
+ * The full license information can be found in LICENSE in the root directory of this project.
10539
+ */
10540
+ class ClrFileInputValidator {
10541
+ constructor(elementRef) {
10542
+ this.elementRef = elementRef;
10543
+ }
10544
+ validate(control) {
10545
+ const files = control.value;
10546
+ const fileInputElement = this.elementRef.nativeElement;
10547
+ const errors = {};
10548
+ // required validation (native attribute)
10549
+ if (fileInputElement.required && (files === null || files === void 0 ? void 0 : files.length) === 0) {
10550
+ errors.required = true;
10551
+ }
10552
+ // accept validation (native attribute)
10553
+ if (fileInputElement.accept && (files === null || files === void 0 ? void 0 : files.length) > 0) {
10554
+ const accept = fileInputElement.accept.split(',').map(type => type.trim());
10555
+ for (let i = 0; i < files.length; i++) {
10556
+ const file = files.item(i);
10557
+ const [fileExtension] = file.name.match(/\..+$/);
10558
+ if (!accept.includes(file.type) && !accept.includes(fileExtension)) {
10559
+ errors.accept = errors.accept || [];
10560
+ errors.accept.push({ name: file.name, accept, type: file.type, extension: fileExtension });
10561
+ }
10562
+ }
10563
+ }
10564
+ // min file validation (custom input)
10565
+ if (this.minFileSize && (files === null || files === void 0 ? void 0 : files.length) > 0) {
10566
+ for (let i = 0; i < files.length; i++) {
10567
+ const file = files.item(i);
10568
+ if (file.size < this.minFileSize) {
10569
+ errors.minFileSize = errors.minFileSize || [];
10570
+ errors.minFileSize.push({ name: file.name, minFileSize: this.minFileSize, actualFileSize: file.size });
10571
+ }
10572
+ }
10573
+ }
10574
+ // max file validation (custom input)
10575
+ if (this.maxFileSize && (files === null || files === void 0 ? void 0 : files.length) > 0) {
10576
+ for (let i = 0; i < files.length; i++) {
10577
+ const file = files.item(i);
10578
+ if (file.size > this.maxFileSize) {
10579
+ errors.maxFileSize = errors.maxFileSize || [];
10580
+ errors.maxFileSize.push({ name: file.name, maxFileSize: this.maxFileSize, actualFileSize: file.size });
10581
+ }
10582
+ }
10583
+ }
10584
+ return Object.keys(errors).length ? errors : null;
10585
+ }
10586
+ }
10587
+ ClrFileInputValidator.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputValidator, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
10588
+ 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 });
10589
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputValidator, decorators: [{
10590
+ type: Directive,
10591
+ args: [{
10592
+ selector: 'input[type="file"][clrFileInput]',
10593
+ providers: [{ provide: NG_VALIDATORS, useExisting: ClrFileInputValidator, multi: true }],
10594
+ }]
10595
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { minFileSize: [{
10596
+ type: Input,
10597
+ args: ['clrMinFileSize']
10598
+ }], maxFileSize: [{
10599
+ type: Input,
10600
+ args: ['clrMaxFileSize']
10601
+ }] } });
10602
+
10603
+ /*
10604
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
10605
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
10606
+ * This software is released under MIT license.
10607
+ * The full license information can be found in LICENSE in the root directory of this project.
10608
+ */
10609
+ function buildFileList(files) {
10610
+ const dataTransfer = new DataTransfer();
10611
+ for (const file of files) {
10612
+ dataTransfer.items.add(file);
10613
+ }
10614
+ return dataTransfer.files;
10615
+ }
10616
+ function selectFiles(fileInputElement, files) {
10617
+ fileInputElement.files = files instanceof FileList ? files : buildFileList(files);
10618
+ fileInputElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
10619
+ }
10620
+ function clearFiles(fileInputElement) {
10621
+ fileInputElement.value = '';
10622
+ fileInputElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
10623
+ }
10624
+
10625
+ /*
10626
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
10627
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
10628
+ * This software is released under MIT license.
10629
+ * The full license information can be found in LICENSE in the root directory of this project.
10630
+ */
10631
+ class ClrFileInputValueAccessor {
10632
+ constructor(elementRef) {
10633
+ this.elementRef = elementRef;
10634
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
10635
+ this.onChange = (_value) => { };
10636
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
10637
+ this.onTouched = () => { };
10638
+ }
10639
+ writeValue(value) {
10640
+ if (value !== undefined && value !== null && !(value instanceof FileList)) {
10641
+ throw new Error('The value of a file input control must be a FileList.');
10642
+ }
10643
+ if (value) {
10644
+ selectFiles(this.elementRef.nativeElement, value);
10645
+ }
10646
+ else if (this.elementRef.nativeElement.files.length) {
10647
+ clearFiles(this.elementRef.nativeElement);
10648
+ }
10649
+ }
10650
+ registerOnChange(fn) {
10651
+ this.onChange = fn;
10652
+ }
10653
+ registerOnTouched(fn) {
10654
+ this.onTouched = fn;
10655
+ }
10656
+ handleChange() {
10657
+ this.onTouched();
10658
+ this.onChange(this.elementRef.nativeElement.files);
10659
+ }
10660
+ }
10661
+ ClrFileInputValueAccessor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputValueAccessor, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
10662
+ 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 });
10663
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputValueAccessor, decorators: [{
10664
+ type: Directive,
10665
+ args: [{
10666
+ selector: 'input[type="file"][clrFileInput]',
10667
+ providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: ClrFileInputValueAccessor, multi: true }],
10668
+ }]
10669
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { handleChange: [{
10670
+ type: HostListener,
10671
+ args: ['change']
10672
+ }] } });
10673
+
10674
+ /*
10675
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
10676
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
10677
+ * This software is released under MIT license.
10678
+ * The full license information can be found in LICENSE in the root directory of this project.
10679
+ */
10680
+ class ClrFileInputModule {
10681
+ constructor() {
10682
+ ClarityIcons.addIcons(folderOpenIcon);
10683
+ }
10684
+ }
10685
+ ClrFileInputModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
10686
+ 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,
10687
+ ClrFileInput,
10688
+ ClrFileInputContainer,
10689
+ ClrFileInputValidator,
10690
+ ClrFileInputValueAccessor] });
10691
+ ClrFileInputModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputModule, imports: [CommonModule, ClrIconModule, ClrCommonFormsModule, ClrCommonFormsModule] });
10692
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputModule, decorators: [{
10693
+ type: NgModule,
10694
+ args: [{
10695
+ imports: [CommonModule, ClrIconModule, ClrCommonFormsModule],
10696
+ declarations: [ClrFileInput, ClrFileInputContainer, ClrFileInputValidator, ClrFileInputValueAccessor],
10697
+ exports: [
10698
+ ClrCommonFormsModule,
10699
+ ClrFileInput,
10700
+ ClrFileInputContainer,
10701
+ ClrFileInputValidator,
10702
+ ClrFileInputValueAccessor,
10703
+ ],
10704
+ }]
10705
+ }], ctorParameters: function () { return []; } });
10706
+
10707
+ /*
10708
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
10709
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
10710
+ * This software is released under MIT license.
10711
+ * The full license information can be found in LICENSE in the root directory of this project.
10712
+ */
10713
+
10297
10714
  /*
10298
10715
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
10299
10716
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -11236,6 +11653,7 @@ ClrFormsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version:
11236
11653
  ClrCheckboxModule,
11237
11654
  ClrComboboxModule,
11238
11655
  ClrDatepickerModule,
11656
+ ClrFileInputModule,
11239
11657
  ClrInputModule,
11240
11658
  ClrPasswordModule,
11241
11659
  ClrRadioModule,
@@ -11247,6 +11665,7 @@ ClrFormsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version:
11247
11665
  ClrCheckboxModule,
11248
11666
  ClrComboboxModule,
11249
11667
  ClrDatepickerModule,
11668
+ ClrFileInputModule,
11250
11669
  ClrInputModule,
11251
11670
  ClrPasswordModule,
11252
11671
  ClrRadioModule,
@@ -11263,6 +11682,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
11263
11682
  ClrCheckboxModule,
11264
11683
  ClrComboboxModule,
11265
11684
  ClrDatepickerModule,
11685
+ ClrFileInputModule,
11266
11686
  ClrInputModule,
11267
11687
  ClrPasswordModule,
11268
11688
  ClrRadioModule,
@@ -11776,49 +12196,243 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
11776
12196
  * This software is released under MIT license.
11777
12197
  * The full license information can be found in LICENSE in the root directory of this project.
11778
12198
  */
11779
- /**
11780
- * Custom filter that can be added in any column to override the default object property string filter.
11781
- * The reason this is not just an input on DatagridColumn is because we need the filter's template to be projected,
11782
- * since it can be anything (not just a text input).
11783
- */
11784
- class ClrDatagridFilter extends DatagridFilterRegistrar {
11785
- constructor(_filters, commonStrings, smartToggleService, platformId, elementRef) {
11786
- super(_filters);
11787
- this.commonStrings = commonStrings;
11788
- this.smartToggleService = smartToggleService;
11789
- this.platformId = platformId;
11790
- this.elementRef = elementRef;
11791
- this.openChange = new EventEmitter(false);
11792
- this.ariaExpanded = false;
11793
- this.popoverId = uniqueIdFactory();
11794
- // Smart Popover
11795
- this.smartPosition = {
11796
- axis: ClrAxis.VERTICAL,
11797
- side: ClrSide.AFTER,
11798
- anchor: ClrAlignment.END,
11799
- content: ClrAlignment.END,
11800
- };
11801
- this._open = false;
11802
- this.subs = [];
11803
- this.subs.push(smartToggleService.openChange.subscribe(change => {
11804
- this.open = change;
11805
- this.ariaExpanded = change;
11806
- }));
11807
- }
11808
- get open() {
11809
- return this._open;
11810
- }
11811
- set open(open) {
11812
- open = !!open;
11813
- if (this.open !== open) {
11814
- this.smartToggleService.open = open;
11815
- this.openChange.emit(open);
11816
- if (!open && isPlatformBrowser(this.platformId)) {
11817
- this.anchor.nativeElement.focus();
11818
- }
11819
- // keep track of the state
11820
- this._open = open;
11821
- }
12199
+ function getTabableItems(el) {
12200
+ const tabableSelector = [
12201
+ 'a[href]',
12202
+ 'area[href]',
12203
+ 'input:not([disabled])',
12204
+ 'button:not([disabled])',
12205
+ 'select:not([disabled])',
12206
+ 'textarea:not([disabled])',
12207
+ 'iframe',
12208
+ 'object',
12209
+ 'embed',
12210
+ '*[tabindex]',
12211
+ '*[contenteditable=true]',
12212
+ '[role=button]:not([disabled])',
12213
+ ].join(',');
12214
+ return Array.from(el.querySelectorAll(tabableSelector));
12215
+ }
12216
+ class KeyNavigationGridController {
12217
+ constructor(zone) {
12218
+ this.zone = zone;
12219
+ this.skipItemFocus = false;
12220
+ this.listenersAdded = false;
12221
+ this.destroy$ = new Subject();
12222
+ this._activeCell = null;
12223
+ this.config = {
12224
+ keyGridRows: '[role=row]:not(.datagrid-placeholder)',
12225
+ keyGridCells: '[role=gridcell]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), [role=columnheader]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), .datagrid-detail-caret',
12226
+ keyGrid: '[role=grid]',
12227
+ };
12228
+ }
12229
+ get grid() {
12230
+ var _a;
12231
+ return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelector(this.config.keyGrid);
12232
+ }
12233
+ get rows() {
12234
+ var _a;
12235
+ return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.config.keyGridRows);
12236
+ }
12237
+ get cells() {
12238
+ var _a;
12239
+ return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.config.keyGridCells);
12240
+ }
12241
+ ngOnDestroy() {
12242
+ this.destroy$.next();
12243
+ this.destroy$.complete();
12244
+ }
12245
+ addListeners() {
12246
+ if (this.listenersAdded) {
12247
+ return;
12248
+ }
12249
+ this.zone.runOutsideAngular(() => {
12250
+ fromEvent(this.grid, 'mousedown')
12251
+ .pipe(takeUntil(this.destroy$))
12252
+ .subscribe((e) => {
12253
+ // preserve right click for context menus & keyboard mouse control https://apple.stackexchange.com/questions/32715/how-do-i-open-the-context-menu-from-a-mac-keyboard
12254
+ if (e.buttons === 1 && !e.ctrlKey) {
12255
+ const activeCell = this.cells
12256
+ ? Array.from(this.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
12257
+ : null;
12258
+ if (activeCell) {
12259
+ this.setActiveCell(activeCell);
12260
+ }
12261
+ }
12262
+ });
12263
+ fromEvent(this.grid, 'wheel')
12264
+ .pipe(takeUntil(this.destroy$))
12265
+ .subscribe(() => {
12266
+ this.removeActiveCell();
12267
+ });
12268
+ fromEvent(this.grid, 'keydown')
12269
+ .pipe(takeUntil(this.destroy$))
12270
+ .subscribe((e) => {
12271
+ // Skip column resize events
12272
+ if (e.target.classList.contains('drag-handle') &&
12273
+ (e.code === 'ArrowLeft' || e.code === 'ArrowRight')) {
12274
+ return;
12275
+ }
12276
+ if (e.code === 'ArrowUp' ||
12277
+ e.code === 'ArrowDown' ||
12278
+ e.code === 'ArrowLeft' ||
12279
+ e.code === 'ArrowRight' ||
12280
+ e.code === 'End' ||
12281
+ e.code === 'Home' ||
12282
+ e.code === 'PageUp' ||
12283
+ e.code === 'PageDown') {
12284
+ const { x, y } = this.getNextItemCoordinate(e);
12285
+ const activeItem = this.rows
12286
+ ? Array.from(this.rows[y].querySelectorAll(this.config.keyGridCells))[x]
12287
+ : null;
12288
+ if (activeItem) {
12289
+ this.setActiveCell(activeItem);
12290
+ }
12291
+ e.preventDefault();
12292
+ }
12293
+ });
12294
+ });
12295
+ this.listenersAdded = true;
12296
+ }
12297
+ initializeKeyGrid(host) {
12298
+ this.host = host;
12299
+ this.addListeners();
12300
+ this.resetKeyGrid();
12301
+ }
12302
+ resetKeyGrid() {
12303
+ var _a;
12304
+ (_a = this.cells) === null || _a === void 0 ? void 0 : _a.forEach((i) => i.setAttribute('tabindex', '-1'));
12305
+ const firstCell = this.cells ? this.cells[0] : null;
12306
+ firstCell === null || firstCell === void 0 ? void 0 : firstCell.setAttribute('tabindex', '0');
12307
+ }
12308
+ removeActiveCell() {
12309
+ this._activeCell = null;
12310
+ }
12311
+ getActiveCell() {
12312
+ return this._activeCell;
12313
+ }
12314
+ setActiveCell(activeCell) {
12315
+ const prior = this.cells ? Array.from(this.cells).find(c => c.getAttribute('tabindex') === '0') : null;
12316
+ if (prior) {
12317
+ prior.setAttribute('tabindex', '-1');
12318
+ }
12319
+ activeCell.setAttribute('tabindex', '0');
12320
+ this._activeCell = activeCell;
12321
+ const items = getTabableItems(activeCell);
12322
+ const item = activeCell.getAttribute('role') !== 'columnheader' && items[0] ? items[0] : activeCell;
12323
+ if (!this.skipItemFocus) {
12324
+ item.focus();
12325
+ }
12326
+ }
12327
+ getNextItemCoordinate(e) {
12328
+ var _a;
12329
+ let currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
12330
+ if (e.code === 'Tab') {
12331
+ currentCell = document.activeElement;
12332
+ }
12333
+ const currentRow = this.rows && currentCell ? Array.from(this.rows).find(r => r.contains(currentCell)) : null;
12334
+ const numOfRows = this.rows ? this.rows.length - 1 : 0;
12335
+ const numOfColumns = this.cells ? Math.floor(this.cells.length / this.rows.length - 1) : 0;
12336
+ let x = currentRow && currentCell
12337
+ ? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell)
12338
+ : 0;
12339
+ let y = currentRow && currentCell && this.rows ? Array.from(this.rows).indexOf(currentRow) : 0;
12340
+ const dir = this.host.dir;
12341
+ const inlineStart = dir === 'rtl' ? 'ArrowRight' : 'ArrowLeft';
12342
+ const inlineEnd = dir === 'rtl' ? 'ArrowLeft' : 'ArrowRight';
12343
+ const itemsPerPage = Math.floor(((_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelector('.datagrid').clientHeight) / this.rows[0].clientHeight) - 1 || 0;
12344
+ if (e.code === 'ArrowUp' && y !== 0) {
12345
+ y = y - 1;
12346
+ }
12347
+ else if (e.code === 'ArrowDown' && y < numOfRows) {
12348
+ y = y + 1;
12349
+ }
12350
+ else if (e.code === inlineStart && x !== 0) {
12351
+ x = x - 1;
12352
+ }
12353
+ else if (e.code === inlineEnd && x < numOfColumns) {
12354
+ x = x + 1;
12355
+ }
12356
+ else if (e.code === 'End') {
12357
+ x = numOfColumns;
12358
+ if (e.ctrlKey) {
12359
+ y = numOfRows;
12360
+ }
12361
+ }
12362
+ else if (e.code === 'Home') {
12363
+ x = 0;
12364
+ if (e.ctrlKey) {
12365
+ y = 0;
12366
+ }
12367
+ }
12368
+ else if (e.code === 'PageUp') {
12369
+ y = y - itemsPerPage > 0 ? y - itemsPerPage + 1 : 1;
12370
+ }
12371
+ else if (e.code === 'PageDown') {
12372
+ y = y + itemsPerPage < numOfRows ? y + itemsPerPage : numOfRows;
12373
+ }
12374
+ return { x, y };
12375
+ }
12376
+ }
12377
+ KeyNavigationGridController.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
12378
+ KeyNavigationGridController.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController });
12379
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, decorators: [{
12380
+ type: Injectable
12381
+ }], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
12382
+
12383
+ /*
12384
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12385
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
12386
+ * This software is released under MIT license.
12387
+ * The full license information can be found in LICENSE in the root directory of this project.
12388
+ */
12389
+ /**
12390
+ * Custom filter that can be added in any column to override the default object property string filter.
12391
+ * The reason this is not just an input on DatagridColumn is because we need the filter's template to be projected,
12392
+ * since it can be anything (not just a text input).
12393
+ */
12394
+ class ClrDatagridFilter extends DatagridFilterRegistrar {
12395
+ constructor(_filters, commonStrings, smartToggleService, platformId, elementRef, keyNavigation) {
12396
+ super(_filters);
12397
+ this.commonStrings = commonStrings;
12398
+ this.smartToggleService = smartToggleService;
12399
+ this.platformId = platformId;
12400
+ this.elementRef = elementRef;
12401
+ this.keyNavigation = keyNavigation;
12402
+ this.openChange = new EventEmitter(false);
12403
+ this.ariaExpanded = false;
12404
+ this.popoverId = uniqueIdFactory();
12405
+ // Smart Popover
12406
+ this.smartPosition = {
12407
+ axis: ClrAxis.VERTICAL,
12408
+ side: ClrSide.AFTER,
12409
+ anchor: ClrAlignment.END,
12410
+ content: ClrAlignment.END,
12411
+ };
12412
+ this._open = false;
12413
+ this.subs = [];
12414
+ this.subs.push(smartToggleService.openChange.subscribe(change => {
12415
+ this.open = change;
12416
+ this.ariaExpanded = change;
12417
+ }));
12418
+ }
12419
+ get open() {
12420
+ return this._open;
12421
+ }
12422
+ set open(open) {
12423
+ open = !!open;
12424
+ if (this.open !== open) {
12425
+ this.smartToggleService.open = open;
12426
+ this.openChange.emit(open);
12427
+ if (!open && isPlatformBrowser(this.platformId)) {
12428
+ this.anchor.nativeElement.focus();
12429
+ }
12430
+ if (this.keyNavigation) {
12431
+ this.keyNavigation.skipItemFocus = open;
12432
+ }
12433
+ // keep track of the state
12434
+ this._open = open;
12435
+ }
11822
12436
  }
11823
12437
  set customFilter(filter) {
11824
12438
  this.setFilter(filter);
@@ -11830,7 +12444,9 @@ class ClrDatagridFilter extends DatagridFilterRegistrar {
11830
12444
  return !!this.filter && this.filter.isActive();
11831
12445
  }
11832
12446
  ngOnChanges() {
11833
- this.setToggleButtonAriaLabel();
12447
+ setTimeout(() => {
12448
+ this.setToggleButtonAriaLabel();
12449
+ });
11834
12450
  }
11835
12451
  ngOnDestroy() {
11836
12452
  super.ngOnDestroy();
@@ -11850,7 +12466,7 @@ class ClrDatagridFilter extends DatagridFilterRegistrar {
11850
12466
  });
11851
12467
  }
11852
12468
  }
11853
- ClrDatagridFilter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridFilter, deps: [{ token: FiltersProvider }, { token: ClrCommonStringsService }, { token: ClrPopoverToggleService }, { token: PLATFORM_ID }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
12469
+ ClrDatagridFilter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridFilter, deps: [{ token: FiltersProvider }, { token: ClrCommonStringsService }, { token: ClrPopoverToggleService }, { token: PLATFORM_ID }, { token: i0.ElementRef }, { token: KeyNavigationGridController, optional: true }], target: i0.ɵɵFactoryTarget.Component });
11854
12470
  ClrDatagridFilter.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridFilter, selector: "clr-dg-filter", inputs: { open: ["clrDgFilterOpen", "open"], customFilter: ["clrDgFilter", "customFilter"] }, outputs: { openChange: "clrDgFilterOpenChange" }, providers: [{ provide: CustomFilter, useExisting: ClrDatagridFilter }], viewQueries: [{ propertyName: "anchor", first: true, predicate: ["anchor"], descendants: true, read: ElementRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `
11855
12471
  <button
11856
12472
  class="datagrid-filter-toggle"
@@ -11936,7 +12552,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
11936
12552
  return [{ type: FiltersProvider }, { type: ClrCommonStringsService }, { type: ClrPopoverToggleService }, { type: undefined, decorators: [{
11937
12553
  type: Inject,
11938
12554
  args: [PLATFORM_ID]
11939
- }] }, { type: i0.ElementRef }];
12555
+ }] }, { type: i0.ElementRef }, { type: KeyNavigationGridController, decorators: [{
12556
+ type: Optional
12557
+ }] }];
11940
12558
  }, propDecorators: { openChange: [{
11941
12559
  type: Output,
11942
12560
  args: ['clrDgFilterOpenChange']
@@ -12699,6 +13317,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12699
13317
  class DetailService {
12700
13318
  constructor(modalStackService) {
12701
13319
  this.modalStackService = modalStackService;
13320
+ this.preventScroll = false;
12702
13321
  this.toggleState = false;
12703
13322
  this._enabled = false;
12704
13323
  this._state = new BehaviorSubject(this.toggleState);
@@ -12709,6 +13328,12 @@ class DetailService {
12709
13328
  set enabled(state) {
12710
13329
  this._enabled = state;
12711
13330
  }
13331
+ get preventFocusScroll() {
13332
+ return this.preventScroll;
13333
+ }
13334
+ set preventFocusScroll(preventScroll) {
13335
+ this.preventScroll = preventScroll;
13336
+ }
12712
13337
  get state() {
12713
13338
  return this.cache;
12714
13339
  }
@@ -12727,10 +13352,13 @@ class DetailService {
12727
13352
  }
12728
13353
  close() {
12729
13354
  this.toggleState = false;
13355
+ this.returnFocus();
12730
13356
  this._state.next(this.toggleState);
12731
13357
  this.modalStackService.trackModalClose(this);
13358
+ }
13359
+ returnFocus() {
12732
13360
  if (this.button) {
12733
- this.button.focus();
13361
+ this.button.focus({ preventScroll: this.preventFocusScroll });
12734
13362
  this.button = null;
12735
13363
  }
12736
13364
  }
@@ -13038,7 +13666,7 @@ class DatagridRenderOrganizer {
13038
13666
  this._renderStep.next(DatagridRenderStep.CLEAR_WIDTHS);
13039
13667
  }
13040
13668
  this._renderStep.next(DatagridRenderStep.COMPUTE_COLUMN_WIDTHS);
13041
- this._renderStep.next(DatagridRenderStep.ALIGN_COLUMNS);
13669
+ this._renderStep.next(DatagridRenderStep.ALIGN_COLUMNS); // NOT USED
13042
13670
  this.alreadySized = true;
13043
13671
  this._renderStep.next(DatagridRenderStep.CALCULATE_MODE_OFF);
13044
13672
  }
@@ -14753,6 +15381,7 @@ class ClrDatagridSelectionCellDirective {
14753
15381
  this.selection = selection;
14754
15382
  }
14755
15383
  onSelectionCellClick(event) {
15384
+ var _a;
14756
15385
  // We want to effectively expand the selection click target to the entire selection cell.
14757
15386
  // If row selection is enabled, do nothing because the entire selection cell is already clickable.
14758
15387
  if (this.selection.rowSelectionMode) {
@@ -14760,7 +15389,7 @@ class ClrDatagridSelectionCellDirective {
14760
15389
  }
14761
15390
  // If click was outside the label/input, forward the click to the input.
14762
15391
  if (event.target.tagName !== 'LABEL' && event.target.tagName !== 'INPUT') {
14763
- event.target.querySelector('input').click();
15392
+ (_a = event.target.querySelector('input')) === null || _a === void 0 ? void 0 : _a.click();
14764
15393
  }
14765
15394
  }
14766
15395
  }
@@ -15030,7 +15659,7 @@ ClrDatagridRow.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version
15030
15659
  DatagridIfExpandService,
15031
15660
  { provide: IfExpandService, useExisting: DatagridIfExpandService },
15032
15661
  { 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" }] });
15662
+ ], queries: [{ propertyName: "dgCells", predicate: ClrDatagridCell }], viewQueries: [{ propertyName: "expandAnimation", first: true, predicate: ClrExpandableAnimation, descendants: true }, { propertyName: "detailButton", first: true, predicate: ["detailButton"], descendants: true }, { propertyName: "_stickyCells", first: true, predicate: ["stickyCells"], descendants: true, read: ViewContainerRef }, { propertyName: "_scrollableCells", first: true, predicate: ["scrollableCells"], descendants: true, read: ViewContainerRef }, { propertyName: "_calculatedCells", first: true, predicate: ["calculatedCells"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!--\n We need to wrap the #rowContent in label element if we are in rowSelectionMode.\n Clicking of that wrapper label will equate to clicking on the whole row, which triggers the checkbox to toggle.\n-->\n<div\n class=\"datagrid-row-clickable\"\n *ngIf=\"selection.rowSelectionMode\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n>\n <clr-expandable-animation [clrExpandTrigger]=\"expandAnimationTrigger\" *ngIf=\"expand.expandable\">\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n </clr-expandable-animation>\n <ng-template [ngTemplateOutlet]=\"rowContent\" *ngIf=\"!expand.expandable\"></ng-template>\n</div>\n\n<clr-expandable-animation\n *ngIf=\"!selection.rowSelectionMode && expand.expandable\"\n [clrExpandTrigger]=\"expandAnimationTrigger\"\n>\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n</clr-expandable-animation>\n\n<ng-template *ngIf=\"!selection.rowSelectionMode && !expand.expandable\" [ngTemplateOutlet]=\"rowContent\"></ng-template>\n\n<!--\n We need the \"project into template\" hacks because we need this in 2 different places\n depending on whether the details replace the row or not.\n-->\n<ng-template #detail>\n <ng-content select=\"clr-dg-row-detail\"></ng-content>\n</ng-template>\n\n<ng-template #rowContent>\n <div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [class.datagrid-row-detail-open]=\"detailService.isRowOpen(item)\"\n >\n <div class=\"datagrid-row-sticky\">\n <!-- Sticky elements here -->\n <ng-container #stickyCells>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-checkbox-wrapper>\n <input\n tabindex=\"-1\"\n type=\"checkbox\"\n clrCheckbox\n [ngModel]=\"selected\"\n (ngModelChange)=\"toggle($event)\"\n [id]=\"checkboxId\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"checkboxId\" class=\"clr-control-label clr-col-null\" (click)=\"clearRanges($event)\">\n <span class=\"clr-sr-only\">{{clrDgRowSelectionLabel || commonStrings.keys.select}}</span>\n </label>\n </clr-checkbox-wrapper>\n </div>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-radio-wrapper>\n <input\n tabindex=\"-1\"\n type=\"radio\"\n clrRadio\n [id]=\"radioId\"\n [name]=\"selection.id + '-radio'\"\n [value]=\"item\"\n [(ngModel)]=\"selection.currentSingle\"\n [checked]=\"selection.currentSingle === item\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <label class=\"clr-control-label clr-col-null\" [for]=\"radioId\">\n <span class=\"clr-sr-only\">{{ clrDgRowSelectionLabel || commonStrings.keys.select }}</span>\n </label>\n </clr-radio-wrapper>\n </div>\n <div\n *ngIf=\"rowActionService.hasActionableRow\"\n class=\"datagrid-row-actions datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-content select=\"clr-dg-action-overflow\"></ng-content>\n </div>\n <div\n *ngIf=\"globalExpandable.hasExpandableRow\"\n class=\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-container *ngIf=\"expand.expandable\">\n <button\n tabindex=\"-1\"\n *ngIf=\"!expand.loading\"\n (click)=\"toggleExpand()\"\n type=\"button\"\n class=\"datagrid-expandable-caret-button\"\n [attr.aria-expanded]=\"expand.expanded\"\n [attr.aria-label]=\"expand.expanded ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-controls]=\"expandableId\"\n >\n <cds-icon\n shape=\"angle\"\n class=\"datagrid-expandable-caret-icon\"\n [attr.direction]=\"expand.expanded ? 'down' : 'right'\"\n [attr.title]=\"expand.expanded ? commonStrings.keys.collapse : commonStrings.keys.expand\"\n ></cds-icon>\n </button>\n <clr-spinner *ngIf=\"expand.loading\" clrSmall>{{ commonStrings.keys.loading }}</clr-spinner>\n </ng-container>\n </div>\n <div\n *ngIf=\"detailService.enabled\"\n class=\"datagrid-detail-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <button\n tabindex=\"-1\"\n (click)=\"detailService.toggle(item, detailButton)\"\n type=\"button\"\n #detailButton\n class=\"datagrid-detail-caret-button\"\n [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
15663
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridRow, decorators: [{
15035
15664
  type: Component,
15036
15665
  args: [{ selector: 'clr-dg-row', host: {
@@ -15042,7 +15671,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15042
15671
  DatagridIfExpandService,
15043
15672
  { provide: IfExpandService, useExisting: DatagridIfExpandService },
15044
15673
  { 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" }]
15674
+ ], template: "<!--\n We need to wrap the #rowContent in label element if we are in rowSelectionMode.\n Clicking of that wrapper label will equate to clicking on the whole row, which triggers the checkbox to toggle.\n-->\n<div\n class=\"datagrid-row-clickable\"\n *ngIf=\"selection.rowSelectionMode\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n>\n <clr-expandable-animation [clrExpandTrigger]=\"expandAnimationTrigger\" *ngIf=\"expand.expandable\">\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n </clr-expandable-animation>\n <ng-template [ngTemplateOutlet]=\"rowContent\" *ngIf=\"!expand.expandable\"></ng-template>\n</div>\n\n<clr-expandable-animation\n *ngIf=\"!selection.rowSelectionMode && expand.expandable\"\n [clrExpandTrigger]=\"expandAnimationTrigger\"\n>\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n</clr-expandable-animation>\n\n<ng-template *ngIf=\"!selection.rowSelectionMode && !expand.expandable\" [ngTemplateOutlet]=\"rowContent\"></ng-template>\n\n<!--\n We need the \"project into template\" hacks because we need this in 2 different places\n depending on whether the details replace the row or not.\n-->\n<ng-template #detail>\n <ng-content select=\"clr-dg-row-detail\"></ng-content>\n</ng-template>\n\n<ng-template #rowContent>\n <div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [class.datagrid-row-detail-open]=\"detailService.isRowOpen(item)\"\n >\n <div class=\"datagrid-row-sticky\">\n <!-- Sticky elements here -->\n <ng-container #stickyCells>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-checkbox-wrapper>\n <input\n tabindex=\"-1\"\n type=\"checkbox\"\n clrCheckbox\n [ngModel]=\"selected\"\n (ngModelChange)=\"toggle($event)\"\n [id]=\"checkboxId\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"checkboxId\" class=\"clr-control-label clr-col-null\" (click)=\"clearRanges($event)\">\n <span class=\"clr-sr-only\">{{clrDgRowSelectionLabel || commonStrings.keys.select}}</span>\n </label>\n </clr-checkbox-wrapper>\n </div>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-radio-wrapper>\n <input\n tabindex=\"-1\"\n type=\"radio\"\n clrRadio\n [id]=\"radioId\"\n [name]=\"selection.id + '-radio'\"\n [value]=\"item\"\n [(ngModel)]=\"selection.currentSingle\"\n [checked]=\"selection.currentSingle === item\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <label class=\"clr-control-label clr-col-null\" [for]=\"radioId\">\n <span class=\"clr-sr-only\">{{ clrDgRowSelectionLabel || commonStrings.keys.select }}</span>\n </label>\n </clr-radio-wrapper>\n </div>\n <div\n *ngIf=\"rowActionService.hasActionableRow\"\n class=\"datagrid-row-actions datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-content select=\"clr-dg-action-overflow\"></ng-content>\n </div>\n <div\n *ngIf=\"globalExpandable.hasExpandableRow\"\n class=\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-container *ngIf=\"expand.expandable\">\n <button\n tabindex=\"-1\"\n *ngIf=\"!expand.loading\"\n (click)=\"toggleExpand()\"\n type=\"button\"\n class=\"datagrid-expandable-caret-button\"\n [attr.aria-expanded]=\"expand.expanded\"\n [attr.aria-label]=\"expand.expanded ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-controls]=\"expandableId\"\n >\n <cds-icon\n shape=\"angle\"\n class=\"datagrid-expandable-caret-icon\"\n [attr.direction]=\"expand.expanded ? 'down' : 'right'\"\n [attr.title]=\"expand.expanded ? commonStrings.keys.collapse : commonStrings.keys.expand\"\n ></cds-icon>\n </button>\n <clr-spinner *ngIf=\"expand.loading\" clrSmall>{{ commonStrings.keys.loading }}</clr-spinner>\n </ng-container>\n </div>\n <div\n *ngIf=\"detailService.enabled\"\n class=\"datagrid-detail-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <button\n tabindex=\"-1\"\n (click)=\"detailService.toggle(item, detailButton)\"\n type=\"button\"\n #detailButton\n class=\"datagrid-detail-caret-button\"\n [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
15675
  }], ctorParameters: function () {
15047
15676
  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
15677
  type: Inject,
@@ -15102,10 +15731,11 @@ var DatagridColumnChanges;
15102
15731
  (function (DatagridColumnChanges) {
15103
15732
  DatagridColumnChanges[DatagridColumnChanges["WIDTH"] = 0] = "WIDTH";
15104
15733
  DatagridColumnChanges[DatagridColumnChanges["HIDDEN"] = 1] = "HIDDEN";
15734
+ DatagridColumnChanges[DatagridColumnChanges["INITIALIZE"] = 2] = "INITIALIZE";
15105
15735
  })(DatagridColumnChanges || (DatagridColumnChanges = {}));
15106
15736
  const ALL_COLUMN_CHANGES = Object.keys(DatagridColumnChanges)
15107
15737
  .map(key => DatagridColumnChanges[key])
15108
- .filter(key => key === parseInt(key, 10)); // extracts only integer keys
15738
+ .filter(key => key === parseInt(key, 10) && key !== DatagridColumnChanges.INITIALIZE); // extracts only integer keys
15109
15739
 
15110
15740
  /*
15111
15741
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
@@ -15116,6 +15746,7 @@ const ALL_COLUMN_CHANGES = Object.keys(DatagridColumnChanges)
15116
15746
  class ColumnsService {
15117
15747
  constructor() {
15118
15748
  this.columns = [];
15749
+ this.columnsStateChange = new BehaviorSubject(null);
15119
15750
  this._cache = [];
15120
15751
  }
15121
15752
  get columnStates() {
@@ -15137,7 +15768,9 @@ class ColumnsService {
15137
15768
  resetToLastCache() {
15138
15769
  this._cache.forEach((state, index) => {
15139
15770
  // Just emit the exact value from the cache
15140
- this.columns[index].next(Object.assign(Object.assign({}, state), { changes: ALL_COLUMN_CHANGES }));
15771
+ const cachedState = Object.assign(Object.assign({}, state), { changes: ALL_COLUMN_CHANGES });
15772
+ this.columns[index].next(cachedState);
15773
+ this.columnsStateChange.next(cachedState);
15141
15774
  });
15142
15775
  this._cache = [];
15143
15776
  }
@@ -15149,7 +15782,9 @@ class ColumnsService {
15149
15782
  this.emitStateChange(this.columns[columnIndex], diff);
15150
15783
  }
15151
15784
  emitStateChange(column, diff) {
15152
- column.next(Object.assign(Object.assign({}, column.value), diff));
15785
+ const changedState = Object.assign(Object.assign({}, column.value), diff);
15786
+ column.next(changedState);
15787
+ this.columnsStateChange.next(changedState);
15153
15788
  }
15154
15789
  }
15155
15790
  ColumnsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ColumnsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -15231,172 +15866,123 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15231
15866
  * This software is released under MIT license.
15232
15867
  * The full license information can be found in LICENSE in the root directory of this project.
15233
15868
  */
15234
- function getTabableItems(el) {
15235
- const tabableSelector = [
15236
- 'a[href]',
15237
- 'area[href]',
15238
- 'input:not([disabled])',
15239
- 'button:not([disabled])',
15240
- 'select:not([disabled])',
15241
- 'textarea:not([disabled])',
15242
- 'iframe',
15243
- 'object',
15244
- 'embed',
15245
- '*[tabindex]',
15246
- '*[contenteditable=true]',
15247
- '[role=button]:not([disabled])',
15248
- ].join(',');
15249
- return Array.from(el.querySelectorAll(tabableSelector));
15250
- }
15251
- class KeyNavigationGridController {
15252
- constructor(zone) {
15253
- this.zone = zone;
15254
- this.listenersAdded = false;
15255
- this.destroy$ = new Subject();
15256
- this.config = {
15257
- keyGridRows: '[role=row]:not(.datagrid-placeholder)',
15258
- keyGridCells: '[role=gridcell]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), [role=columnheader]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), .datagrid-detail-caret',
15259
- keyGrid: '[role=grid]',
15260
- };
15261
- }
15262
- get grid() {
15263
- var _a;
15264
- return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelector(this.config.keyGrid);
15265
- }
15266
- get rows() {
15267
- var _a;
15268
- return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.config.keyGridRows);
15269
- }
15270
- get cells() {
15271
- var _a;
15272
- return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.config.keyGridCells);
15869
+ // @TODO The top two are not used now, which is probably a performance drag that was broken along the way.
15870
+ // There was a previous pattern to hide everything to do computation then display, for Firefox, needs revisiting.
15871
+ const NO_LAYOUT_CLASS = 'datagrid-no-layout';
15872
+ const COMPUTE_WIDTH_CLASS = 'datagrid-computing-columns-width';
15873
+ const STRICT_WIDTH_CLASS = 'datagrid-fixed-width';
15874
+ const HIDDEN_COLUMN_CLASS = 'datagrid-hidden-column';
15875
+
15876
+ /*
15877
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
15878
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
15879
+ * This software is released under MIT license.
15880
+ * The full license information can be found in LICENSE in the root directory of this project.
15881
+ */
15882
+ class DatagridCellRenderer {
15883
+ constructor(el, renderer, organizer) {
15884
+ this.el = el;
15885
+ this.renderer = renderer;
15886
+ this.subscriptions = [];
15887
+ this.subscriptions.push(organizer.filterRenderSteps(DatagridRenderStep.CLEAR_WIDTHS).subscribe(() => this.clearWidth()));
15273
15888
  }
15274
15889
  ngOnDestroy() {
15275
- this.destroy$.next();
15276
- this.destroy$.complete();
15277
- }
15278
- addListeners() {
15279
- if (this.listenersAdded) {
15280
- return;
15890
+ this.subscriptions.forEach(sub => sub.unsubscribe());
15891
+ if (this.stateSubscription) {
15892
+ this.stateSubscription.unsubscribe();
15281
15893
  }
15282
- this.zone.runOutsideAngular(() => {
15283
- fromEvent(this.grid, 'mousedown')
15284
- .pipe(takeUntil(this.destroy$))
15285
- .subscribe((e) => {
15286
- // preserve right click for context menus & keyboard mouse control https://apple.stackexchange.com/questions/32715/how-do-i-open-the-context-menu-from-a-mac-keyboard
15287
- if (e.buttons === 1 && !e.ctrlKey) {
15288
- const activeCell = this.cells
15289
- ? Array.from(this.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
15290
- : null;
15291
- if (activeCell) {
15292
- this.setActiveCell(activeCell);
15293
- }
15294
- }
15295
- });
15296
- fromEvent(this.grid, 'keydown')
15297
- .pipe(takeUntil(this.destroy$))
15298
- .subscribe((e) => {
15299
- // Skip column resize events
15300
- if (e.target.classList.contains('drag-handle') &&
15301
- (e.code === 'ArrowLeft' || e.code === 'ArrowRight')) {
15302
- return;
15303
- }
15304
- if (e.code === 'ArrowUp' ||
15305
- e.code === 'ArrowDown' ||
15306
- e.code === 'ArrowLeft' ||
15307
- e.code === 'ArrowRight' ||
15308
- e.code === 'End' ||
15309
- e.code === 'Home' ||
15310
- e.code === 'PageUp' ||
15311
- e.code === 'PageDown') {
15312
- const { x, y } = this.getNextItemCoordinate(e);
15313
- const activeItem = this.rows
15314
- ? Array.from(this.rows[y].querySelectorAll(this.config.keyGridCells))[x]
15315
- : null;
15316
- if (activeItem) {
15317
- this.setActiveCell(activeItem);
15318
- }
15319
- e.preventDefault();
15320
- }
15321
- });
15322
- });
15323
- this.listenersAdded = true;
15324
- }
15325
- initializeKeyGrid(host) {
15326
- this.host = host;
15327
- this.addListeners();
15328
- this.resetKeyGrid();
15329
- }
15330
- resetKeyGrid() {
15331
- var _a;
15332
- (_a = this.cells) === null || _a === void 0 ? void 0 : _a.forEach((i) => i.setAttribute('tabindex', '-1'));
15333
- const firstCell = this.cells ? this.cells[0] : null;
15334
- firstCell === null || firstCell === void 0 ? void 0 : firstCell.setAttribute('tabindex', '0');
15335
15894
  }
15336
- setActiveCell(activeCell) {
15337
- const prior = this.cells ? Array.from(this.cells).find(c => c.getAttribute('tabindex') === '0') : null;
15338
- if (prior) {
15339
- prior.setAttribute('tabindex', '-1');
15340
- }
15341
- activeCell.setAttribute('tabindex', '0');
15342
- const items = getTabableItems(activeCell);
15343
- const item = activeCell.getAttribute('role') !== 'columnheader' && items[0] ? items[0] : activeCell;
15344
- item.focus();
15895
+ resetState(state) {
15896
+ this.setWidth(state);
15897
+ this.setHidden(state);
15345
15898
  }
15346
- getNextItemCoordinate(e) {
15347
- let currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
15348
- if (e.code === 'Tab') {
15349
- currentCell = document.activeElement;
15350
- }
15351
- const currentRow = this.rows && currentCell ? Array.from(this.rows).find(r => r.contains(currentCell)) : null;
15352
- const numOfRows = this.rows ? this.rows.length - 1 : 0;
15353
- const numOfColumns = this.cells ? this.cells.length / this.rows.length - 1 : 0;
15354
- let x = currentRow && currentCell
15355
- ? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell)
15356
- : 0;
15357
- let y = currentRow && currentCell && this.rows ? Array.from(this.rows).indexOf(currentRow) : 0;
15358
- const dir = this.host.dir;
15359
- const inlineStart = dir === 'rtl' ? 'ArrowRight' : 'ArrowLeft';
15360
- const inlineEnd = dir === 'rtl' ? 'ArrowLeft' : 'ArrowRight';
15361
- const itemsPerPage = this.rows.length || 0;
15362
- if (e.code === 'ArrowUp' && y !== 0) {
15363
- y = y - 1;
15364
- }
15365
- else if (e.code === 'ArrowDown' && y < numOfRows) {
15366
- y = y + 1;
15367
- }
15368
- else if (e.code === inlineStart && x !== 0) {
15369
- x = x - 1;
15370
- }
15371
- else if (e.code === inlineEnd && x < numOfColumns) {
15372
- x = x + 1;
15899
+ setWidth(state) {
15900
+ if (state.strictWidth) {
15901
+ this.renderer.addClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
15373
15902
  }
15374
- else if (e.code === 'End') {
15375
- x = numOfColumns;
15376
- if (e.ctrlKey) {
15377
- y = numOfRows;
15378
- }
15903
+ else {
15904
+ this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
15379
15905
  }
15380
- else if (e.code === 'Home') {
15381
- x = 0;
15382
- if (e.ctrlKey) {
15383
- y = 0;
15384
- }
15906
+ this.renderer.setStyle(this.el.nativeElement, 'width', state.width + 'px');
15907
+ }
15908
+ setHidden(state) {
15909
+ if (state.hidden) {
15910
+ this.renderer.addClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
15385
15911
  }
15386
- else if (e.code === 'PageUp') {
15387
- y = y - itemsPerPage > 0 ? y - itemsPerPage : 0;
15912
+ else {
15913
+ this.renderer.removeClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
15388
15914
  }
15389
- else if (e.code === 'PageDown') {
15390
- y = y + itemsPerPage < numOfRows ? y + itemsPerPage : numOfRows;
15915
+ }
15916
+ clearWidth() {
15917
+ this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
15918
+ this.renderer.setStyle(this.el.nativeElement, 'width', null);
15919
+ }
15920
+ }
15921
+ 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 });
15922
+ DatagridCellRenderer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: DatagridCellRenderer, selector: "clr-dg-cell", ngImport: i0 });
15923
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridCellRenderer, decorators: [{
15924
+ type: Directive,
15925
+ args: [{
15926
+ selector: 'clr-dg-cell',
15927
+ }]
15928
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: DatagridRenderOrganizer }]; } });
15929
+
15930
+ /*
15931
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
15932
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
15933
+ * This software is released under MIT license.
15934
+ * The full license information can be found in LICENSE in the root directory of this project.
15935
+ */
15936
+ class DatagridRowRenderer {
15937
+ constructor(columnsService) {
15938
+ this.columnsService = columnsService;
15939
+ this.subscriptions = [];
15940
+ }
15941
+ ngAfterContentInit() {
15942
+ this.setCellsState(); // case #3 and #4
15943
+ this.subscriptions.push(this.cells.changes.subscribe(() => {
15944
+ this.setCellsState(); // case #2
15945
+ // Note on case #2: In the case of dynamic columns, when one column (header/cell together) gets deleted,
15946
+ // this.cells.changes emits before this.columnsService.columns gets updated in MainRenderer
15947
+ // when this.headers.changes emits as well. So that means there will be n+1 column state providers
15948
+ // when this.cells.changes emits. Hence, we should quit earlier there. But this method will be called
15949
+ // right after again when this.headers.changes emits. By then, there will be the same number of column state
15950
+ // providers as column headers.
15951
+ }));
15952
+ }
15953
+ ngOnDestroy() {
15954
+ this.subscriptions.forEach(sub => sub.unsubscribe());
15955
+ }
15956
+ setCellsState() {
15957
+ // This method runs in four cases:
15958
+ // 1. When the initial rows appear on the first page.
15959
+ // In this case, the method will be called in DatagridMainRenderer.
15960
+ // 2. When columns (corresponding header/cells) get added and deleted.
15961
+ // In this case, the method will be called in DatagridMainRenderer. (Read the note on this case above).
15962
+ // 3. When rows load asynchronously.
15963
+ // In this case, the method will be called in this class.
15964
+ // 4. When rows load after switching pages.
15965
+ // In this case, the method will be called in this class (Basically, same as the case 3).
15966
+ if (this.cells.length === this.columnsService.columns.length) {
15967
+ this.cells.forEach((cell, index) => {
15968
+ if (this.columnsService.columns[index]) {
15969
+ cell.resetState(this.columnsService.columns[index].value);
15970
+ }
15971
+ });
15391
15972
  }
15392
- return { x, y };
15393
15973
  }
15394
15974
  }
15395
- KeyNavigationGridController.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
15396
- KeyNavigationGridController.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController });
15397
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, decorators: [{
15398
- type: Injectable
15399
- }], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
15975
+ DatagridRowRenderer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridRowRenderer, deps: [{ token: ColumnsService }], target: i0.ɵɵFactoryTarget.Directive });
15976
+ 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 });
15977
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridRowRenderer, decorators: [{
15978
+ type: Directive,
15979
+ args: [{
15980
+ selector: 'clr-dg-row, clr-dg-row-detail',
15981
+ }]
15982
+ }], ctorParameters: function () { return [{ type: ColumnsService }]; }, propDecorators: { cells: [{
15983
+ type: ContentChildren,
15984
+ args: [DatagridCellRenderer]
15985
+ }] } });
15400
15986
 
15401
15987
  /*
15402
15988
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
@@ -15537,7 +16123,23 @@ class ClrDatagrid {
15537
16123
  /**
15538
16124
  * Reopen updated row or close it
15539
16125
  */
15540
- row ? this.detailService.open(row.item, row.detailButton.nativeElement) : this.detailService.close();
16126
+ if (row) {
16127
+ this.detailService.open(row.item, row.detailButton.nativeElement);
16128
+ // always keep open when virtual scroll is available otherwise close it
16129
+ }
16130
+ else if (!this.hasVirtualScroller) {
16131
+ // Using setTimeout to make sure the inner cycles in rows are done
16132
+ setTimeout(() => {
16133
+ this.detailService.close();
16134
+ });
16135
+ }
16136
+ }
16137
+ // retain active cell when navigating with Up/Down Arrows, PageUp and PageDown buttons in virtual scroller
16138
+ const active = this.keyNavigation.getActiveCell();
16139
+ if (active) {
16140
+ this.zone.runOutsideAngular(() => {
16141
+ setTimeout(() => this.keyNavigation.setActiveCell(active));
16142
+ });
15541
16143
  }
15542
16144
  }));
15543
16145
  }
@@ -15563,8 +16165,6 @@ class ClrDatagrid {
15563
16165
  this.datagridTable.nativeElement.focus();
15564
16166
  }
15565
16167
  }),
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
16168
  // A subscription that listens for displayMode changes on the datagrid
15569
16169
  this.displayMode.view.subscribe(viewChange => {
15570
16170
  // Remove any projected columns from the projectedDisplayColumns container
@@ -15621,6 +16221,13 @@ class ClrDatagrid {
15621
16221
  ngOnDestroy() {
15622
16222
  this._subscriptions.forEach((sub) => sub.unsubscribe());
15623
16223
  }
16224
+ toggleAllSelected($event) {
16225
+ $event.preventDefault();
16226
+ if (this.hasVirtualScroller) {
16227
+ return;
16228
+ }
16229
+ this.allSelected = !this.allSelected;
16230
+ }
15624
16231
  resize() {
15625
16232
  this.organizer.resize();
15626
16233
  }
@@ -15632,7 +16239,7 @@ class ClrDatagrid {
15632
16239
  }
15633
16240
  }
15634
16241
  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: [
16242
+ 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
16243
  Selection,
15637
16244
  Sort,
15638
16245
  FiltersProvider,
@@ -15648,7 +16255,7 @@ ClrDatagrid.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
15648
16255
  ColumnsService,
15649
16256
  DisplayModeService,
15650
16257
  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" }] });
16258
+ ], queries: [{ propertyName: "iterator", first: true, predicate: ClrDatagridItems, descendants: true }, { propertyName: "placeholder", first: true, predicate: ClrDatagridPlaceholder, descendants: true }, { propertyName: "columns", predicate: ClrDatagridColumn }, { propertyName: "rows", predicate: ClrDatagridRow }], viewQueries: [{ propertyName: "datagrid", first: true, predicate: ["datagrid"], descendants: true, read: ElementRef }, { propertyName: "datagridTable", first: true, predicate: ["datagridTable"], descendants: true, read: ElementRef }, { propertyName: "scrollableColumns", first: true, predicate: ["scrollableColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_projectedDisplayColumns", first: true, predicate: ["projectedDisplayColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_projectedCalculationColumns", first: true, predicate: ["projectedCalculationColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_displayedRows", first: true, predicate: ["displayedRows"], descendants: true, read: ViewContainerRef }, { propertyName: "_calculationRows", first: true, predicate: ["calculationRows"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<ng-content select=\"clr-dg-action-bar\"></ng-content>\n<div class=\"datagrid-outer-wrapper\">\n <div class=\"datagrid-inner-wrapper\">\n <div class=\"datagrid\" #datagrid [attr.aria-hidden]=\"detailService.isOpen ? true : null\">\n <div class=\"datagrid-table-wrapper\">\n <div role=\"grid\" class=\"datagrid-table\" tabindex=\"-1\" #datagridTable>\n <div role=\"rowgroup\" class=\"datagrid-header\">\n <div role=\"row\" class=\"datagrid-row\">\n <div class=\"datagrid-row-master datagrid-row-flex\">\n <div class=\"datagrid-row-sticky\">\n <!--header for datagrid where you can select multiple rows -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n (keydown.space)=\"toggleAllSelected($event)\"\n >\n <div *ngIf=\"!hasVirtualScroller\" class=\"clr-checkbox-wrapper\">\n <!-- We need to move focus and space-key handling to the parent because of keyboard arrow key navigation,\n which is not able to transfer focus directly on the input when focused with the tab key -->\n <input\n type=\"checkbox\"\n [id]=\"selectAllId\"\n [(ngModel)]=\"allSelected\"\n [attr.aria-label]=\"commonStrings.keys.selectAll\"\n tabindex=\"-1\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"selectAllId\" class=\"clr-control-label clr-col-null\">\n <span class=\"clr-sr-only\">{{commonStrings.keys.selectAll}}</span>\n </label>\n </div>\n\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for datagrid where you can select one row only -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleSelectionAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for single row action; only displayType if we have at least one actionable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-row-actions datagrid-fixed-column\"\n *ngIf=\"rowActionService.hasActionableRow\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleActionableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for carets; only displayType if we have at least one expandable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-expandable-caret datagrid-fixed-column\"\n *ngIf=\"expandableRows.hasExpandableRow || detailService.enabled\"\n >\n <div class=\"clr-sr-only\">{{clrDetailExpandableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n </div>\n <div class=\"datagrid-row-scrollable\">\n <ng-container #projectedDisplayColumns></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div role=\"presentation\" class=\"datagrid-rows\">\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <ng-container #displayedRows></ng-container>\n\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <!-- Custom placeholder overrides the default empty one -->\n <ng-content select=\"clr-dg-placeholder\"></ng-content>\n <clr-dg-placeholder *ngIf=\"!placeholder\"></clr-dg-placeholder>\n </div>\n </div>\n </div>\n </div>\n <ng-content select=\"clr-dg-footer\"></ng-content>\n <div class=\"datagrid-spinner\" *ngIf=\"loading\">\n <clr-spinner clrMedium>Loading</clr-spinner>\n </div>\n </div>\n <ng-content select=\"[clrIfDetail],clr-dg-detail\"></ng-content>\n</div>\n\n<div class=\"datagrid-calculation-table\">\n <div class=\"datagrid-calculation-header\">\n <ng-container #projectedCalculationColumns></ng-container>\n </div>\n <ng-container #calculationRows></ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: ClrLabel, selector: "label", inputs: ["for"] }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }, { kind: "component", type: ClrDatagridCell, selector: "clr-dg-cell" }, { kind: "component", type: ClrDatagridPlaceholder, selector: "clr-dg-placeholder" }, { kind: "component", type: ClrDatagridRow, selector: "clr-dg-row", inputs: ["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
16259
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagrid, decorators: [{
15653
16260
  type: Component,
15654
16261
  args: [{ selector: 'clr-datagrid', providers: [
@@ -15670,13 +16277,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15670
16277
  ], host: {
15671
16278
  '[class.datagrid-host]': 'true',
15672
16279
  '[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" }]
16280
+ }, template: "<!--\n ~ Copyright (c) 2016-2024 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<ng-content select=\"clr-dg-action-bar\"></ng-content>\n<div class=\"datagrid-outer-wrapper\">\n <div class=\"datagrid-inner-wrapper\">\n <div class=\"datagrid\" #datagrid [attr.aria-hidden]=\"detailService.isOpen ? true : null\">\n <div class=\"datagrid-table-wrapper\">\n <div role=\"grid\" class=\"datagrid-table\" tabindex=\"-1\" #datagridTable>\n <div role=\"rowgroup\" class=\"datagrid-header\">\n <div role=\"row\" class=\"datagrid-row\">\n <div class=\"datagrid-row-master datagrid-row-flex\">\n <div class=\"datagrid-row-sticky\">\n <!--header for datagrid where you can select multiple rows -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n (keydown.space)=\"toggleAllSelected($event)\"\n >\n <div *ngIf=\"!hasVirtualScroller\" class=\"clr-checkbox-wrapper\">\n <!-- We need to move focus and space-key handling to the parent because of keyboard arrow key navigation,\n which is not able to transfer focus directly on the input when focused with the tab key -->\n <input\n type=\"checkbox\"\n [id]=\"selectAllId\"\n [(ngModel)]=\"allSelected\"\n [attr.aria-label]=\"commonStrings.keys.selectAll\"\n tabindex=\"-1\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"selectAllId\" class=\"clr-control-label clr-col-null\">\n <span class=\"clr-sr-only\">{{commonStrings.keys.selectAll}}</span>\n </label>\n </div>\n\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for datagrid where you can select one row only -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleSelectionAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for single row action; only displayType if we have at least one actionable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-row-actions datagrid-fixed-column\"\n *ngIf=\"rowActionService.hasActionableRow\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleActionableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for carets; only displayType if we have at least one expandable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-expandable-caret datagrid-fixed-column\"\n *ngIf=\"expandableRows.hasExpandableRow || detailService.enabled\"\n >\n <div class=\"clr-sr-only\">{{clrDetailExpandableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n </div>\n <div class=\"datagrid-row-scrollable\">\n <ng-container #projectedDisplayColumns></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div role=\"presentation\" class=\"datagrid-rows\">\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <ng-container #displayedRows></ng-container>\n\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <!-- Custom placeholder overrides the default empty one -->\n <ng-content select=\"clr-dg-placeholder\"></ng-content>\n <clr-dg-placeholder *ngIf=\"!placeholder\"></clr-dg-placeholder>\n </div>\n </div>\n </div>\n </div>\n <ng-content select=\"clr-dg-footer\"></ng-content>\n <div class=\"datagrid-spinner\" *ngIf=\"loading\">\n <clr-spinner clrMedium>Loading</clr-spinner>\n </div>\n </div>\n <ng-content select=\"[clrIfDetail],clr-dg-detail\"></ng-content>\n</div>\n\n<div class=\"datagrid-calculation-table\">\n <div class=\"datagrid-calculation-header\">\n <ng-container #projectedCalculationColumns></ng-container>\n </div>\n <ng-container #calculationRows></ng-container>\n</div>\n" }]
15674
16281
  }], ctorParameters: function () {
15675
16282
  return [{ type: DatagridRenderOrganizer }, { type: Items }, { type: ExpandableRowsCount }, { type: Selection }, { type: RowActionService }, { type: StateProvider }, { type: DisplayModeService }, { type: i0.Renderer2 }, { type: DetailService }, { type: undefined, decorators: [{
15676
16283
  type: Inject,
15677
16284
  args: [DOCUMENT]
15678
16285
  }] }, { type: i0.ElementRef }, { type: Page }, { type: ClrCommonStringsService }, { type: ColumnsService }, { type: KeyNavigationGridController }, { type: i0.NgZone }];
15679
- }, propDecorators: { clrDgSingleSelectionAriaLabel: [{
16286
+ }, propDecorators: { loadingMoreItems: [{
16287
+ type: Input,
16288
+ args: ['clrLoadingMoreItems']
16289
+ }], clrDgSingleSelectionAriaLabel: [{
15680
16290
  type: Input
15681
16291
  }], clrDgSingleActionableAriaLabel: [{
15682
16292
  type: Input
@@ -15705,6 +16315,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15705
16315
  }], rows: [{
15706
16316
  type: ContentChildren,
15707
16317
  args: [ClrDatagridRow]
16318
+ }], datagrid: [{
16319
+ type: ViewChild,
16320
+ args: ['datagrid', { read: ElementRef }]
15708
16321
  }], datagridTable: [{
15709
16322
  type: ViewChild,
15710
16323
  args: ['datagridTable', { read: ElementRef }]
@@ -15835,6 +16448,7 @@ class ClrDatagridActionOverflow {
15835
16448
  ClrDatagridActionOverflow.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridActionOverflow, deps: [{ token: RowActionService }, { token: ClrCommonStringsService }, { token: PLATFORM_ID }, { token: i0.NgZone }, { token: ClrPopoverToggleService }], target: i0.ɵɵFactoryTarget.Component });
15836
16449
  ClrDatagridActionOverflow.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridActionOverflow, selector: "clr-dg-action-overflow", inputs: { buttonLabel: ["clrDgActionOverflowButtonLabel", "buttonLabel"], open: ["clrDgActionOverflowOpen", "open"] }, outputs: { openChange: "clrDgActionOverflowOpenChange" }, viewQueries: [{ propertyName: "keyFocus", first: true, predicate: ClrKeyFocus, descendants: true }], hostDirectives: [{ directive: ClrPopoverHostDirective }], ngImport: i0, template: `
15837
16450
  <button
16451
+ tabindex="-1"
15838
16452
  class="datagrid-action-toggle"
15839
16453
  type="button"
15840
16454
  role="button"
@@ -15869,6 +16483,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15869
16483
  hostDirectives: [ClrPopoverHostDirective],
15870
16484
  template: `
15871
16485
  <button
16486
+ tabindex="-1"
15872
16487
  class="datagrid-action-toggle"
15873
16488
  type="button"
15874
16489
  role="button"
@@ -16176,10 +16791,13 @@ class ClrDatagridDetailHeader {
16176
16791
  get titleId() {
16177
16792
  return `${this.detailService.id}-title`;
16178
16793
  }
16794
+ ngAfterViewInit() {
16795
+ this.title.nativeElement.focus();
16796
+ }
16179
16797
  }
16180
16798
  ClrDatagridDetailHeader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridDetailHeader, deps: [{ token: DetailService }, { token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Component });
16181
- ClrDatagridDetailHeader.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridDetailHeader, selector: "clr-dg-detail-header", host: { properties: { "class.datagrid-detail-header": "true" } }, ngImport: i0, template: `
16182
- <div class="datagrid-detail-header-title" cdkFocusInitial tabindex="-1" [id]="titleId">
16799
+ ClrDatagridDetailHeader.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridDetailHeader, selector: "clr-dg-detail-header", host: { properties: { "class.datagrid-detail-header": "true" } }, viewQueries: [{ propertyName: "title", first: true, predicate: ["title"], descendants: true }], ngImport: i0, template: `
16800
+ <div #title class="datagrid-detail-header-title" tabindex="-1" [id]="titleId">
16183
16801
  <ng-content></ng-content>
16184
16802
  </div>
16185
16803
  <div class="datagrid-detail-pane-close">
@@ -16201,7 +16819,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
16201
16819
  '[class.datagrid-detail-header]': 'true',
16202
16820
  },
16203
16821
  template: `
16204
- <div class="datagrid-detail-header-title" cdkFocusInitial tabindex="-1" [id]="titleId">
16822
+ <div #title class="datagrid-detail-header-title" tabindex="-1" [id]="titleId">
16205
16823
  <ng-content></ng-content>
16206
16824
  </div>
16207
16825
  <div class="datagrid-detail-pane-close">
@@ -16216,7 +16834,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
16216
16834
  </div>
16217
16835
  `,
16218
16836
  }]
16219
- }], ctorParameters: function () { return [{ type: DetailService }, { type: ClrCommonStringsService }]; } });
16837
+ }], ctorParameters: function () { return [{ type: DetailService }, { type: ClrCommonStringsService }]; }, propDecorators: { title: [{
16838
+ type: ViewChild,
16839
+ args: ['title']
16840
+ }] } });
16220
16841
 
16221
16842
  /*
16222
16843
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
@@ -16229,21 +16850,43 @@ class ClrDatagridDetail {
16229
16850
  this.detailService = detailService;
16230
16851
  this.commonStrings = commonStrings;
16231
16852
  }
16853
+ get labelledBy() {
16854
+ var _a;
16855
+ if (this.ariaLabelledBy) {
16856
+ return this.header ? `${this.header.titleId} ${this.ariaLabelledBy}` : this.ariaLabelledBy;
16857
+ }
16858
+ else if (this.ariaLabel) {
16859
+ // If aria-label is set by the end user, do not set aria-labelledby
16860
+ return null;
16861
+ }
16862
+ else {
16863
+ return ((_a = this.header) === null || _a === void 0 ? void 0 : _a.titleId) || '';
16864
+ }
16865
+ }
16866
+ get label() {
16867
+ if (!this.ariaLabelledBy) {
16868
+ return this.ariaLabel || null;
16869
+ }
16870
+ else {
16871
+ return null;
16872
+ }
16873
+ }
16232
16874
  close() {
16233
16875
  this.detailService.close();
16234
16876
  }
16235
16877
  }
16236
16878
  ClrDatagridDetail.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridDetail, deps: [{ token: DetailService }, { token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Component });
16237
- ClrDatagridDetail.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridDetail, selector: "clr-dg-detail", host: { properties: { "class.datagrid-detail-pane": "true" } }, queries: [{ propertyName: "header", first: true, predicate: ClrDatagridDetailHeader, descendants: true }], ngImport: i0, template: `
16879
+ ClrDatagridDetail.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridDetail, selector: "clr-dg-detail", inputs: { ariaLabelledBy: ["clrDetailAriaLabelledBy", "ariaLabelledBy"], ariaLabel: ["clrDetailAriaLabel", "ariaLabel"] }, host: { properties: { "class.datagrid-detail-pane": "true" } }, queries: [{ propertyName: "header", first: true, predicate: ClrDatagridDetailHeader, descendants: true }], ngImport: i0, template: `
16238
16880
  <div
16239
16881
  cdkTrapFocus
16240
- [cdkTrapFocusAutoCapture]="true"
16882
+ [cdkTrapFocusAutoCapture]="!header"
16241
16883
  class="datagrid-detail-pane-content"
16242
16884
  *ngIf="detailService.isOpen"
16243
16885
  role="dialog"
16244
16886
  [id]="detailService.id"
16245
16887
  aria-modal="true"
16246
- [attr.aria-describedby]="header ? header.titleId : ''"
16888
+ [attr.aria-labelledby]="labelledBy"
16889
+ [attr.aria-label]="label"
16247
16890
  >
16248
16891
  <div class="clr-sr-only">{{ commonStrings.keys.detailPaneStart }}</div>
16249
16892
  <ng-content></ng-content>
@@ -16262,13 +16905,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
16262
16905
  template: `
16263
16906
  <div
16264
16907
  cdkTrapFocus
16265
- [cdkTrapFocusAutoCapture]="true"
16908
+ [cdkTrapFocusAutoCapture]="!header"
16266
16909
  class="datagrid-detail-pane-content"
16267
16910
  *ngIf="detailService.isOpen"
16268
16911
  role="dialog"
16269
16912
  [id]="detailService.id"
16270
16913
  aria-modal="true"
16271
- [attr.aria-describedby]="header ? header.titleId : ''"
16914
+ [attr.aria-labelledby]="labelledBy"
16915
+ [attr.aria-label]="label"
16272
16916
  >
16273
16917
  <div class="clr-sr-only">{{ commonStrings.keys.detailPaneStart }}</div>
16274
16918
  <ng-content></ng-content>
@@ -16276,7 +16920,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
16276
16920
  </div>
16277
16921
  `,
16278
16922
  }]
16279
- }], ctorParameters: function () { return [{ type: DetailService }, { type: ClrCommonStringsService }]; }, propDecorators: { header: [{
16923
+ }], ctorParameters: function () { return [{ type: DetailService }, { type: ClrCommonStringsService }]; }, propDecorators: { ariaLabelledBy: [{
16924
+ type: Input,
16925
+ args: ['clrDetailAriaLabelledBy']
16926
+ }], ariaLabel: [{
16927
+ type: Input,
16928
+ args: ['clrDetailAriaLabel']
16929
+ }], header: [{
16280
16930
  type: ContentChild,
16281
16931
  args: [ClrDatagridDetailHeader]
16282
16932
  }] } });
@@ -16554,6 +17204,9 @@ class ClrIfDetail {
16554
17204
  }
16555
17205
  this.skip = false;
16556
17206
  }
17207
+ get viewContext() {
17208
+ return { $implicit: this.detailService.state };
17209
+ }
16557
17210
  ngOnInit() {
16558
17211
  this.subscriptions.push(this.detailService.stateChange.subscribe(state => {
16559
17212
  if (state === true) {
@@ -16570,12 +17223,11 @@ class ClrIfDetail {
16570
17223
  togglePanel(showPanel) {
16571
17224
  let stateChangeParams = null;
16572
17225
  if (showPanel === true) {
16573
- const embeddedViewContext = { $implicit: this.detailService.state };
16574
- if (this.embeddedViewRef) {
16575
- this.embeddedViewRef.context = embeddedViewContext;
16576
- }
16577
- else {
16578
- this.embeddedViewRef = this.viewContainer.createEmbeddedView(this.templateRef, embeddedViewContext);
17226
+ if (!this.embeddedViewRef) {
17227
+ // Create a context forward `Proxy` that will always bind to the user-specified context,
17228
+ // without having to re-assign it whenever changes.
17229
+ const viewContext = this._createContextForwardProxy();
17230
+ this.embeddedViewRef = this.viewContainer.createEmbeddedView(this.templateRef, viewContext);
16579
17231
  }
16580
17232
  this.skip = true;
16581
17233
  stateChangeParams = this.detailService.state;
@@ -16586,6 +17238,27 @@ class ClrIfDetail {
16586
17238
  }
16587
17239
  this.stateChange.emit(stateChangeParams);
16588
17240
  }
17241
+ /**
17242
+ * For a given outlet instance, we create a proxy object that delegates
17243
+ * to the user-specified context. This allows changing, or swapping out
17244
+ * the context object completely without having to destroy/re-create the view.
17245
+ */
17246
+ _createContextForwardProxy() {
17247
+ return new Proxy({}, {
17248
+ set: (_target, prop, newValue) => {
17249
+ if (!this.viewContext) {
17250
+ return false;
17251
+ }
17252
+ return Reflect.set(this.viewContext, prop, newValue);
17253
+ },
17254
+ get: (_target, prop, receiver) => {
17255
+ if (!this.viewContext) {
17256
+ return undefined;
17257
+ }
17258
+ return Reflect.get(this.viewContext, prop, receiver);
17259
+ },
17260
+ });
17261
+ }
16589
17262
  }
16590
17263
  ClrIfDetail.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrIfDetail, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: DetailService }], target: i0.ɵɵFactoryTarget.Directive });
16591
17264
  ClrIfDetail.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrIfDetail, selector: "[clrIfDetail]", inputs: { state: ["clrIfDetail", "state"] }, outputs: { stateChange: "clrIfDetailChange" }, ngImport: i0 });
@@ -17112,96 +17785,234 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17112
17785
  args: ['clrDgReplace']
17113
17786
  }] } });
17114
17787
 
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;
17788
+ const defaultCdkFixedSizeVirtualScrollInputs = {
17789
+ itemSize: 32,
17790
+ minBufferPx: 200,
17791
+ maxBufferPx: 400,
17792
+ };
17793
+ class ClrDatagridVirtualScrollDirective {
17794
+ constructor(changeDetectorRef, iterableDiffers, items, ngZone, templateRef, viewContainerRef, directionality, scrollDispatcher, viewportRuler, datagrid, columnsService, injector) {
17795
+ this.changeDetectorRef = changeDetectorRef;
17796
+ this.iterableDiffers = iterableDiffers;
17797
+ this.items = items;
17798
+ this.ngZone = ngZone;
17799
+ this.templateRef = templateRef;
17800
+ this.viewContainerRef = viewContainerRef;
17801
+ this.directionality = directionality;
17802
+ this.scrollDispatcher = scrollDispatcher;
17803
+ this.viewportRuler = viewportRuler;
17804
+ this.datagrid = datagrid;
17805
+ this.columnsService = columnsService;
17806
+ this.injector = injector;
17807
+ this.renderedRangeChange = new EventEmitter();
17808
+ this._cdkFixedSizeVirtualScrollInputs = Object.assign({}, defaultCdkFixedSizeVirtualScrollInputs);
17138
17809
  this.subscriptions = [];
17139
- this.subscriptions.push(organizer.filterRenderSteps(DatagridRenderStep.CLEAR_WIDTHS).subscribe(() => this.clearWidth()));
17810
+ this.mutationChanges = new MutationObserver((mutations) => {
17811
+ mutations.forEach((mutation) => {
17812
+ // it is possible this to be called twice because the old class is removed and the new added
17813
+ if (mutation.target.classList.contains('datagrid-compact') && this.itemSize > 24) {
17814
+ this.itemSize = 24;
17815
+ }
17816
+ });
17817
+ });
17818
+ this.viewRepeater = new _RecycleViewRepeaterStrategy();
17819
+ this.cdkVirtualForInputs = {
17820
+ cdkVirtualForTrackBy: index => index,
17821
+ };
17822
+ this.items.smartenUp();
17823
+ this.datagrid.hasVirtualScroller = true;
17824
+ this.datagrid.detailService.preventFocusScroll = true;
17825
+ this.datagridElementRef = this.datagrid.el;
17826
+ // default
17827
+ this.cdkVirtualForTemplateCacheSize = 20;
17828
+ this.mutationChanges.observe(this.datagridElementRef.nativeElement, {
17829
+ attributeFilter: ['class'],
17830
+ attributeOldValue: true,
17831
+ });
17832
+ this.virtualScrollStrategy = new FixedSizeVirtualScrollStrategy(this._cdkFixedSizeVirtualScrollInputs.itemSize, this._cdkFixedSizeVirtualScrollInputs.minBufferPx, this._cdkFixedSizeVirtualScrollInputs.maxBufferPx);
17140
17833
  }
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));
17834
+ get cdkVirtualForOf() {
17835
+ return this.cdkVirtualForInputs.cdkVirtualForOf;
17148
17836
  }
17149
- ngOnDestroy() {
17150
- this.subscriptions.forEach(sub => sub.unsubscribe());
17151
- if (this.stateSubscription) {
17152
- this.stateSubscription.unsubscribe();
17153
- }
17837
+ set cdkVirtualForOf(value) {
17838
+ this.cdkVirtualForInputs.cdkVirtualForOf = value;
17839
+ this.items.all = value;
17840
+ this.updateCdkVirtualForInputs();
17154
17841
  }
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;
17171
- }
17172
- });
17173
- }
17842
+ get cdkVirtualForTrackBy() {
17843
+ return this.cdkVirtualForInputs.cdkVirtualForTrackBy;
17174
17844
  }
17175
- clearWidth() {
17176
- this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
17177
- this.renderer.setStyle(this.el.nativeElement, 'width', null);
17845
+ set cdkVirtualForTrackBy(value) {
17846
+ this.cdkVirtualForInputs.cdkVirtualForTrackBy = value;
17847
+ this.updateCdkVirtualForInputs();
17178
17848
  }
17179
- setWidth(state) {
17180
- if (state.strictWidth) {
17181
- this.renderer.addClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
17182
- }
17183
- else {
17184
- this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
17185
- }
17186
- this.renderer.setStyle(this.el.nativeElement, 'width', state.width + 'px');
17849
+ get cdkVirtualForTemplate() {
17850
+ var _a;
17851
+ return (_a = this === null || this === void 0 ? void 0 : this.cdkVirtualForInputs) === null || _a === void 0 ? void 0 : _a.cdkVirtualForTemplate;
17187
17852
  }
17188
- setHidden(state) {
17189
- if (state.hidden) {
17190
- this.renderer.addClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
17853
+ set cdkVirtualForTemplate(value) {
17854
+ this.cdkVirtualForInputs.cdkVirtualForTemplate = value;
17855
+ this.updateCdkVirtualForInputs();
17856
+ }
17857
+ get cdkVirtualForTemplateCacheSize() {
17858
+ return this.cdkVirtualForInputs.cdkVirtualForTemplateCacheSize;
17859
+ }
17860
+ set cdkVirtualForTemplateCacheSize(value) {
17861
+ this.cdkVirtualForInputs.cdkVirtualForTemplateCacheSize = coerceNumberProperty(value);
17862
+ this.updateCdkVirtualForInputs();
17863
+ }
17864
+ get itemSize() {
17865
+ return this._cdkFixedSizeVirtualScrollInputs.itemSize;
17866
+ }
17867
+ set itemSize(value) {
17868
+ this._cdkFixedSizeVirtualScrollInputs.itemSize = coerceNumberProperty(value);
17869
+ this.updateFixedSizeVirtualScrollInputs();
17870
+ }
17871
+ get minBufferPx() {
17872
+ return this._cdkFixedSizeVirtualScrollInputs.minBufferPx;
17873
+ }
17874
+ set minBufferPx(value) {
17875
+ this._cdkFixedSizeVirtualScrollInputs.minBufferPx = coerceNumberProperty(value);
17876
+ this.updateFixedSizeVirtualScrollInputs();
17877
+ }
17878
+ get maxBufferPx() {
17879
+ return this._cdkFixedSizeVirtualScrollInputs.maxBufferPx;
17880
+ }
17881
+ set maxBufferPx(value) {
17882
+ this._cdkFixedSizeVirtualScrollInputs.maxBufferPx = coerceNumberProperty(value);
17883
+ this.updateFixedSizeVirtualScrollInputs();
17884
+ }
17885
+ ngAfterViewInit() {
17886
+ this.injector.runInContext(() => {
17887
+ this.virtualScrollViewport = this.createVirtualScrollViewportForDatagrid(this.changeDetectorRef, this.ngZone, this.directionality, this.scrollDispatcher, this.viewportRuler, this.datagridElementRef, this.virtualScrollStrategy);
17888
+ this.cdkVirtualFor = new CdkVirtualForOf(this.viewContainerRef, this.templateRef, this.iterableDiffers, this.viewRepeater, this.virtualScrollViewport, this.ngZone);
17889
+ this.virtualScrollViewport.ngOnInit();
17890
+ });
17891
+ this.gridRoleElement = this.datagridElementRef.nativeElement.querySelector('[role="grid"]');
17892
+ this.updateCdkVirtualForInputs();
17893
+ this.subscriptions.push(this.items.change.subscribe(newItems => {
17894
+ this.cdkVirtualFor.cdkVirtualForOf = newItems;
17895
+ }), this.cdkVirtualFor.dataStream.subscribe(data => {
17896
+ this.updateAriaRowCount(data.length);
17897
+ }), this.virtualScrollViewport.renderedRangeStream.subscribe(renderedRange => {
17898
+ this.renderedRangeChange.emit(renderedRange);
17899
+ }), this.datagrid.refresh.subscribe(datagridState => {
17900
+ if (datagridState.filters) {
17901
+ this.virtualScrollViewport.scrollToIndex(0);
17902
+ }
17903
+ }), this.columnsService.columnsStateChange.subscribe(() => {
17904
+ this.viewRepeater.detach();
17905
+ }));
17906
+ }
17907
+ ngDoCheck() {
17908
+ var _a;
17909
+ (_a = this.cdkVirtualFor) === null || _a === void 0 ? void 0 : _a.ngDoCheck();
17910
+ this.updateAriaRowIndexes();
17911
+ }
17912
+ ngOnDestroy() {
17913
+ var _a, _b, _c;
17914
+ (_a = this.cdkVirtualFor) === null || _a === void 0 ? void 0 : _a.ngOnDestroy();
17915
+ (_b = this.virtualScrollViewport) === null || _b === void 0 ? void 0 : _b.ngOnDestroy();
17916
+ (_c = this.mutationChanges) === null || _c === void 0 ? void 0 : _c.disconnect();
17917
+ this.subscriptions.forEach(subscription => {
17918
+ subscription.unsubscribe();
17919
+ });
17920
+ }
17921
+ updateCdkVirtualForInputs() {
17922
+ if (this.cdkVirtualFor) {
17923
+ for (const cdkVirtualForInputKey of Object.keys(this.cdkVirtualForInputs)) {
17924
+ if (this.cdkVirtualFor[cdkVirtualForInputKey] !== this.cdkVirtualForInputs[cdkVirtualForInputKey]) {
17925
+ this.cdkVirtualFor[cdkVirtualForInputKey] = this.cdkVirtualForInputs[cdkVirtualForInputKey];
17926
+ }
17927
+ }
17191
17928
  }
17192
- else {
17193
- this.renderer.removeClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
17929
+ }
17930
+ updateFixedSizeVirtualScrollInputs() {
17931
+ if (this.virtualScrollStrategy) {
17932
+ this.virtualScrollStrategy.updateItemAndBufferSize(this._cdkFixedSizeVirtualScrollInputs.itemSize, this._cdkFixedSizeVirtualScrollInputs.minBufferPx, this._cdkFixedSizeVirtualScrollInputs.maxBufferPx);
17194
17933
  }
17195
17934
  }
17935
+ updateAriaRowCount(rowCount) {
17936
+ var _a;
17937
+ (_a = this.gridRoleElement) === null || _a === void 0 ? void 0 : _a.setAttribute('aria-rowcount', rowCount.toString());
17938
+ }
17939
+ updateAriaRowIndexes() {
17940
+ for (let i = 0; i < this.viewContainerRef.length; i++) {
17941
+ const viewRef = this.viewContainerRef.get(i);
17942
+ const rootElements = viewRef.rootNodes;
17943
+ const datagridRowElement = rootElements.find(rowElement => rowElement.tagName === 'CLR-DG-ROW');
17944
+ const rowRoleElement = datagridRowElement === null || datagridRowElement === void 0 ? void 0 : datagridRowElement.querySelector('[role="row"]');
17945
+ // aria-rowindex should start with one, not zero, so we have to add one to the zero-based index
17946
+ rowRoleElement === null || rowRoleElement === void 0 ? void 0 : rowRoleElement.setAttribute('aria-rowindex', (viewRef.context.index + 1).toString());
17947
+ }
17948
+ }
17949
+ createVirtualScrollViewportForDatagrid(changeDetectorRef, ngZone, directionality, scrollDispatcher, viewportRuler, datagridElementRef, virtualScrollStrategy) {
17950
+ const datagridDivElement = datagridElementRef.nativeElement.querySelector('.datagrid');
17951
+ const datagridTableElement = datagridElementRef.nativeElement.querySelector('.datagrid-table');
17952
+ const datagridRowsElement = datagridElementRef.nativeElement.querySelector('.datagrid-rows');
17953
+ const datagridDivElementRef = { nativeElement: datagridDivElement };
17954
+ let topOffset = 0;
17955
+ let totalContentSize = 0;
17956
+ function updateDatagridElementStyles() {
17957
+ datagridRowsElement.style.transform = `translateY(${topOffset}px)`;
17958
+ datagridRowsElement.style.height = `${totalContentSize - topOffset}px`;
17959
+ }
17960
+ const virtualScrollViewport = new CdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, null);
17961
+ virtualScrollViewport._contentWrapper = {
17962
+ nativeElement: {
17963
+ style: {
17964
+ set transform(value) {
17965
+ var _a;
17966
+ topOffset = value === undefined ? 0 : +((_a = /translateY\(([0-9]+)px\)/.exec(value)) === null || _a === void 0 ? void 0 : _a[1]);
17967
+ updateDatagridElementStyles();
17968
+ },
17969
+ },
17970
+ },
17971
+ };
17972
+ virtualScrollViewport.setTotalContentSize = (value) => {
17973
+ totalContentSize = value;
17974
+ datagridTableElement.style.height = `${totalContentSize}px`;
17975
+ updateDatagridElementStyles();
17976
+ };
17977
+ return virtualScrollViewport;
17978
+ }
17196
17979
  }
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: [{
17980
+ ClrDatagridVirtualScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.IterableDiffers }, { token: Items, skipSelf: true }, { token: i0.NgZone }, { token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: i1$2.Directionality }, { token: i3$1.ScrollDispatcher }, { token: i3$1.ViewportRuler }, { token: ClrDatagrid }, { token: ColumnsService }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Directive });
17981
+ 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 });
17982
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, decorators: [{
17200
17983
  type: Directive,
17201
17984
  args: [{
17202
- selector: 'clr-dg-cell',
17985
+ selector: '[ClrVirtualScroll]',
17986
+ providers: [Items],
17203
17987
  }]
17204
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: DatagridRenderOrganizer }]; } });
17988
+ }], ctorParameters: function () {
17989
+ return [{ type: i0.ChangeDetectorRef }, { type: i0.IterableDiffers }, { type: Items, decorators: [{
17990
+ type: SkipSelf
17991
+ }] }, { type: i0.NgZone }, { type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: i1$2.Directionality }, { type: i3$1.ScrollDispatcher }, { type: i3$1.ViewportRuler }, { type: ClrDatagrid }, { type: ColumnsService }, { type: i0.EnvironmentInjector }];
17992
+ }, propDecorators: { renderedRangeChange: [{
17993
+ type: Output
17994
+ }], cdkVirtualForOf: [{
17995
+ type: Input,
17996
+ args: ['clrVirtualRowsOf']
17997
+ }], cdkVirtualForTrackBy: [{
17998
+ type: Input,
17999
+ args: ['clrVirtualRowsTrackBy']
18000
+ }], cdkVirtualForTemplate: [{
18001
+ type: Input,
18002
+ args: ['clrVirtualRowsTemplate']
18003
+ }], cdkVirtualForTemplateCacheSize: [{
18004
+ type: Input,
18005
+ args: ['clrVirtualRowsTemplateCacheSize']
18006
+ }], itemSize: [{
18007
+ type: Input,
18008
+ args: ['clrVirtualRowsItemSize']
18009
+ }], minBufferPx: [{
18010
+ type: Input,
18011
+ args: ['clrVirtualRowsMinBufferPx']
18012
+ }], maxBufferPx: [{
18013
+ type: Input,
18014
+ args: ['clrVirtualRowsMaxBufferPx']
18015
+ }] } });
17205
18016
 
17206
18017
  /*
17207
18018
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
@@ -17226,7 +18037,6 @@ class DatagridHeaderRenderer {
17226
18037
  this.autoSet = false;
17227
18038
  this.subscriptions = [];
17228
18039
  this.subscriptions.push(this.organizer.filterRenderSteps(DatagridRenderStep.CLEAR_WIDTHS).subscribe(() => this.clearWidth()));
17229
- this.subscriptions.push(columnState.subscribe(state => this.stateChanges(state)));
17230
18040
  }
17231
18041
  ngOnDestroy() {
17232
18042
  this.subscriptions.forEach(sub => sub.unsubscribe());
@@ -17241,20 +18051,30 @@ class DatagridHeaderRenderer {
17241
18051
  setColumnState(index) {
17242
18052
  this.columnsService.columns[index] = this.columnState;
17243
18053
  }
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
- });
18054
+ setWidth(state) {
18055
+ if (state.strictWidth) {
18056
+ if (this.columnResizerService.resizedBy) {
18057
+ this.resizeEmitter.emit(state.width);
18058
+ this.renderer.setStyle(this.el.nativeElement, 'width', state.width + 'px');
18059
+ this.widthSet = false;
18060
+ }
18061
+ // Don't set width if there is a user-defined one. Just add the strict width class.
18062
+ this.renderer.addClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
18063
+ this.autoSet = false;
18064
+ }
18065
+ else {
18066
+ this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
18067
+ this.renderer.setStyle(this.el.nativeElement, 'width', state.width + 'px');
18068
+ this.widthSet = true;
18069
+ this.autoSet = true;
18070
+ }
18071
+ }
18072
+ setHidden(state) {
18073
+ if (state.hidden) {
18074
+ this.renderer.addClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
18075
+ }
18076
+ else {
18077
+ this.renderer.removeClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
17258
18078
  }
17259
18079
  }
17260
18080
  clearWidth() {
@@ -17284,32 +18104,6 @@ class DatagridHeaderRenderer {
17284
18104
  }
17285
18105
  return width;
17286
18106
  }
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
18107
  }
17314
18108
  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
18109
  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 +18165,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17371
18165
  type: Injectable
17372
18166
  }] });
17373
18167
 
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
18168
  /*
17432
18169
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
17433
18170
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -17447,7 +18184,7 @@ const domAdapterFactory = (platformId) => {
17447
18184
  // Fixes build error
17448
18185
  // @dynamic (https://github.com/angular/angular/issues/19698#issuecomment-338340211)
17449
18186
  class DatagridMainRenderer {
17450
- constructor(organizer, items, page, domAdapter, el, renderer, detailService, tableSizeService, columnsService, ngZone) {
18187
+ constructor(organizer, items, page, domAdapter, el, renderer, detailService, tableSizeService, columnsService, ngZone, keyNavigation) {
17451
18188
  this.organizer = organizer;
17452
18189
  this.items = items;
17453
18190
  this.page = page;
@@ -17458,6 +18195,7 @@ class DatagridMainRenderer {
17458
18195
  this.tableSizeService = tableSizeService;
17459
18196
  this.columnsService = columnsService;
17460
18197
  this.ngZone = ngZone;
18198
+ this.keyNavigation = keyNavigation;
17461
18199
  this._heightSet = false;
17462
18200
  this.shouldStabilizeColumns = true;
17463
18201
  this.subscriptions = [];
@@ -17478,6 +18216,9 @@ class DatagridMainRenderer {
17478
18216
  this.subscriptions.push(this.detailService.stateChange.subscribe(state => this.toggleDetailPane(state)));
17479
18217
  this.subscriptions.push(this.items.change.subscribe(() => (this.shouldStabilizeColumns = true)));
17480
18218
  }
18219
+ ngOnInit() {
18220
+ this.columnsService.columnsStateChange.subscribe(change => this.columnStateChanged(change));
18221
+ }
17481
18222
  ngAfterContentInit() {
17482
18223
  this.setupColumns();
17483
18224
  this.subscriptions.push(this.headers.changes.subscribe(() => {
@@ -17528,7 +18269,10 @@ class DatagridMainRenderer {
17528
18269
  setupColumns() {
17529
18270
  this.headers.forEach((header, index) => header.setColumnState(index));
17530
18271
  this.columnsService.columns.splice(this.headers.length); // Trim any old columns
17531
- this.rows.forEach(row => row.setColumnState());
18272
+ // Sets columnIndex for each column
18273
+ this.columnsService.columns.forEach((column, index) => {
18274
+ this.columnsService.emitStateChange(column, { changes: [DatagridColumnChanges.INITIALIZE], columnIndex: index });
18275
+ });
17532
18276
  }
17533
18277
  shouldComputeHeight() {
17534
18278
  if (!this._heightSet && this.page.size > 0) {
@@ -17549,9 +18293,8 @@ class DatagridMainRenderer {
17549
18293
  * Refer: http://stackoverflow.com/questions/24396205/flex-grow-not-working-in-internet-explorer-11-0
17550
18294
  */
17551
18295
  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');
18296
+ const height = window.getComputedStyle(this.el.nativeElement).height;
18297
+ this.renderer.setStyle(this.el.nativeElement, 'height', height);
17555
18298
  this._heightSet = true;
17556
18299
  }
17557
18300
  resetDatagridHeight() {
@@ -17563,13 +18306,16 @@ class DatagridMainRenderer {
17563
18306
  */
17564
18307
  computeHeadersWidth() {
17565
18308
  const nbColumns = this.headers.length;
18309
+ const headerWidths = this.headers.map(header => {
18310
+ return header.getColumnWidthState();
18311
+ });
17566
18312
  let allStrict = true;
17567
18313
  this.headers.forEach((header, index) => {
17568
18314
  // On the last header column check whether all columns have strict widths.
17569
18315
  // If all columns have strict widths, remove the strict width from the last column and make it the column's
17570
18316
  // minimum width so that when all previous columns shrink, it will get a flexible width and cover the empty
17571
18317
  // gap in the Datagrid.
17572
- const state = Object.assign({ changes: [DatagridColumnChanges.WIDTH] }, header.getColumnWidthState());
18318
+ const state = Object.assign({ changes: [DatagridColumnChanges.WIDTH] }, headerWidths[index]);
17573
18319
  if (!state.strictWidth) {
17574
18320
  allStrict = false;
17575
18321
  }
@@ -17579,6 +18325,46 @@ class DatagridMainRenderer {
17579
18325
  this.columnsService.emitStateChangeAt(index, state);
17580
18326
  });
17581
18327
  }
18328
+ columnStateChanged(state) {
18329
+ // eslint-disable-next-line eqeqeq
18330
+ if (!this.headers || state.columnIndex == null) {
18331
+ return;
18332
+ }
18333
+ const columnIndex = state.columnIndex;
18334
+ if (state.changes && state.changes.length) {
18335
+ state.changes.forEach(change => {
18336
+ switch (change) {
18337
+ case DatagridColumnChanges.WIDTH:
18338
+ this.headers.get(columnIndex).setWidth(state);
18339
+ this.rows.forEach(row => {
18340
+ if ((row === null || row === void 0 ? void 0 : row.cells.length) === this.columnsService.columns.length) {
18341
+ row.cells.get(columnIndex).setWidth(state);
18342
+ }
18343
+ });
18344
+ break;
18345
+ case DatagridColumnChanges.HIDDEN:
18346
+ this.headers.get(columnIndex).setHidden(state);
18347
+ this.rows.forEach(row => {
18348
+ if (row.cells && row.cells.length) {
18349
+ row.cells.get(columnIndex).setHidden(state);
18350
+ }
18351
+ });
18352
+ this.keyNavigation.resetKeyGrid();
18353
+ break;
18354
+ case DatagridColumnChanges.INITIALIZE:
18355
+ if (state.hideable && state.hidden) {
18356
+ this.headers.get(columnIndex).setHidden(state);
18357
+ this.rows.forEach(row => {
18358
+ row.setCellsState();
18359
+ });
18360
+ }
18361
+ break;
18362
+ default:
18363
+ break;
18364
+ }
18365
+ });
18366
+ }
18367
+ }
17582
18368
  /**
17583
18369
  * Triggers a whole re-rendring cycle to set column sizes, if needed.
17584
18370
  */
@@ -17595,7 +18381,7 @@ class DatagridMainRenderer {
17595
18381
  }
17596
18382
  }
17597
18383
  }
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 });
18384
+ 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
18385
  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
18386
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridMainRenderer, decorators: [{
17601
18387
  type: Directive,
@@ -17603,7 +18389,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17603
18389
  selector: 'clr-datagrid',
17604
18390
  providers: [{ provide: DomAdapter, useFactory: domAdapterFactory, deps: [PLATFORM_ID] }],
17605
18391
  }]
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: [{
18392
+ }], 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
18393
  type: ContentChildren,
17608
18394
  args: [DatagridHeaderRenderer]
17609
18395
  }], rows: [{
@@ -17638,6 +18424,7 @@ const CLR_DATAGRID_DIRECTIVES = [
17638
18424
  ClrDatagridRow,
17639
18425
  ClrDatagridRowDetail,
17640
18426
  ClrDatagridSelectionCellDirective,
18427
+ ClrDatagridVirtualScrollDirective,
17641
18428
  ClrIfDetail,
17642
18429
  DatagridDetailRegisterer,
17643
18430
  WrappedCell,
@@ -17684,6 +18471,7 @@ ClrDatagridModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", versi
17684
18471
  ClrDatagridRow,
17685
18472
  ClrDatagridRowDetail,
17686
18473
  ClrDatagridSelectionCellDirective,
18474
+ ClrDatagridVirtualScrollDirective,
17687
18475
  ClrIfDetail,
17688
18476
  DatagridDetailRegisterer,
17689
18477
  WrappedCell,
@@ -17734,6 +18522,7 @@ ClrDatagridModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", versi
17734
18522
  ClrDatagridRow,
17735
18523
  ClrDatagridRowDetail,
17736
18524
  ClrDatagridSelectionCellDirective,
18525
+ ClrDatagridVirtualScrollDirective,
17737
18526
  ClrIfDetail,
17738
18527
  DatagridDetailRegisterer,
17739
18528
  WrappedCell,
@@ -22801,6 +23590,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22801
23590
  }] }];
22802
23591
  } });
22803
23592
 
23593
+ /*
23594
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
23595
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
23596
+ * This software is released under MIT license.
23597
+ * The full license information can be found in LICENSE in the root directory of this project.
23598
+ */
23599
+ class ClrModalConfigurationService {
23600
+ constructor() {
23601
+ this.fadeMove = 'fadeDown';
23602
+ this.backdrop = true;
23603
+ }
23604
+ }
23605
+ ClrModalConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalConfigurationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
23606
+ ClrModalConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalConfigurationService });
23607
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalConfigurationService, decorators: [{
23608
+ type: Injectable
23609
+ }] });
23610
+
22804
23611
  /*
22805
23612
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
22806
23613
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -22808,10 +23615,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22808
23615
  * The full license information can be found in LICENSE in the root directory of this project.
22809
23616
  */
22810
23617
  class ClrModal {
22811
- constructor(_scrollingService, commonStrings, modalStackService) {
23618
+ constructor(_scrollingService, commonStrings, modalStackService, configuration) {
22812
23619
  this._scrollingService = _scrollingService;
22813
23620
  this.commonStrings = commonStrings;
22814
23621
  this.modalStackService = modalStackService;
23622
+ this.configuration = configuration;
22815
23623
  this.modalId = uniqueIdFactory();
22816
23624
  this._open = false;
22817
23625
  this._openChanged = new EventEmitter(false);
@@ -22821,13 +23629,23 @@ class ClrModal {
22821
23629
  this.skipAnimation = 'false';
22822
23630
  this.stopClose = false;
22823
23631
  this.altClose = new EventEmitter(false);
22824
- this.labelledBy = this.modalId;
23632
+ // presently this is only used by inline wizards
23633
+ this.bypassScrollService = false;
23634
+ }
23635
+ get fadeMove() {
23636
+ return this.skipAnimation ? '' : this.configuration.fadeMove;
23637
+ }
23638
+ set fadeMove(move) {
23639
+ this.configuration.fadeMove = move;
23640
+ }
23641
+ get backdrop() {
23642
+ return this.configuration.backdrop;
22825
23643
  }
22826
23644
  // Detect when _open is set to true and set no-scrolling to true
22827
23645
  ngOnChanges(changes) {
22828
- if (changes && Object.prototype.hasOwnProperty.call(changes, '_open')) {
23646
+ if (!this.bypassScrollService && changes && Object.prototype.hasOwnProperty.call(changes, '_open')) {
22829
23647
  if (changes._open.currentValue) {
22830
- this._scrollingService.stopScrolling();
23648
+ this.backdrop && this._scrollingService.stopScrolling();
22831
23649
  this.modalStackService.trackModalOpen(this);
22832
23650
  }
22833
23651
  else {
@@ -22864,11 +23682,18 @@ class ClrModal {
22864
23682
  }
22865
23683
  }
22866
23684
  }
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%)' }))]),
23685
+ 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 });
23686
+ 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: [
23687
+ trigger('fadeMove', [
23688
+ transition('* => fadeDown', [
23689
+ style({ opacity: 0, transform: 'translate(0, -25%)' }),
23690
+ animate('0.2s ease-in-out'),
23691
+ ]),
23692
+ transition('fadeDown => *', [
23693
+ animate('0.2s ease-in-out', style({ opacity: 0, transform: 'translate(0, -25%)' })),
23694
+ ]),
23695
+ transition('* => fadeLeft', [style({ opacity: 0, transform: 'translate(25%, 0)' }), animate('0.2s ease-in-out')]),
23696
+ transition('fadeLeft => *', [animate('0.2s ease-in-out', style({ opacity: 0, transform: 'translate(25%, 0)' }))]),
22872
23697
  ]),
22873
23698
  trigger('fade', [
22874
23699
  transition('void => *', [style({ opacity: 0 }), animate('0.2s ease-in-out', style({ opacity: 0.85 }))]),
@@ -22878,16 +23703,23 @@ ClrModal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.
22878
23703
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModal, decorators: [{
22879
23704
  type: Component,
22880
23705
  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%)' }))]),
23706
+ trigger('fadeMove', [
23707
+ transition('* => fadeDown', [
23708
+ style({ opacity: 0, transform: 'translate(0, -25%)' }),
23709
+ animate('0.2s ease-in-out'),
23710
+ ]),
23711
+ transition('fadeDown => *', [
23712
+ animate('0.2s ease-in-out', style({ opacity: 0, transform: 'translate(0, -25%)' })),
23713
+ ]),
23714
+ transition('* => fadeLeft', [style({ opacity: 0, transform: 'translate(25%, 0)' }), animate('0.2s ease-in-out')]),
23715
+ transition('fadeLeft => *', [animate('0.2s ease-in-out', style({ opacity: 0, transform: 'translate(25%, 0)' }))]),
22884
23716
  ]),
22885
23717
  trigger('fade', [
22886
23718
  transition('void => *', [style({ opacity: 0 }), animate('0.2s ease-in-out', style({ opacity: 0.85 }))]),
22887
23719
  transition('* => void', [animate('0.2s ease-in-out', style({ opacity: 0 }))]),
22888
23720
  ]),
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: [{
23721
+ ], 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"] }]
23722
+ }], ctorParameters: function () { return [{ type: ScrollingService }, { type: ClrCommonStringsService }, { type: ModalStackService }, { type: ClrModalConfigurationService }]; }, propDecorators: { _open: [{
22891
23723
  type: Input,
22892
23724
  args: ['clrModalOpen']
22893
23725
  }, {
@@ -22920,6 +23752,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22920
23752
  }], labelledBy: [{
22921
23753
  type: Input,
22922
23754
  args: ['clrModalLabelledById']
23755
+ }], bypassScrollService: [{
23756
+ type: Input,
23757
+ args: ['clrModalOverrideScrollService']
22923
23758
  }] } });
22924
23759
 
22925
23760
  /*
@@ -22999,16 +23834,122 @@ class ClrModalModule {
22999
23834
  }
23000
23835
  ClrModalModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
23001
23836
  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] });
23837
+ ClrModalModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalModule, providers: [ClrModalConfigurationService], imports: [CommonModule, CdkTrapFocusModule, ClrIconModule, ClrIconModule] });
23003
23838
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalModule, decorators: [{
23004
23839
  type: NgModule,
23005
23840
  args: [{
23006
23841
  imports: [CommonModule, CdkTrapFocusModule, ClrIconModule],
23007
23842
  declarations: [CLR_MODAL_DIRECTIVES],
23008
23843
  exports: [CLR_MODAL_DIRECTIVES, ClrIconModule],
23844
+ providers: [ClrModalConfigurationService],
23009
23845
  }]
23010
23846
  }], ctorParameters: function () { return []; } });
23011
23847
 
23848
+ /*
23849
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
23850
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
23851
+ * This software is released under MIT license.
23852
+ * The full license information can be found in LICENSE in the root directory of this project.
23853
+ */
23854
+ class ClrSidePanel {
23855
+ constructor(element, configuration) {
23856
+ this.element = element;
23857
+ this.configuration = configuration;
23858
+ this._open = false;
23859
+ this.openChange = new EventEmitter(false);
23860
+ this.skipAnimation = 'false';
23861
+ this.staticBackdrop = false;
23862
+ this.preventClose = false;
23863
+ this.altClose = new EventEmitter(false);
23864
+ }
23865
+ get clrSidePanelBackdrop() {
23866
+ return this.configuration.backdrop;
23867
+ }
23868
+ set clrSidePanelBackdrop(backdrop) {
23869
+ if (backdrop !== undefined) {
23870
+ this.configuration.backdrop = backdrop;
23871
+ }
23872
+ }
23873
+ ngOnInit() {
23874
+ this.configuration.fadeMove = 'fadeLeft';
23875
+ }
23876
+ open() {
23877
+ this.modal.open();
23878
+ }
23879
+ close() {
23880
+ this.modal.close();
23881
+ }
23882
+ documentClick(event) {
23883
+ if (!this.element.nativeElement.contains(event.target) && this.modal._open && !this.configuration.backdrop) {
23884
+ this.modal.close();
23885
+ }
23886
+ }
23887
+ }
23888
+ 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 });
23889
+ 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" }] });
23890
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrSidePanel, decorators: [{
23891
+ type: Component,
23892
+ args: [{ selector: 'clr-side-panel', host: {
23893
+ '[class.side-panel]': 'true',
23894
+ }, 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" }]
23895
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: ClrModalConfigurationService }]; }, propDecorators: { _open: [{
23896
+ type: Input,
23897
+ args: ['clrSidePanelOpen']
23898
+ }], openChange: [{
23899
+ type: Output,
23900
+ args: ['clrSidePanelOpenChange']
23901
+ }], closeButtonAriaLabel: [{
23902
+ type: Input,
23903
+ args: ['clrSidePanelCloseButtonAriaLabel']
23904
+ }], size: [{
23905
+ type: Input,
23906
+ args: ['clrSidePanelSize']
23907
+ }], skipAnimation: [{
23908
+ type: Input,
23909
+ args: ['clrSidePanelSkipAnimation']
23910
+ }], labelledById: [{
23911
+ type: Input,
23912
+ args: ['clrSidePanelLabelledById']
23913
+ }], staticBackdrop: [{
23914
+ type: Input,
23915
+ args: ['clrSidePanelStaticBackdrop']
23916
+ }], preventClose: [{
23917
+ type: Input,
23918
+ args: ['clrSidePanelPreventClose']
23919
+ }], altClose: [{
23920
+ type: Output,
23921
+ args: ['clrSidePanelAlternateClose']
23922
+ }], modal: [{
23923
+ type: ViewChild,
23924
+ args: [ClrModal]
23925
+ }], clrSidePanelBackdrop: [{
23926
+ type: Input
23927
+ }], documentClick: [{
23928
+ type: HostListener,
23929
+ args: ['document:pointerup', ['$event']]
23930
+ }] } });
23931
+
23932
+ /*
23933
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
23934
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
23935
+ * This software is released under MIT license.
23936
+ * The full license information can be found in LICENSE in the root directory of this project.
23937
+ */
23938
+ const CLR_SIDEPANEL_DIRECTIVES = [ClrSidePanel];
23939
+ class ClrSidePanelModule {
23940
+ }
23941
+ ClrSidePanelModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrSidePanelModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
23942
+ 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] });
23943
+ ClrSidePanelModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrSidePanelModule, imports: [CommonModule, CdkTrapFocusModule, ClrIconModule, ClrModalModule, ClrIconModule] });
23944
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrSidePanelModule, decorators: [{
23945
+ type: NgModule,
23946
+ args: [{
23947
+ imports: [CommonModule, CdkTrapFocusModule, ClrIconModule, ClrModalModule],
23948
+ declarations: [CLR_SIDEPANEL_DIRECTIVES],
23949
+ exports: [CLR_SIDEPANEL_DIRECTIVES, ClrIconModule],
23950
+ }]
23951
+ }] });
23952
+
23012
23953
  /*
23013
23954
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
23014
23955
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -23830,13 +24771,13 @@ class ClrTimeline {
23830
24771
  }
23831
24772
  }
23832
24773
  ClrTimeline.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrTimeline, deps: [], target: i0.ɵɵFactoryTarget.Component });
23833
- ClrTimeline.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrTimeline, selector: "clr-timeline", inputs: { layout: ["clrLayout", "layout"] }, host: { properties: { "class.clr-timeline": "true", "class.clr-timeline-vertical": "this.isVertical" } }, providers: [TimelineIconAttributeService], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true });
24774
+ ClrTimeline.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrTimeline, selector: "clr-timeline", inputs: { layout: ["clrLayout", "layout"] }, host: { properties: { "class.clr-timeline": "true", "attr.role": "\"list\"", "class.clr-timeline-vertical": "this.isVertical" } }, providers: [TimelineIconAttributeService], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true });
23834
24775
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrTimeline, decorators: [{
23835
24776
  type: Component,
23836
24777
  args: [{
23837
24778
  selector: 'clr-timeline',
23838
24779
  template: `<ng-content></ng-content>`,
23839
- host: { '[class.clr-timeline]': 'true' },
24780
+ host: { '[class.clr-timeline]': 'true', '[attr.role]': '"list"' },
23840
24781
  providers: [TimelineIconAttributeService],
23841
24782
  }]
23842
24783
  }], propDecorators: { layout: [{
@@ -23907,7 +24848,7 @@ class ClrTimelineStep {
23907
24848
  }
23908
24849
  }
23909
24850
  ClrTimelineStep.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrTimelineStep, deps: [{ token: TimelineIconAttributeService }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
23910
- ClrTimelineStep.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrTimelineStep, selector: "clr-timeline-step", inputs: { state: ["clrState", "state"] }, host: { properties: { "class.clr-timeline-step": "true" } }, queries: [{ propertyName: "stepTitle", first: true, predicate: ClrTimelineStepTitle, descendants: true, read: ElementRef }], ngImport: i0, template: `
24851
+ ClrTimelineStep.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrTimelineStep, selector: "clr-timeline-step", inputs: { state: ["clrState", "state"] }, host: { properties: { "class.clr-timeline-step": "true", "attr.role": "\"listitem\"" } }, queries: [{ propertyName: "stepTitle", first: true, predicate: ClrTimelineStepTitle, descendants: true, read: ElementRef }], ngImport: i0, template: `
23911
24852
  <ng-content select="clr-timeline-step-header"></ng-content>
23912
24853
  <span class="clr-sr-only">{{ stepTitleText }}</span>
23913
24854
  <ng-container *ngIf="!isProcessing; else processing">
@@ -23951,7 +24892,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
23951
24892
  <clr-spinner clrMedium [attr.aria-label]="iconAriaLabel"></clr-spinner>
23952
24893
  </ng-template>
23953
24894
  `,
23954
- host: { '[class.clr-timeline-step]': 'true' },
24895
+ host: { '[class.clr-timeline-step]': 'true', '[attr.role]': '"listitem"' },
23955
24896
  }]
23956
24897
  }], ctorParameters: function () {
23957
24898
  return [{ type: TimelineIconAttributeService }, { type: undefined, decorators: [{
@@ -26057,13 +26998,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26057
26998
  * The full license information can be found in LICENSE in the root directory of this project.
26058
26999
  */
26059
27000
  class ClrWizard {
26060
- constructor(platformId, commonStrings, navService, pageCollection, buttonService, headerActionService, differs) {
27001
+ constructor(platformId, commonStrings, navService, pageCollection, buttonService, headerActionService, elementRef, differs) {
26061
27002
  this.platformId = platformId;
26062
27003
  this.commonStrings = commonStrings;
26063
27004
  this.navService = navService;
26064
27005
  this.pageCollection = pageCollection;
26065
27006
  this.buttonService = buttonService;
26066
27007
  this.headerActionService = headerActionService;
27008
+ this.elementRef = elementRef;
26067
27009
  /**
26068
27010
  * Set the aria-label for the stepnav section of the wizard. Set using `[clrWizardStepnavAriaLabel]` input.
26069
27011
  */
@@ -26077,6 +27019,12 @@ class ClrWizard {
26077
27019
  * in the top right corner. Set using `[clrWizardClosable]` input.
26078
27020
  */
26079
27021
  this.closable = true;
27022
+ /**
27023
+ * Used to communicate to the underlying modal that animations are not
27024
+ * wanted. Primary use is for the display of static/inline wizards.
27025
+ * Set using `[clrWizardPreventModalAnimation]` input.
27026
+ */
27027
+ this._stopModalAnimations = false;
26080
27028
  /**
26081
27029
  * Emits when the wizard is opened or closed.
26082
27030
  * Listen via `(clrWizardOpenChange)` event.
@@ -26215,9 +27163,16 @@ class ClrWizard {
26215
27163
  get isFirst() {
26216
27164
  return this.navService.currentPageIsFirst;
26217
27165
  }
27166
+ get isInline() {
27167
+ return this.elementRef.nativeElement.classList.contains('clr-wizard--inline');
27168
+ }
27169
+ get stopModalAnimations() {
27170
+ return this._stopModalAnimations ? 'true' : 'false';
27171
+ }
26218
27172
  ngAfterContentInit() {
26219
27173
  this.pageCollection.pages = this.pages;
26220
27174
  this.headerActionService.wizardHeaderActions = this.headerActions;
27175
+ this.initializeButtons();
26221
27176
  }
26222
27177
  ngDoCheck() {
26223
27178
  this.updateNavOnPageChanges();
@@ -26422,6 +27377,12 @@ class ClrWizard {
26422
27377
  changes.forEachRemovedItem(() => this.navService.updateNavigation());
26423
27378
  }
26424
27379
  }
27380
+ initializeButtons() {
27381
+ // Only trigger buttons ready if default is open (inlined)
27382
+ if (this._open) {
27383
+ this.buttonService.buttonsReady = true;
27384
+ }
27385
+ }
26425
27386
  emitWizardFinished() {
26426
27387
  if (!this.stopNext) {
26427
27388
  this.forceFinish();
@@ -26429,8 +27390,8 @@ class ClrWizard {
26429
27390
  this.wizardFinished.emit();
26430
27391
  }
26431
27392
  }
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" }] });
27393
+ 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 });
27394
+ 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
27395
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrWizard, decorators: [{
26435
27396
  type: Component,
26436
27397
  args: [{ selector: 'clr-wizard', providers: [WizardNavigationService, PageCollectionService, ButtonHubService, HeaderActionService], host: {
@@ -26439,12 +27400,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26439
27400
  '[class.wizard-lg]': "size == 'lg'",
26440
27401
  '[class.wizard-xl]': "size == 'xl'",
26441
27402
  '[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" }]
27403
+ }, 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
27404
  }], ctorParameters: function () {
26444
27405
  return [{ type: undefined, decorators: [{
26445
27406
  type: Inject,
26446
27407
  args: [PLATFORM_ID]
26447
- }] }, { type: ClrCommonStringsService }, { type: WizardNavigationService }, { type: PageCollectionService }, { type: ButtonHubService }, { type: HeaderActionService }, { type: i0.IterableDiffers }];
27408
+ }] }, { type: ClrCommonStringsService }, { type: WizardNavigationService }, { type: PageCollectionService }, { type: ButtonHubService }, { type: HeaderActionService }, { type: i0.ElementRef }, { type: i0.IterableDiffers }];
26448
27409
  }, propDecorators: { stepnavAriaLabel: [{
26449
27410
  type: Input,
26450
27411
  args: ['clrWizardStepnavAriaLabel']
@@ -26454,6 +27415,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26454
27415
  }], closable: [{
26455
27416
  type: Input,
26456
27417
  args: ['clrWizardClosable']
27418
+ }], _stopModalAnimations: [{
27419
+ type: Input,
27420
+ args: ['clrWizardPreventModalAnimation']
26457
27421
  }], _openChanged: [{
26458
27422
  type: Output,
26459
27423
  args: ['clrWizardOpenChange']
@@ -26768,6 +27732,7 @@ ClarityModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version:
26768
27732
  ClrLayoutModule,
26769
27733
  ClrPopoverModule,
26770
27734
  ClrWizardModule,
27735
+ ClrSidePanelModule,
26771
27736
  ClrStepperModule,
26772
27737
  ClrSpinnerModule,
26773
27738
  ClrProgressBarModule,
@@ -26785,6 +27750,7 @@ ClarityModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version:
26785
27750
  ClrLayoutModule,
26786
27751
  ClrPopoverModule,
26787
27752
  ClrWizardModule,
27753
+ ClrSidePanelModule,
26788
27754
  ClrStepperModule,
26789
27755
  ClrSpinnerModule,
26790
27756
  ClrProgressBarModule,
@@ -26806,6 +27772,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26806
27772
  ClrLayoutModule,
26807
27773
  ClrPopoverModule,
26808
27774
  ClrWizardModule,
27775
+ ClrSidePanelModule,
26809
27776
  ClrStepperModule,
26810
27777
  ClrSpinnerModule,
26811
27778
  ClrProgressBarModule,
@@ -27102,5 +28069,5 @@ const CLR_MENU_POSITIONS = [
27102
28069
  * Generated bundle index. Do not edit.
27103
28070
  */
27104
28071
 
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 };
28072
+ 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
28073
  //# sourceMappingURL=clr-angular.mjs.map