@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';
@@ -273,6 +273,8 @@ const commonStringsDefault = {
273
273
  close: 'Close',
274
274
  show: 'Show',
275
275
  hide: 'Hide',
276
+ apply: 'Apply',
277
+ cancel: 'Cancel',
276
278
  expand: 'Expand',
277
279
  collapse: 'Collapse',
278
280
  more: 'More',
@@ -314,6 +316,7 @@ const commonStringsDefault = {
314
316
  singleActionableAriaLabel: 'Single actionable header',
315
317
  detailExpandableAriaLabel: 'Toggle more row content',
316
318
  datagridFilterAriaLabel: '{COLUMN} filter',
319
+ datagridFilterLabel: '{COLUMN} filter',
317
320
  datagridFilterDialogAriaLabel: 'Filter dialog',
318
321
  columnSeparatorAriaLabel: 'Column resize handle',
319
322
  columnSeparatorDescription: 'Use left or right key to resize the column',
@@ -4534,6 +4537,9 @@ class NgControlService {
4534
4537
  this._controlChanges = new Subject();
4535
4538
  this._helpers = new Subject();
4536
4539
  }
4540
+ get control() {
4541
+ return this._control;
4542
+ }
4537
4543
  get controlChanges() {
4538
4544
  return this._controlChanges.asObservable();
4539
4545
  }
@@ -4541,6 +4547,7 @@ class NgControlService {
4541
4547
  return this._helpers.asObservable();
4542
4548
  }
4543
4549
  setControl(control) {
4550
+ this._control = control;
4544
4551
  this._controlChanges.next(control);
4545
4552
  }
4546
4553
  setHelpers(state) {
@@ -4567,35 +4574,19 @@ var CONTROL_STATE;
4567
4574
  })(CONTROL_STATE || (CONTROL_STATE = {}));
4568
4575
  class IfControlStateService {
4569
4576
  constructor(ngControlService) {
4570
- this.subscriptions = [];
4571
- // Implement our own status changes observable, since Angular controls don't
4572
- this._statusChanges = new BehaviorSubject(CONTROL_STATE.NONE);
4573
- // Wait for the control to be available
4574
- this.subscriptions.push(ngControlService.controlChanges.subscribe(control => {
4575
- if (control) {
4576
- this.control = control;
4577
- // Subscribe to the status change events, only after touched
4578
- // and emit the control
4579
- this.subscriptions.push(this.control.statusChanges.subscribe(() => {
4580
- this.triggerStatusChange();
4581
- }));
4582
- }
4583
- }));
4584
- }
4585
- get statusChanges() {
4586
- return this._statusChanges.asObservable();
4587
- }
4588
- ngOnDestroy() {
4589
- this.subscriptions.forEach(subscription => subscription.unsubscribe());
4577
+ this.triggerStatusChangeSubject = new Subject();
4578
+ this.statusChanges = this.getStatusChanges(ngControlService).pipe(shareReplay(1));
4590
4579
  }
4591
4580
  triggerStatusChange() {
4592
- /* Check if control is defined and run the code only then */
4593
- if (this.control) {
4581
+ this.triggerStatusChangeSubject.next();
4582
+ }
4583
+ getStatusChanges(ngControlService) {
4584
+ return ngControlService.controlChanges.pipe(switchMap(control => control ? merge(control.statusChanges, this.triggerStatusChangeSubject.pipe(map$1(() => control.status))) : EMPTY), map$1(controlStatus => {
4594
4585
  // These status values are mutually exclusive, so a control
4595
4586
  // cannot be both valid AND invalid or invalid AND disabled.
4596
- const status = CONTROL_STATE[this.control.status];
4597
- this._statusChanges.next(['VALID', 'INVALID'].includes(status) ? status : CONTROL_STATE.NONE);
4598
- }
4587
+ const status = CONTROL_STATE[controlStatus];
4588
+ return [CONTROL_STATE.VALID, CONTROL_STATE.INVALID].includes(status) ? status : CONTROL_STATE.NONE;
4589
+ }), startWith$1(CONTROL_STATE.NONE));
4599
4590
  }
4600
4591
  }
4601
4592
  IfControlStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: IfControlStateService, deps: [{ token: NgControlService }], target: i0.ɵɵFactoryTarget.Injectable });
@@ -6503,6 +6494,9 @@ class ClrLabel {
6503
6494
  return this.el.nativeElement && this.el.nativeElement.textContent;
6504
6495
  }
