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.
- package/components/tabs/README.md +138 -82
- package/fesm2022/quang-components-date.mjs +49 -2
- package/fesm2022/quang-components-date.mjs.map +1 -1
- package/fesm2022/quang-components-tabs.mjs +12 -5
- package/fesm2022/quang-components-tabs.mjs.map +1 -1
- package/package.json +1 -1
- package/types/quang-components-date.d.ts +2 -0
- package/types/quang-components-tabs.d.ts +8 -2
|
@@ -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
|
|
23
|
-
label: string
|
|
24
|
-
disabled?: boolean
|
|
25
|
-
renderer?: TemplateRef<any>
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
<
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
<
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
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
|
|
305
|
-
selected: boolean
|
|
306
|
-
index: number
|
|
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;
|
|
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;
|
|
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
|
|
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
|
|
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
|
|
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":";;;;;;;IAQY;AAAZ,CAAA,UAAY,eAAe,EAAA;AACzB,IAAA,eAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,eAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACvB,CAAC,EAHW,eAAe,KAAf,eAAe,GAAA,EAAA,CAAA,CAAA;AAyBrB,MAAO,kBAAmB,SAAQ,kBAA0B,CAAA;AAdlE,IAAA,WAAA,GAAA;;AAeE,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAsB;AAC3C,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAkB,eAAe,CAAC,UAAU,2DAAC;QAEpE,IAAA,CAAA,SAAS,GAAG,MAAM,EAAU;QAoBlB,IAAA,CAAA,eAAe,GAAG,eAAe;AAC5C,IAAA;AAnBC,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;8GAtBW,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,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,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,EC7BH,yyBA6BA,EAAA,MAAA,EAAA,CAAA,sgBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDC2B,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,yyBAAA,EAAA,MAAA,EAAA,CAAA,sgBAAA,CAAA,EAAA;;;AE/BjD;;AAEG;;;;"}
|
package/package.json
CHANGED
|
@@ -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 };
|