@wzrdev/ngx-datepicker 0.0.1

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/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # NgxDatepicker
2
+
3
+ This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 19.2.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
8
+
9
+ ```bash
10
+ ng generate component component-name
11
+ ```
12
+
13
+ For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
14
+
15
+ ```bash
16
+ ng generate --help
17
+ ```
18
+
19
+ ## Building
20
+
21
+ To build the library, run:
22
+
23
+ ```bash
24
+ ng build ngx-datepicker
25
+ ```
26
+
27
+ This command will compile your project, and the build artifacts will be placed in the `dist/` directory.
28
+
29
+ ### Publishing the Library
30
+
31
+ Once the project is built, you can publish your library by following these steps:
32
+
33
+ 1. Navigate to the `dist` directory:
34
+ ```bash
35
+ cd dist/ngx-datepicker
36
+ ```
37
+
38
+ 2. Run the `npm publish` command to publish your library to the npm registry:
39
+ ```bash
40
+ npm publish
41
+ ```
42
+
43
+ ## Running unit tests
44
+
45
+ To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
46
+
47
+ ```bash
48
+ ng test
49
+ ```
50
+
51
+ ## Running end-to-end tests
52
+
53
+ For end-to-end (e2e) testing, run:
54
+
55
+ ```bash
56
+ ng e2e
57
+ ```
58
+
59
+ Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
60
+
61
+ ## Additional Resources
62
+
63
+ For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
@@ -0,0 +1,493 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injectable, inject, model, signal, input, output, linkedSignal, computed, ChangeDetectionStrategy, Component, Directive, ElementRef, effect, forwardRef } from '@angular/core';
3
+ import { BehaviorSubject } from 'rxjs';
4
+ import { clsx } from 'clsx';
5
+ import { extendTailwindMerge } from 'tailwind-merge';
6
+ import { DatePipe } from '@angular/common';
7
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
8
+
9
+ const currentYear$1 = new Date().getFullYear();
10
+ const FR_LOCALE = {
11
+ code: "fr",
12
+ months: [
13
+ "Janvier",
14
+ "Février",
15
+ "Mars",
16
+ "Avril",
17
+ "Mai",
18
+ "Juin",
19
+ "Juillet",
20
+ "Août",
21
+ "Septembre",
22
+ "Octobre",
23
+ "Novembre",
24
+ "Décembre",
25
+ ],
26
+ weekdays: ["Lu", "Ma", "Me", "Je", "Ve", "Sa", "Di"],
27
+ weekStartsOn: 1,
28
+ years: Array.from({ length: 200 }, (_, i) => currentYear$1 - 100 + i),
29
+ format: date => date.toLocaleDateString("fr-FR"),
30
+ };
31
+
32
+ const currentYear = new Date().getFullYear();
33
+ const EN_LOCALE = {
34
+ code: "en",
35
+ months: [
36
+ "January",
37
+ "February",
38
+ "March",
39
+ "April",
40
+ "May",
41
+ "June",
42
+ "July",
43
+ "August",
44
+ "September",
45
+ "October",
46
+ "November",
47
+ "December",
48
+ ],
49
+ weekdays: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
50
+ weekStartsOn: 0,
51
+ years: Array.from({ length: 200 }, (_, i) => currentYear - 100 + i),
52
+ format: date => date.toLocaleDateString("en-US"),
53
+ };
54
+
55
+ class DatePickerLocaleService {
56
+ locales = {
57
+ fr: FR_LOCALE,
58
+ en: EN_LOCALE,
59
+ };
60
+ locale$ = new BehaviorSubject(FR_LOCALE);
61
+ setLocale(code) {
62
+ this.locale$.next(this.locales[code] ?? FR_LOCALE);
63
+ }
64
+ get localeChanges$() {
65
+ return this.locale$.asObservable();
66
+ }
67
+ get current() {
68
+ return this.locale$.value;
69
+ }
70
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: DatePickerLocaleService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
71
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: DatePickerLocaleService, providedIn: "root" });
72
+ }
73
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: DatePickerLocaleService, decorators: [{
74
+ type: Injectable,
75
+ args: [{ providedIn: "root" }]
76
+ }] });
77
+
78
+ const customTwMerge = extendTailwindMerge({
79
+ extend: {
80
+ classGroups: {},
81
+ },
82
+ });
83
+ const cn = (...inputs) => {
84
+ return customTwMerge(clsx(inputs));
85
+ };
86
+
87
+ class CalendarService {
88
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: CalendarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
89
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: CalendarService });
90
+ }
91
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: CalendarService, decorators: [{
92
+ type: Injectable
93
+ }] });
94
+
95
+ class CalendarComponent {
96
+ locale = inject(DatePickerLocaleService);
97
+ startDate = model();
98
+ endDate = model();
99
+ hoveredDate = signal(null);
100
+ enableRange = input(false);
101
+ selectedDate = output();
102
+ selectedDateRange = output();
103
+ selectedDaysCount = output();
104
+ hoverDate = output();
105
+ days = linkedSignal(() => {
106
+ const startDate = this.startDate();
107
+ const endDate = this.endDate();
108
+ const displayDate = this.displayDate();
109
+ const year = displayDate.getFullYear();
110
+ const month = displayDate.getMonth();
111
+ const today = new Date();
112
+ const first = new Date(year, month, 1);
113
+ const last = new Date(year, month + 1, 0);
114
+ const days = [];
115
+ for (let d = new Date(first); d <= last; d.setDate(d.getDate() + 1)) {
116
+ const day = {
117
+ date: new Date(d),
118
+ isToday: this.isSame(d, today),
119
+ isSelected: this.isSame(d, startDate) || this.isSame(d, endDate),
120
+ isInRange: this.isInRange(d),
121
+ };
122
+ days.push(day);
123
+ }
124
+ return days;
125
+ });
126
+ daysInRange = computed(() => {
127
+ const days = this.days();
128
+ return days.filter(day => day.isInRange);
129
+ });
130
+ latestDayInRange = computed(() => {
131
+ const rangeDays = this.daysInRange();
132
+ return rangeDays[rangeDays.length - 1];
133
+ });
134
+ displayDate = linkedSignal(() => {
135
+ const start = this.startDate();
136
+ return start ?? new Date();
137
+ });
138
+ focusedDate = linkedSignal(() => {
139
+ return new Date(this.displayDate());
140
+ });
141
+ cn = cn;
142
+ build() {
143
+ // Assurer que focusedDate est dans le mois courant
144
+ if (this.focusedDate().getMonth() !== this.displayDate().getMonth()) {
145
+ this.focusedDate.set(new Date(this.displayDate().getFullYear(), this.displayDate().getMonth(), 1));
146
+ }
147
+ }
148
+ prevMonth() {
149
+ this.displayDate.update((prevState) => {
150
+ return new Date(prevState.getFullYear(), prevState.getMonth() - 1, prevState.getDate());
151
+ });
152
+ }
153
+ nextMonth() {
154
+ this.displayDate.update((prevState) => {
155
+ return new Date(prevState.getFullYear(), prevState.getMonth() + 1, prevState.getDate());
156
+ });
157
+ }
158
+ isSame(a, b) {
159
+ if (!a || !b)
160
+ return false;
161
+ return a.toDateString() === b.toDateString();
162
+ }
163
+ isInRange(d) {
164
+ const start = this.startDate();
165
+ const end = this.endDate();
166
+ const hover = this.hoveredDate();
167
+ if (!start || !d)
168
+ return false;
169
+ if (start && end)
170
+ return d >= start && d <= end;
171
+ if (start && hover) {
172
+ return d >= start && d <= hover;
173
+ }
174
+ return false;
175
+ }
176
+ ;
177
+ onDaySelect(date) {
178
+ const selectedDays = this.days().filter(day => day.isSelected);
179
+ const startDate = this.startDate();
180
+ const endDate = this.endDate();
181
+ if (this.enableRange()) {
182
+ if (selectedDays.length === 2
183
+ || startDate && date < startDate
184
+ || endDate && endDate <= date
185
+ || endDate && date <= endDate) {
186
+ this.resetStartDate(date);
187
+ }
188
+ if (!startDate) {
189
+ this.startDate.set(date);
190
+ }
191
+ else if (startDate && !endDate && startDate < date) {
192
+ this.endDate.set(date);
193
+ }
194
+ }
195
+ else {
196
+ this.resetStartDate(date);
197
+ }
198
+ if (this.enableRange()) {
199
+ this.selectedDateRange.emit({ startDate: this.startDate() ?? null, endDate: this.endDate() ?? null });
200
+ }
201
+ else {
202
+ this.selectedDate.emit(date);
203
+ }
204
+ this.selectedDaysCount.emit(this.daysInRange().length);
205
+ }
206
+ onDayMouseEnter(date) {
207
+ if (!this.enableRange() || (this.startDate() && this.endDate())) {
208
+ return;
209
+ }
210
+ this.hoveredDate.set(date);
211
+ }
212
+ handleKeyDown(event) {
213
+ if (!this.focusedDate)
214
+ return;
215
+ const newDate = new Date(this.focusedDate());
216
+ switch (event.key) {
217
+ case "ArrowRight":
218
+ newDate.setDate(newDate.getDate() + 1);
219
+ break;
220
+ case "ArrowLeft":
221
+ newDate.setDate(newDate.getDate() - 1);
222
+ break;
223
+ case "ArrowDown":
224
+ newDate.setDate(newDate.getDate() + 7);
225
+ break;
226
+ case "ArrowUp":
227
+ newDate.setDate(newDate.getDate() - 7);
228
+ break;
229
+ case "Enter":
230
+ case " ":
231
+ this.selectedDate.emit(this.focusedDate());
232
+ event.preventDefault();
233
+ return;
234
+ default:
235
+ return; // ignorer les autres touches
236
+ }
237
+ event.preventDefault();
238
+ this.focusedDate.set(newDate);
239
+ // si le focusedDate est hors du mois courant, changer le mois
240
+ if (this.focusedDate().getMonth() !== this.displayDate().getMonth() ||
241
+ this.focusedDate().getFullYear() !== this.displayDate().getFullYear()) {
242
+ this.displayDate.set(new Date(this.focusedDate().getFullYear(), this.focusedDate().getMonth(), 1));
243
+ this.build();
244
+ }
245
+ }
246
+ // Pour le template : savoir si la date est focusée pour appliquer style
247
+ isFocused(date) {
248
+ return this.focusedDate && this.isSame(date, this.focusedDate());
249
+ }
250
+ resetStartDate(date) {
251
+ console.log('reset');
252
+ this.startDate.set(date);
253
+ this.endDate.set(null);
254
+ this.hoveredDate.set(null);
255
+ }
256
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: CalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
257
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.18", type: CalendarComponent, isStandalone: true, selector: "ngx-calendar", inputs: { startDate: { classPropertyName: "startDate", publicName: "startDate", isSignal: true, isRequired: false, transformFunction: null }, endDate: { classPropertyName: "endDate", publicName: "endDate", isSignal: true, isRequired: false, transformFunction: null }, enableRange: { classPropertyName: "enableRange", publicName: "enableRange", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { startDate: "startDateChange", endDate: "endDateChange", selectedDate: "selectedDate", selectedDateRange: "selectedDateRange", selectedDaysCount: "selectedDaysCount", hoverDate: "hoverDate" }, host: { listeners: { "keydown": "handleKeyDown($event)" } }, providers: [CalendarService], ngImport: i0, template: "<div\n class=\"w-65 bg-white rounded-md shadow-lg p-3\"\n id=\"calendar\"\n role=\"dialog\"\n aria-modal=\"true\">\n\n <div class=\"flex items-center mb-2\">\n <button\n class=\"cursor-pointer hover:bg-slate-100 focus:bg-slate-100 rounded-full flex w-10 h-10 justify-center items-center\"\n (click)=\"prevMonth()\" aria-label=\"Previous month\">\u2039\n </button>\n <p class=\"grow\">{{ displayDate() | date: 'MMMM yyyy' }}</p>\n <button\n class=\"cursor-pointer hover:bg-slate-100 focus:bg-slate-100 rounded-full flex w-10 h-10 justify-center items-center\"\n (click)=\"nextMonth()\" aria-label=\"Next month\">\u203A\n </button>\n </div>\n\n <!-- Weekdays -->\n <div class=\"grid grid-cols-7 gap-0.5\">\n @for (wd of locale.current.weekdays; track $index) {\n <span>{{ wd }}</span>\n }\n </div>\n\n <div class=\"grid grid-cols-7 gap-y-0.5\">\n @for (day of days(); track $index) {\n <button\n [class]=\"cn(\n 'relative cursor-pointer py-1 overflow-hidden',\n daysInRange().length < 2 && 'rounded-full',\n latestDayInRange() === day && 'rounded-r-full',\n day.isInRange && 'bg-blue-200',\n day.isSelected && 'bg-blue-200 text-white before:absolute before:top-0 before:left-0 before:block before:w-full before:h-full before:z-1 before:bg-blue-600',\n day.isToday && 'before:absolute before:top-0 before:left-0 before:block before:w-full before:h-full before:z-1 before:rounded-full before:border-2 before:border-blue-600',\n isSame(day.date, startDate()) && 'rounded-l-full before:rounded-full',\n isSame(day.date, endDate()) && 'rounded-r-full before:rounded-full'\n )\"\n [attr.aria-selected]=\"isSame(day.date, startDate()) || isSame(day.date, endDate())\"\n [attr.aria-label]=\"locale.current.format(day.date)\"\n (click)=\"onDaySelect(day.date)\"\n (mouseenter)=\"onDayMouseEnter(day.date)\">\n <span class=\"relative z-10\">{{ day.date.getDate() }}</span>\n </button>\n }\n </div>\n</div>\n", dependencies: [{ kind: "pipe", type: DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
258
+ }
259
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: CalendarComponent, decorators: [{
260
+ type: Component,
261
+ args: [{ selector: "ngx-calendar", changeDetection: ChangeDetectionStrategy.OnPush, imports: [
262
+ DatePipe
263
+ ], providers: [CalendarService], host: {
264
+ "(keydown)": "handleKeyDown($event)"
265
+ }, template: "<div\n class=\"w-65 bg-white rounded-md shadow-lg p-3\"\n id=\"calendar\"\n role=\"dialog\"\n aria-modal=\"true\">\n\n <div class=\"flex items-center mb-2\">\n <button\n class=\"cursor-pointer hover:bg-slate-100 focus:bg-slate-100 rounded-full flex w-10 h-10 justify-center items-center\"\n (click)=\"prevMonth()\" aria-label=\"Previous month\">\u2039\n </button>\n <p class=\"grow\">{{ displayDate() | date: 'MMMM yyyy' }}</p>\n <button\n class=\"cursor-pointer hover:bg-slate-100 focus:bg-slate-100 rounded-full flex w-10 h-10 justify-center items-center\"\n (click)=\"nextMonth()\" aria-label=\"Next month\">\u203A\n </button>\n </div>\n\n <!-- Weekdays -->\n <div class=\"grid grid-cols-7 gap-0.5\">\n @for (wd of locale.current.weekdays; track $index) {\n <span>{{ wd }}</span>\n }\n </div>\n\n <div class=\"grid grid-cols-7 gap-y-0.5\">\n @for (day of days(); track $index) {\n <button\n [class]=\"cn(\n 'relative cursor-pointer py-1 overflow-hidden',\n daysInRange().length < 2 && 'rounded-full',\n latestDayInRange() === day && 'rounded-r-full',\n day.isInRange && 'bg-blue-200',\n day.isSelected && 'bg-blue-200 text-white before:absolute before:top-0 before:left-0 before:block before:w-full before:h-full before:z-1 before:bg-blue-600',\n day.isToday && 'before:absolute before:top-0 before:left-0 before:block before:w-full before:h-full before:z-1 before:rounded-full before:border-2 before:border-blue-600',\n isSame(day.date, startDate()) && 'rounded-l-full before:rounded-full',\n isSame(day.date, endDate()) && 'rounded-r-full before:rounded-full'\n )\"\n [attr.aria-selected]=\"isSame(day.date, startDate()) || isSame(day.date, endDate())\"\n [attr.aria-label]=\"locale.current.format(day.date)\"\n (click)=\"onDaySelect(day.date)\"\n (mouseenter)=\"onDayMouseEnter(day.date)\">\n <span class=\"relative z-10\">{{ day.date.getDate() }}</span>\n </button>\n }\n </div>\n</div>\n" }]
266
+ }] });
267
+
268
+ class DatePickerWrapperComponent {
269
+ date = input();
270
+ endDate = input();
271
+ label = input.required();
272
+ hoveredDate = input();
273
+ openCalendar = input();
274
+ enableRange = input.required();
275
+ selectedDate = output();
276
+ selectedDateRange = output();
277
+ hoverDate = output();
278
+ onSelectDate(date) {
279
+ this.selectedDate.emit(date);
280
+ }
281
+ onSelectDateRange(date) {
282
+ this.selectedDateRange.emit(date);
283
+ }
284
+ onHoverDate(date) {
285
+ this.hoverDate.emit(date);
286
+ }
287
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: DatePickerWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
288
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.18", type: DatePickerWrapperComponent, isStandalone: true, selector: "ngx-date-picker-wrapper", inputs: { date: { classPropertyName: "date", publicName: "date", isSignal: true, isRequired: false, transformFunction: null }, endDate: { classPropertyName: "endDate", publicName: "endDate", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, hoveredDate: { classPropertyName: "hoveredDate", publicName: "hoveredDate", isSignal: true, isRequired: false, transformFunction: null }, openCalendar: { classPropertyName: "openCalendar", publicName: "openCalendar", isSignal: true, isRequired: false, transformFunction: null }, enableRange: { classPropertyName: "enableRange", publicName: "enableRange", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { selectedDate: "selectedDate", selectedDateRange: "selectedDateRange", hoverDate: "hoverDate" }, ngImport: i0, template: "<div class=\"inline-block relative\">\n <div class=\"inline-flex flex-col\">\n <label [for]=\"label()\" class=\"block text-left text-sm mb-1 text-slate-600\" for=\"datepicker\">{{ label() }}</label>\n <div\n class=\"inline-flex w-auto items-stretch rounded-md border border-slate-300 focus-within:outline-4 focus-within:outline-blue-200 focus-within:border-blue-600 focus-within:shadow overflow-hidden\">\n <ng-content></ng-content>\n </div>\n </div>\n <ngx-calendar\n class=\"absolute top-full left-0 mt-1 z-10\"\n [class.hidden]=\"!openCalendar()\"\n [startDate]=\"date()\"\n [endDate]=\"endDate()\"\n [enableRange]=\"enableRange()\"\n (selectedDate)=\"onSelectDate($event)\"\n (selectedDateRange)=\"onSelectDateRange($event)\"\n (hoverDate)=\"onHoverDate($event)\">\n </ngx-calendar>\n</div>\n", dependencies: [{ kind: "component", type: CalendarComponent, selector: "ngx-calendar", inputs: ["startDate", "endDate", "enableRange"], outputs: ["startDateChange", "endDateChange", "selectedDate", "selectedDateRange", "selectedDaysCount", "hoverDate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
289
+ }
290
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: DatePickerWrapperComponent, decorators: [{
291
+ type: Component,
292
+ args: [{ selector: 'ngx-date-picker-wrapper', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CalendarComponent], template: "<div class=\"inline-block relative\">\n <div class=\"inline-flex flex-col\">\n <label [for]=\"label()\" class=\"block text-left text-sm mb-1 text-slate-600\" for=\"datepicker\">{{ label() }}</label>\n <div\n class=\"inline-flex w-auto items-stretch rounded-md border border-slate-300 focus-within:outline-4 focus-within:outline-blue-200 focus-within:border-blue-600 focus-within:shadow overflow-hidden\">\n <ng-content></ng-content>\n </div>\n </div>\n <ngx-calendar\n class=\"absolute top-full left-0 mt-1 z-10\"\n [class.hidden]=\"!openCalendar()\"\n [startDate]=\"date()\"\n [endDate]=\"endDate()\"\n [enableRange]=\"enableRange()\"\n (selectedDate)=\"onSelectDate($event)\"\n (selectedDateRange)=\"onSelectDateRange($event)\"\n (hoverDate)=\"onHoverDate($event)\">\n </ngx-calendar>\n</div>\n" }]
293
+ }] });
294
+
295
+ class InputDirective {
296
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: InputDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
297
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.18", type: InputDirective, isStandalone: true, selector: "[ngxInput]", host: { classAttribute: "block w-full pl-2 border-0 outline-0 appearance-none [&::-webkit-calendar-picker-indicator]:hidden" }, ngImport: i0 });
298
+ }
299
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: InputDirective, decorators: [{
300
+ type: Directive,
301
+ args: [{
302
+ selector: '[ngxInput]',
303
+ host: {
304
+ class: 'block w-full pl-2 border-0 outline-0 appearance-none [&::-webkit-calendar-picker-indicator]:hidden'
305
+ }
306
+ }]
307
+ }] });
308
+
309
+ function WithControlValueAccessor(Base) {
310
+ return class extends Base {
311
+ value;
312
+ disabled = false;
313
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
314
+ onChange = (_) => { };
315
+ onTouched = () => { };
316
+ writeValue(value) {
317
+ this.value = value;
318
+ }
319
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
320
+ registerOnChange(fn) {
321
+ this.onChange = fn;
322
+ }
323
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
324
+ registerOnTouched(fn) {
325
+ this.onTouched = fn;
326
+ }
327
+ setDisabledState(isDisabled) {
328
+ this.disabled = isDisabled;
329
+ }
330
+ onInput(value) {
331
+ this.value = value;
332
+ this.onChange(value);
333
+ }
334
+ onBlur() {
335
+ this.onTouched();
336
+ }
337
+ };
338
+ }
339
+
340
+ class DatepickerComponent extends WithControlValueAccessor(class {
341
+ }) {
342
+ id = model();
343
+ date = model();
344
+ dateTo = model();
345
+ range = input(false);
346
+ isRangeEnd = input(false);
347
+ label = input.required();
348
+ openCalendar = model(false);
349
+ selectedDate = output();
350
+ selectedDateRange = output();
351
+ el = inject(ElementRef);
352
+ constructor() {
353
+ super();
354
+ effect(() => {
355
+ const date = this.date();
356
+ const dateTo = this.dateTo();
357
+ if (date) {
358
+ this.updateFormControl(this.isRangeEnd() && dateTo ? dateTo : date);
359
+ }
360
+ });
361
+ }
362
+ onSelectedDateChange(date) {
363
+ if (date) {
364
+ this.updateDate(date);
365
+ }
366
+ if (this.range()) {
367
+ return;
368
+ }
369
+ this.openCalendar.set(false);
370
+ }
371
+ onSelectedDateRangeChange(dateRange) {
372
+ this.selectedDateRange.emit(dateRange);
373
+ if (dateRange.startDate !== null && dateRange.endDate !== null) {
374
+ this.openCalendar.set(false);
375
+ }
376
+ }
377
+ onInputChange(e) {
378
+ const target = e.target;
379
+ const date = new Date(target.value);
380
+ this.updateDate(date);
381
+ }
382
+ onToggleCalendar() {
383
+ this.openCalendar.set(!this.openCalendar());
384
+ }
385
+ onClickOutside(e) {
386
+ const el = e.target;
387
+ if (!this.el.nativeElement.contains(el)) {
388
+ this.openCalendar.set(false);
389
+ }
390
+ }
391
+ updateDate(date) {
392
+ this.date.set(date);
393
+ this.selectedDate.emit(date);
394
+ this.updateFormControl(date);
395
+ }
396
+ updateFormControl(value) {
397
+ this.value = value;
398
+ this.onChange(value);
399
+ }
400
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: DatepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
401
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.18", type: DatepickerComponent, isStandalone: true, selector: "ngx-datepicker", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, date: { classPropertyName: "date", publicName: "date", isSignal: true, isRequired: false, transformFunction: null }, dateTo: { classPropertyName: "dateTo", publicName: "dateTo", isSignal: true, isRequired: false, transformFunction: null }, range: { classPropertyName: "range", publicName: "range", isSignal: true, isRequired: false, transformFunction: null }, isRangeEnd: { classPropertyName: "isRangeEnd", publicName: "isRangeEnd", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, openCalendar: { classPropertyName: "openCalendar", publicName: "openCalendar", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { id: "idChange", date: "dateChange", dateTo: "dateToChange", openCalendar: "openCalendarChange", selectedDate: "selectedDate", selectedDateRange: "selectedDateRange" }, host: { listeners: { "document:click": "onClickOutside($event)" } }, providers: [
402
+ {
403
+ provide: NG_VALUE_ACCESSOR,
404
+ useExisting: forwardRef(() => DatepickerComponent),
405
+ multi: true,
406
+ },
407
+ ], usesInheritance: true, ngImport: i0, template: "<ngx-date-picker-wrapper\n [date]=\"date()\"\n [endDate]=\"dateTo()\"\n [enableRange]=\"range()\"\n [label]=\"label()\"\n [openCalendar]=\"openCalendar()\"\n (selectedDate)=\"onSelectedDateChange($event)\"\n (selectedDateRange)=\"onSelectedDateRangeChange($event)\">\n <input\n ngxInput\n type=\"date\"\n placeholder=\"dd/mm/yyyy\"\n [attr.id]=\"label()\"\n [value]=\"value | date: 'yyyy-MM-dd'\"\n (blur)=\"onBlur()\"\n (change)=\"onInputChange($event)\">\n <button\n class=\"inline-flex items-center justify-center w-12 h-10 cursor-pointer hover:bg-slate-100 focus:bg-slate-100\"\n (click)=\"onToggleCalendar()\">\n <svg class=\"text-slate-900 w-5 h-5\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5\" />\n </svg>\n </button>\n\n</ngx-date-picker-wrapper>\n", dependencies: [{ kind: "component", type: DatePickerWrapperComponent, selector: "ngx-date-picker-wrapper", inputs: ["date", "endDate", "label", "hoveredDate", "openCalendar", "enableRange"], outputs: ["selectedDate", "selectedDateRange", "hoverDate"] }, { kind: "directive", type: InputDirective, selector: "[ngxInput]" }, { kind: "pipe", type: DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
408
+ }
409
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: DatepickerComponent, decorators: [{
410
+ type: Component,
411
+ args: [{ selector: 'ngx-datepicker', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
412
+ DatePickerWrapperComponent,
413
+ InputDirective,
414
+ DatePipe
415
+ ], host: {
416
+ '(document:click)': 'onClickOutside($event)',
417
+ }, providers: [
418
+ {
419
+ provide: NG_VALUE_ACCESSOR,
420
+ useExisting: forwardRef(() => DatepickerComponent),
421
+ multi: true,
422
+ },
423
+ ], template: "<ngx-date-picker-wrapper\n [date]=\"date()\"\n [endDate]=\"dateTo()\"\n [enableRange]=\"range()\"\n [label]=\"label()\"\n [openCalendar]=\"openCalendar()\"\n (selectedDate)=\"onSelectedDateChange($event)\"\n (selectedDateRange)=\"onSelectedDateRangeChange($event)\">\n <input\n ngxInput\n type=\"date\"\n placeholder=\"dd/mm/yyyy\"\n [attr.id]=\"label()\"\n [value]=\"value | date: 'yyyy-MM-dd'\"\n (blur)=\"onBlur()\"\n (change)=\"onInputChange($event)\">\n <button\n class=\"inline-flex items-center justify-center w-12 h-10 cursor-pointer hover:bg-slate-100 focus:bg-slate-100\"\n (click)=\"onToggleCalendar()\">\n <svg class=\"text-slate-900 w-5 h-5\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5\" />\n </svg>\n </button>\n\n</ngx-date-picker-wrapper>\n" }]
424
+ }], ctorParameters: () => [] });
425
+
426
+ class DateRangePickerComponent {
427
+ startDate = model();
428
+ endDate = model();
429
+ label = input.required();
430
+ hoveredDate = model(null);
431
+ openCalendar = model(false);
432
+ selectedDateRange = output();
433
+ el = inject(ElementRef);
434
+ locale = inject(DatePickerLocaleService);
435
+ close() {
436
+ this.openCalendar.set(false);
437
+ this.hoveredDate.set(null);
438
+ }
439
+ onEscape() {
440
+ this.close();
441
+ }
442
+ onSelectedDateChange(date) {
443
+ this.updateDateRange(date);
444
+ }
445
+ onHoverDateChange(date) {
446
+ this.hoveredDate.set(date);
447
+ }
448
+ onToggleCalendar() {
449
+ this.openCalendar.set(!this.openCalendar());
450
+ }
451
+ onCloseCalendar(e) {
452
+ const el = e.target;
453
+ if (!this.el.nativeElement.contains(el)) {
454
+ this.close();
455
+ }
456
+ }
457
+ updateDateRange(date) {
458
+ const startDate = this.startDate();
459
+ const endDate = this.endDate();
460
+ if (!startDate || endDate) {
461
+ this.startDate.set(date.startDate);
462
+ this.endDate.set(null);
463
+ }
464
+ else if (date.startDate && date.startDate >= startDate) {
465
+ this.endDate.set(date.endDate);
466
+ this.selectedDateRange.emit({ startDate, endDate: this.endDate() ?? null });
467
+ this.close();
468
+ }
469
+ else {
470
+ this.startDate.set(date.startDate);
471
+ }
472
+ }
473
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: DateRangePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
474
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.18", type: DateRangePickerComponent, isStandalone: true, selector: "ngx-date-range-picker", inputs: { startDate: { classPropertyName: "startDate", publicName: "startDate", isSignal: true, isRequired: false, transformFunction: null }, endDate: { classPropertyName: "endDate", publicName: "endDate", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, hoveredDate: { classPropertyName: "hoveredDate", publicName: "hoveredDate", isSignal: true, isRequired: false, transformFunction: null }, openCalendar: { classPropertyName: "openCalendar", publicName: "openCalendar", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { startDate: "startDateChange", endDate: "endDateChange", hoveredDate: "hoveredDateChange", openCalendar: "openCalendarChange", selectedDateRange: "selectedDateRange" }, host: { listeners: { "document:click": "onCloseCalendar($event)", "keydown.escape": "onEscape()" } }, ngImport: i0, template: "<ngx-date-picker-wrapper\n [date]=\"startDate()\"\n [hoveredDate]=\"hoveredDate()\"\n [label]=\"label()\"\n [enableRange]=\"true\"\n [openCalendar]=\"openCalendar()\"\n (selectedDateRange)=\"onSelectedDateChange($event)\"\n (hoverDate)=\"onHoverDateChange($event)\">\n <div class=\"flex items-center w-54 px-2\">\n <div class=\"grow relative overflow-hidden max-w-[calc(50%-4px)]\">\n <input\n class=\"w-full h-full outline-none p-0 m-0 appearance-none\"\n readonly\n type=\"text\"\n role=\"combobox\"\n placeholder=\"dd/mm/yyyy\"\n aria-controls=\"calendar\"\n aria-haspopup=\"dialog\"\n [attr.id]=\"label()\"\n [attr.aria-expanded]=\"openCalendar()\"\n [value]=\"startDate() | date: 'dd/MM/yyyy'\"\n />\n </div>\n <span class=\"mr-2\">-</span>\n <div class=\"grow relative overflow-hidden max-w-[calc(50%-4px)]\">\n <input\n class=\"w-full h-full outline-none p-0 m-0 appearance-none\"\n readonly\n type=\"text\"\n role=\"combobox\"\n placeholder=\"dd/mm/yyyy\"\n aria-controls=\"calendar\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"openCalendar()\"\n [value]=\"endDate() | date: 'dd/MM/yyyy'\"\n />\n </div>\n </div>\n <button\n class=\"flex items-center justify-center w-12 h-10 cursor-pointer hover:bg-slate-100 focus:bg-slate-100\"\n (click)=\"onToggleCalendar()\">\n <svg class=\"text-slate-900 w-5 h-5\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5\" />\n </svg>\n </button>\n</ngx-date-picker-wrapper>\n", dependencies: [{ kind: "component", type: DatePickerWrapperComponent, selector: "ngx-date-picker-wrapper", inputs: ["date", "endDate", "label", "hoveredDate", "openCalendar", "enableRange"], outputs: ["selectedDate", "selectedDateRange", "hoverDate"] }, { kind: "pipe", type: DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
475
+ }
476
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: DateRangePickerComponent, decorators: [{
477
+ type: Component,
478
+ args: [{ selector: "ngx-date-range-picker", changeDetection: ChangeDetectionStrategy.OnPush, imports: [DatePickerWrapperComponent, DatePipe], host: {
479
+ "(document:click)": "onCloseCalendar($event)",
480
+ "(keydown.escape)": "onEscape()",
481
+ }, template: "<ngx-date-picker-wrapper\n [date]=\"startDate()\"\n [hoveredDate]=\"hoveredDate()\"\n [label]=\"label()\"\n [enableRange]=\"true\"\n [openCalendar]=\"openCalendar()\"\n (selectedDateRange)=\"onSelectedDateChange($event)\"\n (hoverDate)=\"onHoverDateChange($event)\">\n <div class=\"flex items-center w-54 px-2\">\n <div class=\"grow relative overflow-hidden max-w-[calc(50%-4px)]\">\n <input\n class=\"w-full h-full outline-none p-0 m-0 appearance-none\"\n readonly\n type=\"text\"\n role=\"combobox\"\n placeholder=\"dd/mm/yyyy\"\n aria-controls=\"calendar\"\n aria-haspopup=\"dialog\"\n [attr.id]=\"label()\"\n [attr.aria-expanded]=\"openCalendar()\"\n [value]=\"startDate() | date: 'dd/MM/yyyy'\"\n />\n </div>\n <span class=\"mr-2\">-</span>\n <div class=\"grow relative overflow-hidden max-w-[calc(50%-4px)]\">\n <input\n class=\"w-full h-full outline-none p-0 m-0 appearance-none\"\n readonly\n type=\"text\"\n role=\"combobox\"\n placeholder=\"dd/mm/yyyy\"\n aria-controls=\"calendar\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"openCalendar()\"\n [value]=\"endDate() | date: 'dd/MM/yyyy'\"\n />\n </div>\n </div>\n <button\n class=\"flex items-center justify-center w-12 h-10 cursor-pointer hover:bg-slate-100 focus:bg-slate-100\"\n (click)=\"onToggleCalendar()\">\n <svg class=\"text-slate-900 w-5 h-5\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5\" />\n </svg>\n </button>\n</ngx-date-picker-wrapper>\n" }]
482
+ }] });
483
+
484
+ /*
485
+ * Public API Surface of ngx-datepicker
486
+ */
487
+
488
+ /**
489
+ * Generated bundle index. Do not edit.
490
+ */
491
+
492
+ export { DateRangePickerComponent, DatepickerComponent };
493
+ //# sourceMappingURL=wzrdev-ngx-datepicker.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wzrdev-ngx-datepicker.mjs","sources":["../../../projects/ngx-datepicker/src/lib/locale/fr.ts","../../../projects/ngx-datepicker/src/lib/locale/en.ts","../../../projects/ngx-datepicker/src/lib/locale/locale.service.ts","../../../projects/ngx-datepicker/src/lib/utils/cn.ts","../../../projects/ngx-datepicker/src/lib/calendar/calendar.service.ts","../../../projects/ngx-datepicker/src/lib/calendar/calendar.component.ts","../../../projects/ngx-datepicker/src/lib/calendar/calendar.component.html","../../../projects/ngx-datepicker/src/lib/date-picker-wrapper/date-picker-wrapper.component.ts","../../../projects/ngx-datepicker/src/lib/date-picker-wrapper/date-picker-wrapper.component.html","../../../projects/ngx-datepicker/src/lib/shared/directives/input.directive.ts","../../../projects/ngx-datepicker/src/lib/shared/mixins/with-control-value-accessor.ts","../../../projects/ngx-datepicker/src/lib/datepicker/datepicker.component.ts","../../../projects/ngx-datepicker/src/lib/datepicker/datepicker.component.html","../../../projects/ngx-datepicker/src/lib/date-range-picker/date-range-picker.component.ts","../../../projects/ngx-datepicker/src/lib/date-range-picker/date-range-picker.component.html","../../../projects/ngx-datepicker/src/public-api.ts","../../../projects/ngx-datepicker/src/wzrdev-ngx-datepicker.ts"],"sourcesContent":["import { DatePickerLocale } from \"./locale.model\";\n\nconst currentYear = new Date().getFullYear();\n\nexport const FR_LOCALE: DatePickerLocale = {\n code: \"fr\",\n months: [\n \"Janvier\",\n \"Février\",\n \"Mars\",\n \"Avril\",\n \"Mai\",\n \"Juin\",\n \"Juillet\",\n \"Août\",\n \"Septembre\",\n \"Octobre\",\n \"Novembre\",\n \"Décembre\",\n ],\n weekdays: [\"Lu\", \"Ma\", \"Me\", \"Je\", \"Ve\", \"Sa\", \"Di\"],\n weekStartsOn: 1,\n years: Array.from({ length: 200 }, (_, i) => currentYear - 100 + i),\n format: date => date.toLocaleDateString(\"fr-FR\"),\n};\n","import { DatePickerLocale } from \"./locale.model\";\n\nconst currentYear = new Date().getFullYear();\n\nexport const EN_LOCALE: DatePickerLocale = {\n code: \"en\",\n months: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ],\n weekdays: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"],\n weekStartsOn: 0,\n years: Array.from({ length: 200 }, (_, i) => currentYear - 100 + i),\n format: date => date.toLocaleDateString(\"en-US\"),\n};\n","import { Injectable } from \"@angular/core\";\nimport { BehaviorSubject } from \"rxjs\";\nimport { DatePickerLocale } from \"./locale.model\";\nimport { FR_LOCALE } from \"./fr\";\nimport { EN_LOCALE } from \"./en\";\n\n@Injectable({ providedIn: \"root\" })\nexport class DatePickerLocaleService {\n private readonly locales: Record<string, DatePickerLocale> = {\n fr: FR_LOCALE,\n en: EN_LOCALE,\n };\n\n private locale$ = new BehaviorSubject<DatePickerLocale>(FR_LOCALE);\n\n public setLocale(code: string) {\n this.locale$.next(this.locales[code] ?? FR_LOCALE);\n }\n\n public get localeChanges$() {\n return this.locale$.asObservable();\n }\n\n public get current() {\n return this.locale$.value;\n }\n}\n","import { ClassValue, clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\nconst customTwMerge = extendTailwindMerge({\n extend: {\n classGroups: {},\n },\n});\n\nexport const cn = (...inputs: ClassValue[]) => {\n return customTwMerge(clsx(inputs));\n};\n","import { Injectable } from '@angular/core';\n\n@Injectable()\nexport class CalendarService {}\n","import {\n Component,\n inject,\n output,\n input,\n linkedSignal, ChangeDetectionStrategy, computed, signal, model\n} from \"@angular/core\";\nimport { DatePickerLocaleService } from \"../locale/locale.service\";\nimport { cn } from '../utils/cn';\nimport { DatePipe } from '@angular/common';\nimport { DateRange } from '../shared/models/daterange';\nimport { CalendarService } from './calendar.service';\n\ninterface Day {\n date: Date;\n isToday: boolean;\n isSelected: boolean;\n isInRange: boolean;\n}\n\n@Component({\n selector: \"ngx-calendar\",\n templateUrl: \"./calendar.component.html\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n DatePipe\n ],\n providers: [CalendarService],\n host: {\n \"(keydown)\": \"handleKeyDown($event)\"\n },\n})\nexport class CalendarComponent {\n public readonly locale = inject(DatePickerLocaleService);\n\n public readonly startDate = model<Date | null>();\n public readonly endDate = model<Date | null>();\n public readonly hoveredDate = signal<Date | null>(null);\n public readonly enableRange = input<boolean>(false);\n\n public readonly selectedDate = output<Date>();\n public readonly selectedDateRange = output<DateRange>();\n public readonly selectedDaysCount = output<number>();\n public readonly hoverDate = output<Date>();\n\n public readonly days = linkedSignal(() => {\n const startDate = this.startDate();\n const endDate = this.endDate();\n const displayDate = this.displayDate();\n\n const year = displayDate.getFullYear();\n const month = displayDate.getMonth();\n\n const today = new Date();\n const first = new Date(year, month, 1);\n const last = new Date(year, month + 1, 0);\n\n const days: Day[] = [];\n for (let d = new Date(first); d <= last; d.setDate(d.getDate() + 1)) {\n const day = {\n date: new Date(d),\n isToday: this.isSame(d, today),\n isSelected: this.isSame(d, startDate) || this.isSame(d, endDate),\n isInRange: this.isInRange(d),\n } as Day;\n days.push(day);\n }\n return days;\n });\n\n public daysInRange = computed(() => {\n const days = this.days();\n return days.filter(day => day.isInRange);\n });\n\n public latestDayInRange = computed(() => {\n const rangeDays = this.daysInRange();\n return rangeDays[rangeDays.length - 1];\n });\n\n public readonly displayDate = linkedSignal(() => {\n const start = this.startDate();\n return start ?? new Date();\n });\n\n public readonly focusedDate = linkedSignal(() => {\n return new Date(this.displayDate());\n });\n\n protected readonly cn = cn;\n\n build() {\n // Assurer que focusedDate est dans le mois courant\n if (this.focusedDate().getMonth() !== this.displayDate().getMonth()) {\n this.focusedDate.set(new Date(this.displayDate().getFullYear(), this.displayDate().getMonth(), 1));\n }\n }\n\n public prevMonth(): void {\n this.displayDate.update((prevState) => {\n return new Date(prevState.getFullYear(), prevState.getMonth() - 1, prevState.getDate());\n })\n }\n\n public nextMonth(): void {\n this.displayDate.update((prevState) => {\n return new Date(prevState.getFullYear(), prevState.getMonth() + 1, prevState.getDate());\n })\n }\n\n public isSame(a?: Date | null, b?: Date | null): boolean {\n if (!a || !b) return false;\n return a.toDateString() === b.toDateString();\n }\n\n public isInRange(d: Date): boolean {\n const start = this.startDate();\n const end = this.endDate();\n const hover = this.hoveredDate();\n\n if (!start || !d) return false;\n if (start && end) return d >= start && d <= end;\n if (start && hover) {\n return d >= start && d <= hover;\n }\n\n return false;\n };\n\n public onDaySelect(date: Date): void {\n const selectedDays = this.days().filter(day => day.isSelected);\n const startDate = this.startDate();\n const endDate = this.endDate();\n\n\n if (this.enableRange()) {\n\n if (selectedDays.length === 2\n || startDate && date < startDate\n || endDate && endDate <= date\n || endDate && date <= endDate) {\n this.resetStartDate(date);\n }\n\n if (!startDate) {\n this.startDate.set(date);\n } else if (startDate && !endDate && startDate < date) {\n this.endDate.set(date);\n }\n\n } else {\n this.resetStartDate(date);\n }\n\n if (this.enableRange()) {\n this.selectedDateRange.emit({ startDate: this.startDate() ?? null, endDate: this.endDate() ?? null });\n } else {\n this.selectedDate.emit(date);\n }\n this.selectedDaysCount.emit(this.daysInRange().length);\n }\n\n public onDayMouseEnter(date: Date): void {\n if (!this.enableRange() || (this.startDate() && this.endDate())) {\n return;\n }\n this.hoveredDate.set(date);\n }\n\n public handleKeyDown(event: KeyboardEvent): void {\n if (!this.focusedDate) return;\n\n const newDate = new Date(this.focusedDate());\n\n switch (event.key) {\n case \"ArrowRight\":\n newDate.setDate(newDate.getDate() + 1);\n break;\n case \"ArrowLeft\":\n newDate.setDate(newDate.getDate() - 1);\n break;\n case \"ArrowDown\":\n newDate.setDate(newDate.getDate() + 7);\n break;\n case \"ArrowUp\":\n newDate.setDate(newDate.getDate() - 7);\n break;\n case \"Enter\":\n case \" \":\n this.selectedDate.emit(this.focusedDate());\n event.preventDefault();\n return;\n default:\n return; // ignorer les autres touches\n }\n\n event.preventDefault();\n this.focusedDate.set(newDate);\n\n // si le focusedDate est hors du mois courant, changer le mois\n if (\n this.focusedDate().getMonth() !== this.displayDate().getMonth() ||\n this.focusedDate().getFullYear() !== this.displayDate().getFullYear()\n ) {\n this.displayDate.set(new Date(this.focusedDate().getFullYear(), this.focusedDate().getMonth(), 1));\n this.build();\n }\n }\n\n // Pour le template : savoir si la date est focusée pour appliquer style\n isFocused(date: Date) {\n return this.focusedDate && this.isSame(date, this.focusedDate());\n }\n\n private resetStartDate(date: Date): void {\n console.log('reset');\n this.startDate.set(date);\n this.endDate.set(null);\n this.hoveredDate.set(null);\n }\n}\n","<div\n class=\"w-65 bg-white rounded-md shadow-lg p-3\"\n id=\"calendar\"\n role=\"dialog\"\n aria-modal=\"true\">\n\n <div class=\"flex items-center mb-2\">\n <button\n class=\"cursor-pointer hover:bg-slate-100 focus:bg-slate-100 rounded-full flex w-10 h-10 justify-center items-center\"\n (click)=\"prevMonth()\" aria-label=\"Previous month\">‹\n </button>\n <p class=\"grow\">{{ displayDate() | date: 'MMMM yyyy' }}</p>\n <button\n class=\"cursor-pointer hover:bg-slate-100 focus:bg-slate-100 rounded-full flex w-10 h-10 justify-center items-center\"\n (click)=\"nextMonth()\" aria-label=\"Next month\">›\n </button>\n </div>\n\n <!-- Weekdays -->\n <div class=\"grid grid-cols-7 gap-0.5\">\n @for (wd of locale.current.weekdays; track $index) {\n <span>{{ wd }}</span>\n }\n </div>\n\n <div class=\"grid grid-cols-7 gap-y-0.5\">\n @for (day of days(); track $index) {\n <button\n [class]=\"cn(\n 'relative cursor-pointer py-1 overflow-hidden',\n daysInRange().length < 2 && 'rounded-full',\n latestDayInRange() === day && 'rounded-r-full',\n day.isInRange && 'bg-blue-200',\n day.isSelected && 'bg-blue-200 text-white before:absolute before:top-0 before:left-0 before:block before:w-full before:h-full before:z-1 before:bg-blue-600',\n day.isToday && 'before:absolute before:top-0 before:left-0 before:block before:w-full before:h-full before:z-1 before:rounded-full before:border-2 before:border-blue-600',\n isSame(day.date, startDate()) && 'rounded-l-full before:rounded-full',\n isSame(day.date, endDate()) && 'rounded-r-full before:rounded-full'\n )\"\n [attr.aria-selected]=\"isSame(day.date, startDate()) || isSame(day.date, endDate())\"\n [attr.aria-label]=\"locale.current.format(day.date)\"\n (click)=\"onDaySelect(day.date)\"\n (mouseenter)=\"onDayMouseEnter(day.date)\">\n <span class=\"relative z-10\">{{ day.date.getDate() }}</span>\n </button>\n }\n </div>\n</div>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { CalendarComponent } from '../calendar/calendar.component';\nimport { DateRange } from '../shared/models/daterange';\n\n@Component({\n selector: 'ngx-date-picker-wrapper',\n templateUrl: './date-picker-wrapper.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CalendarComponent]\n})\nexport class DatePickerWrapperComponent {\n public readonly date = input<Date | null>();\n public readonly endDate = input<Date | null>();\n public readonly label = input.required<string>();\n public readonly hoveredDate = input<Date | null>();\n public readonly openCalendar = input<boolean>();\n public readonly enableRange = input.required<boolean>();\n\n public readonly selectedDate = output<Date | null>();\n public readonly selectedDateRange = output<DateRange>();\n public readonly hoverDate = output<Date>();\n\n public onSelectDate(date: Date | null): void {\n this.selectedDate.emit(date);\n }\n\n public onSelectDateRange(date: DateRange): void {\n this.selectedDateRange.emit(date);\n }\n\n\n public onHoverDate(date: Date): void {\n this.hoverDate.emit(date);\n }\n}\n","<div class=\"inline-block relative\">\n <div class=\"inline-flex flex-col\">\n <label [for]=\"label()\" class=\"block text-left text-sm mb-1 text-slate-600\" for=\"datepicker\">{{ label() }}</label>\n <div\n class=\"inline-flex w-auto items-stretch rounded-md border border-slate-300 focus-within:outline-4 focus-within:outline-blue-200 focus-within:border-blue-600 focus-within:shadow overflow-hidden\">\n <ng-content></ng-content>\n </div>\n </div>\n <ngx-calendar\n class=\"absolute top-full left-0 mt-1 z-10\"\n [class.hidden]=\"!openCalendar()\"\n [startDate]=\"date()\"\n [endDate]=\"endDate()\"\n [enableRange]=\"enableRange()\"\n (selectedDate)=\"onSelectDate($event)\"\n (selectedDateRange)=\"onSelectDateRange($event)\"\n (hoverDate)=\"onHoverDate($event)\">\n </ngx-calendar>\n</div>\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[ngxInput]',\n host: {\n class: 'block w-full pl-2 border-0 outline-0 appearance-none [&::-webkit-calendar-picker-indicator]:hidden'\n }\n})\nexport class InputDirective {}\n","import { ControlValueAccessor } from '@angular/forms';\nimport { Constructor } from '../models/constructor';\n\nexport function WithControlValueAccessor<TValue, TBase extends Constructor>(Base: TBase) {\n return class extends Base implements ControlValueAccessor {\n public value!: TValue;\n public disabled = false;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public onChange = (_: TValue) => { /* empty */ };\n public onTouched = () => { /* empty */ };\n\n public writeValue(value: TValue) {\n this.value = value;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public registerOnChange(fn: any) {\n this.onChange = fn;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public registerOnTouched(fn: any) {\n this.onTouched = fn;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n public onInput(value: TValue) {\n this.value = value;\n this.onChange(value);\n }\n\n public onBlur() {\n this.onTouched();\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component, effect, ElementRef, forwardRef, inject, input, InputSignal,\n model,\n ModelSignal,\n output,\n OutputEmitterRef,\n} from '@angular/core';\nimport { DatePickerWrapperComponent } from '../date-picker-wrapper/date-picker-wrapper.component';\nimport { InputDirective } from '../shared/directives/input.directive';\nimport { DatePipe } from '@angular/common';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { WithControlValueAccessor } from '../shared/mixins/with-control-value-accessor';\nimport { DateRange } from '../shared/models/daterange';\n\ninterface DatepickerOption {\n id: InputSignal<string | undefined>;\n date: ModelSignal<Date | null | undefined>;\n openCalendar: ModelSignal<boolean>;\n selectedDate: OutputEmitterRef<Date | null>;\n}\n\n@Component({\n selector: 'ngx-datepicker',\n templateUrl: './datepicker.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n DatePickerWrapperComponent,\n InputDirective,\n DatePipe\n ],\n host: {\n '(document:click)': 'onClickOutside($event)',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DatepickerComponent),\n multi: true,\n },\n ],\n})\nexport class DatepickerComponent extends WithControlValueAccessor<Date, new () => object>(class {}) implements DatepickerOption {\n public readonly id = model<string>();\n public readonly date = model<Date | null>();\n public readonly dateTo = model<Date | null>();\n public readonly range = input<boolean>(false);\n public readonly isRangeEnd = input<boolean>(false);\n public readonly label = input.required<string>();\n public readonly openCalendar = model<boolean>(false);\n public readonly selectedDate = output<Date | null>();\n public readonly selectedDateRange = output<DateRange | null>();\n\n private readonly el = inject(ElementRef);\n\n constructor() {\n super();\n effect(() => {\n const date = this.date();\n const dateTo = this.dateTo();\n\n if (date) {\n this.updateFormControl(this.isRangeEnd() && dateTo ? dateTo : date);\n }\n });\n }\n\n public onSelectedDateChange(date: Date | null): void {\n if (date) {\n this.updateDate(date);\n }\n if (this.range()) {\n return;\n }\n this.openCalendar.set(false);\n }\n\n public onSelectedDateRangeChange(dateRange: DateRange): void {\n this.selectedDateRange.emit(dateRange);\n if (dateRange.startDate !== null && dateRange.endDate !== null) {\n this.openCalendar.set(false);\n }\n }\n\n public onInputChange(e: Event): void {\n const target = e.target as HTMLInputElement;\n const date = new Date(target.value);\n this.updateDate(date);\n }\n\n public onToggleCalendar(): void {\n this.openCalendar.set(!this.openCalendar());\n }\n\n public onClickOutside(e: Event): void {\n const el = e.target as HTMLElement;\n if (!this.el.nativeElement.contains(el)) {\n this.openCalendar.set(false);\n }\n }\n\n private updateDate(date: Date): void {\n this.date.set(date);\n this.selectedDate.emit(date);\n this.updateFormControl(date);\n }\n\n private updateFormControl(value: Date): void {\n this.value = value;\n this.onChange(value);\n }\n}\n","<ngx-date-picker-wrapper\n [date]=\"date()\"\n [endDate]=\"dateTo()\"\n [enableRange]=\"range()\"\n [label]=\"label()\"\n [openCalendar]=\"openCalendar()\"\n (selectedDate)=\"onSelectedDateChange($event)\"\n (selectedDateRange)=\"onSelectedDateRangeChange($event)\">\n <input\n ngxInput\n type=\"date\"\n placeholder=\"dd/mm/yyyy\"\n [attr.id]=\"label()\"\n [value]=\"value | date: 'yyyy-MM-dd'\"\n (blur)=\"onBlur()\"\n (change)=\"onInputChange($event)\">\n <button\n class=\"inline-flex items-center justify-center w-12 h-10 cursor-pointer hover:bg-slate-100 focus:bg-slate-100\"\n (click)=\"onToggleCalendar()\">\n <svg class=\"text-slate-900 w-5 h-5\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5\" />\n </svg>\n </button>\n\n</ngx-date-picker-wrapper>\n","import {\n ChangeDetectionStrategy,\n Component, ElementRef,\n inject, input,\n model,\n output,\n} from \"@angular/core\";\nimport { DatePickerLocaleService } from \"../locale/locale.service\";\nimport { DatePickerWrapperComponent } from '../date-picker-wrapper/date-picker-wrapper.component';\nimport { DatePipe } from '@angular/common';\n\nexport interface DateRange {\n startDate: Date | null;\n endDate: Date | null;\n}\n\n@Component({\n selector: \"ngx-date-range-picker\",\n templateUrl: \"./date-range-picker.component.html\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [DatePickerWrapperComponent, DatePipe],\n host: {\n \"(document:click)\": \"onCloseCalendar($event)\",\n \"(keydown.escape)\": \"onEscape()\",\n },\n})\nexport class DateRangePickerComponent {\n public readonly startDate = model<Date | null>();\n public readonly endDate = model<Date | null>();\n public readonly label = input.required<string>();\n public readonly hoveredDate = model<Date | null>(null);\n public readonly openCalendar = model<boolean>(false);\n public readonly selectedDateRange = output<DateRange | null>();\n\n private readonly el = inject(ElementRef);\n private readonly locale = inject(DatePickerLocaleService);\n\n public close() {\n this.openCalendar.set(false);\n this.hoveredDate.set(null);\n }\n\n public onEscape() {\n this.close();\n }\n\n public onSelectedDateChange(date: DateRange): void {\n this.updateDateRange(date);\n }\n\n public onHoverDateChange(date: Date): void {\n this.hoveredDate.set(date);\n }\n\n public onToggleCalendar(): void {\n this.openCalendar.set(!this.openCalendar());\n }\n\n public onCloseCalendar(e: Event): void {\n const el = e.target as HTMLElement;\n if (!this.el.nativeElement.contains(el)) {\n this.close();\n }\n }\n\n private updateDateRange(date: DateRange): void {\n const startDate = this.startDate();\n const endDate = this.endDate();\n\n if (!startDate || endDate) {\n\n this.startDate.set(date.startDate);\n this.endDate.set(null);\n\n } else if (date.startDate && date.startDate >= startDate) {\n this.endDate.set(date.endDate);\n this.selectedDateRange.emit({ startDate, endDate: this.endDate() ?? null })\n this.close();\n } else {\n this.startDate.set(date.startDate);\n }\n }\n}\n","<ngx-date-picker-wrapper\n [date]=\"startDate()\"\n [hoveredDate]=\"hoveredDate()\"\n [label]=\"label()\"\n [enableRange]=\"true\"\n [openCalendar]=\"openCalendar()\"\n (selectedDateRange)=\"onSelectedDateChange($event)\"\n (hoverDate)=\"onHoverDateChange($event)\">\n <div class=\"flex items-center w-54 px-2\">\n <div class=\"grow relative overflow-hidden max-w-[calc(50%-4px)]\">\n <input\n class=\"w-full h-full outline-none p-0 m-0 appearance-none\"\n readonly\n type=\"text\"\n role=\"combobox\"\n placeholder=\"dd/mm/yyyy\"\n aria-controls=\"calendar\"\n aria-haspopup=\"dialog\"\n [attr.id]=\"label()\"\n [attr.aria-expanded]=\"openCalendar()\"\n [value]=\"startDate() | date: 'dd/MM/yyyy'\"\n />\n </div>\n <span class=\"mr-2\">-</span>\n <div class=\"grow relative overflow-hidden max-w-[calc(50%-4px)]\">\n <input\n class=\"w-full h-full outline-none p-0 m-0 appearance-none\"\n readonly\n type=\"text\"\n role=\"combobox\"\n placeholder=\"dd/mm/yyyy\"\n aria-controls=\"calendar\"\n aria-haspopup=\"dialog\"\n [attr.aria-expanded]=\"openCalendar()\"\n [value]=\"endDate() | date: 'dd/MM/yyyy'\"\n />\n </div>\n </div>\n <button\n class=\"flex items-center justify-center w-12 h-10 cursor-pointer hover:bg-slate-100 focus:bg-slate-100\"\n (click)=\"onToggleCalendar()\">\n <svg class=\"text-slate-900 w-5 h-5\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5\" />\n </svg>\n </button>\n</ngx-date-picker-wrapper>\n","/*\n * Public API Surface of ngx-datepicker\n */\n\nexport * from './lib/datepicker/datepicker.component';\nexport * from './lib/date-range-picker/date-range-picker.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["currentYear"],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@wzrdev/ngx-datepicker" />
5
+ export * from './public-api';
@@ -0,0 +1,39 @@
1
+ import { DatePickerLocaleService } from "../locale/locale.service";
2
+ import { DateRange } from '../shared/models/daterange';
3
+ import * as i0 from "@angular/core";
4
+ interface Day {
5
+ date: Date;
6
+ isToday: boolean;
7
+ isSelected: boolean;
8
+ isInRange: boolean;
9
+ }
10
+ export declare class CalendarComponent {
11
+ readonly locale: DatePickerLocaleService;
12
+ readonly startDate: import("@angular/core").ModelSignal<Date | null | undefined>;
13
+ readonly endDate: import("@angular/core").ModelSignal<Date | null | undefined>;
14
+ readonly hoveredDate: import("@angular/core").WritableSignal<Date | null>;
15
+ readonly enableRange: import("@angular/core").InputSignal<boolean>;
16
+ readonly selectedDate: import("@angular/core").OutputEmitterRef<Date>;
17
+ readonly selectedDateRange: import("@angular/core").OutputEmitterRef<DateRange>;
18
+ readonly selectedDaysCount: import("@angular/core").OutputEmitterRef<number>;
19
+ readonly hoverDate: import("@angular/core").OutputEmitterRef<Date>;
20
+ readonly days: import("@angular/core").WritableSignal<Day[]>;
21
+ daysInRange: import("@angular/core").Signal<Day[]>;
22
+ latestDayInRange: import("@angular/core").Signal<Day>;
23
+ readonly displayDate: import("@angular/core").WritableSignal<Date>;
24
+ readonly focusedDate: import("@angular/core").WritableSignal<Date>;
25
+ protected readonly cn: (...inputs: import("clsx").ClassValue[]) => string;
26
+ build(): void;
27
+ prevMonth(): void;
28
+ nextMonth(): void;
29
+ isSame(a?: Date | null, b?: Date | null): boolean;
30
+ isInRange(d: Date): boolean;
31
+ onDaySelect(date: Date): void;
32
+ onDayMouseEnter(date: Date): void;
33
+ handleKeyDown(event: KeyboardEvent): void;
34
+ isFocused(date: Date): boolean;
35
+ private resetStartDate;
36
+ static ɵfac: i0.ɵɵFactoryDeclaration<CalendarComponent, never>;
37
+ static ɵcmp: i0.ɵɵComponentDeclaration<CalendarComponent, "ngx-calendar", never, { "startDate": { "alias": "startDate"; "required": false; "isSignal": true; }; "endDate": { "alias": "endDate"; "required": false; "isSignal": true; }; "enableRange": { "alias": "enableRange"; "required": false; "isSignal": true; }; }, { "startDate": "startDateChange"; "endDate": "endDateChange"; "selectedDate": "selectedDate"; "selectedDateRange": "selectedDateRange"; "selectedDaysCount": "selectedDaysCount"; "hoverDate": "hoverDate"; }, never, never, true, never>;
38
+ }
39
+ export {};
@@ -0,0 +1,5 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class CalendarService {
3
+ static ɵfac: i0.ɵɵFactoryDeclaration<CalendarService, never>;
4
+ static ɵprov: i0.ɵɵInjectableDeclaration<CalendarService>;
5
+ }
@@ -0,0 +1,18 @@
1
+ import { DateRange } from '../shared/models/daterange';
2
+ import * as i0 from "@angular/core";
3
+ export declare class DatePickerWrapperComponent {
4
+ readonly date: import("@angular/core").InputSignal<Date | null | undefined>;
5
+ readonly endDate: import("@angular/core").InputSignal<Date | null | undefined>;
6
+ readonly label: import("@angular/core").InputSignal<string>;
7
+ readonly hoveredDate: import("@angular/core").InputSignal<Date | null | undefined>;
8
+ readonly openCalendar: import("@angular/core").InputSignal<boolean | undefined>;
9
+ readonly enableRange: import("@angular/core").InputSignal<boolean>;
10
+ readonly selectedDate: import("@angular/core").OutputEmitterRef<Date | null>;
11
+ readonly selectedDateRange: import("@angular/core").OutputEmitterRef<DateRange>;
12
+ readonly hoverDate: import("@angular/core").OutputEmitterRef<Date>;
13
+ onSelectDate(date: Date | null): void;
14
+ onSelectDateRange(date: DateRange): void;
15
+ onHoverDate(date: Date): void;
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<DatePickerWrapperComponent, never>;
17
+ static ɵcmp: i0.ɵɵComponentDeclaration<DatePickerWrapperComponent, "ngx-date-picker-wrapper", never, { "date": { "alias": "date"; "required": false; "isSignal": true; }; "endDate": { "alias": "endDate"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "hoveredDate": { "alias": "hoveredDate"; "required": false; "isSignal": true; }; "openCalendar": { "alias": "openCalendar"; "required": false; "isSignal": true; }; "enableRange": { "alias": "enableRange"; "required": true; "isSignal": true; }; }, { "selectedDate": "selectedDate"; "selectedDateRange": "selectedDateRange"; "hoverDate": "hoverDate"; }, never, ["*"], true, never>;
18
+ }
@@ -0,0 +1,24 @@
1
+ import * as i0 from "@angular/core";
2
+ export interface DateRange {
3
+ startDate: Date | null;
4
+ endDate: Date | null;
5
+ }
6
+ export declare class DateRangePickerComponent {
7
+ readonly startDate: import("@angular/core").ModelSignal<Date | null | undefined>;
8
+ readonly endDate: import("@angular/core").ModelSignal<Date | null | undefined>;
9
+ readonly label: import("@angular/core").InputSignal<string>;
10
+ readonly hoveredDate: import("@angular/core").ModelSignal<Date | null>;
11
+ readonly openCalendar: import("@angular/core").ModelSignal<boolean>;
12
+ readonly selectedDateRange: import("@angular/core").OutputEmitterRef<DateRange | null>;
13
+ private readonly el;
14
+ private readonly locale;
15
+ close(): void;
16
+ onEscape(): void;
17
+ onSelectedDateChange(date: DateRange): void;
18
+ onHoverDateChange(date: Date): void;
19
+ onToggleCalendar(): void;
20
+ onCloseCalendar(e: Event): void;
21
+ private updateDateRange;
22
+ static ɵfac: i0.ɵɵFactoryDeclaration<DateRangePickerComponent, never>;
23
+ static ɵcmp: i0.ɵɵComponentDeclaration<DateRangePickerComponent, "ngx-date-range-picker", never, { "startDate": { "alias": "startDate"; "required": false; "isSignal": true; }; "endDate": { "alias": "endDate"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "hoveredDate": { "alias": "hoveredDate"; "required": false; "isSignal": true; }; "openCalendar": { "alias": "openCalendar"; "required": false; "isSignal": true; }; }, { "startDate": "startDateChange"; "endDate": "endDateChange"; "hoveredDate": "hoveredDateChange"; "openCalendar": "openCalendarChange"; "selectedDateRange": "selectedDateRange"; }, never, never, true, never>;
24
+ }
@@ -0,0 +1,46 @@
1
+ import { InputSignal, ModelSignal, OutputEmitterRef } from '@angular/core';
2
+ import { DateRange } from '../shared/models/daterange';
3
+ import * as i0 from "@angular/core";
4
+ interface DatepickerOption {
5
+ id: InputSignal<string | undefined>;
6
+ date: ModelSignal<Date | null | undefined>;
7
+ openCalendar: ModelSignal<boolean>;
8
+ selectedDate: OutputEmitterRef<Date | null>;
9
+ }
10
+ declare const DatepickerComponent_base: {
11
+ new (...args: any[]): {
12
+ value: Date;
13
+ disabled: boolean;
14
+ onChange: (_: Date) => void;
15
+ onTouched: () => void;
16
+ writeValue(value: Date): void;
17
+ registerOnChange(fn: any): void;
18
+ registerOnTouched(fn: any): void;
19
+ setDisabledState(isDisabled: boolean): void;
20
+ onInput(value: Date): void;
21
+ onBlur(): void;
22
+ };
23
+ } & (new () => object);
24
+ export declare class DatepickerComponent extends DatepickerComponent_base implements DatepickerOption {
25
+ readonly id: ModelSignal<string | undefined>;
26
+ readonly date: ModelSignal<Date | null | undefined>;
27
+ readonly dateTo: ModelSignal<Date | null | undefined>;
28
+ readonly range: InputSignal<boolean>;
29
+ readonly isRangeEnd: InputSignal<boolean>;
30
+ readonly label: InputSignal<string>;
31
+ readonly openCalendar: ModelSignal<boolean>;
32
+ readonly selectedDate: OutputEmitterRef<Date | null>;
33
+ readonly selectedDateRange: OutputEmitterRef<DateRange | null>;
34
+ private readonly el;
35
+ constructor();
36
+ onSelectedDateChange(date: Date | null): void;
37
+ onSelectedDateRangeChange(dateRange: DateRange): void;
38
+ onInputChange(e: Event): void;
39
+ onToggleCalendar(): void;
40
+ onClickOutside(e: Event): void;
41
+ private updateDate;
42
+ private updateFormControl;
43
+ static ɵfac: i0.ɵɵFactoryDeclaration<DatepickerComponent, never>;
44
+ static ɵcmp: i0.ɵɵComponentDeclaration<DatepickerComponent, "ngx-datepicker", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": false; "isSignal": true; }; "dateTo": { "alias": "dateTo"; "required": false; "isSignal": true; }; "range": { "alias": "range"; "required": false; "isSignal": true; }; "isRangeEnd": { "alias": "isRangeEnd"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "openCalendar": { "alias": "openCalendar"; "required": false; "isSignal": true; }; }, { "id": "idChange"; "date": "dateChange"; "dateTo": "dateToChange"; "openCalendar": "openCalendarChange"; "selectedDate": "selectedDate"; "selectedDateRange": "selectedDateRange"; }, never, never, true, never>;
45
+ }
46
+ export {};
@@ -0,0 +1,2 @@
1
+ import { DatePickerLocale } from "./locale.model";
2
+ export declare const EN_LOCALE: DatePickerLocale;
@@ -0,0 +1,2 @@
1
+ import { DatePickerLocale } from "./locale.model";
2
+ export declare const FR_LOCALE: DatePickerLocale;
@@ -0,0 +1,8 @@
1
+ export interface DatePickerLocale {
2
+ code: string;
3
+ months: string[];
4
+ weekdays: string[];
5
+ weekStartsOn: 0 | 1;
6
+ format(date: Date): string;
7
+ years: number[];
8
+ }
@@ -0,0 +1,11 @@
1
+ import { DatePickerLocale } from "./locale.model";
2
+ import * as i0 from "@angular/core";
3
+ export declare class DatePickerLocaleService {
4
+ private readonly locales;
5
+ private locale$;
6
+ setLocale(code: string): void;
7
+ get localeChanges$(): import("rxjs").Observable<DatePickerLocale>;
8
+ get current(): DatePickerLocale;
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<DatePickerLocaleService, never>;
10
+ static ɵprov: i0.ɵɵInjectableDeclaration<DatePickerLocaleService>;
11
+ }
@@ -0,0 +1,5 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class InputDirective {
3
+ static ɵfac: i0.ɵɵFactoryDeclaration<InputDirective, never>;
4
+ static ɵdir: i0.ɵɵDirectiveDeclaration<InputDirective, "[ngxInput]", never, {}, {}, never, never, true, never>;
5
+ }
@@ -0,0 +1,15 @@
1
+ import { Constructor } from '../models/constructor';
2
+ export declare function WithControlValueAccessor<TValue, TBase extends Constructor>(Base: TBase): {
3
+ new (...args: any[]): {
4
+ value: TValue;
5
+ disabled: boolean;
6
+ onChange: (_: TValue) => void;
7
+ onTouched: () => void;
8
+ writeValue(value: TValue): void;
9
+ registerOnChange(fn: any): void;
10
+ registerOnTouched(fn: any): void;
11
+ setDisabledState(isDisabled: boolean): void;
12
+ onInput(value: TValue): void;
13
+ onBlur(): void;
14
+ };
15
+ } & TBase;
@@ -0,0 +1 @@
1
+ export type Constructor<T = object> = new (...args: any[]) => T;
@@ -0,0 +1,4 @@
1
+ export interface DateRange {
2
+ startDate: Date | null;
3
+ endDate: Date | null;
4
+ }
@@ -0,0 +1,2 @@
1
+ import { ClassValue } from "clsx";
2
+ export declare const cn: (...inputs: ClassValue[]) => string;
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@wzrdev/ngx-datepicker",
3
+ "version": "0.0.1",
4
+ "peerDependencies": {
5
+ "@angular/common": "^19.2.0",
6
+ "@angular/core": "^19.2.0"
7
+ },
8
+ "dependencies": {
9
+ "tslib": "^2.3.0"
10
+ },
11
+ "sideEffects": false,
12
+ "module": "fesm2022/wzrdev-ngx-datepicker.mjs",
13
+ "typings": "index.d.ts",
14
+ "exports": {
15
+ "./package.json": {
16
+ "default": "./package.json"
17
+ },
18
+ ".": {
19
+ "types": "./index.d.ts",
20
+ "default": "./fesm2022/wzrdev-ngx-datepicker.mjs"
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,2 @@
1
+ export * from './lib/datepicker/datepicker.component';
2
+ export * from './lib/date-range-picker/date-range-picker.component';