6505
6496
  ngOnInit() {
6497
+ // Prevent id attributes from being removed by the `undefined` host binding.
6498
+ // This happens when a `label` is used outside of a control container and other use cases.
6499
+ this.idAttr = this.idInput;
6506
6500
  // Only add the clr-control-label if it is inside a control container
6507
6501
  if (this.controlIdService || this.ngControlService) {
6508
6502
  this.renderer.addClass(this.el.nativeElement, 'clr-control-label');
@@ -6708,10 +6702,16 @@ class ClrAbstractContainer {
6708
6702
  return Boolean(this.controlHelperComponent);
6709
6703
  }
6710
6704
  get showValid() {
6711
- return this.touched && this.state === CONTROL_STATE.VALID && !!this.controlSuccessComponent;
6705
+ return this.touched && this.state === CONTROL_STATE.VALID && this.successMessagePresent;
6712
6706
  }
6713
6707
  get showInvalid() {
6714
- return this.touched && this.state === CONTROL_STATE.INVALID && !!this.controlErrorComponent;
6708
+ return this.touched && this.state === CONTROL_STATE.INVALID && this.errorMessagePresent;
6709
+ }
6710
+ get successMessagePresent() {
6711
+ return !!this.controlSuccessComponent;
6712
+ }
6713
+ get errorMessagePresent() {
6714
+ return !!this.controlErrorComponent;
6715
6715
  }
6716
6716
  get touched() {
6717
6717
  return this.control?.touched;
@@ -9021,7 +9021,7 @@ class ClrCombobox extends WrappedFormControl {
9021
9021
  return this.optionSelectionService.displayField;
9022
9022
  }
9023
9023
  get disabled() {
9024
- return this.control && this.control.disabled;
9024
+ return this.control?.disabled;
9025
9025
  }
9026
9026
  ngAfterContentInit() {
9027
9027
  this.initializeSubscriptions();
@@ -9045,7 +9045,7 @@ class ClrCombobox extends WrappedFormControl {
9045
9045
  const multiModel = this.optionSelectionService.selectionModel.model;
9046
9046
  if (multiModel && multiModel.length > 0) {
9047
9047
  const lastItem = multiModel[multiModel.length - 1];
9048
- this.control.control.markAsTouched();
9048
+ this.control?.control.markAsTouched();
9049
9049
  this.optionSelectionService.unselect(lastItem);
9050
9050
  }
9051
9051
  }
@@ -9066,11 +9066,11 @@ class ClrCombobox extends WrappedFormControl {
9066
9066
  }
9067
9067
  }
9068
9068
  onBlur() {
9069
- this.onTouchedCallback();
9070
- if (this.control.control.updateOn === 'change' && this.control.control?.errors?.required) {
9069
+ this.onTouchedCallback?.();
9070
+ if (this.control?.control.updateOn === 'change' && this.control.control.errors?.required) {
9071
9071
  this.updateControlValue();
9072
9072
  }
9073
- if (this.control.control.updateOn === 'blur') {
9073
+ if (this.control?.control.updateOn === 'blur') {
9074
9074
  this.control.control.updateValueAndValidity();
9075
9075
  }
9076
9076
  this.focused = false;
@@ -9150,7 +9150,7 @@ class ClrCombobox extends WrappedFormControl {
9150
9150
  }));
9151
9151
  if (this.controlStateService) {
9152
9152
  this.subscriptions.push(this.controlStateService.statusChanges.subscribe(invalid => {
9153
- this.invalid = this.control.control.touched && invalid === CONTROL_STATE.INVALID;
9153
+ this.invalid = this.control?.control.touched && invalid === CONTROL_STATE.INVALID;
9154
9154
  }));
9155
9155
  }
9156
9156
  }
@@ -9419,7 +9419,11 @@ ClrInputContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", vers
9419
9419
  <label *ngIf="!label && addGrid()"></label>
9420
9420
  <div class="clr-control-container" [ngClass]="controlClass()">
9421
9421
  <div class="clr-input-wrapper">
9422
- <ng-content select="[clrInput]"></ng-content>
9422
+ <div class="clr-input-group">
9423
+ <ng-content select="[clrInputPrefix]"></ng-content>
9424
+ <ng-content select="[clrInput]"></ng-content>
9425
+ <ng-content select="[clrInputSuffix]"></ng-content>
9426
+ </div>
9423
9427
  <cds-icon
9424
9428
  *ngIf="showInvalid"
9425
9429
  class="clr-validate-icon"
@@ -9449,7 +9453,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
9449
9453
  <label *ngIf="!label && addGrid()"></label>
9450
9454
  <div class="clr-control-container" [ngClass]="controlClass()">
9451
9455
  <div class="clr-input-wrapper">
9452
- <ng-content select="[clrInput]"></ng-content>
9456
+ <div class="clr-input-group">
9457
+ <ng-content select="[clrInputPrefix]"></ng-content>
9458
+ <ng-content select="[clrInput]"></ng-content>
9459
+ <ng-content select="[clrInputSuffix]"></ng-content>
9460
+ </div>
9453
9461
  <cds-icon
9454
9462
  *ngIf="showInvalid"
9455
9463
  class="clr-validate-icon"
@@ -9489,6 +9497,15 @@ class ClrInput extends WrappedFormControl {
9489
9497
  constructor(vcr, injector, control, renderer, el) {
9490
9498
  super(vcr, ClrInputContainer, injector, control, renderer, el);
9491
9499
  this.index = 1;
9500
+ if (this.el.nativeElement.getAttribute('type') === 'number') {
9501
+ console.warn(`Warning: Inputs of type "number" should utilize the number-input component for proper handling.\n
9502
+ Example usage:
9503
+ <clr-number-input-container>
9504
+ <label>Number Input</label>
9505
+ <input clrNumberInput type="number"/>
9506
+ </clr-number-input-container>
9507
+ `);
9508
+ }
9492
9509
  }
9493
9510
  }
9494
9511
  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 });
@@ -10056,6 +10073,14 @@ class CalendarViewModel {
10056
10073
  this.setFocusableFlag(day, true);
10057
10074
  this.focusableDay = day;
10058
10075
  }
10076
+ /**
10077
+ * Updates the selected day in the calendar
10078
+ */
10079
+ updateSelectedDay(day) {
10080
+ this.setSelectedDay(this.selectedDay, false);
10081
+ this.selectedDay = day;
10082
+ this.setSelectedDay(day, true);
10083
+ }
10059
10084
  /**
10060
10085
  * Generates a 6x7 matrix of DayViewModel based on the Calendar.
10061
10086
  * The 6x7 matrix is structured according to the first day of the week.
@@ -10145,9 +10170,7 @@ class CalendarViewModel {
10145
10170
  * Initialize the selected day if the day is in the calendar.
10146
10171
  */
10147
10172
  initializeSelectedDay() {
10148
- if (this.selectedDay && this.isDayInCalendarView(this.selectedDay)) {
10149
- this.currMonthDayViews[this.selectedDay.date - 1].isSelected = true;
10150
- }
10173
+ this.setSelectedDay(this.selectedDay, true);
10151
10174
  }
10152
10175
  /**
10153
10176
  * Initializes the focusable day if the day is in the calendar. If focusable day is not set, then
@@ -10176,6 +10199,11 @@ class CalendarViewModel {
10176
10199
  this.currMonthDayViews[day.date - 1].isFocusable = flag;
10177
10200
  }
10178
10201
  }
10202
+ setSelectedDay(day, flag) {
10203
+ if (day && this.isDayInCalendarView(day)) {
10204
+ this.currMonthDayViews[day?.date - 1].isSelected = flag;
10205
+ }
10206
+ }
10179
10207
  }
10180
10208
 
10181
10209
  /*
@@ -10356,6 +10384,7 @@ class CalendarModel {
10356
10384
  */
10357
10385
  class DateNavigationService {
10358
10386
  constructor() {
10387
+ this.hasActionButtons = false;
10359
10388
  this._todaysFullDate = new Date();
10360
10389
  this._selectedDayChange = new Subject();
10361
10390
  this._displayedCalendarChange = new Subject();
@@ -10391,11 +10420,12 @@ class DateNavigationService {
10391
10420
  }
10392
10421
  /**
10393
10422
  * Notifies that the selected day has changed so that the date can be emitted to the user.
10394
- * Note: Only to be called from day.ts
10395
10423
  */
10396
- notifySelectedDayChanged(dayModel) {
10424
+ notifySelectedDayChanged(dayModel, { emitEvent } = { emitEvent: true }) {
10397
10425
  this.selectedDay = dayModel;
10398
- this._selectedDayChange.next(dayModel);
10426
+ if (emitEvent) {
10427
+ this._selectedDayChange.next(dayModel);
10428
+ }
10399
10429
  }
10400
10430
  /**
10401
10431
  * Initializes the calendar based on the selected day.
@@ -10447,6 +10477,9 @@ class DateNavigationService {
10447
10477
  }
10448
10478
  this._focusOnCalendarChange.next();
10449
10479
  }
10480
+ resetSelectedDay() {
10481
+ this.selectedDay = this.persistedDate;
10482
+ }
10450
10483
  // not a setter because i want this to remain private
10451
10484
  setDisplayedCalendar(value) {
10452
10485
  if (!this._displayedCalendar.isEqual(value)) {
@@ -10720,11 +10753,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
10720
10753
  * The full license information can be found in LICENSE in the root directory of this project.
10721
10754
  */
10722
10755
  class ClrDay {
10723
- constructor(_dateNavigationService, _toggleService, dateFormControlService, commonStrings) {
10756
+ constructor(_dateNavigationService, commonStrings) {
10724
10757
  this._dateNavigationService = _dateNavigationService;
10725
- this._toggleService = _toggleService;
10726
- this.dateFormControlService = dateFormControlService;
10727
10758
  this.commonStrings = commonStrings;
10759
+ this.onSelectDay = new EventEmitter();
10728
10760
  }
10729
10761
  /**
10730
10762
  * DayViewModel input which is used to build the Day View.
@@ -10756,13 +10788,11 @@ class ClrDay {
10756
10788
  return;
10757
10789
  }
10758
10790
  const day = this.dayView.dayModel;
10759
- this._dateNavigationService.notifySelectedDayChanged(day);
10760
- this.dateFormControlService.markAsDirty();
10761
- this._toggleService.open = false;
10791
+ this.onSelectDay.emit(day);
10762
10792
  }
10763
10793
  }
10764
- 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 });
10765
- 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: `
10794
+ 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 });
10795
+ 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: `
10766
10796
  <button
10767
10797
  class="day-btn"
10768
10798
  type="button"
@@ -10804,7 +10834,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
10804
10834
  `,
10805
10835
  host: { '[class.day]': 'true' },
10806
10836
  }]
10807
- }], ctorParameters: function () { return [{ type: DateNavigationService }, { type: ClrPopoverToggleService }, { type: DateFormControlService }, { type: ClrCommonStringsService }]; }, propDecorators: { dayView: [{
10837
+ }], ctorParameters: function () { return [{ type: DateNavigationService }, { type: ClrCommonStringsService }]; }, propDecorators: { onSelectDay: [{
10838
+ type: Output,
10839
+ args: ['selectDay']
10840
+ }], dayView: [{
10808
10841
  type: Input,
10809
10842
  args: ['clrDayView']
10810
10843
  }] } });
@@ -10816,12 +10849,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
10816
10849
  * The full license information can be found in LICENSE in the root directory of this project.
10817
10850
  */
10818
10851
  class ClrCalendar {
10819
- constructor(_localeHelperService, _dateNavigationService, _datepickerFocusService, _dateIOService, _elRef) {
10852
+ constructor(_localeHelperService, _dateNavigationService, _datepickerFocusService, _dateIOService, _elRef, _dateFormControlService, _toggleService) {
10820
10853
  this._localeHelperService = _localeHelperService;
10821
10854
  this._dateNavigationService = _dateNavigationService;
10822
10855
  this._datepickerFocusService = _datepickerFocusService;
10823
10856
  this._dateIOService = _dateIOService;
10824
10857
  this._elRef = _elRef;
10858
+ this._dateFormControlService = _dateFormControlService;
10859
+ this._toggleService = _toggleService;
10825
10860
  this._subs = [];
10826
10861
  this.generateCalendarView();
10827
10862
  this.initializeSubscriptions();
@@ -10883,6 +10918,15 @@ class ClrCalendar {
10883
10918
  }
10884
10919
  }
10885
10920
  }
10921
+ setSelectedDay(day) {
10922
+ const hasActionButtons = this._dateNavigationService.hasActionButtons;
10923
+ this.calendarViewModel.updateSelectedDay(day);
10924
+ this._dateNavigationService.notifySelectedDayChanged(day, { emitEvent: !hasActionButtons });
10925
+ if (!hasActionButtons) {
10926
+ this._dateFormControlService.markAsDirty();
10927
+ this._toggleService.open = false;
10928
+ }
10929
+ }
10886
10930
  /**
10887
10931
  * Initialize subscriptions to:
10888
10932
  * 1. update the calendar view model.
@@ -10907,12 +10951,12 @@ class ClrCalendar {
10907
10951
  this.calendarViewModel = new CalendarViewModel(this.calendar, this.selectedDay, this.focusedDay, this.today, this._localeHelperService.firstDayOfWeek, this._dateIOService.disabledDates);
10908
10952
  }
10909
10953
  }
10910
- 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 });
10911
- 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"] }] });
10954
+ 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 });
10955
+ 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"] }] });
10912
10956
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrCalendar, decorators: [{
10913
10957
  type: Component,
10914
- 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" }]
10915
- }], ctorParameters: function () { return [{ type: LocaleHelperService }, { type: DateNavigationService }, { type: DatepickerFocusService }, { type: DateIOService }, { type: i0.ElementRef }]; }, propDecorators: { onKeyDown: [{
10958
+ 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" }]
10959
+ }], ctorParameters: function () { return [{ type: LocaleHelperService }, { type: DateNavigationService }, { type: DatepickerFocusService }, { type: DateIOService }, { type: i0.ElementRef }, { type: DateFormControlService }, { type: ClrPopoverToggleService }]; }, propDecorators: { onKeyDown: [{
10916
10960
  type: HostListener,
10917
10961
  args: ['keydown', ['$event']]
10918
10962
  }] } });
@@ -11489,6 +11533,50 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
11489
11533
  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" }]
11490
11534
  }], ctorParameters: function () { return [{ type: ViewManagerService }, { type: DateNavigationService }, { type: LocaleHelperService }, { type: ClrCommonStringsService }]; } });
11491
11535
 
11536
+ /*
11537
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
11538
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
11539
+ * This software is released under MIT license.
11540
+ * The full license information can be found in LICENSE in the root directory of this project.
11541
+ */
11542
+ class ClrDatepickerActions {
11543
+ constructor(commonStrings, toggleService, dateNavigationService, dateFormControlService) {
11544
+ this.commonStrings = commonStrings;
11545
+ this.toggleService = toggleService;
11546
+ this.dateNavigationService = dateNavigationService;
11547
+ this.dateFormControlService = dateFormControlService;
11548
+ }
11549
+ apply() {
11550
+ if (this.dateNavigationService.selectedDay) {
11551
+ this.dateNavigationService.notifySelectedDayChanged(this.dateNavigationService.selectedDay);
11552
+ this.dateFormControlService.markAsDirty();
11553
+ }
11554
+ this.toggleService.open = false;
11555
+ }
11556
+ cancel() {
11557
+ this.dateNavigationService.resetSelectedDay();
11558
+ this.toggleService.open = false;
11559
+ }
11560
+ }
11561
+ 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 });
11562
+ 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: `
11563
+ <button class="btn btn-outline" (click)="cancel()">{{ commonStrings.keys.cancel }}</button>
11564
+ <button class="btn btn-primary" (click)="apply()">{{ commonStrings.keys.apply }}</button>
11565
+ `, isInline: true });
11566
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatepickerActions, decorators: [{
11567
+ type: Component,
11568
+ args: [{
11569
+ selector: 'clr-datepicker-actions',
11570
+ template: `
11571
+ <button class="btn btn-outline" (click)="cancel()">{{ commonStrings.keys.cancel }}</button>
11572
+ <button class="btn btn-primary" (click)="apply()">{{ commonStrings.keys.apply }}</button>
11573
+ `,
11574
+ host: {
11575
+ '[class.datepicker-actions]': 'true',
11576
+ },
11577
+ }]
11578
+ }], ctorParameters: function () { return [{ type: ClrCommonStringsService }, { type: ClrPopoverToggleService }, { type: DateNavigationService }, { type: DateFormControlService }]; } });
11579
+
11492
11580
  /*
11493
11581
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
11494
11582
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -11496,9 +11584,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
11496
11584
  * The full license information can be found in LICENSE in the root directory of this project.
11497
11585
  */
11498
11586
  class ClrDatepickerViewManager {
11499
- constructor(commonStrings, viewManagerService) {
11587
+ constructor(commonStrings, viewManagerService, dateNavigationService) {
11500
11588
  this.commonStrings = commonStrings;
11501
11589
  this.viewManagerService = viewManagerService;
11590
+ this.dateNavigationService = dateNavigationService;
11502
11591
  }
11503
11592
  /**
11504
11593
  * Returns if the current view is the monthpicker.
@@ -11518,18 +11607,22 @@ class ClrDatepickerViewManager {
11518
11607
  get isDayView() {
11519
11608
  return this.viewManagerService.isDayView;
11520
11609
  }
11610
+ get hasActionButtons() {
11611
+ return this.dateNavigationService.hasActionButtons;
11612
+ }
11521
11613
  }
11522
- 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 });
11523
- 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" }] });
11614
+ 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 });
11615
+ 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" }] });
11524
11616
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatepickerViewManager, decorators: [{
11525
11617
  type: Component,
11526
11618
  args: [{ selector: 'clr-datepicker-view-manager', providers: [DatepickerFocusService], host: {
11527
11619
  '[class.datepicker]': 'true',
11620
+ '[class.has-action-buttons]': 'hasActionButtons',
11528
11621
  '[attr.aria-modal]': 'true',
11529
11622
  '[attr.aria-label]': 'commonStrings.keys.datepickerDialogLabel',
11530
11623
  role: 'dialog',
11531
- }, 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" }]
11532
- }], ctorParameters: function () { return [{ type: ClrCommonStringsService }, { type: ViewManagerService }]; } });
11624
+ }, 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" }]
11625
+ }], ctorParameters: function () { return [{ type: ClrCommonStringsService }, { type: ViewManagerService }, { type: DateNavigationService }]; } });
11533
11626
 
11534
11627
  /*
11535
11628
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
@@ -11560,6 +11653,9 @@ class ClrDateContainer extends ClrAbstractContainer {
11560
11653
  dateFormControlService.markAsTouched();
11561
11654
  }));
11562
11655
  }
11656
+ set showActionButtons(flag) {
11657
+ this.dateNavigationService.hasActionButtons = flag;
11658
+ }
11563
11659
  set clrPosition(position) {
11564
11660
  if (position && ClrPopoverPositions[position]) {
11565
11661
  this.viewManagerService.position = ClrPopoverPositions[position];
@@ -11594,6 +11690,7 @@ class ClrDateContainer extends ClrAbstractContainer {
11594
11690
  }
11595
11691
  else {
11596
11692
  this.toggleButton.nativeElement.focus();
11693
+ this.dateNavigationService.resetSelectedDay();
11597
11694
  }
11598
11695
  }));
11599
11696
  this.subscriptions.push(this.listenForDateChanges());
@@ -11634,7 +11731,7 @@ class ClrDateContainer extends ClrAbstractContainer {
11634
11731
  }
11635
11732
  }
11636
11733
  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 });
11637
- 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: [
11734
+ 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: [
11638
11735
  ControlIdService,
11639
11736
  LocaleHelperService,
11640
11737
  ControlClassService,
@@ -11757,7 +11854,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
11757
11854
  }]
11758
11855
  }], ctorParameters: function () { 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: [{
11759
11856
  type: Optional
11760
- }] }, { type: NgControlService }, { type: IfControlStateService }]; }, propDecorators: { clrPosition: [{
11857
+ }] }, { type: NgControlService }, { type: IfControlStateService }]; }, propDecorators: { showActionButtons: [{
11858
+ type: Input,
11859
+ args: ['showActionButtons']
11860
+ }], clrPosition: [{
11761
11861
  type: Input,
11762
11862
  args: ['clrPosition']
11763
11863
  }], actionButton: [{
@@ -11904,7 +12004,7 @@ class ClrDateInput extends WrappedFormControl {
11904
12004
  this.previousDateChange = date;
11905
12005
  }
11906
12006
  if (this.dateNavigationService) {
11907
- this.dateNavigationService.selectedDay = date
12007
+ this.dateNavigationService.persistedDate = this.dateNavigationService.selectedDay = date
11908
12008
  ? new DayModel(date.getFullYear(), date.getMonth(), date.getDate())
11909
12009
  : null;
11910
12010
  }
@@ -11953,7 +12053,7 @@ class ClrDateInput extends WrappedFormControl {
11953
12053
  }
11954
12054
  listenForControlValueChanges() {
11955
12055
  return of(this.datepickerHasFormControl())
11956
- .pipe(filter(hasControl => hasControl), switchMap(() => this.control.valueChanges),
12056
+ .pipe(filter(hasControl => hasControl), switchMap$1(() => this.control.valueChanges),
11957
12057
  // only update date value if not being set by user
11958
12058
  filter(() => !this.datepickerFocusService.elementIsFocused(this.el.nativeElement)))
11959
12059
  .subscribe((value) => this.updateDate(this.dateIOService.getDateValueFromDateString(value)));
@@ -12095,6 +12195,7 @@ const CLR_DATEPICKER_DIRECTIVES = [
12095
12195
  ClrYearpicker,
12096
12196
  ClrDaypicker,
12097
12197
  ClrCalendar,
12198
+ ClrDatepickerActions,
12098
12199
  ];
12099
12200
  class ClrDatepickerModule {
12100
12201
  constructor() {
@@ -12110,7 +12211,8 @@ ClrDatepickerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", ver
12110
12211
  ClrMonthpicker,
12111
12212
  ClrYearpicker,
12112
12213
  ClrDaypicker,
12113
- ClrCalendar], imports: [CommonModule,
12214
+ ClrCalendar,
12215
+ ClrDatepickerActions], imports: [CommonModule,
12114
12216
  CdkTrapFocusModule,
12115
12217
  ClrHostWrappingModule,
12116
12218
  ClrConditionalModule,
@@ -12124,7 +12226,8 @@ ClrDatepickerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", ver
12124
12226
  ClrMonthpicker,
12125
12227
  ClrYearpicker,
12126
12228
  ClrDaypicker,
12127
- ClrCalendar] });
12229
+ ClrCalendar,
12230
+ ClrDatepickerActions] });
12128
12231
  ClrDatepickerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatepickerModule, imports: [CommonModule,
12129
12232
  CdkTrapFocusModule,
12130
12233
  ClrHostWrappingModule,
@@ -12149,6 +12252,257 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12149
12252
  }]
12150
12253
  }], ctorParameters: function () { return []; } });
12151
12254
 
12255
+ /*
12256
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12257
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
12258
+ * This software is released under MIT license.
12259
+ * The full license information can be found in LICENSE in the root directory of this project.
12260
+ */
12261
+ function buildFileList(files) {
12262
+ const dataTransfer = new DataTransfer();
12263
+ for (const file of files) {
12264
+ dataTransfer.items.add(file);
12265
+ }
12266
+ return dataTransfer.files;
12267
+ }
12268
+ function selectFiles(fileInputElement, files) {
12269
+ fileInputElement.files = files instanceof FileList ? files : buildFileList(files);
12270
+ fileInputElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
12271
+ }
12272
+ function clearFiles(fileInputElement) {
12273
+ fileInputElement.value = '';
12274
+ fileInputElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
12275
+ }
12276
+
12277
+ /*
12278
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12279
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
12280
+ * This software is released under MIT license.
12281
+ * The full license information can be found in LICENSE in the root directory of this project.
12282
+ */
12283
+ const CLR_FILE_MESSAGES_TEMPLATE_CONTEXT = new InjectionToken('ClrFileMessagesTemplateContext');
12284
+ class ClrFileInfo {
12285
+ }
12286
+ ClrFileInfo.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInfo, deps: [], target: i0.ɵɵFactoryTarget.Component });
12287
+ 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 });
12288
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInfo, decorators: [{
12289
+ type: Component,
12290
+ args: [{
12291
+ selector: 'clr-file-info',
12292
+ template: `<ng-content></ng-content>`,
12293
+ host: {
12294
+ '[class.clr-subtext]': 'true',
12295
+ },
12296
+ }]
12297
+ }] });
12298
+ class ClrFileSuccess {
12299
+ constructor() {
12300
+ this.context = inject(CLR_FILE_MESSAGES_TEMPLATE_CONTEXT);
12301
+ }
12302
+ }
12303
+ ClrFileSuccess.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileSuccess, deps: [], target: i0.ɵɵFactoryTarget.Component });
12304
+ 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"] }] });
12305
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileSuccess, decorators: [{
12306
+ type: Component,
12307
+ args: [{
12308
+ selector: 'clr-file-success',
12309
+ // We check for success here so that consumers don't have to.
12310
+ template: `<ng-content *ngIf="context.success"></ng-content>`,
12311
+ host: {
12312
+ '[style.display]': 'context.success ? "inline-block" : "none"',
12313
+ '[class.clr-subtext]': 'true',
12314
+ '[class.success]': 'true',
12315
+ },
12316
+ }]
12317
+ }] });
12318
+ class ClrFileError {
12319
+ }
12320
+ ClrFileError.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileError, deps: [], target: i0.ɵɵFactoryTarget.Component });
12321
+ 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 });
12322
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileError, decorators: [{
12323
+ type: Component,
12324
+ args: [{
12325
+ selector: 'clr-file-error',
12326
+ // The host should have an `*ngIf` or `@if` that checks for the relevant error.
12327
+ template: `<ng-content></ng-content>`,
12328
+ host: {
12329
+ '[class.clr-subtext]': 'true',
12330
+ '[class.error]': 'true',
12331
+ },
12332
+ }]
12333
+ }] });
12334
+
12335
+ /*
12336
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12337
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
12338
+ * This software is released under MIT license.
12339
+ * The full license information can be found in LICENSE in the root directory of this project.
12340
+ */
12341
+ class ClrFileMessagesTemplate {
12342
+ constructor() {
12343
+ this.templateRef = inject(TemplateRef);
12344
+ }
12345
+ static ngTemplateContextGuard(directive, context) {
12346
+ return true;
12347
+ }
12348
+ }
12349
+ ClrFileMessagesTemplate.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileMessagesTemplate, deps: [], target: i0.ɵɵFactoryTarget.Directive });
12350
+ ClrFileMessagesTemplate.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrFileMessagesTemplate, selector: "ng-template[clr-file-messages]", ngImport: i0 });
12351
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileMessagesTemplate, decorators: [{
12352
+ type: Directive,
12353
+ args: [{
12354
+ selector: 'ng-template[clr-file-messages]',
12355
+ }]
12356
+ }] });
12357
+
12358
+ /*
12359
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12360
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
12361
+ * This software is released under MIT license.
12362
+ * The full license information can be found in LICENSE in the root directory of this project.
12363
+ */
12364
+ class ClrFileList {
12365
+ constructor() {
12366
+ this.injector = inject(Injector);
12367
+ this.commonStrings = inject(ClrCommonStringsService);
12368
+ this.ngControlService = inject(NgControlService, { optional: true });
12369
+ this.fileInputContainer = inject(ClrFileInputContainer, { optional: true });
12370
+ if (!this.ngControlService || !this.fileInputContainer) {
12371
+ throw new Error('The clr-file-list component can only be used within a clr-file-input-container.');
12372
+ }
12373
+ }
12374
+ get files() {
12375
+ if (!this.fileInputContainer.fileInput) {
12376
+ return [];
12377
+ }
12378
+ const fileInputElement = this.fileInputContainer.fileInput.elementRef.nativeElement;
12379
+ return Array.from(fileInputElement.files).sort((a, b) => a.name.localeCompare(b.name));
12380
+ }
12381
+ getClearFileLabel(filename) {
12382
+ return this.commonStrings.parse(this.commonStrings.keys.clearFile, {
12383
+ FILE: filename,
12384
+ });
12385
+ }
12386
+ clearFile(fileToRemove) {
12387
+ if (!this.fileInputContainer.fileInput) {
12388
+ return;
12389
+ }
12390
+ const fileInputElement = this.fileInputContainer.fileInput.elementRef.nativeElement;
12391
+ const files = Array.from(fileInputElement.files);
12392
+ const newFiles = files.filter(file => file !== fileToRemove);
12393
+ selectFiles(fileInputElement, newFiles);
12394
+ this.fileInputContainer.focusBrowseButton();
12395
+ }
12396
+ createFileMessagesTemplateContext(file) {
12397
+ const fileInputErrors = this.ngControlService.control.errors || {};
12398
+ const errors = {
12399
+ accept: fileInputErrors.accept?.find(error => error.name === file.name),
12400
+ minFileSize: fileInputErrors.minFileSize?.find(error => error.name === file.name),
12401
+ maxFileSize: fileInputErrors.maxFileSize?.find(error => error.name === file.name),
12402
+ };
12403
+ const success = Object.values(errors).every(error => !error);
12404
+ return { $implicit: file, success, errors };
12405
+ }
12406
+ createFileMessagesTemplateInjector(fileMessagesTemplateContext) {
12407
+ return Injector.create({
12408
+ parent: this.injector,
12409
+ providers: [{ provide: CLR_FILE_MESSAGES_TEMPLATE_CONTEXT, useValue: fileMessagesTemplateContext }],
12410
+ });
12411
+ }
12412
+ }
12413
+ ClrFileList.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileList, deps: [], target: i0.ɵɵFactoryTarget.Component });
12414
+ 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: `
12415
+ <ng-container *ngFor="let file of files">
12416
+ <div
12417
+ *ngIf="createFileMessagesTemplateContext(file); let fileMessagesTemplateContext"
12418
+ role="listitem"
12419
+ class="clr-file-list-item"
12420
+ [ngClass]="{
12421
+ 'clr-error': !fileMessagesTemplateContext.success,
12422
+ 'clr-success': fileMessagesTemplateContext.success
12423
+ }"
12424
+ >
12425
+ <div class="clr-file-label-and-status-icon">
12426
+ <span class="label clr-file-label">
12427
+ {{ file.name }}
12428
+ <button
12429
+ class="btn btn-sm btn-link-neutral btn-icon clr-file-clear-button"
12430
+ [attr.aria-label]="getClearFileLabel(file.name)"
12431
+ (click)="clearFile(file)"
12432
+ >
12433
+ <cds-icon shape="times"></cds-icon>
12434
+ </button>
12435
+ </span>
12436
+
12437
+ <cds-icon
12438
+ class="clr-validate-icon"
12439
+ [attr.shape]="fileMessagesTemplateContext.success ? 'check-circle' : 'exclamation-circle'"
12440
+ [attr.status]="fileMessagesTemplateContext.success ? 'success' : 'danger'"
12441
+ aria-hidden="true"
12442
+ ></cds-icon>
12443
+ </div>
12444
+
12445
+ <ng-container
12446
+ [ngTemplateOutlet]="fileMessagesTemplate.templateRef"
12447
+ [ngTemplateOutletContext]="fileMessagesTemplateContext"
12448
+ [ngTemplateOutletInjector]="createFileMessagesTemplateInjector(fileMessagesTemplateContext)"
12449
+ ></ng-container>
12450
+ </div>
12451
+ </ng-container>
12452
+ `, 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" }] });
12453
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileList, decorators: [{
12454
+ type: Component,
12455
+ args: [{
12456
+ selector: 'clr-file-list',
12457
+ template: `
12458
+ <ng-container *ngFor="let file of files">
12459
+ <div
12460
+ *ngIf="createFileMessagesTemplateContext(file); let fileMessagesTemplateContext"
12461
+ role="listitem"
12462
+ class="clr-file-list-item"
12463
+ [ngClass]="{
12464
+ 'clr-error': !fileMessagesTemplateContext.success,
12465
+ 'clr-success': fileMessagesTemplateContext.success
12466
+ }"
12467
+ >
12468
+ <div class="clr-file-label-and-status-icon">
12469
+ <span class="label clr-file-label">
12470
+ {{ file.name }}
12471
+ <button
12472
+ class="btn btn-sm btn-link-neutral btn-icon clr-file-clear-button"
12473
+ [attr.aria-label]="getClearFileLabel(file.name)"
12474
+ (click)="clearFile(file)"
12475
+ >
12476
+ <cds-icon shape="times"></cds-icon>
12477
+ </button>
12478
+ </span>
12479
+
12480
+ <cds-icon
12481
+ class="clr-validate-icon"
12482
+ [attr.shape]="fileMessagesTemplateContext.success ? 'check-circle' : 'exclamation-circle'"
12483
+ [attr.status]="fileMessagesTemplateContext.success ? 'success' : 'danger'"
12484
+ aria-hidden="true"
12485
+ ></cds-icon>
12486
+ </div>
12487
+
12488
+ <ng-container
12489
+ [ngTemplateOutlet]="fileMessagesTemplate.templateRef"
12490
+ [ngTemplateOutletContext]="fileMessagesTemplateContext"
12491
+ [ngTemplateOutletInjector]="createFileMessagesTemplateInjector(fileMessagesTemplateContext)"
12492
+ ></ng-container>
12493
+ </div>
12494
+ </ng-container>
12495
+ `,
12496
+ host: {
12497
+ '[attr.role]': '"list"',
12498
+ '[class.clr-file-list]': 'true',
12499
+ },
12500
+ }]
12501
+ }], ctorParameters: function () { return []; }, propDecorators: { fileMessagesTemplate: [{
12502
+ type: ContentChild,
12503
+ args: [ClrFileMessagesTemplate]
12504
+ }] } });
12505
+
12152
12506
  /*
12153
12507
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12154
12508
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -12160,28 +12514,78 @@ class ClrFileInputContainer extends ClrAbstractContainer {
12160
12514
  super(...arguments);
12161
12515
  this.commonStrings = inject(ClrCommonStringsService);
12162
12516
  }
12517
+ get accept() {
12518
+ return this.fileInput.elementRef.nativeElement.accept;
12519
+ }
12520
+ get multiple() {
12521
+ return this.fileInput.elementRef.nativeElement.multiple;
12522
+ }
12163
12523
  get disabled() {
12164
12524
  return this.fileInput.elementRef.nativeElement.disabled;
12165
12525
  }
12526
+ get browseButtonText() {
12527
+ const selectionButtonLabel = this.fileList ? undefined : this.fileInput?.selection?.buttonLabel;
12528
+ return selectionButtonLabel || this.customButtonLabel || this.commonStrings.keys.browse;
12529
+ }
12166
12530
  get browseButtonDescribedBy() {
12167
- return `${this.label?.idAttr} ${this.fileInput.elementRef.nativeElement.getAttribute('aria-describedby')}`;
12531
+ return `${this.label?.forAttr} ${this.fileInput.elementRef.nativeElement.getAttribute('aria-describedby')}`;
12532
+ }
12533
+ get successMessagePresent() {
12534
+ return super.successMessagePresent || !!this.fileSuccessComponent;
12535
+ }
12536
+ get errorMessagePresent() {
12537
+ return super.errorMessagePresent || !!this.fileErrorComponent;
12538
+ }
12539
+ focusBrowseButton() {
12540
+ this.browseButtonElementRef.nativeElement.focus();
12168
12541
  }
12169
12542
  browse() {
12170
- this.fileInput.elementRef.nativeElement.click();
12543
+ const fileInputElementRef = this.fileList && this.multiple ? this.fileListFileInputElementRef : this.fileInput.elementRef;
12544
+ fileInputElementRef.nativeElement.click();
12171
12545
  }
12172
12546
  clearSelectedFiles() {
12173
12547
  this.fileInput.elementRef.nativeElement.value = '';
12174
12548
  this.fileInput.elementRef.nativeElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
12175
- this.browseButtonElementRef.nativeElement.focus();
12549
+ this.focusBrowseButton();
12550
+ }
12551
+ addFilesToSelection(newFiles) {
12552
+ if (!newFiles.length) {
12553
+ return;
12554
+ }
12555
+ // start with new files
12556
+ const mergedFiles = [...newFiles];
12557
+ // add existing files if a new file doesn't have the same name
12558
+ for (const existingFile of this.fileInput.elementRef.nativeElement.files) {
12559
+ if (!mergedFiles.some(file => file.name === existingFile.name)) {
12560
+ mergedFiles.push(existingFile);
12561
+ }
12562
+ }
12563
+ // update file selection
12564
+ selectFiles(this.fileInput.elementRef.nativeElement, mergedFiles);
12176
12565
  }
12177
12566
  }
12178
12567
  ClrFileInputContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputContainer, deps: null, target: i0.ɵɵFactoryTarget.Component });
12179
- 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: `
12568
+ 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: `
12180
12569
  <ng-content select="label"></ng-content>
12181
12570
  <label *ngIf="!label && addGrid()"></label>
12182
12571
  <div class="clr-control-container" [ngClass]="controlClass()">
12183
12572
  <div class="clr-file-input-wrapper">
12184
12573
  <ng-content select="[clrFileInput]"></ng-content>
12574
+
12575
+ <!-- file input to handle adding new files to selection when file list is present (prevent replacing selected files on the main file input) -->
12576
+ <input
12577
+ *ngIf="fileList"
12578
+ #fileListFileInput
12579
+ type="file"
12580
+ class="clr-file-input"
12581
+ tabindex="-1"
12582
+ aria-hidden="true"
12583
+ [accept]="accept"
12584
+ [multiple]="multiple"
12585
+ [disabled]="disabled"
12586
+ (change)="addFilesToSelection(fileListFileInput.files)"
12587
+ />
12588
+
12185
12589
  <button
12186
12590
  #browseButton
12187
12591
  type="button"
@@ -12191,12 +12595,10 @@ ClrFileInputContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0",
12191
12595
  (click)="browse()"
12192
12596
  >
12193
12597
  <cds-icon shape="folder-open"></cds-icon>
12194
- <span class="clr-file-input-browse-button-text">
12195
- {{ fileInput?.selection?.buttonLabel || customButtonLabel || commonStrings.keys.browse }}
12196
- </span>
12598
+ <span class="clr-file-input-browse-button-text">{{ browseButtonText }}</span>
12197
12599
  </button>
12198
12600
  <button
12199
- *ngIf="fileInput?.selection?.fileCount"
12601
+ *ngIf="!fileList && fileInput?.selection?.fileCount"
12200
12602
  type="button"
12201
12603
  class="btn btn-sm clr-file-input-clear-button"
12202
12604
  [attr.aria-label]="fileInput?.selection?.clearFilesButtonLabel"
@@ -12222,6 +12624,12 @@ ClrFileInputContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0",
12222
12624
  <ng-content select="clr-control-helper" *ngIf="showHelper"></ng-content>
12223
12625
  <ng-content select="clr-control-error" *ngIf="showInvalid"></ng-content>
12224
12626
  <ng-content select="clr-control-success" *ngIf="showValid"></ng-content>
12627
+
12628
+ <!-- If this is present, this file input becomes an "advanced" file input. -->
12629
+ <ng-container>
12630
+ <div class="clr-file-list-break"></div>
12631
+ <ng-content select="clr-file-list"></ng-content>
12632
+ </ng-container>
12225
12633
  </div>
12226
12634
  `, 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"] }] });
12227
12635
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputContainer, decorators: [{
@@ -12234,6 +12642,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12234
12642
  <div class="clr-control-container" [ngClass]="controlClass()">
12235
12643
  <div class="clr-file-input-wrapper">
12236
12644
  <ng-content select="[clrFileInput]"></ng-content>
12645
+
12646
+ <!-- file input to handle adding new files to selection when file list is present (prevent replacing selected files on the main file input) -->
12647
+ <input
12648
+ *ngIf="fileList"
12649
+ #fileListFileInput
12650
+ type="file"
12651
+ class="clr-file-input"
12652
+ tabindex="-1"
12653
+ aria-hidden="true"
12654
+ [accept]="accept"
12655
+ [multiple]="multiple"
12656
+ [disabled]="disabled"
12657
+ (change)="addFilesToSelection(fileListFileInput.files)"
12658
+ />
12659
+
12237
12660
  <button
12238
12661
  #browseButton
12239
12662
  type="button"
@@ -12243,12 +12666,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12243
12666
  (click)="browse()"
12244
12667
  >
12245
12668
  <cds-icon shape="folder-open"></cds-icon>
12246
- <span class="clr-file-input-browse-button-text">
12247
- {{ fileInput?.selection?.buttonLabel || customButtonLabel || commonStrings.keys.browse }}
12248
- </span>
12669
+ <span class="clr-file-input-browse-button-text">{{ browseButtonText }}</span>
12249
12670
  </button>
12250
12671
  <button
12251
- *ngIf="fileInput?.selection?.fileCount"
12672
+ *ngIf="!fileList && fileInput?.selection?.fileCount"
12252
12673
  type="button"
12253
12674
  class="btn btn-sm clr-file-input-clear-button"
12254
12675
  [attr.aria-label]="fileInput?.selection?.clearFilesButtonLabel"
@@ -12274,6 +12695,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12274
12695
  <ng-content select="clr-control-helper" *ngIf="showHelper"></ng-content>
12275
12696
  <ng-content select="clr-control-error" *ngIf="showInvalid"></ng-content>
12276
12697
  <ng-content select="clr-control-success" *ngIf="showValid"></ng-content>
12698
+
12699
+ <!-- If this is present, this file input becomes an "advanced" file input. -->
12700
+ <ng-container>
12701
+ <div class="clr-file-list-break"></div>
12702
+ <ng-content select="clr-file-list"></ng-content>
12703
+ </ng-container>
12277
12704
  </div>
12278
12705
  `,
12279
12706
  host: {
@@ -12289,9 +12716,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12289
12716
  }], fileInput: [{
12290
12717
  type: ContentChild,
12291
12718
  args: [forwardRef(() => ClrFileInput)]
12719
+ }], fileList: [{
12720
+ type: ContentChild,
12721
+ args: [forwardRef(() => ClrFileList)]
12292
12722
  }], browseButtonElementRef: [{
12293
12723
  type: ViewChild,
12294
12724
  args: ['browseButton']
12725
+ }], fileListFileInputElementRef: [{
12726
+ type: ViewChild,
12727
+ args: ['fileListFileInput']
12728
+ }], fileSuccessComponent: [{
12729
+ type: ContentChild,
12730
+ args: [ClrFileSuccess]
12731
+ }], fileErrorComponent: [{
12732
+ type: ContentChild,
12733
+ args: [ClrFileError]
12295
12734
  }] } });
12296
12735
 
12297
12736
  /*
@@ -12338,13 +12777,14 @@ class ClrFileInput extends WrappedFormControl {
12338
12777
  }
12339
12778
  }
12340
12779
  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 });
12341
- 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 });
12780
+ 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 });
12342
12781
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInput, decorators: [{
12343
12782
  type: Directive,
12344
12783
  args: [{
12345
12784
  selector: 'input[type="file"][clrFileInput]',
12346
12785
  host: {
12347
12786
  tabindex: '-1',
12787
+ 'aria-hidden': 'true',
12348
12788
  '[class.clr-file-input]': 'true',
12349
12789
  },
12350
12790
  }]
@@ -12375,33 +12815,25 @@ class ClrFileInputValidator {
12375
12815
  if (fileInputElement.required && files?.length === 0) {
12376
12816
  errors.required = true;
12377
12817
  }
12378
- // accept validation (native attribute)
12379
- if (fileInputElement.accept && files?.length > 0) {
12380
- const accept = fileInputElement.accept.split(',').map(type => type.trim());
12818
+ const accept = fileInputElement.accept ? fileInputElement.accept.split(',').map(type => type.trim()) : null;
12819
+ if (files?.length > 0 && (accept || this.minFileSize || this.maxFileSize)) {
12381
12820
  for (let i = 0; i < files.length; i++) {
12382
12821
  const file = files.item(i);
12383
- const [fileExtension] = file.name.match(/\..+$/);
12384
- if (!accept.includes(file.type) && !accept.includes(fileExtension)) {
12385
- errors.accept = errors.accept || [];
12386
- errors.accept.push({ name: file.name, accept, type: file.type, extension: fileExtension });
12822
+ // accept validation (native attribute)
12823
+ if (accept) {
12824
+ const [fileExtension] = file.name.match(/\..+$/);
12825
+ if (!accept.includes(file.type) && !accept.includes(fileExtension)) {
12826
+ errors.accept = errors.accept || [];
12827
+ errors.accept.push({ name: file.name, accept, type: file.type, extension: fileExtension });
12828
+ }
12387
12829
  }
12388
- }
12389
- }
12390
- // min file validation (custom input)
12391
- if (this.minFileSize && files?.length > 0) {
12392
- for (let i = 0; i < files.length; i++) {
12393
- const file = files.item(i);
12394
- if (file.size < this.minFileSize) {
12830
+ // min file validation (custom input)
12831
+ if (this.minFileSize && file.size < this.minFileSize) {
12395
12832
  errors.minFileSize = errors.minFileSize || [];
12396
12833
  errors.minFileSize.push({ name: file.name, minFileSize: this.minFileSize, actualFileSize: file.size });
12397
12834
  }
12398
- }
12399
- }
12400
- // max file validation (custom input)
12401
- if (this.maxFileSize && files?.length > 0) {
12402
- for (let i = 0; i < files.length; i++) {
12403
- const file = files.item(i);
12404
- if (file.size > this.maxFileSize) {
12835
+ // max file validation (custom input)
12836
+ if (this.maxFileSize && file.size > this.maxFileSize) {
12405
12837
  errors.maxFileSize = errors.maxFileSize || [];
12406
12838
  errors.maxFileSize.push({ name: file.name, maxFileSize: this.maxFileSize, actualFileSize: file.size });
12407
12839
  }
@@ -12432,21 +12864,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12432
12864
  * This software is released under MIT license.
12433
12865
  * The full license information can be found in LICENSE in the root directory of this project.
12434
12866
  */
