@clr/angular 17.5.0 → 17.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/clarity.api.md +335 -112
  2. package/data/datagrid/built-in/filters/datagrid-string-filter.d.ts +13 -4
  3. package/data/datagrid/datagrid-virtual-scroll.directive.d.ts +4 -3
  4. package/data/datagrid/providers/columns.service.d.ts +1 -0
  5. package/esm2020/data/datagrid/built-in/filters/datagrid-numeric-filter.mjs +18 -17
  6. package/esm2020/data/datagrid/built-in/filters/datagrid-string-filter.mjs +63 -28
  7. package/esm2020/data/datagrid/datagrid-column.mjs +1 -1
  8. package/esm2020/data/datagrid/datagrid-virtual-scroll.directive.mjs +11 -9
  9. package/esm2020/data/datagrid/providers/columns.service.mjs +4 -1
  10. package/esm2020/data/datagrid/render/main-renderer.mjs +3 -3
  11. package/esm2020/forms/combobox/combobox.mjs +7 -7
  12. package/esm2020/forms/common/abstract-container.mjs +9 -3
  13. package/esm2020/forms/common/if-control-state/if-control-state.service.mjs +11 -27
  14. package/esm2020/forms/common/label.mjs +4 -1
  15. package/esm2020/forms/common/providers/ng-control.service.mjs +5 -1
  16. package/esm2020/forms/datepicker/calendar.mjs +21 -8
  17. package/esm2020/forms/datepicker/date-container.mjs +10 -3
  18. package/esm2020/forms/datepicker/date-input.mjs +2 -2
  19. package/esm2020/forms/datepicker/datepicker-action-buttons.mjs +50 -0
  20. package/esm2020/forms/datepicker/datepicker-view-manager.mjs +17 -10
  21. package/esm2020/forms/datepicker/datepicker.module.mjs +7 -3
  22. package/esm2020/forms/datepicker/day.mjs +12 -14
  23. package/esm2020/forms/datepicker/index.mjs +2 -1
  24. package/esm2020/forms/datepicker/model/calendar-view.model.mjs +15 -4
  25. package/esm2020/forms/datepicker/providers/date-navigation.service.mjs +9 -4
  26. package/esm2020/forms/file-input/file-input-container.mjs +101 -13
  27. package/esm2020/forms/file-input/file-input-validator-errors.mjs +8 -0
  28. package/esm2020/forms/file-input/file-input-validator.mjs +14 -22
  29. package/esm2020/forms/file-input/file-input.mjs +3 -2
  30. package/esm2020/forms/file-input/file-input.module.mjs +35 -4
  31. package/esm2020/forms/file-input/file-list.mjs +158 -0
  32. package/esm2020/forms/file-input/file-messages-template.mjs +26 -0
  33. package/esm2020/forms/file-input/file-messages.mjs +61 -0
  34. package/esm2020/forms/file-input/index.mjs +5 -1
  35. package/esm2020/forms/forms.module.mjs +7 -3
  36. package/esm2020/forms/index.mjs +2 -1
  37. package/esm2020/forms/input/input-container.mjs +11 -3
  38. package/esm2020/forms/input/input.mjs +10 -1
  39. package/esm2020/forms/number-input/index.mjs +10 -0
  40. package/esm2020/forms/number-input/number-input-container.mjs +145 -0
  41. package/esm2020/forms/number-input/number-input.mjs +72 -0
  42. package/esm2020/forms/number-input/number-input.module.mjs +32 -0
  43. package/esm2020/utils/i18n/common-strings.default.mjs +4 -1
  44. package/esm2020/utils/i18n/common-strings.interface.mjs +1 -1
  45. package/fesm2015/clr-angular.mjs +893 -181
  46. package/fesm2015/clr-angular.mjs.map +1 -1
  47. package/fesm2020/clr-angular.mjs +882 -173
  48. package/fesm2020/clr-angular.mjs.map +1 -1
  49. package/forms/common/abstract-container.d.ts +2 -0
  50. package/forms/common/if-control-state/if-control-state.service.d.ts +4 -7
  51. package/forms/common/providers/ng-control.service.d.ts +2 -0
  52. package/forms/datepicker/calendar.d.ts +6 -1
  53. package/forms/datepicker/date-container.d.ts +2 -1
  54. package/forms/datepicker/datepicker-action-buttons.d.ts +16 -0
  55. package/forms/datepicker/datepicker-view-manager.d.ts +4 -1
  56. package/forms/datepicker/datepicker.module.d.ts +9 -8
  57. package/forms/datepicker/day.d.ts +5 -6
  58. package/forms/datepicker/index.d.ts +1 -0
  59. package/forms/datepicker/model/calendar-view.model.d.ts +5 -0
  60. package/forms/datepicker/providers/date-navigation.service.d.ts +6 -2
  61. package/forms/file-input/file-input-container.d.ts +15 -4
  62. package/forms/file-input/file-input-validator-errors.d.ts +52 -0
  63. package/forms/file-input/file-input.module.d.ts +7 -4
  64. package/forms/file-input/file-list.d.ts +18 -0
  65. package/forms/file-input/file-messages-template.d.ts +19 -0
  66. package/forms/file-input/file-messages.d.ts +17 -0
  67. package/forms/file-input/index.d.ts +4 -0
  68. package/forms/forms.module.d.ts +2 -1
  69. package/forms/index.d.ts +1 -0
  70. package/forms/input/input-container.d.ts +1 -1
  71. package/forms/number-input/index.d.ts +3 -0
  72. package/forms/number-input/number-input-container.d.ts +16 -0
  73. package/forms/number-input/number-input.d.ts +20 -0
  74. package/forms/number-input/number-input.module.d.ts +13 -0
  75. package/package.json +2 -2
  76. package/utils/i18n/common-strings.interface.d.ts +12 -0
@@ -1,11 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Directive, NgModule, Optional, Input, Injectable, Component, ChangeDetectionStrategy, EventEmitter, SkipSelf, HostBinding, Output, ContentChildren, PLATFORM_ID, Inject, ViewChild, HostListener, Renderer2, InjectionToken, ElementRef, NgZone, ChangeDetectorRef, ContentChild, ComponentFactoryResolver, KeyValueDiffers, Self, Attribute, LOCALE_ID, inject, forwardRef, ViewContainerRef, VERSION, Injector, EnvironmentInjector, TemplateRef, IterableDiffers } from '@angular/core';
2
+ import { Directive, NgModule, Optional, Input, Injectable, Component, ChangeDetectionStrategy, EventEmitter, SkipSelf, HostBinding, Output, ContentChildren, PLATFORM_ID, Inject, ViewChild, HostListener, Renderer2, InjectionToken, ElementRef, NgZone, ChangeDetectorRef, ContentChild, ComponentFactoryResolver, KeyValueDiffers, Self, Attribute, LOCALE_ID, inject, TemplateRef, Injector, forwardRef, ViewContainerRef, VERSION, EnvironmentInjector, IterableDiffers } from '@angular/core';
3
3
  import * as i5 from '@angular/common';
4
4
  import { CommonModule, isPlatformBrowser, DOCUMENT, NgForOf, getLocaleDayNames, FormStyle, TranslationWidth, getLocaleMonthNames, getLocaleFirstDayOfWeek, getLocaleDateFormat, FormatWidth } from '@angular/common';
5
5
  import { ClarityIcons, angleIcon, exclamationCircleIcon, checkCircleIcon, ellipsisHorizontalIcon, windowCloseIcon, infoCircleIcon, eventIcon, calendarIcon, folderOpenIcon, eyeHideIcon, eyeIcon, ellipsisVerticalIcon, viewColumnsIcon, arrowIcon, timesIcon, stepForward2Icon, angleDoubleIcon, filterGridCircleIcon, filterGridIcon, errorStandardIcon, helpIcon, infoStandardIcon, noteIcon, successStandardIcon, warningStandardIcon, circleIcon, dotCircleIcon } from '@cds/core/icon';
6
- import { map, tap, startWith, distinctUntilChanged, filter, skipUntil, debounceTime, takeUntil, take, first, switchMap } from 'rxjs/operators';
6
+ import { map, tap, startWith, distinctUntilChanged, filter, skipUntil, debounceTime, takeUntil, take, first, switchMap as switchMap$1 } from 'rxjs/operators';
7
7
  import * as i3 from 'rxjs';
8
- import { Subject, BehaviorSubject, Observable, fromEvent, isObservable, of, ReplaySubject, combineLatest, merge } from 'rxjs';
8
+ import { Subject, BehaviorSubject, Observable, fromEvent, isObservable, of, shareReplay, switchMap, merge, map as map$1, EMPTY, startWith as startWith$1, ReplaySubject, combineLatest } from 'rxjs';
9
9
  import { trigger, transition, style, animate, state, keyframes } from '@angular/animations';
10
10
  import * as i1 from '@angular/forms';
11
11
  import { FormControl, FormGroup, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, SelectMultipleControlValueAccessor } from '@angular/forms';
@@ -275,6 +275,8 @@ const commonStringsDefault = {
275
275
  close: 'Close',
276
276
  show: 'Show',
277
277
  hide: 'Hide',
278
+ apply: 'Apply',
279
+ cancel: 'Cancel',
278
280
  expand: 'Expand',
279
281
  collapse: 'Collapse',
280
282
  more: 'More',
@@ -316,6 +318,7 @@ const commonStringsDefault = {
316
318
  singleActionableAriaLabel: 'Single actionable header',
317
319
  detailExpandableAriaLabel: 'Toggle more row content',
318
320
  datagridFilterAriaLabel: '{COLUMN} filter',
321
+ datagridFilterLabel: '{COLUMN} filter',
319
322
  datagridFilterDialogAriaLabel: 'Filter dialog',
320
323
  columnSeparatorAriaLabel: 'Column resize handle',
321
324
  columnSeparatorDescription: 'Use left or right key to resize the column',
@@ -4546,6 +4549,9 @@ class NgControlService {
4546
4549
  this._controlChanges = new Subject();
4547
4550
  this._helpers = new Subject();
4548
4551
  }
4552
+ get control() {
4553
+ return this._control;
4554
+ }
4549
4555
  get controlChanges() {
4550
4556
  return this._controlChanges.asObservable();
4551
4557
  }
@@ -4553,6 +4559,7 @@ class NgControlService {
4553
4559
  return this._helpers.asObservable();
4554
4560
  }
4555
4561
  setControl(control) {
4562
+ this._control = control;
4556
4563
  this._controlChanges.next(control);
4557
4564
  }
4558
4565
  setHelpers(state) {
@@ -4579,35 +4586,19 @@ var CONTROL_STATE;
4579
4586
  })(CONTROL_STATE || (CONTROL_STATE = {}));
4580
4587
  class IfControlStateService {
4581
4588
  constructor(ngControlService) {
4582
- this.subscriptions = [];
4583
- // Implement our own status changes observable, since Angular controls don't
4584
- this._statusChanges = new BehaviorSubject(CONTROL_STATE.NONE);
4585
- // Wait for the control to be available
4586
- this.subscriptions.push(ngControlService.controlChanges.subscribe(control => {
4587
- if (control) {
4588
- this.control = control;
4589
- // Subscribe to the status change events, only after touched
4590
- // and emit the control
4591
- this.subscriptions.push(this.control.statusChanges.subscribe(() => {
4592
- this.triggerStatusChange();
4593
- }));
4594
- }
4595
- }));
4596
- }
4597
- get statusChanges() {
4598
- return this._statusChanges.asObservable();
4599
- }
4600
- ngOnDestroy() {
4601
- this.subscriptions.forEach(subscription => subscription.unsubscribe());
4589
+ this.triggerStatusChangeSubject = new Subject();
4590
+ this.statusChanges = this.getStatusChanges(ngControlService).pipe(shareReplay(1));
4602
4591
  }
4603
4592
  triggerStatusChange() {
4604
- /* Check if control is defined and run the code only then */
4605
- if (this.control) {
4593
+ this.triggerStatusChangeSubject.next();
4594
+ }
4595
+ getStatusChanges(ngControlService) {
4596
+ return ngControlService.controlChanges.pipe(switchMap(control => control ? merge(control.statusChanges, this.triggerStatusChangeSubject.pipe(map$1(() => control.status))) : EMPTY), map$1(controlStatus => {
4606
4597
  // These status values are mutually exclusive, so a control
4607
4598
  // cannot be both valid AND invalid or invalid AND disabled.
4608
- const status = CONTROL_STATE[this.control.status];
4609
- this._statusChanges.next(['VALID', 'INVALID'].includes(status) ? status : CONTROL_STATE.NONE);
4610
- }
4599
+ const status = CONTROL_STATE[controlStatus];
4600
+ return [CONTROL_STATE.VALID, CONTROL_STATE.INVALID].includes(status) ? status : CONTROL_STATE.NONE;
4601
+ }), startWith$1(CONTROL_STATE.NONE));
4611
4602
  }
4612
4603
  }
4613
4604
  IfControlStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: IfControlStateService, deps: [{ token: NgControlService }], target: i0.ɵɵFactoryTarget.Injectable });
@@ -6531,6 +6522,9 @@ class ClrLabel {
6531
6522
  return this.el.nativeElement && this.el.nativeElement.textContent;
6532
6523
  }
