quang 21.1.0 → 21.1.2

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.
@@ -5,6 +5,7 @@ The `QuangTabsComponent` is a flexible tabs navigation component that provides s
5
5
  ## Inputs
6
6
 
7
7
  - `tabs`: `TabConfiguration[]` — Array of tab configurations. Each tab must have an `id` and `label`, and can optionally include `disabled` state or a custom `renderer`. **(Required)**
8
+ - `tabsOrientation`: `TabsOrientation` — Controls tab alignment. `TabsOrientation.Horizontal` (default) renders tabs in a row, while `TabsOrientation.Vertical` stacks tabs in a column
8
9
  - `isReadonly`: `boolean` — Set component to read-only mode. When true, all tabs become non-interactive. Inherited from `QuangBaseComponent`
9
10
  - `componentTabIndex`: `number` — Tab index for accessibility. Inherited from `QuangBaseComponent`
10
11
  - `componentClass`: `string | string[]` — Additional CSS classes. Inherited from `QuangBaseComponent`
@@ -19,10 +20,19 @@ The `QuangTabsComponent` is a flexible tabs navigation component that provides s
19
20
 
20
21
  ```typescript
21
22
  interface TabConfiguration {
22
- id: string // Unique identifier for the tab
23
- label: string // Translation key or label text
24
- disabled?: boolean // If true, tab is disabled and non-interactive
25
- renderer?: TemplateRef<any> // Optional custom template for tab rendering
23
+ id: string // Unique identifier for the tab
24
+ label: string // Translation key or label text
25
+ disabled?: boolean // If true, tab is disabled and non-interactive
26
+ renderer?: TemplateRef<any> // Optional custom template for tab rendering
27
+ }
28
+ ```
29
+
30
+ ## TabsOrientation Enum
31
+
32
+ ```typescript
33
+ enum TabsOrientation {
34
+ Horizontal = 'horizontal',
35
+ Vertical = 'vertical',
26
36
  }
27
37
  ```
28
38
 
