quang 19.3.16-2 → 19.4.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.
@@ -9,6 +9,10 @@ export interface DateRange {
9
9
  }
10
10
  export type QuangDatepickerOptions = AirDatepickerOptions;
11
11
  export declare class QuangDateComponent extends QuangBaseComponent<string | DateRange | null> {
12
+ private readonly _ngZone;
13
+ private readonly _cdr;
14
+ private readonly _appRef;
15
+ private _tickScheduled;
12
16
  /**
13
17
  * Format to use to show on the input field.
14
18
  * The format is based on the standard {@link https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table}
@@ -57,6 +61,7 @@ export declare class QuangDateComponent extends QuangBaseComponent<string | Date
57
61
  rangeSelection: import("@angular/core").InputSignal<boolean>;
58
62
  _activeLanguage: import("@angular/core").Signal<string | null | undefined>;
59
63
  _airDatepickerInstance: import("@angular/core").WritableSignal<AirDatepicker<HTMLInputElement> | undefined>;
64
+ private readonly _airDatepickerInlineMode;
60
65
  searchTextDebounce: import("@angular/core").InputSignal<number>;
61
66
  targetPosition: import("@angular/core").WritableSignal<AirDatepickerPosition>;
62
67
  _generateAirDatepickerEffect: import("@angular/core").EffectRef;
@@ -72,6 +77,9 @@ export declare class QuangDateComponent extends QuangBaseComponent<string | Date
72
77
  onBlurHandler(): void;
73
78
  setupInputStringToDate(value: string): Date;
74
79
  onChangedHandler(value: string | DateRange | null): void;
80
+ private propagateValueToControl;
81
+ private requestRender;
82
+ private syncValueFromDatepickerSelection;
75
83
  onHideCalendar(): void;
76
84
  formatDate(val: string | DateRange | null): string;
77
85
  openDatePicker(): void;
@@ -80,7 +88,6 @@ export declare class QuangDateComponent extends QuangBaseComponent<string | Date
80
88
  getLocale(): AirDatepickerLocale;
81
89
  onCancel(): void;
82
90
  private dateToUtc;
83
- private dateToLocal;
84
91
  private setCalendarPosition;
85
92
  private setupTimepicker;
86
93
  checkDateMatch(date: string): boolean;
@@ -37,7 +37,7 @@ export declare abstract class QuangBaseComponent<T = any> implements ControlValu
37
37
  destroyRef: DestroyRef;
38
38
  constructor();
39
39
  registerOnChange(fn: (value: T) => void): void;
40
- writeValue(val: T): void;
40
+ writeValue(value: T): void;
41
41
  registerOnTouched(fn: () => void): void;
42
42
  onChangedEventHandler($event: Event): void;
43
43
  onChangedHandler(value: T): void;
@@ -1,6 +1,6 @@
1
1
  import { NgClass } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { input, viewChild, computed, signal, inject, effect, forwardRef, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { inject, NgZone, ChangeDetectorRef, ApplicationRef, input, viewChild, computed, signal, effect, forwardRef, ChangeDetectionStrategy, Component } from '@angular/core';
4
4
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
5
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
6
6
  import { TranslocoPipe } from '@jsverse/transloco';
@@ -28,6 +28,10 @@ import { QuangBaseComponent } from 'quang/components/shared';
28
28
  class QuangDateComponent extends QuangBaseComponent {
29
29
  constructor() {
30
30
  super();
31
+ this._ngZone = inject(NgZone);
32
+ this._cdr = inject(ChangeDetectorRef);
33
+ this._appRef = inject(ApplicationRef);
34
+ this._tickScheduled = false;
31
35
  /**
32
36
  * Format to use to show on the input field.
33
37
  * The format is based on the standard {@link https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table}
@@ -84,6 +88,9 @@ class QuangDateComponent extends QuangBaseComponent {
84
88
  return navigator.language;
85
89
  });
86
90
  this._airDatepickerInstance = signal(undefined);
91
+ // AirDatepicker doesn't reliably support toggling `inline` at runtime via `update()`.
92
+ // Track the mode used to create the current instance and recreate when it changes.
93
+ this._airDatepickerInlineMode = signal(null);
87
94
  this.searchTextDebounce = input(500);
88
95
  this.targetPosition = signal('bottom left');
89
96
  this._generateAirDatepickerEffect = effect(() => {
@@ -106,112 +113,146 @@ class QuangDateComponent extends QuangBaseComponent {
106
113
  });
107
114
  }
108
115
  setupCalendar() {
109
- if (this._inputForDate()?.nativeElement) {
110
- let currentValue = this._value();
111
- let targetDate;
112
- if (currentValue && typeof currentValue === 'string') {
113
- if (!this.showTimepicker()) {
114
- currentValue = currentValue.split('T')[0];
115
- }
116
- targetDate = [currentValue];
116
+ if (!this._inputForDate()?.nativeElement)
117
+ return;
118
+ const desiredInlineMode = this.showInline();
119
+ const existingInstance = this._airDatepickerInstance();
120
+ const existingInlineMode = this._airDatepickerInlineMode();
121
+ if (existingInstance && existingInlineMode !== null && existingInlineMode !== desiredInlineMode) {
122
+ const maybeDestroy = existingInstance;
123
+ maybeDestroy.destroy?.();
124
+ this._airDatepickerInstance.set(undefined);
125
+ }
126
+ let currentValue = this._value();
127
+ let targetDate;
128
+ if (currentValue && typeof currentValue === 'string') {
129
+ if (!this.showTimepicker()) {
130
+ currentValue = currentValue.split('T')[0];
117
131
  }
118
- else if (currentValue && typeof currentValue === 'object') {
119
- targetDate = [];
120
- if (currentValue.dateFrom) {
121
- let targetDateFrom = currentValue.dateFrom;
122
- if (!this.showTimepicker()) {
123
- targetDateFrom = currentValue.dateFrom.split('T')[0];
124
- }
125
- targetDate.push(targetDateFrom);
126
- }
127
- if (currentValue.dateTo) {
128
- let targetDateTo = currentValue.dateTo;
129
- if (!this.showTimepicker()) {
130
- targetDateTo = currentValue.dateTo.split('T')[0];
131
- }
132
- targetDate.push(targetDateTo);
133
- }
132
+ targetDate = [currentValue];
133
+ }
134
+ else if (currentValue && typeof currentValue === 'object') {
135
+ targetDate = [];
136
+ if (currentValue.dateFrom) {
137
+ const targetDateFrom = this.showTimepicker()
138
+ ? currentValue.dateFrom
139
+ : currentValue.dateFrom.split('T')[0];
140
+ targetDate.push(targetDateFrom);
141
+ }
142
+ if (currentValue.dateTo) {
143
+ const targetDateTo = this.showTimepicker() ? currentValue.dateTo : currentValue.dateTo.split('T')[0];
144
+ targetDate.push(targetDateTo);
134
145
  }
135
- this.setCalendarPosition();
136
- const airDatepickerOpts = {
137
- autoClose: true,
138
- showEvent: 'click',
139
- classes: this.calendarClasses(),
140
- dateFormat: this.dateFormat(),
141
- inline: this.showInline(),
142
- isMobile: false,
143
- multipleDatesSeparator: this.multipleDatesSeparator(),
144
- range: this.rangeSelection(),
145
- timepicker: this.showTimepicker(),
146
- onlyTimepicker: this.showOnlyTimepicker(),
147
- timeFormat: this.timeFormat(),
148
- minHours: this.minHour(),
149
- maxHours: this.maxHour(),
150
- minMinutes: this.minMinute(),
151
- maxMinutes: this.maxMinute(),
152
- minDate: this.minDate(),
153
- maxDate: this.maxDate(),
154
- toggleSelected: false,
155
- multipleDates: false,
156
- selectedDates: targetDate,
157
- position: this.targetPosition(),
158
- locale: this.getLocale(),
159
- onSelect: ({ date }) => {
146
+ }
147
+ this.setCalendarPosition();
148
+ const userDatepickerOptions = this.datepickerOptions() ?? {};
149
+ const userOnSelect = userDatepickerOptions.onSelect;
150
+ const userOnHide = userDatepickerOptions.onHide;
151
+ const userOnShow = userDatepickerOptions.onShow;
152
+ const airDatepickerOpts = {
153
+ ...userDatepickerOptions,
154
+ autoClose: !this.showInline(),
155
+ showEvent: 'click',
156
+ classes: this.calendarClasses(),
157
+ dateFormat: this.dateFormat(),
158
+ inline: this.showInline(),
159
+ isMobile: false,
160
+ multipleDatesSeparator: this.multipleDatesSeparator(),
161
+ range: this.rangeSelection(),
162
+ timepicker: this.showTimepicker(),
163
+ onlyTimepicker: this.showOnlyTimepicker(),
164
+ timeFormat: this.timeFormat(),
165
+ minHours: this.minHour(),
166
+ maxHours: this.maxHour(),
167
+ minMinutes: this.minMinute(),
168
+ maxMinutes: this.maxMinute(),
169
+ minDate: this.minDate(),
170
+ maxDate: this.maxDate(),
171
+ toggleSelected: false,
172
+ multipleDates: false,
173
+ selectedDates: targetDate,
174
+ position: this.targetPosition(),
175
+ locale: this.getLocale(),
176
+ onSelect: (args) => {
177
+ const { date } = args;
178
+ // AirDatepicker callbacks may fire outside Angular's zone in some app setups.
179
+ // Ensure CVA propagation happens inside the zone so the connected FormControl updates reliably.
180
+ this._ngZone.run(() => {
160
181
  this._shouldRefocusInputOnHide.set(true);
161
- if (!Array.isArray(date)) {
162
- let selectTargetDate = date;
163
- if (!this.showTimepicker()) {
164
- selectTargetDate = this.dateToUtc(date);
182
+ if (Array.isArray(date)) {
183
+ // Range selection: AirDatepicker emits partial selections too (only start date).
184
+ // Committing `_value` for partial selections can trigger `setupCalendar()` re-sync and
185
+ // break the second click. Only commit once the range is complete.
186
+ const [from, to] = date;
187
+ if (!from || !to) {
188
+ return;
165
189
  }
190
+ const value = {
191
+ dateFrom: (this.showTimepicker() ? from : this.dateToUtc(from)).toISOString(),
192
+ dateTo: (this.showTimepicker() ? to : this.dateToUtc(to)).toISOString(),
193
+ };
194
+ this.onChangedHandler(value);
195
+ }
196
+ else if (date) {
197
+ const selectTargetDate = this.showTimepicker() ? date : this.dateToUtc(date);
166
198
  this.onChangedHandler(selectTargetDate.toISOString());
167
199
  }
168
200
  if (this.showInline()) {
169
- this.onHideCalendar();
170
- }
171
- },
172
- onHide: (isAnimationComplete) => {
173
- if (isAnimationComplete) {
174
- this.onHideCalendar();
175
- }
176
- },
177
- ...(this.datepickerOptions() ?? {}),
178
- onShow: (isAnimationComplete) => {
179
- const datepicker = this._airDatepickerInstance()?.$datepicker;
180
- if (datepicker) {
181
- datepicker.onmouseenter = () => {
182
- this.isMouseInsideCalendar.set(true);
183
- };
184
- datepicker.onmouseleave = () => {
185
- this.isMouseInsideCalendar.set(false);
186
- };
187
- }
188
- if (isAnimationComplete || !this.showTimepicker()) {
189
- return;
201
+ // Inline mode should update the connected control immediately.
202
+ // Do not rely on `onHideCalendar()` because inline never hides and the input may be visually hidden.
203
+ this.propagateValueToControl();
190
204
  }
191
- this.setupTimepicker();
192
- },
193
- };
194
- if (this._airDatepickerInstance()) {
195
- if (this._airDatepickerInstance()?.visible) {
196
- this._airDatepickerInstance()?.update(airDatepickerOpts);
205
+ });
206
+ userOnSelect?.(args);
207
+ },
208
+ onHide: (isAnimationComplete) => {
209
+ if (isAnimationComplete) {
210
+ this.onHideCalendar();
197
211
  }
198
- else {
199
- this._airDatepickerInstance()?.update(airDatepickerOpts, { silent: true });
212
+ userOnHide?.(isAnimationComplete);
213
+ },
214
+ onShow: (isAnimationComplete) => {
215
+ const datepicker = this._airDatepickerInstance()?.$datepicker;
216
+ if (datepicker) {
217
+ datepicker.onmouseenter = () => {
218
+ this.isMouseInsideCalendar.set(true);
219
+ };
220
+ datepicker.onmouseleave = () => {
221
+ this.isMouseInsideCalendar.set(false);
222
+ };
200
223
  }
201
- if (!targetDate) {
202
- this._airDatepickerInstance()?.setFocusDate(false);
203
- this._airDatepickerInstance()?.clear({ silent: true });
204
- }
205
- else {
206
- this._airDatepickerInstance()?.selectDate(targetDate, { updateTime: true });
224
+ if (isAnimationComplete || !this.showTimepicker()) {
225
+ return;
207
226
  }
227
+ this.setupTimepicker();
228
+ userOnShow?.(isAnimationComplete);
229
+ },
230
+ };
231
+ if (this._airDatepickerInstance()) {
232
+ if (this._airDatepickerInstance()?.visible) {
233
+ this._airDatepickerInstance()?.update(airDatepickerOpts);
208
234
  }
209
235
  else {
210
- this._airDatepickerInstance.set(new AirDatepicker(this._inputForDate()?.nativeElement, airDatepickerOpts));
236
+ this._airDatepickerInstance()?.update(airDatepickerOpts, { silent: true });
211
237
  }
212
- if (this.showInline()) {
213
- this.setupTimepicker();
238
+ if (targetDate) {
239
+ this._airDatepickerInstance()?.selectDate(targetDate, { updateTime: true, silent: true });
214
240
  }
241
+ else {
242
+ this._airDatepickerInstance()?.setFocusDate(false);
243
+ this._airDatepickerInstance()?.clear({ silent: true });
244
+ }
245
+ }
246
+ else {
247
+ this._airDatepickerInstance.set(new AirDatepicker(this._inputForDate()?.nativeElement, airDatepickerOpts));
248
+ }
249
+ this._airDatepickerInlineMode.set(desiredInlineMode);
250
+ if (desiredInlineMode) {
251
+ // Ensure inline calendar is visible after re-creation/update.
252
+ this._airDatepickerInstance()?.show?.();
253
+ }
254
+ if (this.showInline()) {
255
+ this.setupTimepicker();
215
256
  }
216
257
  }
217
258
  onChangeText($event) {
@@ -220,14 +261,23 @@ class QuangDateComponent extends QuangBaseComponent {
220
261
  // TODO: check format for DateRange
221
262
  if (value.length === this.valueFormat().length && isMatch(value, this.valueFormat())) {
222
263
  this.onChangedHandler(this.setupInputStringToDate(value).toISOString());
264
+ if (this.showInline()) {
265
+ this.propagateValueToControl();
266
+ }
223
267
  }
224
268
  }
225
269
  else {
226
270
  this.onChangedHandler(value);
271
+ if (this.showInline()) {
272
+ this.propagateValueToControl();
273
+ }
227
274
  }
228
275
  }
229
276
  onBlurHandler() {
230
277
  super.onBlurHandler();
278
+ if (this.showInline()) {
279
+ return;
280
+ }
231
281
  if (this.isMouseOutsideCalendar() && this._airDatepickerInstance()?.visible) {
232
282
  this._airDatepickerInstance()?.hide();
233
283
  }
@@ -237,9 +287,9 @@ class QuangDateComponent extends QuangBaseComponent {
237
287
  if (value.length !== targetValueFormat.length) {
238
288
  targetValueFormat = targetValueFormat.replace('yyyy', 'yy');
239
289
  }
240
- let targetDate = parse(value, targetValueFormat, new Date());
290
+ const targetDate = parse(value, targetValueFormat, new Date());
241
291
  if (!this.showTimepicker()) {
242
- targetDate = this.dateToUtc(targetDate);
292
+ return this.dateToUtc(targetDate);
243
293
  }
244
294
  return targetDate;
245
295
  }
@@ -278,6 +328,42 @@ class QuangDateComponent extends QuangBaseComponent {
278
328
  }
279
329
  this._value.set(targetDate);
280
330
  }
331
+ propagateValueToControl() {
332
+ if (this.formControl()?.getRawValue() !== this._value()) {
333
+ super.onChangedHandler(this._value());
334
+ }
335
+ else if (this.onTouched) {
336
+ this.onTouched();
337
+ }
338
+ this.requestRender();
339
+ }
340
+ requestRender() {
341
+ // Inline datepicker interactions can happen outside Angular-managed events.
342
+ // Marking the view dirty is not always enough in zoneless/event-coalesced setups,
343
+ // so we coalesce a manual tick.
344
+ this._cdr.markForCheck();
345
+ if (this._tickScheduled) {
346
+ return;
347
+ }
348
+ this._tickScheduled = true;
349
+ queueMicrotask(() => {
350
+ this._tickScheduled = false;
351
+ this._appRef.tick();
352
+ });
353
+ }
354
+ syncValueFromDatepickerSelection() {
355
+ if (!this.showInline()) {
356
+ return;
357
+ }
358
+ const datepickerInstance = this._airDatepickerInstance();
359
+ const selectedDate = datepickerInstance?.selectedDates?.[0];
360
+ if (!(selectedDate instanceof Date)) {
361
+ return;
362
+ }
363
+ const targetDate = this.showTimepicker() ? selectedDate : this.dateToUtc(selectedDate);
364
+ this.onChangedHandler(targetDate.toISOString());
365
+ this.propagateValueToControl();
366
+ }
281
367
  onHideCalendar() {
282
368
  const valueInput = this._inputForDate()?.nativeElement.value;
283
369
  let value = valueInput;
@@ -286,18 +372,14 @@ class QuangDateComponent extends QuangBaseComponent {
286
372
  const [dateFrom, dateTo] = valueInput.split(this.multipleDatesSeparator());
287
373
  value.dateFrom = dateFrom ?? '';
288
374
  value.dateTo = dateTo ?? '';
289
- if (!value.dateFrom || !this.checkDateMatch(value.dateFrom)) {
290
- value.dateFrom = null;
291
- }
292
- else {
293
- value.dateFrom = this.setupInputStringToDate(value.dateFrom).toISOString();
294
- }
295
- if (!value.dateTo || !this.checkDateMatch(value.dateTo)) {
296
- value.dateTo = null;
297
- }
298
- else {
299
- value.dateTo = this.setupInputStringToDate(value.dateTo).toISOString();
300
- }
375
+ value.dateFrom =
376
+ !value.dateFrom || !this.checkDateMatch(value.dateFrom)
377
+ ? null
378
+ : this.setupInputStringToDate(value.dateFrom).toISOString();
379
+ value.dateTo =
380
+ !value.dateTo || !this.checkDateMatch(value.dateTo)
381
+ ? null
382
+ : this.setupInputStringToDate(value.dateTo).toISOString();
301
383
  this.onChangedHandler(value);
302
384
  }
303
385
  else if (this.checkDateMatch(value)) {
@@ -306,11 +388,9 @@ class QuangDateComponent extends QuangBaseComponent {
306
388
  else {
307
389
  this.onChangedHandler(null);
308
390
  }
309
- if (this.formControl()?.getRawValue() !== this._value()) {
310
- super.onChangedHandler(this._value());
311
- }
312
- else if (this.onTouched) {
313
- this.onTouched();
391
+ this.propagateValueToControl();
392
+ if (this.showInline()) {
393
+ return;
314
394
  }
315
395
  // Only focus the input when the user actually interacted with the calendar.
316
396
  // Avoids infinite focus loop when tabbing between multiple datepickers.
@@ -330,6 +410,9 @@ class QuangDateComponent extends QuangBaseComponent {
330
410
  return format(val, this.valueFormat());
331
411
  }
332
412
  if (val && typeof val === 'object') {
413
+ if (!val.dateFrom && !val.dateTo) {
414
+ return '';
415
+ }
333
416
  let dateFromFormat = '';
334
417
  let dateToFormat = '';
335
418
  if (val.dateFrom) {
@@ -357,10 +440,10 @@ class QuangDateComponent extends QuangBaseComponent {
357
440
  if (this._isDisabled()) {
358
441
  return;
359
442
  }
360
- const dp = this._airDatepickerInstance();
361
- if (event.key === 'Escape' && dp?.visible) {
443
+ const datepickerInstance = this._airDatepickerInstance();
444
+ if (event.key === 'Escape' && datepickerInstance?.visible) {
362
445
  event.preventDefault();
363
- dp.hide();
446
+ datepickerInstance.hide();
364
447
  return;
365
448
  }
366
449
  if (event.key === 'Enter' || event.key === 'ArrowDown') {
@@ -378,13 +461,13 @@ class QuangDateComponent extends QuangBaseComponent {
378
461
  getLocale() {
379
462
  switch (this._activeLanguage()?.toLowerCase()) {
380
463
  case 'en':
381
- return en.default || en;
464
+ return en.default ?? en;
382
465
  case 'it':
383
- return it.default || it;
466
+ return it.default ?? it;
384
467
  case 'fr':
385
- return fr.default || fr;
468
+ return fr.default ?? fr;
386
469
  default:
387
- return en.default || en;
470
+ return en.default ?? en;
388
471
  }
389
472
  }
390
473
  onCancel() {
@@ -394,10 +477,6 @@ class QuangDateComponent extends QuangBaseComponent {
394
477
  // convert to UTC time removing the timezone
395
478
  return new Date(date.getTime() - date.getTimezoneOffset() * 60000);
396
479
  }
397
- dateToLocal(date) {
398
- // convert to local time adding the timezone
399
- return new Date(date.getTime() + date.getTimezoneOffset() * 60000);
400
- }
401
480
  setCalendarPosition() {
402
481
  const windowInnerHeight = window.innerHeight;
403
482
  const inputBoundingClientRect = this._inputForDate()?.nativeElement.getBoundingClientRect();
@@ -410,8 +489,23 @@ class QuangDateComponent extends QuangBaseComponent {
410
489
  }
411
490
  }
412
491
  setupTimepicker() {
413
- const timepicker = document.getElementsByClassName('air-datepicker-time')?.[0];
414
- if (timepicker) {
492
+ const datepickerRoot = this._airDatepickerInstance()?.$datepicker;
493
+ if (!datepickerRoot) {
494
+ return;
495
+ }
496
+ // AirDatepicker may re-render time inputs; use delegated listeners so we don't lose handlers.
497
+ if (!datepickerRoot.dataset['quangTimepickerListeners']) {
498
+ datepickerRoot.dataset['quangTimepickerListeners'] = 'true';
499
+ datepickerRoot.addEventListener('input', () => {
500
+ if (!this.showInline()) {
501
+ return;
502
+ }
503
+ // Let AirDatepicker update its internal selection first.
504
+ setTimeout(() => this._ngZone.run(() => this.syncValueFromDatepickerSelection()), 0);
505
+ }, { capture: true });
506
+ }
507
+ const timepickers = datepickerRoot.getElementsByClassName('air-datepicker-time');
508
+ for (const timepicker of Array.from(timepickers)) {
415
509
  const inputs = timepicker.getElementsByTagName('input');
416
510
  for (const input of Array.from(inputs)) {
417
511
  input.setAttribute('type', 'number');
@@ -421,7 +515,7 @@ class QuangDateComponent extends QuangBaseComponent {
421
515
  evt.stopImmediatePropagation();
422
516
  };
423
517
  input.onblur = () => {
424
- if (this.isMouseOutsideCalendar()) {
518
+ if (!this.showInline() && this.isMouseOutsideCalendar()) {
425
519
  this._airDatepickerInstance()?.hide();
426
520
  }
427
521
  };
@@ -432,11 +526,11 @@ class QuangDateComponent extends QuangBaseComponent {
432
526
  return isMatch(date, this.valueFormat()) || isMatch(date, this.valueFormat().replace('yyyy', 'yy'));
433
527
  }
434
528
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: QuangDateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
435
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: QuangDateComponent, isStandalone: true, selector: "quang-date", inputs: { dateFormat: { classPropertyName: "dateFormat", publicName: "dateFormat", isSignal: true, isRequired: false, transformFunction: null }, timeFormat: { classPropertyName: "timeFormat", publicName: "timeFormat", isSignal: true, isRequired: false, transformFunction: null }, activeLanguageOverride: { classPropertyName: "activeLanguageOverride", publicName: "activeLanguageOverride", isSignal: true, isRequired: false, transformFunction: null }, timepicker: { classPropertyName: "timepicker", publicName: "timepicker", isSignal: true, isRequired: false, transformFunction: null }, invalidDateMessage: { classPropertyName: "invalidDateMessage", publicName: "invalidDateMessage", isSignal: true, isRequired: false, transformFunction: null }, showOnlyTimepicker: { classPropertyName: "showOnlyTimepicker", publicName: "showOnlyTimepicker", isSignal: true, isRequired: false, transformFunction: null }, minHour: { classPropertyName: "minHour", publicName: "minHour", isSignal: true, isRequired: false, transformFunction: null }, maxHour: { classPropertyName: "maxHour", publicName: "maxHour", isSignal: true, isRequired: false, transformFunction: null }, minMinute: { classPropertyName: "minMinute", publicName: "minMinute", isSignal: true, isRequired: false, transformFunction: null }, maxMinute: { classPropertyName: "maxMinute", publicName: "maxMinute", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, showInline: { classPropertyName: "showInline", publicName: "showInline", isSignal: true, isRequired: false, transformFunction: null }, calendarClasses: { classPropertyName: "calendarClasses", publicName: "calendarClasses", isSignal: true, isRequired: false, transformFunction: null }, buttonClass: { classPropertyName: "buttonClass", publicName: "buttonClass", isSignal: true, isRequired: false, transformFunction: null }, datepickerOptions: { classPropertyName: "datepickerOptions", publicName: "datepickerOptions", isSignal: true, isRequired: false, transformFunction: null }, multipleDatesSeparator: { classPropertyName: "multipleDatesSeparator", publicName: "multipleDatesSeparator", isSignal: true, isRequired: false, transformFunction: null }, rangeSelection: { classPropertyName: "rangeSelection", publicName: "rangeSelection", isSignal: true, isRequired: false, transformFunction: null }, searchTextDebounce: { classPropertyName: "searchTextDebounce", publicName: "searchTextDebounce", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => QuangDateComponent), multi: true }], viewQueries: [{ propertyName: "_inputForDate", first: true, predicate: ["inputForDate"], descendants: true, isSignal: true }, { propertyName: "contentTemplate", first: true, predicate: ["calendarButton"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"mb-3\">\n @if (componentLabel()) {\n <label\n [htmlFor]=\"componentId()\"\n class=\"form-label\"\n >\n {{ componentLabel() | transloco }}\n <span [hidden]=\"!_isRequired()\">*</span>\n </label>\n }\n <div\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n class=\"input-date-container\"\n >\n <input\n [attr.required]=\"getIsRequiredControl()\"\n [autocomplete]=\"'off'\"\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n [class.with-button-calendar]=\"!hasNoContent()\"\n [disabled]=\"_isDisabled()\"\n [hidden]=\"showInline()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [readOnly]=\"isReadonly()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"inputValueString()\"\n (blur)=\"onBlurHandler()\"\n (focus)=\"interceptInputInteraction($event)\"\n (input)=\"onChangeText($event)\"\n (keydown)=\"onInputKeydown($event)\"\n (mouseenter)=\"isMouseInsideCalendar.set(true)\"\n (mouseleave)=\"isMouseInsideCalendar.set(false)\"\n (search)=\"onCancel()\"\n #inputForDate\n class=\"form-control\"\n type=\"search\"\n />\n <button\n [attr.required]=\"getIsRequiredControl()\"\n [class.border-danger]=\"_showErrors()\"\n [class.border-success]=\"_showSuccess()\"\n [hidden]=\"showInline() || hasNoContent() || _isDisabled()\"\n [ngClass]=\"buttonClass()\"\n (click)=\"_ngControl()?.disabled ? null : openDatePicker()\"\n #calendarButton\n aria-label=\"calendar-button\"\n class=\"btn btn-outline-secondary btn-outline-calendar\"\n type=\"button\"\n >\n <ng-content></ng-content>\n </button>\n </div>\n <div class=\"valid-feedback\">\n {{ successMessage() | transloco }}\n </div>\n <div class=\"invalid-feedback\">\n {{ _currentErrorMessage() | transloco: _currentErrorMessageExtraData() }}\n </div>\n @if (helpMessage()) {\n <small\n [hidden]=\"_showSuccess() || _showErrors()\"\n aria-live=\"assertive\"\n class=\"form-text text-muted\"\n >\n {{ helpMessage() | transloco }}\n </small>\n }\n</div>\n", styles: ["input::-webkit-search-cancel-button{-webkit-appearance:none;height:.75rem;width:.75rem;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 3 1024 1024' width='12' height='12' fill='currentColor'%3E%3Cpath d='M9 1018q5 4 10.5 6.5 5.5 2.5 11.5 2.5 6 0 11.5-2.5 5.5-2.5 10.5-6.5l459-459 459 459q5 4 10.5 6.5 5.5 2.5 11.5 2.5 6 0 11.5-2.5 5.5-2.5 10.5-6.5 9-9 9-22 0-13-9-22l-459-459 459-459q9-9 9-22 0-13-9-22-9-9-22-9-13 0-22 9l-459 459-459-459q-9-9-22-9-13 0-22 9-9 9-9 22 0 13 9 22l459 459-459 459q-9 9-9 22 0 13 9 22l0 0z'/%3E%3C/svg%3E%0A\");cursor:pointer}::ng-deep .air-datepicker{z-index:99999}::ng-deep .air-datepicker.-inline-{z-index:unset}::ng-deep .air-datepicker .air-datepicker--pointer{display:none}::ng-deep .air-datepicker .air-datepicker-time{display:block}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--current{display:none}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders{display:flex;justify-content:center;padding-top:.25rem;gap:1rem}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row{width:100%;position:relative}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row:first-child:after{content:\":\";display:inline;font-size:1rem;position:absolute;right:-.65rem}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row input{width:100%;text-align:center;padding:0;padding-left:1rem;border-color:var(--bs-border-color)}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row .form-control:focus{box-shadow:unset!important}::ng-deep .air-datepicker.-inline-.-only-timepicker-{border:0}::ng-deep .air-datepicker.-inline-.-only-timepicker- .air-datepicker--time{border:0}:host{display:block}:host .input-date-container{display:flex}:host input{flex:1}:host input.with-button-calendar{border-top-right-radius:0;border-bottom-right-radius:0}:host input:disabled{border-radius:var(--bs-border-radius)}:host .btn-outline-calendar{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0;min-width:unset;display:flex;border-color:var(--bs-border-color)}:host .border-danger{border-color:var(--bs-form-invalid-border-color)}:host .border-success{border-color:var(--bs-form-valid-border-color)}\n"], dependencies: [{ kind: "pipe", type: TranslocoPipe, name: "transloco" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
529
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: QuangDateComponent, isStandalone: true, selector: "quang-date", inputs: { dateFormat: { classPropertyName: "dateFormat", publicName: "dateFormat", isSignal: true, isRequired: false, transformFunction: null }, timeFormat: { classPropertyName: "timeFormat", publicName: "timeFormat", isSignal: true, isRequired: false, transformFunction: null }, activeLanguageOverride: { classPropertyName: "activeLanguageOverride", publicName: "activeLanguageOverride", isSignal: true, isRequired: false, transformFunction: null }, timepicker: { classPropertyName: "timepicker", publicName: "timepicker", isSignal: true, isRequired: false, transformFunction: null }, invalidDateMessage: { classPropertyName: "invalidDateMessage", publicName: "invalidDateMessage", isSignal: true, isRequired: false, transformFunction: null }, showOnlyTimepicker: { classPropertyName: "showOnlyTimepicker", publicName: "showOnlyTimepicker", isSignal: true, isRequired: false, transformFunction: null }, minHour: { classPropertyName: "minHour", publicName: "minHour", isSignal: true, isRequired: false, transformFunction: null }, maxHour: { classPropertyName: "maxHour", publicName: "maxHour", isSignal: true, isRequired: false, transformFunction: null }, minMinute: { classPropertyName: "minMinute", publicName: "minMinute", isSignal: true, isRequired: false, transformFunction: null }, maxMinute: { classPropertyName: "maxMinute", publicName: "maxMinute", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, showInline: { classPropertyName: "showInline", publicName: "showInline", isSignal: true, isRequired: false, transformFunction: null }, calendarClasses: { classPropertyName: "calendarClasses", publicName: "calendarClasses", isSignal: true, isRequired: false, transformFunction: null }, buttonClass: { classPropertyName: "buttonClass", publicName: "buttonClass", isSignal: true, isRequired: false, transformFunction: null }, datepickerOptions: { classPropertyName: "datepickerOptions", publicName: "datepickerOptions", isSignal: true, isRequired: false, transformFunction: null }, multipleDatesSeparator: { classPropertyName: "multipleDatesSeparator", publicName: "multipleDatesSeparator", isSignal: true, isRequired: false, transformFunction: null }, rangeSelection: { classPropertyName: "rangeSelection", publicName: "rangeSelection", isSignal: true, isRequired: false, transformFunction: null }, searchTextDebounce: { classPropertyName: "searchTextDebounce", publicName: "searchTextDebounce", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => QuangDateComponent), multi: true }], viewQueries: [{ propertyName: "_inputForDate", first: true, predicate: ["inputForDate"], descendants: true, isSignal: true }, { propertyName: "contentTemplate", first: true, predicate: ["calendarButton"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"mb-3\">\n @if (componentLabel()) {\n <label\n [htmlFor]=\"componentId()\"\n class=\"form-label\"\n >\n {{ componentLabel() | transloco }}\n <span [hidden]=\"!_isRequired()\">*</span>\n </label>\n }\n <div\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n class=\"input-date-container\"\n >\n <input\n [attr.aria-hidden]=\"showInline() ? 'true' : null\"\n [attr.required]=\"getIsRequiredControl()\"\n [autocomplete]=\"'off'\"\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n [class.quang-date-inline-hidden]=\"showInline()\"\n [class.with-button-calendar]=\"!hasNoContent()\"\n [disabled]=\"_isDisabled()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [readOnly]=\"isReadonly()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"inputValueString()\"\n (blur)=\"onBlurHandler()\"\n (focus)=\"interceptInputInteraction($event)\"\n (input)=\"onChangeText($event)\"\n (keydown)=\"onInputKeydown($event)\"\n (mouseenter)=\"isMouseInsideCalendar.set(true)\"\n (mouseleave)=\"isMouseInsideCalendar.set(false)\"\n (search)=\"onCancel()\"\n #inputForDate\n class=\"form-control\"\n type=\"search\"\n />\n <button\n [attr.aria-hidden]=\"showInline() ? 'true' : null\"\n [attr.required]=\"getIsRequiredControl()\"\n [class.border-danger]=\"_showErrors()\"\n [class.border-success]=\"_showSuccess()\"\n [class.quang-date-inline-hidden]=\"showInline()\"\n [hidden]=\"hasNoContent() || _isDisabled()\"\n [ngClass]=\"buttonClass()\"\n (click)=\"_ngControl()?.disabled ? null : openDatePicker()\"\n #calendarButton\n aria-label=\"calendar-button\"\n class=\"btn btn-outline-secondary btn-outline-calendar\"\n type=\"button\"\n >\n <ng-content></ng-content>\n </button>\n </div>\n <div class=\"valid-feedback\">\n {{ successMessage() | transloco }}\n </div>\n <div class=\"invalid-feedback\">\n {{ _currentErrorMessage() | transloco: _currentErrorMessageExtraData() }}\n </div>\n @if (helpMessage()) {\n <small\n [hidden]=\"_showSuccess() || _showErrors()\"\n aria-live=\"assertive\"\n class=\"form-text text-muted\"\n >\n {{ helpMessage() | transloco }}\n </small>\n }\n</div>\n", styles: ["input::-webkit-search-cancel-button{-webkit-appearance:none;height:.75rem;width:.75rem;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 3 1024 1024' width='12' height='12' fill='currentColor'%3E%3Cpath d='M9 1018q5 4 10.5 6.5 5.5 2.5 11.5 2.5 6 0 11.5-2.5 5.5-2.5 10.5-6.5l459-459 459 459q5 4 10.5 6.5 5.5 2.5 11.5 2.5 6 0 11.5-2.5 5.5-2.5 10.5-6.5 9-9 9-22 0-13-9-22l-459-459 459-459q9-9 9-22 0-13-9-22-9-9-22-9-13 0-22 9l-459 459-459-459q-9-9-22-9-13 0-22 9-9 9-9 22 0 13 9 22l459 459-459 459q-9 9-9 22 0 13 9 22l0 0z'/%3E%3C/svg%3E%0A\");cursor:pointer}::ng-deep .air-datepicker{z-index:99999}::ng-deep .air-datepicker.-inline-{z-index:unset}::ng-deep .air-datepicker .air-datepicker--pointer{display:none}::ng-deep .air-datepicker .air-datepicker-time{display:block}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--current{display:none}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders{display:flex;justify-content:center;padding-top:.25rem;gap:1rem}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row{width:100%;position:relative}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row:first-child:after{content:\":\";display:inline;font-size:1rem;position:absolute;right:-.65rem}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row input{width:100%;text-align:center;padding:0;padding-left:1rem;border-color:var(--bs-border-color)}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row .form-control:focus{box-shadow:unset!important}::ng-deep .air-datepicker.-inline-.-only-timepicker-{border:0;padding:0!important}::ng-deep .air-datepicker.-inline-.-only-timepicker- .air-datepicker--time{border:0;padding:0!important}::ng-deep .air-datepicker.-inline-.-only-timepicker- .air-datepicker-time{padding:0!important}:host{display:block}:host .quang-date-inline-hidden{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:0!important;border:0!important;opacity:0!important;pointer-events:none!important;overflow:hidden!important;white-space:nowrap!important;clip:rect(0 0 0 0)!important;clip-path:inset(50%)!important}:host .input-date-container{display:flex}:host input{flex:1}:host input.with-button-calendar{border-top-right-radius:0;border-bottom-right-radius:0}:host input:disabled{border-radius:var(--bs-border-radius)}:host .btn-outline-calendar{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0;min-width:unset;display:flex;border-color:var(--bs-border-color)}:host .border-danger{border-color:var(--bs-form-invalid-border-color)}:host .border-success{border-color:var(--bs-form-valid-border-color)}\n"], dependencies: [{ kind: "pipe", type: TranslocoPipe, name: "transloco" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
436
530
  }
437
531
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: QuangDateComponent, decorators: [{
438
532
  type: Component,
439
- args: [{ selector: 'quang-date', providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => QuangDateComponent), multi: true }], imports: [TranslocoPipe, NgClass], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-3\">\n @if (componentLabel()) {\n <label\n [htmlFor]=\"componentId()\"\n class=\"form-label\"\n >\n {{ componentLabel() | transloco }}\n <span [hidden]=\"!_isRequired()\">*</span>\n </label>\n }\n <div\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n class=\"input-date-container\"\n >\n <input\n [attr.required]=\"getIsRequiredControl()\"\n [autocomplete]=\"'off'\"\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n [class.with-button-calendar]=\"!hasNoContent()\"\n [disabled]=\"_isDisabled()\"\n [hidden]=\"showInline()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [readOnly]=\"isReadonly()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"inputValueString()\"\n (blur)=\"onBlurHandler()\"\n (focus)=\"interceptInputInteraction($event)\"\n (input)=\"onChangeText($event)\"\n (keydown)=\"onInputKeydown($event)\"\n (mouseenter)=\"isMouseInsideCalendar.set(true)\"\n (mouseleave)=\"isMouseInsideCalendar.set(false)\"\n (search)=\"onCancel()\"\n #inputForDate\n class=\"form-control\"\n type=\"search\"\n />\n <button\n [attr.required]=\"getIsRequiredControl()\"\n [class.border-danger]=\"_showErrors()\"\n [class.border-success]=\"_showSuccess()\"\n [hidden]=\"showInline() || hasNoContent() || _isDisabled()\"\n [ngClass]=\"buttonClass()\"\n (click)=\"_ngControl()?.disabled ? null : openDatePicker()\"\n #calendarButton\n aria-label=\"calendar-button\"\n class=\"btn btn-outline-secondary btn-outline-calendar\"\n type=\"button\"\n >\n <ng-content></ng-content>\n </button>\n </div>\n <div class=\"valid-feedback\">\n {{ successMessage() | transloco }}\n </div>\n <div class=\"invalid-feedback\">\n {{ _currentErrorMessage() | transloco: _currentErrorMessageExtraData() }}\n </div>\n @if (helpMessage()) {\n <small\n [hidden]=\"_showSuccess() || _showErrors()\"\n aria-live=\"assertive\"\n class=\"form-text text-muted\"\n >\n {{ helpMessage() | transloco }}\n </small>\n }\n</div>\n", styles: ["input::-webkit-search-cancel-button{-webkit-appearance:none;height:.75rem;width:.75rem;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 3 1024 1024' width='12' height='12' fill='currentColor'%3E%3Cpath d='M9 1018q5 4 10.5 6.5 5.5 2.5 11.5 2.5 6 0 11.5-2.5 5.5-2.5 10.5-6.5l459-459 459 459q5 4 10.5 6.5 5.5 2.5 11.5 2.5 6 0 11.5-2.5 5.5-2.5 10.5-6.5 9-9 9-22 0-13-9-22l-459-459 459-459q9-9 9-22 0-13-9-22-9-9-22-9-13 0-22 9l-459 459-459-459q-9-9-22-9-13 0-22 9-9 9-9 22 0 13 9 22l459 459-459 459q-9 9-9 22 0 13 9 22l0 0z'/%3E%3C/svg%3E%0A\");cursor:pointer}::ng-deep .air-datepicker{z-index:99999}::ng-deep .air-datepicker.-inline-{z-index:unset}::ng-deep .air-datepicker .air-datepicker--pointer{display:none}::ng-deep .air-datepicker .air-datepicker-time{display:block}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--current{display:none}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders{display:flex;justify-content:center;padding-top:.25rem;gap:1rem}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row{width:100%;position:relative}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row:first-child:after{content:\":\";display:inline;font-size:1rem;position:absolute;right:-.65rem}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row input{width:100%;text-align:center;padding:0;padding-left:1rem;border-color:var(--bs-border-color)}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row .form-control:focus{box-shadow:unset!important}::ng-deep .air-datepicker.-inline-.-only-timepicker-{border:0}::ng-deep .air-datepicker.-inline-.-only-timepicker- .air-datepicker--time{border:0}:host{display:block}:host .input-date-container{display:flex}:host input{flex:1}:host input.with-button-calendar{border-top-right-radius:0;border-bottom-right-radius:0}:host input:disabled{border-radius:var(--bs-border-radius)}:host .btn-outline-calendar{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0;min-width:unset;display:flex;border-color:var(--bs-border-color)}:host .border-danger{border-color:var(--bs-form-invalid-border-color)}:host .border-success{border-color:var(--bs-form-valid-border-color)}\n"] }]
533
+ args: [{ selector: 'quang-date', providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => QuangDateComponent), multi: true }], imports: [TranslocoPipe, NgClass], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-3\">\n @if (componentLabel()) {\n <label\n [htmlFor]=\"componentId()\"\n class=\"form-label\"\n >\n {{ componentLabel() | transloco }}\n <span [hidden]=\"!_isRequired()\">*</span>\n </label>\n }\n <div\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n class=\"input-date-container\"\n >\n <input\n [attr.aria-hidden]=\"showInline() ? 'true' : null\"\n [attr.required]=\"getIsRequiredControl()\"\n [autocomplete]=\"'off'\"\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n [class.quang-date-inline-hidden]=\"showInline()\"\n [class.with-button-calendar]=\"!hasNoContent()\"\n [disabled]=\"_isDisabled()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [readOnly]=\"isReadonly()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"inputValueString()\"\n (blur)=\"onBlurHandler()\"\n (focus)=\"interceptInputInteraction($event)\"\n (input)=\"onChangeText($event)\"\n (keydown)=\"onInputKeydown($event)\"\n (mouseenter)=\"isMouseInsideCalendar.set(true)\"\n (mouseleave)=\"isMouseInsideCalendar.set(false)\"\n (search)=\"onCancel()\"\n #inputForDate\n class=\"form-control\"\n type=\"search\"\n />\n <button\n [attr.aria-hidden]=\"showInline() ? 'true' : null\"\n [attr.required]=\"getIsRequiredControl()\"\n [class.border-danger]=\"_showErrors()\"\n [class.border-success]=\"_showSuccess()\"\n [class.quang-date-inline-hidden]=\"showInline()\"\n [hidden]=\"hasNoContent() || _isDisabled()\"\n [ngClass]=\"buttonClass()\"\n (click)=\"_ngControl()?.disabled ? null : openDatePicker()\"\n #calendarButton\n aria-label=\"calendar-button\"\n class=\"btn btn-outline-secondary btn-outline-calendar\"\n type=\"button\"\n >\n <ng-content></ng-content>\n </button>\n </div>\n <div class=\"valid-feedback\">\n {{ successMessage() | transloco }}\n </div>\n <div class=\"invalid-feedback\">\n {{ _currentErrorMessage() | transloco: _currentErrorMessageExtraData() }}\n </div>\n @if (helpMessage()) {\n <small\n [hidden]=\"_showSuccess() || _showErrors()\"\n aria-live=\"assertive\"\n class=\"form-text text-muted\"\n >\n {{ helpMessage() | transloco }}\n </small>\n }\n</div>\n", styles: ["input::-webkit-search-cancel-button{-webkit-appearance:none;height:.75rem;width:.75rem;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 3 1024 1024' width='12' height='12' fill='currentColor'%3E%3Cpath d='M9 1018q5 4 10.5 6.5 5.5 2.5 11.5 2.5 6 0 11.5-2.5 5.5-2.5 10.5-6.5l459-459 459 459q5 4 10.5 6.5 5.5 2.5 11.5 2.5 6 0 11.5-2.5 5.5-2.5 10.5-6.5 9-9 9-22 0-13-9-22l-459-459 459-459q9-9 9-22 0-13-9-22-9-9-22-9-13 0-22 9l-459 459-459-459q-9-9-22-9-13 0-22 9-9 9-9 22 0 13 9 22l459 459-459 459q-9 9-9 22 0 13 9 22l0 0z'/%3E%3C/svg%3E%0A\");cursor:pointer}::ng-deep .air-datepicker{z-index:99999}::ng-deep .air-datepicker.-inline-{z-index:unset}::ng-deep .air-datepicker .air-datepicker--pointer{display:none}::ng-deep .air-datepicker .air-datepicker-time{display:block}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--current{display:none}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders{display:flex;justify-content:center;padding-top:.25rem;gap:1rem}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row{width:100%;position:relative}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row:first-child:after{content:\":\";display:inline;font-size:1rem;position:absolute;right:-.65rem}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row input{width:100%;text-align:center;padding:0;padding-left:1rem;border-color:var(--bs-border-color)}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row .form-control:focus{box-shadow:unset!important}::ng-deep .air-datepicker.-inline-.-only-timepicker-{border:0;padding:0!important}::ng-deep .air-datepicker.-inline-.-only-timepicker- .air-datepicker--time{border:0;padding:0!important}::ng-deep .air-datepicker.-inline-.-only-timepicker- .air-datepicker-time{padding:0!important}:host{display:block}:host .quang-date-inline-hidden{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:0!important;border:0!important;opacity:0!important;pointer-events:none!important;overflow:hidden!important;white-space:nowrap!important;clip:rect(0 0 0 0)!important;clip-path:inset(50%)!important}:host .input-date-container{display:flex}:host input{flex:1}:host input.with-button-calendar{border-top-right-radius:0;border-bottom-right-radius:0}:host input:disabled{border-radius:var(--bs-border-radius)}:host .btn-outline-calendar{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0;min-width:unset;display:flex;border-color:var(--bs-border-color)}:host .border-danger{border-color:var(--bs-form-invalid-border-color)}:host .border-success{border-color:var(--bs-form-valid-border-color)}\n"] }]
440
534
  }], ctorParameters: () => [] });
441
535
 
442
536
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"quang-components-date.mjs","sources":["../../../projects/quang/components/date/date.component.ts","../../../projects/quang/components/date/date.component.html","../../../projects/quang/components/date/quang-components-date.ts"],"sourcesContent":["import { NgClass } from '@angular/common'\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n forwardRef,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\nimport { NG_VALUE_ACCESSOR } from '@angular/forms'\n\nimport { TranslocoPipe } from '@jsverse/transloco'\nimport AirDatepicker, {\n AirDatepickerDate,\n AirDatepickerLocale,\n AirDatepickerOptions,\n AirDatepickerPosition,\n} from 'air-datepicker'\nimport en from 'air-datepicker/locale/en'\nimport fr from 'air-datepicker/locale/fr'\nimport it from 'air-datepicker/locale/it'\nimport { format, isMatch, parse } from 'date-fns'\nimport { QuangTranslationService } from 'quang/translation'\nimport { debounceTime, fromEvent } from 'rxjs'\n\nimport { QuangBaseComponent } from 'quang/components/shared'\n\nexport interface DateRange {\n dateFrom: string | null\n dateTo: string | null\n}\n\nexport type QuangDatepickerOptions = AirDatepickerOptions\n\n@Component({\n selector: 'quang-date',\n templateUrl: './date.component.html',\n styleUrl: './date.component.scss',\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => QuangDateComponent), multi: true }],\n imports: [TranslocoPipe, NgClass],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n/**\n * Datepicker component based on {@link https://air-datepicker.com/docs}.\n *\n * @usageNotes\n * 1. It can be used to only display the `timepicker` component by setting\n * `[showOnlyTimepicker]=\"true\"`\n *\n * 2. `datepickerOptions` can be used to override the default options of the component to get full access to all the\n * possible customizations that Air Datepicker provides. See {@link https://air-datepicker.com/examples}\n * Please note that overriding the `container` and `locale` properties and the `onSelect` and `onHide`\n * events might cause the component to malfunction.\n */\nexport class QuangDateComponent extends QuangBaseComponent<string | DateRange | null> {\n /**\n * Format to use to show on the input field.\n * The format is based on the standard {@link https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table}\n * Default: dd/MM/yyyy\n * @default dd/MM/yyyy\n */\n dateFormat = input<string>('dd/MM/yyyy')\n\n /**\n * Format to use to show on the time inside the input field.\n * The format is based on the standard {@link https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table}\n * Default: HH:mm\n * @default HH:mm\n */\n timeFormat = input<string>('HH:mm')\n\n /**\n * Calendar locale, if not provided the component will try to use the one provided in {@link QuangTranslationService}\n * if the language is not set in {@link QuangTranslationService} it will use the browser language\n * Use this parameter only to override default behavior\n */\n activeLanguageOverride = input<string | undefined>(undefined)\n\n /**\n * If true enable the timepicker inside the calendar\n */\n timepicker = input<boolean>(false)\n\n /**\n * The message to show inside the input if the date is invalid\n */\n invalidDateMessage = input<string>('')\n\n showOnlyTimepicker = input<boolean>(false)\n\n minHour = input<number>(0)\n\n maxHour = input<number>(24)\n\n minMinute = input<number>(0)\n\n maxMinute = input<number>(59)\n\n minDate = input<Date | undefined>(undefined)\n\n maxDate = input<Date | undefined>(undefined)\n\n showInline = input<boolean>(false)\n\n calendarClasses = input<string>('')\n\n buttonClass = input<string>('')\n\n datepickerOptions = input<QuangDatepickerOptions | undefined>(undefined)\n\n _inputForDate = viewChild<ElementRef>('inputForDate')\n\n contentTemplate = viewChild.required<ElementRef>('calendarButton')\n\n hasNoContent = computed(() => this.contentTemplate()?.nativeElement.children.length === 0)\n\n _quangTranslationService = signal<QuangTranslationService | undefined>(\n inject(QuangTranslationService, { optional: true }) ?? undefined\n )\n\n _quangTranslationActiveLang = computed(() => this._quangTranslationService()?.activeLang() ?? null)\n\n multipleDatesSeparator = input<string>(' - ')\n\n rangeSelection = input(false)\n\n _activeLanguage = computed(() => {\n if (this.activeLanguageOverride()) {\n return this.activeLanguageOverride()\n }\n if (this._quangTranslationService()) {\n return this._quangTranslationActiveLang()\n }\n return navigator.language\n })\n\n _airDatepickerInstance = signal<AirDatepicker | undefined>(undefined)\n\n searchTextDebounce = input<number>(500)\n\n targetPosition = signal<AirDatepickerPosition>('bottom left')\n\n _generateAirDatepickerEffect = effect(() => {\n this.setupCalendar()\n })\n\n valueFormat = computed(() =>\n this.showOnlyTimepicker()\n ? this.timeFormat()\n : this.dateFormat() + (this.showTimepicker() ? ` ${this.timeFormat()}` : '')\n )\n\n inputValueString = computed(() => this.formatDate(this._value()))\n\n constructor() {\n super()\n\n fromEvent(document, 'scroll', { capture: true })\n .pipe(takeUntilDestroyed(), debounceTime(250))\n .subscribe(() => {\n if (this._airDatepickerInstance()?.visible) {\n this.setupCalendar()\n }\n })\n }\n\n showTimepicker = computed(() => !this.rangeSelection() && (this.timepicker() || this.showOnlyTimepicker()))\n\n isMouseInsideCalendar = signal(false)\n\n isMouseOutsideCalendar = computed(() => !this.isMouseInsideCalendar())\n\n private _shouldRefocusInputOnHide = signal(false)\n\n setupCalendar() {\n if (this._inputForDate()?.nativeElement) {\n let currentValue = this._value()\n let targetDate: AirDatepickerDate[] | undefined\n if (currentValue && typeof currentValue === 'string') {\n if (!this.showTimepicker()) {\n currentValue = currentValue.split('T')[0]\n }\n targetDate = [currentValue]\n } else if (currentValue && typeof currentValue === 'object') {\n targetDate = []\n if (currentValue.dateFrom) {\n let targetDateFrom: string = currentValue.dateFrom\n if (!this.showTimepicker()) {\n targetDateFrom = currentValue.dateFrom.split('T')[0]\n }\n targetDate.push(targetDateFrom)\n }\n if (currentValue.dateTo) {\n let targetDateTo: string = currentValue.dateTo\n if (!this.showTimepicker()) {\n targetDateTo = currentValue.dateTo.split('T')[0]\n }\n targetDate.push(targetDateTo)\n }\n }\n this.setCalendarPosition()\n const airDatepickerOpts: QuangDatepickerOptions = {\n autoClose: true,\n showEvent: 'click',\n classes: this.calendarClasses(),\n dateFormat: this.dateFormat(),\n inline: this.showInline(),\n isMobile: false,\n multipleDatesSeparator: this.multipleDatesSeparator(),\n range: this.rangeSelection(),\n timepicker: this.showTimepicker(),\n onlyTimepicker: this.showOnlyTimepicker(),\n timeFormat: this.timeFormat(),\n minHours: this.minHour(),\n maxHours: this.maxHour(),\n minMinutes: this.minMinute(),\n maxMinutes: this.maxMinute(),\n minDate: this.minDate(),\n maxDate: this.maxDate(),\n toggleSelected: false,\n multipleDates: false,\n selectedDates: targetDate,\n position: this.targetPosition(),\n locale: this.getLocale(),\n\n onSelect: ({ date }) => {\n this._shouldRefocusInputOnHide.set(true)\n if (!Array.isArray(date)) {\n let selectTargetDate = date\n if (!this.showTimepicker()) {\n selectTargetDate = this.dateToUtc(date)\n }\n this.onChangedHandler(selectTargetDate.toISOString())\n }\n if (this.showInline()) {\n this.onHideCalendar()\n }\n },\n onHide: (isAnimationComplete: boolean) => {\n if (isAnimationComplete) {\n this.onHideCalendar()\n }\n },\n ...(this.datepickerOptions() ?? {}),\n onShow: (isAnimationComplete) => {\n const datepicker = this._airDatepickerInstance()?.$datepicker\n if (datepicker) {\n datepicker.onmouseenter = () => {\n this.isMouseInsideCalendar.set(true)\n }\n datepicker.onmouseleave = () => {\n this.isMouseInsideCalendar.set(false)\n }\n }\n if (isAnimationComplete || !this.showTimepicker()) {\n return\n }\n this.setupTimepicker()\n },\n }\n\n if (this._airDatepickerInstance()) {\n if (this._airDatepickerInstance()?.visible) {\n this._airDatepickerInstance()?.update(airDatepickerOpts)\n } else {\n this._airDatepickerInstance()?.update(airDatepickerOpts, { silent: true })\n }\n\n if (!targetDate) {\n this._airDatepickerInstance()?.setFocusDate(false)\n this._airDatepickerInstance()?.clear({ silent: true })\n } else {\n this._airDatepickerInstance()?.selectDate(targetDate, { updateTime: true })\n }\n } else {\n this._airDatepickerInstance.set(new AirDatepicker(this._inputForDate()?.nativeElement, airDatepickerOpts))\n }\n\n if (this.showInline()) {\n this.setupTimepicker()\n }\n }\n }\n\n onChangeText($event: Event): void {\n const value = ($event.target as HTMLInputElement)?.value\n if (value) {\n // TODO: check format for DateRange\n if (value.length === this.valueFormat().length && isMatch(value, this.valueFormat())) {\n this.onChangedHandler(this.setupInputStringToDate(value).toISOString())\n }\n } else {\n this.onChangedHandler(value)\n }\n }\n\n override onBlurHandler() {\n super.onBlurHandler()\n\n if (this.isMouseOutsideCalendar() && this._airDatepickerInstance()?.visible) {\n this._airDatepickerInstance()?.hide()\n }\n }\n\n setupInputStringToDate(value: string) {\n let targetValueFormat = this.valueFormat()\n if (value.length !== targetValueFormat.length) {\n targetValueFormat = targetValueFormat.replace('yyyy', 'yy')\n }\n let targetDate = parse(value, targetValueFormat, new Date())\n if (!this.showTimepicker()) {\n targetDate = this.dateToUtc(targetDate)\n }\n return targetDate\n }\n\n override onChangedHandler(value: string | DateRange | null): void {\n let targetDate = value\n const currentValue = this._value()\n if (typeof targetDate === 'string' && (!currentValue || typeof currentValue === 'string')) {\n if (!this.showTimepicker() && targetDate) {\n // remove time from date\n targetDate = `${targetDate.split('T')[0]}T00:00:00.000Z`\n } else if (this.showOnlyTimepicker() && currentValue && targetDate) {\n targetDate = `${currentValue.split('T')[0]}T${targetDate.split('T')[1]}`\n }\n } else if (\n this.rangeSelection() &&\n typeof targetDate === 'object' &&\n (currentValue === null || typeof currentValue === 'object')\n ) {\n if (!this.showTimepicker() && targetDate?.dateFrom) {\n // remove time from date\n targetDate.dateFrom = `${targetDate.dateFrom.split('T')[0]}T00:00:00.000Z`\n } else if (this.showOnlyTimepicker() && currentValue?.dateFrom && targetDate?.dateFrom) {\n targetDate.dateFrom = `${currentValue?.dateFrom.split('T')[0]}T${targetDate.dateFrom.split('T')[1]}`\n }\n if (!this.showTimepicker() && targetDate?.dateTo) {\n // remove time from date\n targetDate.dateTo = `${targetDate.dateTo.split('T')[0]}T00:00:00.000Z`\n } else if (this.showOnlyTimepicker() && currentValue?.dateTo && targetDate?.dateTo) {\n targetDate.dateTo = `${currentValue?.dateTo.split('T')[0]}T${targetDate.dateTo.split('T')[1]}`\n }\n }\n\n if (JSON.stringify(currentValue) === JSON.stringify(targetDate)) {\n return\n }\n\n this._value.set(targetDate)\n }\n\n onHideCalendar(): void {\n const valueInput: string = this._inputForDate()?.nativeElement.value\n let value: string | DateRange = valueInput\n if (this.rangeSelection()) {\n value = { dateFrom: '', dateTo: '' }\n const [dateFrom, dateTo] = valueInput.split(this.multipleDatesSeparator())\n value.dateFrom = dateFrom ?? ''\n value.dateTo = dateTo ?? ''\n if (!value.dateFrom || !this.checkDateMatch(value.dateFrom)) {\n value.dateFrom = null\n } else {\n value.dateFrom = this.setupInputStringToDate(value.dateFrom).toISOString()\n }\n if (!value.dateTo || !this.checkDateMatch(value.dateTo)) {\n value.dateTo = null\n } else {\n value.dateTo = this.setupInputStringToDate(value.dateTo).toISOString()\n }\n this.onChangedHandler(value)\n } else if (this.checkDateMatch(value)) {\n this.onChangedHandler(this.setupInputStringToDate(value).toISOString())\n } else {\n this.onChangedHandler(null)\n }\n\n if (this.formControl()?.getRawValue() !== this._value()) {\n super.onChangedHandler(this._value())\n } else if (this.onTouched) {\n this.onTouched()\n }\n\n // Only focus the input when the user actually interacted with the calendar.\n // Avoids infinite focus loop when tabbing between multiple datepickers.\n const activeElement = document.activeElement\n const calendarElement = this._airDatepickerInstance()?.$datepicker\n const inputElement = this._inputForDate()?.nativeElement\n const isCalendarFocused = calendarElement?.contains(activeElement)\n\n const shouldRefocus = this._shouldRefocusInputOnHide() || isCalendarFocused || this.isMouseInsideCalendar()\n this._shouldRefocusInputOnHide.set(false)\n\n if (shouldRefocus) {\n inputElement?.focus()\n }\n\n this.onBlurHandler()\n }\n\n formatDate(val: string | DateRange | null): string {\n if (val && typeof val === 'string') {\n return format(val, this.valueFormat())\n }\n if (val && typeof val === 'object') {\n let dateFromFormat = ''\n let dateToFormat = ''\n if (val.dateFrom) {\n dateFromFormat = format(val.dateFrom, this.valueFormat())\n }\n if (val.dateTo) {\n dateToFormat = format(val.dateTo, this.valueFormat())\n }\n return `${dateFromFormat}${this.multipleDatesSeparator()}${dateToFormat}`\n }\n return ''\n }\n\n openDatePicker() {\n const inputEl = this._inputForDate()?.nativeElement\n if (!inputEl || this._isDisabled()) {\n return\n }\n\n inputEl.focus()\n\n if (!this._airDatepickerInstance()) {\n this.setupCalendar()\n }\n\n this._airDatepickerInstance()?.show()\n }\n\n onInputKeydown(event: KeyboardEvent) {\n if (this._isDisabled()) {\n return\n }\n\n const dp = this._airDatepickerInstance()\n if (event.key === 'Escape' && dp?.visible) {\n event.preventDefault()\n dp.hide()\n return\n }\n\n if (event.key === 'Enter' || event.key === 'ArrowDown') {\n event.preventDefault()\n this.openDatePicker()\n }\n }\n\n interceptInputInteraction($event: Event) {\n if (!this.isReadonly()) return\n\n $event.stopPropagation()\n $event.stopImmediatePropagation()\n $event.preventDefault()\n }\n\n getLocale(): AirDatepickerLocale {\n switch (this._activeLanguage()?.toLowerCase()) {\n case 'en':\n return (en as any).default || en\n case 'it':\n return (it as any).default || it\n case 'fr':\n return (fr as any).default || fr\n default:\n return (en as any).default || en\n }\n }\n\n onCancel(): void {\n this._inputForDate()?.nativeElement.blur()\n }\n\n private dateToUtc(date: Date): Date {\n // convert to UTC time removing the timezone\n return new Date(date.getTime() - date.getTimezoneOffset() * 60000)\n }\n\n private dateToLocal(date: Date): Date {\n // convert to local time adding the timezone\n return new Date(date.getTime() + date.getTimezoneOffset() * 60000)\n }\n\n private setCalendarPosition() {\n const windowInnerHeight = window.innerHeight\n const inputBoundingClientRect = this._inputForDate()?.nativeElement.getBoundingClientRect()\n const diff = windowInnerHeight - inputBoundingClientRect.height - inputBoundingClientRect.top - 239\n if (diff >= 0) {\n this.targetPosition.set('bottom left')\n } else {\n this.targetPosition.set('top left')\n }\n }\n\n private setupTimepicker() {\n const timepicker = document.getElementsByClassName('air-datepicker-time')?.[0]\n if (timepicker) {\n const inputs = timepicker.getElementsByTagName('input')\n for (const input of Array.from(inputs)) {\n input.setAttribute('type', 'number')\n input.setAttribute('maxLength', '2')\n input.className = 'form-control'\n input.onmouseup = (evt) => {\n evt.stopImmediatePropagation()\n }\n input.onblur = () => {\n if (this.isMouseOutsideCalendar()) {\n this._airDatepickerInstance()?.hide()\n }\n }\n }\n }\n }\n\n checkDateMatch(date: string): boolean {\n return isMatch(date, this.valueFormat()) || isMatch(date, this.valueFormat().replace('yyyy', 'yy'))\n }\n}\n","<div class=\"mb-3\">\n @if (componentLabel()) {\n <label\n [htmlFor]=\"componentId()\"\n class=\"form-label\"\n >\n {{ componentLabel() | transloco }}\n <span [hidden]=\"!_isRequired()\">*</span>\n </label>\n }\n <div\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n class=\"input-date-container\"\n >\n <input\n [attr.required]=\"getIsRequiredControl()\"\n [autocomplete]=\"'off'\"\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n [class.with-button-calendar]=\"!hasNoContent()\"\n [disabled]=\"_isDisabled()\"\n [hidden]=\"showInline()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [readOnly]=\"isReadonly()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"inputValueString()\"\n (blur)=\"onBlurHandler()\"\n (focus)=\"interceptInputInteraction($event)\"\n (input)=\"onChangeText($event)\"\n (keydown)=\"onInputKeydown($event)\"\n (mouseenter)=\"isMouseInsideCalendar.set(true)\"\n (mouseleave)=\"isMouseInsideCalendar.set(false)\"\n (search)=\"onCancel()\"\n #inputForDate\n class=\"form-control\"\n type=\"search\"\n />\n <button\n [attr.required]=\"getIsRequiredControl()\"\n [class.border-danger]=\"_showErrors()\"\n [class.border-success]=\"_showSuccess()\"\n [hidden]=\"showInline() || hasNoContent() || _isDisabled()\"\n [ngClass]=\"buttonClass()\"\n (click)=\"_ngControl()?.disabled ? null : openDatePicker()\"\n #calendarButton\n aria-label=\"calendar-button\"\n class=\"btn btn-outline-secondary btn-outline-calendar\"\n type=\"button\"\n >\n <ng-content></ng-content>\n </button>\n </div>\n <div class=\"valid-feedback\">\n {{ successMessage() | transloco }}\n </div>\n <div class=\"invalid-feedback\">\n {{ _currentErrorMessage() | transloco: _currentErrorMessageExtraData() }}\n </div>\n @if (helpMessage()) {\n <small\n [hidden]=\"_showSuccess() || _showErrors()\"\n aria-live=\"assertive\"\n class=\"form-text text-muted\"\n >\n {{ helpMessage() | transloco }}\n </small>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AA+CA;;;;;;;;;;;AAWG;AACG,MAAO,kBAAmB,SAAQ,kBAA6C,CAAA;AAoGnF,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AApGT;;;;;AAKG;AACH,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAS,YAAY,CAAC;AAExC;;;;;AAKG;AACH,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAS,OAAO,CAAC;AAEnC;;;;AAIG;AACH,QAAA,IAAA,CAAA,sBAAsB,GAAG,KAAK,CAAqB,SAAS,CAAC;AAE7D;;AAEG;AACH,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAU,KAAK,CAAC;AAElC;;AAEG;AACH,QAAA,IAAA,CAAA,kBAAkB,GAAG,KAAK,CAAS,EAAE,CAAC;AAEtC,QAAA,IAAA,CAAA,kBAAkB,GAAG,KAAK,CAAU,KAAK,CAAC;AAE1C,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAS,CAAC,CAAC;AAE1B,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAS,EAAE,CAAC;AAE3B,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAS,CAAC,CAAC;AAE5B,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAS,EAAE,CAAC;AAE7B,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAmB,SAAS,CAAC;AAE5C,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAmB,SAAS,CAAC;AAE5C,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAU,KAAK,CAAC;AAElC,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAS,EAAE,CAAC;AAEnC,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAS,EAAE,CAAC;AAE/B,QAAA,IAAA,CAAA,iBAAiB,GAAG,KAAK,CAAqC,SAAS,CAAC;AAExE,QAAA,IAAA,CAAA,aAAa,GAAG,SAAS,CAAa,cAAc,CAAC;AAErD,QAAA,IAAA,CAAA,eAAe,GAAG,SAAS,CAAC,QAAQ,CAAa,gBAAgB,CAAC;AAElE,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,EAAE,aAAa,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;AAE1F,QAAA,IAAA,CAAA,wBAAwB,GAAG,MAAM,CAC/B,MAAM,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,SAAS,CACjE;AAED,QAAA,IAAA,CAAA,2BAA2B,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,wBAAwB,EAAE,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC;AAEnG,QAAA,IAAA,CAAA,sBAAsB,GAAG,KAAK,CAAS,KAAK,CAAC;AAE7C,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC;AAE7B,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AAC9B,YAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAE;AACjC,gBAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE;;AAEtC,YAAA,IAAI,IAAI,CAAC,wBAAwB,EAAE,EAAE;AACnC,gBAAA,OAAO,IAAI,CAAC,2BAA2B,EAAE;;YAE3C,OAAO,SAAS,CAAC,QAAQ;AAC3B,SAAC,CAAC;AAEF,QAAA,IAAA,CAAA,sBAAsB,GAAG,MAAM,CAA4B,SAAS,CAAC;AAErE,QAAA,IAAA,CAAA,kBAAkB,GAAG,KAAK,CAAS,GAAG,CAAC;AAEvC,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAwB,aAAa,CAAC;AAE7D,QAAA,IAAA,CAAA,4BAA4B,GAAG,MAAM,CAAC,MAAK;YACzC,IAAI,CAAC,aAAa,EAAE;AACtB,SAAC,CAAC;QAEF,IAAW,CAAA,WAAA,GAAG,QAAQ,CAAC,MACrB,IAAI,CAAC,kBAAkB;AACrB,cAAE,IAAI,CAAC,UAAU;cACf,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,GAAG,CAAI,CAAA,EAAA,IAAI,CAAC,UAAU,EAAE,CAAA,CAAE,GAAG,EAAE,CAAC,CAC/E;AAED,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAcjE,IAAc,CAAA,cAAA,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;AAE3G,QAAA,IAAA,CAAA,qBAAqB,GAAG,MAAM,CAAC,KAAK,CAAC;AAErC,QAAA,IAAA,CAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAE9D,QAAA,IAAA,CAAA,yBAAyB,GAAG,MAAM,CAAC,KAAK,CAAC;QAf/C,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;aAC5C,IAAI,CAAC,kBAAkB,EAAE,EAAE,YAAY,CAAC,GAAG,CAAC;aAC5C,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAE,OAAO,EAAE;gBAC1C,IAAI,CAAC,aAAa,EAAE;;AAExB,SAAC,CAAC;;IAWN,aAAa,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE;AACvC,YAAA,IAAI,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE;AAChC,YAAA,IAAI,UAA2C;AAC/C,YAAA,IAAI,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE;AACpD,gBAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;oBAC1B,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAE3C,gBAAA,UAAU,GAAG,CAAC,YAAY,CAAC;;AACtB,iBAAA,IAAI,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE;gBAC3D,UAAU,GAAG,EAAE;AACf,gBAAA,IAAI,YAAY,CAAC,QAAQ,EAAE;AACzB,oBAAA,IAAI,cAAc,GAAW,YAAY,CAAC,QAAQ;AAClD,oBAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AAC1B,wBAAA,cAAc,GAAG,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAEtD,oBAAA,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC;;AAEjC,gBAAA,IAAI,YAAY,CAAC,MAAM,EAAE;AACvB,oBAAA,IAAI,YAAY,GAAW,YAAY,CAAC,MAAM;AAC9C,oBAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AAC1B,wBAAA,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAElD,oBAAA,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;;;YAGjC,IAAI,CAAC,mBAAmB,EAAE;AAC1B,YAAA,MAAM,iBAAiB,GAA2B;AAChD,gBAAA,SAAS,EAAE,IAAI;AACf,gBAAA,SAAS,EAAE,OAAO;AAClB,gBAAA,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE;AAC/B,gBAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,gBAAA,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE;AACzB,gBAAA,QAAQ,EAAE,KAAK;AACf,gBAAA,sBAAsB,EAAE,IAAI,CAAC,sBAAsB,EAAE;AACrD,gBAAA,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE;AAC5B,gBAAA,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE;AACjC,gBAAA,cAAc,EAAE,IAAI,CAAC,kBAAkB,EAAE;AACzC,gBAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,gBAAA,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE;AACxB,gBAAA,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE;AACxB,gBAAA,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE;AAC5B,gBAAA,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE;AAC5B,gBAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACvB,gBAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACvB,gBAAA,cAAc,EAAE,KAAK;AACrB,gBAAA,aAAa,EAAE,KAAK;AACpB,gBAAA,aAAa,EAAE,UAAU;AACzB,gBAAA,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE;AAC/B,gBAAA,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;AAExB,gBAAA,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,KAAI;AACrB,oBAAA,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC;oBACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;wBACxB,IAAI,gBAAgB,GAAG,IAAI;AAC3B,wBAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AAC1B,4BAAA,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;;wBAEzC,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;;AAEvD,oBAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;wBACrB,IAAI,CAAC,cAAc,EAAE;;iBAExB;AACD,gBAAA,MAAM,EAAE,CAAC,mBAA4B,KAAI;oBACvC,IAAI,mBAAmB,EAAE;wBACvB,IAAI,CAAC,cAAc,EAAE;;iBAExB;AACD,gBAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;AACnC,gBAAA,MAAM,EAAE,CAAC,mBAAmB,KAAI;oBAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,sBAAsB,EAAE,EAAE,WAAW;oBAC7D,IAAI,UAAU,EAAE;AACd,wBAAA,UAAU,CAAC,YAAY,GAAG,MAAK;AAC7B,4BAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;AACtC,yBAAC;AACD,wBAAA,UAAU,CAAC,YAAY,GAAG,MAAK;AAC7B,4BAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;AACvC,yBAAC;;oBAEH,IAAI,mBAAmB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;wBACjD;;oBAEF,IAAI,CAAC,eAAe,EAAE;iBACvB;aACF;AAED,YAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAE;AACjC,gBAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAE,OAAO,EAAE;oBAC1C,IAAI,CAAC,sBAAsB,EAAE,EAAE,MAAM,CAAC,iBAAiB,CAAC;;qBACnD;AACL,oBAAA,IAAI,CAAC,sBAAsB,EAAE,EAAE,MAAM,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;gBAG5E,IAAI,CAAC,UAAU,EAAE;oBACf,IAAI,CAAC,sBAAsB,EAAE,EAAE,YAAY,CAAC,KAAK,CAAC;AAClD,oBAAA,IAAI,CAAC,sBAAsB,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;qBACjD;AACL,oBAAA,IAAI,CAAC,sBAAsB,EAAE,EAAE,UAAU,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;;;iBAExE;AACL,gBAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAAC;;AAG5G,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;gBACrB,IAAI,CAAC,eAAe,EAAE;;;;AAK5B,IAAA,YAAY,CAAC,MAAa,EAAA;AACxB,QAAA,MAAM,KAAK,GAAI,MAAM,CAAC,MAA2B,EAAE,KAAK;QACxD,IAAI,KAAK,EAAE;;YAET,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE;AACpF,gBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;;;aAEpE;AACL,YAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;;;IAIvB,aAAa,GAAA;QACpB,KAAK,CAAC,aAAa,EAAE;AAErB,QAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAE,OAAO,EAAE;AAC3E,YAAA,IAAI,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE;;;AAIzC,IAAA,sBAAsB,CAAC,KAAa,EAAA;AAClC,QAAA,IAAI,iBAAiB,GAAG,IAAI,CAAC,WAAW,EAAE;QAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,iBAAiB,CAAC,MAAM,EAAE;YAC7C,iBAAiB,GAAG,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;;AAE7D,QAAA,IAAI,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,IAAI,EAAE,CAAC;AAC5D,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AAC1B,YAAA,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;;AAEzC,QAAA,OAAO,UAAU;;AAGV,IAAA,gBAAgB,CAAC,KAAgC,EAAA;QACxD,IAAI,UAAU,GAAG,KAAK;AACtB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE;AAClC,QAAA,IAAI,OAAO,UAAU,KAAK,QAAQ,KAAK,CAAC,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,CAAC,EAAE;YACzF,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,UAAU,EAAE;;AAExC,gBAAA,UAAU,GAAG,CAAA,EAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA,cAAA,CAAgB;;iBACnD,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,YAAY,IAAI,UAAU,EAAE;gBAClE,UAAU,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE;;;aAErE,IACL,IAAI,CAAC,cAAc,EAAE;YACrB,OAAO,UAAU,KAAK,QAAQ;aAC7B,YAAY,KAAK,IAAI,IAAI,OAAO,YAAY,KAAK,QAAQ,CAAC,EAC3D;YACA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,UAAU,EAAE,QAAQ,EAAE;;AAElD,gBAAA,UAAU,CAAC,QAAQ,GAAG,CAAG,EAAA,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB;;AACrE,iBAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,YAAY,EAAE,QAAQ,IAAI,UAAU,EAAE,QAAQ,EAAE;AACtF,gBAAA,UAAU,CAAC,QAAQ,GAAG,CAAA,EAAG,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE;;YAEtG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,UAAU,EAAE,MAAM,EAAE;;AAEhD,gBAAA,UAAU,CAAC,MAAM,GAAG,CAAG,EAAA,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB;;AACjE,iBAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,IAAI,YAAY,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,EAAE;AAClF,gBAAA,UAAU,CAAC,MAAM,GAAG,CAAA,EAAG,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE;;;AAIlG,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;YAC/D;;AAGF,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;;IAG7B,cAAc,GAAA;QACZ,MAAM,UAAU,GAAW,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa,CAAC,KAAK;QACpE,IAAI,KAAK,GAAuB,UAAU;AAC1C,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;YACzB,KAAK,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;AACpC,YAAA,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;AAC1E,YAAA,KAAK,CAAC,QAAQ,GAAG,QAAQ,IAAI,EAAE;AAC/B,YAAA,KAAK,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE;AAC3B,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AAC3D,gBAAA,KAAK,CAAC,QAAQ,GAAG,IAAI;;iBAChB;AACL,gBAAA,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;;AAE5E,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;AACvD,gBAAA,KAAK,CAAC,MAAM,GAAG,IAAI;;iBACd;AACL,gBAAA,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE;;AAExE,YAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;;AACvB,aAAA,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE;AACrC,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;;aAClE;AACL,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;;AAG7B,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,MAAM,EAAE,EAAE;YACvD,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;;AAChC,aAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YACzB,IAAI,CAAC,SAAS,EAAE;;;;AAKlB,QAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa;QAC5C,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,EAAE,EAAE,WAAW;QAClE,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa;QACxD,MAAM,iBAAiB,GAAG,eAAe,EAAE,QAAQ,CAAC,aAAa,CAAC;AAElE,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,yBAAyB,EAAE,IAAI,iBAAiB,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC3G,QAAA,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC;QAEzC,IAAI,aAAa,EAAE;YACjB,YAAY,EAAE,KAAK,EAAE;;QAGvB,IAAI,CAAC,aAAa,EAAE;;AAGtB,IAAA,UAAU,CAAC,GAA8B,EAAA;AACvC,QAAA,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;YAClC,OAAO,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;AAExC,QAAA,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;YAClC,IAAI,cAAc,GAAG,EAAE;YACvB,IAAI,YAAY,GAAG,EAAE;AACrB,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE;AAChB,gBAAA,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;AAE3D,YAAA,IAAI,GAAG,CAAC,MAAM,EAAE;AACd,gBAAA,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;;YAEvD,OAAO,CAAA,EAAG,cAAc,CAAA,EAAG,IAAI,CAAC,sBAAsB,EAAE,CAAA,EAAG,YAAY,CAAA,CAAE;;AAE3E,QAAA,OAAO,EAAE;;IAGX,cAAc,GAAA;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa;QACnD,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YAClC;;QAGF,OAAO,CAAC,KAAK,EAAE;AAEf,QAAA,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE;YAClC,IAAI,CAAC,aAAa,EAAE;;AAGtB,QAAA,IAAI,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE;;AAGvC,IAAA,cAAc,CAAC,KAAoB,EAAA;AACjC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACtB;;AAGF,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,sBAAsB,EAAE;QACxC,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,EAAE,EAAE,OAAO,EAAE;YACzC,KAAK,CAAC,cAAc,EAAE;YACtB,EAAE,CAAC,IAAI,EAAE;YACT;;AAGF,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;YACtD,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,cAAc,EAAE;;;AAIzB,IAAA,yBAAyB,CAAC,MAAa,EAAA;AACrC,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAAE;QAExB,MAAM,CAAC,eAAe,EAAE;QACxB,MAAM,CAAC,wBAAwB,EAAE;QACjC,MAAM,CAAC,cAAc,EAAE;;IAGzB,SAAS,GAAA;QACP,QAAQ,IAAI,CAAC,eAAe,EAAE,EAAE,WAAW,EAAE;AAC3C,YAAA,KAAK,IAAI;AACP,gBAAA,OAAQ,EAAU,CAAC,OAAO,IAAI,EAAE;AAClC,YAAA,KAAK,IAAI;AACP,gBAAA,OAAQ,EAAU,CAAC,OAAO,IAAI,EAAE;AAClC,YAAA,KAAK,IAAI;AACP,gBAAA,OAAQ,EAAU,CAAC,OAAO,IAAI,EAAE;AAClC,YAAA;AACE,gBAAA,OAAQ,EAAU,CAAC,OAAO,IAAI,EAAE;;;IAItC,QAAQ,GAAA;QACN,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa,CAAC,IAAI,EAAE;;AAGpC,IAAA,SAAS,CAAC,IAAU,EAAA;;AAE1B,QAAA,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,GAAG,KAAK,CAAC;;AAG5D,IAAA,WAAW,CAAC,IAAU,EAAA;;AAE5B,QAAA,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,GAAG,KAAK,CAAC;;IAG5D,mBAAmB,GAAA;AACzB,QAAA,MAAM,iBAAiB,GAAG,MAAM,CAAC,WAAW;QAC5C,MAAM,uBAAuB,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa,CAAC,qBAAqB,EAAE;AAC3F,QAAA,MAAM,IAAI,GAAG,iBAAiB,GAAG,uBAAuB,CAAC,MAAM,GAAG,uBAAuB,CAAC,GAAG,GAAG,GAAG;AACnG,QAAA,IAAI,IAAI,IAAI,CAAC,EAAE;AACb,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC;;aACjC;AACL,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC;;;IAI/B,eAAe,GAAA;AACrB,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,sBAAsB,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC9E,IAAI,UAAU,EAAE;YACd,MAAM,MAAM,GAAG,UAAU,CAAC,oBAAoB,CAAC,OAAO,CAAC;YACvD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;AACtC,gBAAA,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;AACpC,gBAAA,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,GAAG,CAAC;AACpC,gBAAA,KAAK,CAAC,SAAS,GAAG,cAAc;AAChC,gBAAA,KAAK,CAAC,SAAS,GAAG,CAAC,GAAG,KAAI;oBACxB,GAAG,CAAC,wBAAwB,EAAE;AAChC,iBAAC;AACD,gBAAA,KAAK,CAAC,MAAM,GAAG,MAAK;AAClB,oBAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAE;AACjC,wBAAA,IAAI,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE;;AAEzC,iBAAC;;;;AAKP,IAAA,cAAc,CAAC,IAAY,EAAA;QACzB,OAAO,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;;+GAhd1F,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,sBAAA,EAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,sBAAA,EAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAhBlB,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,kBAAkB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3C7G,kwEAuEA,EAAA,MAAA,EAAA,CAAA,o2EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,ED3BY,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAerB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBApB9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAGX,SAAA,EAAA,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAwB,kBAAA,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAClG,OAAA,EAAA,CAAC,aAAa,EAAE,OAAO,CAAC,EAChB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,kwEAAA,EAAA,MAAA,EAAA,CAAA,o2EAAA,CAAA,EAAA;;;AE7CjD;;AAEG;;;;"}
1
+ {"version":3,"file":"quang-components-date.mjs","sources":["../../../projects/quang/components/date/date.component.ts","../../../projects/quang/components/date/date.component.html","../../../projects/quang/components/date/quang-components-date.ts"],"sourcesContent":["import { NgClass } from '@angular/common'\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n computed,\n effect,\n forwardRef,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core'\nimport { NgZone } from '@angular/core'\nimport { ApplicationRef } from '@angular/core'\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop'\nimport { NG_VALUE_ACCESSOR } from '@angular/forms'\n\nimport { TranslocoPipe } from '@jsverse/transloco'\nimport AirDatepicker, {\n AirDatepickerDate,\n AirDatepickerLocale,\n AirDatepickerOptions,\n AirDatepickerPosition,\n} from 'air-datepicker'\nimport en from 'air-datepicker/locale/en'\nimport fr from 'air-datepicker/locale/fr'\nimport it from 'air-datepicker/locale/it'\nimport { format, isMatch, parse } from 'date-fns'\nimport { QuangTranslationService } from 'quang/translation'\nimport { debounceTime, fromEvent } from 'rxjs'\n\nimport { QuangBaseComponent } from 'quang/components/shared'\n\nexport interface DateRange {\n dateFrom: string | null\n dateTo: string | null\n}\n\nexport type QuangDatepickerOptions = AirDatepickerOptions\n\n@Component({\n selector: 'quang-date',\n templateUrl: './date.component.html',\n styleUrl: './date.component.scss',\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => QuangDateComponent), multi: true }],\n imports: [TranslocoPipe, NgClass],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n/**\n * Datepicker component based on {@link https://air-datepicker.com/docs}.\n *\n * @usageNotes\n * 1. It can be used to only display the `timepicker` component by setting\n * `[showOnlyTimepicker]=\"true\"`\n *\n * 2. `datepickerOptions` can be used to override the default options of the component to get full access to all the\n * possible customizations that Air Datepicker provides. See {@link https://air-datepicker.com/examples}\n * Please note that overriding the `container` and `locale` properties and the `onSelect` and `onHide`\n * events might cause the component to malfunction.\n */\nexport class QuangDateComponent extends QuangBaseComponent<string | DateRange | null> {\n private readonly _ngZone = inject(NgZone)\n private readonly _cdr = inject(ChangeDetectorRef)\n private readonly _appRef = inject(ApplicationRef)\n private _tickScheduled = false\n\n /**\n * Format to use to show on the input field.\n * The format is based on the standard {@link https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table}\n * Default: dd/MM/yyyy\n * @default dd/MM/yyyy\n */\n dateFormat = input<string>('dd/MM/yyyy')\n\n /**\n * Format to use to show on the time inside the input field.\n * The format is based on the standard {@link https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table}\n * Default: HH:mm\n * @default HH:mm\n */\n timeFormat = input<string>('HH:mm')\n\n /**\n * Calendar locale, if not provided the component will try to use the one provided in {@link QuangTranslationService}\n * if the language is not set in {@link QuangTranslationService} it will use the browser language\n * Use this parameter only to override default behavior\n */\n activeLanguageOverride = input<string | undefined>(undefined)\n\n /**\n * If true enable the timepicker inside the calendar\n */\n timepicker = input<boolean>(false)\n\n /**\n * The message to show inside the input if the date is invalid\n */\n invalidDateMessage = input<string>('')\n\n showOnlyTimepicker = input<boolean>(false)\n\n minHour = input<number>(0)\n\n maxHour = input<number>(24)\n\n minMinute = input<number>(0)\n\n maxMinute = input<number>(59)\n\n minDate = input<Date | undefined>(undefined)\n\n maxDate = input<Date | undefined>(undefined)\n\n showInline = input<boolean>(false)\n\n calendarClasses = input<string>('')\n\n buttonClass = input<string>('')\n\n datepickerOptions = input<QuangDatepickerOptions | undefined>(undefined)\n\n _inputForDate = viewChild<ElementRef>('inputForDate')\n\n contentTemplate = viewChild.required<ElementRef>('calendarButton')\n\n hasNoContent = computed(() => this.contentTemplate()?.nativeElement.children.length === 0)\n\n _quangTranslationService = signal<QuangTranslationService | undefined>(\n inject(QuangTranslationService, { optional: true }) ?? undefined\n )\n\n _quangTranslationActiveLang = computed(() => this._quangTranslationService()?.activeLang() ?? null)\n\n multipleDatesSeparator = input<string>(' - ')\n\n rangeSelection = input(false)\n\n _activeLanguage = computed(() => {\n if (this.activeLanguageOverride()) {\n return this.activeLanguageOverride()\n }\n if (this._quangTranslationService()) {\n return this._quangTranslationActiveLang()\n }\n return navigator.language\n })\n\n _airDatepickerInstance = signal<AirDatepicker | undefined>(undefined)\n\n // AirDatepicker doesn't reliably support toggling `inline` at runtime via `update()`.\n // Track the mode used to create the current instance and recreate when it changes.\n private readonly _airDatepickerInlineMode = signal<boolean | null>(null)\n\n searchTextDebounce = input<number>(500)\n\n targetPosition = signal<AirDatepickerPosition>('bottom left')\n\n _generateAirDatepickerEffect = effect(() => {\n this.setupCalendar()\n })\n\n valueFormat = computed(() =>\n this.showOnlyTimepicker()\n ? this.timeFormat()\n : this.dateFormat() + (this.showTimepicker() ? ` ${this.timeFormat()}` : '')\n )\n\n inputValueString = computed(() => this.formatDate(this._value()))\n\n constructor() {\n super()\n\n fromEvent(document, 'scroll', { capture: true })\n .pipe(takeUntilDestroyed(), debounceTime(250))\n .subscribe(() => {\n if (this._airDatepickerInstance()?.visible) {\n this.setupCalendar()\n }\n })\n }\n\n showTimepicker = computed(() => !this.rangeSelection() && (this.timepicker() || this.showOnlyTimepicker()))\n\n isMouseInsideCalendar = signal(false)\n\n isMouseOutsideCalendar = computed(() => !this.isMouseInsideCalendar())\n\n private _shouldRefocusInputOnHide = signal(false)\n\n setupCalendar() {\n if (!this._inputForDate()?.nativeElement) return\n\n const desiredInlineMode = this.showInline()\n\n const existingInstance = this._airDatepickerInstance()\n const existingInlineMode = this._airDatepickerInlineMode()\n\n if (existingInstance && existingInlineMode !== null && existingInlineMode !== desiredInlineMode) {\n const maybeDestroy = existingInstance as unknown as { destroy?: () => void }\n maybeDestroy.destroy?.()\n this._airDatepickerInstance.set(undefined)\n }\n\n let currentValue = this._value()\n let targetDate: AirDatepickerDate[] | undefined\n if (currentValue && typeof currentValue === 'string') {\n if (!this.showTimepicker()) {\n currentValue = currentValue.split('T')[0]\n }\n targetDate = [currentValue]\n } else if (currentValue && typeof currentValue === 'object') {\n targetDate = []\n if (currentValue.dateFrom) {\n const targetDateFrom: string = this.showTimepicker()\n ? currentValue.dateFrom\n : currentValue.dateFrom.split('T')[0]\n targetDate.push(targetDateFrom)\n }\n if (currentValue.dateTo) {\n const targetDateTo: string = this.showTimepicker() ? currentValue.dateTo : currentValue.dateTo.split('T')[0]\n targetDate.push(targetDateTo)\n }\n }\n\n this.setCalendarPosition()\n\n const userDatepickerOptions = this.datepickerOptions() ?? {}\n const userOnSelect = userDatepickerOptions.onSelect\n const userOnHide = userDatepickerOptions.onHide\n const userOnShow = userDatepickerOptions.onShow\n\n const airDatepickerOpts: QuangDatepickerOptions = {\n ...userDatepickerOptions,\n autoClose: !this.showInline(),\n showEvent: 'click',\n classes: this.calendarClasses(),\n dateFormat: this.dateFormat(),\n inline: this.showInline(),\n isMobile: false,\n multipleDatesSeparator: this.multipleDatesSeparator(),\n range: this.rangeSelection(),\n timepicker: this.showTimepicker(),\n onlyTimepicker: this.showOnlyTimepicker(),\n timeFormat: this.timeFormat(),\n minHours: this.minHour(),\n maxHours: this.maxHour(),\n minMinutes: this.minMinute(),\n maxMinutes: this.maxMinute(),\n minDate: this.minDate(),\n maxDate: this.maxDate(),\n toggleSelected: false,\n multipleDates: false,\n selectedDates: targetDate,\n position: this.targetPosition(),\n locale: this.getLocale(),\n\n onSelect: (args) => {\n const { date } = args\n // AirDatepicker callbacks may fire outside Angular's zone in some app setups.\n // Ensure CVA propagation happens inside the zone so the connected FormControl updates reliably.\n this._ngZone.run(() => {\n this._shouldRefocusInputOnHide.set(true)\n\n if (Array.isArray(date)) {\n // Range selection: AirDatepicker emits partial selections too (only start date).\n // Committing `_value` for partial selections can trigger `setupCalendar()` re-sync and\n // break the second click. Only commit once the range is complete.\n const [from, to] = date\n if (!from || !to) {\n return\n }\n\n const value: DateRange = {\n dateFrom: (this.showTimepicker() ? from : this.dateToUtc(from)).toISOString(),\n dateTo: (this.showTimepicker() ? to : this.dateToUtc(to)).toISOString(),\n }\n this.onChangedHandler(value)\n } else if (date) {\n const selectTargetDate = this.showTimepicker() ? date : this.dateToUtc(date)\n this.onChangedHandler(selectTargetDate.toISOString())\n }\n\n if (this.showInline()) {\n // Inline mode should update the connected control immediately.\n // Do not rely on `onHideCalendar()` because inline never hides and the input may be visually hidden.\n this.propagateValueToControl()\n }\n })\n\n userOnSelect?.(args)\n },\n onHide: (isAnimationComplete: boolean) => {\n if (isAnimationComplete) {\n this.onHideCalendar()\n }\n\n userOnHide?.(isAnimationComplete)\n },\n onShow: (isAnimationComplete) => {\n const datepicker = this._airDatepickerInstance()?.$datepicker\n if (datepicker) {\n datepicker.onmouseenter = () => {\n this.isMouseInsideCalendar.set(true)\n }\n datepicker.onmouseleave = () => {\n this.isMouseInsideCalendar.set(false)\n }\n }\n if (isAnimationComplete || !this.showTimepicker()) {\n return\n }\n this.setupTimepicker()\n\n userOnShow?.(isAnimationComplete)\n },\n }\n\n if (this._airDatepickerInstance()) {\n if (this._airDatepickerInstance()?.visible) {\n this._airDatepickerInstance()?.update(airDatepickerOpts)\n } else {\n this._airDatepickerInstance()?.update(airDatepickerOpts, { silent: true })\n }\n\n if (targetDate) {\n this._airDatepickerInstance()?.selectDate(targetDate, { updateTime: true, silent: true })\n } else {\n this._airDatepickerInstance()?.setFocusDate(false)\n this._airDatepickerInstance()?.clear({ silent: true })\n }\n } else {\n this._airDatepickerInstance.set(new AirDatepicker(this._inputForDate()?.nativeElement, airDatepickerOpts))\n }\n\n this._airDatepickerInlineMode.set(desiredInlineMode)\n\n if (desiredInlineMode) {\n // Ensure inline calendar is visible after re-creation/update.\n this._airDatepickerInstance()?.show?.()\n }\n\n if (this.showInline()) {\n this.setupTimepicker()\n }\n }\n\n onChangeText($event: Event): void {\n const value = ($event.target as HTMLInputElement)?.value\n if (value) {\n // TODO: check format for DateRange\n if (value.length === this.valueFormat().length && isMatch(value, this.valueFormat())) {\n this.onChangedHandler(this.setupInputStringToDate(value).toISOString())\n\n if (this.showInline()) {\n this.propagateValueToControl()\n }\n }\n } else {\n this.onChangedHandler(value)\n\n if (this.showInline()) {\n this.propagateValueToControl()\n }\n }\n }\n\n override onBlurHandler() {\n super.onBlurHandler()\n\n if (this.showInline()) {\n return\n }\n\n if (this.isMouseOutsideCalendar() && this._airDatepickerInstance()?.visible) {\n this._airDatepickerInstance()?.hide()\n }\n }\n\n setupInputStringToDate(value: string) {\n let targetValueFormat = this.valueFormat()\n if (value.length !== targetValueFormat.length) {\n targetValueFormat = targetValueFormat.replace('yyyy', 'yy')\n }\n const targetDate = parse(value, targetValueFormat, new Date())\n if (!this.showTimepicker()) {\n return this.dateToUtc(targetDate)\n }\n return targetDate\n }\n\n override onChangedHandler(value: string | DateRange | null): void {\n let targetDate = value\n const currentValue = this._value()\n if (typeof targetDate === 'string' && (!currentValue || typeof currentValue === 'string')) {\n if (!this.showTimepicker() && targetDate) {\n // remove time from date\n targetDate = `${targetDate.split('T')[0]}T00:00:00.000Z`\n } else if (this.showOnlyTimepicker() && currentValue && targetDate) {\n targetDate = `${currentValue.split('T')[0]}T${targetDate.split('T')[1]}`\n }\n } else if (\n this.rangeSelection() &&\n typeof targetDate === 'object' &&\n (currentValue === null || typeof currentValue === 'object')\n ) {\n if (!this.showTimepicker() && targetDate?.dateFrom) {\n // remove time from date\n targetDate.dateFrom = `${targetDate.dateFrom.split('T')[0]}T00:00:00.000Z`\n } else if (this.showOnlyTimepicker() && currentValue?.dateFrom && targetDate?.dateFrom) {\n targetDate.dateFrom = `${currentValue?.dateFrom.split('T')[0]}T${targetDate.dateFrom.split('T')[1]}`\n }\n if (!this.showTimepicker() && targetDate?.dateTo) {\n // remove time from date\n targetDate.dateTo = `${targetDate.dateTo.split('T')[0]}T00:00:00.000Z`\n } else if (this.showOnlyTimepicker() && currentValue?.dateTo && targetDate?.dateTo) {\n targetDate.dateTo = `${currentValue?.dateTo.split('T')[0]}T${targetDate.dateTo.split('T')[1]}`\n }\n }\n\n if (JSON.stringify(currentValue) === JSON.stringify(targetDate)) {\n return\n }\n\n this._value.set(targetDate)\n }\n\n private propagateValueToControl(): void {\n if (this.formControl()?.getRawValue() !== this._value()) {\n super.onChangedHandler(this._value())\n } else if (this.onTouched) {\n this.onTouched()\n }\n\n this.requestRender()\n }\n\n private requestRender(): void {\n // Inline datepicker interactions can happen outside Angular-managed events.\n // Marking the view dirty is not always enough in zoneless/event-coalesced setups,\n // so we coalesce a manual tick.\n this._cdr.markForCheck()\n\n if (this._tickScheduled) {\n return\n }\n\n this._tickScheduled = true\n queueMicrotask(() => {\n this._tickScheduled = false\n this._appRef.tick()\n })\n }\n\n private syncValueFromDatepickerSelection(): void {\n if (!this.showInline()) {\n return\n }\n\n const datepickerInstance = this._airDatepickerInstance() as unknown as { selectedDates?: Date[] } | undefined\n const selectedDate = datepickerInstance?.selectedDates?.[0]\n if (!(selectedDate instanceof Date)) {\n return\n }\n\n const targetDate = this.showTimepicker() ? selectedDate : this.dateToUtc(selectedDate)\n this.onChangedHandler(targetDate.toISOString())\n this.propagateValueToControl()\n }\n\n onHideCalendar(): void {\n const valueInput: string = this._inputForDate()?.nativeElement.value\n let value: string | DateRange = valueInput\n if (this.rangeSelection()) {\n value = { dateFrom: '', dateTo: '' }\n const [dateFrom, dateTo] = valueInput.split(this.multipleDatesSeparator())\n value.dateFrom = dateFrom ?? ''\n value.dateTo = dateTo ?? ''\n value.dateFrom =\n !value.dateFrom || !this.checkDateMatch(value.dateFrom)\n ? null\n : this.setupInputStringToDate(value.dateFrom).toISOString()\n value.dateTo =\n !value.dateTo || !this.checkDateMatch(value.dateTo)\n ? null\n : this.setupInputStringToDate(value.dateTo).toISOString()\n this.onChangedHandler(value)\n } else if (this.checkDateMatch(value)) {\n this.onChangedHandler(this.setupInputStringToDate(value).toISOString())\n } else {\n this.onChangedHandler(null)\n }\n\n this.propagateValueToControl()\n\n if (this.showInline()) {\n return\n }\n\n // Only focus the input when the user actually interacted with the calendar.\n // Avoids infinite focus loop when tabbing between multiple datepickers.\n const activeElement = document.activeElement\n const calendarElement = this._airDatepickerInstance()?.$datepicker\n const inputElement = this._inputForDate()?.nativeElement\n const isCalendarFocused = calendarElement?.contains(activeElement)\n\n const shouldRefocus = this._shouldRefocusInputOnHide() || isCalendarFocused || this.isMouseInsideCalendar()\n this._shouldRefocusInputOnHide.set(false)\n\n if (shouldRefocus) {\n inputElement?.focus()\n }\n\n this.onBlurHandler()\n }\n\n formatDate(val: string | DateRange | null): string {\n if (val && typeof val === 'string') {\n return format(val, this.valueFormat())\n }\n if (val && typeof val === 'object') {\n if (!val.dateFrom && !val.dateTo) {\n return ''\n }\n let dateFromFormat = ''\n let dateToFormat = ''\n if (val.dateFrom) {\n dateFromFormat = format(val.dateFrom, this.valueFormat())\n }\n if (val.dateTo) {\n dateToFormat = format(val.dateTo, this.valueFormat())\n }\n return `${dateFromFormat}${this.multipleDatesSeparator()}${dateToFormat}`\n }\n return ''\n }\n\n openDatePicker() {\n const inputEl = this._inputForDate()?.nativeElement\n if (!inputEl || this._isDisabled()) {\n return\n }\n\n inputEl.focus()\n\n if (!this._airDatepickerInstance()) {\n this.setupCalendar()\n }\n\n this._airDatepickerInstance()?.show()\n }\n\n onInputKeydown(event: KeyboardEvent) {\n if (this._isDisabled()) {\n return\n }\n\n const datepickerInstance = this._airDatepickerInstance()\n if (event.key === 'Escape' && datepickerInstance?.visible) {\n event.preventDefault()\n datepickerInstance.hide()\n return\n }\n\n if (event.key === 'Enter' || event.key === 'ArrowDown') {\n event.preventDefault()\n this.openDatePicker()\n }\n }\n\n interceptInputInteraction($event: Event) {\n if (!this.isReadonly()) return\n\n $event.stopPropagation()\n $event.stopImmediatePropagation()\n $event.preventDefault()\n }\n\n getLocale(): AirDatepickerLocale {\n switch (this._activeLanguage()?.toLowerCase()) {\n case 'en':\n return (en as unknown as { default?: AirDatepickerLocale }).default ?? (en as unknown as AirDatepickerLocale)\n case 'it':\n return (it as unknown as { default?: AirDatepickerLocale }).default ?? (it as unknown as AirDatepickerLocale)\n case 'fr':\n return (fr as unknown as { default?: AirDatepickerLocale }).default ?? (fr as unknown as AirDatepickerLocale)\n default:\n return (en as unknown as { default?: AirDatepickerLocale }).default ?? (en as unknown as AirDatepickerLocale)\n }\n }\n\n onCancel(): void {\n this._inputForDate()?.nativeElement.blur()\n }\n\n private dateToUtc(date: Date): Date {\n // convert to UTC time removing the timezone\n return new Date(date.getTime() - date.getTimezoneOffset() * 60000)\n }\n\n private setCalendarPosition() {\n const windowInnerHeight = window.innerHeight\n const inputBoundingClientRect = this._inputForDate()?.nativeElement.getBoundingClientRect()\n const diff = windowInnerHeight - inputBoundingClientRect.height - inputBoundingClientRect.top - 239\n if (diff >= 0) {\n this.targetPosition.set('bottom left')\n } else {\n this.targetPosition.set('top left')\n }\n }\n\n private setupTimepicker() {\n const datepickerRoot = this._airDatepickerInstance()?.$datepicker as HTMLElement | undefined\n if (!datepickerRoot) {\n return\n }\n\n // AirDatepicker may re-render time inputs; use delegated listeners so we don't lose handlers.\n if (!datepickerRoot.dataset['quangTimepickerListeners']) {\n datepickerRoot.dataset['quangTimepickerListeners'] = 'true'\n\n datepickerRoot.addEventListener(\n 'input',\n () => {\n if (!this.showInline()) {\n return\n }\n // Let AirDatepicker update its internal selection first.\n setTimeout(() => this._ngZone.run(() => this.syncValueFromDatepickerSelection()), 0)\n },\n { capture: true }\n )\n }\n\n const timepickers = datepickerRoot.getElementsByClassName('air-datepicker-time')\n for (const timepicker of Array.from(timepickers)) {\n const inputs = timepicker.getElementsByTagName('input')\n for (const input of Array.from(inputs)) {\n input.setAttribute('type', 'number')\n input.setAttribute('maxLength', '2')\n input.className = 'form-control'\n input.onmouseup = (evt) => {\n evt.stopImmediatePropagation()\n }\n input.onblur = () => {\n if (!this.showInline() && this.isMouseOutsideCalendar()) {\n this._airDatepickerInstance()?.hide()\n }\n }\n }\n }\n }\n\n checkDateMatch(date: string): boolean {\n return isMatch(date, this.valueFormat()) || isMatch(date, this.valueFormat().replace('yyyy', 'yy'))\n }\n}\n","<div class=\"mb-3\">\n @if (componentLabel()) {\n <label\n [htmlFor]=\"componentId()\"\n class=\"form-label\"\n >\n {{ componentLabel() | transloco }}\n <span [hidden]=\"!_isRequired()\">*</span>\n </label>\n }\n <div\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n class=\"input-date-container\"\n >\n <input\n [attr.aria-hidden]=\"showInline() ? 'true' : null\"\n [attr.required]=\"getIsRequiredControl()\"\n [autocomplete]=\"'off'\"\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n [class.quang-date-inline-hidden]=\"showInline()\"\n [class.with-button-calendar]=\"!hasNoContent()\"\n [disabled]=\"_isDisabled()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [readOnly]=\"isReadonly()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"inputValueString()\"\n (blur)=\"onBlurHandler()\"\n (focus)=\"interceptInputInteraction($event)\"\n (input)=\"onChangeText($event)\"\n (keydown)=\"onInputKeydown($event)\"\n (mouseenter)=\"isMouseInsideCalendar.set(true)\"\n (mouseleave)=\"isMouseInsideCalendar.set(false)\"\n (search)=\"onCancel()\"\n #inputForDate\n class=\"form-control\"\n type=\"search\"\n />\n <button\n [attr.aria-hidden]=\"showInline() ? 'true' : null\"\n [attr.required]=\"getIsRequiredControl()\"\n [class.border-danger]=\"_showErrors()\"\n [class.border-success]=\"_showSuccess()\"\n [class.quang-date-inline-hidden]=\"showInline()\"\n [hidden]=\"hasNoContent() || _isDisabled()\"\n [ngClass]=\"buttonClass()\"\n (click)=\"_ngControl()?.disabled ? null : openDatePicker()\"\n #calendarButton\n aria-label=\"calendar-button\"\n class=\"btn btn-outline-secondary btn-outline-calendar\"\n type=\"button\"\n >\n <ng-content></ng-content>\n </button>\n </div>\n <div class=\"valid-feedback\">\n {{ successMessage() | transloco }}\n </div>\n <div class=\"invalid-feedback\">\n {{ _currentErrorMessage() | transloco: _currentErrorMessageExtraData() }}\n </div>\n @if (helpMessage()) {\n <small\n [hidden]=\"_showSuccess() || _showErrors()\"\n aria-live=\"assertive\"\n class=\"form-text text-muted\"\n >\n {{ helpMessage() | transloco }}\n </small>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -65,8 +65,8 @@ class QuangBaseComponent {
65
65
  registerOnChange(fn) {
66
66
  this.onChange = fn;
67
67
  }
68
- writeValue(val) {
69
- this._value.set(val);
68
+ writeValue(value) {
69
+ this._value.set(value);
70
70
  }
71
71
  registerOnTouched(fn) {
72
72
  this.onTouched = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"quang-components-shared.mjs","sources":["../../../projects/quang/components/shared/makeId.ts","../../../projects/quang/components/shared/quang-base-component.directive.ts","../../../projects/quang/components/shared/option-list/option-list.component.ts","../../../projects/quang/components/shared/option-list/option-list.component.html","../../../projects/quang/components/shared/quang-components-shared.ts"],"sourcesContent":["export const makeId = (length: number) => {\n let result = ''\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n const charactersLength = characters.length\n for (let i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength))\n }\n return result\n}\n","import { AfterViewInit, DestroyRef, Directive, Injector, computed, inject, input, output, signal } from '@angular/core'\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop'\nimport { ControlValueAccessor, FormControl, NgControl, Validators } from '@angular/forms'\n\nimport { Subscription } from 'rxjs'\n\nimport { ErrorData } from './ErrorData'\nimport { makeId } from './makeId'\n\n@Directive()\nexport abstract class QuangBaseComponent<T = any> implements ControlValueAccessor, AfterViewInit {\n componentId = input<string>(makeId(10))\n\n isReadonly = input<boolean>(false)\n\n isReadonly$ = toObservable(this.isReadonly)\n\n componentTabIndex = input<number>(0)\n\n componentClass = input<string | string[]>('')\n\n componentLabel = input<string>('')\n\n componentPlaceholder = input<string>('')\n\n errorMap = input<ErrorData[]>([])\n\n _errorMessagesByKey = computed(\n () => new Map((this.errorMap() ?? []).map((errorData) => [errorData.error, errorData.message]))\n )\n\n successMessage = input<string>('')\n\n helpMessage = input<string>('')\n\n formControl = input<FormControl>()\n\n componentBlur = output<void>()\n\n _value = signal<T | null>(null)\n\n _isRequired = signal<boolean>(false)\n\n _isDisabled = signal<boolean>(false)\n\n _isTouched = signal<boolean>(false)\n\n _isValid = signal<boolean>(false)\n\n _showSuccess = computed(() => this.successMessage() && this._isValid() && this._isTouched() && !this._isDisabled())\n\n _showErrors = computed(\n () => this.errorMap()?.length > 0 && !this._isValid() && this._isTouched() && !this._isDisabled()\n )\n\n _currentErrorMessage = signal<string>('')\n\n _currentErrorMessageExtraData = signal<Record<string, any>>({})\n\n _ngControl = signal<NgControl | null>(null)\n\n _injector = signal<Injector>(inject(Injector))\n\n _statusChange$?: Subscription\n\n _valueChange$?: Subscription\n\n _eventsChange$?: Subscription\n\n getIsRequiredControl = computed(() => {\n const control = this._ngControl()?.control\n if (!control) {\n return false\n }\n\n return control.hasValidator(Validators.required) || control.hasValidator(Validators.requiredTrue)\n })\n\n onChange?: (value: T) => void\n\n onTouched?: () => void\n\n destroyRef = inject(DestroyRef)\n\n constructor() {\n toObservable(this.formControl)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((form) => {\n if (form) {\n this.setupFormControl()\n }\n })\n }\n\n registerOnChange(fn: (value: T) => void): void {\n this.onChange = fn\n }\n\n writeValue(val: T): void {\n this._value.set(val)\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = () => {\n this._isTouched.set(true)\n fn()\n }\n }\n\n onChangedEventHandler($event: Event) {\n const inputElement = $event.target as HTMLInputElement\n this.onChangedHandler(inputElement.value as T)\n }\n\n onChangedHandler(value: T) {\n this._value.set(value)\n if (this.onChange) {\n this.onChange(value)\n }\n\n if (this.onTouched) {\n this.onTouched()\n }\n }\n\n onBlurHandler() {\n if (this.onTouched) {\n this.onTouched()\n }\n this.componentBlur.emit()\n }\n\n setupFormControl() {\n if (this._statusChange$) {\n this._statusChange$.unsubscribe()\n this._statusChange$ = undefined\n }\n\n if (this._valueChange$) {\n this._valueChange$.unsubscribe()\n this._valueChange$ = undefined\n }\n\n if (this._eventsChange$) {\n this._eventsChange$.unsubscribe()\n this._eventsChange$ = undefined\n }\n\n this._ngControl.set(this._injector().get(NgControl))\n\n const control = this._ngControl()?.control\n\n this._statusChange$ = control?.statusChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.checkFormErrors()\n })\n\n this._valueChange$ = control?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.checkFormErrors()\n })\n\n // `markAllAsTouched()` updates the control's `touched` state without emitting `statusChanges`.\n // Angular exposes an `events` stream that includes touched/pristine changes.\n this._eventsChange$ = (control as any)?.events?.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.checkFormErrors()\n })\n\n this._isTouched.set(!!(control?.touched || control?.dirty))\n this._isDisabled.set(this.isReadonly() || control?.disabled || false)\n this.checkFormErrors()\n }\n\n onChangeIsReadonly = this.isReadonly$.pipe(takeUntilDestroyed()).subscribe((isReadonly: boolean) => {\n this._isDisabled.set(isReadonly || this._ngControl()?.disabled || false)\n })\n\n setDisabledState(isDisabled: boolean) {\n this._isDisabled.set(isDisabled)\n }\n\n checkFormErrors() {\n const control = this._ngControl()?.control\n this._isValid.set(control?.valid ?? false)\n this._isTouched.set(!!(control?.touched || control?.dirty))\n\n this._isRequired.set(\n !!control && (control.hasValidator(Validators.required) || control.hasValidator(Validators.requiredTrue))\n )\n\n const validationErrors = control?.errors\n\n let errorName = ''\n let errorMessage = ''\n let errorData = true\n\n for (const [validationErrorName, validationErrorData] of Object.entries(validationErrors ?? {})) {\n const relatedErrorMessage = this._errorMessagesByKey().get(validationErrorName)\n if (relatedErrorMessage) {\n errorName = validationErrorName\n errorMessage = relatedErrorMessage\n errorData = validationErrorData\n }\n }\n\n this._currentErrorMessage.set(errorMessage)\n this._currentErrorMessageExtraData.set({ [errorName]: errorData })\n }\n\n ngAfterViewInit(): void {\n this.setupFormControl()\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common'\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n type TemplateRef,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core'\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop'\n\nimport { TranslocoPipe } from '@jsverse/transloco'\nimport { QUANG_LOGGING_BEHAVIOR } from 'quang'\nimport { Subscription, fromEvent } from 'rxjs'\n\nexport interface QuangSelectOptionTemplateContext {\n $implicit: SelectOption\n selected: boolean\n index: number\n}\n\nexport interface SelectOption {\n label: string\n value: string | number | null\n renderer?: TemplateRef<QuangSelectOptionTemplateContext>\n}\n\nexport enum OptionListParentType {\n SELECT = 'select',\n AUTOCOMPLETE = 'autocomplete',\n}\n\n@Component({\n selector: 'quang-option-list',\n imports: [NgStyle, NgClass, NgTemplateOutlet, TranslocoPipe],\n templateUrl: './option-list.component.html',\n styleUrl: './option-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class QuangOptionListComponent {\n logLevel = inject(QUANG_LOGGING_BEHAVIOR, { optional: true })\n\n selectionMode = input<'single' | 'multiple'>('single')\n\n optionListMaxHeight = input<string>('201px')\n\n selectOptions = input<SelectOption[]>([])\n\n selectButtonRef = input.required<HTMLButtonElement | HTMLInputElement | HTMLDivElement>()\n\n _value = input<any>()\n\n _isDisabled = input<boolean>()\n\n componentClass = input<string | string[]>('')\n\n componentLabel = input<string>('')\n\n componentTabIndex = input<number>(0)\n\n translateValue = input<boolean>(false)\n\n nullOption = input<boolean>(true)\n\n elementWidth = signal<string>('0px')\n\n elementTop = signal<string>('0px')\n\n elementBottom = signal<string>('0px')\n\n scrollBehaviorOnOpen = input<ScrollBehavior>('smooth')\n\n changedHandler = output<any>()\n\n blurHandler = output<any>()\n\n /** Emitted when user presses Escape - parent should close dropdown and return focus to trigger */\n escapePressed = output<void>()\n\n /** Emitted when user presses Tab - parent should handle focus transition */\n tabPressed = output<{ shiftKey: boolean }>()\n\n optionListContainer = viewChild<ElementRef<HTMLDivElement>>('optionListContainer')\n\n destroyRef = inject(DestroyRef)\n\n parentType = input.required<OptionListParentType>()\n\n parentID = input<string>('')\n\n searchString = signal<string>('')\n\n searchResetTimer: ReturnType<typeof setTimeout> | null = null\n\n selectButtonRef$ = toObservable(this.selectButtonRef)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.getOptionListWidth()\n this.getOptionListTop()\n this.getScrollParent(this.selectButtonRef())?.addEventListener('scroll', () => {\n this.getOptionListWidth()\n this.getOptionListTop()\n })\n })\n\n selectOptionsList = computed(() => {\n if (this.nullOption() && this.selectionMode() === 'single') {\n return [\n {\n label: '',\n value: null,\n },\n ...this.selectOptions(),\n ]\n }\n return [...this.selectOptions()]\n })\n\n onKeyDown: Subscription | null = null\n\n selectedElementIndex = computed<number>(\n () => this.selectOptionsList()?.findIndex((x) => x?.value === this._value()) ?? 0\n )\n\n /** Signal to track currently focused item index for aria-activedescendant */\n focusedItemIndex = signal<number>(-1)\n\n /**\n * Returns the ID of the currently focused item for aria-activedescendant\n */\n getActiveDescendantId(): string | null {\n const index = this.focusedItemIndex()\n if (index >= 0 && index < this.selectOptionsList().length) {\n return `item-${index}`\n }\n return null\n }\n\n optionList$ = effect(() => {\n const optionListContainer = this.optionListContainer()\n const parentType = this.parentType()\n\n // Focus the option list container when opened (only for SELECT)\n if (optionListContainer && parentType === OptionListParentType.SELECT) {\n optionListContainer?.nativeElement.focus()\n }\n\n const ul = optionListContainer?.nativeElement?.children[0] as HTMLUListElement | undefined\n const listItems = (ul?.children ?? []) as HTMLLIElement[]\n let currentIndex = this.selectedElementIndex()\n listItems?.[currentIndex]?.classList.add('selected')\n // Initialize focusedItemIndex with current selection\n this.focusedItemIndex.set(currentIndex)\n\n // Scroll to selected item when option list opens\n const listItem = listItems[currentIndex]\n if (listItem) {\n setTimeout(() => {\n listItem.scrollIntoView({ behavior: this.scrollBehaviorOnOpen(), block: 'nearest' })\n }, 0)\n }\n\n if (this.onKeyDown) {\n this.onKeyDown.unsubscribe()\n }\n\n this.onKeyDown = fromEvent(document, 'keydown', {\n capture: true,\n })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n switch ((event as KeyboardEvent).key) {\n case 'ArrowDown': {\n if (this.parentType() === OptionListParentType.AUTOCOMPLETE) optionListContainer?.nativeElement.focus()\n if (currentIndex !== this.selectedElementIndex()) listItems[currentIndex]?.classList.remove('selected')\n if (currentIndex === listItems.length - 1) {\n currentIndex = listItems.length - 1\n } else {\n currentIndex += 1\n }\n event.preventDefault()\n\n listItems[currentIndex]?.classList.add('selected')\n // Scroll item into view if not visible\n listItems[currentIndex]?.scrollIntoView({ behavior: 'smooth', block: 'nearest' })\n // Update focusedItemIndex for aria-activedescendant\n this.focusedItemIndex.set(currentIndex)\n break\n }\n case 'ArrowUp': {\n if (this.parentType() === OptionListParentType.AUTOCOMPLETE) optionListContainer?.nativeElement.focus()\n if (currentIndex !== this.selectedElementIndex()) listItems[currentIndex]?.classList.remove('selected')\n if (currentIndex !== 0) currentIndex -= 1\n event.preventDefault()\n\n listItems[currentIndex]?.classList.add('selected')\n // Scroll item into view if not visible\n listItems[currentIndex]?.scrollIntoView({ behavior: 'smooth', block: 'nearest' })\n // Update focusedItemIndex for aria-activedescendant\n this.focusedItemIndex.set(currentIndex)\n break\n }\n case 'Enter': {\n event.preventDefault()\n this.onSelectItem(this.selectOptionsList()[currentIndex])\n break\n }\n case 'Escape': {\n event.preventDefault()\n this.escapePressed.emit()\n break\n }\n case 'Tab': {\n // Only handle Tab when focus is on the option list itself\n // If focus is on the parent input, let the input's blur handler deal with it\n if (document.activeElement?.id === optionListContainer?.nativeElement?.id) {\n // Allow Tab to close dropdown and move focus naturally\n // Emit event so parent can handle focus transition\n this.tabPressed.emit({ shiftKey: (event as KeyboardEvent).shiftKey })\n }\n break\n }\n default: {\n if (\n ((event as KeyboardEvent)?.key?.length === 1 || (event as KeyboardEvent)?.key === 'Backspace') &&\n this.parentType() === OptionListParentType.AUTOCOMPLETE &&\n document.activeElement?.id === optionListContainer?.nativeElement?.id\n ) {\n currentIndex = 0\n document.getElementById(this.parentID())?.focus()\n document.getElementById(this.parentID())?.click()\n } else if (\n (event as KeyboardEvent)?.key?.length === 1 &&\n this.parentType() === OptionListParentType.SELECT\n ) {\n const key = (event as KeyboardEvent).key\n currentIndex = this.handleSearch(key, listItems, currentIndex)\n event.preventDefault()\n }\n break\n }\n }\n })\n })\n\n handleSearch(key: string, listItems: HTMLLIElement[], currentIndex: number): number {\n if (this.searchResetTimer) {\n clearTimeout(this.searchResetTimer)\n }\n\n this.searchString.update((current) => current + key)\n\n this.searchResetTimer = setTimeout(() => {\n this.searchString.set('')\n this.searchResetTimer = null\n }, 500)\n\n const searchStr = this.searchString().toLowerCase()\n const matchIndex = this.selectOptionsList().findIndex((option) => option.label.toLowerCase().includes(searchStr))\n\n if (matchIndex !== -1 && matchIndex !== currentIndex) {\n listItems[currentIndex]?.classList.remove('selected')\n listItems[matchIndex]?.classList.add('selected')\n listItems[matchIndex]?.scrollIntoView({ behavior: this.scrollBehaviorOnOpen() })\n return matchIndex\n }\n\n return currentIndex\n }\n\n @HostListener('window:scroll') changePosition() {\n this.getOptionListWidth()\n this.getOptionListTop()\n }\n\n isScrollable(ele: Element): boolean {\n if (!ele) return false\n\n let result = false\n\n try {\n const hasScrollableContent = ele.scrollHeight > ele.clientHeight\n\n const overflowYStyle = window.getComputedStyle(ele).overflowY\n const isOverflowHidden = overflowYStyle.includes('hidden')\n\n result = hasScrollableContent && !isOverflowHidden\n } catch (_error) {\n if (this.logLevel === 'verbose') console.error('captured error isScrollable', _error)\n }\n\n return result\n }\n\n getScrollParent(node: unknown): Element {\n if (!node || node === document.body || !(node instanceof Element)) return document.body\n return this.isScrollable(node) ? node : this.getScrollParent(node.parentNode)\n }\n\n onSelectItem(item: SelectOption | null): void {\n if (this.selectionMode() === 'single') {\n this.changedHandler.emit(item?.value ?? null)\n } else {\n let targetValue = this._value()\n if (!Array.isArray(targetValue) && targetValue) {\n targetValue = [targetValue]\n }\n const values: string[] | number[] | null = targetValue as string[] | number[] | null\n if (values) {\n if (values.some((x) => x === item?.value)) {\n this.changedHandler.emit(values.filter((x) => x !== item?.value) as string[] | number[])\n } else if (item) {\n this.changedHandler.emit([...values, item.value] as string[] | number[])\n } else {\n this.changedHandler.emit([...values] as string[] | number[])\n }\n } else if (item?.value) {\n this.changedHandler.emit([item.value] as string[] | number[])\n } else {\n this.changedHandler.emit(null)\n }\n }\n this.getOptionListTop()\n }\n\n getSelected(item: SelectOption): boolean {\n if (this.selectionMode() === 'single' || !Array.isArray(this._value())) {\n return this._value() === item.value\n }\n return this._value()?.some((x: number | string | null) => x === item?.value)\n }\n\n onBlurHandler(e: Event): void {\n this.blurHandler.emit(e)\n }\n\n getOptionListWidth() {\n this.elementWidth.set(`${this.selectButtonRef()?.offsetWidth}px`)\n }\n\n getOptionListTop() {\n const nativeElement = this.optionListContainer()?.nativeElement\n const diff =\n window.innerHeight -\n (nativeElement?.getBoundingClientRect()?.height ?? 0) -\n (this.selectButtonRef()?.getBoundingClientRect()?.top ?? 0) -\n (this.selectButtonRef()?.getBoundingClientRect()?.height ?? 0)\n let topValue = 'unset'\n let bottomValue = 'unset'\n const isTop = diff >= 0\n if (isTop) {\n topValue = `${(this.selectButtonRef()?.getBoundingClientRect()?.top ?? 0) + (this.selectButtonRef()?.getBoundingClientRect()?.height ?? 0)}px`\n } else {\n bottomValue = `${window.innerHeight - (this.selectButtonRef()?.getBoundingClientRect()?.bottom ?? 0) + (this.selectButtonRef()?.getBoundingClientRect()?.height ?? 0)}px`\n }\n nativeElement?.classList.toggle('option-list-top', !isTop)\n this.elementTop.set(topValue)\n this.elementBottom.set(bottomValue)\n setTimeout(() => {\n this.getOptionListTop()\n })\n }\n}\n","<div\n [attr.aria-activedescendant]=\"getActiveDescendantId()\"\n [attr.aria-label]=\"componentLabel()\"\n [ngStyle]=\"{\n 'max-height': optionListMaxHeight(),\n '--option-list-width': elementWidth(),\n '--option-list-top': elementTop(),\n '--option-list-bottom': elementBottom(),\n }\"\n (blur)=\"onBlurHandler($event)\"\n #optionListContainer\n aria-orientation=\"vertical\"\n class=\"option-list\"\n id=\"optionList\"\n role=\"listbox\"\n tabindex=\"0\"\n>\n <ul role=\"presentation\">\n @for (\n item of selectOptionsList();\n track (item.value ?? '') + (item.label ?? '');\n let i = $index;\n let last = $last\n ) {\n <li\n [attr.aria-selected]=\"getSelected(item)\"\n [class.m-0]=\"last\"\n [class.selected]=\"selectionMode() === 'single' ? getSelected(item) : null\"\n [id]=\"'item-' + i\"\n (mousedown)=\"$event.stopImmediatePropagation(); onSelectItem(item)\"\n class=\"item\"\n role=\"option\"\n >\n <input\n [checked]=\"getSelected(item)\"\n [class.d-none]=\"selectionMode() === 'single' || !item?.value\"\n [disabled]=\"true\"\n [id]=\"i + '-' + item.value + '-checkbox'\"\n [name]=\"i + '-' + item.value + '-checkbox'\"\n [ngClass]=\"componentClass()\"\n [value]=\"getSelected(item)\"\n (blur)=\"onBlurHandler($event)\"\n #inputCheckbox\n aria-hidden=\"true\"\n class=\"form-check-input opacity-100\"\n tabindex=\"-1\"\n type=\"checkbox\"\n />\n <label\n [class.ms-3]=\"selectionMode() === 'multiple' && item?.value\"\n [for]=\"i + '-' + item.value + '-checkbox'\"\n class=\"form-check-label checkbox-label w-100 opacity-100\"\n >\n @if (!item.renderer) {\n {{ translateValue() ? (item.label | transloco) : item.label }}\n }\n <ng-container\n [ngTemplateOutlet]=\"item.renderer ?? null\"\n [ngTemplateOutletContext]=\"{ $implicit: item, selected: getSelected(item), index: i }\"\n ></ng-container>\n </label>\n </li>\n }\n </ul>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;AAAa,MAAA,MAAM,GAAG,CAAC,MAAc,KAAI;IACvC,IAAI,MAAM,GAAG,EAAE;IACf,MAAM,UAAU,GAAG,gEAAgE;AACnF,IAAA,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM;AAC1C,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;AAC/B,QAAA,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,gBAAgB,CAAC,CAAC;;AAE3E,IAAA,OAAO,MAAM;AACf;;MCEsB,kBAAkB,CAAA;AA0EtC,IAAA,WAAA,GAAA;QAzEA,IAAW,CAAA,WAAA,GAAG,KAAK,CAAS,MAAM,CAAC,EAAE,CAAC,CAAC;AAEvC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAU,KAAK,CAAC;AAElC,QAAA,IAAA,CAAA,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;AAE3C,QAAA,IAAA,CAAA,iBAAiB,GAAG,KAAK,CAAS,CAAC,CAAC;AAEpC,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAoB,EAAE,CAAC;AAE7C,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAS,EAAE,CAAC;AAElC,QAAA,IAAA,CAAA,oBAAoB,GAAG,KAAK,CAAS,EAAE,CAAC;AAExC,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAc,EAAE,CAAC;AAEjC,QAAA,IAAA,CAAA,mBAAmB,GAAG,QAAQ,CAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAChG;AAED,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAS,EAAE,CAAC;AAElC,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAS,EAAE,CAAC;QAE/B,IAAW,CAAA,WAAA,GAAG,KAAK,EAAe;QAElC,IAAa,CAAA,aAAA,GAAG,MAAM,EAAQ;AAE9B,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAW,IAAI,CAAC;AAE/B,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAU,KAAK,CAAC;AAEpC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAU,KAAK,CAAC;AAEpC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAU,KAAK,CAAC;AAEnC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAU,KAAK,CAAC;QAEjC,IAAY,CAAA,YAAA,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAEnH,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CACpB,MAAM,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAClG;AAED,QAAA,IAAA,CAAA,oBAAoB,GAAG,MAAM,CAAS,EAAE,CAAC;AAEzC,QAAA,IAAA,CAAA,6BAA6B,GAAG,MAAM,CAAsB,EAAE,CAAC;AAE/D,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAmB,IAAI,CAAC;QAE3C,IAAS,CAAA,SAAA,GAAG,MAAM,CAAW,MAAM,CAAC,QAAQ,CAAC,CAAC;AAQ9C,QAAA,IAAA,CAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAK;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO;YAC1C,IAAI,CAAC,OAAO,EAAE;AACZ,gBAAA,OAAO,KAAK;;AAGd,YAAA,OAAO,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC;AACnG,SAAC,CAAC;AAMF,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAyF/B,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,UAAmB,KAAI;AACjG,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,QAAQ,IAAI,KAAK,CAAC;AAC1E,SAAC,CAAC;AAxFA,QAAA,YAAY,CAAC,IAAI,CAAC,WAAW;AAC1B,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,CAAC,IAAI,KAAI;YAClB,IAAI,IAAI,EAAE;gBACR,IAAI,CAAC,gBAAgB,EAAE;;AAE3B,SAAC,CAAC;;AAGN,IAAA,gBAAgB,CAAC,EAAsB,EAAA;AACrC,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;;AAGpB,IAAA,UAAU,CAAC,GAAM,EAAA;AACf,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;;AAGtB,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,MAAK;AACpB,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,YAAA,EAAE,EAAE;AACN,SAAC;;AAGH,IAAA,qBAAqB,CAAC,MAAa,EAAA;AACjC,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,MAA0B;AACtD,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,KAAU,CAAC;;AAGhD,IAAA,gBAAgB,CAAC,KAAQ,EAAA;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;;AAGtB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,SAAS,EAAE;;;IAIpB,aAAa,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,SAAS,EAAE;;AAElB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;;IAG3B,gBAAgB,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE;AACjC,YAAA,IAAI,CAAC,cAAc,GAAG,SAAS;;AAGjC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE;AAChC,YAAA,IAAI,CAAC,aAAa,GAAG,SAAS;;AAGhC,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE;AACjC,YAAA,IAAI,CAAC,cAAc,GAAG,SAAS;;AAGjC,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO;QAE1C,IAAI,CAAC,cAAc,GAAG,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;YACpG,IAAI,CAAC,eAAe,EAAE;AACxB,SAAC,CAAC;QAEF,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;YAClG,IAAI,CAAC,eAAe,EAAE;AACxB,SAAC,CAAC;;;QAIF,IAAI,CAAC,cAAc,GAAI,OAAe,EAAE,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;YACvG,IAAI,CAAC,eAAe,EAAE;AACxB,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,KAAK,CAAC,CAAC;AAC3D,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,OAAO,EAAE,QAAQ,IAAI,KAAK,CAAC;QACrE,IAAI,CAAC,eAAe,EAAE;;AAOxB,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;;IAGlC,eAAe,GAAA;QACb,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO;QAC1C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,KAAK,CAAC;AAC1C,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,KAAK,CAAC,CAAC;AAE3D,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAClB,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAC1G;AAED,QAAA,MAAM,gBAAgB,GAAG,OAAO,EAAE,MAAM;QAExC,IAAI,SAAS,GAAG,EAAE;QAClB,IAAI,YAAY,GAAG,EAAE;QACrB,IAAI,SAAS,GAAG,IAAI;AAEpB,QAAA,KAAK,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC,EAAE;YAC/F,MAAM,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC,mBAAmB,CAAC;YAC/E,IAAI,mBAAmB,EAAE;gBACvB,SAAS,GAAG,mBAAmB;gBAC/B,YAAY,GAAG,mBAAmB;gBAClC,SAAS,GAAG,mBAAmB;;;AAInC,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,YAAY,CAAC;AAC3C,QAAA,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;;IAGpE,eAAe,GAAA;QACb,IAAI,CAAC,gBAAgB,EAAE;;+GAtML,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBADvC;;;ACTD;IAmCY;AAAZ,CAAA,UAAY,oBAAoB,EAAA;AAC9B,IAAA,oBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,oBAAA,CAAA,cAAA,CAAA,GAAA,cAA6B;AAC/B,CAAC,EAHW,oBAAoB,KAApB,oBAAoB,GAG/B,EAAA,CAAA,CAAA;MASY,wBAAwB,CAAA;AAPrC,IAAA,WAAA,GAAA;QAQE,IAAQ,CAAA,QAAA,GAAG,MAAM,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAE7D,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAwB,QAAQ,CAAC;AAEtD,QAAA,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAAS,OAAO,CAAC;AAE5C,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAiB,EAAE,CAAC;AAEzC,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,QAAQ,EAAyD;QAEzF,IAAM,CAAA,MAAA,GAAG,KAAK,EAAO;QAErB,IAAW,CAAA,WAAA,GAAG,KAAK,EAAW;AAE9B,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAoB,EAAE,CAAC;AAE7C,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAS,EAAE,CAAC;AAElC,QAAA,IAAA,CAAA,iBAAiB,GAAG,KAAK,CAAS,CAAC,CAAC;AAEpC,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAU,KAAK,CAAC;AAEtC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAU,IAAI,CAAC;AAEjC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAS,KAAK,CAAC;AAEpC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAS,KAAK,CAAC;AAElC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAS,KAAK,CAAC;AAErC,QAAA,IAAA,CAAA,oBAAoB,GAAG,KAAK,CAAiB,QAAQ,CAAC;QAEtD,IAAc,CAAA,cAAA,GAAG,MAAM,EAAO;QAE9B,IAAW,CAAA,WAAA,GAAG,MAAM,EAAO;;QAG3B,IAAa,CAAA,aAAA,GAAG,MAAM,EAAQ;;QAG9B,IAAU,CAAA,UAAA,GAAG,MAAM,EAAyB;AAE5C,QAAA,IAAA,CAAA,mBAAmB,GAAG,SAAS,CAA6B,qBAAqB,CAAC;AAElF,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAE/B,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,QAAQ,EAAwB;AAEnD,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,CAAC;AAE5B,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAS,EAAE,CAAC;QAEjC,IAAgB,CAAA,gBAAA,GAAyC,IAAI;AAE7D,QAAA,IAAA,CAAA,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,eAAe;AACjD,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aACxC,SAAS,CAAC,MAAK;YACd,IAAI,CAAC,kBAAkB,EAAE;YACzB,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,EAAE,gBAAgB,CAAC,QAAQ,EAAE,MAAK;gBAC5E,IAAI,CAAC,kBAAkB,EAAE;gBACzB,IAAI,CAAC,gBAAgB,EAAE;AACzB,aAAC,CAAC;AACJ,SAAC,CAAC;AAEJ,QAAA,IAAA,CAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;AAChC,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,QAAQ,EAAE;gBAC1D,OAAO;AACL,oBAAA;AACE,wBAAA,KAAK,EAAE,EAAE;AACT,wBAAA,KAAK,EAAE,IAAI;AACZ,qBAAA;oBACD,GAAG,IAAI,CAAC,aAAa,EAAE;iBACxB;;AAEH,YAAA,OAAO,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;AAClC,SAAC,CAAC;QAEF,IAAS,CAAA,SAAA,GAAwB,IAAI;AAErC,QAAA,IAAA,CAAA,oBAAoB,GAAG,QAAQ,CAC7B,MAAM,IAAI,CAAC,iBAAiB,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAClF;;AAGD,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAS,CAAC,CAAC,CAAC;AAarC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,MAAK;AACxB,YAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,EAAE;AACtD,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;;YAGpC,IAAI,mBAAmB,IAAI,UAAU,KAAK,oBAAoB,CAAC,MAAM,EAAE;AACrE,gBAAA,mBAAmB,EAAE,aAAa,CAAC,KAAK,EAAE;;YAG5C,MAAM,EAAE,GAAG,mBAAmB,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAiC;YAC1F,MAAM,SAAS,IAAI,EAAE,EAAE,QAAQ,IAAI,EAAE,CAAoB;AACzD,YAAA,IAAI,YAAY,GAAG,IAAI,CAAC,oBAAoB,EAAE;YAC9C,SAAS,GAAG,YAAY,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;;AAEpD,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC;;AAGvC,YAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,CAAC;YACxC,IAAI,QAAQ,EAAE;gBACZ,UAAU,CAAC,MAAK;AACd,oBAAA,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;iBACrF,EAAE,CAAC,CAAC;;AAGP,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,gBAAA,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;;YAG9B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE;AAC9C,gBAAA,OAAO,EAAE,IAAI;aACd;AACE,iBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,iBAAA,SAAS,CAAC,CAAC,KAAK,KAAI;AACnB,gBAAA,QAAS,KAAuB,CAAC,GAAG;oBAClC,KAAK,WAAW,EAAE;AAChB,wBAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,oBAAoB,CAAC,YAAY;AAAE,4BAAA,mBAAmB,EAAE,aAAa,CAAC,KAAK,EAAE;AACvG,wBAAA,IAAI,YAAY,KAAK,IAAI,CAAC,oBAAoB,EAAE;4BAAE,SAAS,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;wBACvG,IAAI,YAAY,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACzC,4BAAA,YAAY,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC;;6BAC9B;4BACL,YAAY,IAAI,CAAC;;wBAEnB,KAAK,CAAC,cAAc,EAAE;wBAEtB,SAAS,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;;AAElD,wBAAA,SAAS,CAAC,YAAY,CAAC,EAAE,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;;AAEjF,wBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC;wBACvC;;oBAEF,KAAK,SAAS,EAAE;AACd,wBAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,oBAAoB,CAAC,YAAY;AAAE,4BAAA,mBAAmB,EAAE,aAAa,CAAC,KAAK,EAAE;AACvG,wBAAA,IAAI,YAAY,KAAK,IAAI,CAAC,oBAAoB,EAAE;4BAAE,SAAS,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;wBACvG,IAAI,YAAY,KAAK,CAAC;4BAAE,YAAY,IAAI,CAAC;wBACzC,KAAK,CAAC,cAAc,EAAE;wBAEtB,SAAS,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;;AAElD,wBAAA,SAAS,CAAC,YAAY,CAAC,EAAE,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;;AAEjF,wBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC;wBACvC;;oBAEF,KAAK,OAAO,EAAE;wBACZ,KAAK,CAAC,cAAc,EAAE;wBACtB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,YAAY,CAAC,CAAC;wBACzD;;oBAEF,KAAK,QAAQ,EAAE;wBACb,KAAK,CAAC,cAAc,EAAE;AACtB,wBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;wBACzB;;oBAEF,KAAK,KAAK,EAAE;;;AAGV,wBAAA,IAAI,QAAQ,CAAC,aAAa,EAAE,EAAE,KAAK,mBAAmB,EAAE,aAAa,EAAE,EAAE,EAAE;;;AAGzE,4BAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAG,KAAuB,CAAC,QAAQ,EAAE,CAAC;;wBAEvE;;oBAEF,SAAS;AACP,wBAAA,IACE,CAAE,KAAuB,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC,IAAK,KAAuB,EAAE,GAAG,KAAK,WAAW;AAC7F,4BAAA,IAAI,CAAC,UAAU,EAAE,KAAK,oBAAoB,CAAC,YAAY;4BACvD,QAAQ,CAAC,aAAa,EAAE,EAAE,KAAK,mBAAmB,EAAE,aAAa,EAAE,EAAE,EACrE;4BACA,YAAY,GAAG,CAAC;4BAChB,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE;4BACjD,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE;;AAC5C,6BAAA,IACJ,KAAuB,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;4BAC3C,IAAI,CAAC,UAAU,EAAE,KAAK,oBAAoB,CAAC,MAAM,EACjD;AACA,4BAAA,MAAM,GAAG,GAAI,KAAuB,CAAC,GAAG;4BACxC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC;4BAC9D,KAAK,CAAC,cAAc,EAAE;;wBAExB;;;AAGN,aAAC,CAAC;AACN,SAAC,CAAC;AAuHH;AA3OC;;AAEG;IACH,qBAAqB,GAAA;AACnB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACrC,QAAA,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE;YACzD,OAAO,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAE;;AAExB,QAAA,OAAO,IAAI;;AA8Gb,IAAA,YAAY,CAAC,GAAW,EAAE,SAA0B,EAAE,YAAoB,EAAA;AACxE,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC;;AAGrC,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,OAAO,GAAG,GAAG,CAAC;AAEpD,QAAA,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,MAAK;AACtC,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;AACzB,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;SAC7B,EAAE,GAAG,CAAC;QAEP,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,WAAW,EAAE;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAEjH,IAAI,UAAU,KAAK,CAAC,CAAC,IAAI,UAAU,KAAK,YAAY,EAAE;YACpD,SAAS,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;YACrD,SAAS,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;AAChD,YAAA,SAAS,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;AAChF,YAAA,OAAO,UAAU;;AAGnB,QAAA,OAAO,YAAY;;IAGU,cAAc,GAAA;QAC3C,IAAI,CAAC,kBAAkB,EAAE;QACzB,IAAI,CAAC,gBAAgB,EAAE;;AAGzB,IAAA,YAAY,CAAC,GAAY,EAAA;AACvB,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,KAAK;QAEtB,IAAI,MAAM,GAAG,KAAK;AAElB,QAAA,IAAI;YACF,MAAM,oBAAoB,GAAG,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY;YAEhE,MAAM,cAAc,GAAG,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,SAAS;YAC7D,MAAM,gBAAgB,GAAG,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAE1D,YAAA,MAAM,GAAG,oBAAoB,IAAI,CAAC,gBAAgB;;QAClD,OAAO,MAAM,EAAE;AACf,YAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;AAAE,gBAAA,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,MAAM,CAAC;;AAGvF,QAAA,OAAO,MAAM;;AAGf,IAAA,eAAe,CAAC,IAAa,EAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,QAAQ,CAAC,IAAI,IAAI,EAAE,IAAI,YAAY,OAAO,CAAC;YAAE,OAAO,QAAQ,CAAC,IAAI;QACvF,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC;;AAG/E,IAAA,YAAY,CAAC,IAAyB,EAAA;AACpC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,QAAQ,EAAE;YACrC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC;;aACxC;AACL,YAAA,IAAI,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE;YAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,WAAW,EAAE;AAC9C,gBAAA,WAAW,GAAG,CAAC,WAAW,CAAC;;YAE7B,MAAM,MAAM,GAA+B,WAAyC;YACpF,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,KAAK,CAAC,EAAE;oBACzC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,KAAK,CAAwB,CAAC;;qBACnF,IAAI,IAAI,EAAE;AACf,oBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,KAAK,CAAwB,CAAC;;qBACnE;oBACL,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAwB,CAAC;;;AAEzD,iBAAA,IAAI,IAAI,EAAE,KAAK,EAAE;gBACtB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAwB,CAAC;;iBACxD;AACL,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;;;QAGlC,IAAI,CAAC,gBAAgB,EAAE;;AAGzB,IAAA,WAAW,CAAC,IAAkB,EAAA;AAC5B,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;YACtE,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,KAAK;;AAErC,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC,CAAyB,KAAK,CAAC,KAAK,IAAI,EAAE,KAAK,CAAC;;AAG9E,IAAA,aAAa,CAAC,CAAQ,EAAA;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;;IAG1B,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAG,EAAA,IAAI,CAAC,eAAe,EAAE,EAAE,WAAW,CAAA,EAAA,CAAI,CAAC;;IAGnE,gBAAgB,GAAA;QACd,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,EAAE,EAAE,aAAa;AAC/D,QAAA,MAAM,IAAI,GACR,MAAM,CAAC,WAAW;aACjB,aAAa,EAAE,qBAAqB,EAAE,EAAE,MAAM,IAAI,CAAC,CAAC;aACpD,IAAI,CAAC,eAAe,EAAE,EAAE,qBAAqB,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;AAC3D,aAAC,IAAI,CAAC,eAAe,EAAE,EAAE,qBAAqB,EAAE,EAAE,MAAM,IAAI,CAAC,CAAC;QAChE,IAAI,QAAQ,GAAG,OAAO;QACtB,IAAI,WAAW,GAAG,OAAO;AACzB,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC;QACvB,IAAI,KAAK,EAAE;AACT,YAAA,QAAQ,GAAG,CAAA,EAAG,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,qBAAqB,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,eAAe,EAAE,EAAE,qBAAqB,EAAE,EAAE,MAAM,IAAI,CAAC,CAAC,IAAI;;aACzI;AACL,YAAA,WAAW,GAAG,CAAA,EAAG,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,qBAAqB,EAAE,EAAE,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,qBAAqB,EAAE,EAAE,MAAM,IAAI,CAAC,CAAC,IAAI;;QAE3K,aAAa,EAAE,SAAS,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC;AAC1D,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC7B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC;QACnC,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,gBAAgB,EAAE;AACzB,SAAC,CAAC;;+GAjUO,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/CrC,2qEAiEA,EDvBY,MAAA,EAAA,CAAA,k5CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,OAAO,2EAAE,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKhD,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAPpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EACpB,OAAA,EAAA,CAAC,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,aAAa,CAAC,EAG3C,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,2qEAAA,EAAA,MAAA,EAAA,CAAA,k5CAAA,CAAA,EAAA;8BAyOhB,cAAc,EAAA,CAAA;sBAA5C,YAAY;uBAAC,eAAe;;;AEtR/B;;AAEG;;;;"}
1
+ {"version":3,"file":"quang-components-shared.mjs","sources":["../../../projects/quang/components/shared/makeId.ts","../../../projects/quang/components/shared/quang-base-component.directive.ts","../../../projects/quang/components/shared/option-list/option-list.component.ts","../../../projects/quang/components/shared/option-list/option-list.component.html","../../../projects/quang/components/shared/quang-components-shared.ts"],"sourcesContent":["export const makeId = (length: number) => {\n let result = ''\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n const charactersLength = characters.length\n for (let i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength))\n }\n return result\n}\n","import { AfterViewInit, DestroyRef, Directive, Injector, computed, inject, input, output, signal } from '@angular/core'\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop'\nimport { ControlValueAccessor, FormControl, NgControl, Validators } from '@angular/forms'\n\nimport { Subscription } from 'rxjs'\n\nimport { ErrorData } from './ErrorData'\nimport { makeId } from './makeId'\n\n@Directive()\nexport abstract class QuangBaseComponent<T = any> implements ControlValueAccessor, AfterViewInit {\n componentId = input<string>(makeId(10))\n\n isReadonly = input<boolean>(false)\n\n isReadonly$ = toObservable(this.isReadonly)\n\n componentTabIndex = input<number>(0)\n\n componentClass = input<string | string[]>('')\n\n componentLabel = input<string>('')\n\n componentPlaceholder = input<string>('')\n\n errorMap = input<ErrorData[]>([])\n\n _errorMessagesByKey = computed(\n () => new Map((this.errorMap() ?? []).map((errorData) => [errorData.error, errorData.message]))\n )\n\n successMessage = input<string>('')\n\n helpMessage = input<string>('')\n\n formControl = input<FormControl>()\n\n componentBlur = output<void>()\n\n _value = signal<T | null>(null)\n\n _isRequired = signal<boolean>(false)\n\n _isDisabled = signal<boolean>(false)\n\n _isTouched = signal<boolean>(false)\n\n _isValid = signal<boolean>(false)\n\n _showSuccess = computed(() => this.successMessage() && this._isValid() && this._isTouched() && !this._isDisabled())\n\n _showErrors = computed(\n () => this.errorMap()?.length > 0 && !this._isValid() && this._isTouched() && !this._isDisabled()\n )\n\n _currentErrorMessage = signal<string>('')\n\n _currentErrorMessageExtraData = signal<Record<string, any>>({})\n\n _ngControl = signal<NgControl | null>(null)\n\n _injector = signal<Injector>(inject(Injector))\n\n _statusChange$?: Subscription\n\n _valueChange$?: Subscription\n\n _eventsChange$?: Subscription\n\n getIsRequiredControl = computed(() => {\n const control = this._ngControl()?.control\n if (!control) {\n return false\n }\n\n return control.hasValidator(Validators.required) || control.hasValidator(Validators.requiredTrue)\n })\n\n onChange?: (value: T) => void\n\n onTouched?: () => void\n\n destroyRef = inject(DestroyRef)\n\n constructor() {\n toObservable(this.formControl)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((form) => {\n if (form) {\n this.setupFormControl()\n }\n })\n }\n\n registerOnChange(fn: (value: T) => void): void {\n this.onChange = fn\n }\n\n writeValue(value: T): void {\n this._value.set(value)\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = () => {\n this._isTouched.set(true)\n fn()\n }\n }\n\n onChangedEventHandler($event: Event) {\n const inputElement = $event.target as HTMLInputElement\n this.onChangedHandler(inputElement.value as T)\n }\n\n onChangedHandler(value: T) {\n this._value.set(value)\n if (this.onChange) {\n this.onChange(value)\n }\n\n if (this.onTouched) {\n this.onTouched()\n }\n }\n\n onBlurHandler() {\n if (this.onTouched) {\n this.onTouched()\n }\n this.componentBlur.emit()\n }\n\n setupFormControl() {\n if (this._statusChange$) {\n this._statusChange$.unsubscribe()\n this._statusChange$ = undefined\n }\n\n if (this._valueChange$) {\n this._valueChange$.unsubscribe()\n this._valueChange$ = undefined\n }\n\n if (this._eventsChange$) {\n this._eventsChange$.unsubscribe()\n this._eventsChange$ = undefined\n }\n\n this._ngControl.set(this._injector().get(NgControl))\n\n const control = this._ngControl()?.control\n\n this._statusChange$ = control?.statusChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.checkFormErrors()\n })\n\n this._valueChange$ = control?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.checkFormErrors()\n })\n\n // `markAllAsTouched()` updates the control's `touched` state without emitting `statusChanges`.\n // Angular exposes an `events` stream that includes touched/pristine changes.\n this._eventsChange$ = (control as any)?.events?.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.checkFormErrors()\n })\n\n this._isTouched.set(!!(control?.touched || control?.dirty))\n this._isDisabled.set(this.isReadonly() || control?.disabled || false)\n this.checkFormErrors()\n }\n\n onChangeIsReadonly = this.isReadonly$.pipe(takeUntilDestroyed()).subscribe((isReadonly: boolean) => {\n this._isDisabled.set(isReadonly || this._ngControl()?.disabled || false)\n })\n\n setDisabledState(isDisabled: boolean) {\n this._isDisabled.set(isDisabled)\n }\n\n checkFormErrors() {\n const control = this._ngControl()?.control\n this._isValid.set(control?.valid ?? false)\n this._isTouched.set(!!(control?.touched || control?.dirty))\n\n this._isRequired.set(\n !!control && (control.hasValidator(Validators.required) || control.hasValidator(Validators.requiredTrue))\n )\n\n const validationErrors = control?.errors\n\n let errorName = ''\n let errorMessage = ''\n let errorData = true\n\n for (const [validationErrorName, validationErrorData] of Object.entries(validationErrors ?? {})) {\n const relatedErrorMessage = this._errorMessagesByKey().get(validationErrorName)\n if (relatedErrorMessage) {\n errorName = validationErrorName\n errorMessage = relatedErrorMessage\n errorData = validationErrorData\n }\n }\n\n this._currentErrorMessage.set(errorMessage)\n this._currentErrorMessageExtraData.set({ [errorName]: errorData })\n }\n\n ngAfterViewInit(): void {\n this.setupFormControl()\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common'\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n type TemplateRef,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core'\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop'\n\nimport { TranslocoPipe } from '@jsverse/transloco'\nimport { QUANG_LOGGING_BEHAVIOR } from 'quang'\nimport { Subscription, fromEvent } from 'rxjs'\n\nexport interface QuangSelectOptionTemplateContext {\n $implicit: SelectOption\n selected: boolean\n index: number\n}\n\nexport interface SelectOption {\n label: string\n value: string | number | null\n renderer?: TemplateRef<QuangSelectOptionTemplateContext>\n}\n\nexport enum OptionListParentType {\n SELECT = 'select',\n AUTOCOMPLETE = 'autocomplete',\n}\n\n@Component({\n selector: 'quang-option-list',\n imports: [NgStyle, NgClass, NgTemplateOutlet, TranslocoPipe],\n templateUrl: './option-list.component.html',\n styleUrl: './option-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class QuangOptionListComponent {\n logLevel = inject(QUANG_LOGGING_BEHAVIOR, { optional: true })\n\n selectionMode = input<'single' | 'multiple'>('single')\n\n optionListMaxHeight = input<string>('201px')\n\n selectOptions = input<SelectOption[]>([])\n\n selectButtonRef = input.required<HTMLButtonElement | HTMLInputElement | HTMLDivElement>()\n\n _value = input<any>()\n\n _isDisabled = input<boolean>()\n\n componentClass = input<string | string[]>('')\n\n componentLabel = input<string>('')\n\n componentTabIndex = input<number>(0)\n\n translateValue = input<boolean>(false)\n\n nullOption = input<boolean>(true)\n\n elementWidth = signal<string>('0px')\n\n elementTop = signal<string>('0px')\n\n elementBottom = signal<string>('0px')\n\n scrollBehaviorOnOpen = input<ScrollBehavior>('smooth')\n\n changedHandler = output<any>()\n\n blurHandler = output<any>()\n\n /** Emitted when user presses Escape - parent should close dropdown and return focus to trigger */\n escapePressed = output<void>()\n\n /** Emitted when user presses Tab - parent should handle focus transition */\n tabPressed = output<{ shiftKey: boolean }>()\n\n optionListContainer = viewChild<ElementRef<HTMLDivElement>>('optionListContainer')\n\n destroyRef = inject(DestroyRef)\n\n parentType = input.required<OptionListParentType>()\n\n parentID = input<string>('')\n\n searchString = signal<string>('')\n\n searchResetTimer: ReturnType<typeof setTimeout> | null = null\n\n selectButtonRef$ = toObservable(this.selectButtonRef)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.getOptionListWidth()\n this.getOptionListTop()\n this.getScrollParent(this.selectButtonRef())?.addEventListener('scroll', () => {\n this.getOptionListWidth()\n this.getOptionListTop()\n })\n })\n\n selectOptionsList = computed(() => {\n if (this.nullOption() && this.selectionMode() === 'single') {\n return [\n {\n label: '',\n value: null,\n },\n ...this.selectOptions(),\n ]\n }\n return [...this.selectOptions()]\n })\n\n onKeyDown: Subscription | null = null\n\n selectedElementIndex = computed<number>(\n () => this.selectOptionsList()?.findIndex((x) => x?.value === this._value()) ?? 0\n )\n\n /** Signal to track currently focused item index for aria-activedescendant */\n focusedItemIndex = signal<number>(-1)\n\n /**\n * Returns the ID of the currently focused item for aria-activedescendant\n */\n getActiveDescendantId(): string | null {\n const index = this.focusedItemIndex()\n if (index >= 0 && index < this.selectOptionsList().length) {\n return `item-${index}`\n }\n return null\n }\n\n optionList$ = effect(() => {\n const optionListContainer = this.optionListContainer()\n const parentType = this.parentType()\n\n // Focus the option list container when opened (only for SELECT)\n if (optionListContainer && parentType === OptionListParentType.SELECT) {\n optionListContainer?.nativeElement.focus()\n }\n\n const ul = optionListContainer?.nativeElement?.children[0] as HTMLUListElement | undefined\n const listItems = (ul?.children ?? []) as HTMLLIElement[]\n let currentIndex = this.selectedElementIndex()\n listItems?.[currentIndex]?.classList.add('selected')\n // Initialize focusedItemIndex with current selection\n this.focusedItemIndex.set(currentIndex)\n\n // Scroll to selected item when option list opens\n const listItem = listItems[currentIndex]\n if (listItem) {\n setTimeout(() => {\n listItem.scrollIntoView({ behavior: this.scrollBehaviorOnOpen(), block: 'nearest' })\n }, 0)\n }\n\n if (this.onKeyDown) {\n this.onKeyDown.unsubscribe()\n }\n\n this.onKeyDown = fromEvent(document, 'keydown', {\n capture: true,\n })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n switch ((event as KeyboardEvent).key) {\n case 'ArrowDown': {\n if (this.parentType() === OptionListParentType.AUTOCOMPLETE) optionListContainer?.nativeElement.focus()\n if (currentIndex !== this.selectedElementIndex()) listItems[currentIndex]?.classList.remove('selected')\n if (currentIndex === listItems.length - 1) {\n currentIndex = listItems.length - 1\n } else {\n currentIndex += 1\n }\n event.preventDefault()\n\n listItems[currentIndex]?.classList.add('selected')\n // Scroll item into view if not visible\n listItems[currentIndex]?.scrollIntoView({ behavior: 'smooth', block: 'nearest' })\n // Update focusedItemIndex for aria-activedescendant\n this.focusedItemIndex.set(currentIndex)\n break\n }\n case 'ArrowUp': {\n if (this.parentType() === OptionListParentType.AUTOCOMPLETE) optionListContainer?.nativeElement.focus()\n if (currentIndex !== this.selectedElementIndex()) listItems[currentIndex]?.classList.remove('selected')\n if (currentIndex !== 0) currentIndex -= 1\n event.preventDefault()\n\n listItems[currentIndex]?.classList.add('selected')\n // Scroll item into view if not visible\n listItems[currentIndex]?.scrollIntoView({ behavior: 'smooth', block: 'nearest' })\n // Update focusedItemIndex for aria-activedescendant\n this.focusedItemIndex.set(currentIndex)\n break\n }\n case 'Enter': {\n event.preventDefault()\n this.onSelectItem(this.selectOptionsList()[currentIndex])\n break\n }\n case 'Escape': {\n event.preventDefault()\n this.escapePressed.emit()\n break\n }\n case 'Tab': {\n // Only handle Tab when focus is on the option list itself\n // If focus is on the parent input, let the input's blur handler deal with it\n if (document.activeElement?.id === optionListContainer?.nativeElement?.id) {\n // Allow Tab to close dropdown and move focus naturally\n // Emit event so parent can handle focus transition\n this.tabPressed.emit({ shiftKey: (event as KeyboardEvent).shiftKey })\n }\n break\n }\n default: {\n if (\n ((event as KeyboardEvent)?.key?.length === 1 || (event as KeyboardEvent)?.key === 'Backspace') &&\n this.parentType() === OptionListParentType.AUTOCOMPLETE &&\n document.activeElement?.id === optionListContainer?.nativeElement?.id\n ) {\n currentIndex = 0\n document.getElementById(this.parentID())?.focus()\n document.getElementById(this.parentID())?.click()\n } else if (\n (event as KeyboardEvent)?.key?.length === 1 &&\n this.parentType() === OptionListParentType.SELECT\n ) {\n const key = (event as KeyboardEvent).key\n currentIndex = this.handleSearch(key, listItems, currentIndex)\n event.preventDefault()\n }\n break\n }\n }\n })\n })\n\n handleSearch(key: string, listItems: HTMLLIElement[], currentIndex: number): number {\n if (this.searchResetTimer) {\n clearTimeout(this.searchResetTimer)\n }\n\n this.searchString.update((current) => current + key)\n\n this.searchResetTimer = setTimeout(() => {\n this.searchString.set('')\n this.searchResetTimer = null\n }, 500)\n\n const searchStr = this.searchString().toLowerCase()\n const matchIndex = this.selectOptionsList().findIndex((option) => option.label.toLowerCase().includes(searchStr))\n\n if (matchIndex !== -1 && matchIndex !== currentIndex) {\n listItems[currentIndex]?.classList.remove('selected')\n listItems[matchIndex]?.classList.add('selected')\n listItems[matchIndex]?.scrollIntoView({ behavior: this.scrollBehaviorOnOpen() })\n return matchIndex\n }\n\n return currentIndex\n }\n\n @HostListener('window:scroll') changePosition() {\n this.getOptionListWidth()\n this.getOptionListTop()\n }\n\n isScrollable(ele: Element): boolean {\n if (!ele) return false\n\n let result = false\n\n try {\n const hasScrollableContent = ele.scrollHeight > ele.clientHeight\n\n const overflowYStyle = window.getComputedStyle(ele).overflowY\n const isOverflowHidden = overflowYStyle.includes('hidden')\n\n result = hasScrollableContent && !isOverflowHidden\n } catch (_error) {\n if (this.logLevel === 'verbose') console.error('captured error isScrollable', _error)\n }\n\n return result\n }\n\n getScrollParent(node: unknown): Element {\n if (!node || node === document.body || !(node instanceof Element)) return document.body\n return this.isScrollable(node) ? node : this.getScrollParent(node.parentNode)\n }\n\n onSelectItem(item: SelectOption | null): void {\n if (this.selectionMode() === 'single') {\n this.changedHandler.emit(item?.value ?? null)\n } else {\n let targetValue = this._value()\n if (!Array.isArray(targetValue) && targetValue) {\n targetValue = [targetValue]\n }\n const values: string[] | number[] | null = targetValue as string[] | number[] | null\n if (values) {\n if (values.some((x) => x === item?.value)) {\n this.changedHandler.emit(values.filter((x) => x !== item?.value) as string[] | number[])\n } else if (item) {\n this.changedHandler.emit([...values, item.value] as string[] | number[])\n } else {\n this.changedHandler.emit([...values] as string[] | number[])\n }\n } else if (item?.value) {\n this.changedHandler.emit([item.value] as string[] | number[])\n } else {\n this.changedHandler.emit(null)\n }\n }\n this.getOptionListTop()\n }\n\n getSelected(item: SelectOption): boolean {\n if (this.selectionMode() === 'single' || !Array.isArray(this._value())) {\n return this._value() === item.value\n }\n return this._value()?.some((x: number | string | null) => x === item?.value)\n }\n\n onBlurHandler(e: Event): void {\n this.blurHandler.emit(e)\n }\n\n getOptionListWidth() {\n this.elementWidth.set(`${this.selectButtonRef()?.offsetWidth}px`)\n }\n\n getOptionListTop() {\n const nativeElement = this.optionListContainer()?.nativeElement\n const diff =\n window.innerHeight -\n (nativeElement?.getBoundingClientRect()?.height ?? 0) -\n (this.selectButtonRef()?.getBoundingClientRect()?.top ?? 0) -\n (this.selectButtonRef()?.getBoundingClientRect()?.height ?? 0)\n let topValue = 'unset'\n let bottomValue = 'unset'\n const isTop = diff >= 0\n if (isTop) {\n topValue = `${(this.selectButtonRef()?.getBoundingClientRect()?.top ?? 0) + (this.selectButtonRef()?.getBoundingClientRect()?.height ?? 0)}px`\n } else {\n bottomValue = `${window.innerHeight - (this.selectButtonRef()?.getBoundingClientRect()?.bottom ?? 0) + (this.selectButtonRef()?.getBoundingClientRect()?.height ?? 0)}px`\n }\n nativeElement?.classList.toggle('option-list-top', !isTop)\n this.elementTop.set(topValue)\n this.elementBottom.set(bottomValue)\n setTimeout(() => {\n this.getOptionListTop()\n })\n }\n}\n","<div\n [attr.aria-activedescendant]=\"getActiveDescendantId()\"\n [attr.aria-label]=\"componentLabel()\"\n [ngStyle]=\"{\n 'max-height': optionListMaxHeight(),\n '--option-list-width': elementWidth(),\n '--option-list-top': elementTop(),\n '--option-list-bottom': elementBottom(),\n }\"\n (blur)=\"onBlurHandler($event)\"\n #optionListContainer\n aria-orientation=\"vertical\"\n class=\"option-list\"\n id=\"optionList\"\n role=\"listbox\"\n tabindex=\"0\"\n>\n <ul role=\"presentation\">\n @for (\n item of selectOptionsList();\n track (item.value ?? '') + (item.label ?? '');\n let i = $index;\n let last = $last\n ) {\n <li\n [attr.aria-selected]=\"getSelected(item)\"\n [class.m-0]=\"last\"\n [class.selected]=\"selectionMode() === 'single' ? getSelected(item) : null\"\n [id]=\"'item-' + i\"\n (mousedown)=\"$event.stopImmediatePropagation(); onSelectItem(item)\"\n class=\"item\"\n role=\"option\"\n >\n <input\n [checked]=\"getSelected(item)\"\n [class.d-none]=\"selectionMode() === 'single' || !item?.value\"\n [disabled]=\"true\"\n [id]=\"i + '-' + item.value + '-checkbox'\"\n [name]=\"i + '-' + item.value + '-checkbox'\"\n [ngClass]=\"componentClass()\"\n [value]=\"getSelected(item)\"\n (blur)=\"onBlurHandler($event)\"\n #inputCheckbox\n aria-hidden=\"true\"\n class=\"form-check-input opacity-100\"\n tabindex=\"-1\"\n type=\"checkbox\"\n />\n <label\n [class.ms-3]=\"selectionMode() === 'multiple' && item?.value\"\n [for]=\"i + '-' + item.value + '-checkbox'\"\n class=\"form-check-label checkbox-label w-100 opacity-100\"\n >\n @if (!item.renderer) {\n {{ translateValue() ? (item.label | transloco) : item.label }}\n }\n <ng-container\n [ngTemplateOutlet]=\"item.renderer ?? null\"\n [ngTemplateOutletContext]=\"{ $implicit: item, selected: getSelected(item), index: i }\"\n ></ng-container>\n </label>\n </li>\n }\n </ul>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "quang",
3
3
  "sideEffects": false,
4
- "version": "19.3.16-2",
4
+ "version": "19.4.0",
5
5
  "dependencies": {
6
6
  "tslib": "^2.3.0"
7
7
  },
@@ -67,6 +67,10 @@
67
67
  "types": "./auth/index.d.ts",
68
68
  "default": "./fesm2022/quang-auth.mjs"
69
69
  },
70
+ "./data-handling": {
71
+ "types": "./data-handling/index.d.ts",
72
+ "default": "./fesm2022/quang-data-handling.mjs"
73
+ },
70
74
  "./forms": {
71
75
  "types": "./forms/index.d.ts",
72
76
  "default": "./fesm2022/quang-forms.mjs"
@@ -75,10 +79,6 @@
75
79
  "types": "./device/index.d.ts",
76
80
  "default": "./fesm2022/quang-device.mjs"
77
81
  },
78
- "./data-handling": {
79
- "types": "./data-handling/index.d.ts",
80
- "default": "./fesm2022/quang-data-handling.mjs"
81
- },
82
82
  "./loader": {
83
83
  "types": "./loader/index.d.ts",
84
84
  "default": "./fesm2022/quang-loader.mjs"
@@ -87,29 +87,37 @@
87
87
  "types": "./shared/index.d.ts",
88
88
  "default": "./fesm2022/quang-shared.mjs"
89
89
  },
90
- "./translation": {
91
- "types": "./translation/index.d.ts",
92
- "default": "./fesm2022/quang-translation.mjs"
93
- },
94
90
  "./auth/mobile": {
95
91
  "types": "./auth/mobile/index.d.ts",
96
92
  "default": "./fesm2022/quang-auth-mobile.mjs"
97
93
  },
94
+ "./translation": {
95
+ "types": "./translation/index.d.ts",
96
+ "default": "./fesm2022/quang-translation.mjs"
97
+ },
98
98
  "./components/autocomplete": {
99
99
  "types": "./components/autocomplete/index.d.ts",
100
100
  "default": "./fesm2022/quang-components-autocomplete.mjs"
101
101
  },
102
- "./components/checkbox": {
103
- "types": "./components/checkbox/index.d.ts",
104
- "default": "./fesm2022/quang-components-checkbox.mjs"
102
+ "./components/input": {
103
+ "types": "./components/input/index.d.ts",
104
+ "default": "./fesm2022/quang-components-input.mjs"
105
105
  },
106
106
  "./components/date": {
107
107
  "types": "./components/date/index.d.ts",
108
108
  "default": "./fesm2022/quang-components-date.mjs"
109
109
  },
110
- "./components/input": {
111
- "types": "./components/input/index.d.ts",
112
- "default": "./fesm2022/quang-components-input.mjs"
110
+ "./components/radio-group": {
111
+ "types": "./components/radio-group/index.d.ts",
112
+ "default": "./fesm2022/quang-components-radio-group.mjs"
113
+ },
114
+ "./components/shared": {
115
+ "types": "./components/shared/index.d.ts",
116
+ "default": "./fesm2022/quang-components-shared.mjs"
117
+ },
118
+ "./components/checkbox": {
119
+ "types": "./components/checkbox/index.d.ts",
120
+ "default": "./fesm2022/quang-components-checkbox.mjs"
113
121
  },
114
122
  "./components/paginator": {
115
123
  "types": "./components/paginator/index.d.ts",
@@ -123,37 +131,29 @@
123
131
  "types": "./components/table/index.d.ts",
124
132
  "default": "./fesm2022/quang-components-table.mjs"
125
133
  },
126
- "./components/shared": {
127
- "types": "./components/shared/index.d.ts",
128
- "default": "./fesm2022/quang-components-shared.mjs"
129
- },
130
134
  "./components/wysiwyg": {
131
135
  "types": "./components/wysiwyg/index.d.ts",
132
136
  "default": "./fesm2022/quang-components-wysiwyg.mjs"
133
137
  },
134
- "./overlay/modal": {
135
- "types": "./overlay/modal/index.d.ts",
136
- "default": "./fesm2022/quang-overlay-modal.mjs"
137
- },
138
- "./components/radio-group": {
139
- "types": "./components/radio-group/index.d.ts",
140
- "default": "./fesm2022/quang-components-radio-group.mjs"
138
+ "./overlay/shared": {
139
+ "types": "./overlay/shared/index.d.ts",
140
+ "default": "./fesm2022/quang-overlay-shared.mjs"
141
141
  },
142
142
  "./overlay/popover": {
143
143
  "types": "./overlay/popover/index.d.ts",
144
144
  "default": "./fesm2022/quang-overlay-popover.mjs"
145
145
  },
146
- "./overlay/shared": {
147
- "types": "./overlay/shared/index.d.ts",
148
- "default": "./fesm2022/quang-overlay-shared.mjs"
149
- },
150
- "./overlay/toast": {
151
- "types": "./overlay/toast/index.d.ts",
152
- "default": "./fesm2022/quang-overlay-toast.mjs"
146
+ "./overlay/modal": {
147
+ "types": "./overlay/modal/index.d.ts",
148
+ "default": "./fesm2022/quang-overlay-modal.mjs"
153
149
  },
154
150
  "./overlay/tooltip": {
155
151
  "types": "./overlay/tooltip/index.d.ts",
156
152
  "default": "./fesm2022/quang-overlay-tooltip.mjs"
153
+ },
154
+ "./overlay/toast": {
155
+ "types": "./overlay/toast/index.d.ts",
156
+ "default": "./fesm2022/quang-overlay-toast.mjs"
157
157
  }
158
158
  }
159
159
  }