6533
6524
  ngOnInit() {
6525
+ // Prevent id attributes from being removed by the `undefined` host binding.
6526
+ // This happens when a `label` is used outside of a control container and other use cases.
6527
+ this.idAttr = this.idInput;
6534
6528
  // Only add the clr-control-label if it is inside a control container
6535
6529
  if (this.controlIdService || this.ngControlService) {
6536
6530
  this.renderer.addClass(this.el.nativeElement, 'clr-control-label');
@@ -6742,10 +6736,16 @@ class ClrAbstractContainer {
6742
6736
  return Boolean(this.controlHelperComponent);
6743
6737
  }
6744
6738
  get showValid() {
6745
- return this.touched && this.state === CONTROL_STATE.VALID && !!this.controlSuccessComponent;
6739
+ return this.touched && this.state === CONTROL_STATE.VALID && this.successMessagePresent;
6746
6740
  }
6747
6741
  get showInvalid() {
6748
- return this.touched && this.state === CONTROL_STATE.INVALID && !!this.controlErrorComponent;
6742
+ return this.touched && this.state === CONTROL_STATE.INVALID && this.errorMessagePresent;
6743
+ }
6744
+ get successMessagePresent() {
6745
+ return !!this.controlSuccessComponent;
6746
+ }
6747
+ get errorMessagePresent() {
6748
+ return !!this.controlErrorComponent;
6749
6749
  }
6750
6750
  get touched() {
6751
6751
  var _a;
@@ -9083,7 +9083,8 @@ class ClrCombobox extends WrappedFormControl {
9083
9083
  return this.optionSelectionService.displayField;
9084
9084
  }
9085
9085
  get disabled() {
9086
- return this.control && this.control.disabled;
9086
+ var _a;
9087
+ return (_a = this.control) === null || _a === void 0 ? void 0 : _a.disabled;
9087
9088
  }
9088
9089
  ngAfterContentInit() {
9089
9090
  this.initializeSubscriptions();
@@ -9102,12 +9103,13 @@ class ClrCombobox extends WrappedFormControl {
9102
9103
  this.el = this.textbox;
9103
9104
  }
9104
9105
  onKeyUp(event) {
9106
+ var _a;
9105
9107
  // if BACKSPACE in multiselect mode, delete the last pill if text is empty
9106
9108
  if (event.key === Keys.Backspace && this.multiSelect && this._searchText.length === 0) {
9107
9109
  const multiModel = this.optionSelectionService.selectionModel.model;
9108
9110
  if (multiModel && multiModel.length > 0) {
9109
9111
  const lastItem = multiModel[multiModel.length - 1];
9110
- this.control.control.markAsTouched();
9112
+ (_a = this.control) === null || _a === void 0 ? void 0 : _a.control.markAsTouched();
9111
9113
  this.optionSelectionService.unselect(lastItem);
9112
9114
  }
9113
9115
  }
@@ -9128,12 +9130,12 @@ class ClrCombobox extends WrappedFormControl {
9128
9130
  }
9129
9131
  }
9130
9132
  onBlur() {
9131
- var _a, _b;
9132
- this.onTouchedCallback();
9133
- if (this.control.control.updateOn === 'change' && ((_b = (_a = this.control.control) === null || _a === void 0 ? void 0 : _a.errors) === null || _b === void 0 ? void 0 : _b.required)) {
9133
+ var _a, _b, _c, _d;
9134
+ (_a = this.onTouchedCallback) === null || _a === void 0 ? void 0 : _a.call(this);
9135
+ if (((_b = this.control) === null || _b === void 0 ? void 0 : _b.control.updateOn) === 'change' && ((_c = this.control.control.errors) === null || _c === void 0 ? void 0 : _c.required)) {
9134
9136
  this.updateControlValue();
9135
9137
  }
9136
- if (this.control.control.updateOn === 'blur') {
9138
+ if (((_d = this.control) === null || _d === void 0 ? void 0 : _d.control.updateOn) === 'blur') {
9137
9139
  this.control.control.updateValueAndValidity();
9138
9140
  }
9139
9141
  this.focused = false;
@@ -9214,7 +9216,8 @@ class ClrCombobox extends WrappedFormControl {
9214
9216
  }));
9215
9217
  if (this.controlStateService) {
9216
9218
  this.subscriptions.push(this.controlStateService.statusChanges.subscribe(invalid => {
9217
- this.invalid = this.control.control.touched && invalid === CONTROL_STATE.INVALID;
9219
+ var _a;
9220
+ this.invalid = ((_a = this.control) === null || _a === void 0 ? void 0 : _a.control.touched) && invalid === CONTROL_STATE.INVALID;
9218
9221
  }));
9219
9222
  }
9220
9223
  }
@@ -9485,7 +9488,11 @@ ClrInputContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", vers
9485
9488
  <label *ngIf="!label && addGrid()"></label>
9486
9489
  <div class="clr-control-container" [ngClass]="controlClass()">
9487
9490
  <div class="clr-input-wrapper">
9488
- <ng-content select="[clrInput]"></ng-content>
9491
+ <div class="clr-input-group">
9492
+ <ng-content select="[clrInputPrefix]"></ng-content>
9493
+ <ng-content select="[clrInput]"></ng-content>
9494
+ <ng-content select="[clrInputSuffix]"></ng-content>
9495
+ </div>
9489
9496
  <cds-icon
9490
9497
  *ngIf="showInvalid"
9491
9498
  class="clr-validate-icon"
@@ -9515,7 +9522,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
9515
9522
  <label *ngIf="!label && addGrid()"></label>
9516
9523
  <div class="clr-control-container" [ngClass]="controlClass()">
9517
9524
  <div class="clr-input-wrapper">
9518
- <ng-content select="[clrInput]"></ng-content>
9525
+ <div class="clr-input-group">
9526
+ <ng-content select="[clrInputPrefix]"></ng-content>
9527
+ <ng-content select="[clrInput]"></ng-content>
9528
+ <ng-content select="[clrInputSuffix]"></ng-content>
9529
+ </div>
9519
9530
  <cds-icon
9520
9531
  *ngIf="showInvalid"
9521
9532
  class="clr-validate-icon"
@@ -9555,6 +9566,15 @@ class ClrInput extends WrappedFormControl {
9555
9566
  constructor(vcr, injector, control, renderer, el) {
9556
9567
  super(vcr, ClrInputContainer, injector, control, renderer, el);
9557
9568
  this.index = 1;
9569
+ if (this.el.nativeElement.getAttribute('type') === 'number') {
9570
+ console.warn(`Warning: Inputs of type "number" should utilize the number-input component for proper handling.\n
9571
+ Example usage:
9572
+ <clr-number-input-container>
9573
+ <label>Number Input</label>
9574
+ <input clrNumberInput type="number"/>
9575
+ </clr-number-input-container>
9576
+ `);
9577
+ }
9558
9578
  }
9559
9579
  }
9560
9580
  ClrInput.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrInput, deps: [{ token: i0.ViewContainerRef }, { token: i0.Injector }, { token: i1.NgControl, optional: true, self: true }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
@@ -10132,6 +10152,14 @@ class CalendarViewModel {
10132
10152
  this.setFocusableFlag(day, true);
10133
10153
  this.focusableDay = day;
10134
10154
  }
10155
+ /**
10156
+ * Updates the selected day in the calendar
10157
+ */
10158
+ updateSelectedDay(day) {
10159
+ this.setSelectedDay(this.selectedDay, false);
10160
+ this.selectedDay = day;
10161
+ this.setSelectedDay(day, true);
10162
+ }
10135
10163
  /**
10136
10164
  * Generates a 6x7 matrix of DayViewModel based on the Calendar.
10137
10165
  * The 6x7 matrix is structured according to the first day of the week.
@@ -10221,9 +10249,7 @@ class CalendarViewModel {
10221
10249
  * Initialize the selected day if the day is in the calendar.
10222
10250
  */
10223
10251
  initializeSelectedDay() {
10224
- if (this.selectedDay && this.isDayInCalendarView(this.selectedDay)) {
10225
- this.currMonthDayViews[this.selectedDay.date - 1].isSelected = true;
10226
- }
10252
+ this.setSelectedDay(this.selectedDay, true);
10227
10253
  }
10228
10254
  /**
10229
10255
  * Initializes the focusable day if the day is in the calendar. If focusable day is not set, then
@@ -10252,6 +10278,11 @@ class CalendarViewModel {
10252
10278
  this.currMonthDayViews[day.date - 1].isFocusable = flag;
10253
10279
  }
10254
10280
  }
10281
+ setSelectedDay(day, flag) {
10282
+ if (day && this.isDayInCalendarView(day)) {
10283
+ this.currMonthDayViews[(day === null || day === void 0 ? void 0 : day.date) - 1].isSelected = flag;
10284
+ }
10285
+ }
10255
10286
  }
10256
10287
 
10257
10288
  /*
@@ -10434,6 +10465,7 @@ class CalendarModel {
10434
10465
  */
10435
10466
  class DateNavigationService {
10436
10467
  constructor() {
10468
+ this.hasActionButtons = false;
10437
10469
  this._todaysFullDate = new Date();
10438
10470
  this._selectedDayChange = new Subject();
10439
10471
  this._displayedCalendarChange = new Subject();
@@ -10469,11 +10501,12 @@ class DateNavigationService {
10469
10501
  }
10470
10502
  /**
10471
10503
  * Notifies that the selected day has changed so that the date can be emitted to the user.
10472
- * Note: Only to be called from day.ts
10473
10504
  */
10474
- notifySelectedDayChanged(dayModel) {
10505
+ notifySelectedDayChanged(dayModel, { emitEvent } = { emitEvent: true }) {
10475
10506
  this.selectedDay = dayModel;
10476
- this._selectedDayChange.next(dayModel);
10507
+ if (emitEvent) {
10508
+ this._selectedDayChange.next(dayModel);
10509
+ }
10477
10510
  }
10478
10511
  /**
10479
10512
  * Initializes the calendar based on the selected day.
@@ -10525,6 +10558,9 @@ class DateNavigationService {
10525
10558
  }
10526
10559
  this._focusOnCalendarChange.next();
10527
10560
  }
10561
+ resetSelectedDay() {
10562
+ this.selectedDay = this.persistedDate;
10563
+ }
10528
10564
  // not a setter because i want this to remain private
10529
10565
  setDisplayedCalendar(value) {
10530
10566
  if (!this._displayedCalendar.isEqual(value)) {
@@ -10800,11 +10836,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
10800
10836
  * The full license information can be found in LICENSE in the root directory of this project.
10801
10837
  */
10802
10838
  class ClrDay {
10803
- constructor(_dateNavigationService, _toggleService, dateFormControlService, commonStrings) {
10839
+ constructor(_dateNavigationService, commonStrings) {
10804
10840
  this._dateNavigationService = _dateNavigationService;
10805
- this._toggleService = _toggleService;
10806
- this.dateFormControlService = dateFormControlService;
10807
10841
  this.commonStrings = commonStrings;
10842
+ this.onSelectDay = new EventEmitter();
10808
10843
  }
10809
10844
  /**
10810
10845
  * DayViewModel input which is used to build the Day View.
@@ -10836,13 +10871,11 @@ class ClrDay {
10836
10871
  return;
10837
10872
  }
10838
10873
  const day = this.dayView.dayModel;
10839
- this._dateNavigationService.notifySelectedDayChanged(day);
10840
- this.dateFormControlService.markAsDirty();
10841
- this._toggleService.open = false;
10874
+ this.onSelectDay.emit(day);
10842
10875
  }
10843
10876
  }
10844
- ClrDay.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDay, deps: [{ token: DateNavigationService }, { token: ClrPopoverToggleService }, { token: DateFormControlService }, { token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Component });
10845
- ClrDay.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDay, selector: "clr-day", inputs: { dayView: ["clrDayView", "dayView"] }, host: { properties: { "class.day": "true" } }, ngImport: i0, template: `
10877
+ ClrDay.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDay, deps: [{ token: DateNavigationService }, { token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Component });
10878
+ ClrDay.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDay, selector: "clr-day", inputs: { dayView: ["clrDayView", "dayView"] }, outputs: { onSelectDay: "selectDay" }, host: { properties: { "class.day": "true" } }, ngImport: i0, template: `
10846
10879
  <button
10847
10880
  class="day-btn"
10848
10881
  type="button"
@@ -10884,7 +10917,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
10884
10917
  `,
10885
10918
  host: { '[class.day]': 'true' },
10886
10919
  }]
10887
- }], ctorParameters: function () { return [{ type: DateNavigationService }, { type: ClrPopoverToggleService }, { type: DateFormControlService }, { type: ClrCommonStringsService }]; }, propDecorators: { dayView: [{
10920
+ }], ctorParameters: function () { return [{ type: DateNavigationService }, { type: ClrCommonStringsService }]; }, propDecorators: { onSelectDay: [{
10921
+ type: Output,
10922
+ args: ['selectDay']
10923
+ }], dayView: [{
10888
10924
  type: Input,
10889
10925
  args: ['clrDayView']
10890
10926
  }] } });
@@ -10896,12 +10932,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
10896
10932
  * The full license information can be found in LICENSE in the root directory of this project.
10897
10933
  */
10898
10934
  class ClrCalendar {
10899
- constructor(_localeHelperService, _dateNavigationService, _datepickerFocusService, _dateIOService, _elRef) {
10935
+ constructor(_localeHelperService, _dateNavigationService, _datepickerFocusService, _dateIOService, _elRef, _dateFormControlService, _toggleService) {
10900
10936
  this._localeHelperService = _localeHelperService;
10901
10937
  this._dateNavigationService = _dateNavigationService;
10902
10938
  this._datepickerFocusService = _datepickerFocusService;
10903
10939
  this._dateIOService = _dateIOService;
10904
10940
  this._elRef = _elRef;
10941
+ this._dateFormControlService = _dateFormControlService;
10942
+ this._toggleService = _toggleService;
10905
10943
  this._subs = [];
10906
10944
  this.generateCalendarView();
10907
10945
  this.initializeSubscriptions();
@@ -10963,6 +11001,15 @@ class ClrCalendar {
10963
11001
  }
10964
11002
  }
10965
11003
  }
11004
+ setSelectedDay(day) {
11005
+ const hasActionButtons = this._dateNavigationService.hasActionButtons;
11006
+ this.calendarViewModel.updateSelectedDay(day);
11007
+ this._dateNavigationService.notifySelectedDayChanged(day, { emitEvent: !hasActionButtons });
11008
+ if (!hasActionButtons) {
11009
+ this._dateFormControlService.markAsDirty();
11010
+ this._toggleService.open = false;
11011
+ }
11012
+ }
10966
11013
  /**
10967
11014
  * Initialize subscriptions to:
10968
11015
  * 1. update the calendar view model.
@@ -10987,12 +11034,12 @@ class ClrCalendar {
10987
11034
  this.calendarViewModel = new CalendarViewModel(this.calendar, this.selectedDay, this.focusedDay, this.today, this._localeHelperService.firstDayOfWeek, this._dateIOService.disabledDates);
10988
11035
  }
10989
11036
  }
10990
- ClrCalendar.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrCalendar, deps: [{ token: LocaleHelperService }, { token: DateNavigationService }, { token: DatepickerFocusService }, { token: DateIOService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
10991
- ClrCalendar.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrCalendar, selector: "clr-calendar", host: { listeners: { "keydown": "onKeyDown($event)" } }, ngImport: i0, template: "<table class=\"calendar-table\" role=\"presentation\">\n <tr class=\"calendar-row weekdays\">\n <th *ngFor=\"let day of localeDays\" class=\"calendar-cell weekday\">\n <span [attr.aria-label]=\"day.day\">{{day.narrow}}</span>\n </th>\n </tr>\n <tr class=\"calendar-row\" *ngFor=\"let row of calendarViewModel.calendarView\">\n <td *ngFor=\"let dayView of row\" class=\"calendar-cell\">\n <clr-day [clrDayView]=\"dayView\" aria-hidden=\"true\"></clr-day>\n </td>\n </tr>\n</table>\n", dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ClrDay, selector: "clr-day", inputs: ["clrDayView"] }] });
11037
+ ClrCalendar.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrCalendar, deps: [{ token: LocaleHelperService }, { token: DateNavigationService }, { token: DatepickerFocusService }, { token: DateIOService }, { token: i0.ElementRef }, { token: DateFormControlService }, { token: ClrPopoverToggleService }], target: i0.ɵɵFactoryTarget.Component });
11038
+ ClrCalendar.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrCalendar, selector: "clr-calendar", host: { listeners: { "keydown": "onKeyDown($event)" } }, ngImport: i0, template: "<table class=\"calendar-table\" role=\"presentation\">\n <tr class=\"calendar-row weekdays\">\n <th *ngFor=\"let day of localeDays\" class=\"calendar-cell weekday\">\n <span [attr.aria-label]=\"day.day\">{{day.narrow}}</span>\n </th>\n </tr>\n <tr class=\"calendar-row\" *ngFor=\"let row of calendarViewModel.calendarView\">\n <td *ngFor=\"let dayView of row\" class=\"calendar-cell\">\n <clr-day [clrDayView]=\"dayView\" (selectDay)=\"setSelectedDay($event)\" aria-hidden=\"true\"></clr-day>\n </td>\n </tr>\n</table>\n", dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ClrDay, selector: "clr-day", inputs: ["clrDayView"], outputs: ["selectDay"] }] });
10992
11039
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrCalendar, decorators: [{
10993
11040
  type: Component,
10994
- args: [{ selector: 'clr-calendar', template: "<table class=\"calendar-table\" role=\"presentation\">\n <tr class=\"calendar-row weekdays\">\n <th *ngFor=\"let day of localeDays\" class=\"calendar-cell weekday\">\n <span [attr.aria-label]=\"day.day\">{{day.narrow}}</span>\n </th>\n </tr>\n <tr class=\"calendar-row\" *ngFor=\"let row of calendarViewModel.calendarView\">\n <td *ngFor=\"let dayView of row\" class=\"calendar-cell\">\n <clr-day [clrDayView]=\"dayView\" aria-hidden=\"true\"></clr-day>\n </td>\n </tr>\n</table>\n" }]
10995
- }], ctorParameters: function () { return [{ type: LocaleHelperService }, { type: DateNavigationService }, { type: DatepickerFocusService }, { type: DateIOService }, { type: i0.ElementRef }]; }, propDecorators: { onKeyDown: [{
11041
+ args: [{ selector: 'clr-calendar', template: "<table class=\"calendar-table\" role=\"presentation\">\n <tr class=\"calendar-row weekdays\">\n <th *ngFor=\"let day of localeDays\" class=\"calendar-cell weekday\">\n <span [attr.aria-label]=\"day.day\">{{day.narrow}}</span>\n </th>\n </tr>\n <tr class=\"calendar-row\" *ngFor=\"let row of calendarViewModel.calendarView\">\n <td *ngFor=\"let dayView of row\" class=\"calendar-cell\">\n <clr-day [clrDayView]=\"dayView\" (selectDay)=\"setSelectedDay($event)\" aria-hidden=\"true\"></clr-day>\n </td>\n </tr>\n</table>\n" }]
11042
+ }], ctorParameters: function () { return [{ type: LocaleHelperService }, { type: DateNavigationService }, { type: DatepickerFocusService }, { type: DateIOService }, { type: i0.ElementRef }, { type: DateFormControlService }, { type: ClrPopoverToggleService }]; }, propDecorators: { onKeyDown: [{
10996
11043
  type: HostListener,
10997
11044
  args: ['keydown', ['$event']]
10998
11045
  }] } });
@@ -11571,6 +11618,50 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
11571
11618
  args: [{ selector: 'clr-daypicker', host: { '[class.daypicker]': 'true', role: 'application' }, template: "<div class=\"clr-sr-only\">{{commonStrings.keys.modalContentStart}}</div>\n<div class=\"calendar-header\">\n <div class=\"calendar-pickers\">\n <button\n class=\"calendar-btn monthpicker-trigger\"\n type=\"button\"\n (click)=\"changeToMonthView()\"\n [attr.aria-label]=\"monthAttrString\"\n [attr.title]=\"monthAttrString\"\n >\n {{calendarMonth}}\n </button>\n <button\n class=\"calendar-btn yearpicker-trigger\"\n type=\"button\"\n (click)=\"changeToYearView()\"\n [attr.aria-label]=\"yearAttrString\"\n [attr.title]=\"yearAttrString\"\n >\n {{calendarYear}}\n </button>\n </div>\n <div class=\"calendar-switchers\">\n <button\n class=\"calendar-btn switcher\"\n type=\"button\"\n (click)=\"previousMonth()\"\n [attr.aria-label]=\"commonStrings.keys.datepickerPreviousMonth\"\n >\n <cds-icon shape=\"angle\" direction=\"left\" [attr.title]=\"commonStrings.keys.datepickerPreviousMonth\"></cds-icon>\n </button>\n <button\n class=\"calendar-btn switcher\"\n type=\"button\"\n (click)=\"currentMonth()\"\n [attr.aria-label]=\"commonStrings.keys.datepickerCurrentMonth\"\n >\n <cds-icon shape=\"event\" [attr.title]=\"commonStrings.keys.datepickerCurrentMonth\"></cds-icon>\n </button>\n <button\n class=\"calendar-btn switcher\"\n type=\"button\"\n (click)=\"nextMonth()\"\n [attr.aria-label]=\"commonStrings.keys.datepickerNextMonth\"\n >\n <cds-icon shape=\"angle\" direction=\"right\" [attr.title]=\"commonStrings.keys.datepickerNextMonth\"></cds-icon>\n </button>\n </div>\n</div>\n<clr-calendar></clr-calendar>\n<div class=\"clr-sr-only\">{{commonStrings.keys.modalContentEnd}}</div>\n" }]
11572
11619
  }], ctorParameters: function () { return [{ type: ViewManagerService }, { type: DateNavigationService }, { type: LocaleHelperService }, { type: ClrCommonStringsService }]; } });
11573
11620
 
11621
+ /*
11622
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
11623
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
11624
+ * This software is released under MIT license.
11625
+ * The full license information can be found in LICENSE in the root directory of this project.
11626
+ */
11627
+ class ClrDatepickerActions {
11628
+ constructor(commonStrings, toggleService, dateNavigationService, dateFormControlService) {
11629
+ this.commonStrings = commonStrings;
11630
+ this.toggleService = toggleService;
11631
+ this.dateNavigationService = dateNavigationService;
11632
+ this.dateFormControlService = dateFormControlService;
11633
+ }
11634
+ apply() {
11635
+ if (this.dateNavigationService.selectedDay) {
11636
+ this.dateNavigationService.notifySelectedDayChanged(this.dateNavigationService.selectedDay);
11637
+ this.dateFormControlService.markAsDirty();
11638
+ }
11639
+ this.toggleService.open = false;
11640
+ }
11641
+ cancel() {
11642
+ this.dateNavigationService.resetSelectedDay();
11643
+ this.toggleService.open = false;
11644
+ }
11645
+ }
11646
+ ClrDatepickerActions.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatepickerActions, deps: [{ token: ClrCommonStringsService }, { token: ClrPopoverToggleService }, { token: DateNavigationService }, { token: DateFormControlService }], target: i0.ɵɵFactoryTarget.Component });
11647
+ ClrDatepickerActions.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatepickerActions, selector: "clr-datepicker-actions", host: { properties: { "class.datepicker-actions": "true" } }, ngImport: i0, template: `
11648
+ <button class="btn btn-outline" (click)="cancel()">{{ commonStrings.keys.cancel }}</button>
11649
+ <button class="btn btn-primary" (click)="apply()">{{ commonStrings.keys.apply }}</button>
11650
+ `, isInline: true });
11651
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatepickerActions, decorators: [{
11652
+ type: Component,
11653
+ args: [{
11654
+ selector: 'clr-datepicker-actions',
11655
+ template: `
11656
+ <button class="btn btn-outline" (click)="cancel()">{{ commonStrings.keys.cancel }}</button>
11657
+ <button class="btn btn-primary" (click)="apply()">{{ commonStrings.keys.apply }}</button>
11658
+ `,
11659
+ host: {
11660
+ '[class.datepicker-actions]': 'true',
11661
+ },
11662
+ }]
11663
+ }], ctorParameters: function () { return [{ type: ClrCommonStringsService }, { type: ClrPopoverToggleService }, { type: DateNavigationService }, { type: DateFormControlService }]; } });
11664
+
11574
11665
  /*
11575
11666
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
11576
11667
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -11578,9 +11669,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
11578
11669
  * The full license information can be found in LICENSE in the root directory of this project.
11579
11670
  */
11580
11671
  class ClrDatepickerViewManager {
11581
- constructor(commonStrings, viewManagerService) {
11672
+ constructor(commonStrings, viewManagerService, dateNavigationService) {
11582
11673
  this.commonStrings = commonStrings;
11583
11674
  this.viewManagerService = viewManagerService;
11675
+ this.dateNavigationService = dateNavigationService;
11584
11676
  }
11585
11677
  /**
11586
11678
  * Returns if the current view is the monthpicker.
@@ -11600,18 +11692,22 @@ class ClrDatepickerViewManager {
11600
11692
  get isDayView() {
11601
11693
  return this.viewManagerService.isDayView;
11602
11694
  }
11695
+ get hasActionButtons() {
11696
+ return this.dateNavigationService.hasActionButtons;
11697
+ }
11603
11698
  }
11604
- 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 });
11605
- 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" }] });
11699
+ ClrDatepickerViewManager.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatepickerViewManager, deps: [{ token: ClrCommonStringsService }, { token: ViewManagerService }, { token: DateNavigationService }], target: i0.ɵɵFactoryTarget.Component });
11700
+ 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", "class.has-action-buttons": "hasActionButtons", "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<clr-datepicker-actions *ngIf=\"hasActionButtons\"></clr-datepicker-actions>\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" }, { kind: "component", type: ClrDatepickerActions, selector: "clr-datepicker-actions" }] });
11606
11701
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatepickerViewManager, decorators: [{
11607
11702
  type: Component,
11608
11703
  args: [{ selector: 'clr-datepicker-view-manager', providers: [DatepickerFocusService], host: {
11609
11704
  '[class.datepicker]': 'true',
11705
+ '[class.has-action-buttons]': 'hasActionButtons',
11610
11706
  '[attr.aria-modal]': 'true',
11611
11707
  '[attr.aria-label]': 'commonStrings.keys.datepickerDialogLabel',
11612
11708
  role: 'dialog',
11613
- }, 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" }]
11614
- }], ctorParameters: function () { return [{ type: ClrCommonStringsService }, { type: ViewManagerService }]; } });
11709
+ }, 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<clr-datepicker-actions *ngIf=\"hasActionButtons\"></clr-datepicker-actions>\n" }]
11710
+ }], ctorParameters: function () { return [{ type: ClrCommonStringsService }, { type: ViewManagerService }, { type: DateNavigationService }]; } });
11615
11711
 
11616
11712
  /*
11617
11713
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
@@ -11642,6 +11738,9 @@ class ClrDateContainer extends ClrAbstractContainer {
11642
11738
  dateFormControlService.markAsTouched();
11643
11739
  }));
11644
11740
  }
11741
+ set showActionButtons(flag) {
11742
+ this.dateNavigationService.hasActionButtons = flag;
11743
+ }
11645
11744
  set clrPosition(position) {
11646
11745
  if (position && ClrPopoverPositions[position]) {
11647
11746
  this.viewManagerService.position = ClrPopoverPositions[position];
@@ -11676,6 +11775,7 @@ class ClrDateContainer extends ClrAbstractContainer {
11676
11775
  }
11677
11776
  else {
11678
11777
  this.toggleButton.nativeElement.focus();
11778
+ this.dateNavigationService.resetSelectedDay();
11679
11779
  }
11680
11780
  }));
11681
11781
  this.subscriptions.push(this.listenForDateChanges());
@@ -11716,7 +11816,7 @@ class ClrDateContainer extends ClrAbstractContainer {
11716
11816
  }
11717
11817
  }
11718
11818
  ClrDateContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDateContainer, deps: [{ token: i0.Renderer2 }, { token: ClrPopoverToggleService }, { token: DateNavigationService }, { token: DatepickerEnabledService }, { token: DateFormControlService }, { token: DateIOService }, { token: ClrCommonStringsService }, { token: FocusService }, { token: ViewManagerService }, { token: ControlClassService }, { token: LayoutService, optional: true }, { token: NgControlService }, { token: IfControlStateService }], target: i0.ɵɵFactoryTarget.Component });
11719
- ClrDateContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDateContainer, selector: "clr-date-container", inputs: { clrPosition: "clrPosition" }, host: { properties: { "class.clr-date-container": "true", "class.clr-form-control-disabled": "isInputDateDisabled", "class.clr-form-control": "true", "class.clr-row": "addGrid()" } }, providers: [
11819
+ ClrDateContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDateContainer, selector: "clr-date-container", inputs: { showActionButtons: "showActionButtons", clrPosition: "clrPosition" }, host: { properties: { "class.clr-date-container": "true", "class.clr-form-control-disabled": "isInputDateDisabled", "class.clr-form-control": "true", "class.clr-row": "addGrid()" } }, providers: [
11720
11820
  ControlIdService,
11721
11821
  LocaleHelperService,
11722
11822
  ControlClassService,
@@ -11841,7 +11941,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
11841
11941
  return [{ type: i0.Renderer2 }, { type: ClrPopoverToggleService }, { type: DateNavigationService }, { type: DatepickerEnabledService }, { type: DateFormControlService }, { type: DateIOService }, { type: ClrCommonStringsService }, { type: FocusService }, { type: ViewManagerService }, { type: ControlClassService }, { type: LayoutService, decorators: [{
11842
11942
  type: Optional
11843
11943
  }] }, { type: NgControlService }, { type: IfControlStateService }];
11844
- }, propDecorators: { clrPosition: [{
11944
+ }, propDecorators: { showActionButtons: [{
11945
+ type: Input,
11946
+ args: ['showActionButtons']
11947
+ }], clrPosition: [{
11845
11948
  type: Input,
11846
11949
  args: ['clrPosition']
11847
11950
  }], actionButton: [{
@@ -11989,7 +12092,7 @@ class ClrDateInput extends WrappedFormControl {
11989
12092
  this.previousDateChange = date;
11990
12093
  }
11991
12094
  if (this.dateNavigationService) {
11992
- this.dateNavigationService.selectedDay = date
12095
+ this.dateNavigationService.persistedDate = this.dateNavigationService.selectedDay = date
11993
12096
  ? new DayModel(date.getFullYear(), date.getMonth(), date.getDate())
11994
12097
  : null;
11995
12098
  }
@@ -12038,7 +12141,7 @@ class ClrDateInput extends WrappedFormControl {
12038
12141
  }
12039
12142
  listenForControlValueChanges() {
12040
12143
  return of(this.datepickerHasFormControl())
12041
- .pipe(filter(hasControl => hasControl), switchMap(() => this.control.valueChanges),
12144
+ .pipe(filter(hasControl => hasControl), switchMap$1(() => this.control.valueChanges),
12042
12145
  // only update date value if not being set by user
12043
12146
  filter(() => !this.datepickerFocusService.elementIsFocused(this.el.nativeElement)))
12044
12147
  .subscribe((value) => this.updateDate(this.dateIOService.getDateValueFromDateString(value)));
@@ -12184,6 +12287,7 @@ const CLR_DATEPICKER_DIRECTIVES = [
12184
12287
  ClrYearpicker,
12185
12288
  ClrDaypicker,
12186
12289
  ClrCalendar,
12290
+ ClrDatepickerActions,
12187
12291
  ];
12188
12292
  class ClrDatepickerModule {
12189
12293
  constructor() {
@@ -12199,7 +12303,8 @@ ClrDatepickerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", ver
12199
12303
  ClrMonthpicker,
12200
12304
  ClrYearpicker,
12201
12305
  ClrDaypicker,
12202
- ClrCalendar], imports: [CommonModule,
12306
+ ClrCalendar,
12307
+ ClrDatepickerActions], imports: [CommonModule,
12203
12308
  CdkTrapFocusModule,
12204
12309
  ClrHostWrappingModule,
12205
12310
  ClrConditionalModule,
@@ -12213,7 +12318,8 @@ ClrDatepickerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", ver
12213
12318
  ClrMonthpicker,
12214
12319
  ClrYearpicker,
12215
12320
  ClrDaypicker,
12216
- ClrCalendar] });
12321
+ ClrCalendar,
12322
+ ClrDatepickerActions] });
12217
12323
  ClrDatepickerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatepickerModule, imports: [CommonModule,
12218
12324
  CdkTrapFocusModule,
12219
12325
  ClrHostWrappingModule,
@@ -12238,6 +12344,258 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12238
12344
  }]
12239
12345
  }], ctorParameters: function () { return []; } });
12240
12346
 
12347
+ /*
12348
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12349
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
12350
+ * This software is released under MIT license.
12351
+ * The full license information can be found in LICENSE in the root directory of this project.
12352
+ */
12353
+ function buildFileList(files) {
12354
+ const dataTransfer = new DataTransfer();
12355
+ for (const file of files) {
12356
+ dataTransfer.items.add(file);
12357
+ }
12358
+ return dataTransfer.files;
12359
+ }
12360
+ function selectFiles(fileInputElement, files) {
12361
+ fileInputElement.files = files instanceof FileList ? files : buildFileList(files);
12362
+ fileInputElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
12363
+ }
12364
+ function clearFiles(fileInputElement) {
12365
+ fileInputElement.value = '';
12366
+ fileInputElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
12367
+ }
12368
+
12369
+ /*
12370
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12371
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
12372
+ * This software is released under MIT license.
12373
+ * The full license information can be found in LICENSE in the root directory of this project.
12374
+ */
12375
+ const CLR_FILE_MESSAGES_TEMPLATE_CONTEXT = new InjectionToken('ClrFileMessagesTemplateContext');
12376
+ class ClrFileInfo {
12377
+ }
12378
+ ClrFileInfo.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInfo, deps: [], target: i0.ɵɵFactoryTarget.Component });
12379
+ ClrFileInfo.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrFileInfo, selector: "clr-file-info", host: { properties: { "class.clr-subtext": "true" } }, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true });
12380
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInfo, decorators: [{
12381
+ type: Component,
12382
+ args: [{
12383
+ selector: 'clr-file-info',
12384
+ template: `<ng-content></ng-content>`,
12385
+ host: {
12386
+ '[class.clr-subtext]': 'true',
12387
+ },
12388
+ }]
12389
+ }] });
12390
+ class ClrFileSuccess {
12391
+ constructor() {
12392
+ this.context = inject(CLR_FILE_MESSAGES_TEMPLATE_CONTEXT);
12393
+ }
12394
+ }
12395
+ ClrFileSuccess.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileSuccess, deps: [], target: i0.ɵɵFactoryTarget.Component });
12396
+ ClrFileSuccess.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrFileSuccess, selector: "clr-file-success", host: { properties: { "style.display": "context.success ? \"inline-block\" : \"none\"", "class.clr-subtext": "true", "class.success": "true" } }, ngImport: i0, template: `<ng-content *ngIf="context.success"></ng-content>`, isInline: true, dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
12397
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileSuccess, decorators: [{
12398
+ type: Component,
12399
+ args: [{
12400
+ selector: 'clr-file-success',
12401
+ // We check for success here so that consumers don't have to.
12402
+ template: `<ng-content *ngIf="context.success"></ng-content>`,
12403
+ host: {
12404
+ '[style.display]': 'context.success ? "inline-block" : "none"',
12405
+ '[class.clr-subtext]': 'true',
12406
+ '[class.success]': 'true',
12407
+ },
12408
+ }]
12409
+ }] });
12410
+ class ClrFileError {
12411
+ }
12412
+ ClrFileError.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileError, deps: [], target: i0.ɵɵFactoryTarget.Component });
12413
+ ClrFileError.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrFileError, selector: "clr-file-error", host: { properties: { "class.clr-subtext": "true", "class.error": "true" } }, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true });
12414
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileError, decorators: [{
12415
+ type: Component,
12416
+ args: [{
12417
+ selector: 'clr-file-error',
12418
+ // The host should have an `*ngIf` or `@if` that checks for the relevant error.
12419
+ template: `<ng-content></ng-content>`,
12420
+ host: {
12421
+ '[class.clr-subtext]': 'true',
12422
+ '[class.error]': 'true',
12423
+ },
12424
+ }]
12425
+ }] });
12426
+
12427
+ /*
12428
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12429
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
12430
+ * This software is released under MIT license.
12431
+ * The full license information can be found in LICENSE in the root directory of this project.
12432
+ */
12433
+ class ClrFileMessagesTemplate {
12434
+ constructor() {
12435
+ this.templateRef = inject(TemplateRef);
12436
+ }
12437
+ static ngTemplateContextGuard(directive, context) {
12438
+ return true;
12439
+ }
12440
+ }
12441
+ ClrFileMessagesTemplate.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileMessagesTemplate, deps: [], target: i0.ɵɵFactoryTarget.Directive });
12442
+ ClrFileMessagesTemplate.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrFileMessagesTemplate, selector: "ng-template[clr-file-messages]", ngImport: i0 });
12443
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileMessagesTemplate, decorators: [{
12444
+ type: Directive,
12445
+ args: [{
12446
+ selector: 'ng-template[clr-file-messages]',
12447
+ }]
12448
+ }] });
12449
+
12450
+ /*
12451
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12452
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
12453
+ * This software is released under MIT license.
12454
+ * The full license information can be found in LICENSE in the root directory of this project.
12455
+ */
12456
+ class ClrFileList {
12457
+ constructor() {
12458
+ this.injector = inject(Injector);
12459
+ this.commonStrings = inject(ClrCommonStringsService);
12460
+ this.ngControlService = inject(NgControlService, { optional: true });
12461
+ this.fileInputContainer = inject(ClrFileInputContainer, { optional: true });
12462
+ if (!this.ngControlService || !this.fileInputContainer) {
12463
+ throw new Error('The clr-file-list component can only be used within a clr-file-input-container.');
12464
+ }
12465
+ }
12466
+ get files() {
12467
+ if (!this.fileInputContainer.fileInput) {
12468
+ return [];
12469
+ }
12470
+ const fileInputElement = this.fileInputContainer.fileInput.elementRef.nativeElement;
12471
+ return Array.from(fileInputElement.files).sort((a, b) => a.name.localeCompare(b.name));
12472
+ }
12473
+ getClearFileLabel(filename) {
12474
+ return this.commonStrings.parse(this.commonStrings.keys.clearFile, {
12475
+ FILE: filename,
12476
+ });
12477
+ }
12478
+ clearFile(fileToRemove) {
12479
+ if (!this.fileInputContainer.fileInput) {
12480
+ return;
12481
+ }
12482
+ const fileInputElement = this.fileInputContainer.fileInput.elementRef.nativeElement;
12483
+ const files = Array.from(fileInputElement.files);
12484
+ const newFiles = files.filter(file => file !== fileToRemove);
12485
+ selectFiles(fileInputElement, newFiles);
12486
+ this.fileInputContainer.focusBrowseButton();
12487
+ }
12488
+ createFileMessagesTemplateContext(file) {
12489
+ var _a, _b, _c;
12490
+ const fileInputErrors = this.ngControlService.control.errors || {};
12491
+ const errors = {
12492
+ accept: (_a = fileInputErrors.accept) === null || _a === void 0 ? void 0 : _a.find(error => error.name === file.name),
12493
+ minFileSize: (_b = fileInputErrors.minFileSize) === null || _b === void 0 ? void 0 : _b.find(error => error.name === file.name),
12494
+ maxFileSize: (_c = fileInputErrors.maxFileSize) === null || _c === void 0 ? void 0 : _c.find(error => error.name === file.name),
12495
+ };
12496
+ const success = Object.values(errors).every(error => !error);
12497
+ return { $implicit: file, success, errors };
12498
+ }
12499
+ createFileMessagesTemplateInjector(fileMessagesTemplateContext) {
12500
+ return Injector.create({
12501
+ parent: this.injector,
12502
+ providers: [{ provide: CLR_FILE_MESSAGES_TEMPLATE_CONTEXT, useValue: fileMessagesTemplateContext }],
12503
+ });
12504
+ }
12505
+ }
12506
+ ClrFileList.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileList, deps: [], target: i0.ɵɵFactoryTarget.Component });
12507
+ ClrFileList.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrFileList, selector: "clr-file-list", host: { properties: { "attr.role": "\"list\"", "class.clr-file-list": "true" } }, queries: [{ propertyName: "fileMessagesTemplate", first: true, predicate: ClrFileMessagesTemplate, descendants: true }], ngImport: i0, template: `
12508
+ <ng-container *ngFor="let file of files">
12509
+ <div
12510
+ *ngIf="createFileMessagesTemplateContext(file); let fileMessagesTemplateContext"
12511
+ role="listitem"
12512
+ class="clr-file-list-item"
12513
+ [ngClass]="{
12514
+ 'clr-error': !fileMessagesTemplateContext.success,
12515
+ 'clr-success': fileMessagesTemplateContext.success
12516
+ }"
12517
+ >
12518
+ <div class="clr-file-label-and-status-icon">
12519
+ <span class="label clr-file-label">
12520
+ {{ file.name }}
12521
+ <button
12522
+ class="btn btn-sm btn-link-neutral btn-icon clr-file-clear-button"
12523
+ [attr.aria-label]="getClearFileLabel(file.name)"
12524
+ (click)="clearFile(file)"
12525
+ >
12526
+ <cds-icon shape="times"></cds-icon>
12527
+ </button>
12528
+ </span>
12529
+
12530
+ <cds-icon
12531
+ class="clr-validate-icon"
12532
+ [attr.shape]="fileMessagesTemplateContext.success ? 'check-circle' : 'exclamation-circle'"
12533
+ [attr.status]="fileMessagesTemplateContext.success ? 'success' : 'danger'"
12534
+ aria-hidden="true"
12535
+ ></cds-icon>
12536
+ </div>
12537
+
12538
+ <ng-container
12539
+ [ngTemplateOutlet]="fileMessagesTemplate.templateRef"
12540
+ [ngTemplateOutletContext]="fileMessagesTemplateContext"
12541
+ [ngTemplateOutletInjector]="createFileMessagesTemplateInjector(fileMessagesTemplateContext)"
12542
+ ></ng-container>
12543
+ </div>
12544
+ </ng-container>
12545
+ `, isInline: true, dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: CdsIconCustomTag, selector: "cds-icon" }] });
12546
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileList, decorators: [{
12547
+ type: Component,
12548
+ args: [{
12549
+ selector: 'clr-file-list',
12550
+ template: `
12551
+ <ng-container *ngFor="let file of files">
12552
+ <div
12553
+ *ngIf="createFileMessagesTemplateContext(file); let fileMessagesTemplateContext"
12554
+ role="listitem"
12555
+ class="clr-file-list-item"
12556
+ [ngClass]="{
12557
+ 'clr-error': !fileMessagesTemplateContext.success,
12558
+ 'clr-success': fileMessagesTemplateContext.success
12559
+ }"
12560
+ >
12561
+ <div class="clr-file-label-and-status-icon">
12562
+ <span class="label clr-file-label">
12563
+ {{ file.name }}
12564
+ <button
12565
+ class="btn btn-sm btn-link-neutral btn-icon clr-file-clear-button"
12566
+ [attr.aria-label]="getClearFileLabel(file.name)"
12567
+ (click)="clearFile(file)"
12568
+ >
12569
+ <cds-icon shape="times"></cds-icon>
12570
+ </button>
12571
+ </span>
12572
+
12573
+ <cds-icon
12574
+ class="clr-validate-icon"
12575
+ [attr.shape]="fileMessagesTemplateContext.success ? 'check-circle' : 'exclamation-circle'"
12576
+ [attr.status]="fileMessagesTemplateContext.success ? 'success' : 'danger'"
12577
+ aria-hidden="true"
12578
+ ></cds-icon>
12579
+ </div>
12580
+
12581
+ <ng-container
12582
+ [ngTemplateOutlet]="fileMessagesTemplate.templateRef"
12583
+ [ngTemplateOutletContext]="fileMessagesTemplateContext"
12584
+ [ngTemplateOutletInjector]="createFileMessagesTemplateInjector(fileMessagesTemplateContext)"
12585
+ ></ng-container>
12586
+ </div>
12587
+ </ng-container>
12588
+ `,
12589
+ host: {
12590
+ '[attr.role]': '"list"',
12591
+ '[class.clr-file-list]': 'true',
12592
+ },
12593
+ }]
12594
+ }], ctorParameters: function () { return []; }, propDecorators: { fileMessagesTemplate: [{
12595
+ type: ContentChild,
12596
+ args: [ClrFileMessagesTemplate]
12597
+ }] } });
12598
+
12241
12599
  /*
12242
12600
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12243
12601
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -12249,29 +12607,80 @@ class ClrFileInputContainer extends ClrAbstractContainer {
12249
12607
  super(...arguments);
12250
12608
  this.commonStrings = inject(ClrCommonStringsService);
12251
12609
  }
12610
+ get accept() {
12611
+ return this.fileInput.elementRef.nativeElement.accept;
12612
+ }
12613
+ get multiple() {
12614
+ return this.fileInput.elementRef.nativeElement.multiple;
12615
+ }
12252
12616
  get disabled() {
12253
12617
  return this.fileInput.elementRef.nativeElement.disabled;
12254
12618
  }
12619
+ get browseButtonText() {
12620
+ var _a, _b;
12621
+ const selectionButtonLabel = this.fileList ? undefined : (_b = (_a = this.fileInput) === null || _a === void 0 ? void 0 : _a.selection) === null || _b === void 0 ? void 0 : _b.buttonLabel;
12622
+ return selectionButtonLabel || this.customButtonLabel || this.commonStrings.keys.browse;
12623
+ }
12255
12624
  get browseButtonDescribedBy() {
12256
12625
  var _a;
12257
- return `${(_a = this.label) === null || _a === void 0 ? void 0 : _a.idAttr} ${this.fileInput.elementRef.nativeElement.getAttribute('aria-describedby')}`;
12626
+ return `${(_a = this.label) === null || _a === void 0 ? void 0 : _a.forAttr} ${this.fileInput.elementRef.nativeElement.getAttribute('aria-describedby')}`;
12627
+ }
12628
+ get successMessagePresent() {
12629
+ return super.successMessagePresent || !!this.fileSuccessComponent;
12630
+ }
12631
+ get errorMessagePresent() {
12632
+ return super.errorMessagePresent || !!this.fileErrorComponent;
12633
+ }
12634
+ focusBrowseButton() {
12635
+ this.browseButtonElementRef.nativeElement.focus();
12258
12636
  }
12259
12637
  browse() {
12260
- this.fileInput.elementRef.nativeElement.click();
12638
+ const fileInputElementRef = this.fileList && this.multiple ? this.fileListFileInputElementRef : this.fileInput.elementRef;
12639
+ fileInputElementRef.nativeElement.click();
12261
12640
  }
12262
12641
  clearSelectedFiles() {
12263
12642
  this.fileInput.elementRef.nativeElement.value = '';
12264
12643
  this.fileInput.elementRef.nativeElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
12265
- this.browseButtonElementRef.nativeElement.focus();
12644
+ this.focusBrowseButton();
12645
+ }
12646
+ addFilesToSelection(newFiles) {
12647
+ if (!newFiles.length) {
12648
+ return;
12649
+ }
12650
+ // start with new files
12651
+ const mergedFiles = [...newFiles];
12652
+ // add existing files if a new file doesn't have the same name
12653
+ for (const existingFile of this.fileInput.elementRef.nativeElement.files) {
12654
+ if (!mergedFiles.some(file => file.name === existingFile.name)) {
12655
+ mergedFiles.push(existingFile);
12656
+ }
12657
+ }
12658
+ // update file selection
12659
+ selectFiles(this.fileInput.elementRef.nativeElement, mergedFiles);
12266
12660
  }
12267
12661
  }
12268
12662
  ClrFileInputContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputContainer, deps: null, target: i0.ɵɵFactoryTarget.Component });
12269
- 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: `
12663
+ 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 }, { propertyName: "fileList", first: true, predicate: i0.forwardRef(function () { return ClrFileList; }), descendants: true }, { propertyName: "fileSuccessComponent", first: true, predicate: ClrFileSuccess, descendants: true }, { propertyName: "fileErrorComponent", first: true, predicate: ClrFileError, descendants: true }], viewQueries: [{ propertyName: "browseButtonElementRef", first: true, predicate: ["browseButton"], descendants: true }, { propertyName: "fileListFileInputElementRef", first: true, predicate: ["fileListFileInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
12270
12664
  <ng-content select="label"></ng-content>
12271
12665
  <label *ngIf="!label && addGrid()"></label>
12272
12666
  <div class="clr-control-container" [ngClass]="controlClass()">
12273
12667
  <div class="clr-file-input-wrapper">
12274
12668
  <ng-content select="[clrFileInput]"></ng-content>
12669
+
12670
+ <!-- file input to handle adding new files to selection when file list is present (prevent replacing selected files on the main file input) -->
12671
+ <input
12672
+ *ngIf="fileList"
12673
+ #fileListFileInput
12674
+ type="file"
12675
+ class="clr-file-input"
12676
+ tabindex="-1"
12677
+ aria-hidden="true"
12678
+ [accept]="accept"
12679
+ [multiple]="multiple"
12680
+ [disabled]="disabled"
12681
+ (change)="addFilesToSelection(fileListFileInput.files)"
12682
+ />
12683
+
12275
12684
  <button
12276
12685
  #browseButton
12277
12686
  type="button"
@@ -12281,12 +12690,10 @@ ClrFileInputContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0",
12281
12690
  (click)="browse()"
12282
12691
  >
12283
12692
  <cds-icon shape="folder-open"></cds-icon>
12284
- <span class="clr-file-input-browse-button-text">
12285
- {{ fileInput?.selection?.buttonLabel || customButtonLabel || commonStrings.keys.browse }}
12286
- </span>
12693
+ <span class="clr-file-input-browse-button-text">{{ browseButtonText }}</span>
12287
12694
  </button>
12288
12695
  <button
12289
- *ngIf="fileInput?.selection?.fileCount"
12696
+ *ngIf="!fileList && fileInput?.selection?.fileCount"
12290
12697
  type="button"
12291
12698
  class="btn btn-sm clr-file-input-clear-button"
12292
12699
  [attr.aria-label]="fileInput?.selection?.clearFilesButtonLabel"
@@ -12312,6 +12719,12 @@ ClrFileInputContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0",
12312
12719
  <ng-content select="clr-control-helper" *ngIf="showHelper"></ng-content>
12313
12720
  <ng-content select="clr-control-error" *ngIf="showInvalid"></ng-content>
12314
12721
  <ng-content select="clr-control-success" *ngIf="showValid"></ng-content>
12722
+
12723
+ <!-- If this is present, this file input becomes an "advanced" file input. -->
12724
+ <ng-container>
12725
+ <div class="clr-file-list-break"></div>
12726
+ <ng-content select="clr-file-list"></ng-content>
12727
+ </ng-container>
12315
12728
  </div>
12316
12729
  `, 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: ["id", "for"] }] });
12317
12730
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputContainer, decorators: [{
@@ -12324,6 +12737,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12324
12737
  <div class="clr-control-container" [ngClass]="controlClass()">
12325
12738
  <div class="clr-file-input-wrapper">
12326
12739
  <ng-content select="[clrFileInput]"></ng-content>
12740
+
12741
+ <!-- file input to handle adding new files to selection when file list is present (prevent replacing selected files on the main file input) -->
12742
+ <input
12743
+ *ngIf="fileList"
12744
+ #fileListFileInput
12745
+ type="file"
12746
+ class="clr-file-input"
12747
+ tabindex="-1"
12748
+ aria-hidden="true"
12749
+ [accept]="accept"
12750
+ [multiple]="multiple"
12751
+ [disabled]="disabled"
12752
+ (change)="addFilesToSelection(fileListFileInput.files)"
12753
+ />
12754
+
12327
12755
  <button
12328
12756
  #browseButton
12329
12757
  type="button"
@@ -12333,12 +12761,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12333
12761
  (click)="browse()"
12334
12762
  >
12335
12763
  <cds-icon shape="folder-open"></cds-icon>
12336
- <span class="clr-file-input-browse-button-text">
12337
- {{ fileInput?.selection?.buttonLabel || customButtonLabel || commonStrings.keys.browse }}
12338
- </span>
12764
+ <span class="clr-file-input-browse-button-text">{{ browseButtonText }}</span>
12339
12765
  </button>
12340
12766
  <button
12341
- *ngIf="fileInput?.selection?.fileCount"
12767
+ *ngIf="!fileList && fileInput?.selection?.fileCount"
12342
12768
  type="button"
12343
12769
  class="btn btn-sm clr-file-input-clear-button"
12344
12770
  [attr.aria-label]="fileInput?.selection?.clearFilesButtonLabel"
@@ -12364,6 +12790,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12364
12790
  <ng-content select="clr-control-helper" *ngIf="showHelper"></ng-content>
12365
12791
  <ng-content select="clr-control-error" *ngIf="showInvalid"></ng-content>
12366
12792
  <ng-content select="clr-control-success" *ngIf="showValid"></ng-content>
12793
+
12794
+ <!-- If this is present, this file input becomes an "advanced" file input. -->
12795
+ <ng-container>
12796
+ <div class="clr-file-list-break"></div>
12797
+ <ng-content select="clr-file-list"></ng-content>
12798
+ </ng-container>
12367
12799
  </div>
12368
12800
  `,
12369
12801
  host: {
@@ -12379,9 +12811,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12379
12811
  }], fileInput: [{
12380
12812
  type: ContentChild,
12381
12813
  args: [forwardRef(() => ClrFileInput)]
12814
+ }], fileList: [{
12815
+ type: ContentChild,
12816
+ args: [forwardRef(() => ClrFileList)]
12382
12817
  }], browseButtonElementRef: [{
12383
12818
  type: ViewChild,
12384
12819
  args: ['browseButton']
12820
+ }], fileListFileInputElementRef: [{
12821
+ type: ViewChild,
12822
+ args: ['fileListFileInput']
12823
+ }], fileSuccessComponent: [{
12824
+ type: ContentChild,
12825
+ args: [ClrFileSuccess]
12826
+ }], fileErrorComponent: [{
12827
+ type: ContentChild,
12828
+ args: [ClrFileError]
12385
12829
  }] } });
12386
12830
 
12387
12831
  /*
@@ -12428,13 +12872,14 @@ class ClrFileInput extends WrappedFormControl {
12428
12872
  }
12429
12873
  }
12430
12874
  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 });
12431
- ClrFileInput.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrFileInput, selector: "input[type=\"file\"][clrFileInput]", host: { attributes: { "tabindex": "-1" }, listeners: { "change": "handleChange()" }, properties: { "class.clr-file-input": "true" } }, usesInheritance: true, ngImport: i0 });
12875
+ ClrFileInput.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrFileInput, selector: "input[type=\"file\"][clrFileInput]", host: { attributes: { "tabindex": "-1", "aria-hidden": "true" }, listeners: { "change": "handleChange()" }, properties: { "class.clr-file-input": "true" } }, usesInheritance: true, ngImport: i0 });
12432
12876
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInput, decorators: [{
12433
12877
  type: Directive,
12434
12878
  args: [{
12435
12879
  selector: 'input[type="file"][clrFileInput]',
12436
12880
  host: {
12437
12881
  tabindex: '-1',
12882
+ 'aria-hidden': 'true',
12438
12883
  '[class.clr-file-input]': 'true',
12439
12884
  },
12440
12885
  }]
@@ -12467,33 +12912,25 @@ class ClrFileInputValidator {
12467
12912
  if (fileInputElement.required && (files === null || files === void 0 ? void 0 : files.length) === 0) {
12468
12913
  errors.required = true;
12469
12914
  }
12470
- // accept validation (native attribute)
12471
- if (fileInputElement.accept && (files === null || files === void 0 ? void 0 : files.length) > 0) {
12472
- const accept = fileInputElement.accept.split(',').map(type => type.trim());
12915
+ const accept = fileInputElement.accept ? fileInputElement.accept.split(',').map(type => type.trim()) : null;
12916
+ if ((files === null || files === void 0 ? void 0 : files.length) > 0 && (accept || this.minFileSize || this.maxFileSize)) {
12473
12917
  for (let i = 0; i < files.length; i++) {
12474
12918
  const file = files.item(i);
12475
- const [fileExtension] = file.name.match(/\..+$/);
12476
- if (!accept.includes(file.type) && !accept.includes(fileExtension)) {
12477
- errors.accept = errors.accept || [];
12478
- errors.accept.push({ name: file.name, accept, type: file.type, extension: fileExtension });
12919
+ // accept validation (native attribute)
12920
+ if (accept) {
12921
+ const [fileExtension] = file.name.match(/\..+$/);
12922
+ if (!accept.includes(file.type) && !accept.includes(fileExtension)) {
12923
+ errors.accept = errors.accept || [];
12924
+ errors.accept.push({ name: file.name, accept, type: file.type, extension: fileExtension });
12925
+ }
12479
12926
  }
12480
- }
12481
- }
12482
- // min file validation (custom input)
12483
- if (this.minFileSize && (files === null || files === void 0 ? void 0 : files.length) > 0) {
12484
- for (let i = 0; i < files.length; i++) {
12485
- const file = files.item(i);
12486
- if (file.size < this.minFileSize) {
12927
+ // min file validation (custom input)
12928
+ if (this.minFileSize && file.size < this.minFileSize) {
12487
12929
  errors.minFileSize = errors.minFileSize || [];
12488
12930
  errors.minFileSize.push({ name: file.name, minFileSize: this.minFileSize, actualFileSize: file.size });
12489
12931
  }
12490
- }
12491
- }
12492
- // max file validation (custom input)
12493
- if (this.maxFileSize && (files === null || files === void 0 ? void 0 : files.length) > 0) {
12494
- for (let i = 0; i < files.length; i++) {
12495
- const file = files.item(i);
12496
- if (file.size > this.maxFileSize) {
12932
+ // max file validation (custom input)
12933
+ if (this.maxFileSize && file.size > this.maxFileSize) {
12497
12934
  errors.maxFileSize = errors.maxFileSize || [];
12498
12935
  errors.maxFileSize.push({ name: file.name, maxFileSize: this.maxFileSize, actualFileSize: file.size });
12499
12936
  }
@@ -12518,28 +12955,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12518
12955
  args: ['clrMaxFileSize']
12519
12956
  }] } });
12520
12957
 
12521
- /*
12522
- * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12523
- * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
12524
- * This software is released under MIT license.
12525
- * The full license information can be found in LICENSE in the root directory of this project.
12526
- */
12527
- function buildFileList(files) {
12528
- const dataTransfer = new DataTransfer();
12529
- for (const file of files) {
12530
- dataTransfer.items.add(file);
12531
- }
12532
- return dataTransfer.files;
12533
- }
12534
- function selectFiles(fileInputElement, files) {
12535
- fileInputElement.files = files instanceof FileList ? files : buildFileList(files);
12536
- fileInputElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
12537
- }
12538
- function clearFiles(fileInputElement) {
12539
- fileInputElement.value = '';
12540
- fileInputElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
12541
- }
12542
-
12543
12958
  /*
12544
12959
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12545
12960
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -12601,23 +13016,51 @@ class ClrFileInputModule {
12601
13016
  }
12602
13017
  }
12603
13018
  ClrFileInputModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
12604
- 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,
13019
+ ClrFileInputModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputModule, declarations: [ClrFileInput,
13020
+ ClrFileInputContainer,
13021
+ ClrFileInputValidator,
13022
+ ClrFileInputValueAccessor,
13023
+ ClrFileList,
13024
+ ClrFileMessagesTemplate,
13025
+ ClrFileInfo,
13026
+ ClrFileSuccess,
13027
+ ClrFileError], imports: [CommonModule, ClrIconModule, ClrCommonFormsModule], exports: [ClrCommonFormsModule,
12605
13028
  ClrFileInput,
12606
13029
  ClrFileInputContainer,
12607
13030
  ClrFileInputValidator,
12608
- ClrFileInputValueAccessor] });
13031
+ ClrFileInputValueAccessor,
13032
+ ClrFileList,
13033
+ ClrFileMessagesTemplate,
13034
+ ClrFileInfo,
13035
+ ClrFileSuccess,
13036
+ ClrFileError] });
12609
13037
  ClrFileInputModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputModule, imports: [CommonModule, ClrIconModule, ClrCommonFormsModule, ClrCommonFormsModule] });
12610
13038
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputModule, decorators: [{
12611
13039
  type: NgModule,
12612
13040
  args: [{
12613
13041
  imports: [CommonModule, ClrIconModule, ClrCommonFormsModule],
12614
- declarations: [ClrFileInput, ClrFileInputContainer, ClrFileInputValidator, ClrFileInputValueAccessor],
13042
+ declarations: [
13043
+ ClrFileInput,
13044
+ ClrFileInputContainer,
13045
+ ClrFileInputValidator,
13046
+ ClrFileInputValueAccessor,
13047
+ ClrFileList,
13048
+ ClrFileMessagesTemplate,
13049
+ ClrFileInfo,
13050
+ ClrFileSuccess,
13051
+ ClrFileError,
13052
+ ],
12615
13053
  exports: [
12616
13054
  ClrCommonFormsModule,
12617
13055
  ClrFileInput,
12618
13056
  ClrFileInputContainer,
12619
13057
  ClrFileInputValidator,
12620
13058
  ClrFileInputValueAccessor,
13059
+ ClrFileList,
13060
+ ClrFileMessagesTemplate,
13061
+ ClrFileInfo,
13062
+ ClrFileSuccess,
13063
+ ClrFileError,
12621
13064
  ],
12622
13065
  }]
12623
13066
  }], ctorParameters: function () { return []; } });
@@ -12629,6 +13072,227 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12629
13072
  * The full license information can be found in LICENSE in the root directory of this project.
12630
13073
  */