@@ -32,8 +42,8 @@ interface TabConfiguration {
32
42
 
33
43
  ```html
34
44
  <quang-tabs
35
- [tabs]="tabs"
36
45
  [formControl]="selectedTab"
46
+ [tabs]="tabs"
37
47
  />
38
48
  ```
39
49
 
@@ -53,8 +63,8 @@ export class MyComponent {
53
63
 
54
64
  ```html
55
65
  <quang-tabs
56
- [tabs]="tabs"
57
66
  [formControl]="selectedTab"
67
+ [tabs]="tabs"
58
68
  />
59
69
  ```
60
70
 
@@ -74,8 +84,8 @@ export class MyComponent {
74
84
 
75
85
  ```html
76
86
  <quang-tabs
77
- [tabs]="tabs"
78
87
  [formControl]="selectedTab"
88
+ [tabs]="tabs"
79
89
  (tabChange)="onTabChange($event)"
80
90
  />
81
91
  ```
@@ -103,66 +113,65 @@ Display different content based on the selected tab using Angular's `@switch` co
103
113
 
104
114
  ```html
105
115
  <quang-tabs
106
- [tabs]="tabs"
107
116
  [formControl]="selectedTab"
117
+ [tabs]="tabs"
108
118
  />
109
119
 
110
120
  <!-- Content changes based on selected tab -->
111
121
  <div class="mt-4">
112
- @switch (selectedTab.value) {
113
- @case ('overview') {
114
- <div class="card">
115
- <div class="card-header">
116
- <h5>Overview</h5>
117
- </div>
118
- <div class="card-body">
119
- <p>Welcome to the overview section!</p>
120
- <ul>
121
- <li>Quick statistics</li>
122
- <li>Recent activity</li>
123
- </ul>
124
- </div>
125
- </div>
126
- }
127
- @case ('details') {
128
- <div class="card">
129
- <div class="card-header">
130
- <h5>Details</h5>
122
+ @switch (selectedTab.value) { @case ('overview') {
123
+ <div class="card">
124
+ <div class="card-header">
125
+ <h5>Overview</h5>
126
+ </div>
127
+ <div class="card-body">
128
+ <p>Welcome to the overview section!</p>
129
+ <ul>
130
+ <li>Quick statistics</li>
131
+ <li>Recent activity</li>
132
+ </ul>
133
+ </div>
134
+ </div>
135
+ } @case ('details') {
136
+ <div class="card">
137
+ <div class="card-header">
138
+ <h5>Details</h5>
139
+ </div>
140
+ <div class="card-body">
141
+ <table class="table">
142
+ <tbody>
143
+ <tr>
144
+ <td><strong>Name:</strong></td>
145
+ <td>John Doe</td>
146
+ </tr>
147
+ </tbody>
148
+ </table>
149
+ </div>
150
+ </div>
151
+ } @case ('settings') {
152
+ <div class="card">
153
+ <div class="card-header">
154
+ <h5>Settings</h5>
155
+ </div>
156
+ <div class="card-body">
157
+ <form>
158
+ <div class="mb-3">
159
+ <label>Theme</label>
160
+ <select class="form-select">
161
+ <option>Light</option>
162
+ <option>Dark</option>
163
+ </select>
131
164
  </div>
132
- <div class="card-body">
133
- <table class="table">
134
- <tbody>
135
- <tr>
136
- <td><strong>Name:</strong></td>
137
- <td>John Doe</td>
138
- </tr>
139
- </tbody>
140
- </table>
141
- </div>
142
- </div>
143
- }
144
- @case ('settings') {
145
- <div class="card">
146
- <div class="card-header">
147
- <h5>Settings</h5>
148
- </div>
149
- <div class="card-body">
150
- <form>
151
- <div class="mb-3">
152
- <label>Theme</label>
153
- <select class="form-select">
154
- <option>Light</option>
155
- <option>Dark</option>
156
- </select>
157
- </div>
158
- <button type="submit" class="btn btn-primary">
159
- Save
160
- </button>
161
- </form>
162
- </div>
163
- </div>
164
- }
165
- }
165
+ <button
166
+ class="btn btn-primary"
167
+ type="submit"
168
+ >
169
+ Save
170
+ </button>
171
+ </form>
172
+ </div>
173
+ </div>
174
+ } }
166
175
  </div>
167
176
  ```
168
177
 
@@ -178,13 +187,62 @@ export class MyComponent {
178
187
  }
179
188
  ```
180
189
 
190
+ ### Content + Orientation Toggle
191
+
192
+ Use `tabsOrientation` to switch between horizontal and vertical tabs at runtime:
193
+
194
+ ```html
195
+ <div class="form-check form-switch mb-3">
196
+ <input
197
+ [checked]="verticalOrientationEnabled()"
198
+ (change)="toggleOrientation()"
199
+ class="form-check-input"
200
+ id="verticalOrientationToggle"
201
+ type="checkbox"
202
+ />
203
+ <label
204
+ class="form-check-label"
205
+ for="verticalOrientationToggle"
206
+ >
207
+ Vertical alignment
208
+ </label>
209
+ </div>
210
+
211
+ <quang-tabs
212
+ [formControl]="selectedTab"
213
+ [tabs]="tabs"
214
+ [tabsOrientation]="tabsOrientation()"
215
+ />
216
+ ```
217
+
218
+ ```typescript
219
+ export class MyComponent {
220
+ selectedTab = new FormControl<string>('overview')
221
+ verticalOrientationEnabled = signal<boolean>(false)
222
+
223
+ tabsOrientation = computed(() =>
224
+ this.verticalOrientationEnabled() ? TabsOrientation.Vertical : TabsOrientation.Horizontal
225
+ )
226
+
227
+ tabs: TabConfiguration[] = [
228
+ { id: 'overview', label: 'Overview' },
229
+ { id: 'details', label: 'Details' },
230
+ { id: 'settings', label: 'Settings' },
231
+ ]
232
+
233
+ toggleOrientation(): void {
234
+ this.verticalOrientationEnabled.set(!this.verticalOrientationEnabled())
235
+ }
236
+ }
237
+ ```
238
+
181
239
  ### Custom Tab Templates
182
240
 
183
241
  ```html
184
242
  <ng-template
185
243
  #customTabTpl
186
- let-tab
187
244
  let-selected="selected"
245
+ let-tab
188
246
  >
189
247
  <button
190
248
  [class.selected]="selected"
@@ -195,15 +253,15 @@ export class MyComponent {
195
253
  <span>{{ tab.icon }}</span>
196
254
  <strong>{{ tab.label | transloco }}</strong>
197
255
  @if(selected) {
198
- <small class="badge bg-primary">Active</small>
256
+ <small class="badge bg-primary">Active</small>
199
257
  }
200
258
  </span>
201
259
  </button>
202
260
  </ng-template>
203
261
 
204
262
  <quang-tabs
205
- [tabs]="tabs"
206
263
  [formControl]="selectedTab"
264
+ [tabs]="tabs"
207
265
  />
208
266
  ```
209
267
 
@@ -214,15 +272,15 @@ export class MyComponent {
214
272
 
215
273
  get tabs(): TabConfiguration[] {
216
274
  return [
217
- {
218
- id: 'dashboard',
275
+ {
276
+ id: 'dashboard',
219
277
  label: 'Dashboard',
220
- renderer: this.customTabTpl()
278
+ renderer: this.customTabTpl(),
221
279
  },
222
- {
223
- id: 'messages',
224
- label: 'Messages',
225
- renderer: this.customTabTpl()
280
+ {
281
+ id: 'messages',
282
+ label: 'Messages',
283
+ renderer: this.customTabTpl(),
226
284
  },
227
285
  ]
228
286
  }
@@ -242,9 +300,8 @@ export class MyComponent {
242
300
 
243
301
  ```typescript
244
302
  export class MyComponent {
245
-
246
303
  form = this.fb.group({
247
- selectedSection: [null, Validators.required]
304
+ selectedSection: [null, Validators.required],
248
305
  })
249
306
 
250
307
  tabs: TabConfiguration[] = [
@@ -259,14 +316,12 @@ export class MyComponent {
259
316
 
260
317
  ```html
261
318
  <quang-tabs
262
- [tabs]="tabs"
263
319
  [formControl]="selectedTab"
264
320
  [isReadonly]="isReadonly()"
321
+ [tabs]="tabs"
265
322
  />
266
323
 
267
- <button (click)="toggleReadonly()">
268
- Toggle Readonly
269
- </button>
324
+ <button (click)="toggleReadonly()">Toggle Readonly</button>
270
325
  ```
271
326
 
272
327
  ```typescript
@@ -301,9 +356,9 @@ When using custom templates, the following context is available:
301
356
 
302
357
  ```typescript
303
358
  interface QuangTabTemplateContext {
304
- $implicit: TabConfiguration // The tab configuration object
305
- selected: boolean // Whether this tab is currently selected
306
- index: number // The index of the tab in the array
359
+ $implicit: TabConfiguration // The tab configuration object
360
+ selected: boolean // Whether this tab is currently selected
361
+ index: number // The index of the tab in the array
307
362
  }
308
363
  ```
309
364
 
@@ -312,9 +367,9 @@ Example usage in template:
312
367
  ```html
313
368
  <ng-template
314
369
  #tabTpl
315
- let-tab
316
- let-selected="selected"
317
370
  let-index="index"
371
+ let-selected="selected"
372
+ let-tab
318
373
  >
319
374
  <!-- tab: TabConfiguration -->
320
375
  <!-- selected: boolean -->
@@ -326,6 +381,7 @@ Example usage in template:
326
381
  ## Styling
327
382
 
328
383
  The component uses Bootstrap 5.3 classes for styling. The default tabs have:
384
+
329
385
  - Bottom border that becomes thicker (4px) when selected
330
386
  - Smooth transitions on state changes
331
387
  - Disabled state with reduced opacity
@@ -242,6 +242,9 @@ class QuangDateComponent extends QuangBaseComponent {
242
242
  else {
243
243
  this._airDatepickerInstance()?.setFocusDate(false);
244
244
  this._airDatepickerInstance()?.clear({ silent: true });
245
+ if (this.showOnlyTimepicker()) {
246
+ this.setTimepickerInputValues('');
247
+ }
245
248
  }
246
249
  }
247
250
  else {
@@ -255,6 +258,25 @@ class QuangDateComponent extends QuangBaseComponent {
255
258
  if (this.showInline()) {
256
259
  this.setupTimepicker();
257
260
  }
261
+ this.handleDisabledState();
262
+ }
263
+ handleDisabledState() {
264
+ const isDisabled = this._isDisabled();
265
+ const datepickerInstance = this._airDatepickerInstance();
266
+ if (!datepickerInstance)
267
+ return;
268
+ const datepickerEl = datepickerInstance.$datepicker;
269
+ if (!datepickerEl)
270
+ return;
271
+ const inputs = datepickerEl.querySelectorAll('input');
272
+ if (isDisabled) {
273
+ datepickerEl.classList.add('quang-calendar-disabled');
274
+ Array.from(inputs).forEach((input) => (input.disabled = true));
275
+ }
276
+ else {
277
+ datepickerEl.classList.remove('quang-calendar-disabled');
278
+ Array.from(inputs).forEach((input) => (input.disabled = false));
279
+ }
258
280
  }
259
281
  onChangeText($event) {
260
282
  const value = $event.target?.value;
@@ -356,6 +378,18 @@ class QuangDateComponent extends QuangBaseComponent {
356
378
  if (!this.showInline()) {
357
379
  return;
358
380
  }
381
+ if (this.showOnlyTimepicker()) {
382
+ const datepickerRoot = this._airDatepickerInstance()?.$datepicker;
383
+ if (datepickerRoot) {
384
+ const timeInputs = datepickerRoot.querySelectorAll('.air-datepicker-time input');
385
+ if (timeInputs.length > 0 &&
386
+ Array.from(timeInputs).every((input) => input.value === '')) {
387
+ this.onChangedHandler(null);
388
+ this.propagateValueToControl();
389
+ return;
390
+ }
391
+ }
392
+ }
359
393
  const datepickerInstance = this._airDatepickerInstance();
360
394
  const selectedDate = datepickerInstance?.selectedDates?.[0];
361
395
  if (!(selectedDate instanceof Date)) {
@@ -536,12 +570,25 @@ class QuangDateComponent extends QuangBaseComponent {
536
570
  checkDateMatch(date) {
537
571
  return isMatch(date, this.valueFormat()) || isMatch(date, this.valueFormat().replace('yyyy', 'yy'));
538
572
  }
573
+ setTimepickerInputValues(value) {
574
+ const datepickerRoot = this._airDatepickerInstance()?.$datepicker;
575
+ if (!datepickerRoot) {
576
+ return;
577
+ }
578
+ const timepickers = datepickerRoot.getElementsByClassName('air-datepicker-time');
579
+ for (const timepicker of Array.from(timepickers)) {
580
+ const inputs = timepicker.getElementsByTagName('input');
581
+ for (const input of Array.from(inputs)) {
582
+ input.value = value;
583
+ }
584
+ }
585
+ }
539
586
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: QuangDateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
540
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", 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 d-flex gap-2\"\n >\n <div>\n <span>{{ componentLabel() | transloco }}</span>\n <span [hidden]=\"!_isRequired()\">*</span>\n </div>\n @if (helpMessage() && helpMessageTooltip()) {\n <div [quangTooltip]=\"helpMessage() | transloco\">\n <ng-content select=\"[help-icon]\" />\n </div>\n }\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() && !helpMessageTooltip()) {\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: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: QuangTooltipDirective, selector: "[quangTooltip]", inputs: ["quangTooltip", "showMethod"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
587
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", 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 d-flex gap-2\"\n >\n <div>\n <span>{{ componentLabel() | transloco }}</span>\n <span [hidden]=\"!_isRequired()\">*</span>\n </div>\n @if (helpMessage() && helpMessageTooltip()) {\n <div [quangTooltip]=\"helpMessage() | transloco\">\n <ng-content select=\"[help-icon]\" />\n </div>\n }\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() && !helpMessageTooltip()) {\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.quang-calendar-disabled{pointer-events:none;opacity:.6}::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;gap:1rem}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row{width:100%;position:relative;height:100%}::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:.375rem .75rem .375rem 1.5rem;border-color:var(--bs-border-color);height:38px}::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;background-color:transparent}::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: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: QuangTooltipDirective, selector: "[quangTooltip]", inputs: ["quangTooltip", "showMethod"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
541
588
  }
542
589
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: QuangDateComponent, decorators: [{
543
590
  type: Component,
544
- args: [{ selector: 'quang-date', providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => QuangDateComponent), multi: true }], imports: [TranslocoPipe, NgClass, QuangTooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-3\">\n @if (componentLabel()) {\n <label\n [htmlFor]=\"componentId()\"\n class=\"form-label d-flex gap-2\"\n >\n <div>\n <span>{{ componentLabel() | transloco }}</span>\n <span [hidden]=\"!_isRequired()\">*</span>\n </div>\n @if (helpMessage() && helpMessageTooltip()) {\n <div [quangTooltip]=\"helpMessage() | transloco\">\n <ng-content select=\"[help-icon]\" />\n </div>\n }\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() && !helpMessageTooltip()) {\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"] }]
591
+ args: [{ selector: 'quang-date', providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => QuangDateComponent), multi: true }], imports: [TranslocoPipe, NgClass, QuangTooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-3\">\n @if (componentLabel()) {\n <label\n [htmlFor]=\"componentId()\"\n class=\"form-label d-flex gap-2\"\n >\n <div>\n <span>{{ componentLabel() | transloco }}</span>\n <span [hidden]=\"!_isRequired()\">*</span>\n </div>\n @if (helpMessage() && helpMessageTooltip()) {\n <div [quangTooltip]=\"helpMessage() | transloco\">\n <ng-content select=\"[help-icon]\" />\n </div>\n }\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() && !helpMessageTooltip()) {\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.quang-calendar-disabled{pointer-events:none;opacity:.6}::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;gap:1rem}::ng-deep .air-datepicker .air-datepicker-time .air-datepicker-time--sliders .air-datepicker-time--row{width:100%;position:relative;height:100%}::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:.375rem .75rem .375rem 1.5rem;border-color:var(--bs-border-color);height:38px}::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;background-color:transparent}::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"] }]
545
592
  }], ctorParameters: () => [], propDecorators: { dateFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateFormat", required: false }] }], timeFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "timeFormat", required: false }] }], activeLanguageOverride: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeLanguageOverride", required: false }] }], timepicker: [{ type: i0.Input, args: [{ isSignal: true, alias: "timepicker", required: false }] }], invalidDateMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalidDateMessage", required: false }] }], showOnlyTimepicker: [{ type: i0.Input, args: [{ isSignal: true, alias: "showOnlyTimepicker", required: false }] }], minHour: [{ type: i0.Input, args: [{ isSignal: true, alias: "minHour", required: false }] }], maxHour: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHour", required: false }] }], minMinute: [{ type: i0.Input, args: [{ isSignal: true, alias: "minMinute", required: false }] }], maxMinute: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxMinute", required: false }] }], minDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDate", required: false }] }], maxDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxDate", required: false }] }], showInline: [{ type: i0.Input, args: [{ isSignal: true, alias: "showInline", required: false }] }], calendarClasses: [{ type: i0.Input, args: [{ isSignal: true, alias: "calendarClasses", required: false }] }], buttonClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "buttonClass", required: false }] }], datepickerOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "datepickerOptions", required: false }] }], _inputForDate: [{ type: i0.ViewChild, args: ['inputForDate', { isSignal: true }] }], contentTemplate: [{ type: i0.ViewChild, args: ['calendarButton', { isSignal: true }] }], multipleDatesSeparator: [{ type: i0.Input, args: [{ isSignal: true, alias: "multipleDatesSeparator", required: false }] }], rangeSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "rangeSelection", required: false }] }], searchTextDebounce: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchTextDebounce", required: false }] }] } });