12435
- function buildFileList(files) {
12436
- const dataTransfer = new DataTransfer();
12437
- for (const file of files) {
12438
- dataTransfer.items.add(file);
12439
- }
12440
- return dataTransfer.files;
12441
- }
12442
- function selectFiles(fileInputElement, files) {
12443
- fileInputElement.files = files instanceof FileList ? files : buildFileList(files);
12444
- fileInputElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
12445
- }
12446
- function clearFiles(fileInputElement) {
12447
- fileInputElement.value = '';
12448
- fileInputElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
12449
- }
12450
12867
 
12451
12868
  /*
12452
12869
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
@@ -12509,23 +12926,51 @@ class ClrFileInputModule {
12509
12926
  }
12510
12927
  }
12511
12928
  ClrFileInputModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
12512
- 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,
12929
+ ClrFileInputModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputModule, declarations: [ClrFileInput,
12930
+ ClrFileInputContainer,
12931
+ ClrFileInputValidator,
12932
+ ClrFileInputValueAccessor,
12933
+ ClrFileList,
12934
+ ClrFileMessagesTemplate,
12935
+ ClrFileInfo,
12936
+ ClrFileSuccess,
12937
+ ClrFileError], imports: [CommonModule, ClrIconModule, ClrCommonFormsModule], exports: [ClrCommonFormsModule,
12513
12938
  ClrFileInput,
12514
12939
  ClrFileInputContainer,
12515
12940
  ClrFileInputValidator,
12516
- ClrFileInputValueAccessor] });
12941
+ ClrFileInputValueAccessor,
12942
+ ClrFileList,
12943
+ ClrFileMessagesTemplate,
12944
+ ClrFileInfo,
12945
+ ClrFileSuccess,
12946
+ ClrFileError] });
12517
12947
  ClrFileInputModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputModule, imports: [CommonModule, ClrIconModule, ClrCommonFormsModule, ClrCommonFormsModule] });
12518
12948
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInputModule, decorators: [{
12519
12949
  type: NgModule,
12520
12950
  args: [{
12521
12951
  imports: [CommonModule, ClrIconModule, ClrCommonFormsModule],
12522
- declarations: [ClrFileInput, ClrFileInputContainer, ClrFileInputValidator, ClrFileInputValueAccessor],
12952
+ declarations: [
12953
+ ClrFileInput,
12954
+ ClrFileInputContainer,
12955
+ ClrFileInputValidator,
12956
+ ClrFileInputValueAccessor,
12957
+ ClrFileList,
12958
+ ClrFileMessagesTemplate,
12959
+ ClrFileInfo,
12960
+ ClrFileSuccess,
12961
+ ClrFileError,
12962
+ ],
12523
12963
  exports: [
12524
12964
  ClrCommonFormsModule,
12525
12965
  ClrFileInput,
12526
12966
  ClrFileInputContainer,
12527
12967
  ClrFileInputValidator,
12528
12968
  ClrFileInputValueAccessor,
12969
+ ClrFileList,
12970
+ ClrFileMessagesTemplate,
12971
+ ClrFileInfo,
12972
+ ClrFileSuccess,
12973
+ ClrFileError,
12529
12974
  ],
12530
12975
  }]
12531
12976
  }], ctorParameters: function () { return []; } });
@@ -12537,6 +12982,223 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12537
12982
  * The full license information can be found in LICENSE in the root directory of this project.
12538
12983
  */