12631
13074
 
13075
+ /*
13076
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
13077
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
13078
+ * This software is released under MIT license.
13079
+ * The full license information can be found in LICENSE in the root directory of this project.
13080
+ */
13081
+ class ClrNumberInputContainer extends ClrAbstractContainer {
13082
+ constructor(controlClassService, layoutService, ngControlService, focusService, ifControlStateService) {
13083
+ super(ifControlStateService, layoutService, controlClassService, ngControlService);
13084
+ this.ifControlStateService = ifControlStateService;
13085
+ this.focus = false;
13086
+ this.subscriptions.push(focusService.focusChange.subscribe(state => (this.focus = state)));
13087
+ }
13088
+ }
13089
+ ClrNumberInputContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrNumberInputContainer, deps: [{ token: ControlClassService }, { token: LayoutService, optional: true }, { token: NgControlService }, { token: FocusService }, { token: IfControlStateService }], target: i0.ɵɵFactoryTarget.Component });
13090
+ ClrNumberInputContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrNumberInputContainer, selector: "clr-number-input-container", host: { properties: { "class.clr-form-control": "true", "class.clr-form-control-disabled": "control?.disabled", "class.clr-form-control-readonly": "input.readonly", "class.clr-row": "addGrid()" } }, providers: [FocusService, IfControlStateService, NgControlService, ControlIdService, ControlClassService], queries: [{ propertyName: "input", first: true, predicate: i0.forwardRef(function () { return ClrNumberInput; }), descendants: true }], usesInheritance: true, ngImport: i0, template: `
13091
+ <ng-content select="label"></ng-content>
13092
+ <label *ngIf="!label && addGrid()"></label>
13093
+ <div class="clr-control-container" [ngClass]="controlClass()">
13094
+ <div class="clr-number-input-wrapper">
13095
+ <div class="clr-input-group" [class.clr-focus]="focus">
13096
+ <ng-content select="[clrNumberInput]"></ng-content>
13097
+ <div class="clr-input-group-actions">
13098
+ <button
13099
+ type="button"
13100
+ class="clr-input-group-icon-action"
13101
+ (click)="input.stepDown()"
13102
+ [disabled]="control?.disabled"
13103
+ >
13104
+ <cds-icon shape="minus" size="sm"></cds-icon>
13105
+ </button>
13106
+ <div class="clr-number-input-separator"></div>
13107
+ <button
13108
+ type="button"
13109
+ class="clr-input-group-icon-action"
13110
+ (click)="input.stepUp()"
13111
+ [disabled]="control?.disabled"
13112
+ >
13113
+ <cds-icon shape="plus" size="sm"></cds-icon>
13114
+ </button>
13115
+ </div>
13116
+ </div>
13117
+ <cds-icon
13118
+ *ngIf="showInvalid"
13119
+ class="clr-validate-icon"
13120
+ shape="exclamation-circle"
13121
+ status="danger"
13122
+ aria-hidden="true"
13123
+ ></cds-icon>
13124
+ <cds-icon
13125
+ *ngIf="showValid"
13126
+ class="clr-validate-icon"
13127
+ shape="check-circle"
13128
+ status="success"
13129
+ aria-hidden="true"
13130
+ ></cds-icon>
13131
+ </div>
13132
+ <ng-content select="clr-control-helper" *ngIf="showHelper"></ng-content>
13133
+ <ng-content select="clr-control-error" *ngIf="showInvalid"></ng-content>
13134
+ <ng-content select="clr-control-success" *ngIf="showValid"></ng-content>
13135
+ </div>
13136
+ `, 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: ["id", "for"] }] });
13137
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrNumberInputContainer, decorators: [{
13138
+ type: Component,
13139
+ args: [{
13140
+ selector: 'clr-number-input-container',
13141
+ template: `
13142
+ <ng-content select="label"></ng-content>
13143
+ <label *ngIf="!label && addGrid()"></label>
13144
+ <div class="clr-control-container" [ngClass]="controlClass()">
13145
+ <div class="clr-number-input-wrapper">
13146
+ <div class="clr-input-group" [class.clr-focus]="focus">
13147
+ <ng-content select="[clrNumberInput]"></ng-content>
13148
+ <div class="clr-input-group-actions">
13149
+ <button
13150
+ type="button"
13151
+ class="clr-input-group-icon-action"
13152
+ (click)="input.stepDown()"
13153
+ [disabled]="control?.disabled"
13154
+ >
13155
+ <cds-icon shape="minus" size="sm"></cds-icon>
13156
+ </button>
13157
+ <div class="clr-number-input-separator"></div>
13158
+ <button
13159
+ type="button"
13160
+ class="clr-input-group-icon-action"
13161
+ (click)="input.stepUp()"
13162
+ [disabled]="control?.disabled"
13163
+ >
13164
+ <cds-icon shape="plus" size="sm"></cds-icon>
13165
+ </button>
13166
+ </div>
13167
+ </div>
13168
+ <cds-icon
13169
+ *ngIf="showInvalid"
13170
+ class="clr-validate-icon"
13171
+ shape="exclamation-circle"
13172
+ status="danger"
13173
+ aria-hidden="true"
13174
+ ></cds-icon>
13175
+ <cds-icon
13176
+ *ngIf="showValid"
13177
+ class="clr-validate-icon"
13178
+ shape="check-circle"
13179
+ status="success"
13180
+ aria-hidden="true"
13181
+ ></cds-icon>
13182
+ </div>
13183
+ <ng-content select="clr-control-helper" *ngIf="showHelper"></ng-content>
13184
+ <ng-content select="clr-control-error" *ngIf="showInvalid"></ng-content>
13185
+ <ng-content select="clr-control-success" *ngIf="showValid"></ng-content>
13186
+ </div>
13187
+ `,
13188
+ host: {
13189
+ '[class.clr-form-control]': 'true',
13190
+ '[class.clr-form-control-disabled]': 'control?.disabled',
13191
+ '[class.clr-form-control-readonly]': 'input.readonly',
13192
+ '[class.clr-row]': 'addGrid()',
13193
+ },
13194
+ providers: [FocusService, IfControlStateService, NgControlService, ControlIdService, ControlClassService],
13195
+ }]
13196
+ }], ctorParameters: function () {
13197
+ return [{ type: ControlClassService }, { type: LayoutService, decorators: [{
13198
+ type: Optional
13199
+ }] }, { type: NgControlService }, { type: FocusService }, { type: IfControlStateService }];
13200
+ }, propDecorators: { input: [{
13201
+ type: ContentChild,
13202
+ args: [forwardRef(() => ClrNumberInput)]
13203
+ }] } });
13204
+
13205
+ /*
13206
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
13207
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
13208
+ * This software is released under MIT license.
13209
+ * The full license information can be found in LICENSE in the root directory of this project.
13210
+ */
13211
+ class ClrNumberInput extends WrappedFormControl {
13212
+ constructor(focusService, vcr, injector, control, renderer, el) {
13213
+ super(vcr, ClrNumberInputContainer, injector, control, renderer, el);
13214
+ this.focusService = focusService;
13215
+ this.control = control;
13216
+ this.el = el;
13217
+ this.index = 1;
13218
+ if (!focusService) {
13219
+ throw new Error('clrNumberInput requires being wrapped in <clr-number-input-container>');
13220
+ }
13221
+ }
13222
+ get readonly() {
13223
+ return this.el.nativeElement.getAttribute('readonly') !== null;
13224
+ }
13225
+ triggerFocus() {
13226
+ if (!this.readonly && this.focusService) {
13227
+ this.focusService.focused = true;
13228
+ }
13229
+ }
13230
+ triggerValidation() {
13231
+ if (!this.readonly) {
13232
+ super.triggerValidation();
13233
+ if (this.focusService) {
13234
+ this.focusService.focused = false;
13235
+ }
13236
+ }
13237
+ }
13238
+ stepUp() {
13239
+ this.el.nativeElement.stepUp();
13240
+ this.el.nativeElement.dispatchEvent(new Event('input', { bubbles: true, cancelable: true }));
13241
+ this.control.control.markAllAsTouched();
13242
+ }
13243
+ stepDown() {
13244
+ this.el.nativeElement.stepDown();
13245
+ this.el.nativeElement.dispatchEvent(new Event('input', { bubbles: true, cancelable: true }));
13246
+ this.control.control.markAllAsTouched();
13247
+ }
13248
+ }
13249
+ ClrNumberInput.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrNumberInput, deps: [{ token: FocusService, optional: true }, { token: i0.ViewContainerRef }, { token: i0.Injector }, { token: i1.NgControl, optional: true, self: true }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
13250
+ ClrNumberInput.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrNumberInput, selector: "input[type=\"number\"][clrNumberInput]", host: { listeners: { "focus": "triggerFocus()", "blur": "triggerValidation()" }, properties: { "class.clr-input": "true", "class.clr-number-input": "true" } }, usesInheritance: true, ngImport: i0 });
13251
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrNumberInput, decorators: [{
13252
+ type: Directive,
13253
+ args: [{
13254
+ selector: 'input[type="number"][clrNumberInput]',
13255
+ host: { '[class.clr-input]': 'true', '[class.clr-number-input]': 'true' },
13256
+ }]
13257
+ }], ctorParameters: function () {
13258
+ return [{ type: FocusService, decorators: [{
13259
+ type: Optional
13260
+ }] }, { type: i0.ViewContainerRef }, { type: i0.Injector }, { type: i1.NgControl, decorators: [{
13261
+ type: Self
13262
+ }, {
13263
+ type: Optional
13264
+ }] }, { type: i0.Renderer2 }, { type: i0.ElementRef }];
13265
+ }, propDecorators: { triggerFocus: [{
13266
+ type: HostListener,
13267
+ args: ['focus']
13268
+ }], triggerValidation: [{
13269
+ type: HostListener,
13270
+ args: ['blur']
13271
+ }] } });
13272
+
13273
+ /*
13274
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
13275
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
13276
+ * This software is released under MIT license.
13277
+ * The full license information can be found in LICENSE in the root directory of this project.
13278
+ */
13279
+ class ClrNumberInputModule {
13280
+ constructor() {
13281
+ ClarityIcons.addIcons(exclamationCircleIcon, checkCircleIcon);
13282
+ }
13283
+ }
13284
+ ClrNumberInputModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrNumberInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
13285
+ ClrNumberInputModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.2", ngImport: i0, type: ClrNumberInputModule, declarations: [ClrNumberInput, ClrNumberInputContainer], imports: [CommonModule, FormsModule, ClrIconModule, ClrCommonFormsModule], exports: [ClrCommonFormsModule, ClrNumberInput, ClrNumberInputContainer] });
13286
+ ClrNumberInputModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrNumberInputModule, imports: [CommonModule, FormsModule, ClrIconModule, ClrCommonFormsModule, ClrCommonFormsModule] });
13287
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrNumberInputModule, decorators: [{
13288
+ type: NgModule,
13289
+ args: [{
13290
+ imports: [CommonModule, FormsModule, ClrIconModule, ClrCommonFormsModule],
13291
+ declarations: [ClrNumberInput, ClrNumberInputContainer],
13292
+ exports: [ClrCommonFormsModule, ClrNumberInput, ClrNumberInputContainer],
13293
+ }]
13294
+ }], ctorParameters: function () { return []; } });
13295
+
12632
13296
  /*
12633
13297
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12634
13298
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -13581,7 +14245,8 @@ ClrFormsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version:
13581
14245
  ClrSelectModule,
13582
14246
  ClrTextareaModule,
13583
14247
  ClrRangeModule,
13584
- ClrDatalistModule] });
14248
+ ClrDatalistModule,
14249
+ ClrNumberInputModule] });
13585
14250
  ClrFormsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFormsModule, imports: [CommonModule, ClrCommonFormsModule,
13586
14251
  ClrCheckboxModule,
13587
14252
  ClrComboboxModule,
@@ -13593,7 +14258,8 @@ ClrFormsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version:
13593
14258
  ClrSelectModule,
13594
14259
  ClrTextareaModule,
13595
14260
  ClrRangeModule,
13596
- ClrDatalistModule] });
14261
+ ClrDatalistModule,
14262
+ ClrNumberInputModule] });
13597
14263
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFormsModule, decorators: [{
13598
14264
  type: NgModule,
13599
14265
  args: [{
@@ -13611,6 +14277,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
13611
14277
  ClrTextareaModule,
13612
14278
  ClrRangeModule,
13613
14279
  ClrDatalistModule,
14280
+ ClrNumberInputModule,
13614
14281
  ],
13615
14282
  }]
13616
14283
  }] });
@@ -14789,10 +15456,10 @@ DatagridNumericFilter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", ve
14789
15456
  DatagridNumericFilter.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: DatagridNumericFilter, selector: "clr-dg-numeric-filter", inputs: { minPlaceholder: ["clrFilterMinPlaceholder", "minPlaceholder"], maxPlaceholder: ["clrFilterMaxPlaceholder", "maxPlaceholder"], fromLabel: ["clrFilterFromLabel", "fromLabel"], toLabel: ["clrFilterToLabel", "toLabel"], value: ["clrFilterValue", "value"], customNumericFilter: ["clrDgNumericFilter", "customNumericFilter"] }, outputs: { filterValueChange: "clrFilterValueChange" }, providers: [{ provide: CustomFilter, useExisting: DatagridNumericFilter }], viewQueries: [{ propertyName: "input", first: true, predicate: ["input_low"], descendants: true }, { propertyName: "filterContainer", first: true, predicate: ClrDatagridFilter, descendants: true }], usesInheritance: true, ngImport: i0, template: `
14790
15457
  <clr-dg-filter [clrDgFilter]="registered" [(clrDgFilterOpen)]="open">
14791
15458
  <div class="datagrid-numeric-filter-form">
14792
- <div class="clr-form-control">
15459
+ <clr-number-input-container>
14793
15460
  <label class="clr-control-label">{{ fromLabelValue }}</label>
14794
15461
  <input
14795
- clrInput
15462
+ clrNumberInput
14796
15463
  class="datagrid-numeric-filter-input"
14797
15464
  #input_low
14798
15465
  type="number"
@@ -14802,11 +15469,11 @@ DatagridNumericFilter.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0",
14802
15469
  [placeholder]="minPlaceholderValue"
14803
15470
  [attr.aria-label]="minPlaceholderValue"
14804
15471
  />
14805
- </div>
14806
- <div class="clr-form-control">
15472
+ </clr-number-input-container>
15473
+ <clr-number-input-container>
14807
15474
  <label class="clr-control-label">{{ toLabelValue }}</label>
14808
15475
  <input
14809
- clrInput
15476
+ clrNumberInput
14810
15477
  class="datagrid-numeric-filter-input"
14811
15478
  #input_high
14812
15479
  type="number"
@@ -14816,10 +15483,10 @@ DatagridNumericFilter.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0",
14816
15483
  [placeholder]="maxPlaceholderValue"
14817
15484
  [attr.aria-label]="maxPlaceholderValue"
14818
15485
  />
14819
- </div>
15486
+ </clr-number-input-container>
14820
15487
  </div>
14821
15488
  </clr-dg-filter>
14822
- `, isInline: true, dependencies: [{ kind: "directive", type: ClrLabel, selector: "label", inputs: ["id", "for"] }, { kind: "directive", type: ClrInput, selector: "[clrInput]" }, { 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][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: ClrDatagridFilter, selector: "clr-dg-filter", inputs: ["clrDgFilterOpen", "clrDgFilter"], outputs: ["clrDgFilterOpenChange"] }] });
15489
+ `, isInline: true, dependencies: [{ kind: "directive", type: ClrLabel, selector: "label", inputs: ["id", "for"] }, { kind: "directive", type: ClrNumberInput, selector: "input[type=\"number\"][clrNumberInput]" }, { kind: "component", type: ClrNumberInputContainer, selector: "clr-number-input-container" }, { 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][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: ClrDatagridFilter, selector: "clr-dg-filter", inputs: ["clrDgFilterOpen", "clrDgFilter"], outputs: ["clrDgFilterOpenChange"] }] });
14823
15490
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridNumericFilter, decorators: [{
14824
15491
  type: Component,
14825
15492
  args: [{
@@ -14828,10 +15495,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
14828
15495
  template: `
14829
15496
  <clr-dg-filter [clrDgFilter]="registered" [(clrDgFilterOpen)]="open">
14830
15497
  <div class="datagrid-numeric-filter-form">
14831
- <div class="clr-form-control">
15498
+ <clr-number-input-container>
14832
15499
  <label class="clr-control-label">{{ fromLabelValue }}</label>
14833
15500
  <input
14834
- clrInput
15501
+ clrNumberInput
14835
15502
  class="datagrid-numeric-filter-input"
14836
15503
  #input_low
14837
15504
  type="number"
@@ -14841,11 +15508,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
14841
15508
  [placeholder]="minPlaceholderValue"
14842
15509
  [attr.aria-label]="minPlaceholderValue"
14843
15510
  />
14844
- </div>
14845
- <div class="clr-form-control">
15511
+ </clr-number-input-container>
15512
+ <clr-number-input-container>
14846
15513
  <label class="clr-control-label">{{ toLabelValue }}</label>
14847
15514
  <input
14848
- clrInput
15515
+ clrNumberInput
14849
15516
  class="datagrid-numeric-filter-input"
14850
15517
  #input_high
14851
15518
  type="number"
@@ -14855,7 +15522,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
14855
15522
  [placeholder]="maxPlaceholderValue"
14856
15523
  [attr.aria-label]="maxPlaceholderValue"
14857
15524
  />
14858
- </div>
15525
+ </clr-number-input-container>
14859
15526
  </div>
14860
15527
  </clr-dg-filter>
14861
15528
  `,
@@ -15002,17 +15669,20 @@ class DatagridStringFilterImpl {
15002
15669
  * The full license information can be found in LICENSE in the root directory of this project.
15003
15670
  */