546
593
 
547
594
  /**
@@ -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 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 { QuangTooltipDirective } from 'quang/overlay/tooltip'\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, QuangTooltipDirective],\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 setTimeout(() => inputElement?.focus(), 0)\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 this.unwrapLocaleModule(en)\n case 'it':\n return this.unwrapLocaleModule(it)\n case 'fr':\n return this.unwrapLocaleModule(fr)\n default:\n return this.unwrapLocaleModule(en)\n }\n }\n\n private unwrapLocaleModule(localeModule: unknown): AirDatepickerLocale {\n if (typeof localeModule === 'object' && localeModule !== null && 'default' in localeModule) {\n const moduleWithDefault = localeModule as { default?: unknown }\n if (moduleWithDefault.default) {\n return moduleWithDefault.default as AirDatepickerLocale\n }\n\n return localeModule as unknown as AirDatepickerLocale\n }\n\n return localeModule as AirDatepickerLocale\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 d-flex gap-2\"\n >\n <div>\n <span>{{ componentLabel() | transloco }}</span>\n <span [hidden]=\"!_isRequired()\">*</span>\n </div>\n @if (helpMessage() && helpMessageTooltip()) {\n <div [quangTooltip]=\"helpMessage() | transloco\">\n <ng-content select=\"[help-icon]\" />\n </div>\n }\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() && !helpMessageTooltip()) {\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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"}
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 { QuangTooltipDirective } from 'quang/overlay/tooltip'\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, QuangTooltipDirective],\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 if (this.showOnlyTimepicker()) {\n this.setTimepickerInputValues('')\n }\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 this.handleDisabledState()\n }\n\n private handleDisabledState() {\n const isDisabled = this._isDisabled()\n const datepickerInstance = this._airDatepickerInstance()\n if (!datepickerInstance) return\n\n const datepickerEl = datepickerInstance.$datepicker\n if (!datepickerEl) return\n\n const inputs = datepickerEl.querySelectorAll('input')\n\n if (isDisabled) {\n datepickerEl.classList.add('quang-calendar-disabled')\n Array.from(inputs).forEach((input) => ((input as HTMLInputElement).disabled = true))\n } else {\n datepickerEl.classList.remove('quang-calendar-disabled')\n Array.from(inputs).forEach((input) => ((input as HTMLInputElement).disabled = false))\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 if (this.showOnlyTimepicker()) {\n const datepickerRoot = this._airDatepickerInstance()?.$datepicker as HTMLElement | undefined\n if (datepickerRoot) {\n const timeInputs = datepickerRoot.querySelectorAll('.air-datepicker-time input')\n if (\n timeInputs.length > 0 &&\n Array.from(timeInputs).every((input) => (input as HTMLInputElement).value === '')\n ) {\n this.onChangedHandler(null)\n this.propagateValueToControl()\n return\n }\n }\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 setTimeout(() => inputElement?.focus(), 0)\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 this.unwrapLocaleModule(en)\n case 'it':\n return this.unwrapLocaleModule(it)\n case 'fr':\n return this.unwrapLocaleModule(fr)\n default:\n return this.unwrapLocaleModule(en)\n }\n }\n\n private unwrapLocaleModule(localeModule: unknown): AirDatepickerLocale {\n if (typeof localeModule === 'object' && localeModule !== null && 'default' in localeModule) {\n const moduleWithDefault = localeModule as { default?: unknown }\n if (moduleWithDefault.default) {\n return moduleWithDefault.default as AirDatepickerLocale\n }\n\n return localeModule as unknown as AirDatepickerLocale\n }\n\n return localeModule as AirDatepickerLocale\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 private setTimepickerInputValues(value: string) {\n const datepickerRoot = this._airDatepickerInstance()?.$datepicker as HTMLElement | undefined\n if (!datepickerRoot) {\n return\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.value = value\n }\n }\n }\n}\n","<div class=\"mb-3\">\n @if (componentLabel()) {\n <label\n [htmlFor]=\"componentId()\"\n class=\"form-label d-flex gap-2\"\n >\n <div>\n <span>{{ componentLabel() | transloco }}</span>\n <span [hidden]=\"!_isRequired()\">*</span>\n </div>\n @if (helpMessage() && helpMessageTooltip()) {\n <div [quangTooltip]=\"helpMessage() | transloco\">\n <ng-content select=\"[help-icon]\" />\n </div>\n }\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() && !helpMessageTooltip()) {\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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"}
@@ -5,11 +5,18 @@ import { NG_VALUE_ACCESSOR } from '@angular/forms';
5
5
  import { TranslocoPipe } from '@jsverse/transloco';
6
6
  import { QuangBaseComponent } from 'quang/components/shared';
7
7
 
8
+ var TabsOrientation;
9
+ (function (TabsOrientation) {
10
+ TabsOrientation["Horizontal"] = "horizontal";
11
+ TabsOrientation["Vertical"] = "vertical";
12
+ })(TabsOrientation || (TabsOrientation = {}));
8
13
  class QuangTabsComponent extends QuangBaseComponent {
9
14
  constructor() {
10
15
  super(...arguments);
11
16
  this.tabs = input.required(...(ngDevMode ? [{ debugName: "tabs" }] : []));
17
+ this.tabsOrientation = input(TabsOrientation.Horizontal, ...(ngDevMode ? [{ debugName: "tabsOrientation" }] : []));
12
18
  this.tabChange = output();
19
+ this.TabsOrientation = TabsOrientation;
13
20
  }
14
21
  getTabIndex(tab) {
15
22
  return this.tabs().findIndex((x) => x.id === tab.id);
@@ -27,13 +34,13 @@ class QuangTabsComponent extends QuangBaseComponent {
27
34
  this.tabChange.emit(tab.id);
28
35
  }
29
36
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: QuangTabsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
30
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: QuangTabsComponent, isStandalone: true, selector: "quang-tabs", inputs: { tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { tabChange: "tabChange" }, providers: [
37
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: QuangTabsComponent, isStandalone: true, selector: "quang-tabs", inputs: { tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: true, transformFunction: null }, tabsOrientation: { classPropertyName: "tabsOrientation", publicName: "tabsOrientation", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { tabChange: "tabChange" }, providers: [
31
38
  {
32
39
  provide: NG_VALUE_ACCESSOR,
33
40
  useExisting: forwardRef(() => QuangTabsComponent),
34
41
  multi: true,
35
42
  },
36
- ], usesInheritance: true, ngImport: i0, template: "<div\n class=\"d-flex mt-4 flex-column flex-lg-row\"\n id=\"tabs-container\"\n>\n @for (tab of tabs(); track tab.id) {\n @if (tab.renderer) {\n <ng-container\n [ngTemplateOutlet]=\"tab.renderer\"\n [ngTemplateOutletContext]=\"{\n $implicit: tab,\n selected: isTabSelected(tab),\n index: getTabIndex(tab),\n onSelect: onSelectTab.bind(this),\n }\"\n ></ng-container>\n } @else {\n <button\n [class.selected]=\"isTabSelected(tab)\"\n [disabled]=\"isTabDisabled(tab)\"\n (click)=\"onSelectTab(tab)\"\n class=\"flex-grow-1 btn btn-only-text\"\n type=\"button\"\n >\n {{ tab.label | transloco }}\n </button>\n }\n }\n</div>\n", styles: ["#tabs-container button{border-radius:0;border-bottom:1px solid var(--bs-border-color)}#tabs-container button.selected{border-bottom:4px solid var(--bs-border-color);font-weight:700}#tabs-container button:not(.selected){padding-bottom:calc(.5rem + 3px)}#tabs-container .btn:disabled{border-color:transparent;border-bottom:1px solid var(--bs-border-color)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
43
+ ], usesInheritance: true, ngImport: i0, template: "<div\n [class.flex-column]=\"tabsOrientation() === TabsOrientation.Vertical\"\n class=\"d-flex mt-4\"\n id=\"tabs-container\"\n>\n @for (tab of tabs(); track tab.id) {\n @if (tab.renderer) {\n <ng-container\n [ngTemplateOutlet]=\"tab.renderer\"\n [ngTemplateOutletContext]=\"{\n $implicit: tab,\n selected: isTabSelected(tab),\n index: getTabIndex(tab),\n onSelect: onSelectTab.bind(this),\n }\"\n ></ng-container>\n } @else {\n <button\n [class.selected]=\"isTabSelected(tab)\"\n [disabled]=\"isTabDisabled(tab)\"\n (click)=\"onSelectTab(tab)\"\n class=\"flex-grow-1 btn btn-only-text\"\n type=\"button\"\n >\n {{ tab.label | transloco }}\n </button>\n }\n }\n</div>\n", styles: ["#tabs-container button{border-radius:0;border-bottom:1px solid var(--bs-border-color)}#tabs-container button.selected{border-bottom:4px solid var(--bs-border-color);font-weight:700}#tabs-container button:not(.selected){padding-bottom:calc(.5rem + 3px)}#tabs-container .btn:disabled{border-color:transparent;border-bottom:1px solid var(--bs-border-color)}#tabs-container .btn:hover{--bs-btn-hover-border-color: transparent !important}#tabs-container .btn:active{--bs-btn-active-border-color: transparent !important}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
37
44
  }
38
45
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: QuangTabsComponent, decorators: [{
39
46
  type: Component,
@@ -43,12 +50,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
43
50
  useExisting: forwardRef(() => QuangTabsComponent),
44
51
  multi: true,
45
52
  },
46
- ], imports: [TranslocoPipe, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"d-flex mt-4 flex-column flex-lg-row\"\n id=\"tabs-container\"\n>\n @for (tab of tabs(); track tab.id) {\n @if (tab.renderer) {\n <ng-container\n [ngTemplateOutlet]=\"tab.renderer\"\n [ngTemplateOutletContext]=\"{\n $implicit: tab,\n selected: isTabSelected(tab),\n index: getTabIndex(tab),\n onSelect: onSelectTab.bind(this),\n }\"\n ></ng-container>\n } @else {\n <button\n [class.selected]=\"isTabSelected(tab)\"\n [disabled]=\"isTabDisabled(tab)\"\n (click)=\"onSelectTab(tab)\"\n class=\"flex-grow-1 btn btn-only-text\"\n type=\"button\"\n >\n {{ tab.label | transloco }}\n </button>\n }\n }\n</div>\n", styles: ["#tabs-container button{border-radius:0;border-bottom:1px solid var(--bs-border-color)}#tabs-container button.selected{border-bottom:4px solid var(--bs-border-color);font-weight:700}#tabs-container button:not(.selected){padding-bottom:calc(.5rem + 3px)}#tabs-container .btn:disabled{border-color:transparent;border-bottom:1px solid var(--bs-border-color)}\n"] }]
47
- }], propDecorators: { tabs: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabs", required: true }] }], tabChange: [{ type: i0.Output, args: ["tabChange"] }] } });
53
+ ], imports: [TranslocoPipe, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n [class.flex-column]=\"tabsOrientation() === TabsOrientation.Vertical\"\n class=\"d-flex mt-4\"\n id=\"tabs-container\"\n>\n @for (tab of tabs(); track tab.id) {\n @if (tab.renderer) {\n <ng-container\n [ngTemplateOutlet]=\"tab.renderer\"\n [ngTemplateOutletContext]=\"{\n $implicit: tab,\n selected: isTabSelected(tab),\n index: getTabIndex(tab),\n onSelect: onSelectTab.bind(this),\n }\"\n ></ng-container>\n } @else {\n <button\n [class.selected]=\"isTabSelected(tab)\"\n [disabled]=\"isTabDisabled(tab)\"\n (click)=\"onSelectTab(tab)\"\n class=\"flex-grow-1 btn btn-only-text\"\n type=\"button\"\n >\n {{ tab.label | transloco }}\n </button>\n }\n }\n</div>\n", styles: ["#tabs-container button{border-radius:0;border-bottom:1px solid var(--bs-border-color)}#tabs-container button.selected{border-bottom:4px solid var(--bs-border-color);font-weight:700}#tabs-container button:not(.selected){padding-bottom:calc(.5rem + 3px)}#tabs-container .btn:disabled{border-color:transparent;border-bottom:1px solid var(--bs-border-color)}#tabs-container .btn:hover{--bs-btn-hover-border-color: transparent !important}#tabs-container .btn:active{--bs-btn-active-border-color: transparent !important}\n"] }]
54
+ }], propDecorators: { tabs: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabs", required: true }] }], tabsOrientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabsOrientation", required: false }] }], tabChange: [{ type: i0.Output, args: ["tabChange"] }] } });
48
55
 
49
56
  /**
50
57
  * Generated bundle index. Do not edit.
51
58
  */