12539
12984
 
12985
+ /*
12986
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12987
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
12988
+ * This software is released under MIT license.
12989
+ * The full license information can be found in LICENSE in the root directory of this project.
12990
+ */
12991
+ class ClrNumberInputContainer extends ClrAbstractContainer {
12992
+ constructor(controlClassService, layoutService, ngControlService, focusService, ifControlStateService) {
12993
+ super(ifControlStateService, layoutService, controlClassService, ngControlService);
12994
+ this.ifControlStateService = ifControlStateService;
12995
+ this.focus = false;
12996
+ this.subscriptions.push(focusService.focusChange.subscribe(state => (this.focus = state)));
12997
+ }
12998
+ }
12999
+ 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 });
13000
+ 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: `
13001
+ <ng-content select="label"></ng-content>
13002
+ <label *ngIf="!label && addGrid()"></label>
13003
+ <div class="clr-control-container" [ngClass]="controlClass()">
13004
+ <div class="clr-number-input-wrapper">
13005
+ <div class="clr-input-group" [class.clr-focus]="focus">
13006
+ <ng-content select="[clrNumberInput]"></ng-content>
13007
+ <div class="clr-input-group-actions">
13008
+ <button
13009
+ type="button"
13010
+ class="clr-input-group-icon-action"
13011
+ (click)="input.stepDown()"
13012
+ [disabled]="control?.disabled"
13013
+ >
13014
+ <cds-icon shape="minus" size="sm"></cds-icon>
13015
+ </button>
13016
+ <div class="clr-number-input-separator"></div>
13017
+ <button
13018
+ type="button"
13019
+ class="clr-input-group-icon-action"
13020
+ (click)="input.stepUp()"
13021
+ [disabled]="control?.disabled"
13022
+ >
13023
+ <cds-icon shape="plus" size="sm"></cds-icon>
13024
+ </button>
13025
+ </div>
13026
+ </div>
13027
+ <cds-icon
13028
+ *ngIf="showInvalid"
13029
+ class="clr-validate-icon"
13030
+ shape="exclamation-circle"
13031
+ status="danger"
13032
+ aria-hidden="true"
13033
+ ></cds-icon>
13034
+ <cds-icon
13035
+ *ngIf="showValid"
13036
+ class="clr-validate-icon"
13037
+ shape="check-circle"
13038
+ status="success"
13039
+ aria-hidden="true"
13040
+ ></cds-icon>
13041
+ </div>
13042
+ <ng-content select="clr-control-helper" *ngIf="showHelper"></ng-content>
13043
+ <ng-content select="clr-control-error" *ngIf="showInvalid"></ng-content>
13044
+ <ng-content select="clr-control-success" *ngIf="showValid"></ng-content>
13045
+ </div>
13046
+ `, 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"] }] });
13047
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrNumberInputContainer, decorators: [{
13048
+ type: Component,
13049
+ args: [{
13050
+ selector: 'clr-number-input-container',
13051
+ template: `
13052
+ <ng-content select="label"></ng-content>
13053
+ <label *ngIf="!label && addGrid()"></label>
13054
+ <div class="clr-control-container" [ngClass]="controlClass()">
13055
+ <div class="clr-number-input-wrapper">
13056
+ <div class="clr-input-group" [class.clr-focus]="focus">
13057
+ <ng-content select="[clrNumberInput]"></ng-content>
13058
+ <div class="clr-input-group-actions">
13059
+ <button
13060
+ type="button"
13061
+ class="clr-input-group-icon-action"
13062
+ (click)="input.stepDown()"
13063
+ [disabled]="control?.disabled"
13064
+ >
13065
+ <cds-icon shape="minus" size="sm"></cds-icon>
13066
+ </button>
13067
+ <div class="clr-number-input-separator"></div>
13068
+ <button
13069
+ type="button"
13070
+ class="clr-input-group-icon-action"
13071
+ (click)="input.stepUp()"
13072
+ [disabled]="control?.disabled"
13073
+ >
13074
+ <cds-icon shape="plus" size="sm"></cds-icon>
13075
+ </button>
13076
+ </div>
13077
+ </div>
13078
+ <cds-icon
13079
+ *ngIf="showInvalid"
13080
+ class="clr-validate-icon"
13081
+ shape="exclamation-circle"
13082
+ status="danger"
13083
+ aria-hidden="true"
13084
+ ></cds-icon>
13085
+ <cds-icon
13086
+ *ngIf="showValid"
13087
+ class="clr-validate-icon"
13088
+ shape="check-circle"
13089
+ status="success"
13090
+ aria-hidden="true"
13091
+ ></cds-icon>
13092
+ </div>
13093
+ <ng-content select="clr-control-helper" *ngIf="showHelper"></ng-content>
13094
+ <ng-content select="clr-control-error" *ngIf="showInvalid"></ng-content>
13095
+ <ng-content select="clr-control-success" *ngIf="showValid"></ng-content>
13096
+ </div>
13097
+ `,
13098
+ host: {
13099
+ '[class.clr-form-control]': 'true',
13100
+ '[class.clr-form-control-disabled]': 'control?.disabled',
13101
+ '[class.clr-form-control-readonly]': 'input.readonly',
13102
+ '[class.clr-row]': 'addGrid()',
13103
+ },
13104
+ providers: [FocusService, IfControlStateService, NgControlService, ControlIdService, ControlClassService],
13105
+ }]
13106
+ }], ctorParameters: function () { return [{ type: ControlClassService }, { type: LayoutService, decorators: [{
13107
+ type: Optional
13108
+ }] }, { type: NgControlService }, { type: FocusService }, { type: IfControlStateService }]; }, propDecorators: { input: [{
13109
+ type: ContentChild,
13110
+ args: [forwardRef(() => ClrNumberInput)]
13111
+ }] } });
13112
+
13113
+ /*
13114
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
13115
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
13116
+ * This software is released under MIT license.
13117
+ * The full license information can be found in LICENSE in the root directory of this project.
13118
+ */
13119
+ class ClrNumberInput extends WrappedFormControl {
13120
+ constructor(focusService, vcr, injector, control, renderer, el) {
13121
+ super(vcr, ClrNumberInputContainer, injector, control, renderer, el);
13122
+ this.focusService = focusService;
13123
+ this.control = control;
13124
+ this.el = el;
13125
+ this.index = 1;
13126
+ if (!focusService) {
13127
+ throw new Error('clrNumberInput requires being wrapped in <clr-number-input-container>');
13128
+ }
13129
+ }
13130
+ get readonly() {
13131
+ return this.el.nativeElement.getAttribute('readonly') !== null;
13132
+ }
13133
+ triggerFocus() {
13134
+ if (!this.readonly && this.focusService) {
13135
+ this.focusService.focused = true;
13136
+ }
13137
+ }
13138
+ triggerValidation() {
13139
+ if (!this.readonly) {
13140
+ super.triggerValidation();
13141
+ if (this.focusService) {
13142
+ this.focusService.focused = false;
13143
+ }
13144
+ }
13145
+ }
13146
+ stepUp() {
13147
+ this.el.nativeElement.stepUp();
13148
+ this.el.nativeElement.dispatchEvent(new Event('input', { bubbles: true, cancelable: true }));
13149
+ this.control.control.markAllAsTouched();
13150
+ }
13151
+ stepDown() {
13152
+ this.el.nativeElement.stepDown();
13153
+ this.el.nativeElement.dispatchEvent(new Event('input', { bubbles: true, cancelable: true }));
13154
+ this.control.control.markAllAsTouched();
13155
+ }
13156
+ }
13157
+ 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 });
13158
+ 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 });
13159
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrNumberInput, decorators: [{
13160
+ type: Directive,
13161
+ args: [{
13162
+ selector: 'input[type="number"][clrNumberInput]',
13163
+ host: { '[class.clr-input]': 'true', '[class.clr-number-input]': 'true' },
13164
+ }]
13165
+ }], ctorParameters: function () { return [{ type: FocusService, decorators: [{
13166
+ type: Optional
13167
+ }] }, { type: i0.ViewContainerRef }, { type: i0.Injector }, { type: i1.NgControl, decorators: [{
13168
+ type: Self
13169
+ }, {
13170
+ type: Optional
13171
+ }] }, { type: i0.Renderer2 }, { type: i0.ElementRef }]; }, propDecorators: { triggerFocus: [{
13172
+ type: HostListener,
13173
+ args: ['focus']
13174
+ }], triggerValidation: [{
13175
+ type: HostListener,
13176
+ args: ['blur']
13177
+ }] } });
13178
+
13179
+ /*
13180
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
13181
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
13182
+ * This software is released under MIT license.
13183
+ * The full license information can be found in LICENSE in the root directory of this project.
13184
+ */
13185
+ class ClrNumberInputModule {
13186
+ constructor() {
13187
+ ClarityIcons.addIcons(exclamationCircleIcon, checkCircleIcon);
13188
+ }
13189
+ }
13190
+ ClrNumberInputModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrNumberInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
13191
+ 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] });
13192
+ ClrNumberInputModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrNumberInputModule, imports: [CommonModule, FormsModule, ClrIconModule, ClrCommonFormsModule, ClrCommonFormsModule] });
13193
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrNumberInputModule, decorators: [{
13194
+ type: NgModule,
13195
+ args: [{
13196
+ imports: [CommonModule, FormsModule, ClrIconModule, ClrCommonFormsModule],
13197
+ declarations: [ClrNumberInput, ClrNumberInputContainer],
13198
+ exports: [ClrCommonFormsModule, ClrNumberInput, ClrNumberInputContainer],
13199
+ }]
13200
+ }], ctorParameters: function () { return []; } });
13201
+
12540
13202
  /*
12541
13203
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
12542
13204
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -13470,7 +14132,8 @@ ClrFormsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version:
13470
14132
  ClrSelectModule,
13471
14133
  ClrTextareaModule,
13472
14134
  ClrRangeModule,
13473
- ClrDatalistModule] });
14135
+ ClrDatalistModule,
14136
+ ClrNumberInputModule] });
13474
14137
  ClrFormsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFormsModule, imports: [CommonModule, ClrCommonFormsModule,
13475
14138
  ClrCheckboxModule,
13476
14139
  ClrComboboxModule,
@@ -13482,7 +14145,8 @@ ClrFormsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version:
13482
14145
  ClrSelectModule,
13483
14146
  ClrTextareaModule,
13484
14147
  ClrRangeModule,
13485
- ClrDatalistModule] });
14148
+ ClrDatalistModule,
14149
+ ClrNumberInputModule] });
13486
14150
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFormsModule, decorators: [{
13487
14151
  type: NgModule,
13488
14152
  args: [{
@@ -13500,6 +14164,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
13500
14164
  ClrTextareaModule,
13501
14165
  ClrRangeModule,
13502
14166
  ClrDatalistModule,
14167
+ ClrNumberInputModule,
13503
14168
  ],
13504
14169
  }]
13505
14170
  }] });
@@ -14668,10 +15333,10 @@ DatagridNumericFilter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", ve
14668
15333
  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: `
14669
15334
  <clr-dg-filter [clrDgFilter]="registered" [(clrDgFilterOpen)]="open">
14670
15335
  <div class="datagrid-numeric-filter-form">
14671
- <div class="clr-form-control">
15336
+ <clr-number-input-container>
14672
15337
  <label class="clr-control-label">{{ fromLabelValue }}</label>
14673
15338
  <input
14674
- clrInput
15339
+ clrNumberInput
14675
15340
  class="datagrid-numeric-filter-input"
14676
15341
  #input_low
14677
15342
  type="number"
@@ -14681,11 +15346,11 @@ DatagridNumericFilter.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0",
14681
15346
  [placeholder]="minPlaceholderValue"
14682
15347
  [attr.aria-label]="minPlaceholderValue"
14683
15348
  />
14684
- </div>
14685
- <div class="clr-form-control">
15349
+ </clr-number-input-container>
15350
+ <clr-number-input-container>
14686
15351
  <label class="clr-control-label">{{ toLabelValue }}</label>
14687
15352
  <input
14688
- clrInput
15353
+ clrNumberInput
14689
15354
  class="datagrid-numeric-filter-input"
14690
15355
  #input_high
14691
15356
  type="number"
@@ -14695,10 +15360,10 @@ DatagridNumericFilter.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0",
14695
15360
  [placeholder]="maxPlaceholderValue"
14696
15361
  [attr.aria-label]="maxPlaceholderValue"
14697
15362
  />
14698
- </div>
15363
+ </clr-number-input-container>
14699
15364
  </div>
14700
15365
  </clr-dg-filter>
14701
- `, 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"] }] });
15366
+ `, 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"] }] });
14702
15367
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridNumericFilter, decorators: [{
14703
15368
  type: Component,
14704
15369
  args: [{
@@ -14707,10 +15372,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
14707
15372
  template: `
14708
15373
  <clr-dg-filter [clrDgFilter]="registered" [(clrDgFilterOpen)]="open">
14709
15374
  <div class="datagrid-numeric-filter-form">
14710
- <div class="clr-form-control">
15375
+ <clr-number-input-container>
14711
15376
  <label class="clr-control-label">{{ fromLabelValue }}</label>
14712
15377
  <input
14713
- clrInput
15378
+ clrNumberInput
14714
15379
  class="datagrid-numeric-filter-input"
14715
15380
  #input_low
14716
15381
  type="number"
@@ -14720,11 +15385,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
14720
15385
  [placeholder]="minPlaceholderValue"
14721
15386
  [attr.aria-label]="minPlaceholderValue"
14722
15387
  />
14723
- </div>
14724
- <div class="clr-form-control">
15388
+ </clr-number-input-container>
15389
+ <clr-number-input-container>
14725
15390
  <label class="clr-control-label">{{ toLabelValue }}</label>
14726
15391
  <input
14727
- clrInput
15392
+ clrNumberInput
14728
15393
  class="datagrid-numeric-filter-input"
14729
15394
  #input_high
14730
15395
  type="number"
@@ -14734,7 +15399,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
14734
15399
  [placeholder]="maxPlaceholderValue"
14735
15400
  [attr.aria-label]="maxPlaceholderValue"
14736
15401
  />
14737
- </div>
15402
+ </clr-number-input-container>
14738
15403
  </div>
14739
15404
  </clr-dg-filter>
14740
15405
  `,
@@ -14881,17 +15546,20 @@ class DatagridStringFilterImpl {
14881
15546
  * The full license information can be found in LICENSE in the root directory of this project.
14882
15547
  */