15004
15671
  class DatagridStringFilter extends DatagridFilterRegistrar {
15005
- constructor(filters, domAdapter, commonStrings, smartToggleService, ngZone) {
15672
+ constructor(filters, domAdapter, commonStrings, smartToggleService, elementRef, cdr, ngZone) {
15006
15673
  super(filters);
15007
15674
  this.domAdapter = domAdapter;
15008
15675
  this.commonStrings = commonStrings;
15009
15676
  this.smartToggleService = smartToggleService;
15677
+ this.elementRef = elementRef;
15678
+ this.cdr = cdr;
15010
15679
  this.ngZone = ngZone;
15011
15680
  this.filterValueChange = new EventEmitter();
15012
15681
  /**
15013
15682
  * Indicates if the filter dropdown is open
15014
15683
  */
15015
15684
  this.open = false;
15685
+ this.labelValue = '';
15016
15686
  this.subs = [];
15017
15687
  }
15018
15688
  /**
@@ -15072,26 +15742,50 @@ class DatagridStringFilter extends DatagridFilterRegistrar {
15072
15742
  });
15073
15743
  }));
15074
15744
  }
15745
+ ngOnChanges() {
15746
+ setTimeout(() => {
15747
+ this.setFilterLabel();
15748
+ this.cdr.markForCheck();
15749
+ });
15750
+ }
15075
15751
  ngOnDestroy() {
15076
15752
  super.ngOnDestroy();
15077
15753
  this.subs.forEach(sub => sub.unsubscribe());
15078
15754
  }
15755
+ /**
15756
+ * This is not in a getter to prevent "expression has changed after it was checked" errors.
15757
+ */
15758
+ setFilterLabel() {
15759
+ var _a;
15760
+ if (this.label) {
15761
+ this.labelValue = this.label;
15762
+ return;
15763
+ }
15764
+ const columnElement = (_a = this.elementRef.nativeElement) === null || _a === void 0 ? void 0 : _a.closest('clr-dg-column');
15765
+ const columnTitleElement = columnElement === null || columnElement === void 0 ? void 0 : columnElement.querySelector('.datagrid-column-title');
15766
+ this.labelValue = this.commonStrings.parse(this.commonStrings.keys.datagridFilterLabel, {
15767
+ COLUMN: (columnTitleElement === null || columnTitleElement === void 0 ? void 0 : columnTitleElement.textContent.trim()) || '',
15768
+ });
15769
+ }
15079
15770
  }
15080
- DatagridStringFilter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridStringFilter, deps: [{ token: FiltersProvider }, { token: DomAdapter }, { token: ClrCommonStringsService }, { token: ClrPopoverToggleService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
15081
- DatagridStringFilter.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: DatagridStringFilter, selector: "clr-dg-string-filter", inputs: { placeholder: ["clrFilterPlaceholder", "placeholder"], customStringFilter: ["clrDgStringFilter", "customStringFilter"], value: ["clrFilterValue", "value"] }, outputs: { filterValueChange: "clrFilterValueChange" }, providers: [{ provide: CustomFilter, useExisting: DatagridStringFilter }], viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }, { propertyName: "filterContainer", first: true, predicate: ClrDatagridFilter, descendants: true }], usesInheritance: true, ngImport: i0, template: `
15771
+ DatagridStringFilter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridStringFilter, deps: [{ token: FiltersProvider }, { token: DomAdapter }, { token: ClrCommonStringsService }, { token: ClrPopoverToggleService }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
15772
+ DatagridStringFilter.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: DatagridStringFilter, selector: "clr-dg-string-filter", inputs: { placeholder: ["clrFilterPlaceholder", "placeholder"], label: ["clrFilterLabel", "label"], customStringFilter: ["clrDgStringFilter", "customStringFilter"], value: ["clrFilterValue", "value"] }, outputs: { filterValueChange: "clrFilterValueChange" }, providers: [{ provide: CustomFilter, useExisting: DatagridStringFilter }], viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }, { propertyName: "filterContainer", first: true, predicate: ClrDatagridFilter, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `
15082
15773
  <clr-dg-filter [clrDgFilter]="registered" [(clrDgFilterOpen)]="open">
15083
- <input
15084
- #input
15085
- type="text"
15086
- autocomplete="off"
15087
- name="search"
15088
- [(ngModel)]="value"
15089
- class="clr-input"
15090
- [attr.aria-label]="placeholderValue"
15091
- [placeholder]="placeholderValue"
15092
- />
15774
+ <clr-input-container>
15775
+ <label>{{ labelValue }}</label>
15776
+ <input
15777
+ #input
15778
+ type="text"
15779
+ autocomplete="off"
15780
+ name="search"
15781
+ [(ngModel)]="value"
15782
+ clrInput
15783
+ [attr.aria-label]="placeholderValue"
15784
+ [placeholder]="placeholderValue"
15785
+ />
15786
+ </clr-input-container>
15093
15787
  </clr-dg-filter>
15094
- `, isInline: true, dependencies: [{ 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: "component", type: ClrDatagridFilter, selector: "clr-dg-filter", inputs: ["clrDgFilterOpen", "clrDgFilter"], outputs: ["clrDgFilterOpenChange"] }] });
15788
+ `, isInline: true, dependencies: [{ kind: "directive", type: ClrLabel, selector: "label", inputs: ["id", "for"] }, { kind: "directive", type: ClrInput, selector: "[clrInput]" }, { kind: "component", type: ClrInputContainer, selector: "clr-input-container" }, { 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: "component", type: ClrDatagridFilter, selector: "clr-dg-filter", inputs: ["clrDgFilterOpen", "clrDgFilter"], outputs: ["clrDgFilterOpenChange"] }] });
15095
15789
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridStringFilter, decorators: [{
15096
15790
  type: Component,
15097
15791
  args: [{
@@ -15099,22 +15793,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15099
15793
  providers: [{ provide: CustomFilter, useExisting: DatagridStringFilter }],
15100
15794
  template: `
15101
15795
  <clr-dg-filter [clrDgFilter]="registered" [(clrDgFilterOpen)]="open">
15102
- <input
15103
- #input
15104
- type="text"
15105
- autocomplete="off"
15106
- name="search"
15107
- [(ngModel)]="value"
15108
- class="clr-input"
15109
- [attr.aria-label]="placeholderValue"
15110
- [placeholder]="placeholderValue"
15111
- />
15796
+ <clr-input-container>
15797
+ <label>{{ labelValue }}</label>
15798
+ <input
15799
+ #input
15800
+ type="text"
15801
+ autocomplete="off"
15802
+ name="search"
15803
+ [(ngModel)]="value"
15804
+ clrInput
15805
+ [attr.aria-label]="placeholderValue"
15806
+ [placeholder]="placeholderValue"
15807
+ />
15808
+ </clr-input-container>
15112
15809
  </clr-dg-filter>
15113
15810
  `,
15114
15811
  }]
15115
- }], ctorParameters: function () { return [{ type: FiltersProvider }, { type: DomAdapter }, { type: ClrCommonStringsService }, { type: ClrPopoverToggleService }, { type: i0.NgZone }]; }, propDecorators: { placeholder: [{
15812
+ }], ctorParameters: function () { return [{ type: FiltersProvider }, { type: DomAdapter }, { type: ClrCommonStringsService }, { type: ClrPopoverToggleService }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }]; }, propDecorators: { placeholder: [{
15116
15813
  type: Input,
15117
15814
  args: ['clrFilterPlaceholder']
15815
+ }], label: [{
15816
+ type: Input,
15817
+ args: ['clrFilterLabel']
15118
15818
  }], filterValueChange: [{
15119
15819
  type: Output,
15120
15820
  args: ['clrFilterValueChange']
@@ -16198,7 +16898,7 @@ ClrDatagridColumn.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", vers
16198
16898
 
16199
16899
  <clr-dg-column-separator *ngIf="showSeparator"></clr-dg-column-separator>
16200
16900
  </div>
16201
- `, isInline: true, dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "component", type: ClrDatagridColumnSeparator, selector: "clr-dg-column-separator" }, { kind: "component", type: DatagridNumericFilter, selector: "clr-dg-numeric-filter", inputs: ["clrFilterMinPlaceholder", "clrFilterMaxPlaceholder", "clrFilterFromLabel", "clrFilterToLabel", "clrFilterValue", "clrDgNumericFilter"], outputs: ["clrFilterValueChange"] }, { kind: "component", type: DatagridStringFilter, selector: "clr-dg-string-filter", inputs: ["clrFilterPlaceholder", "clrDgStringFilter", "clrFilterValue"], outputs: ["clrFilterValueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
16901
+ `, isInline: true, dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "component", type: ClrDatagridColumnSeparator, selector: "clr-dg-column-separator" }, { kind: "component", type: DatagridNumericFilter, selector: "clr-dg-numeric-filter", inputs: ["clrFilterMinPlaceholder", "clrFilterMaxPlaceholder", "clrFilterFromLabel", "clrFilterToLabel", "clrFilterValue", "clrDgNumericFilter"], outputs: ["clrFilterValueChange"] }, { kind: "component", type: DatagridStringFilter, selector: "clr-dg-string-filter", inputs: ["clrFilterPlaceholder", "clrFilterLabel", "clrDgStringFilter", "clrFilterValue"], outputs: ["clrFilterValueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
16202
16902
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridColumn, decorators: [{
16203
16903
  type: Component,
16204
16904
  args: [{
@@ -17521,6 +18221,9 @@ class ColumnsService {
17521
18221
  get hasHideableColumns() {
17522
18222
  return this.columnStates.filter(state => state.hideable).length > 0;
17523
18223
  }
18224
+ get visibleColumns() {
18225
+ return this.columnStates.filter(state => !state.hidden);
18226
+ }
17524
18227
  cache() {
17525
18228
  this._cache = this.columns.map(subject => {
17526
18229
  const value = Object.assign({}, subject.value);
@@ -17852,7 +18555,7 @@ class ClrDatagrid {
17852
18555
  if (!this.items.smart) {
17853
18556
  this.items.all = this.rows.map((row) => row.item);
17854
18557
  }
17855
- const rowItemsChanges = this.rows.changes.pipe(switchMap((rows) => merge(
18558
+ const rowItemsChanges = this.rows.changes.pipe(switchMap$1((rows) => merge(
17856
18559
  // immediate update
17857
18560
  of(rows.map(row => row.item)),
17858
18561
  // subsequent updates once per tick
@@ -19561,11 +20264,12 @@ const defaultCdkFixedSizeVirtualScrollInputs = {
19561
20264
  maxBufferPx: 400,
19562
20265
  };
19563
20266
  class ClrDatagridVirtualScrollDirective {
19564
- constructor(changeDetectorRef, iterableDiffers, items, ngZone, templateRef, viewContainerRef, directionality, scrollDispatcher, viewportRuler, datagrid, columnsService, injector) {
20267
+ constructor(changeDetectorRef, iterableDiffers, items, ngZone, renderer2, templateRef, viewContainerRef, directionality, scrollDispatcher, viewportRuler, datagrid, columnsService, injector) {
19565
20268
  this.changeDetectorRef = changeDetectorRef;
19566
20269
  this.iterableDiffers = iterableDiffers;
19567
20270
  this.items = items;
19568
20271
  this.ngZone = ngZone;
20272
+ this.renderer2 = renderer2;
19569
20273
  this.templateRef = templateRef;
19570
20274
  this.viewContainerRef = viewContainerRef;
19571
20275
  this.directionality = directionality;
@@ -19654,7 +20358,7 @@ class ClrDatagridVirtualScrollDirective {
19654
20358
  }
19655
20359
  ngAfterViewInit() {
19656
20360
  this.injector.runInContext(() => {
19657
- this.virtualScrollViewport = this.createVirtualScrollViewportForDatagrid(this.changeDetectorRef, this.ngZone, this.directionality, this.scrollDispatcher, this.viewportRuler, this.datagridElementRef, this.virtualScrollStrategy);
20361
+ this.virtualScrollViewport = this.createVirtualScrollViewportForDatagrid(this.changeDetectorRef, this.ngZone, this.renderer2, this.directionality, this.scrollDispatcher, this.viewportRuler, this.datagridElementRef, this.virtualScrollStrategy);
19658
20362
  this.cdkVirtualFor = createCdkVirtualForOfDirective(this.viewContainerRef, this.templateRef, this.iterableDiffers, this.viewRepeater, this.virtualScrollViewport, this.ngZone);
19659
20363
  this.virtualScrollViewport.ngOnInit();
19660
20364
  });
@@ -19716,7 +20420,7 @@ class ClrDatagridVirtualScrollDirective {
19716
20420
  rowRoleElement === null || rowRoleElement === void 0 ? void 0 : rowRoleElement.setAttribute('aria-rowindex', (viewRef.context.index + 1).toString());
19717
20421
  }
19718
20422
  }
19719
- createVirtualScrollViewportForDatagrid(changeDetectorRef, ngZone, directionality, scrollDispatcher, viewportRuler, datagridElementRef, virtualScrollStrategy) {
20423
+ createVirtualScrollViewportForDatagrid(changeDetectorRef, ngZone, renderer2, directionality, scrollDispatcher, viewportRuler, datagridElementRef, virtualScrollStrategy) {
19720
20424
  const datagridDivElement = datagridElementRef.nativeElement.querySelector('.datagrid');
19721
20425
  const datagridTableElement = datagridElementRef.nativeElement.querySelector('.datagrid-table');
19722
20426
  const datagridRowsElement = datagridElementRef.nativeElement.querySelector('.datagrid-rows');
@@ -19727,7 +20431,7 @@ class ClrDatagridVirtualScrollDirective {
19727
20431
  datagridRowsElement.style.transform = `translateY(${topOffset}px)`;
19728
20432
  datagridRowsElement.style.height = `${totalContentSize - topOffset}px`;
19729
20433
  }
19730
- const virtualScrollViewport = createCdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, null);
20434
+ const virtualScrollViewport = createCdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, renderer2, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, null);
19731
20435
  virtualScrollViewport._contentWrapper = {
19732
20436
  nativeElement: {
19733
20437
  style: {
@@ -19747,7 +20451,7 @@ class ClrDatagridVirtualScrollDirective {
19747
20451
  return virtualScrollViewport;
19748
20452
  }
19749
20453
  }
19750
- 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 });
20454
+ ClrDatagridVirtualScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.IterableDiffers }, { token: Items, skipSelf: true }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: i1$2.Directionality }, { token: i3$1.ScrollDispatcher }, { token: i3$1.ViewportRuler }, { token: ClrDatagrid }, { token: ColumnsService }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Directive });
19751
20455
  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 });
19752
20456
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, decorators: [{
19753
20457
  type: Directive,
@@ -19758,7 +20462,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
19758
20462
  }], ctorParameters: function () {
19759
20463
  return [{ type: i0.ChangeDetectorRef }, { type: i0.IterableDiffers }, { type: Items, decorators: [{
19760
20464
  type: SkipSelf
19761
- }] }, { 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 }];
20465
+ }] }, { type: i0.NgZone }, { type: i0.Renderer2 }, { 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 }];
19762
20466
  }, propDecorators: { renderedRangeChange: [{
19763
20467
  type: Output
19764
20468
  }], cdkVirtualForOf: [{
@@ -19783,7 +20487,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
19783
20487
  type: Input,
19784
20488
  args: ['clrVirtualRowsMaxBufferPx']
19785
20489
  }] } });
19786
- function createCdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, scrollable) {
20490
+ function createCdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, renderer2, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, scrollable) {
19787
20491
  if (+VERSION.major < 19) {
19788
20492
  return new CdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, scrollable);
19789
20493
  }
@@ -19794,6 +20498,7 @@ function createCdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef
19794
20498
  { provide: ElementRef, useValue: datagridDivElementRef },
19795
20499
  { provide: ChangeDetectorRef, useValue: changeDetectorRef },
19796
20500
  { provide: NgZone, useValue: ngZone },
20501
+ { provide: Renderer2, useValue: renderer2 },
19797
20502
  { provide: VIRTUAL_SCROLL_STRATEGY, useValue: virtualScrollStrategy },
19798
20503
  { provide: Directionality, useValue: directionality },
19799
20504
  { provide: ScrollDispatcher, useValue: scrollDispatcher },
@@ -20064,9 +20769,9 @@ class DatagridMainRenderer {
20064
20769
  if (this.headers) {
20065
20770
  if (state && !this.columnsService.hasCache()) {
20066
20771
  this.columnsService.cache();
20067
- this.headers.forEach((_header, index) => {
20772
+ this.columnsService.visibleColumns.forEach((header, index) => {
20068
20773
  if (index > 0) {
20069
- this.columnsService.emitStateChangeAt(index, {
20774
+ this.columnsService.emitStateChangeAt(header.columnIndex, {
20070
20775
  changes: [DatagridColumnChanges.HIDDEN],
20071
20776
  hidden: state,
20072
20777
  });
@@ -28549,9 +29254,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
28549
29254
  * The full license information can be found in LICENSE in the root directory of this project.
28550
29255
  */
28551
29256
 
29257
+ /*
29258
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
29259
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
29260
+ * This software is released under MIT license.
29261
+ * The full license information can be found in LICENSE in the root directory of this project.
29262
+ */
29263
+
28552
29264
  /**
28553
29265
  * Generated bundle index. Do not edit.
28554
29266
  */
28555
29267
 
28556
- 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, ClrBreadcrumbItem, ClrBreadcrumbs, ClrBreadcrumbsModule, ClrButton, ClrButtonGroup, ClrButtonGroupModule, ClrButtonModule, ClrCalendar, ClrCheckbox, ClrCheckboxContainer, ClrCheckboxModule, ClrCheckboxWrapper, ClrCombobox, ClrComboboxContainer, ClrComboboxModule, ClrCommonFormsModule, ClrCommonStringsService, ClrConditionalModule, ClrControl, ClrControlContainer, ClrControlError, ClrControlHelper, ClrControlSuccess, ClrDataModule, ClrDatagrid, ClrDatagridActionBar, ClrDatagridActionOverflow, ClrDatagridCell, ClrDatagridColumn, ClrDatagridColumnSeparator, ClrDatagridColumnToggle, ClrDatagridColumnToggleButton, ClrDatagridDetail, ClrDatagridDetailBody, ClrDatagridDetailHeader, ClrDatagridFilter, ClrDatagridFooter, ClrDatagridHideableColumn, ClrDatagridItems, ClrDatagridModule, ClrDatagridPageSize, ClrDatagridPagination, ClrDatagridPlaceholder, ClrDatagridRow, ClrDatagridRowDetail, ClrDatagridSortOrder, ClrDatalist, ClrDatalistContainer, ClrDatalistInput, ClrDatalistModule, ClrDateContainer, ClrDateInput, 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, ClrModalConfigurationService, 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, ClrSignpostTitle, ClrSignpostTrigger, ClrSpinner, ClrSpinnerModule, ClrStackBlock, ClrStackContentInput, ClrStackHeader, ClrStackView, ClrStackViewCustomTags, ClrStackViewLabel, ClrStackViewModule, ClrStandaloneCdkTrapFocus, ClrStepButton, ClrStepButtonType, ClrStepper, ClrStepperModule, ClrStepperPanel, ClrStopEscapePropagationDirective, ClrTab, ClrTabAction, ClrTabContent, ClrTabLink, ClrTabOverflowContent, ClrTabs, ClrTabsActions, ClrTabsModule, ClrTextarea, ClrTextareaContainer, ClrTextareaModule, ClrTimeline, ClrTimelineLayout, ClrTimelineModule, ClrTimelineStep, ClrTimelineStepDescription, ClrTimelineStepHeader, ClrTimelineStepState, ClrTimelineStepTitle, ClrTooltip, ClrTooltipContent, ClrTooltipModule, ClrTooltipTrigger, ClrTree, ClrTreeNode, ClrTreeNodeLink, ClrTreeViewModule, ClrVerticalNav, ClrVerticalNavGroup, ClrVerticalNavGroupChildren, ClrVerticalNavIcon, ClrVerticalNavLink, ClrVerticalNavModule, ClrWizard, ClrWizardButton, ClrWizardHeaderAction, ClrWizardModule, ClrWizardPage, ClrWizardPageButtons, ClrWizardPageHeaderActions, ClrWizardPageNavTitle, ClrWizardPageTitle, ClrWizardStepnav, ClrWizardStepnavItem, ClrWizardTitle, ClrYearpicker, DEFAULT_BUTTON_TYPES, DatagridNumericFilter, DatagridPropertyComparator, DatagridPropertyNumericFilter, DatagridPropertyStringFilter, DatagridStringFilter, EXPANDABLE_ANIMATION_DIRECTIVES, FOCUS_ON_VIEW_INIT, FOCUS_ON_VIEW_INIT_DIRECTIVES, IS_TOGGLE, IS_TOGGLE_PROVIDER, LoadingListener, MainContainerWillyWonka, NavDetectionOompaLoompa, TOGGLE_SERVICE, TOGGLE_SERVICE_PROVIDER, ToggleServiceFactory, WrappedFormControl, collapse, commonStringsDefault, fade, fadeSlide, isToggleFactory, slide, AccordionOompaLoompa as ÇlrAccordionOompaLoompa, AccordionWillyWonka as ÇlrAccordionWillyWonka, ActionableOompaLoompa as ÇlrActionableOompaLoompa, ActiveOompaLoompa as ÇlrActiveOompaLoompa, ClrPopoverCloseButton as ÇlrClrPopoverCloseButton, ClrPopoverModuleNext as ÇlrClrPopoverModuleNext, ClrPopoverOpenCloseButton as ÇlrClrPopoverOpenCloseButton, DatagridCellRenderer as ÇlrDatagridCellRenderer, DatagridDetailRegisterer as ÇlrDatagridDetailRegisterer, DatagridHeaderRenderer as ÇlrDatagridHeaderRenderer, DatagridMainRenderer as ÇlrDatagridMainRenderer, DatagridRowRenderer as ÇlrDatagridRowRenderer, ClrDatagridSelectionCellDirective as ÇlrDatagridSelectionCellDirective, ClrDatagridVirtualScrollDirective as ÇlrDatagridVirtualScrollDirective, DatagridWillyWonka as ÇlrDatagridWillyWonka, ExpandableOompaLoompa as ÇlrExpandableOompaLoompa, StepperOompaLoompa as ÇlrStepperOompaLoompa, StepperWillyWonka as ÇlrStepperWillyWonka, TabsWillyWonka as ÇlrTabsWillyWonka, WrappedCell as ÇlrWrappedCell, WrappedColumn as ÇlrWrappedColumn, WrappedRow as ÇlrWrappedRow };
29268
+ export { CHANGE_KEYS, CLR_ALERT_DIRECTIVES, CLR_BUTTON_GROUP_DIRECTIVES, CLR_DATAGRID_DIRECTIVES, CLR_DATEPICKER_DIRECTIVES, CLR_DROPDOWN_DIRECTIVES, CLR_FILE_MESSAGES_TEMPLATE_CONTEXT, CLR_ICON_DIRECTIVES, CLR_LAYOUT_DIRECTIVES, CLR_LOADING_BUTTON_DIRECTIVES, CLR_LOADING_DIRECTIVES, CLR_MENU_POSITIONS, CLR_MODAL_DIRECTIVES, CLR_NAVIGATION_DIRECTIVES, CLR_PROGRESS_BAR_DIRECTIVES, CLR_SIDEPANEL_DIRECTIVES, CLR_SIGNPOST_DIRECTIVES, CLR_SPINNER_DIRECTIVES, CLR_STACK_VIEW_DIRECTIVES, CLR_TABS_DIRECTIVES, CLR_TOOLTIP_DIRECTIVES, CLR_TREE_VIEW_DIRECTIVES, CLR_VERTICAL_NAV_DIRECTIVES, CLR_WIZARD_DIRECTIVES, CONDITIONAL_DIRECTIVES, CUSTOM_BUTTON_TYPES, CdsIconCustomTag, ClarityModule, ClrAbstractContainer, ClrAccordion, ClrAccordionContent, ClrAccordionDescription, ClrAccordionModule, ClrAccordionPanel, ClrAccordionTitle, ClrAlert, ClrAlertItem, ClrAlertModule, ClrAlertText, ClrAlerts, ClrAlertsPager, ClrAlignment, ClrAriaCurrentLink, ClrAxis, ClrBreadcrumbItem, ClrBreadcrumbs, ClrBreadcrumbsModule, ClrButton, ClrButtonGroup, ClrButtonGroupModule, ClrButtonModule, ClrCalendar, ClrCheckbox, ClrCheckboxContainer, ClrCheckboxModule, ClrCheckboxWrapper, ClrCombobox, ClrComboboxContainer, ClrComboboxModule, ClrCommonFormsModule, ClrCommonStringsService, ClrConditionalModule, ClrControl, ClrControlContainer, ClrControlError, ClrControlHelper, ClrControlSuccess, ClrDataModule, ClrDatagrid, ClrDatagridActionBar, ClrDatagridActionOverflow, ClrDatagridCell, ClrDatagridColumn, ClrDatagridColumnSeparator, ClrDatagridColumnToggle, ClrDatagridColumnToggleButton, ClrDatagridDetail, ClrDatagridDetailBody, ClrDatagridDetailHeader, ClrDatagridFilter, ClrDatagridFooter, ClrDatagridHideableColumn, ClrDatagridItems, ClrDatagridModule, ClrDatagridPageSize, ClrDatagridPagination, ClrDatagridPlaceholder, ClrDatagridRow, ClrDatagridRowDetail, ClrDatagridSortOrder, ClrDatalist, ClrDatalistContainer, ClrDatalistInput, ClrDatalistModule, ClrDateContainer, ClrDateInput, ClrDateInputValidator, ClrDatepickerActions, ClrDatepickerModule, ClrDatepickerViewManager, ClrDay, ClrDaypicker, ClrDestroyService, ClrDropdown, ClrDropdownItem, ClrDropdownMenu, ClrDropdownModule, ClrDropdownTrigger, ClrEmphasisModule, ClrExpandableAnimation, ClrFileError, ClrFileInfo, ClrFileInput, ClrFileInputContainer, ClrFileInputModule, ClrFileInputValidator, ClrFileInputValueAccessor, ClrFileList, ClrFileMessagesTemplate, ClrFileSuccess, ClrFocusOnViewInit, ClrFocusOnViewInitModule, ClrForm, ClrFormLayout, ClrFormsModule, ClrHeader, ClrIconCustomTag, ClrIconModule, ClrIfActive, ClrIfDetail, ClrIfError, ClrIfExpanded, ClrIfOpen, ClrIfSuccess, ClrInput, ClrInputContainer, ClrInputModule, ClrLabel, ClrLayout, ClrLayoutModule, ClrLoading, ClrLoadingButton, ClrLoadingButtonModule, ClrLoadingModule, ClrLoadingState, ClrMainContainer, ClrMainContainerModule, ClrModal, ClrModalBody, ClrModalConfigurationService, ClrModalModule, ClrMonthpicker, ClrNavLevel, ClrNavigationModule, ClrNumberInput, ClrNumberInputContainer, ClrNumberInputModule, ClrOption, ClrOptionItems, ClrOptionSelected, ClrOptions, ClrPassword, ClrPasswordContainer, ClrPasswordModule, ClrPopoverAnchor, ClrPopoverContent, ClrPopoverEventsService, ClrPopoverHostDirective, ClrPopoverModule, ClrPopoverPositionService, ClrPopoverToggleService, ClrProgressBar, ClrProgressBarModule, ClrRadio, ClrRadioContainer, ClrRadioModule, ClrRadioWrapper, ClrRange, ClrRangeContainer, ClrRangeModule, ClrRecursiveForOf, ClrSelect, ClrSelectContainer, ClrSelectModule, ClrSelectedState, ClrSide, ClrSidePanel, ClrSidePanelModule, ClrSignpost, ClrSignpostContent, ClrSignpostModule, ClrSignpostTitle, ClrSignpostTrigger, ClrSpinner, ClrSpinnerModule, ClrStackBlock, ClrStackContentInput, ClrStackHeader, ClrStackView, ClrStackViewCustomTags, ClrStackViewLabel, ClrStackViewModule, ClrStandaloneCdkTrapFocus, ClrStepButton, ClrStepButtonType, ClrStepper, ClrStepperModule, ClrStepperPanel, ClrStopEscapePropagationDirective, ClrTab, ClrTabAction, ClrTabContent, ClrTabLink, ClrTabOverflowContent, ClrTabs, ClrTabsActions, ClrTabsModule, ClrTextarea, ClrTextareaContainer, ClrTextareaModule, ClrTimeline, ClrTimelineLayout, ClrTimelineModule, ClrTimelineStep, ClrTimelineStepDescription, ClrTimelineStepHeader, ClrTimelineStepState, ClrTimelineStepTitle, ClrTooltip, ClrTooltipContent, ClrTooltipModule, ClrTooltipTrigger, ClrTree, ClrTreeNode, ClrTreeNodeLink, ClrTreeViewModule, ClrVerticalNav, ClrVerticalNavGroup, ClrVerticalNavGroupChildren, ClrVerticalNavIcon, ClrVerticalNavLink, ClrVerticalNavModule, ClrWizard, ClrWizardButton, ClrWizardHeaderAction, ClrWizardModule, ClrWizardPage, ClrWizardPageButtons, ClrWizardPageHeaderActions, ClrWizardPageNavTitle, ClrWizardPageTitle, ClrWizardStepnav, ClrWizardStepnavItem, ClrWizardTitle, ClrYearpicker, DEFAULT_BUTTON_TYPES, DatagridNumericFilter, DatagridPropertyComparator, DatagridPropertyNumericFilter, DatagridPropertyStringFilter, DatagridStringFilter, EXPANDABLE_ANIMATION_DIRECTIVES, FOCUS_ON_VIEW_INIT, FOCUS_ON_VIEW_INIT_DIRECTIVES, IS_TOGGLE, IS_TOGGLE_PROVIDER, LoadingListener, MainContainerWillyWonka, NavDetectionOompaLoompa, TOGGLE_SERVICE, TOGGLE_SERVICE_PROVIDER, ToggleServiceFactory, WrappedFormControl, collapse, commonStringsDefault, fade, fadeSlide, isToggleFactory, slide, AccordionOompaLoompa as ÇlrAccordionOompaLoompa, AccordionWillyWonka as ÇlrAccordionWillyWonka, ActionableOompaLoompa as ÇlrActionableOompaLoompa, ActiveOompaLoompa as ÇlrActiveOompaLoompa, ClrPopoverCloseButton as ÇlrClrPopoverCloseButton, ClrPopoverModuleNext as ÇlrClrPopoverModuleNext, ClrPopoverOpenCloseButton as ÇlrClrPopoverOpenCloseButton, DatagridCellRenderer as ÇlrDatagridCellRenderer, DatagridDetailRegisterer as ÇlrDatagridDetailRegisterer, DatagridHeaderRenderer as ÇlrDatagridHeaderRenderer, DatagridMainRenderer as ÇlrDatagridMainRenderer, DatagridRowRenderer as ÇlrDatagridRowRenderer, ClrDatagridSelectionCellDirective as ÇlrDatagridSelectionCellDirective, ClrDatagridVirtualScrollDirective as ÇlrDatagridVirtualScrollDirective, DatagridWillyWonka as ÇlrDatagridWillyWonka, ExpandableOompaLoompa as ÇlrExpandableOompaLoompa, StepperOompaLoompa as ÇlrStepperOompaLoompa, StepperWillyWonka as ÇlrStepperWillyWonka, TabsWillyWonka as ÇlrTabsWillyWonka, WrappedCell as ÇlrWrappedCell, WrappedColumn as ÇlrWrappedColumn, WrappedRow as ÇlrWrappedRow };
28557
29269
  //# sourceMappingURL=clr-angular.mjs.map