52
59
 
53
- export { QuangTabsComponent };
60
+ export { QuangTabsComponent, TabsOrientation };
54
61
  //# sourceMappingURL=quang-components-tabs.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"quang-components-tabs.mjs","sources":["../../../projects/quang/components/tabs/tabs.component.ts","../../../projects/quang/components/tabs/tabs.component.html","../../../projects/quang/components/tabs/quang-components-tabs.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common'\nimport { ChangeDetectionStrategy, Component, TemplateRef, forwardRef, input, output } from '@angular/core'\nimport { NG_VALUE_ACCESSOR } from '@angular/forms'\n\nimport { TranslocoPipe } from '@jsverse/transloco'\n\nimport { QuangBaseComponent } from 'quang/components/shared'\n\nexport interface TabConfiguration {\n id: string\n label: string\n disabled?: boolean\n renderer?: TemplateRef<unknown>\n}\n\n@Component({\n selector: 'quang-tabs',\n templateUrl: './tabs.component.html',\n styleUrl: './tabs.component.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => QuangTabsComponent),\n multi: true,\n },\n ],\n imports: [TranslocoPipe, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class QuangTabsComponent extends QuangBaseComponent<string> {\n tabs = input.required<TabConfiguration[]>()\n\n tabChange = output<string>()\n\n getTabIndex(tab: TabConfiguration): number {\n return this.tabs().findIndex((x) => x.id === tab.id)\n }\n\n isTabSelected(tab: TabConfiguration): boolean {\n return this._value() === tab.id\n }\n\n isTabDisabled(tab: TabConfiguration): boolean {\n return this._isDisabled() || this.isReadonly() || !!tab.disabled\n }\n\n onSelectTab(tab: TabConfiguration): void {\n if (this.isTabDisabled(tab)) return\n this.onChangedHandler(tab.id)\n this.tabChange.emit(tab.id)\n }\n}\n","<div\n class=\"d-flex mt-4 flex-column flex-lg-row\"\n id=\"tabs-container\"\n>\n @for (tab of tabs(); track tab.id) {\n @if (tab.renderer) {\n <ng-container\n [ngTemplateOutlet]=\"tab.renderer\"\n [ngTemplateOutletContext]=\"{\n $implicit: tab,\n selected: isTabSelected(tab),\n index: getTabIndex(tab),\n onSelect: onSelectTab.bind(this),\n }\"\n ></ng-container>\n } @else {\n <button\n [class.selected]=\"isTabSelected(tab)\"\n [disabled]=\"isTabDisabled(tab)\"\n (click)=\"onSelectTab(tab)\"\n class=\"flex-grow-1 btn btn-only-text\"\n type=\"button\"\n >\n {{ tab.label | transloco }}\n </button>\n }\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AA6BM,MAAO,kBAAmB,SAAQ,kBAA0B,CAAA;AAdlE,IAAA,WAAA,GAAA;;AAeE,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAsB;QAE3C,IAAA,CAAA,SAAS,GAAG,MAAM,EAAU;AAmB7B,IAAA;AAjBC,IAAA,WAAW,CAAC,GAAqB,EAAA;QAC/B,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;IACtD;AAEA,IAAA,aAAa,CAAC,GAAqB,EAAA;QACjC,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE;IACjC;AAEA,IAAA,aAAa,CAAC,GAAqB,EAAA;AACjC,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ;IAClE;AAEA,IAAA,WAAW,CAAC,GAAqB,EAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;YAAE;AAC7B,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAC7B;8GArBW,kBAAkB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,SAAA,EAVlB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,kBAAkB,CAAC;AACjD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzBH,uvBA4BA,EAAA,MAAA,EAAA,CAAA,sWAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDF2B,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAA/B,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAGZ,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAd9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAAA,SAAA,EAGX;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,wBAAwB,CAAC;AACjD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;qBACF,EAAA,OAAA,EACQ,CAAC,aAAa,EAAE,gBAAgB,CAAC,EAAA,eAAA,EACzB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,uvBAAA,EAAA,MAAA,EAAA,CAAA,sWAAA,CAAA,EAAA;;;AE3BjD;;AAEG;;;;"}