14883
15548
  class DatagridStringFilter extends DatagridFilterRegistrar {
14884
- constructor(filters, domAdapter, commonStrings, smartToggleService, ngZone) {
15549
+ constructor(filters, domAdapter, commonStrings, smartToggleService, elementRef, cdr, ngZone) {
14885
15550
  super(filters);
14886
15551
  this.domAdapter = domAdapter;
14887
15552
  this.commonStrings = commonStrings;
14888
15553
  this.smartToggleService = smartToggleService;
15554
+ this.elementRef = elementRef;
15555
+ this.cdr = cdr;
14889
15556
  this.ngZone = ngZone;
14890
15557
  this.filterValueChange = new EventEmitter();
14891
15558
  /**
14892
15559
  * Indicates if the filter dropdown is open
14893
15560
  */
14894
15561
  this.open = false;
15562
+ this.labelValue = '';
14895
15563
  this.subs = [];
14896
15564
  }
14897
15565
  /**
@@ -14951,26 +15619,49 @@ class DatagridStringFilter extends DatagridFilterRegistrar {
14951
15619
  });
14952
15620
  }));
14953
15621
  }
15622
+ ngOnChanges() {
15623
+ setTimeout(() => {
15624
+ this.setFilterLabel();
15625
+ this.cdr.markForCheck();
15626
+ });
15627
+ }
14954
15628
  ngOnDestroy() {
14955
15629
  super.ngOnDestroy();
14956
15630
  this.subs.forEach(sub => sub.unsubscribe());
14957
15631
  }
15632
+ /**
15633
+ * This is not in a getter to prevent "expression has changed after it was checked" errors.
15634
+ */
15635
+ setFilterLabel() {
15636
+ if (this.label) {
15637
+ this.labelValue = this.label;
15638
+ return;
15639
+ }
15640
+ const columnElement = this.elementRef.nativeElement?.closest('clr-dg-column');
15641
+ const columnTitleElement = columnElement?.querySelector('.datagrid-column-title');
15642
+ this.labelValue = this.commonStrings.parse(this.commonStrings.keys.datagridFilterLabel, {
15643
+ COLUMN: columnTitleElement?.textContent.trim() || '',
15644
+ });
15645
+ }
14958
15646
  }
14959
- 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 });
14960
- 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: `
15647
+ 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 });
15648
+ 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: `
14961
15649
  <clr-dg-filter [clrDgFilter]="registered" [(clrDgFilterOpen)]="open">
