ngxsmk-datepicker 2.2.12 → 2.2.13
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/CHANGELOG.md +1218 -0
- package/LICENSE +21 -0
- package/MIGRATION.md +1775 -0
- package/README.md +923 -920
- package/docs/API.md +1 -1
- package/docs/COMPATIBILITY.md +1 -1
- package/docs/INTEGRATION.md +1 -1
- package/docs/IONIC_INTEGRATION.md +1 -1
- package/docs/IONIC_TESTING.md +1 -1
- package/docs/LOCALE-GUIDE.md +1 -1
- package/docs/PLUGIN-ARCHITECTURE.md +1 -1
- package/docs/SEO.md +1 -1
- package/docs/SSR-EXAMPLE.md +1 -1
- package/docs/THEME-TOKENS.md +1 -1
- package/docs/TIMEZONE.md +1 -1
- package/docs/extension-points.md +1 -1
- package/docs/signal-forms.md +1 -1
- package/docs/signals.md +1 -1
- package/docs/ssr.md +1 -1
- package/fesm2022/ngxsmk-datepicker.mjs +14193 -0
- package/package.json +94 -92
- package/types/ngxsmk-datepicker.d.ts +2433 -0
|
@@ -0,0 +1,2433 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { EventEmitter, ElementRef, AfterViewInit, OnDestroy, TemplateRef, InjectionToken, EffectRef, Signal, OnInit, OnChanges, SimpleChanges } from '@angular/core';
|
|
3
|
+
import { ControlValueAccessor, NgControl } from '@angular/forms';
|
|
4
|
+
import { Subject } from 'rxjs';
|
|
5
|
+
|
|
6
|
+
declare function getStartOfDay(d: Date): Date;
|
|
7
|
+
declare function getEndOfDay(d: Date): Date;
|
|
8
|
+
declare function addMonths(d: Date, months: number): Date;
|
|
9
|
+
declare function subtractDays(d: Date, days: number): Date;
|
|
10
|
+
declare function getStartOfMonth(d: Date): Date;
|
|
11
|
+
declare function getEndOfMonth(d: Date): Date;
|
|
12
|
+
declare function isSameDay(d1: Date | null, d2: Date | null): boolean;
|
|
13
|
+
declare function normalizeDate(date: DateInput | null): Date | null;
|
|
14
|
+
type DateInput = Date | string | {
|
|
15
|
+
toDate: () => Date;
|
|
16
|
+
_isAMomentObject?: boolean;
|
|
17
|
+
$d?: Date;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
interface HolidayProvider {
|
|
21
|
+
isHoliday(date: Date): boolean;
|
|
22
|
+
getHolidayLabel?(date: Date): string | null;
|
|
23
|
+
}
|
|
24
|
+
interface DateRange {
|
|
25
|
+
[key: string]: [DateInput, DateInput];
|
|
26
|
+
}
|
|
27
|
+
type DatepickerValue = Date | {
|
|
28
|
+
start: Date | null;
|
|
29
|
+
end: Date | null;
|
|
30
|
+
} | Date[] | null;
|
|
31
|
+
declare function generateMonthOptions(locale: string, year: number): {
|
|
32
|
+
label: string;
|
|
33
|
+
value: number;
|
|
34
|
+
}[];
|
|
35
|
+
/**
|
|
36
|
+
* Format a number using locale-aware number formatting.
|
|
37
|
+
* Uses Intl.NumberFormat for proper localization of numeric separators and decimals.
|
|
38
|
+
*
|
|
39
|
+
* @param value - The number to format
|
|
40
|
+
* @param locale - The locale to use for formatting (e.g., 'en-US', 'de-DE', 'fr-FR')
|
|
41
|
+
* @param options - Optional Intl.NumberFormatOptions for customization
|
|
42
|
+
* @returns Formatted number string
|
|
43
|
+
*/
|
|
44
|
+
declare function formatLocaleNumber(value: number, locale: string, options?: Intl.NumberFormatOptions): string;
|
|
45
|
+
declare function generateYearOptions(currentYear: number, range?: number): {
|
|
46
|
+
label: string;
|
|
47
|
+
value: number;
|
|
48
|
+
}[];
|
|
49
|
+
declare function generateTimeOptions(minuteInterval?: number, secondInterval?: number, includeSeconds?: boolean, use24Hour?: boolean): {
|
|
50
|
+
hourOptions: {
|
|
51
|
+
label: string;
|
|
52
|
+
value: number;
|
|
53
|
+
}[];
|
|
54
|
+
minuteOptions: {
|
|
55
|
+
label: string;
|
|
56
|
+
value: number;
|
|
57
|
+
}[];
|
|
58
|
+
secondOptions?: {
|
|
59
|
+
label: string;
|
|
60
|
+
value: number;
|
|
61
|
+
}[];
|
|
62
|
+
};
|
|
63
|
+
declare function generateWeekDays(locale: string, firstDayOfWeek?: number): string[];
|
|
64
|
+
declare function getFirstDayOfWeek(locale: string): number;
|
|
65
|
+
declare function get24Hour(displayHour: number, isPm: boolean): number;
|
|
66
|
+
declare function update12HourState(fullHour: number): {
|
|
67
|
+
isPm: boolean;
|
|
68
|
+
displayHour: number;
|
|
69
|
+
};
|
|
70
|
+
declare function processDateRanges(ranges: DateRange | null): {
|
|
71
|
+
[key: string]: [Date, Date];
|
|
72
|
+
} | null;
|
|
73
|
+
declare function generateYearGrid(currentYear: number): number[];
|
|
74
|
+
declare function generateDecadeGrid(currentDecade: number): number[];
|
|
75
|
+
|
|
76
|
+
interface DatepickerClasses {
|
|
77
|
+
wrapper?: string;
|
|
78
|
+
inputGroup?: string;
|
|
79
|
+
input?: string;
|
|
80
|
+
clearBtn?: string;
|
|
81
|
+
calendarBtn?: string;
|
|
82
|
+
popover?: string;
|
|
83
|
+
container?: string;
|
|
84
|
+
calendar?: string;
|
|
85
|
+
header?: string;
|
|
86
|
+
navPrev?: string;
|
|
87
|
+
navNext?: string;
|
|
88
|
+
dayCell?: string;
|
|
89
|
+
footer?: string;
|
|
90
|
+
closeBtn?: string;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
declare class NgxsmkDatepickerInputComponent {
|
|
94
|
+
isNative: boolean;
|
|
95
|
+
disabled: boolean;
|
|
96
|
+
classes: DatepickerClasses | undefined;
|
|
97
|
+
nativeInputType: string;
|
|
98
|
+
formattedValue: string;
|
|
99
|
+
placeholder: string;
|
|
100
|
+
id: string;
|
|
101
|
+
name: string;
|
|
102
|
+
autocomplete: string;
|
|
103
|
+
required: boolean;
|
|
104
|
+
minDateNative: string | null;
|
|
105
|
+
maxDateNative: string | null;
|
|
106
|
+
ariaLabel: string;
|
|
107
|
+
ariaDescribedBy: string;
|
|
108
|
+
errorState: boolean;
|
|
109
|
+
clearAriaLabel: string;
|
|
110
|
+
clearLabel: string;
|
|
111
|
+
isCalendarOpen: boolean;
|
|
112
|
+
allowTyping: boolean;
|
|
113
|
+
typedInputValue: string;
|
|
114
|
+
displayValue: string;
|
|
115
|
+
showCalendarButton: boolean;
|
|
116
|
+
calendarAriaLabel: string;
|
|
117
|
+
validationErrorMessage: string | null;
|
|
118
|
+
nativeInputChange: EventEmitter<Event>;
|
|
119
|
+
inputBlur: EventEmitter<FocusEvent>;
|
|
120
|
+
clearValue: EventEmitter<MouseEvent>;
|
|
121
|
+
toggleCalendar: EventEmitter<Event>;
|
|
122
|
+
pointerDown: EventEmitter<PointerEvent>;
|
|
123
|
+
pointerUp: EventEmitter<PointerEvent>;
|
|
124
|
+
inputGroupFocus: EventEmitter<void>;
|
|
125
|
+
inputKeyDown: EventEmitter<Event>;
|
|
126
|
+
inputChange: EventEmitter<Event>;
|
|
127
|
+
inputFocus: EventEmitter<FocusEvent>;
|
|
128
|
+
nativeInput?: ElementRef<HTMLInputElement>;
|
|
129
|
+
customInput?: ElementRef<HTMLInputElement>;
|
|
130
|
+
focus(): void;
|
|
131
|
+
onNativeInputChange(event: Event): void;
|
|
132
|
+
onInputBlur(event: FocusEvent): void;
|
|
133
|
+
onClearValue(event: MouseEvent): void;
|
|
134
|
+
onToggleCalendar(event: Event): void;
|
|
135
|
+
onPointerDown(event: PointerEvent): void;
|
|
136
|
+
onPointerUp(event: PointerEvent): void;
|
|
137
|
+
onInputGroupFocus(): void;
|
|
138
|
+
onInputKeyDown(event: Event): void;
|
|
139
|
+
onInputChange(event: Event): void;
|
|
140
|
+
onInputFocus(event: FocusEvent): void;
|
|
141
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgxsmkDatepickerInputComponent, never>;
|
|
142
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgxsmkDatepickerInputComponent, "ngxsmk-datepicker-input", never, { "isNative": { "alias": "isNative"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "classes": { "alias": "classes"; "required": false; }; "nativeInputType": { "alias": "nativeInputType"; "required": false; }; "formattedValue": { "alias": "formattedValue"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "id": { "alias": "id"; "required": false; }; "name": { "alias": "name"; "required": false; }; "autocomplete": { "alias": "autocomplete"; "required": false; }; "required": { "alias": "required"; "required": false; }; "minDateNative": { "alias": "minDateNative"; "required": false; }; "maxDateNative": { "alias": "maxDateNative"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; }; "errorState": { "alias": "errorState"; "required": false; }; "clearAriaLabel": { "alias": "clearAriaLabel"; "required": false; }; "clearLabel": { "alias": "clearLabel"; "required": false; }; "isCalendarOpen": { "alias": "isCalendarOpen"; "required": false; }; "allowTyping": { "alias": "allowTyping"; "required": false; }; "typedInputValue": { "alias": "typedInputValue"; "required": false; }; "displayValue": { "alias": "displayValue"; "required": false; }; "showCalendarButton": { "alias": "showCalendarButton"; "required": false; }; "calendarAriaLabel": { "alias": "calendarAriaLabel"; "required": false; }; "validationErrorMessage": { "alias": "validationErrorMessage"; "required": false; }; }, { "nativeInputChange": "nativeInputChange"; "inputBlur": "inputBlur"; "clearValue": "clearValue"; "toggleCalendar": "toggleCalendar"; "pointerDown": "pointerDown"; "pointerUp": "pointerUp"; "inputGroupFocus": "inputGroupFocus"; "inputKeyDown": "inputKeyDown"; "inputChange": "inputChange"; "inputFocus": "inputFocus"; }, never, never, true, never>;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
declare class CustomSelectComponent implements AfterViewInit, OnDestroy {
|
|
146
|
+
options: {
|
|
147
|
+
label: string;
|
|
148
|
+
value: unknown;
|
|
149
|
+
}[];
|
|
150
|
+
value: unknown;
|
|
151
|
+
disabled: boolean;
|
|
152
|
+
valueChange: EventEmitter<unknown>;
|
|
153
|
+
container: ElementRef<HTMLDivElement>;
|
|
154
|
+
button: ElementRef<HTMLButtonElement>;
|
|
155
|
+
panel: ElementRef<HTMLDivElement>;
|
|
156
|
+
isOpen: boolean;
|
|
157
|
+
private readonly elementRef;
|
|
158
|
+
private readonly platformId;
|
|
159
|
+
private readonly document;
|
|
160
|
+
private readonly isBrowser;
|
|
161
|
+
private resizeObserver;
|
|
162
|
+
private scrollListener;
|
|
163
|
+
ngAfterViewInit(): void;
|
|
164
|
+
ngOnDestroy(): void;
|
|
165
|
+
private setupResizeObserver;
|
|
166
|
+
private setupScrollListener;
|
|
167
|
+
private updatePanelPosition;
|
|
168
|
+
onDocumentClick(event: MouseEvent | TouchEvent): void;
|
|
169
|
+
onDocumentTouchStart(event: TouchEvent): void;
|
|
170
|
+
get displayValue(): string;
|
|
171
|
+
toggleDropdown(): void;
|
|
172
|
+
private scrollToSelected;
|
|
173
|
+
selectOption(option: {
|
|
174
|
+
label: string;
|
|
175
|
+
value: unknown;
|
|
176
|
+
}): void;
|
|
177
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CustomSelectComponent, never>;
|
|
178
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<CustomSelectComponent, "ngxsmk-custom-select", never, { "options": { "alias": "options"; "required": false; }; "value": { "alias": "value"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
declare class CalendarHeaderComponent {
|
|
182
|
+
monthSelect?: CustomSelectComponent;
|
|
183
|
+
yearSelect?: CustomSelectComponent;
|
|
184
|
+
monthOptions: {
|
|
185
|
+
label: string;
|
|
186
|
+
value: number;
|
|
187
|
+
}[];
|
|
188
|
+
yearOptions: {
|
|
189
|
+
label: string;
|
|
190
|
+
value: number;
|
|
191
|
+
}[];
|
|
192
|
+
currentMonth: number;
|
|
193
|
+
currentYear: number;
|
|
194
|
+
disabled: boolean;
|
|
195
|
+
isBackArrowDisabled: boolean;
|
|
196
|
+
prevMonthAriaLabel: string;
|
|
197
|
+
nextMonthAriaLabel: string;
|
|
198
|
+
headerClass?: string;
|
|
199
|
+
navPrevClass?: string;
|
|
200
|
+
navNextClass?: string;
|
|
201
|
+
currentYearChange: EventEmitter<number>;
|
|
202
|
+
currentMonthChange: EventEmitter<number>;
|
|
203
|
+
previousMonth: EventEmitter<void>;
|
|
204
|
+
nextMonth: EventEmitter<void>;
|
|
205
|
+
onMonthSelect(value: unknown): void;
|
|
206
|
+
onYearSelect(value: unknown): void;
|
|
207
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CalendarHeaderComponent, never>;
|
|
208
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<CalendarHeaderComponent, "ngxsmk-calendar-header", never, { "monthOptions": { "alias": "monthOptions"; "required": false; }; "yearOptions": { "alias": "yearOptions"; "required": false; }; "currentMonth": { "alias": "currentMonth"; "required": false; }; "currentYear": { "alias": "currentYear"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "isBackArrowDisabled": { "alias": "isBackArrowDisabled"; "required": false; }; "prevMonthAriaLabel": { "alias": "prevMonthAriaLabel"; "required": false; }; "nextMonthAriaLabel": { "alias": "nextMonthAriaLabel"; "required": false; }; "headerClass": { "alias": "headerClass"; "required": false; }; "navPrevClass": { "alias": "navPrevClass"; "required": false; }; "navNextClass": { "alias": "navNextClass"; "required": false; }; }, { "currentYearChange": "currentYearChange"; "currentMonthChange": "currentMonthChange"; "previousMonth": "previousMonth"; "nextMonth": "nextMonth"; }, never, never, true, never>;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Complete translations interface for the datepicker component
|
|
213
|
+
*/
|
|
214
|
+
interface DatepickerTranslations {
|
|
215
|
+
selectDate: string;
|
|
216
|
+
selectTime: string;
|
|
217
|
+
clear: string;
|
|
218
|
+
close: string;
|
|
219
|
+
today: string;
|
|
220
|
+
selectEndDate: string;
|
|
221
|
+
day: string;
|
|
222
|
+
days: string;
|
|
223
|
+
previousMonth: string;
|
|
224
|
+
nextMonth: string;
|
|
225
|
+
previousYear: string;
|
|
226
|
+
nextYear: string;
|
|
227
|
+
previousYears: string;
|
|
228
|
+
nextYears: string;
|
|
229
|
+
previousDecade: string;
|
|
230
|
+
nextDecade: string;
|
|
231
|
+
clearSelection: string;
|
|
232
|
+
closeCalendar: string;
|
|
233
|
+
closeCalendarOverlay: string;
|
|
234
|
+
calendarFor: string;
|
|
235
|
+
selectYear: string;
|
|
236
|
+
selectDecade: string;
|
|
237
|
+
datesSelected: string;
|
|
238
|
+
timesSelected: string;
|
|
239
|
+
time: string;
|
|
240
|
+
startTime: string;
|
|
241
|
+
endTime: string;
|
|
242
|
+
from: string;
|
|
243
|
+
to: string;
|
|
244
|
+
holiday: string;
|
|
245
|
+
month: string;
|
|
246
|
+
year: string;
|
|
247
|
+
decade: string;
|
|
248
|
+
timeline: string;
|
|
249
|
+
timeSlider: string;
|
|
250
|
+
calendarOpened: string;
|
|
251
|
+
calendarClosed: string;
|
|
252
|
+
dateSelected: string;
|
|
253
|
+
rangeSelected: string;
|
|
254
|
+
monthChanged: string;
|
|
255
|
+
yearChanged: string;
|
|
256
|
+
calendarLoading: string;
|
|
257
|
+
calendarReady: string;
|
|
258
|
+
keyboardShortcuts: string;
|
|
259
|
+
invalidDateFormat: string;
|
|
260
|
+
dateBeforeMin: string;
|
|
261
|
+
dateAfterMax: string;
|
|
262
|
+
invalidDate: string;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Partial translations - allows overriding only specific keys
|
|
266
|
+
*/
|
|
267
|
+
type PartialDatepickerTranslations = Partial<DatepickerTranslations>;
|
|
268
|
+
|
|
269
|
+
declare class NgxsmkDatepickerContentComponent {
|
|
270
|
+
isCalendarVisible: boolean;
|
|
271
|
+
isCalendarOpen: boolean;
|
|
272
|
+
isInlineMode: boolean;
|
|
273
|
+
shouldAppendToBody: boolean;
|
|
274
|
+
theme: string;
|
|
275
|
+
popoverId: string;
|
|
276
|
+
classes: DatepickerClasses | undefined;
|
|
277
|
+
timeOnly: boolean;
|
|
278
|
+
showTime: boolean;
|
|
279
|
+
isMobile: boolean;
|
|
280
|
+
mobileModalStyle: string;
|
|
281
|
+
align: string;
|
|
282
|
+
ariaLabel: string;
|
|
283
|
+
isCalendarOpening: boolean;
|
|
284
|
+
loadingMessage: string;
|
|
285
|
+
showRanges: boolean;
|
|
286
|
+
rangesArray: {
|
|
287
|
+
key: string;
|
|
288
|
+
value: [Date, Date];
|
|
289
|
+
}[];
|
|
290
|
+
mode: 'single' | 'range' | 'multiple' | 'week' | 'month' | 'quarter' | 'year' | 'timeRange';
|
|
291
|
+
disabled: boolean;
|
|
292
|
+
calendarCount: number;
|
|
293
|
+
calendarLayout: string;
|
|
294
|
+
syncScrollEnabled: boolean;
|
|
295
|
+
calendarMonths: {
|
|
296
|
+
month: number;
|
|
297
|
+
year: number;
|
|
298
|
+
days: (Date | null)[];
|
|
299
|
+
}[];
|
|
300
|
+
weekDays: string[];
|
|
301
|
+
selectedDate: Date | null;
|
|
302
|
+
startDate: Date | null;
|
|
303
|
+
endDate: Date | null;
|
|
304
|
+
focusedDate: Date | null;
|
|
305
|
+
today: Date;
|
|
306
|
+
dateTemplate: TemplateRef<unknown> | null;
|
|
307
|
+
calendarViewMode: string;
|
|
308
|
+
monthOptions: {
|
|
309
|
+
label: string;
|
|
310
|
+
value: number;
|
|
311
|
+
}[];
|
|
312
|
+
currentMonth: number;
|
|
313
|
+
yearOptions: {
|
|
314
|
+
label: string;
|
|
315
|
+
value: number;
|
|
316
|
+
}[];
|
|
317
|
+
currentYear: number;
|
|
318
|
+
isBackArrowDisabled: boolean;
|
|
319
|
+
prevMonthAriaLabel: string;
|
|
320
|
+
nextMonthAriaLabel: string;
|
|
321
|
+
yearGrid: number[];
|
|
322
|
+
currentDecade: number;
|
|
323
|
+
decadeGrid: number[];
|
|
324
|
+
timelineStartDate: Date | null;
|
|
325
|
+
timelineEndDate: Date | null;
|
|
326
|
+
timelineMonths: Date[];
|
|
327
|
+
minuteInterval: number;
|
|
328
|
+
startTimeSlider: number;
|
|
329
|
+
endTimeSlider: number;
|
|
330
|
+
timeRangeMode: boolean;
|
|
331
|
+
hourOptions: {
|
|
332
|
+
label: string;
|
|
333
|
+
value: number;
|
|
334
|
+
}[];
|
|
335
|
+
minuteOptions: {
|
|
336
|
+
label: string;
|
|
337
|
+
value: number;
|
|
338
|
+
}[];
|
|
339
|
+
secondOptions: {
|
|
340
|
+
label: string;
|
|
341
|
+
value: number;
|
|
342
|
+
}[];
|
|
343
|
+
ampmOptions: {
|
|
344
|
+
label: string;
|
|
345
|
+
value: boolean;
|
|
346
|
+
}[];
|
|
347
|
+
currentDisplayHour: number;
|
|
348
|
+
currentMinute: number;
|
|
349
|
+
currentSecond: number;
|
|
350
|
+
isPm: boolean;
|
|
351
|
+
showSeconds: boolean;
|
|
352
|
+
use24Hour: boolean;
|
|
353
|
+
startDisplayHour: number;
|
|
354
|
+
startMinute: number;
|
|
355
|
+
startSecond: number;
|
|
356
|
+
startIsPm: boolean;
|
|
357
|
+
endDisplayHour: number;
|
|
358
|
+
endMinute: number;
|
|
359
|
+
endSecond: number;
|
|
360
|
+
endIsPm: boolean;
|
|
361
|
+
clearAriaLabel: string;
|
|
362
|
+
clearLabel: string;
|
|
363
|
+
closeAriaLabel: string;
|
|
364
|
+
closeLabel: string;
|
|
365
|
+
translations: DatepickerTranslations | null;
|
|
366
|
+
boundIsDateDisabled: (date: Date | null) => boolean;
|
|
367
|
+
boundIsSameDay: (date1: Date | null, date2: Date | null) => boolean;
|
|
368
|
+
boundIsHoliday: (date: Date | null) => boolean;
|
|
369
|
+
boundIsMultipleSelected: (date: Date | null) => boolean;
|
|
370
|
+
boundIsInRange: (date: Date | null) => boolean;
|
|
371
|
+
boundIsPreviewInRange: (date: Date | null) => boolean;
|
|
372
|
+
boundGetAriaLabel: (date: Date | null) => string;
|
|
373
|
+
boundGetDayCellCustomClasses: (date: Date | null) => string | string[] | Set<string> | {
|
|
374
|
+
[klass: string]: unknown;
|
|
375
|
+
};
|
|
376
|
+
boundGetDayCellTooltip: (date: Date | null) => string | null;
|
|
377
|
+
boundFormatDayNumber: (date: Date | null) => string;
|
|
378
|
+
getMonthYearLabel: (month: number, year: number) => string;
|
|
379
|
+
getCalendarAriaLabelForMonth: (month: number, year: number) => string;
|
|
380
|
+
isTimelineMonthSelected: (date: Date) => boolean;
|
|
381
|
+
formatTimeSliderValue: (value: number) => string;
|
|
382
|
+
backdropClick: EventEmitter<Event>;
|
|
383
|
+
touchStartContainer: EventEmitter<TouchEvent>;
|
|
384
|
+
touchMoveContainer: EventEmitter<TouchEvent>;
|
|
385
|
+
touchEndContainer: EventEmitter<TouchEvent>;
|
|
386
|
+
rangeSelect: EventEmitter<[Date, Date]>;
|
|
387
|
+
previousMonth: EventEmitter<void>;
|
|
388
|
+
nextMonth: EventEmitter<void>;
|
|
389
|
+
currentMonthChange: EventEmitter<number>;
|
|
390
|
+
currentYearChange: EventEmitter<number>;
|
|
391
|
+
dateClick: EventEmitter<Date>;
|
|
392
|
+
dateHover: EventEmitter<Date | null>;
|
|
393
|
+
dateFocus: EventEmitter<Date>;
|
|
394
|
+
swipeStart: EventEmitter<TouchEvent>;
|
|
395
|
+
swipeMove: EventEmitter<TouchEvent>;
|
|
396
|
+
swipeEnd: EventEmitter<TouchEvent>;
|
|
397
|
+
touchStart: EventEmitter<{
|
|
398
|
+
event: TouchEvent;
|
|
399
|
+
day: Date | null;
|
|
400
|
+
}>;
|
|
401
|
+
touchMove: EventEmitter<TouchEvent>;
|
|
402
|
+
touchEnd: EventEmitter<{
|
|
403
|
+
event: TouchEvent;
|
|
404
|
+
day: Date | null;
|
|
405
|
+
}>;
|
|
406
|
+
viewModeChange: EventEmitter<"year" | "month" | "decade" | "timeline" | "time-slider">;
|
|
407
|
+
changeYear: EventEmitter<number>;
|
|
408
|
+
yearClick: EventEmitter<number>;
|
|
409
|
+
changeDecade: EventEmitter<number>;
|
|
410
|
+
decadeClick: EventEmitter<number>;
|
|
411
|
+
timelineZoomOut: EventEmitter<void>;
|
|
412
|
+
timelineZoomIn: EventEmitter<void>;
|
|
413
|
+
timelineMonthClick: EventEmitter<Date>;
|
|
414
|
+
startTimeSliderChange: EventEmitter<number>;
|
|
415
|
+
endTimeSliderChange: EventEmitter<number>;
|
|
416
|
+
currentDisplayHourChange: EventEmitter<number>;
|
|
417
|
+
currentMinuteChange: EventEmitter<number>;
|
|
418
|
+
currentSecondChange: EventEmitter<number>;
|
|
419
|
+
isPmChange: EventEmitter<boolean>;
|
|
420
|
+
timeChange: EventEmitter<void>;
|
|
421
|
+
startDisplayHourChange: EventEmitter<number>;
|
|
422
|
+
startMinuteChange: EventEmitter<number>;
|
|
423
|
+
startSecondChange: EventEmitter<number>;
|
|
424
|
+
startIsPmChange: EventEmitter<boolean>;
|
|
425
|
+
endDisplayHourChange: EventEmitter<number>;
|
|
426
|
+
endMinuteChange: EventEmitter<number>;
|
|
427
|
+
endSecondChange: EventEmitter<number>;
|
|
428
|
+
endIsPmChange: EventEmitter<boolean>;
|
|
429
|
+
timeRangeChange: EventEmitter<void>;
|
|
430
|
+
clearValue: EventEmitter<MouseEvent>;
|
|
431
|
+
closeCalendar: EventEmitter<void>;
|
|
432
|
+
escapeKey: EventEmitter<Event>;
|
|
433
|
+
header?: CalendarHeaderComponent;
|
|
434
|
+
popoverContainer?: ElementRef<HTMLElement>;
|
|
435
|
+
timelineContainer?: ElementRef<HTMLElement>;
|
|
436
|
+
closeAllSelects(): void;
|
|
437
|
+
onTimelineMonthClick(month: Date, event: MouseEvent): void;
|
|
438
|
+
onTimelineMonthSpace(month: Date, event: Event): void;
|
|
439
|
+
onPopoverEscape(event: Event): void;
|
|
440
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgxsmkDatepickerContentComponent, never>;
|
|
441
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgxsmkDatepickerContentComponent, "ngxsmk-datepicker-content", never, { "isCalendarVisible": { "alias": "isCalendarVisible"; "required": false; }; "isCalendarOpen": { "alias": "isCalendarOpen"; "required": false; }; "isInlineMode": { "alias": "isInlineMode"; "required": false; }; "shouldAppendToBody": { "alias": "shouldAppendToBody"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "popoverId": { "alias": "popoverId"; "required": false; }; "classes": { "alias": "classes"; "required": false; }; "timeOnly": { "alias": "timeOnly"; "required": false; }; "showTime": { "alias": "showTime"; "required": false; }; "isMobile": { "alias": "isMobile"; "required": false; }; "mobileModalStyle": { "alias": "mobileModalStyle"; "required": false; }; "align": { "alias": "align"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "isCalendarOpening": { "alias": "isCalendarOpening"; "required": false; }; "loadingMessage": { "alias": "loadingMessage"; "required": false; }; "showRanges": { "alias": "showRanges"; "required": false; }; "rangesArray": { "alias": "rangesArray"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "calendarCount": { "alias": "calendarCount"; "required": false; }; "calendarLayout": { "alias": "calendarLayout"; "required": false; }; "syncScrollEnabled": { "alias": "syncScrollEnabled"; "required": false; }; "calendarMonths": { "alias": "calendarMonths"; "required": false; }; "weekDays": { "alias": "weekDays"; "required": false; }; "selectedDate": { "alias": "selectedDate"; "required": false; }; "startDate": { "alias": "startDate"; "required": false; }; "endDate": { "alias": "endDate"; "required": false; }; "focusedDate": { "alias": "focusedDate"; "required": false; }; "today": { "alias": "today"; "required": false; }; "dateTemplate": { "alias": "dateTemplate"; "required": false; }; "calendarViewMode": { "alias": "calendarViewMode"; "required": false; }; "monthOptions": { "alias": "monthOptions"; "required": false; }; "currentMonth": { "alias": "currentMonth"; "required": false; }; "yearOptions": { "alias": "yearOptions"; "required": false; }; "currentYear": { "alias": "currentYear"; "required": false; }; "isBackArrowDisabled": { "alias": "isBackArrowDisabled"; "required": false; }; "prevMonthAriaLabel": { "alias": "prevMonthAriaLabel"; "required": false; }; "nextMonthAriaLabel": { "alias": "nextMonthAriaLabel"; "required": false; }; "yearGrid": { "alias": "yearGrid"; "required": false; }; "currentDecade": { "alias": "currentDecade"; "required": false; }; "decadeGrid": { "alias": "decadeGrid"; "required": false; }; "timelineStartDate": { "alias": "timelineStartDate"; "required": false; }; "timelineEndDate": { "alias": "timelineEndDate"; "required": false; }; "timelineMonths": { "alias": "timelineMonths"; "required": false; }; "minuteInterval": { "alias": "minuteInterval"; "required": false; }; "startTimeSlider": { "alias": "startTimeSlider"; "required": false; }; "endTimeSlider": { "alias": "endTimeSlider"; "required": false; }; "timeRangeMode": { "alias": "timeRangeMode"; "required": false; }; "hourOptions": { "alias": "hourOptions"; "required": false; }; "minuteOptions": { "alias": "minuteOptions"; "required": false; }; "secondOptions": { "alias": "secondOptions"; "required": false; }; "ampmOptions": { "alias": "ampmOptions"; "required": false; }; "currentDisplayHour": { "alias": "currentDisplayHour"; "required": false; }; "currentMinute": { "alias": "currentMinute"; "required": false; }; "currentSecond": { "alias": "currentSecond"; "required": false; }; "isPm": { "alias": "isPm"; "required": false; }; "showSeconds": { "alias": "showSeconds"; "required": false; }; "use24Hour": { "alias": "use24Hour"; "required": false; }; "startDisplayHour": { "alias": "startDisplayHour"; "required": false; }; "startMinute": { "alias": "startMinute"; "required": false; }; "startSecond": { "alias": "startSecond"; "required": false; }; "startIsPm": { "alias": "startIsPm"; "required": false; }; "endDisplayHour": { "alias": "endDisplayHour"; "required": false; }; "endMinute": { "alias": "endMinute"; "required": false; }; "endSecond": { "alias": "endSecond"; "required": false; }; "endIsPm": { "alias": "endIsPm"; "required": false; }; "clearAriaLabel": { "alias": "clearAriaLabel"; "required": false; }; "clearLabel": { "alias": "clearLabel"; "required": false; }; "closeAriaLabel": { "alias": "closeAriaLabel"; "required": false; }; "closeLabel": { "alias": "closeLabel"; "required": false; }; "translations": { "alias": "translations"; "required": false; }; "boundIsDateDisabled": { "alias": "boundIsDateDisabled"; "required": false; }; "boundIsSameDay": { "alias": "boundIsSameDay"; "required": false; }; "boundIsHoliday": { "alias": "boundIsHoliday"; "required": false; }; "boundIsMultipleSelected": { "alias": "boundIsMultipleSelected"; "required": false; }; "boundIsInRange": { "alias": "boundIsInRange"; "required": false; }; "boundIsPreviewInRange": { "alias": "boundIsPreviewInRange"; "required": false; }; "boundGetAriaLabel": { "alias": "boundGetAriaLabel"; "required": false; }; "boundGetDayCellCustomClasses": { "alias": "boundGetDayCellCustomClasses"; "required": false; }; "boundGetDayCellTooltip": { "alias": "boundGetDayCellTooltip"; "required": false; }; "boundFormatDayNumber": { "alias": "boundFormatDayNumber"; "required": false; }; "getMonthYearLabel": { "alias": "getMonthYearLabel"; "required": false; }; "getCalendarAriaLabelForMonth": { "alias": "getCalendarAriaLabelForMonth"; "required": false; }; "isTimelineMonthSelected": { "alias": "isTimelineMonthSelected"; "required": false; }; "formatTimeSliderValue": { "alias": "formatTimeSliderValue"; "required": false; }; }, { "backdropClick": "backdropClick"; "touchStartContainer": "touchStartContainer"; "touchMoveContainer": "touchMoveContainer"; "touchEndContainer": "touchEndContainer"; "rangeSelect": "rangeSelect"; "previousMonth": "previousMonth"; "nextMonth": "nextMonth"; "currentMonthChange": "currentMonthChange"; "currentYearChange": "currentYearChange"; "dateClick": "dateClick"; "dateHover": "dateHover"; "dateFocus": "dateFocus"; "swipeStart": "swipeStart"; "swipeMove": "swipeMove"; "swipeEnd": "swipeEnd"; "touchStart": "touchStart"; "touchMove": "touchMove"; "touchEnd": "touchEnd"; "viewModeChange": "viewModeChange"; "changeYear": "changeYear"; "yearClick": "yearClick"; "changeDecade": "changeDecade"; "decadeClick": "decadeClick"; "timelineZoomOut": "timelineZoomOut"; "timelineZoomIn": "timelineZoomIn"; "timelineMonthClick": "timelineMonthClick"; "startTimeSliderChange": "startTimeSliderChange"; "endTimeSliderChange": "endTimeSliderChange"; "currentDisplayHourChange": "currentDisplayHourChange"; "currentMinuteChange": "currentMinuteChange"; "currentSecondChange": "currentSecondChange"; "isPmChange": "isPmChange"; "timeChange": "timeChange"; "startDisplayHourChange": "startDisplayHourChange"; "startMinuteChange": "startMinuteChange"; "startSecondChange": "startSecondChange"; "startIsPmChange": "startIsPmChange"; "endDisplayHourChange": "endDisplayHourChange"; "endMinuteChange": "endMinuteChange"; "endSecondChange": "endSecondChange"; "endIsPmChange": "endIsPmChange"; "timeRangeChange": "timeRangeChange"; "clearValue": "clearValue"; "closeCalendar": "closeCalendar"; "escapeKey": "escapeKey"; }, never, never, true, never>;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
interface DayCellRenderHook {
|
|
445
|
+
getDayCellClasses?(date: Date, isSelected: boolean, isDisabled: boolean, isToday: boolean, isHoliday: boolean): string[];
|
|
446
|
+
getDayCellTooltip?(date: Date, holidayLabel: string | null): string | null;
|
|
447
|
+
formatDayNumber?(date: Date): string;
|
|
448
|
+
}
|
|
449
|
+
interface ValidationHook {
|
|
450
|
+
validateDate?(date: Date, currentValue: DatepickerValue, mode: 'single' | 'range' | 'multiple' | 'week' | 'month' | 'quarter' | 'year' | 'timeRange'): boolean;
|
|
451
|
+
validateRange?(startDate: Date, endDate: Date): boolean;
|
|
452
|
+
getValidationError?(date: Date): string | null;
|
|
453
|
+
}
|
|
454
|
+
interface KeyboardShortcutHook {
|
|
455
|
+
handleShortcut?(event: KeyboardEvent, context: KeyboardShortcutContext): boolean;
|
|
456
|
+
getShortcutHelp?(): KeyboardShortcutHelp[];
|
|
457
|
+
}
|
|
458
|
+
interface KeyboardShortcutContext {
|
|
459
|
+
currentDate: Date;
|
|
460
|
+
selectedDate: Date | null;
|
|
461
|
+
startDate: Date | null;
|
|
462
|
+
endDate: Date | null;
|
|
463
|
+
selectedDates: Date[];
|
|
464
|
+
mode: 'single' | 'range' | 'multiple' | 'week' | 'month' | 'quarter' | 'year' | 'timeRange';
|
|
465
|
+
focusedDate: Date | null;
|
|
466
|
+
isCalendarOpen: boolean;
|
|
467
|
+
}
|
|
468
|
+
interface KeyboardShortcutHelp {
|
|
469
|
+
key: string;
|
|
470
|
+
description: string;
|
|
471
|
+
modifiers?: string[];
|
|
472
|
+
}
|
|
473
|
+
interface DateFormatHook {
|
|
474
|
+
formatDisplayValue?(value: DatepickerValue, mode: 'single' | 'range' | 'multiple' | 'week' | 'month' | 'quarter' | 'year' | 'timeRange'): string;
|
|
475
|
+
formatAriaLabel?(date: Date): string;
|
|
476
|
+
}
|
|
477
|
+
interface EventHook {
|
|
478
|
+
beforeDateSelect?(date: Date, currentValue: DatepickerValue): boolean;
|
|
479
|
+
afterDateSelect?(date: Date, newValue: DatepickerValue): void;
|
|
480
|
+
onCalendarOpen?(): void;
|
|
481
|
+
onCalendarClose?(): void;
|
|
482
|
+
}
|
|
483
|
+
interface DatepickerHooks extends DayCellRenderHook, ValidationHook, KeyboardShortcutHook, DateFormatHook, EventHook {
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Date Adapter Interface
|
|
488
|
+
*
|
|
489
|
+
* Allows consumers to swap formatting/parsing logic with external date libraries
|
|
490
|
+
* like date-fns, dayjs, or Luxon.
|
|
491
|
+
*/
|
|
492
|
+
interface DateAdapter {
|
|
493
|
+
/**
|
|
494
|
+
* Parse a date from a string or value
|
|
495
|
+
* @param value - The value to parse (string, Date, or library-specific type)
|
|
496
|
+
* @param onError - Optional callback for error handling. Called when parsing fails.
|
|
497
|
+
* @returns A Date object or null if parsing fails
|
|
498
|
+
*/
|
|
499
|
+
parse(value: string | Date | number | unknown, onError?: (error: Error) => void): Date | null;
|
|
500
|
+
/**
|
|
501
|
+
* Format a date to a string
|
|
502
|
+
* @param date - The date to format
|
|
503
|
+
* @param format - Format string (library-specific)
|
|
504
|
+
* @param locale - Locale string (e.g., 'en-US')
|
|
505
|
+
* @returns Formatted date string
|
|
506
|
+
*/
|
|
507
|
+
format(date: Date, format?: string, locale?: string): string;
|
|
508
|
+
/**
|
|
509
|
+
* Check if a value is a valid date
|
|
510
|
+
* @param value - The value to check
|
|
511
|
+
* @returns True if the value is a valid date
|
|
512
|
+
*/
|
|
513
|
+
isValid(value: string | Date | number | unknown): boolean;
|
|
514
|
+
/**
|
|
515
|
+
* Get the start of day for a date
|
|
516
|
+
* @param date - The date
|
|
517
|
+
* @returns Date at start of day
|
|
518
|
+
*/
|
|
519
|
+
startOfDay(date: Date): Date;
|
|
520
|
+
/**
|
|
521
|
+
* Get the end of day for a date
|
|
522
|
+
* @param date - The date
|
|
523
|
+
* @returns Date at end of day
|
|
524
|
+
*/
|
|
525
|
+
endOfDay(date: Date): Date;
|
|
526
|
+
/**
|
|
527
|
+
* Add months to a date
|
|
528
|
+
* @param date - The date
|
|
529
|
+
* @param months - Number of months to add
|
|
530
|
+
* @returns New date with months added
|
|
531
|
+
*/
|
|
532
|
+
addMonths(date: Date, months: number): Date;
|
|
533
|
+
/**
|
|
534
|
+
* Add days to a date
|
|
535
|
+
* @param date - The date
|
|
536
|
+
* @param days - Number of days to add
|
|
537
|
+
* @returns New date with days added
|
|
538
|
+
*/
|
|
539
|
+
addDays(date: Date, days: number): Date;
|
|
540
|
+
/**
|
|
541
|
+
* Check if two dates are the same day
|
|
542
|
+
* @param date1 - First date
|
|
543
|
+
* @param date2 - Second date
|
|
544
|
+
* @returns True if dates are the same day
|
|
545
|
+
*/
|
|
546
|
+
isSameDay(date1: Date | null, date2: Date | null): boolean;
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* Default Date Adapter using native JavaScript Date
|
|
550
|
+
*/
|
|
551
|
+
declare class NativeDateAdapter implements DateAdapter {
|
|
552
|
+
parse(value: string | Date | number | unknown, onError?: (error: Error) => void): Date | null;
|
|
553
|
+
format(date: Date, _format?: string, locale?: string): string;
|
|
554
|
+
isValid(value: string | Date | number | unknown): boolean;
|
|
555
|
+
startOfDay(date: Date): Date;
|
|
556
|
+
endOfDay(date: Date): Date;
|
|
557
|
+
addMonths(date: Date, months: number): Date;
|
|
558
|
+
addDays(date: Date, days: number): Date;
|
|
559
|
+
isSameDay(date1: Date | null, date2: Date | null): boolean;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
interface DatepickerConfig {
|
|
563
|
+
weekStart?: number | null;
|
|
564
|
+
minuteInterval?: number;
|
|
565
|
+
holidayProvider?: HolidayProvider | null;
|
|
566
|
+
yearRange?: number;
|
|
567
|
+
locale?: string;
|
|
568
|
+
timezone?: string;
|
|
569
|
+
minDate?: Date | string | null;
|
|
570
|
+
maxDate?: Date | string | null;
|
|
571
|
+
dateAdapter?: DateAdapter;
|
|
572
|
+
animations?: AnimationConfig;
|
|
573
|
+
autoDetectMobile?: boolean;
|
|
574
|
+
mobileModalStyle?: 'bottom-sheet' | 'center' | 'fullscreen';
|
|
575
|
+
}
|
|
576
|
+
interface AnimationConfig {
|
|
577
|
+
enabled?: boolean;
|
|
578
|
+
duration?: number;
|
|
579
|
+
easing?: string;
|
|
580
|
+
property?: string;
|
|
581
|
+
respectReducedMotion?: boolean;
|
|
582
|
+
}
|
|
583
|
+
declare const DEFAULT_ANIMATION_CONFIG: Required<AnimationConfig>;
|
|
584
|
+
declare const DATEPICKER_CONFIG: InjectionToken<DatepickerConfig>;
|
|
585
|
+
declare const DEFAULT_DATEPICKER_CONFIG: DatepickerConfig;
|
|
586
|
+
declare function provideDatepickerConfig(config: DatepickerConfig): {
|
|
587
|
+
provide: InjectionToken<DatepickerConfig>;
|
|
588
|
+
useValue: {
|
|
589
|
+
weekStart?: number | null;
|
|
590
|
+
minuteInterval?: number;
|
|
591
|
+
holidayProvider?: HolidayProvider | null;
|
|
592
|
+
yearRange?: number;
|
|
593
|
+
locale?: string;
|
|
594
|
+
timezone?: string;
|
|
595
|
+
minDate?: Date | string | null;
|
|
596
|
+
maxDate?: Date | string | null;
|
|
597
|
+
dateAdapter?: DateAdapter;
|
|
598
|
+
animations?: AnimationConfig;
|
|
599
|
+
autoDetectMobile?: boolean;
|
|
600
|
+
mobileModalStyle?: "bottom-sheet" | "center" | "fullscreen";
|
|
601
|
+
};
|
|
602
|
+
};
|
|
603
|
+
|
|
604
|
+
interface ValidationError {
|
|
605
|
+
kind: string;
|
|
606
|
+
message?: string;
|
|
607
|
+
}
|
|
608
|
+
type SignalFormFieldConfig = {
|
|
609
|
+
value?: DatepickerValue | string | (() => DatepickerValue | string) | {
|
|
610
|
+
(): DatepickerValue | string;
|
|
611
|
+
} | Signal<DatepickerValue | string>;
|
|
612
|
+
disabled?: boolean | (() => boolean) | {
|
|
613
|
+
(): boolean;
|
|
614
|
+
} | Signal<boolean>;
|
|
615
|
+
required?: boolean | (() => boolean) | {
|
|
616
|
+
(): boolean;
|
|
617
|
+
} | Signal<boolean>;
|
|
618
|
+
errors?: ValidationError[] | (() => ValidationError[]) | {
|
|
619
|
+
(): ValidationError[];
|
|
620
|
+
} | Signal<ValidationError[]>;
|
|
621
|
+
valid?: boolean | (() => boolean) | {
|
|
622
|
+
(): boolean;
|
|
623
|
+
} | Signal<boolean>;
|
|
624
|
+
invalid?: boolean | (() => boolean) | {
|
|
625
|
+
(): boolean;
|
|
626
|
+
} | Signal<boolean>;
|
|
627
|
+
touched?: boolean | (() => boolean) | {
|
|
628
|
+
(): boolean;
|
|
629
|
+
} | Signal<boolean>;
|
|
630
|
+
setValue?: (value: DatepickerValue | string) => void;
|
|
631
|
+
updateValue?: (updater: () => DatepickerValue | string) => void;
|
|
632
|
+
markAsDirty?: () => void;
|
|
633
|
+
markAsTouched?: () => void;
|
|
634
|
+
};
|
|
635
|
+
type SignalFormField = unknown;
|
|
636
|
+
interface FieldSyncCallbacks {
|
|
637
|
+
onValueChanged: (value: DatepickerValue) => void;
|
|
638
|
+
onDisabledChanged: (disabled: boolean) => void;
|
|
639
|
+
onRequiredChanged?: (required: boolean) => void;
|
|
640
|
+
onErrorStateChanged?: (hasError: boolean) => void;
|
|
641
|
+
onSyncError: (error: unknown) => void;
|
|
642
|
+
normalizeValue: (value: unknown) => DatepickerValue;
|
|
643
|
+
isValueEqual: (val1: DatepickerValue, val2: DatepickerValue) => boolean;
|
|
644
|
+
onCalendarGenerated?: () => void;
|
|
645
|
+
onStateChanged?: () => void;
|
|
646
|
+
}
|
|
647
|
+
declare class FieldSyncService {
|
|
648
|
+
private _fieldEffectRef;
|
|
649
|
+
private _lastKnownFieldValue;
|
|
650
|
+
private _isUpdatingFromInternal;
|
|
651
|
+
private readonly injector;
|
|
652
|
+
private readFieldValue;
|
|
653
|
+
private readDisabledState;
|
|
654
|
+
private readFieldErrors;
|
|
655
|
+
private readRequiredState;
|
|
656
|
+
private hasValidationErrors;
|
|
657
|
+
private resolveField;
|
|
658
|
+
setupFieldSync(fieldInput: SignalFormField, callbacks: FieldSyncCallbacks): EffectRef | null;
|
|
659
|
+
syncFieldValue(fieldInput: SignalFormField | Signal<SignalFormField> | (() => unknown) | unknown, callbacks: FieldSyncCallbacks): boolean;
|
|
660
|
+
updateFieldFromInternal(value: DatepickerValue, fieldInput: SignalFormField | Signal<SignalFormField> | (() => unknown) | unknown): void;
|
|
661
|
+
getLastKnownValue(): DatepickerValue | undefined;
|
|
662
|
+
markAsTouched(fieldInput: SignalFormField | Signal<SignalFormField> | (() => unknown) | unknown): void;
|
|
663
|
+
cleanup(): void;
|
|
664
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FieldSyncService, never>;
|
|
665
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<FieldSyncService>;
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
interface TranslationService {
|
|
669
|
+
translate(key: string, params?: Record<string, string | number>): string;
|
|
670
|
+
getCurrentLocale(): string;
|
|
671
|
+
}
|
|
672
|
+
declare class DefaultTranslationService implements TranslationService {
|
|
673
|
+
private translations;
|
|
674
|
+
private locale;
|
|
675
|
+
private readonly translationRegistry;
|
|
676
|
+
constructor();
|
|
677
|
+
initialize(translations: DatepickerTranslations, locale?: string): void;
|
|
678
|
+
initializeFromLocale(locale: string): void;
|
|
679
|
+
translate(key: string, params?: Record<string, string | number>): string;
|
|
680
|
+
getCurrentLocale(): string;
|
|
681
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DefaultTranslationService, never>;
|
|
682
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<DefaultTranslationService>;
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
interface TouchGestureState {
|
|
686
|
+
touchStartTime: number;
|
|
687
|
+
touchStartElement: EventTarget | null;
|
|
688
|
+
dateCellTouchStartTime: number;
|
|
689
|
+
dateCellTouchStartDate: Date | null;
|
|
690
|
+
dateCellTouchStartX: number;
|
|
691
|
+
dateCellTouchStartY: number;
|
|
692
|
+
isDateCellTouching: boolean;
|
|
693
|
+
lastDateCellTouchDate: Date | null;
|
|
694
|
+
dateCellTouchHandled: boolean;
|
|
695
|
+
calendarSwipeStartX: number;
|
|
696
|
+
calendarSwipeStartY: number;
|
|
697
|
+
calendarSwipeStartTime: number;
|
|
698
|
+
isCalendarSwiping: boolean;
|
|
699
|
+
hoveredDate: Date | null;
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
/** Recurring date pattern configuration for disabled dates. */
|
|
703
|
+
type RecurringPatternInput = {
|
|
704
|
+
pattern: 'daily' | 'weekly' | 'monthly' | 'yearly' | 'weekdays' | 'weekends';
|
|
705
|
+
startDate: Date;
|
|
706
|
+
endDate?: Date;
|
|
707
|
+
dayOfWeek?: number;
|
|
708
|
+
dayOfMonth?: number;
|
|
709
|
+
interval?: number;
|
|
710
|
+
} | null;
|
|
711
|
+
/**
|
|
712
|
+
* Interface for Angular Material Form Field Control compatibility.
|
|
713
|
+
* We define it here to avoid a direct dependency on @angular/material.
|
|
714
|
+
*/
|
|
715
|
+
interface MatFormFieldControlMock<T> {
|
|
716
|
+
value: T | null;
|
|
717
|
+
stateChanges: Subject<void>;
|
|
718
|
+
id: string;
|
|
719
|
+
placeholder: string;
|
|
720
|
+
ngControl: NgControl | null;
|
|
721
|
+
focused: boolean;
|
|
722
|
+
empty: boolean;
|
|
723
|
+
shouldLabelFloat: boolean;
|
|
724
|
+
required: boolean;
|
|
725
|
+
disabled: boolean;
|
|
726
|
+
errorState: boolean;
|
|
727
|
+
controlType?: string;
|
|
728
|
+
autofilled?: boolean;
|
|
729
|
+
userAriaDescribedBy?: string;
|
|
730
|
+
setDescribedByIds(ids: string[]): void;
|
|
731
|
+
onContainerClick(event: MouseEvent): void;
|
|
732
|
+
}
|
|
733
|
+
declare class NgxsmkDatepickerComponent implements OnInit, OnChanges, OnDestroy, AfterViewInit, ControlValueAccessor, MatFormFieldControlMock<DatepickerValue> {
|
|
734
|
+
private static _idCounter;
|
|
735
|
+
private static readonly _allInstances;
|
|
736
|
+
private static _materialSupportRegistered;
|
|
737
|
+
private static _patchMetadataArrays;
|
|
738
|
+
static withMaterialSupport(matFormFieldControlToken: any, targetCmp?: any): void;
|
|
739
|
+
_uniqueId: string;
|
|
740
|
+
mode: 'single' | 'range' | 'multiple' | 'week' | 'month' | 'quarter' | 'year' | 'timeRange';
|
|
741
|
+
calendarViewMode: 'month' | 'year' | 'decade' | 'timeline' | 'time-slider';
|
|
742
|
+
isInvalidDate: (date: Date) => boolean;
|
|
743
|
+
showRanges: boolean;
|
|
744
|
+
showTime: boolean;
|
|
745
|
+
timeOnly: boolean;
|
|
746
|
+
timeRangeMode: boolean;
|
|
747
|
+
showCalendarButton: boolean;
|
|
748
|
+
minuteInterval: number;
|
|
749
|
+
use24Hour: boolean;
|
|
750
|
+
secondInterval: number;
|
|
751
|
+
showSeconds: boolean;
|
|
752
|
+
holidayProvider: HolidayProvider | null;
|
|
753
|
+
disableHolidays: boolean;
|
|
754
|
+
disabledDates: (string | Date)[];
|
|
755
|
+
disabledRanges: Array<{
|
|
756
|
+
start: Date | string;
|
|
757
|
+
end: Date | string;
|
|
758
|
+
}>;
|
|
759
|
+
recurringPattern?: RecurringPatternInput;
|
|
760
|
+
dateTemplate: TemplateRef<unknown> | null;
|
|
761
|
+
private _placeholder;
|
|
762
|
+
set placeholder(value: string | null);
|
|
763
|
+
get placeholder(): string;
|
|
764
|
+
inline: boolean | 'always' | 'auto';
|
|
765
|
+
private _inputId;
|
|
766
|
+
set inputId(value: string);
|
|
767
|
+
get inputId(): string;
|
|
768
|
+
private _name;
|
|
769
|
+
set name(value: string);
|
|
770
|
+
get name(): string;
|
|
771
|
+
private _autocomplete;
|
|
772
|
+
set autocomplete(value: string);
|
|
773
|
+
get autocomplete(): string;
|
|
774
|
+
translations?: PartialDatepickerTranslations;
|
|
775
|
+
translationService?: TranslationService;
|
|
776
|
+
clearLabel: string;
|
|
777
|
+
closeLabel: string;
|
|
778
|
+
prevMonthAriaLabel: string;
|
|
779
|
+
nextMonthAriaLabel: string;
|
|
780
|
+
clearAriaLabel: string;
|
|
781
|
+
closeAriaLabel: string;
|
|
782
|
+
get _clearLabel(): string;
|
|
783
|
+
get _closeLabel(): string;
|
|
784
|
+
get _prevMonthAriaLabel(): string;
|
|
785
|
+
get _nextMonthAriaLabel(): string;
|
|
786
|
+
get _clearAriaLabel(): string;
|
|
787
|
+
get _closeAriaLabel(): string;
|
|
788
|
+
weekStart: number | null;
|
|
789
|
+
private readonly _yearRange;
|
|
790
|
+
set yearRange(value: number);
|
|
791
|
+
get yearRange(): number;
|
|
792
|
+
timezone?: string;
|
|
793
|
+
hooks: DatepickerHooks | null;
|
|
794
|
+
enableKeyboardShortcuts: boolean;
|
|
795
|
+
customShortcuts: {
|
|
796
|
+
[key: string]: (context: KeyboardShortcutContext) => boolean;
|
|
797
|
+
} | null;
|
|
798
|
+
autoApplyClose: boolean;
|
|
799
|
+
/**
|
|
800
|
+
* Range mode only: allow a one-day range by clicking the same date twice, or by closing the popover
|
|
801
|
+
* with only a start date selected (start and end will both be that day).
|
|
802
|
+
*/
|
|
803
|
+
allowSameDay: boolean;
|
|
804
|
+
displayFormat?: string;
|
|
805
|
+
allowTyping: boolean;
|
|
806
|
+
private _calendarCount;
|
|
807
|
+
set calendarCount(value: number);
|
|
808
|
+
get calendarCount(): number;
|
|
809
|
+
calendarLayout: 'horizontal' | 'vertical' | 'auto';
|
|
810
|
+
defaultMonthOffset: number;
|
|
811
|
+
/**
|
|
812
|
+
* Configuration for synchronous scrolling in multi-calendar mode.
|
|
813
|
+
* Keeps calendars in sync by enforcing consistent month offsets across visible calendars.
|
|
814
|
+
*
|
|
815
|
+
* @example
|
|
816
|
+
* ```typescript
|
|
817
|
+
* // Keep calendars exactly 1 month apart
|
|
818
|
+
* <ngxsmk-datepicker
|
|
819
|
+
* [calendarCount]="2"
|
|
820
|
+
* [syncScroll]="{ enabled: true, monthGap: 1 }">
|
|
821
|
+
* </ngxsmk-datepicker>
|
|
822
|
+
*
|
|
823
|
+
* // Disable sync scroll (independent navigation)
|
|
824
|
+
* <ngxsmk-datepicker
|
|
825
|
+
* [calendarCount]="3"
|
|
826
|
+
* [syncScroll]="{ enabled: false }">
|
|
827
|
+
* </ngxsmk-datepicker>
|
|
828
|
+
* ```
|
|
829
|
+
*/
|
|
830
|
+
syncScroll: {
|
|
831
|
+
enabled?: boolean;
|
|
832
|
+
monthGap?: number;
|
|
833
|
+
};
|
|
834
|
+
align: 'left' | 'right' | 'center';
|
|
835
|
+
useNativePicker: boolean;
|
|
836
|
+
enableHapticFeedback: boolean;
|
|
837
|
+
mobileModalStyle: 'bottom-sheet' | 'center' | 'fullscreen';
|
|
838
|
+
mobileTimePickerStyle: 'wheel' | 'slider' | 'native';
|
|
839
|
+
enablePullToRefresh: boolean;
|
|
840
|
+
mobileTheme: 'compact' | 'comfortable' | 'spacious';
|
|
841
|
+
enableVoiceInput: boolean;
|
|
842
|
+
autoDetectMobile: boolean;
|
|
843
|
+
disableFocusTrap: boolean;
|
|
844
|
+
appendToBody: boolean;
|
|
845
|
+
private readonly appRef;
|
|
846
|
+
private readonly document;
|
|
847
|
+
portalTemplate: TemplateRef<unknown>;
|
|
848
|
+
private portalViewRef;
|
|
849
|
+
get _shouldAppendToBody(): boolean;
|
|
850
|
+
/**
|
|
851
|
+
* Detects if the datepicker is rendered inside a modal/dialog so the calendar
|
|
852
|
+
* can be appended to body and positioned above the modal.
|
|
853
|
+
*/
|
|
854
|
+
private isInsideModal;
|
|
855
|
+
private readonly _isCalendarOpen;
|
|
856
|
+
get isCalendarOpen(): boolean;
|
|
857
|
+
set isCalendarOpen(value: boolean);
|
|
858
|
+
private isOpeningCalendar;
|
|
859
|
+
/** Public getter for template: true while calendar is opening/generating (loading state). */
|
|
860
|
+
get isCalendarOpening(): boolean;
|
|
861
|
+
/** Returns translated "Loading calendar..." for template and ARIA. */
|
|
862
|
+
getCalendarLoadingMessage(): string;
|
|
863
|
+
private openCalendarTimeoutId;
|
|
864
|
+
private lastToggleTime;
|
|
865
|
+
private touchStartTime;
|
|
866
|
+
private touchStartElement;
|
|
867
|
+
private pointerDownTime;
|
|
868
|
+
private isPointerEvent;
|
|
869
|
+
private previousFocusElement;
|
|
870
|
+
private _value;
|
|
871
|
+
set value(val: DatepickerValue);
|
|
872
|
+
get value(): DatepickerValue;
|
|
873
|
+
private _field;
|
|
874
|
+
private _fieldEffectRef;
|
|
875
|
+
set field(field: SignalFormField);
|
|
876
|
+
get field(): SignalFormField;
|
|
877
|
+
private syncFieldValue;
|
|
878
|
+
private _startAtDate;
|
|
879
|
+
set startAt(value: DateInput | null);
|
|
880
|
+
private _locale;
|
|
881
|
+
set locale(value: string);
|
|
882
|
+
get locale(): string;
|
|
883
|
+
theme: 'light' | 'dark';
|
|
884
|
+
get isDarkMode(): boolean;
|
|
885
|
+
private _dateFormatPattern;
|
|
886
|
+
private customDateFormatService;
|
|
887
|
+
set dateFormatPattern(value: string | null);
|
|
888
|
+
get dateFormatPattern(): string | null;
|
|
889
|
+
private _animationConfig;
|
|
890
|
+
/**
|
|
891
|
+
* Animation configuration allowing customization of animation duration, easing, and reduction.
|
|
892
|
+
* Supports prefers-reduced-motion accessibility preference automatically.
|
|
893
|
+
*
|
|
894
|
+
* @example
|
|
895
|
+
* ```typescript
|
|
896
|
+
* // Disable all animations
|
|
897
|
+
* <ngxsmk-datepicker [animationConfig]="{ enabled: false }"></ngxsmk-datepicker>
|
|
898
|
+
*
|
|
899
|
+
* // Custom animation duration and easing
|
|
900
|
+
* <ngxsmk-datepicker [animationConfig]="{ duration: 300, easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)' }"></ngxsmk-datepicker>
|
|
901
|
+
*
|
|
902
|
+
* // Disable specific animation properties
|
|
903
|
+
* <ngxsmk-datepicker [animationConfig]="{ property: 'opacity' }"></ngxsmk-datepicker>
|
|
904
|
+
* ```
|
|
905
|
+
*/
|
|
906
|
+
set animationConfig(value: AnimationConfig | null);
|
|
907
|
+
get animationConfig(): AnimationConfig | null;
|
|
908
|
+
private _rtl;
|
|
909
|
+
set rtl(value: boolean | null);
|
|
910
|
+
get rtl(): boolean | null;
|
|
911
|
+
get isRtl(): boolean;
|
|
912
|
+
get rtlClass(): boolean;
|
|
913
|
+
classes?: DatepickerClasses | undefined;
|
|
914
|
+
private onChange;
|
|
915
|
+
private onTouched;
|
|
916
|
+
disabled: boolean;
|
|
917
|
+
set disabledState(isDisabled: boolean);
|
|
918
|
+
/**
|
|
919
|
+
* Subject used for Material Form Field integration.
|
|
920
|
+
* Emits when the component's state changes (disabled, required, error state, etc.)
|
|
921
|
+
*
|
|
922
|
+
* @remarks
|
|
923
|
+
* This Subject is required for Angular Material's form field control interface.
|
|
924
|
+
* It allows Material form fields to track state changes and update their appearance
|
|
925
|
+
* accordingly (e.g., showing error states, floating labels, etc.).
|
|
926
|
+
*
|
|
927
|
+
* The Subject is properly cleaned up in ngOnDestroy() to prevent memory leaks.
|
|
928
|
+
* It's marked as readonly to prevent external code from reassigning it.
|
|
929
|
+
*/
|
|
930
|
+
readonly stateChanges: Subject<void>;
|
|
931
|
+
private _focused;
|
|
932
|
+
private _required;
|
|
933
|
+
private _errorState;
|
|
934
|
+
get focused(): boolean;
|
|
935
|
+
get empty(): boolean;
|
|
936
|
+
get shouldLabelFloat(): boolean;
|
|
937
|
+
get required(): boolean;
|
|
938
|
+
set required(value: boolean);
|
|
939
|
+
get errorState(): boolean;
|
|
940
|
+
set errorState(value: boolean);
|
|
941
|
+
get controlType(): string;
|
|
942
|
+
get autofilled(): boolean;
|
|
943
|
+
get id(): string;
|
|
944
|
+
get describedBy(): string;
|
|
945
|
+
/**
|
|
946
|
+
* Aria describedby ID provided by the user or the parent form field.
|
|
947
|
+
* Required for Angular Material form field control interface.
|
|
948
|
+
*/
|
|
949
|
+
userAriaDescribedBy: string;
|
|
950
|
+
setDescribedByIds(ids: string[]): void;
|
|
951
|
+
onContainerClick(_event: MouseEvent): void;
|
|
952
|
+
valueChange: EventEmitter<DatepickerValue>;
|
|
953
|
+
action: EventEmitter<{
|
|
954
|
+
type: string;
|
|
955
|
+
payload?: unknown;
|
|
956
|
+
}>;
|
|
957
|
+
/** Emitted when validation fails (e.g. invalid typed date, date before min, after max). Message is translated. */
|
|
958
|
+
validationError: EventEmitter<{
|
|
959
|
+
code: string;
|
|
960
|
+
message: string;
|
|
961
|
+
}>;
|
|
962
|
+
private _validationErrorMessage;
|
|
963
|
+
/** User-facing validation error message when set (e.g. from typed input or min/max). */
|
|
964
|
+
get validationErrorMessage(): string | null;
|
|
965
|
+
private setValidationError;
|
|
966
|
+
private clearValidationError;
|
|
967
|
+
private _minDate;
|
|
968
|
+
set minDate(value: DateInput | null);
|
|
969
|
+
get minDate(): DateInput | null;
|
|
970
|
+
private _maxDate;
|
|
971
|
+
set maxDate(value: DateInput | null);
|
|
972
|
+
get maxDate(): DateInput | null;
|
|
973
|
+
private _ranges;
|
|
974
|
+
set ranges(value: DateRange | null);
|
|
975
|
+
currentDate: Date;
|
|
976
|
+
daysInMonth: (Date | null)[];
|
|
977
|
+
multiCalendarMonths: Array<{
|
|
978
|
+
month: number;
|
|
979
|
+
year: number;
|
|
980
|
+
days: (Date | null)[];
|
|
981
|
+
}>;
|
|
982
|
+
/**
|
|
983
|
+
* LRU (Least Recently Used) cache for calendar month generation.
|
|
984
|
+
* Caches generated month arrays to avoid recalculating the same months.
|
|
985
|
+
*
|
|
986
|
+
* @remarks
|
|
987
|
+
* Performance characteristics:
|
|
988
|
+
* - Calendar generation: O(1) per month when cached
|
|
989
|
+
* - Cache lookup: O(1) average case
|
|
990
|
+
* - Cache eviction: O(n) where n = cache size (only when cache is full)
|
|
991
|
+
*
|
|
992
|
+
* The cache automatically evicts the least recently used entry when it reaches
|
|
993
|
+
* MAX_CACHE_SIZE to prevent unbounded memory growth. This is especially important
|
|
994
|
+
* for applications with many datepicker instances or long-running sessions.
|
|
995
|
+
*/
|
|
996
|
+
/**
|
|
997
|
+
* Maximum number of months to cache before evicting LRU entries.
|
|
998
|
+
* Now managed by CalendarGenerationService.
|
|
999
|
+
*/
|
|
1000
|
+
weekDays: string[];
|
|
1001
|
+
today: Date;
|
|
1002
|
+
selectedDate: Date | null;
|
|
1003
|
+
selectedDates: Date[];
|
|
1004
|
+
startDate: Date | null;
|
|
1005
|
+
endDate: Date | null;
|
|
1006
|
+
hoveredDate: Date | null;
|
|
1007
|
+
rangesArray: {
|
|
1008
|
+
key: string;
|
|
1009
|
+
value: [Date, Date];
|
|
1010
|
+
}[];
|
|
1011
|
+
protected touchState: TouchGestureState;
|
|
1012
|
+
private dateCellTouchHandledTime;
|
|
1013
|
+
private touchHandledTimeout;
|
|
1014
|
+
private readonly activeTimeouts;
|
|
1015
|
+
private readonly activeAnimationFrames;
|
|
1016
|
+
private fieldSyncTimeoutId;
|
|
1017
|
+
private readonly touchListenersSetup;
|
|
1018
|
+
private readonly touchListenersAttached;
|
|
1019
|
+
private bottomSheetSwipeStartY;
|
|
1020
|
+
private bottomSheetSwipeCurrentY;
|
|
1021
|
+
private isBottomSheetSwiping;
|
|
1022
|
+
private readonly bottomSheetSwipeThreshold;
|
|
1023
|
+
private readonly SWIPE_THRESHOLD;
|
|
1024
|
+
private readonly SWIPE_TIME_THRESHOLD;
|
|
1025
|
+
private _currentMonth;
|
|
1026
|
+
_currentYear: number;
|
|
1027
|
+
_currentDecade: number;
|
|
1028
|
+
monthOptions: i0.Signal<{
|
|
1029
|
+
label: string;
|
|
1030
|
+
value: number;
|
|
1031
|
+
}[]>;
|
|
1032
|
+
yearOptions: i0.Signal<{
|
|
1033
|
+
label: string;
|
|
1034
|
+
value: number;
|
|
1035
|
+
}[]>;
|
|
1036
|
+
decadeOptions: {
|
|
1037
|
+
label: string;
|
|
1038
|
+
value: number;
|
|
1039
|
+
}[];
|
|
1040
|
+
yearGrid: number[];
|
|
1041
|
+
hourOptions: {
|
|
1042
|
+
label: string;
|
|
1043
|
+
value: number;
|
|
1044
|
+
}[];
|
|
1045
|
+
minuteOptions: {
|
|
1046
|
+
label: string;
|
|
1047
|
+
value: number;
|
|
1048
|
+
}[];
|
|
1049
|
+
secondOptions: {
|
|
1050
|
+
label: string;
|
|
1051
|
+
value: number;
|
|
1052
|
+
}[];
|
|
1053
|
+
decadeGrid: number[];
|
|
1054
|
+
private firstDayOfWeek;
|
|
1055
|
+
currentHour: number;
|
|
1056
|
+
currentMinute: number;
|
|
1057
|
+
currentSecond: number;
|
|
1058
|
+
currentDisplayHour: number;
|
|
1059
|
+
isPm: boolean;
|
|
1060
|
+
startHour: number;
|
|
1061
|
+
startMinute: number;
|
|
1062
|
+
startSecond: number;
|
|
1063
|
+
startDisplayHour: number;
|
|
1064
|
+
startIsPm: boolean;
|
|
1065
|
+
endHour: number;
|
|
1066
|
+
endMinute: number;
|
|
1067
|
+
endSecond: number;
|
|
1068
|
+
endDisplayHour: number;
|
|
1069
|
+
endIsPm: boolean;
|
|
1070
|
+
ampmOptions: {
|
|
1071
|
+
label: string;
|
|
1072
|
+
value: boolean;
|
|
1073
|
+
}[];
|
|
1074
|
+
timelineMonths: Date[];
|
|
1075
|
+
timelineStartDate: Date;
|
|
1076
|
+
timelineEndDate: Date;
|
|
1077
|
+
private timelineZoomLevel;
|
|
1078
|
+
startTimeSlider: number;
|
|
1079
|
+
endTimeSlider: number;
|
|
1080
|
+
private readonly elementRef;
|
|
1081
|
+
private readonly cdr;
|
|
1082
|
+
private readonly platformId;
|
|
1083
|
+
private readonly globalConfig;
|
|
1084
|
+
private readonly fieldSyncService;
|
|
1085
|
+
private readonly localeRegistry;
|
|
1086
|
+
private readonly translationRegistry;
|
|
1087
|
+
private readonly focusTrapService;
|
|
1088
|
+
private readonly ariaLiveService;
|
|
1089
|
+
private readonly hapticFeedbackService;
|
|
1090
|
+
private readonly calendarGenerationService;
|
|
1091
|
+
private readonly parsingService;
|
|
1092
|
+
private readonly touchService;
|
|
1093
|
+
private readonly popoverPositioningService;
|
|
1094
|
+
readonly ngControl: NgControl | null;
|
|
1095
|
+
private readonly isBrowser;
|
|
1096
|
+
private readonly dateComparator;
|
|
1097
|
+
constructor();
|
|
1098
|
+
typedInputValue: string;
|
|
1099
|
+
private isTyping;
|
|
1100
|
+
popoverContainer?: ElementRef<HTMLElement>;
|
|
1101
|
+
readonly popoverId: string;
|
|
1102
|
+
datepickerInput?: NgxsmkDatepickerInputComponent;
|
|
1103
|
+
datepickerContent?: NgxsmkDatepickerContentComponent;
|
|
1104
|
+
private focusTrapCleanup;
|
|
1105
|
+
_translations: DatepickerTranslations | null;
|
|
1106
|
+
private _translationService;
|
|
1107
|
+
private _changeDetectionScheduled;
|
|
1108
|
+
/**
|
|
1109
|
+
* Schedules change detection to run in the next microtask.
|
|
1110
|
+
* Prevents multiple change detection cycles from being scheduled simultaneously.
|
|
1111
|
+
*
|
|
1112
|
+
* @remarks
|
|
1113
|
+
* This method is essential for zoneless compatibility. When Zone.js is not present,
|
|
1114
|
+
* Angular's automatic change detection doesn't run, so components using OnPush
|
|
1115
|
+
* strategy must manually trigger change detection when state changes.
|
|
1116
|
+
*
|
|
1117
|
+
* The debouncing mechanism prevents excessive change detection cycles when multiple
|
|
1118
|
+
* state changes occur in rapid succession (e.g., during user interactions or async
|
|
1119
|
+
* operations). Only one change detection cycle is scheduled per microtask queue.
|
|
1120
|
+
*
|
|
1121
|
+
* This pattern is compatible with both Zone.js and zoneless Angular applications.
|
|
1122
|
+
*/
|
|
1123
|
+
private scheduleChangeDetection;
|
|
1124
|
+
/**
|
|
1125
|
+
* Creates a tracked setTimeout that is automatically cleaned up on component destroy.
|
|
1126
|
+
* All timeouts created through this method are stored in activeTimeouts for proper cleanup.
|
|
1127
|
+
*
|
|
1128
|
+
* @param callback - Function to execute after delay
|
|
1129
|
+
* @param delay - Delay in milliseconds
|
|
1130
|
+
* @returns Timeout ID that can be used with clearTimeout
|
|
1131
|
+
*/
|
|
1132
|
+
private trackedSetTimeout;
|
|
1133
|
+
/**
|
|
1134
|
+
* Creates a tracked requestAnimationFrame that is automatically cancelled on component destroy.
|
|
1135
|
+
* All animation frames created through this method are stored in activeAnimationFrames for proper cleanup.
|
|
1136
|
+
*
|
|
1137
|
+
* @param callback - Function to execute on next animation frame
|
|
1138
|
+
* @returns Animation frame ID that can be used with cancelAnimationFrame
|
|
1139
|
+
*/
|
|
1140
|
+
private trackedRequestAnimationFrame;
|
|
1141
|
+
/**
|
|
1142
|
+
* Executes a callback after two animation frames, ensuring DOM updates are complete.
|
|
1143
|
+
* Useful for operations that need to run after Angular's change detection and browser rendering.
|
|
1144
|
+
*
|
|
1145
|
+
* @param callback - Function to execute after double animation frame
|
|
1146
|
+
*/
|
|
1147
|
+
private trackedDoubleRequestAnimationFrame;
|
|
1148
|
+
/**
|
|
1149
|
+
* Clears all active timeouts. Used when locale or weekStart changes
|
|
1150
|
+
* to cancel any pending operations that might be invalidated by the change.
|
|
1151
|
+
*/
|
|
1152
|
+
private clearActiveTimeouts;
|
|
1153
|
+
/**
|
|
1154
|
+
* Debounces field synchronization to prevent race conditions from rapid updates.
|
|
1155
|
+
* Cancels any pending sync operation before scheduling a new one.
|
|
1156
|
+
*
|
|
1157
|
+
* @param delay - Debounce delay in milliseconds (default: 100ms)
|
|
1158
|
+
*/
|
|
1159
|
+
private debouncedFieldSync;
|
|
1160
|
+
private readonly _currentMonthSignal;
|
|
1161
|
+
private readonly _currentYearSignal;
|
|
1162
|
+
private readonly _localeSignal;
|
|
1163
|
+
private readonly _holidayProviderSignal;
|
|
1164
|
+
private readonly _disabledStateSignal;
|
|
1165
|
+
/**
|
|
1166
|
+
* Effect that automatically triggers change detection when key signals change.
|
|
1167
|
+
* This reduces the need for manual markForCheck() calls throughout the codebase.
|
|
1168
|
+
*/
|
|
1169
|
+
private readonly _changeDetectionEffect;
|
|
1170
|
+
/**
|
|
1171
|
+
* Signal tracking which calendar month indices are currently visible in the viewport.
|
|
1172
|
+
* Used for lazy rendering of multi-calendar layouts to improve performance.
|
|
1173
|
+
*/
|
|
1174
|
+
private readonly _visibleCalendarIndicesSignal;
|
|
1175
|
+
/** Bumped when `multiCalendarMonths` is regenerated so `renderedCalendars` invalidates (plain array is not a signal). */
|
|
1176
|
+
private readonly _multiCalendarDataRevision;
|
|
1177
|
+
/**
|
|
1178
|
+
* Computed signal for rendered calendars - only includes visible calendars + buffer.
|
|
1179
|
+
* This dramatically reduces DOM nodes for multi-calendar layouts.
|
|
1180
|
+
*/
|
|
1181
|
+
renderedCalendars: i0.Signal<{
|
|
1182
|
+
month: number;
|
|
1183
|
+
year: number;
|
|
1184
|
+
days: (Date | null)[];
|
|
1185
|
+
}[]>;
|
|
1186
|
+
private _cachedIsCurrentMonthMemo;
|
|
1187
|
+
private _cachedIsDateDisabledMemo;
|
|
1188
|
+
private _cachedIsSameDayMemo;
|
|
1189
|
+
private _cachedIsHolidayMemo;
|
|
1190
|
+
private _cachedGetHolidayLabelMemo;
|
|
1191
|
+
private _memoDependencies;
|
|
1192
|
+
private _updateMemoSignals;
|
|
1193
|
+
private passiveTouchListeners;
|
|
1194
|
+
get isInlineMode(): boolean;
|
|
1195
|
+
private clearTouchHandledFlag;
|
|
1196
|
+
private closeMonthYearDropdowns;
|
|
1197
|
+
private setTouchHandledFlag;
|
|
1198
|
+
isMobileDevice(): boolean;
|
|
1199
|
+
shouldUseNativePicker(): boolean;
|
|
1200
|
+
getNativeInputType(): string;
|
|
1201
|
+
formatValueForNativeInput(value: DatepickerValue): string;
|
|
1202
|
+
formatDateForNativeInput(date: Date): string;
|
|
1203
|
+
getMinDateForNativeInput(): string | null;
|
|
1204
|
+
getMaxDateForNativeInput(): string | null;
|
|
1205
|
+
parseNativeInputValue(value: string): DatepickerValue;
|
|
1206
|
+
onNativeInputChange(event: Event): void;
|
|
1207
|
+
onBottomSheetTouchStart(event: TouchEvent): void;
|
|
1208
|
+
onBottomSheetTouchMove(event: TouchEvent): void;
|
|
1209
|
+
onBottomSheetTouchEnd(event: TouchEvent): void;
|
|
1210
|
+
readonly boundIsDateDisabled: (d: Date | null) => boolean;
|
|
1211
|
+
readonly boundIsSameDay: (d1: Date | null, d2: Date | null) => boolean;
|
|
1212
|
+
readonly boundIsHoliday: (d: Date | null) => boolean;
|
|
1213
|
+
readonly boundIsMultipleSelected: (d: Date | null) => boolean;
|
|
1214
|
+
readonly boundIsInRange: (d: Date | null) => boolean;
|
|
1215
|
+
readonly boundIsPreviewInRange: (d: Date | null) => boolean;
|
|
1216
|
+
readonly boundGetAriaLabel: (d: Date | null) => string;
|
|
1217
|
+
readonly boundGetDayCellCustomClasses: (d: Date | null) => string[];
|
|
1218
|
+
readonly boundGetDayCellTooltip: (d: Date | null) => string | null;
|
|
1219
|
+
readonly boundFormatDayNumber: (d: Date | null) => string;
|
|
1220
|
+
readonly boundGetMonthYearLabel: (m: number, y: number) => string;
|
|
1221
|
+
readonly boundGetCalendarAriaLabelForMonth: (m: number, y: number) => string;
|
|
1222
|
+
readonly boundIsTimelineMonthSelected: (d: Date) => boolean;
|
|
1223
|
+
readonly boundFormatTimeSliderValue: (v: number) => string;
|
|
1224
|
+
get isCalendarVisible(): boolean;
|
|
1225
|
+
get displayValue(): string;
|
|
1226
|
+
private syncTypedInputIfNotTyping;
|
|
1227
|
+
private getDisplayValueTimeOnly;
|
|
1228
|
+
private getDisplayValueDateDefault;
|
|
1229
|
+
private formatWithCustomFormat;
|
|
1230
|
+
private formatWithAdapter;
|
|
1231
|
+
private formatWithParsingServiceFallback;
|
|
1232
|
+
/**
|
|
1233
|
+
* Format dates using a custom date format pattern
|
|
1234
|
+
* Supports YYYY, MM, DD, HH, mm, ss, etc.
|
|
1235
|
+
*/
|
|
1236
|
+
private formatWithCustomPattern;
|
|
1237
|
+
get isBackArrowDisabled(): boolean;
|
|
1238
|
+
private _invalidateMemoCache;
|
|
1239
|
+
get isCurrentMonthMemo(): (day: Date | null) => boolean;
|
|
1240
|
+
/**
|
|
1241
|
+
* Memoized function for checking if a date is disabled.
|
|
1242
|
+
* Returns a cached function that checks date constraints efficiently.
|
|
1243
|
+
*
|
|
1244
|
+
* @returns A function that checks if a date is disabled
|
|
1245
|
+
*
|
|
1246
|
+
* @remarks
|
|
1247
|
+
* This getter implements memoization to avoid recreating the validation function
|
|
1248
|
+
* on every calendar render. The function is regenerated only when:
|
|
1249
|
+
* - Disabled state constraints change (minDate, maxDate, disabledDates, disabledRanges)
|
|
1250
|
+
* - Current month/year changes
|
|
1251
|
+
*
|
|
1252
|
+
* Performance: O(1) to get the memoized function, O(n) to execute where n = constraints
|
|
1253
|
+
* The memoization significantly improves performance when rendering calendar grids
|
|
1254
|
+
* with many date cells (e.g., multiple calendar months).
|
|
1255
|
+
*/
|
|
1256
|
+
get isDateDisabledMemo(): (day: Date | null) => boolean;
|
|
1257
|
+
/**
|
|
1258
|
+
* Memoized function for comparing if two dates are the same day.
|
|
1259
|
+
* Uses an optimized date comparator for efficient day-level comparisons.
|
|
1260
|
+
*
|
|
1261
|
+
* @returns A function that compares two dates for same-day equality
|
|
1262
|
+
*
|
|
1263
|
+
* @remarks
|
|
1264
|
+
* The date comparator normalizes times to start of day before comparison,
|
|
1265
|
+
* ensuring accurate day-level equality checks regardless of time components.
|
|
1266
|
+
*
|
|
1267
|
+
* Performance: O(1) - Simple date field comparisons after normalization
|
|
1268
|
+
*/
|
|
1269
|
+
get isSameDayMemo(): (d1: Date | null, d2: Date | null) => boolean;
|
|
1270
|
+
/**
|
|
1271
|
+
* Memoized function for checking if a date is a holiday.
|
|
1272
|
+
* Returns a cached function that uses the current holiday provider.
|
|
1273
|
+
*
|
|
1274
|
+
* @returns A function that checks if a date is a holiday
|
|
1275
|
+
*
|
|
1276
|
+
* @remarks
|
|
1277
|
+
* The function is regenerated when the holidayProvider changes.
|
|
1278
|
+
* This ensures the memoized function always uses the current provider
|
|
1279
|
+
* while avoiding recreation on every calendar render.
|
|
1280
|
+
*
|
|
1281
|
+
* Performance: O(1) to get memoized function, O(1) to execute (depends on provider implementation)
|
|
1282
|
+
*/
|
|
1283
|
+
get isHolidayMemo(): (day: Date | null) => boolean;
|
|
1284
|
+
get getHolidayLabelMemo(): (day: Date | null) => string | null;
|
|
1285
|
+
/**
|
|
1286
|
+
* TrackBy function for calendar day cells in *ngFor loops.
|
|
1287
|
+
* Provides stable identity for Angular's change detection optimization.
|
|
1288
|
+
*
|
|
1289
|
+
* @param index - Array index of the day
|
|
1290
|
+
* @param day - The date object (or null for empty cells)
|
|
1291
|
+
* @returns Unique identifier for the day cell
|
|
1292
|
+
*
|
|
1293
|
+
* @remarks
|
|
1294
|
+
* Using timestamp ensures stable identity even when Date objects are recreated.
|
|
1295
|
+
* This significantly improves *ngFor performance by allowing Angular to track
|
|
1296
|
+
* which items have changed, moved, or been removed.
|
|
1297
|
+
*/
|
|
1298
|
+
trackByDay(index: number, day: Date | null): string;
|
|
1299
|
+
/**
|
|
1300
|
+
* TrackBy function for calendar month containers in multi-calendar views.
|
|
1301
|
+
* Provides stable identity for efficient change detection.
|
|
1302
|
+
*
|
|
1303
|
+
* @param _index - Array index (unused, using year-month for identity)
|
|
1304
|
+
* @param calendarMonth - The calendar month object
|
|
1305
|
+
* @returns Unique identifier combining year and month
|
|
1306
|
+
*/
|
|
1307
|
+
/**
|
|
1308
|
+
* Checks if a DOM node is contained within this datepicker instance,
|
|
1309
|
+
* including its input group and any portaled popover content.
|
|
1310
|
+
*
|
|
1311
|
+
* @param target - The node to check
|
|
1312
|
+
* @returns True if the node is inside this datepicker's DOM tree
|
|
1313
|
+
*/
|
|
1314
|
+
containsNode(target: Node | null): boolean;
|
|
1315
|
+
/** Shared logic for closing calendar when user interacts outside (click or touch). */
|
|
1316
|
+
private tryCloseCalendarOnOutsideInteraction;
|
|
1317
|
+
onDocumentClick(event: MouseEvent | TouchEvent): void;
|
|
1318
|
+
onDocumentTouchStart(event: TouchEvent): void;
|
|
1319
|
+
private handleDocumentOutsideInteraction;
|
|
1320
|
+
onTouchStart(event: TouchEvent): void;
|
|
1321
|
+
onInputGroupFocus(): void;
|
|
1322
|
+
private focusInput;
|
|
1323
|
+
onTouchEnd(event: TouchEvent): void;
|
|
1324
|
+
private closeOtherCalendarInstances;
|
|
1325
|
+
private applyCalendarOpenStateFromTouch;
|
|
1326
|
+
onPointerDown(event: PointerEvent): void;
|
|
1327
|
+
onPointerUp(event: PointerEvent): void;
|
|
1328
|
+
private clearPointerTouchState;
|
|
1329
|
+
private applyCalendarCloseState;
|
|
1330
|
+
private applyCalendarOpenStateFromPointer;
|
|
1331
|
+
onKeyDown(event: KeyboardEvent): void;
|
|
1332
|
+
private handleKeyboardNavigation;
|
|
1333
|
+
private tryCustomShortcuts;
|
|
1334
|
+
private tryHooksHandleShortcut;
|
|
1335
|
+
private handleShortcutKey;
|
|
1336
|
+
private handleShortcutNavigationKeys;
|
|
1337
|
+
private handleShortcutArrowKeys;
|
|
1338
|
+
private handleShortcutPageHomeEndKeys;
|
|
1339
|
+
private handleShortcutLetterAndSpecialKeys;
|
|
1340
|
+
isKeyboardHelpOpen: boolean;
|
|
1341
|
+
toggleKeyboardHelp(): void;
|
|
1342
|
+
private getShortcutKey;
|
|
1343
|
+
focusedDate: Date | null;
|
|
1344
|
+
private navigateDate;
|
|
1345
|
+
private navigateToFirstDay;
|
|
1346
|
+
private navigateToLastDay;
|
|
1347
|
+
private selectToday;
|
|
1348
|
+
private selectYesterday;
|
|
1349
|
+
private selectTomorrow;
|
|
1350
|
+
private selectNextWeek;
|
|
1351
|
+
onDateFocus(day: Date | null): void;
|
|
1352
|
+
private isDateValid;
|
|
1353
|
+
getDayCellCustomClasses(day: Date | null): string[];
|
|
1354
|
+
getDayCellTooltip(day: Date | null): string | null;
|
|
1355
|
+
formatDayNumber(day: Date | null): string;
|
|
1356
|
+
/**
|
|
1357
|
+
* Generates an accessible label for a date cell.
|
|
1358
|
+
* Provides screen readers with a descriptive label for each selectable date.
|
|
1359
|
+
*
|
|
1360
|
+
* @param day - The date to generate a label for
|
|
1361
|
+
* @returns Localized date label (e.g., "Monday, January 15, 2024")
|
|
1362
|
+
*
|
|
1363
|
+
* @remarks
|
|
1364
|
+
* The label includes weekday, month, day, and year for full context.
|
|
1365
|
+
* Custom formatting can be provided via the formatAriaLabel hook.
|
|
1366
|
+
* This ensures screen reader users have complete information about each date.
|
|
1367
|
+
*/
|
|
1368
|
+
getAriaLabel(day: Date | null): string;
|
|
1369
|
+
/**
|
|
1370
|
+
* ControlValueAccessor implementation: Writes a new value to the form control.
|
|
1371
|
+
* Called by Angular Forms when the form control value changes programmatically.
|
|
1372
|
+
*
|
|
1373
|
+
* @param val - The new value from the form control
|
|
1374
|
+
*
|
|
1375
|
+
* @remarks
|
|
1376
|
+
* This method:
|
|
1377
|
+
* - Normalizes the incoming value to ensure consistent format
|
|
1378
|
+
* - Initializes component state from the value
|
|
1379
|
+
* - Updates memoized signals for change detection
|
|
1380
|
+
* - Regenerates calendar to reflect the new value
|
|
1381
|
+
* - Notifies Material Form Field of state changes
|
|
1382
|
+
* - Syncs with Signal Form field if field input is used
|
|
1383
|
+
*
|
|
1384
|
+
* This is part of the ControlValueAccessor interface, enabling two-way binding
|
|
1385
|
+
* with both Reactive Forms and Template-driven Forms.
|
|
1386
|
+
*/
|
|
1387
|
+
writeValue(val: DatepickerValue): void;
|
|
1388
|
+
/**
|
|
1389
|
+
* ControlValueAccessor implementation: Registers a callback for value changes.
|
|
1390
|
+
* Called by Angular Forms to receive notifications when the user changes the value.
|
|
1391
|
+
*
|
|
1392
|
+
* @param fn - Callback function to call when value changes
|
|
1393
|
+
*/
|
|
1394
|
+
registerOnChange(fn: (value: DatepickerValue) => void): void;
|
|
1395
|
+
/**
|
|
1396
|
+
* ControlValueAccessor implementation: Registers a callback for touched state.
|
|
1397
|
+
* Called by Angular Forms to receive notifications when the user interacts with the control.
|
|
1398
|
+
*
|
|
1399
|
+
* @param fn - Callback function to call when control is touched
|
|
1400
|
+
*/
|
|
1401
|
+
registerOnTouched(fn: () => void): void;
|
|
1402
|
+
setDisabledState(isDisabled: boolean): void;
|
|
1403
|
+
/**
|
|
1404
|
+
* Emits a value change event and updates the internal state.
|
|
1405
|
+
* Handles normalization, form field synchronization, and calendar auto-close behavior.
|
|
1406
|
+
*
|
|
1407
|
+
* @param val - The new datepicker value (Date, Date range, or array of dates)
|
|
1408
|
+
*
|
|
1409
|
+
* @remarks
|
|
1410
|
+
* This method is the central point for value updates and ensures:
|
|
1411
|
+
* - Value normalization for consistent internal representation
|
|
1412
|
+
* - Signal Form field synchronization (if field input is used)
|
|
1413
|
+
* - Event emission for two-way binding
|
|
1414
|
+
* - Touch state tracking for form validation
|
|
1415
|
+
* - Automatic calendar closing for single date and complete range selections
|
|
1416
|
+
*
|
|
1417
|
+
* The calendar auto-closes when:
|
|
1418
|
+
* - Single date mode: After any date selection
|
|
1419
|
+
* - Range mode: After both start and end dates are selected
|
|
1420
|
+
* - Not in inline mode
|
|
1421
|
+
* - Not in time-only mode
|
|
1422
|
+
*/
|
|
1423
|
+
private emitValue;
|
|
1424
|
+
/**
|
|
1425
|
+
* Toggles the calendar popover open/closed state.
|
|
1426
|
+
* Handles focus management, accessibility announcements, and prevents rapid toggling.
|
|
1427
|
+
*
|
|
1428
|
+
* @param event - Optional event that triggered the toggle (used to prevent toggle on clear button clicks)
|
|
1429
|
+
*
|
|
1430
|
+
* @remarks
|
|
1431
|
+
* This method implements several important behaviors:
|
|
1432
|
+
* - Debouncing: Prevents rapid toggling within 300ms
|
|
1433
|
+
* - Focus management: Stores previous focus element for restoration
|
|
1434
|
+
* - Accessibility: Announces calendar state changes to screen readers
|
|
1435
|
+
* - Touch optimization: Sets up passive touch listeners for mobile devices
|
|
1436
|
+
*
|
|
1437
|
+
* When opening:
|
|
1438
|
+
* - Stores the currently focused element for restoration
|
|
1439
|
+
* - Sets up focus trap for keyboard navigation
|
|
1440
|
+
* - Announces calendar opening with current month/year
|
|
1441
|
+
*
|
|
1442
|
+
* When closing:
|
|
1443
|
+
* - Removes focus trap
|
|
1444
|
+
* - Restores focus to previous element
|
|
1445
|
+
* - Announces calendar closing
|
|
1446
|
+
*/
|
|
1447
|
+
toggleCalendar(event?: Event): void;
|
|
1448
|
+
private applyToggleWithNoEvent;
|
|
1449
|
+
private shouldSkipClickToggle;
|
|
1450
|
+
private applyDefaultMonthForOpen;
|
|
1451
|
+
private applySmartViewModeForOpen;
|
|
1452
|
+
private announceAfterOpen;
|
|
1453
|
+
private announceAfterClose;
|
|
1454
|
+
private announceCalendarOpened;
|
|
1455
|
+
private announceCalendarClosed;
|
|
1456
|
+
onBackdropInteract(event: Event): void;
|
|
1457
|
+
onPopoverEscape(event: Event): void;
|
|
1458
|
+
private scrollDebounceTimer;
|
|
1459
|
+
private readonly updatePositionOnScroll;
|
|
1460
|
+
private _startOpeningState;
|
|
1461
|
+
private _startClosingState;
|
|
1462
|
+
private renderInBody;
|
|
1463
|
+
/** Hides the body-appended popover so loading/calendar are not visible at wrong position. */
|
|
1464
|
+
private hideBodyPopoverUntilPositioned;
|
|
1465
|
+
/** Shows the body-appended popover after positioning has been applied. */
|
|
1466
|
+
private revealBodyPopover;
|
|
1467
|
+
private destroyBodyView;
|
|
1468
|
+
private closeCalendar;
|
|
1469
|
+
private shouldAutoClose;
|
|
1470
|
+
/**
|
|
1471
|
+
* Clears the selected date value(s) and resets the component state.
|
|
1472
|
+
* Emits null value and closes calendar if open.
|
|
1473
|
+
*
|
|
1474
|
+
* @param event - Optional event that triggered the clear action
|
|
1475
|
+
*
|
|
1476
|
+
* @remarks
|
|
1477
|
+
* This method:
|
|
1478
|
+
* - Clears all selected dates (single, range, multiple modes)
|
|
1479
|
+
* - Emits null value to form controls
|
|
1480
|
+
* - Closes calendar if open
|
|
1481
|
+
* - Provides haptic feedback on mobile if enabled
|
|
1482
|
+
* - Resets touch gesture state
|
|
1483
|
+
* - Announces clearing to screen readers
|
|
1484
|
+
*
|
|
1485
|
+
* Used by the clear button and can be called programmatically.
|
|
1486
|
+
*/
|
|
1487
|
+
clearValue(event?: MouseEvent | TouchEvent): void;
|
|
1488
|
+
get currentMonth(): number;
|
|
1489
|
+
set currentMonth(month: number);
|
|
1490
|
+
get currentYear(): number;
|
|
1491
|
+
set currentYear(year: number);
|
|
1492
|
+
private _updateToday;
|
|
1493
|
+
ngOnInit(): void;
|
|
1494
|
+
private initializeTimeFromNowIfNeeded;
|
|
1495
|
+
private resolveInitialValue;
|
|
1496
|
+
private resolveInitialValueFromField;
|
|
1497
|
+
ngAfterViewInit(): void;
|
|
1498
|
+
private setupInputGroupPassiveListeners;
|
|
1499
|
+
private _touchListenersSetupTimeout;
|
|
1500
|
+
/**
|
|
1501
|
+
* Sets up passive touch event listeners on calendar day cells for improved mobile performance.
|
|
1502
|
+
* Implements retry logic to handle cases where DOM elements aren't immediately available.
|
|
1503
|
+
* All listeners are tracked for proper cleanup on component destroy.
|
|
1504
|
+
*/
|
|
1505
|
+
private setupPassiveTouchListeners;
|
|
1506
|
+
private attachTouchListenersToCells;
|
|
1507
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
1508
|
+
private handleChangesShowTimeInlineAndLayout;
|
|
1509
|
+
private handleChangesLocaleRtl;
|
|
1510
|
+
private handleChangesWeekStartAndRelated;
|
|
1511
|
+
private applyChangesMinuteAnd24Hour;
|
|
1512
|
+
private handleChangesField;
|
|
1513
|
+
private handleChangesTimeAndMode;
|
|
1514
|
+
private handleChangesDisabledStates;
|
|
1515
|
+
private handleChangesTranslations;
|
|
1516
|
+
private handleChangesMaxDate;
|
|
1517
|
+
private handleChangesValue;
|
|
1518
|
+
private handleChangesStartAt;
|
|
1519
|
+
private handleChangesMinDate;
|
|
1520
|
+
private handleChangesCalendarViewMode;
|
|
1521
|
+
/**
|
|
1522
|
+
* Validates component inputs for conflicts and invalid combinations.
|
|
1523
|
+
* Logs warnings in development mode when invalid configurations are detected.
|
|
1524
|
+
*
|
|
1525
|
+
* @param changes - The SimpleChanges object from ngOnChanges
|
|
1526
|
+
*/
|
|
1527
|
+
private validateInputs;
|
|
1528
|
+
private validateInputsMinMaxDate;
|
|
1529
|
+
private validateInputsTimeOnly;
|
|
1530
|
+
private validateInputsIntervals;
|
|
1531
|
+
private validateInputsYearRange;
|
|
1532
|
+
private initializeTimeSliders;
|
|
1533
|
+
private get24Hour;
|
|
1534
|
+
private update12HourState;
|
|
1535
|
+
private applyCurrentTime;
|
|
1536
|
+
private applyTimeIfNeeded;
|
|
1537
|
+
/**
|
|
1538
|
+
* Initializes the component's internal state from a DatepickerValue.
|
|
1539
|
+
* Sets up selected dates, calendar view position, and time values based on the provided value.
|
|
1540
|
+
*
|
|
1541
|
+
* @param value - The datepicker value to initialize from (Date, range, array, or null)
|
|
1542
|
+
*
|
|
1543
|
+
* @remarks
|
|
1544
|
+
* This method handles initialization for all selection modes:
|
|
1545
|
+
* - Single mode: Sets selectedDate
|
|
1546
|
+
* - Range mode: Sets startDate and endDate
|
|
1547
|
+
* - Multiple mode: Sets selectedDates array
|
|
1548
|
+
*
|
|
1549
|
+
* The method also:
|
|
1550
|
+
* - Determines the calendar view center date (uses value, startAt, or minDate as fallback)
|
|
1551
|
+
* - Extracts and sets time values if the date includes time information
|
|
1552
|
+
* - Normalizes all dates to ensure consistent internal representation
|
|
1553
|
+
*
|
|
1554
|
+
* Performance: O(1) for single/range, O(n) for multiple mode where n = array length
|
|
1555
|
+
*/
|
|
1556
|
+
private initializeValue;
|
|
1557
|
+
private applyValueToSelection;
|
|
1558
|
+
private resolveViewCenterDate;
|
|
1559
|
+
private _normalizeDate;
|
|
1560
|
+
/**
|
|
1561
|
+
* Normalizes various date input formats into a consistent DatepickerValue type.
|
|
1562
|
+
* Handles Date objects, Moment.js objects, date ranges, arrays, and strings.
|
|
1563
|
+
*
|
|
1564
|
+
* @param val - The value to normalize (can be Date, Moment, range object, array, or string)
|
|
1565
|
+
* @returns Normalized DatepickerValue (Date, range object, array, or null)
|
|
1566
|
+
*
|
|
1567
|
+
* @remarks
|
|
1568
|
+
* This method provides flexible input handling to support:
|
|
1569
|
+
* - Native JavaScript Date objects
|
|
1570
|
+
* - Moment.js objects (with timezone preservation)
|
|
1571
|
+
* - Date range objects: { start: Date, end: Date }
|
|
1572
|
+
* - Arrays of dates for multiple selection mode
|
|
1573
|
+
* - String dates with custom format parsing
|
|
1574
|
+
*
|
|
1575
|
+
* Invalid or unparseable values are normalized to null.
|
|
1576
|
+
* This ensures type safety and consistent internal state representation.
|
|
1577
|
+
*/
|
|
1578
|
+
private _normalizeValue;
|
|
1579
|
+
private _normalizeRangeValue;
|
|
1580
|
+
private _normalizeArrayValue;
|
|
1581
|
+
/**
|
|
1582
|
+
* Check if the provided value is a Moment.js object
|
|
1583
|
+
*/
|
|
1584
|
+
private isMomentObject;
|
|
1585
|
+
/**
|
|
1586
|
+
* Convert a Moment.js object to a Date, preserving timezone offset
|
|
1587
|
+
*/
|
|
1588
|
+
private momentToDate;
|
|
1589
|
+
/**
|
|
1590
|
+
* Compares two DatepickerValue objects for equality.
|
|
1591
|
+
* Handles Date objects, range objects, and arrays with proper date comparison.
|
|
1592
|
+
*
|
|
1593
|
+
* @param val1 - First value to compare
|
|
1594
|
+
* @param val2 - Second value to compare
|
|
1595
|
+
* @returns true if values represent the same date(s), false otherwise
|
|
1596
|
+
*
|
|
1597
|
+
* @remarks
|
|
1598
|
+
* This method performs deep equality checks:
|
|
1599
|
+
* - For Date objects: Compares using date comparator (handles time normalization)
|
|
1600
|
+
* - For range objects: Compares both start and end dates
|
|
1601
|
+
* - For arrays: Compares lengths and all elements
|
|
1602
|
+
* - Handles null/undefined values correctly
|
|
1603
|
+
*
|
|
1604
|
+
* Uses the dateComparator utility for efficient date comparisons that
|
|
1605
|
+
* normalize times to start of day for accurate day-level equality.
|
|
1606
|
+
*/
|
|
1607
|
+
private isValueEqual;
|
|
1608
|
+
/**
|
|
1609
|
+
* Parses a date string, optionally using the configured date adapter with error callback.
|
|
1610
|
+
* Falls back to native Date parsing if no adapter is configured.
|
|
1611
|
+
*
|
|
1612
|
+
* @param dateString - The date string to parse
|
|
1613
|
+
* @returns Parsed Date object or null if parsing fails
|
|
1614
|
+
*
|
|
1615
|
+
* @remarks
|
|
1616
|
+
* If a date adapter is configured via globalConfig, it will be used for parsing
|
|
1617
|
+
* with error callbacks. Otherwise, native Date parsing is used.
|
|
1618
|
+
* Error callbacks allow consumers to handle parsing failures gracefully.
|
|
1619
|
+
*/
|
|
1620
|
+
onInputFocus(event: FocusEvent): void;
|
|
1621
|
+
/**
|
|
1622
|
+
* Sanitizes user input to prevent XSS attacks.
|
|
1623
|
+
* Removes potentially dangerous characters while preserving valid date/time input.
|
|
1624
|
+
*
|
|
1625
|
+
* @param input - Raw user input string
|
|
1626
|
+
* @returns Sanitized string safe for template interpolation
|
|
1627
|
+
*
|
|
1628
|
+
* @remarks
|
|
1629
|
+
* This method provides basic XSS protection by removing:
|
|
1630
|
+
* - HTML tag delimiters (< and >)
|
|
1631
|
+
* - Script event handlers (onerror, onclick, etc.)
|
|
1632
|
+
* - JavaScript protocol (javascript:)
|
|
1633
|
+
* - Data URIs that could contain scripts
|
|
1634
|
+
*
|
|
1635
|
+
* Note: Angular's template interpolation provides additional protection,
|
|
1636
|
+
* but this sanitization adds an extra layer of defense for user-provided strings.
|
|
1637
|
+
* For comprehensive sanitization, Angular's DomSanitizer should be used for
|
|
1638
|
+
* any HTML content, but for date/time strings, this level of sanitization is sufficient.
|
|
1639
|
+
*/
|
|
1640
|
+
private sanitizeInput;
|
|
1641
|
+
onInputChange(event: Event): void;
|
|
1642
|
+
onInputBlur(event: FocusEvent): void;
|
|
1643
|
+
private applyValidationErrorForBlur;
|
|
1644
|
+
onInputKeyDown(event: Event): void;
|
|
1645
|
+
private applyInputMask;
|
|
1646
|
+
private isValidDate;
|
|
1647
|
+
private applyTypedDate;
|
|
1648
|
+
private generateTimeOptions;
|
|
1649
|
+
private generateLocaleData;
|
|
1650
|
+
private updateRangesArray;
|
|
1651
|
+
selectRange(range: [Date, Date]): void;
|
|
1652
|
+
isHoliday(date: Date | null): boolean;
|
|
1653
|
+
getHolidayLabel(date: Date | null): string | null;
|
|
1654
|
+
/**
|
|
1655
|
+
* Checks if a date is disabled based on all configured constraints.
|
|
1656
|
+
*
|
|
1657
|
+
* @param date - The date to check
|
|
1658
|
+
* @returns true if the date is disabled, false if it can be selected
|
|
1659
|
+
*
|
|
1660
|
+
* @remarks
|
|
1661
|
+
* A date is considered disabled if it matches any of these conditions:
|
|
1662
|
+
* - Falls before minDate
|
|
1663
|
+
* - Falls after maxDate
|
|
1664
|
+
* - Is in the disabledDates array
|
|
1665
|
+
* - Falls within a disabledRanges entry
|
|
1666
|
+
* - Fails the isInvalidDate custom validation function
|
|
1667
|
+
* - Is a holiday and disableHolidays is true
|
|
1668
|
+
*
|
|
1669
|
+
* Performance: O(n) where n = disabledDates.length + disabledRanges.length
|
|
1670
|
+
* For large constraint lists (>1000), consider optimizing with Set or DateRange tree.
|
|
1671
|
+
*/
|
|
1672
|
+
isDateDisabled(date: Date | null): boolean;
|
|
1673
|
+
private _isInDisabledDates;
|
|
1674
|
+
private _isInDisabledRanges;
|
|
1675
|
+
private _isOutOfMinMaxBounds;
|
|
1676
|
+
/**
|
|
1677
|
+
* Checks if a date is selected in multiple selection mode.
|
|
1678
|
+
*
|
|
1679
|
+
* @param d - The date to check
|
|
1680
|
+
* @returns true if the date is in the selectedDates array
|
|
1681
|
+
*
|
|
1682
|
+
* @remarks
|
|
1683
|
+
* Performance: O(n) where n = selectedDates.length
|
|
1684
|
+
* Uses day-level comparison (ignores time) for accurate matching.
|
|
1685
|
+
*/
|
|
1686
|
+
isMultipleSelected(d: Date | null): boolean;
|
|
1687
|
+
/**
|
|
1688
|
+
* Handles time value changes from time selection controls.
|
|
1689
|
+
* Updates the selected date(s) with the new time values.
|
|
1690
|
+
*
|
|
1691
|
+
* @remarks
|
|
1692
|
+
* This method:
|
|
1693
|
+
* - Applies time changes to selected dates based on current mode
|
|
1694
|
+
* - Emits value changes for form integration
|
|
1695
|
+
* - Handles time-only mode by creating a date with current time
|
|
1696
|
+
* - Updates all selected dates in multiple mode
|
|
1697
|
+
* - Ensures startDate <= endDate in range mode
|
|
1698
|
+
*/
|
|
1699
|
+
timeChange(): void;
|
|
1700
|
+
/**
|
|
1701
|
+
* Handles time range changes in timeRangeMode.
|
|
1702
|
+
* Updates the internal time range state and emits the time range to listeners.
|
|
1703
|
+
* Only creates/updates time-only dates (no calendar dates).
|
|
1704
|
+
*/
|
|
1705
|
+
timeRangeChange(): void;
|
|
1706
|
+
/**
|
|
1707
|
+
* Handles date cell click/tap events.
|
|
1708
|
+
* Processes date selection based on the current mode (single, range, multiple, etc.)
|
|
1709
|
+
* and handles touch gesture debouncing to prevent accidental double selections.
|
|
1710
|
+
*
|
|
1711
|
+
* @param day - The date that was clicked (null for empty cells)
|
|
1712
|
+
*
|
|
1713
|
+
* @remarks
|
|
1714
|
+
* This method implements several important behaviors:
|
|
1715
|
+
* - Touch gesture handling: Debounces rapid touch events to prevent double-clicks
|
|
1716
|
+
* - Date validation: Checks if the date is disabled before processing
|
|
1717
|
+
* - Hook integration: Calls beforeDateSelect hook if provided
|
|
1718
|
+
* - Mode-specific logic: Handles single, range, multiple, week, month, quarter, and year modes
|
|
1719
|
+
* - Calendar navigation: Automatically navigates to different month if date is outside current view
|
|
1720
|
+
* - Accessibility: Announces date selection to screen readers
|
|
1721
|
+
* - Auto-close: Closes calendar after selection in single mode or complete range
|
|
1722
|
+
*
|
|
1723
|
+
* Performance considerations:
|
|
1724
|
+
* - Touch debouncing prevents excessive event processing
|
|
1725
|
+
* - Date normalization happens once per selection
|
|
1726
|
+
* - Calendar regeneration is optimized with caching
|
|
1727
|
+
*/
|
|
1728
|
+
onDateClick(day: Date | null): void;
|
|
1729
|
+
/**
|
|
1730
|
+
* Returns true (and cleans up touch state) when the click event should be
|
|
1731
|
+
* ignored because it was already handled by the touch handler within the
|
|
1732
|
+
* deduplication window (250 ms).
|
|
1733
|
+
*/
|
|
1734
|
+
private _shouldSkipDueToTouchGuard;
|
|
1735
|
+
private _navigateToMonthOfDay;
|
|
1736
|
+
private _handleSingleModeClick;
|
|
1737
|
+
private _handleRangeModeClick;
|
|
1738
|
+
private _handleRangeEndSelection;
|
|
1739
|
+
/** Completes range with end equal to start when `allowSameDay` is enabled. */
|
|
1740
|
+
private _tryCompleteSameDayRange;
|
|
1741
|
+
private _announceRangeSelected;
|
|
1742
|
+
private _finalizeSameDayRangeOnClose;
|
|
1743
|
+
private _handlePeriodModeClick;
|
|
1744
|
+
private _handleMultipleModeClick;
|
|
1745
|
+
private _applyRecurringPattern;
|
|
1746
|
+
private _syncTimeAfterDateClick;
|
|
1747
|
+
onDateHover(day: Date | null): void;
|
|
1748
|
+
onDateCellTouchStart(event: TouchEvent, day: Date | null): void;
|
|
1749
|
+
onDateCellTouchMove(event: TouchEvent): void;
|
|
1750
|
+
onDateCellTouchEnd(event: TouchEvent, day: Date | null): void;
|
|
1751
|
+
isPreviewInRange(day: Date | null): boolean;
|
|
1752
|
+
private buildCalendarMonths;
|
|
1753
|
+
/**
|
|
1754
|
+
* Generates the calendar view for the current month(s).
|
|
1755
|
+
* Uses LRU caching to optimize performance for frequently accessed months.
|
|
1756
|
+
*
|
|
1757
|
+
* @remarks
|
|
1758
|
+
* Performance characteristics:
|
|
1759
|
+
* - First generation: O(n) where n = number of days in month(s)
|
|
1760
|
+
* - Cached generation: O(1) lookup + O(1) cache access update
|
|
1761
|
+
* - Cache eviction: O(m) where m = cache size (only when cache is full)
|
|
1762
|
+
*
|
|
1763
|
+
* This method:
|
|
1764
|
+
* 1. Generates dropdown options for month/year selection
|
|
1765
|
+
* 2. Generates calendar days for each month in calendarCount
|
|
1766
|
+
* 3. Uses LRU cache to avoid regenerating recently accessed months
|
|
1767
|
+
* 4. Handles month/year rollover when displaying multiple calendars
|
|
1768
|
+
* 5. Updates memoized dependencies for change detection optimization
|
|
1769
|
+
* 6. Supports synchronous scrolling to keep calendars in sync (when enabled)
|
|
1770
|
+
*
|
|
1771
|
+
* The cache key format is `${year}-${month}` to ensure unique identification
|
|
1772
|
+
* of calendar months across different years.
|
|
1773
|
+
*
|
|
1774
|
+
* When syncScroll is enabled, calendars are kept synchronized:
|
|
1775
|
+
* - Calendar 0: currentDate month + (0 * monthGap)
|
|
1776
|
+
* - Calendar 1: currentDate month + (1 * monthGap)
|
|
1777
|
+
* - Calendar 2: currentDate month + (2 * monthGap)
|
|
1778
|
+
*/
|
|
1779
|
+
generateCalendar(): void;
|
|
1780
|
+
/**
|
|
1781
|
+
* Preloads adjacent months (previous and next) into the cache for smoother navigation.
|
|
1782
|
+
* Implements lazy loading optimization to improve performance when users navigate between months.
|
|
1783
|
+
*
|
|
1784
|
+
* @param currentYear - Current calendar year
|
|
1785
|
+
* @param currentMonth - Current calendar month (0-11)
|
|
1786
|
+
*/
|
|
1787
|
+
private preloadAdjacentMonths;
|
|
1788
|
+
private generateDropdownOptions;
|
|
1789
|
+
private generateYearGrid;
|
|
1790
|
+
private generateDecadeGrid;
|
|
1791
|
+
onYearClick(year: number): void;
|
|
1792
|
+
onDecadeClick(decade: number): void;
|
|
1793
|
+
/**
|
|
1794
|
+
* Changes the displayed decade by the specified delta.
|
|
1795
|
+
* Used in decade view mode for navigating between decades.
|
|
1796
|
+
*
|
|
1797
|
+
* @param delta - Number of decades to change (positive for future, negative for past)
|
|
1798
|
+
*
|
|
1799
|
+
* @remarks
|
|
1800
|
+
* Each delta unit represents 10 years. The method updates the decade grid
|
|
1801
|
+
* to show the new range of decades available for selection.
|
|
1802
|
+
*/
|
|
1803
|
+
changeDecade(delta: number): void;
|
|
1804
|
+
/**
|
|
1805
|
+
* Changes the displayed calendar year by the specified delta.
|
|
1806
|
+
* Updates year grid and calendar view, and announces the change to screen readers.
|
|
1807
|
+
*
|
|
1808
|
+
* @param delta - Number of years to change (positive for future, negative for past)
|
|
1809
|
+
*
|
|
1810
|
+
* @remarks
|
|
1811
|
+
* This method:
|
|
1812
|
+
* - Updates currentYear and currentDate
|
|
1813
|
+
* - Regenerates year grid and calendar view
|
|
1814
|
+
* - Announces year change to screen readers for accessibility
|
|
1815
|
+
* - Handles touch listener setup for mobile devices
|
|
1816
|
+
*
|
|
1817
|
+
* Performance: O(1) for year change, O(n) for grid/calendar generation
|
|
1818
|
+
*/
|
|
1819
|
+
changeYear(delta: number): void;
|
|
1820
|
+
onViewModeChange(mode: 'month' | 'year' | 'decade' | 'timeline' | 'time-slider'): void;
|
|
1821
|
+
onYearSelectChange(year: unknown): void;
|
|
1822
|
+
private generateTimeline;
|
|
1823
|
+
timelineZoomIn(): void;
|
|
1824
|
+
timelineZoomOut(): void;
|
|
1825
|
+
isTimelineMonthSelected(month: Date): boolean;
|
|
1826
|
+
onTimelineMonthClick(month: Date): void;
|
|
1827
|
+
formatTimeSliderValue(minutes: number): string;
|
|
1828
|
+
onStartTimeSliderChange(minutes: number): void;
|
|
1829
|
+
onEndTimeSliderChange(minutes: number): void;
|
|
1830
|
+
onCalendarSwipeStart(event: TouchEvent): void;
|
|
1831
|
+
onCalendarSwipeMove(event: TouchEvent): void;
|
|
1832
|
+
onCalendarSwipeEnd(event: TouchEvent): void;
|
|
1833
|
+
changeMonth(delta: number): void;
|
|
1834
|
+
isSameDay(d1: Date | null, d2: Date | null): boolean;
|
|
1835
|
+
isCurrentMonth(day: Date | null): boolean;
|
|
1836
|
+
isInRange(d: Date | null): boolean;
|
|
1837
|
+
private applyGlobalConfig;
|
|
1838
|
+
private applyGlobalConfigDefaults;
|
|
1839
|
+
private applyGlobalConfigLocaleAndDates;
|
|
1840
|
+
private applyGlobalConfigMobile;
|
|
1841
|
+
/**
|
|
1842
|
+
* Apply animation configuration from global config
|
|
1843
|
+
*/
|
|
1844
|
+
private applyAnimationConfig;
|
|
1845
|
+
/**
|
|
1846
|
+
* Initialize translations from service or registry
|
|
1847
|
+
*/
|
|
1848
|
+
private initializeTranslations;
|
|
1849
|
+
/**
|
|
1850
|
+
* Generates an accessible label for the calendar dialog.
|
|
1851
|
+
* Provides screen readers with context about which month/year is being displayed.
|
|
1852
|
+
*
|
|
1853
|
+
* @returns Localized calendar label (e.g., "Calendar for January 2024")
|
|
1854
|
+
*/
|
|
1855
|
+
getCalendarAriaLabel(): string;
|
|
1856
|
+
/**
|
|
1857
|
+
* Generates an accessible label for a specific calendar month in multi-calendar views.
|
|
1858
|
+
*
|
|
1859
|
+
* @param month - Month index (0-11)
|
|
1860
|
+
* @param year - Year number
|
|
1861
|
+
* @returns Localized calendar label for the specified month/year
|
|
1862
|
+
*/
|
|
1863
|
+
getCalendarAriaLabelForMonth(month: number, year: number): string;
|
|
1864
|
+
/**
|
|
1865
|
+
* Sets up IntersectionObserver for lazy loading multi-calendar months.
|
|
1866
|
+
* Only initializes if multi-calendar is enabled (calendarCount > 1).
|
|
1867
|
+
*
|
|
1868
|
+
* @remarks
|
|
1869
|
+
* Uses IntersectionObserver to track which calendar month elements are visible
|
|
1870
|
+
* in the viewport. Updates the visible indices signal to enable/disable rendering.
|
|
1871
|
+
*/
|
|
1872
|
+
private setupLazyLoadingObserver;
|
|
1873
|
+
/**
|
|
1874
|
+
* Formats a month and year into a display label.
|
|
1875
|
+
*
|
|
1876
|
+
* @param month - Month index (0-11)
|
|
1877
|
+
* @param year - Year number
|
|
1878
|
+
* @returns Formatted string like "January 2024"
|
|
1879
|
+
*/
|
|
1880
|
+
getMonthYearLabel(month: number, year: number): string;
|
|
1881
|
+
isCurrentMonthForCalendar(day: Date | null, targetMonth: number, targetYear: number): boolean;
|
|
1882
|
+
getTranslation(key: keyof DatepickerTranslations, fallbackKey?: keyof DatepickerTranslations, params?: Record<string, string | number>): string;
|
|
1883
|
+
/**
|
|
1884
|
+
* Closes the calendar and restores focus to the previously focused element.
|
|
1885
|
+
* This improves accessibility by returning focus to the trigger element.
|
|
1886
|
+
*/
|
|
1887
|
+
closeCalendarWithFocusRestore(): void;
|
|
1888
|
+
private updateRtlState;
|
|
1889
|
+
/**
|
|
1890
|
+
* Component lifecycle hook: Cleanup all resources, subscriptions, and event listeners.
|
|
1891
|
+
* Ensures no memory leaks by:
|
|
1892
|
+
* - Removing instance from static registry
|
|
1893
|
+
* - Cleaning up field sync service
|
|
1894
|
+
* - Completing stateChanges subject
|
|
1895
|
+
* - Clearing all tracked timeouts and animation frames
|
|
1896
|
+
* - Removing touch event listeners
|
|
1897
|
+
* - Invalidating month cache
|
|
1898
|
+
*/
|
|
1899
|
+
ngOnDestroy(): void;
|
|
1900
|
+
private getActualPopoverContainer;
|
|
1901
|
+
private setupFocusTrap;
|
|
1902
|
+
/**
|
|
1903
|
+
* Positions the popover relative to the input element dynamically.
|
|
1904
|
+
* - Prioritizes layout below the input.
|
|
1905
|
+
* - Falls back to positioning above if required.
|
|
1906
|
+
* - Defaults to CSS-centered positioning if space is insufficient.
|
|
1907
|
+
*
|
|
1908
|
+
* @remarks
|
|
1909
|
+
* This logic primarily targets mobile/tablet viewports; desktop layout (≥1024px)
|
|
1910
|
+
* is handled via CSS absolute positioning.
|
|
1911
|
+
*/
|
|
1912
|
+
private positionPopoverRelativeToInput;
|
|
1913
|
+
/**
|
|
1914
|
+
* Determines if the component is operating within an Ionic environment.
|
|
1915
|
+
* This detection disables features that may conflict with Ionic's overlay system.
|
|
1916
|
+
*/
|
|
1917
|
+
private isIonicEnvironment;
|
|
1918
|
+
private removeFocusTrap;
|
|
1919
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgxsmkDatepickerComponent, never>;
|
|
1920
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgxsmkDatepickerComponent, "ngxsmk-datepicker", never, { "mode": { "alias": "mode"; "required": false; }; "calendarViewMode": { "alias": "calendarViewMode"; "required": false; }; "isInvalidDate": { "alias": "isInvalidDate"; "required": false; }; "showRanges": { "alias": "showRanges"; "required": false; }; "showTime": { "alias": "showTime"; "required": false; }; "timeOnly": { "alias": "timeOnly"; "required": false; }; "timeRangeMode": { "alias": "timeRangeMode"; "required": false; }; "showCalendarButton": { "alias": "showCalendarButton"; "required": false; }; "minuteInterval": { "alias": "minuteInterval"; "required": false; }; "use24Hour": { "alias": "use24Hour"; "required": false; }; "secondInterval": { "alias": "secondInterval"; "required": false; }; "showSeconds": { "alias": "showSeconds"; "required": false; }; "holidayProvider": { "alias": "holidayProvider"; "required": false; }; "disableHolidays": { "alias": "disableHolidays"; "required": false; }; "disabledDates": { "alias": "disabledDates"; "required": false; }; "disabledRanges": { "alias": "disabledRanges"; "required": false; }; "recurringPattern": { "alias": "recurringPattern"; "required": false; }; "dateTemplate": { "alias": "dateTemplate"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; "inputId": { "alias": "inputId"; "required": false; }; "name": { "alias": "name"; "required": false; }; "autocomplete": { "alias": "autocomplete"; "required": false; }; "translations": { "alias": "translations"; "required": false; }; "translationService": { "alias": "translationService"; "required": false; }; "clearLabel": { "alias": "clearLabel"; "required": false; }; "closeLabel": { "alias": "closeLabel"; "required": false; }; "prevMonthAriaLabel": { "alias": "prevMonthAriaLabel"; "required": false; }; "nextMonthAriaLabel": { "alias": "nextMonthAriaLabel"; "required": false; }; "clearAriaLabel": { "alias": "clearAriaLabel"; "required": false; }; "closeAriaLabel": { "alias": "closeAriaLabel"; "required": false; }; "weekStart": { "alias": "weekStart"; "required": false; }; "yearRange": { "alias": "yearRange"; "required": false; }; "timezone": { "alias": "timezone"; "required": false; }; "hooks": { "alias": "hooks"; "required": false; }; "enableKeyboardShortcuts": { "alias": "enableKeyboardShortcuts"; "required": false; }; "customShortcuts": { "alias": "customShortcuts"; "required": false; }; "autoApplyClose": { "alias": "autoApplyClose"; "required": false; }; "allowSameDay": { "alias": "allowSameDay"; "required": false; }; "displayFormat": { "alias": "displayFormat"; "required": false; }; "allowTyping": { "alias": "allowTyping"; "required": false; }; "calendarCount": { "alias": "calendarCount"; "required": false; }; "calendarLayout": { "alias": "calendarLayout"; "required": false; }; "defaultMonthOffset": { "alias": "defaultMonthOffset"; "required": false; }; "syncScroll": { "alias": "syncScroll"; "required": false; }; "align": { "alias": "align"; "required": false; }; "useNativePicker": { "alias": "useNativePicker"; "required": false; }; "enableHapticFeedback": { "alias": "enableHapticFeedback"; "required": false; }; "mobileModalStyle": { "alias": "mobileModalStyle"; "required": false; }; "mobileTimePickerStyle": { "alias": "mobileTimePickerStyle"; "required": false; }; "enablePullToRefresh": { "alias": "enablePullToRefresh"; "required": false; }; "mobileTheme": { "alias": "mobileTheme"; "required": false; }; "enableVoiceInput": { "alias": "enableVoiceInput"; "required": false; }; "autoDetectMobile": { "alias": "autoDetectMobile"; "required": false; }; "disableFocusTrap": { "alias": "disableFocusTrap"; "required": false; }; "appendToBody": { "alias": "appendToBody"; "required": false; }; "value": { "alias": "value"; "required": false; }; "field": { "alias": "field"; "required": false; }; "startAt": { "alias": "startAt"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "dateFormatPattern": { "alias": "dateFormatPattern"; "required": false; }; "animationConfig": { "alias": "animationConfig"; "required": false; }; "rtl": { "alias": "rtl"; "required": false; }; "classes": { "alias": "classes"; "required": false; }; "disabledState": { "alias": "disabledState"; "required": false; }; "required": { "alias": "required"; "required": false; }; "errorState": { "alias": "errorState"; "required": false; }; "userAriaDescribedBy": { "alias": "userAriaDescribedBy"; "required": false; }; "minDate": { "alias": "minDate"; "required": false; }; "maxDate": { "alias": "maxDate"; "required": false; }; "ranges": { "alias": "ranges"; "required": false; }; }, { "valueChange": "valueChange"; "action": "action"; "validationError": "validationError"; }, never, never, true, never>;
|
|
1921
|
+
}
|
|
1922
|
+
|
|
1923
|
+
/**
|
|
1924
|
+
* Wrapper NgModule for the standalone datepicker component.
|
|
1925
|
+
* Use this in your `imports` array if you see NG1010 ("imports must be an array...
|
|
1926
|
+
* Value could not be determined statically") when using the Angular compiler plugin
|
|
1927
|
+
* or in strict AOT builds.
|
|
1928
|
+
*
|
|
1929
|
+
* @example
|
|
1930
|
+
* ```typescript
|
|
1931
|
+
* import { NgxsmkDatepickerModule } from 'ngxsmk-datepicker';
|
|
1932
|
+
*
|
|
1933
|
+
* @Component({
|
|
1934
|
+
* standalone: true,
|
|
1935
|
+
* imports: [NgxsmkDatepickerModule], // single static reference
|
|
1936
|
+
* template: '<ngxsmk-datepicker></ngxsmk-datepicker>'
|
|
1937
|
+
* })
|
|
1938
|
+
* export class MyComponent {}
|
|
1939
|
+
* ```
|
|
1940
|
+
*
|
|
1941
|
+
* For NgModule-based apps:
|
|
1942
|
+
* ```typescript
|
|
1943
|
+
* @NgModule({
|
|
1944
|
+
* imports: [NgxsmkDatepickerModule],
|
|
1945
|
+
* exports: [NgxsmkDatepickerModule]
|
|
1946
|
+
* })
|
|
1947
|
+
* export class MyFeatureModule {}
|
|
1948
|
+
* ```
|
|
1949
|
+
*/
|
|
1950
|
+
declare class NgxsmkDatepickerModule {
|
|
1951
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgxsmkDatepickerModule, never>;
|
|
1952
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<NgxsmkDatepickerModule, never, [typeof NgxsmkDatepickerComponent], [typeof NgxsmkDatepickerComponent]>;
|
|
1953
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<NgxsmkDatepickerModule>;
|
|
1954
|
+
}
|
|
1955
|
+
|
|
1956
|
+
interface ExportOptions {
|
|
1957
|
+
includeTime?: boolean;
|
|
1958
|
+
dateFormat?: string;
|
|
1959
|
+
timezone?: string;
|
|
1960
|
+
csvHeaders?: string[];
|
|
1961
|
+
}
|
|
1962
|
+
declare function exportToJson(value: DatepickerValue, options?: ExportOptions): string;
|
|
1963
|
+
declare function importFromJson(jsonString: string): DatepickerValue;
|
|
1964
|
+
declare function exportToCsv(value: DatepickerValue, options?: ExportOptions): string;
|
|
1965
|
+
declare function importFromCsv(csvString: string): DatepickerValue;
|
|
1966
|
+
declare function exportToIcs(value: DatepickerValue, options?: ExportOptions & {
|
|
1967
|
+
summary?: string;
|
|
1968
|
+
description?: string;
|
|
1969
|
+
location?: string;
|
|
1970
|
+
}): string;
|
|
1971
|
+
declare function importFromIcs(icsString: string): DatepickerValue;
|
|
1972
|
+
|
|
1973
|
+
/**
|
|
1974
|
+
* Format a date with timezone support
|
|
1975
|
+
* @param date The date to format
|
|
1976
|
+
* @param locale The locale for formatting
|
|
1977
|
+
* @param options Intl.DateTimeFormatOptions
|
|
1978
|
+
* @param timezone Optional timezone (IANA timezone name, e.g., 'America/New_York', 'UTC', 'Europe/London')
|
|
1979
|
+
* @returns Formatted date string
|
|
1980
|
+
*/
|
|
1981
|
+
declare function formatDateWithTimezone(date: Date, locale: string, options: Intl.DateTimeFormatOptions, timezone?: string): string;
|
|
1982
|
+
/**
|
|
1983
|
+
* Parse a date string with timezone awareness
|
|
1984
|
+
* @param dateString The date string to parse
|
|
1985
|
+
* @param timezone Optional timezone for parsing (IANA timezone name)
|
|
1986
|
+
* @returns Date object (always in UTC internally)
|
|
1987
|
+
*/
|
|
1988
|
+
declare function parseDateWithTimezone(dateString: string, timezone?: string): Date | null;
|
|
1989
|
+
/**
|
|
1990
|
+
* Convert a date from one timezone to another
|
|
1991
|
+
* @param date The date to convert
|
|
1992
|
+
* @param fromTimezone Source timezone (IANA name)
|
|
1993
|
+
* @param _toTimezone Target timezone (IANA name) - currently unused in simplified implementation
|
|
1994
|
+
* @returns New Date object (still UTC internally, but represents the time in target timezone)
|
|
1995
|
+
*/
|
|
1996
|
+
declare function convertTimezone(date: Date, fromTimezone: string, _toTimezone: string): Date;
|
|
1997
|
+
/**
|
|
1998
|
+
* Get the current timezone offset in minutes for a given timezone
|
|
1999
|
+
* @param timezone IANA timezone name
|
|
2000
|
+
* @param date Optional date to check offset for (defaults to now)
|
|
2001
|
+
* @returns Offset in minutes from UTC
|
|
2002
|
+
*/
|
|
2003
|
+
declare function getTimezoneOffset(timezone: string, date?: Date): number;
|
|
2004
|
+
/**
|
|
2005
|
+
* Check if a timezone string is valid
|
|
2006
|
+
* @param timezone IANA timezone name
|
|
2007
|
+
* @returns true if valid, false otherwise
|
|
2008
|
+
*/
|
|
2009
|
+
declare function isValidTimezone(timezone: string): boolean;
|
|
2010
|
+
|
|
2011
|
+
/**
|
|
2012
|
+
* Calendar system types supported by the datepicker
|
|
2013
|
+
*/
|
|
2014
|
+
type CalendarSystem = 'gregorian' | 'islamic' | 'buddhist' | 'japanese' | 'hebrew' | 'persian';
|
|
2015
|
+
/**
|
|
2016
|
+
* Locale data structure for datepicker localization
|
|
2017
|
+
*/
|
|
2018
|
+
interface LocaleData {
|
|
2019
|
+
/** Calendar system used by this locale */
|
|
2020
|
+
calendar: CalendarSystem;
|
|
2021
|
+
/** First day of the week (0 = Sunday, 1 = Monday, etc.) */
|
|
2022
|
+
firstDayOfWeek: number;
|
|
2023
|
+
/** Default date format string (e.g., 'MM/DD/YYYY', 'DD/MM/YYYY') */
|
|
2024
|
+
dateFormat: string;
|
|
2025
|
+
/** Full month names (12 elements) */
|
|
2026
|
+
monthNames: string[];
|
|
2027
|
+
/** Short month names (12 elements) */
|
|
2028
|
+
monthNamesShort: string[];
|
|
2029
|
+
/** Full weekday names (7 elements, starting with Sunday) */
|
|
2030
|
+
weekdayNames: string[];
|
|
2031
|
+
/** Short weekday names (7 elements, starting with Sunday) */
|
|
2032
|
+
weekdayNamesShort: string[];
|
|
2033
|
+
/** Whether this locale uses RTL (right-to-left) text direction */
|
|
2034
|
+
isRtl: boolean;
|
|
2035
|
+
/** Fallback locale if this one is not fully supported */
|
|
2036
|
+
fallbackLocale?: string;
|
|
2037
|
+
/** Locale-specific date format options */
|
|
2038
|
+
dateFormatOptions?: {
|
|
2039
|
+
year?: 'numeric' | '2-digit';
|
|
2040
|
+
month?: 'numeric' | '2-digit' | 'long' | 'short' | 'narrow';
|
|
2041
|
+
day?: 'numeric' | '2-digit';
|
|
2042
|
+
hour?: 'numeric' | '2-digit';
|
|
2043
|
+
minute?: 'numeric' | '2-digit';
|
|
2044
|
+
hour12?: boolean;
|
|
2045
|
+
};
|
|
2046
|
+
}
|
|
2047
|
+
/**
|
|
2048
|
+
* Service for managing locale data and providing fallback mechanisms
|
|
2049
|
+
* Supports multiple calendar systems and provides locale-specific formatting
|
|
2050
|
+
*/
|
|
2051
|
+
declare class LocaleRegistryService {
|
|
2052
|
+
private localeData;
|
|
2053
|
+
private readonly defaultLocale;
|
|
2054
|
+
constructor();
|
|
2055
|
+
/**
|
|
2056
|
+
* Register locale data for a specific locale
|
|
2057
|
+
*/
|
|
2058
|
+
register(locale: string, data: LocaleData): void;
|
|
2059
|
+
/**
|
|
2060
|
+
* Get locale data for a specific locale, with fallback support
|
|
2061
|
+
*/
|
|
2062
|
+
getLocaleData(locale: string): LocaleData;
|
|
2063
|
+
/**
|
|
2064
|
+
* Get fallback locale for an unsupported locale
|
|
2065
|
+
*/
|
|
2066
|
+
getFallbackLocale(unsupportedLocale: string): string | null;
|
|
2067
|
+
/**
|
|
2068
|
+
* Check if a locale is RTL
|
|
2069
|
+
*/
|
|
2070
|
+
isRtlLocale(locale: string): boolean;
|
|
2071
|
+
/**
|
|
2072
|
+
* Get calendar system for a locale
|
|
2073
|
+
*/
|
|
2074
|
+
getCalendarSystem(locale: string): CalendarSystem;
|
|
2075
|
+
/**
|
|
2076
|
+
* Register default locale data for common locales
|
|
2077
|
+
*/
|
|
2078
|
+
private registerDefaultLocales;
|
|
2079
|
+
/**
|
|
2080
|
+
* Get default locale data (English US)
|
|
2081
|
+
*/
|
|
2082
|
+
private getDefaultLocaleData;
|
|
2083
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LocaleRegistryService, never>;
|
|
2084
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<LocaleRegistryService>;
|
|
2085
|
+
}
|
|
2086
|
+
|
|
2087
|
+
/**
|
|
2088
|
+
* Service for managing datepicker translations
|
|
2089
|
+
* Provides default translations for major languages
|
|
2090
|
+
*/
|
|
2091
|
+
declare class TranslationRegistryService {
|
|
2092
|
+
private translations;
|
|
2093
|
+
constructor();
|
|
2094
|
+
/**
|
|
2095
|
+
* Register translations for a locale
|
|
2096
|
+
*/
|
|
2097
|
+
register(locale: string, translations: DatepickerTranslations): void;
|
|
2098
|
+
/**
|
|
2099
|
+
* Get translations for a locale with fallback support
|
|
2100
|
+
*/
|
|
2101
|
+
getTranslations(locale: string): DatepickerTranslations;
|
|
2102
|
+
/**
|
|
2103
|
+
* Register default translations for major languages
|
|
2104
|
+
*/
|
|
2105
|
+
private registerDefaultTranslations;
|
|
2106
|
+
/**
|
|
2107
|
+
* Get English translations (default)
|
|
2108
|
+
*/
|
|
2109
|
+
private getEnglishTranslations;
|
|
2110
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TranslationRegistryService, never>;
|
|
2111
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<TranslationRegistryService>;
|
|
2112
|
+
}
|
|
2113
|
+
|
|
2114
|
+
/**
|
|
2115
|
+
* Service for custom date formatting patterns.
|
|
2116
|
+
* Supports custom patterns beyond standard Angular DatePipe formats.
|
|
2117
|
+
*
|
|
2118
|
+
* @remarks
|
|
2119
|
+
* Supports the following pattern tokens:
|
|
2120
|
+
* - YYYY: 4-digit year (e.g., 2025)
|
|
2121
|
+
* - YY: 2-digit year (e.g., 25)
|
|
2122
|
+
* - MMMM: Full month name (e.g., January)
|
|
2123
|
+
* - MMM: Abbreviated month name (e.g., Jan)
|
|
2124
|
+
* - MM: 2-digit month (e.g., 01)
|
|
2125
|
+
* - M: 1 or 2-digit month (e.g., 1)
|
|
2126
|
+
* - DDDD: Full weekday name (e.g., Monday)
|
|
2127
|
+
* - DDD: Abbreviated weekday name (e.g., Mon)
|
|
2128
|
+
* - DD: 2-digit day (e.g., 05)
|
|
2129
|
+
* - D: 1 or 2-digit day (e.g., 5)
|
|
2130
|
+
* - HH: 2-digit hour (24-hour format, e.g., 14)
|
|
2131
|
+
* - H: 1 or 2-digit hour (24-hour format, e.g., 14)
|
|
2132
|
+
* - hh: 2-digit hour (12-hour format, e.g., 02)
|
|
2133
|
+
* - h: 1 or 2-digit hour (12-hour format, e.g., 2)
|
|
2134
|
+
* - mm: 2-digit minutes (e.g., 05)
|
|
2135
|
+
* - m: 1 or 2-digit minutes (e.g., 5)
|
|
2136
|
+
* - ss: 2-digit seconds (e.g., 09)
|
|
2137
|
+
* - s: 1 or 2-digit seconds (e.g., 9)
|
|
2138
|
+
* - A/a: AM/PM or am/pm
|
|
2139
|
+
*/
|
|
2140
|
+
declare class CustomDateFormatService {
|
|
2141
|
+
private locale;
|
|
2142
|
+
private readonly monthNames;
|
|
2143
|
+
private readonly weekdayNames;
|
|
2144
|
+
constructor(locale?: string);
|
|
2145
|
+
/**
|
|
2146
|
+
* Set the locale for formatting
|
|
2147
|
+
*/
|
|
2148
|
+
setLocale(locale: string): void;
|
|
2149
|
+
/**
|
|
2150
|
+
* Format a date using a custom pattern
|
|
2151
|
+
*
|
|
2152
|
+
* @param date - The date to format
|
|
2153
|
+
* @param pattern - The custom format pattern
|
|
2154
|
+
* @returns Formatted date string
|
|
2155
|
+
*/
|
|
2156
|
+
format(date: Date, pattern: string): string;
|
|
2157
|
+
/**
|
|
2158
|
+
* Parse a formatted date string back to a Date object
|
|
2159
|
+
* Note: This is a best-effort implementation and may not work for all patterns
|
|
2160
|
+
*
|
|
2161
|
+
* @param dateString - The date string to parse
|
|
2162
|
+
* @param pattern - The format pattern used
|
|
2163
|
+
* @returns Parsed Date object, or null if parsing fails
|
|
2164
|
+
*/
|
|
2165
|
+
parse(dateString: string, _pattern: string): Date | null;
|
|
2166
|
+
private getMonthNames;
|
|
2167
|
+
private initializeLocaleData;
|
|
2168
|
+
private getWeekdayNames;
|
|
2169
|
+
}
|
|
2170
|
+
|
|
2171
|
+
/**
|
|
2172
|
+
* Theme builder service for generating CSS-in-JS styles and managing themes
|
|
2173
|
+
*/
|
|
2174
|
+
declare class ThemeBuilderService implements OnDestroy {
|
|
2175
|
+
private readonly platformId;
|
|
2176
|
+
private styleElement;
|
|
2177
|
+
private scopedStyleElements;
|
|
2178
|
+
/**
|
|
2179
|
+
* Map theme color keys to actual CSS variable names
|
|
2180
|
+
*/
|
|
2181
|
+
private mapColorKey;
|
|
2182
|
+
/**
|
|
2183
|
+
* Map typography keys to actual CSS variable names
|
|
2184
|
+
*/
|
|
2185
|
+
private mapTypographyKey;
|
|
2186
|
+
/**
|
|
2187
|
+
* Generate CSS variables from a theme object
|
|
2188
|
+
*/
|
|
2189
|
+
generateTheme(theme: DatepickerTheme): string;
|
|
2190
|
+
/**
|
|
2191
|
+
* Apply theme to a specific element or globally
|
|
2192
|
+
* @param theme The theme to apply
|
|
2193
|
+
* @param targetElement Optional specific element to apply theme to. If not provided, applies globally.
|
|
2194
|
+
*/
|
|
2195
|
+
applyTheme(theme: DatepickerTheme, targetElement?: HTMLElement): void;
|
|
2196
|
+
/**
|
|
2197
|
+
* Apply theme variables directly to all datepicker elements (for global theme)
|
|
2198
|
+
* Optimized version with batch DOM operations
|
|
2199
|
+
*/
|
|
2200
|
+
private applyToElements;
|
|
2201
|
+
/**
|
|
2202
|
+
* Generate CSS-in-JS style object (for styled-components, emotion, etc.)
|
|
2203
|
+
*/
|
|
2204
|
+
generateStyleObject(theme: DatepickerTheme): Record<string, string>;
|
|
2205
|
+
/**
|
|
2206
|
+
* Remove applied theme
|
|
2207
|
+
* @param targetElement Optional specific element to remove theme from. If not provided, removes from all.
|
|
2208
|
+
*/
|
|
2209
|
+
removeTheme(targetElement?: HTMLElement): void;
|
|
2210
|
+
/**
|
|
2211
|
+
* Get current theme from CSS variables
|
|
2212
|
+
*/
|
|
2213
|
+
getCurrentTheme(selector?: string): Partial<DatepickerTheme>;
|
|
2214
|
+
/**
|
|
2215
|
+
* Clean up all themes and resources when service is destroyed
|
|
2216
|
+
*/
|
|
2217
|
+
cleanupAllThemes(): void;
|
|
2218
|
+
ngOnDestroy(): void;
|
|
2219
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ThemeBuilderService, never>;
|
|
2220
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<ThemeBuilderService>;
|
|
2221
|
+
}
|
|
2222
|
+
/**
|
|
2223
|
+
* Datepicker theme interface
|
|
2224
|
+
*/
|
|
2225
|
+
interface DatepickerTheme {
|
|
2226
|
+
colors?: {
|
|
2227
|
+
primary?: string;
|
|
2228
|
+
secondary?: string;
|
|
2229
|
+
background?: string;
|
|
2230
|
+
surface?: string;
|
|
2231
|
+
text?: string;
|
|
2232
|
+
textSecondary?: string;
|
|
2233
|
+
border?: string;
|
|
2234
|
+
hover?: string;
|
|
2235
|
+
active?: string;
|
|
2236
|
+
disabled?: string;
|
|
2237
|
+
error?: string;
|
|
2238
|
+
[key: string]: string | undefined;
|
|
2239
|
+
};
|
|
2240
|
+
spacing?: {
|
|
2241
|
+
xs?: string;
|
|
2242
|
+
sm?: string;
|
|
2243
|
+
md?: string;
|
|
2244
|
+
lg?: string;
|
|
2245
|
+
xl?: string;
|
|
2246
|
+
[key: string]: string | undefined;
|
|
2247
|
+
};
|
|
2248
|
+
typography?: {
|
|
2249
|
+
fontFamily?: string;
|
|
2250
|
+
fontSize?: string;
|
|
2251
|
+
fontWeight?: string;
|
|
2252
|
+
lineHeight?: string;
|
|
2253
|
+
[key: string]: string | undefined;
|
|
2254
|
+
};
|
|
2255
|
+
borderRadius?: {
|
|
2256
|
+
sm?: string;
|
|
2257
|
+
md?: string;
|
|
2258
|
+
lg?: string;
|
|
2259
|
+
full?: string;
|
|
2260
|
+
[key: string]: string | undefined;
|
|
2261
|
+
};
|
|
2262
|
+
shadows?: {
|
|
2263
|
+
sm?: string;
|
|
2264
|
+
md?: string;
|
|
2265
|
+
lg?: string;
|
|
2266
|
+
/** Focus ring (e.g. input focus). Use a color-mix or rgba for 15% opacity. Example: 0 0 0 3px color-mix(in srgb, var(--datepicker-primary-color) 15%, transparent) */
|
|
2267
|
+
focus?: string;
|
|
2268
|
+
[key: string]: string | undefined;
|
|
2269
|
+
};
|
|
2270
|
+
}
|
|
2271
|
+
|
|
2272
|
+
/**
|
|
2273
|
+
* Date preset interface
|
|
2274
|
+
*/
|
|
2275
|
+
interface DatePreset {
|
|
2276
|
+
id: string;
|
|
2277
|
+
name: string;
|
|
2278
|
+
value: DatepickerValue;
|
|
2279
|
+
createdAt: Date;
|
|
2280
|
+
updatedAt: Date;
|
|
2281
|
+
category?: string;
|
|
2282
|
+
description?: string;
|
|
2283
|
+
}
|
|
2284
|
+
/**
|
|
2285
|
+
* Service for managing date presets with localStorage persistence
|
|
2286
|
+
*/
|
|
2287
|
+
declare class DatePresetsService {
|
|
2288
|
+
private readonly platformId;
|
|
2289
|
+
private readonly storageKey;
|
|
2290
|
+
private presets;
|
|
2291
|
+
constructor();
|
|
2292
|
+
/**
|
|
2293
|
+
* Save a date preset
|
|
2294
|
+
*/
|
|
2295
|
+
savePreset(preset: Omit<DatePreset, 'id' | 'createdAt' | 'updatedAt'>): DatePreset;
|
|
2296
|
+
/**
|
|
2297
|
+
* Update an existing preset
|
|
2298
|
+
*/
|
|
2299
|
+
updatePreset(id: string, updates: Partial<Omit<DatePreset, 'id' | 'createdAt'>>): DatePreset | null;
|
|
2300
|
+
/**
|
|
2301
|
+
* Get a preset by ID
|
|
2302
|
+
*/
|
|
2303
|
+
getPreset(id: string): DatePreset | null;
|
|
2304
|
+
/**
|
|
2305
|
+
* Get all presets
|
|
2306
|
+
*/
|
|
2307
|
+
getAllPresets(): DatePreset[];
|
|
2308
|
+
/**
|
|
2309
|
+
* Get presets by category
|
|
2310
|
+
*/
|
|
2311
|
+
getPresetsByCategory(category: string): DatePreset[];
|
|
2312
|
+
/**
|
|
2313
|
+
* Get all categories
|
|
2314
|
+
*/
|
|
2315
|
+
getCategories(): string[];
|
|
2316
|
+
/**
|
|
2317
|
+
* Delete a preset
|
|
2318
|
+
*/
|
|
2319
|
+
deletePreset(id: string): boolean;
|
|
2320
|
+
/**
|
|
2321
|
+
* Clear all presets
|
|
2322
|
+
*/
|
|
2323
|
+
clearPresets(): void;
|
|
2324
|
+
/**
|
|
2325
|
+
* Apply a preset value (returns the value, not the preset object)
|
|
2326
|
+
*/
|
|
2327
|
+
applyPreset(id: string): DatepickerValue | null;
|
|
2328
|
+
/**
|
|
2329
|
+
* Check if a preset exists
|
|
2330
|
+
*/
|
|
2331
|
+
hasPreset(id: string): boolean;
|
|
2332
|
+
/**
|
|
2333
|
+
* Get preset count
|
|
2334
|
+
*/
|
|
2335
|
+
getPresetCount(): number;
|
|
2336
|
+
/**
|
|
2337
|
+
* Export presets to JSON
|
|
2338
|
+
*/
|
|
2339
|
+
exportPresets(): string;
|
|
2340
|
+
/**
|
|
2341
|
+
* Import presets from JSON
|
|
2342
|
+
*/
|
|
2343
|
+
importPresets(jsonString: string, merge?: boolean): {
|
|
2344
|
+
imported: number;
|
|
2345
|
+
errors: number;
|
|
2346
|
+
};
|
|
2347
|
+
private loadPresets;
|
|
2348
|
+
private persistPresets;
|
|
2349
|
+
private generateId;
|
|
2350
|
+
private cloneValue;
|
|
2351
|
+
private deserializeValue;
|
|
2352
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DatePresetsService, never>;
|
|
2353
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<DatePresetsService>;
|
|
2354
|
+
}
|
|
2355
|
+
|
|
2356
|
+
declare class AriaLiveService implements OnDestroy {
|
|
2357
|
+
private readonly platformId;
|
|
2358
|
+
private readonly isBrowser;
|
|
2359
|
+
private politeRegion;
|
|
2360
|
+
private assertiveRegion;
|
|
2361
|
+
private politeClearTimeoutId;
|
|
2362
|
+
private assertiveClearTimeoutId;
|
|
2363
|
+
private debounceTimeoutId;
|
|
2364
|
+
private announcementQueue;
|
|
2365
|
+
private readonly DEBOUNCE_DELAY;
|
|
2366
|
+
private readonly CLEAR_DELAY;
|
|
2367
|
+
constructor();
|
|
2368
|
+
/**
|
|
2369
|
+
* Announce a message to screen readers with improved timing and queue management
|
|
2370
|
+
*/
|
|
2371
|
+
announce(message: string, priority?: 'polite' | 'assertive'): void;
|
|
2372
|
+
/**
|
|
2373
|
+
* Process queued announcements, keeping only the most recent for each priority
|
|
2374
|
+
*/
|
|
2375
|
+
private processAnnouncementQueue;
|
|
2376
|
+
/**
|
|
2377
|
+
* Announce to a specific live region
|
|
2378
|
+
*/
|
|
2379
|
+
private announceToRegion;
|
|
2380
|
+
/**
|
|
2381
|
+
* Set announcement text and schedule cleanup
|
|
2382
|
+
*/
|
|
2383
|
+
private setAnnouncement;
|
|
2384
|
+
/**
|
|
2385
|
+
* Create a live region for announcements
|
|
2386
|
+
*/
|
|
2387
|
+
private createLiveRegion;
|
|
2388
|
+
ngOnDestroy(): void;
|
|
2389
|
+
destroy(): void;
|
|
2390
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AriaLiveService, never>;
|
|
2391
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<AriaLiveService>;
|
|
2392
|
+
}
|
|
2393
|
+
|
|
2394
|
+
declare class FocusTrapService implements OnDestroy {
|
|
2395
|
+
private activeTraps;
|
|
2396
|
+
private focusableSelectors;
|
|
2397
|
+
/**
|
|
2398
|
+
* Trap focus within an element and restore focus on cleanup
|
|
2399
|
+
*/
|
|
2400
|
+
trapFocus(elementRef: ElementRef<HTMLElement>): () => void;
|
|
2401
|
+
/**
|
|
2402
|
+
* Remove focus trap and restore previous focus
|
|
2403
|
+
*/
|
|
2404
|
+
private removeFocusTrap;
|
|
2405
|
+
private getFirstFocusable;
|
|
2406
|
+
private getLastFocusable;
|
|
2407
|
+
ngOnDestroy(): void;
|
|
2408
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FocusTrapService, never>;
|
|
2409
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<FocusTrapService>;
|
|
2410
|
+
}
|
|
2411
|
+
|
|
2412
|
+
declare class HapticFeedbackService {
|
|
2413
|
+
private readonly platformId;
|
|
2414
|
+
private readonly isBrowser;
|
|
2415
|
+
private readonly isSupported;
|
|
2416
|
+
/**
|
|
2417
|
+
* Trigger light haptic feedback (short vibration)
|
|
2418
|
+
*/
|
|
2419
|
+
light(): void;
|
|
2420
|
+
selection(): void;
|
|
2421
|
+
medium(): void;
|
|
2422
|
+
heavy(): void;
|
|
2423
|
+
/**
|
|
2424
|
+
* Trigger custom vibration pattern
|
|
2425
|
+
* @param pattern Vibration pattern in milliseconds
|
|
2426
|
+
*/
|
|
2427
|
+
custom(pattern: number | number[]): void;
|
|
2428
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<HapticFeedbackService, never>;
|
|
2429
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<HapticFeedbackService>;
|
|
2430
|
+
}
|
|
2431
|
+
|
|
2432
|
+
export { AriaLiveService, CustomDateFormatService, CustomSelectComponent, DATEPICKER_CONFIG, DEFAULT_ANIMATION_CONFIG, DEFAULT_DATEPICKER_CONFIG, DatePresetsService, DefaultTranslationService, FieldSyncService, FocusTrapService, HapticFeedbackService, LocaleRegistryService, NativeDateAdapter, NgxsmkDatepickerComponent, NgxsmkDatepickerModule, ThemeBuilderService, TranslationRegistryService, addMonths, convertTimezone, exportToCsv, exportToIcs, exportToJson, formatDateWithTimezone, formatLocaleNumber, generateDecadeGrid, generateMonthOptions, generateTimeOptions, generateWeekDays, generateYearGrid, generateYearOptions, get24Hour, getEndOfDay, getEndOfMonth, getFirstDayOfWeek, getStartOfDay, getStartOfMonth, getTimezoneOffset, importFromCsv, importFromIcs, importFromJson, isSameDay, isValidTimezone, normalizeDate, parseDateWithTimezone, processDateRanges, provideDatepickerConfig, subtractDays, update12HourState };
|
|
2433
|
+
export type { AnimationConfig, CalendarSystem, DateAdapter, DateFormatHook, DateInput, DatePreset, DateRange, DatepickerConfig, DatepickerHooks, DatepickerTheme, DatepickerTranslations, DatepickerValue, DayCellRenderHook, EventHook, ExportOptions, HolidayProvider, KeyboardShortcutContext, KeyboardShortcutHelp, KeyboardShortcutHook, LocaleData, PartialDatepickerTranslations, SignalFormField, SignalFormFieldConfig, TranslationService, ValidationHook };
|