1
+ {"version":3,"file":"quang-components-tabs.mjs","sources":["../../../projects/quang/components/tabs/tabs.component.ts","../../../projects/quang/components/tabs/tabs.component.html","../../../projects/quang/components/tabs/quang-components-tabs.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common'\nimport { ChangeDetectionStrategy, Component, TemplateRef, forwardRef, input, output } from '@angular/core'\nimport { NG_VALUE_ACCESSOR } from '@angular/forms'\n\nimport { TranslocoPipe } from '@jsverse/transloco'\n\nimport { QuangBaseComponent } from 'quang/components/shared'\n\nexport enum TabsOrientation {\n Horizontal = 'horizontal',\n Vertical = 'vertical',\n}\nexport interface TabConfiguration {\n id: string\n label: string\n disabled?: boolean\n renderer?: TemplateRef<unknown>\n}\n\n@Component({\n selector: 'quang-tabs',\n templateUrl: './tabs.component.html',\n styleUrl: './tabs.component.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => QuangTabsComponent),\n multi: true,\n },\n ],\n imports: [TranslocoPipe, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class QuangTabsComponent extends QuangBaseComponent<string> {\n tabs = input.required<TabConfiguration[]>()\n tabsOrientation = input<TabsOrientation>(TabsOrientation.Horizontal)\n\n tabChange = output<string>()\n\n getTabIndex(tab: TabConfiguration): number {\n return this.tabs().findIndex((x) => x.id === tab.id)\n }\n\n isTabSelected(tab: TabConfiguration): boolean {\n return this._value() === tab.id\n }\n\n isTabDisabled(tab: TabConfiguration): boolean {\n return this._isDisabled() || this.isReadonly() || !!tab.disabled\n }\n\n onSelectTab(tab: TabConfiguration): void {\n if (this.isTabDisabled(tab)) return\n this.onChangedHandler(tab.id)\n this.tabChange.emit(tab.id)\n }\n\n protected TabsOrientation = TabsOrientation\n}\n","<div\n [class.flex-column]=\"tabsOrientation() === TabsOrientation.Vertical\"\n class=\"d-flex mt-4\"\n id=\"tabs-container\"\n>\n @for (tab of tabs(); track tab.id) {\n @if (tab.renderer) {\n <ng-container\n [ngTemplateOutlet]=\"tab.renderer\"\n [ngTemplateOutletContext]=\"{\n $implicit: tab,\n selected: isTabSelected(tab),\n index: getTabIndex(tab),\n onSelect: onSelectTab.bind(this),\n }\"\n ></ng-container>\n } @else {\n <button\n [class.selected]=\"isTabSelected(tab)\"\n [disabled]=\"isTabDisabled(tab)\"\n (click)=\"onSelectTab(tab)\"\n class=\"flex-grow-1 btn btn-only-text\"\n type=\"button\"\n >\n {{ tab.label | transloco }}\n </button>\n }\n }\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": "21.1.0",
4
+ "version": "21.1.2",
5
5
  "dependencies": {
6
6
  "tslib": "^2.3.0"
7
7
  },
@@ -74,6 +74,7 @@ declare class QuangDateComponent extends QuangBaseComponent<string | DateRange |
74
74
  isMouseOutsideCalendar: _angular_core.Signal<boolean>;
75
75
  private _shouldRefocusInputOnHide;
76
76
  setupCalendar(): void;
77
+ private handleDisabledState;
77
78
  onChangeText($event: Event): void;
78
79
  onBlurHandler(): void;
79
80
  setupInputStringToDate(value: string): Date;
@@ -93,6 +94,7 @@ declare class QuangDateComponent extends QuangBaseComponent<string | DateRange |
93
94
  private setCalendarPosition;
94
95
  private setupTimepicker;
95
96
  checkDateMatch(date: string): boolean;
97
+ private setTimepickerInputValues;
96
98
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<QuangDateComponent, never>;
97
99
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<QuangDateComponent, "quang-date", never, { "dateFormat": { "alias": "dateFormat"; "required": false; "isSignal": true; }; "timeFormat": { "alias": "timeFormat"; "required": false; "isSignal": true; }; "activeLanguageOverride": { "alias": "activeLanguageOverride"; "required": false; "isSignal": true; }; "timepicker": { "alias": "timepicker"; "required": false; "isSignal": true; }; "invalidDateMessage": { "alias": "invalidDateMessage"; "required": false; "isSignal": true; }; "showOnlyTimepicker": { "alias": "showOnlyTimepicker"; "required": false; "isSignal": true; }; "minHour": { "alias": "minHour"; "required": false; "isSignal": true; }; "maxHour": { "alias": "maxHour"; "required": false; "isSignal": true; }; "minMinute": { "alias": "minMinute"; "required": false; "isSignal": true; }; "maxMinute": { "alias": "maxMinute"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "showInline": { "alias": "showInline"; "required": false; "isSignal": true; }; "calendarClasses": { "alias": "calendarClasses"; "required": false; "isSignal": true; }; "buttonClass": { "alias": "buttonClass"; "required": false; "isSignal": true; }; "datepickerOptions": { "alias": "datepickerOptions"; "required": false; "isSignal": true; }; "multipleDatesSeparator": { "alias": "multipleDatesSeparator"; "required": false; "isSignal": true; }; "rangeSelection": { "alias": "rangeSelection"; "required": false; "isSignal": true; }; "searchTextDebounce": { "alias": "searchTextDebounce"; "required": false; "isSignal": true; }; }, {}, never, ["[help-icon]", "*"], true, never>;
98
100
  }
@@ -2,6 +2,10 @@ import * as _angular_core from '@angular/core';
2
2
  import { TemplateRef } from '@angular/core';
3
3
  import { QuangBaseComponent } from 'quang/components/shared';
4
4
 
5
+ declare enum TabsOrientation {
6
+ Horizontal = "horizontal",
7
+ Vertical = "vertical"
8
+ }
5
9
  interface TabConfiguration {
6
10
  id: string;
7
11
  label: string;
@@ -10,14 +14,16 @@ interface TabConfiguration {
10
14
  }
11
15
  declare class QuangTabsComponent extends QuangBaseComponent<string> {
12
16
  tabs: _angular_core.InputSignal<TabConfiguration[]>;
17
+ tabsOrientation: _angular_core.InputSignal<TabsOrientation>;
13
18
  tabChange: _angular_core.OutputEmitterRef<string>;
14
19
  getTabIndex(tab: TabConfiguration): number;
15
20
  isTabSelected(tab: TabConfiguration): boolean;
16
21
  isTabDisabled(tab: TabConfiguration): boolean;
17
22
  onSelectTab(tab: TabConfiguration): void;
23
+ protected TabsOrientation: typeof TabsOrientation;
18
24
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<QuangTabsComponent, never>;
19
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<QuangTabsComponent, "quang-tabs", never, { "tabs": { "alias": "tabs"; "required": true; "isSignal": true; }; }, { "tabChange": "tabChange"; }, never, never, true, never>;
25
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<QuangTabsComponent, "quang-tabs", never, { "tabs": { "alias": "tabs"; "required": true; "isSignal": true; }; "tabsOrientation": { "alias": "tabsOrientation"; "required": false; "isSignal": true; }; }, { "tabChange": "tabChange"; }, never, never, true, never>;
20
26
  }
21
27
 
22
- export { QuangTabsComponent };
28
+ export { QuangTabsComponent, TabsOrientation };
23
29
  export type { TabConfiguration };