14962
- <input
14963
- #input
14964
- type="text"
14965
- autocomplete="off"
14966
- name="search"
14967
- [(ngModel)]="value"
14968
- class="clr-input"
14969
- [attr.aria-label]="placeholderValue"
14970
- [placeholder]="placeholderValue"
14971
- />
15650
+ <clr-input-container>
15651
+ <label>{{ labelValue }}</label>
15652
+ <input
15653
+ #input
15654
+ type="text"
15655
+ autocomplete="off"
15656
+ name="search"
15657
+ [(ngModel)]="value"
15658
+ clrInput
15659
+ [attr.aria-label]="placeholderValue"
15660
+ [placeholder]="placeholderValue"
15661
+ />
15662
+ </clr-input-container>
14972
15663
  </clr-dg-filter>
14973
- `, 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"] }] });
15664
+ `, 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"] }] });
14974
15665
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridStringFilter, decorators: [{
14975
15666
  type: Component,
14976
15667
  args: [{
@@ -14978,22 +15669,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
14978
15669
  providers: [{ provide: CustomFilter, useExisting: DatagridStringFilter }],
14979
15670
  template: `
14980
15671
  <clr-dg-filter [clrDgFilter]="registered" [(clrDgFilterOpen)]="open">
14981
- <input
14982
- #input
14983
- type="text"
14984
- autocomplete="off"
14985
- name="search"
14986
- [(ngModel)]="value"
14987
- class="clr-input"
14988
- [attr.aria-label]="placeholderValue"
14989
- [placeholder]="placeholderValue"
14990
- />
15672
+ <clr-input-container>
15673
+ <label>{{ labelValue }}</label>
15674
+ <input
15675
+ #input
15676
+ type="text"
15677
+ autocomplete="off"
15678
+ name="search"
15679
+ [(ngModel)]="value"
15680
+ clrInput
15681
+ [attr.aria-label]="placeholderValue"
15682
+ [placeholder]="placeholderValue"
15683
+ />
15684
+ </clr-input-container>
14991
15685
  </clr-dg-filter>
14992
15686
  `,
14993
15687
  }]
14994
- }], ctorParameters: function () { return [{ type: FiltersProvider }, { type: DomAdapter }, { type: ClrCommonStringsService }, { type: ClrPopoverToggleService }, { type: i0.NgZone }]; }, propDecorators: { placeholder: [{
15688
+ }], ctorParameters: function () { return [{ type: FiltersProvider }, { type: DomAdapter }, { type: ClrCommonStringsService }, { type: ClrPopoverToggleService }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }]; }, propDecorators: { placeholder: [{
14995
15689
  type: Input,
14996
15690
  args: ['clrFilterPlaceholder']
15691
+ }], label: [{
15692
+ type: Input,
15693
+ args: ['clrFilterLabel']
14997
15694
  }], filterValueChange: [{
14998
15695
  type: Output,
14999
15696
  args: ['clrFilterValueChange']
@@ -16067,7 +16764,7 @@ ClrDatagridColumn.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", vers
16067
16764
 
16068
16765
  <clr-dg-column-separator *ngIf="showSeparator"></clr-dg-column-separator>
16069
16766
  </div>
16070
- `, 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 });
16767
+ `, 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 });
16071
16768
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridColumn, decorators: [{
16072
16769
  type: Component,
16073
16770
  args: [{
@@ -17387,6 +18084,9 @@ class ColumnsService {
17387
18084
  get hasHideableColumns() {
17388
18085
  return this.columnStates.filter(state => state.hideable).length > 0;
17389
18086
  }
18087
+ get visibleColumns() {
18088
+ return this.columnStates.filter(state => !state.hidden);
18089
+ }
17390
18090
  cache() {
17391
18091
  this._cache = this.columns.map(subject => {
17392
18092
  const value = { ...subject.value };
@@ -17718,7 +18418,7 @@ class ClrDatagrid {
17718
18418
  if (!this.items.smart) {
17719
18419
  this.items.all = this.rows.map((row) => row.item);
17720
18420
  }
17721
- const rowItemsChanges = this.rows.changes.pipe(switchMap((rows) => merge(
18421
+ const rowItemsChanges = this.rows.changes.pipe(switchMap$1((rows) => merge(
17722
18422
  // immediate update
17723
18423
  of(rows.map(row => row.item)),
17724
18424
  // subsequent updates once per tick
@@ -19418,11 +20118,12 @@ const defaultCdkFixedSizeVirtualScrollInputs = {
19418
20118
  maxBufferPx: 400,
19419
20119
  };
19420
20120
  class ClrDatagridVirtualScrollDirective {
19421
- constructor(changeDetectorRef, iterableDiffers, items, ngZone, templateRef, viewContainerRef, directionality, scrollDispatcher, viewportRuler, datagrid, columnsService, injector) {
20121
+ constructor(changeDetectorRef, iterableDiffers, items, ngZone, renderer2, templateRef, viewContainerRef, directionality, scrollDispatcher, viewportRuler, datagrid, columnsService, injector) {
19422
20122
  this.changeDetectorRef = changeDetectorRef;
19423
20123
  this.iterableDiffers = iterableDiffers;
19424
20124
  this.items = items;
19425
20125
  this.ngZone = ngZone;
20126
+ this.renderer2 = renderer2;
19426
20127
  this.templateRef = templateRef;
19427
20128
  this.viewContainerRef = viewContainerRef;
19428
20129
  this.directionality = directionality;
@@ -19510,7 +20211,7 @@ class ClrDatagridVirtualScrollDirective {
19510
20211
  }
19511
20212
  ngAfterViewInit() {
19512
20213
  this.injector.runInContext(() => {
19513
- this.virtualScrollViewport = this.createVirtualScrollViewportForDatagrid(this.changeDetectorRef, this.ngZone, this.directionality, this.scrollDispatcher, this.viewportRuler, this.datagridElementRef, this.virtualScrollStrategy);
20214
+ this.virtualScrollViewport = this.createVirtualScrollViewportForDatagrid(this.changeDetectorRef, this.ngZone, this.renderer2, this.directionality, this.scrollDispatcher, this.viewportRuler, this.datagridElementRef, this.virtualScrollStrategy);
19514
20215
  this.cdkVirtualFor = createCdkVirtualForOfDirective(this.viewContainerRef, this.templateRef, this.iterableDiffers, this.viewRepeater, this.virtualScrollViewport, this.ngZone);
19515
20216
  this.virtualScrollViewport.ngOnInit();
19516
20217
  });
@@ -19569,7 +20270,7 @@ class ClrDatagridVirtualScrollDirective {
19569
20270
  rowRoleElement?.setAttribute('aria-rowindex', (viewRef.context.index + 1).toString());
19570
20271
  }
19571
20272
  }
19572
- createVirtualScrollViewportForDatagrid(changeDetectorRef, ngZone, directionality, scrollDispatcher, viewportRuler, datagridElementRef, virtualScrollStrategy) {
20273
+ createVirtualScrollViewportForDatagrid(changeDetectorRef, ngZone, renderer2, directionality, scrollDispatcher, viewportRuler, datagridElementRef, virtualScrollStrategy) {
19573
20274
  const datagridDivElement = datagridElementRef.nativeElement.querySelector('.datagrid');
19574
20275
  const datagridTableElement = datagridElementRef.nativeElement.querySelector('.datagrid-table');
19575
20276
  const datagridRowsElement = datagridElementRef.nativeElement.querySelector('.datagrid-rows');
@@ -19580,7 +20281,7 @@ class ClrDatagridVirtualScrollDirective {
19580
20281
  datagridRowsElement.style.transform = `translateY(${topOffset}px)`;
19581
20282
  datagridRowsElement.style.height = `${totalContentSize - topOffset}px`;
19582
20283
  }
19583
- const virtualScrollViewport = createCdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, null);
20284
+ const virtualScrollViewport = createCdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, renderer2, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, null);
19584
20285
  virtualScrollViewport._contentWrapper = {
19585
20286
  nativeElement: {
19586
20287
  style: {
@@ -19599,7 +20300,7 @@ class ClrDatagridVirtualScrollDirective {
19599
20300
  return virtualScrollViewport;
19600
20301
  }
19601
20302
  }
19602
- 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 });
20303
+ 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 });
19603
20304
  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 });
19604
20305
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, decorators: [{
19605
20306
  type: Directive,
@@ -19609,7 +20310,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
19609
20310
  }]
19610
20311
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.IterableDiffers }, { type: Items, decorators: [{
19611
20312
  type: SkipSelf
19612
- }] }, { 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 }]; }, propDecorators: { renderedRangeChange: [{
20313
+ }] }, { 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 }]; }, propDecorators: { renderedRangeChange: [{
19613
20314
  type: Output
19614
20315
  }], cdkVirtualForOf: [{
19615
20316
  type: Input,
@@ -19633,7 +20334,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
19633
20334
  type: Input,
19634
20335
  args: ['clrVirtualRowsMaxBufferPx']
19635
20336
  }] } });
19636
- function createCdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, scrollable) {
20337
+ function createCdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, renderer2, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, scrollable) {
19637
20338
  if (+VERSION.major < 19) {
19638
20339
  return new CdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, scrollable);
19639
20340
  }
@@ -19644,6 +20345,7 @@ function createCdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef
19644
20345
  { provide: ElementRef, useValue: datagridDivElementRef },
19645
20346
  { provide: ChangeDetectorRef, useValue: changeDetectorRef },
19646
20347
  { provide: NgZone, useValue: ngZone },
20348
+ { provide: Renderer2, useValue: renderer2 },
19647
20349
  { provide: VIRTUAL_SCROLL_STRATEGY, useValue: virtualScrollStrategy },
19648
20350
  { provide: Directionality, useValue: directionality },
19649
20351
  { provide: ScrollDispatcher, useValue: scrollDispatcher },
@@ -19912,9 +20614,9 @@ class DatagridMainRenderer {
19912
20614
  if (this.headers) {
19913
20615
  if (state && !this.columnsService.hasCache()) {
19914
20616
  this.columnsService.cache();
19915
- this.headers.forEach((_header, index) => {
20617
+ this.columnsService.visibleColumns.forEach((header, index) => {
19916
20618
  if (index > 0) {
19917
- this.columnsService.emitStateChangeAt(index, {
20619
+ this.columnsService.emitStateChangeAt(header.columnIndex, {
19918
20620
  changes: [DatagridColumnChanges.HIDDEN],
19919
20621
  hidden: state,
19920
20622
  });
@@ -28398,9 +29100,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
28398
29100
  * The full license information can be found in LICENSE in the root directory of this project.
28399
29101
  */
28400
29102
 
29103
+ /*
29104
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
29105
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
29106
+ * This software is released under MIT license.
29107
+ * The full license information can be found in LICENSE in the root directory of this project.
29108
+ */
29109
+
28401
29110
  /**
28402
29111
  * Generated bundle index. Do not edit.
28403
29112
  */
28404
29113
 
28405
- 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 };
29114
+ 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 };
28406
29115
  //# sourceMappingURL=clr-angular.mjs.map