@oneluiz/dual-datepicker 2.5.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,276 @@
1
+ /**
2
+ * Utility functions for creating common date range presets
3
+ * Perfect for dashboards, reporting, POS, BI apps, and ERP systems
4
+ */
5
+ /**
6
+ * Format a date as YYYY-MM-DD string
7
+ */
8
+ function formatDate(date) {
9
+ const year = date.getFullYear();
10
+ const month = String(date.getMonth() + 1).padStart(2, '0');
11
+ const day = String(date.getDate()).padStart(2, '0');
12
+ return `${year}-${month}-${day}`;
13
+ }
14
+ /**
15
+ * Get the start of today
16
+ */
17
+ export function getToday() {
18
+ const today = new Date();
19
+ return {
20
+ start: formatDate(today),
21
+ end: formatDate(today)
22
+ };
23
+ }
24
+ /**
25
+ * Get yesterday's date range
26
+ */
27
+ export function getYesterday() {
28
+ const yesterday = new Date();
29
+ yesterday.setDate(yesterday.getDate() - 1);
30
+ return {
31
+ start: formatDate(yesterday),
32
+ end: formatDate(yesterday)
33
+ };
34
+ }
35
+ /**
36
+ * Get last N days (including today)
37
+ */
38
+ export function getLastNDays(days) {
39
+ const end = new Date();
40
+ const start = new Date();
41
+ start.setDate(start.getDate() - days + 1);
42
+ return {
43
+ start: formatDate(start),
44
+ end: formatDate(end)
45
+ };
46
+ }
47
+ /**
48
+ * Get this week (Monday to Sunday)
49
+ */
50
+ export function getThisWeek() {
51
+ const today = new Date();
52
+ const dayOfWeek = today.getDay();
53
+ const start = new Date(today);
54
+ // Adjust to Monday (1) as first day of week
55
+ const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
56
+ start.setDate(start.getDate() - daysToMonday);
57
+ const end = new Date(start);
58
+ end.setDate(end.getDate() + 6);
59
+ return {
60
+ start: formatDate(start),
61
+ end: formatDate(end)
62
+ };
63
+ }
64
+ /**
65
+ * Get last week (Monday to Sunday)
66
+ */
67
+ export function getLastWeek() {
68
+ const today = new Date();
69
+ const dayOfWeek = today.getDay();
70
+ const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
71
+ const lastMonday = new Date(today);
72
+ lastMonday.setDate(lastMonday.getDate() - daysToMonday - 7);
73
+ const lastSunday = new Date(lastMonday);
74
+ lastSunday.setDate(lastSunday.getDate() + 6);
75
+ return {
76
+ start: formatDate(lastMonday),
77
+ end: formatDate(lastSunday)
78
+ };
79
+ }
80
+ /**
81
+ * Get this month (1st to last day)
82
+ */
83
+ export function getThisMonth() {
84
+ const today = new Date();
85
+ const start = new Date(today.getFullYear(), today.getMonth(), 1);
86
+ const end = new Date(today.getFullYear(), today.getMonth() + 1, 0);
87
+ return {
88
+ start: formatDate(start),
89
+ end: formatDate(end)
90
+ };
91
+ }
92
+ /**
93
+ * Get last month (1st to last day)
94
+ */
95
+ export function getLastMonth() {
96
+ const today = new Date();
97
+ const start = new Date(today.getFullYear(), today.getMonth() - 1, 1);
98
+ const end = new Date(today.getFullYear(), today.getMonth(), 0);
99
+ return {
100
+ start: formatDate(start),
101
+ end: formatDate(end)
102
+ };
103
+ }
104
+ /**
105
+ * Get month to date (1st of current month to today)
106
+ */
107
+ export function getMonthToDate() {
108
+ const today = new Date();
109
+ const start = new Date(today.getFullYear(), today.getMonth(), 1);
110
+ return {
111
+ start: formatDate(start),
112
+ end: formatDate(today)
113
+ };
114
+ }
115
+ /**
116
+ * Get this quarter (Q1, Q2, Q3, or Q4)
117
+ */
118
+ export function getThisQuarter() {
119
+ const today = new Date();
120
+ const currentMonth = today.getMonth();
121
+ const quarterStartMonth = Math.floor(currentMonth / 3) * 3;
122
+ const start = new Date(today.getFullYear(), quarterStartMonth, 1);
123
+ const end = new Date(today.getFullYear(), quarterStartMonth + 3, 0);
124
+ return {
125
+ start: formatDate(start),
126
+ end: formatDate(end)
127
+ };
128
+ }
129
+ /**
130
+ * Get last quarter
131
+ */
132
+ export function getLastQuarter() {
133
+ const today = new Date();
134
+ const currentMonth = today.getMonth();
135
+ const lastQuarterStartMonth = Math.floor(currentMonth / 3) * 3 - 3;
136
+ const start = new Date(today.getFullYear(), lastQuarterStartMonth, 1);
137
+ const end = new Date(today.getFullYear(), lastQuarterStartMonth + 3, 0);
138
+ return {
139
+ start: formatDate(start),
140
+ end: formatDate(end)
141
+ };
142
+ }
143
+ /**
144
+ * Get quarter to date (start of current quarter to today)
145
+ */
146
+ export function getQuarterToDate() {
147
+ const today = new Date();
148
+ const currentMonth = today.getMonth();
149
+ const quarterStartMonth = Math.floor(currentMonth / 3) * 3;
150
+ const start = new Date(today.getFullYear(), quarterStartMonth, 1);
151
+ return {
152
+ start: formatDate(start),
153
+ end: formatDate(today)
154
+ };
155
+ }
156
+ /**
157
+ * Get this year (January 1 to December 31)
158
+ */
159
+ export function getThisYear() {
160
+ const today = new Date();
161
+ const start = new Date(today.getFullYear(), 0, 1);
162
+ const end = new Date(today.getFullYear(), 11, 31);
163
+ return {
164
+ start: formatDate(start),
165
+ end: formatDate(end)
166
+ };
167
+ }
168
+ /**
169
+ * Get last year
170
+ */
171
+ export function getLastYear() {
172
+ const today = new Date();
173
+ const start = new Date(today.getFullYear() - 1, 0, 1);
174
+ const end = new Date(today.getFullYear() - 1, 11, 31);
175
+ return {
176
+ start: formatDate(start),
177
+ end: formatDate(end)
178
+ };
179
+ }
180
+ /**
181
+ * Get year to date (January 1 to today)
182
+ */
183
+ export function getYearToDate() {
184
+ const today = new Date();
185
+ const start = new Date(today.getFullYear(), 0, 1);
186
+ return {
187
+ start: formatDate(start),
188
+ end: formatDate(today)
189
+ };
190
+ }
191
+ /**
192
+ * Get last N months (including current partial month)
193
+ */
194
+ export function getLastNMonths(months) {
195
+ const today = new Date();
196
+ const start = new Date(today);
197
+ start.setMonth(start.getMonth() - months);
198
+ return {
199
+ start: formatDate(start),
200
+ end: formatDate(today)
201
+ };
202
+ }
203
+ /**
204
+ * Get last N years
205
+ */
206
+ export function getLastNYears(years) {
207
+ const today = new Date();
208
+ const start = new Date(today);
209
+ start.setFullYear(start.getFullYear() - years);
210
+ return {
211
+ start: formatDate(start),
212
+ end: formatDate(today)
213
+ };
214
+ }
215
+ /**
216
+ * Pre-built preset configurations for common use cases
217
+ * Import and use these directly in your component
218
+ */
219
+ export const CommonPresets = {
220
+ /**
221
+ * Dashboard presets - Perfect for analytics dashboards
222
+ */
223
+ dashboard: [
224
+ { label: 'Today', getValue: getToday },
225
+ { label: 'Yesterday', getValue: getYesterday },
226
+ { label: 'Last 7 days', getValue: () => getLastNDays(7) },
227
+ { label: 'Last 30 days', getValue: () => getLastNDays(30) },
228
+ { label: 'This month', getValue: getThisMonth },
229
+ { label: 'Last month', getValue: getLastMonth }
230
+ ],
231
+ /**
232
+ * Reporting presets - Perfect for business reporting
233
+ */
234
+ reporting: [
235
+ { label: 'Today', getValue: getToday },
236
+ { label: 'This week', getValue: getThisWeek },
237
+ { label: 'Last week', getValue: getLastWeek },
238
+ { label: 'This month', getValue: getThisMonth },
239
+ { label: 'Last month', getValue: getLastMonth },
240
+ { label: 'This quarter', getValue: getThisQuarter },
241
+ { label: 'Last quarter', getValue: getLastQuarter }
242
+ ],
243
+ /**
244
+ * Financial presets - Perfect for ERP and accounting systems
245
+ */
246
+ financial: [
247
+ { label: 'Month to date', getValue: getMonthToDate },
248
+ { label: 'Quarter to date', getValue: getQuarterToDate },
249
+ { label: 'Year to date', getValue: getYearToDate },
250
+ { label: 'Last month', getValue: getLastMonth },
251
+ { label: 'Last quarter', getValue: getLastQuarter },
252
+ { label: 'Last year', getValue: getLastYear }
253
+ ],
254
+ /**
255
+ * Analytics presets - Perfect for BI and data analysis
256
+ */
257
+ analytics: [
258
+ { label: 'Last 7 days', getValue: () => getLastNDays(7) },
259
+ { label: 'Last 14 days', getValue: () => getLastNDays(14) },
260
+ { label: 'Last 30 days', getValue: () => getLastNDays(30) },
261
+ { label: 'Last 60 days', getValue: () => getLastNDays(60) },
262
+ { label: 'Last 90 days', getValue: () => getLastNDays(90) },
263
+ { label: 'Last 180 days', getValue: () => getLastNDays(180) },
264
+ { label: 'Last 365 days', getValue: () => getLastNDays(365) }
265
+ ],
266
+ /**
267
+ * Simple presets - Basic common ranges
268
+ */
269
+ simple: [
270
+ { label: 'Today', getValue: getToday },
271
+ { label: 'Last 7 days', getValue: () => getLastNDays(7) },
272
+ { label: 'Last 30 days', getValue: () => getLastNDays(30) },
273
+ { label: 'This year', getValue: getThisYear }
274
+ ]
275
+ };
276
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0LXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ByZXNldC11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7O0dBR0c7QUFFSDs7R0FFRztBQUNILFNBQVMsVUFBVSxDQUFDLElBQVU7SUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2hDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNwRCxPQUFPLEdBQUcsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNuQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsUUFBUTtJQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3pCLE9BQU87UUFDTCxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUN4QixHQUFHLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQztLQUN2QixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFlBQVk7SUFDMUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUM3QixTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzQyxPQUFPO1FBQ0wsS0FBSyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFDNUIsR0FBRyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUM7S0FDM0IsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FF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O0dBRUc7QUFDSCxNQUFNLFVBQVUsWUFBWTtJQUMxQixNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3pCLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFL0QsT0FBTztRQUNMLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ3hCLEdBQUcsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO0tBQ3JCLENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsY0FBYztJQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3pCLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFakUsT0FBTztRQUNMLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ3hCLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDO0tBQ3ZCLENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsY0FBYztJQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3pCLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN0QyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUUzRCxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMs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QUU7UUFDTixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtRQUN0QyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN6RCxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUMzRCxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTtLQUM1QjtDQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJlc2V0Q29uZmlnLCBQcmVzZXRSYW5nZSB9IGZyb20gJy4vZHVhbC1kYXRlcGlja2VyLmNvbXBvbmVudCc7XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIGNvbW1vbiBkYXRlIHJhbmdlIHByZXNldHNcbiAqIFBlcmZlY3QgZm9yIGRhc2hib2FyZHMsIHJlcG9ydGluZywgUE9TLCBCSSBhcHBzLCBhbmQgRVJQIHN5c3RlbXNcbiAqL1xuXG4vKipcbiAqIEZvcm1hdCBhIGRhdGUgYXMgWVlZWS1NTS1ERCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgY29uc3QgZGF5ID0gU3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xuICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHN0YXJ0IG9mIHRvZGF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb2RheSgpOiBQcmVzZXRSYW5nZSB7XG4gIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgcmV0dXJuIHtcbiAgICBzdGFydDogZm9ybWF0RGF0ZSh0b2RheSksXG4gICAgZW5kOiBmb3JtYXREYXRlKHRvZGF5KVxuICB9O1xufVxuXG4vKipcbiAqIEdldCB5ZXN0ZXJkYXkncyBkYXRlIHJhbmdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRZZXN0ZXJkYXkoKTogUHJlc2V0UmFuZ2Uge1xuICBjb25zdCB5ZXN0ZXJkYXkgPSBuZXcgRGF0ZSgpO1xuICB5ZXN0ZXJkYXkuc2V0RGF0ZSh5ZXN0ZXJkYXkuZ2V0RGF0ZSgpIC0gMSk7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IGZvcm1hdERhdGUoeWVzdGVyZGF5KSxcbiAgICBlbmQ6IGZvcm1hdERhdGUoeWVzdGVyZGF5KVxuICB9O1xufVxuXG4vKipcbiAqIEdldCBsYXN0IE4gZGF5cyAoaW5jbHVkaW5nIHRvZGF5KVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFzdE5EYXlzKGRheXM6IG51bWJlcik6IFByZXNldFJhbmdlIHtcbiAgY29uc3QgZW5kID0gbmV3IERhdGUoKTtcbiAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpO1xuICBzdGFydC5zZXREYXRlKHN0YXJ0LmdldERhdGUoKSAtIGRheXMgKyAxKTtcbiAgcmV0dXJuIHtcbiAgICBzdGFydDogZm9ybWF0RGF0ZShzdGFydCksXG4gICAgZW5kOiBmb3JtYXREYXRlKGVuZClcbiAgfTtcbn1cblxuLyoqXG4gKiBHZXQgdGhpcyB3ZWVrIChNb25kYXkgdG8gU3VuZGF5KVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGhpc1dlZWsoKTogUHJlc2V0UmFuZ2Uge1xuICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IGRheU9mV2VlayA9IHRvZGF5LmdldERheSgpO1xuICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgLy8gQWRqdXN0IHRvIE1vbmRheSAoMSkgYXMgZmlyc3QgZGF5IG9mIHdlZWtcbiAgY29uc3QgZGF5c1RvTW9uZGF5ID0gZGF5T2ZXZWVrID09PSAwID8gNiA6IGRheU9mV2VlayAtIDE7XG4gIHN0YXJ0LnNldERhdGUoc3RhcnQuZ2V0RGF0ZSgpIC0gZGF5c1RvTW9uZGF5KTtcbiAgXG4gIGNvbnN0IGVuZCA9IG5ldyBEYXRlKHN0YXJ0KTtcbiAgZW5kLnNldERhdGUoZW5kLmdldERhdGUoKSArIDYpO1xuICBcbiAgcmV0dXJuIHtcbiAgICBzdGFydDogZm9ybWF0RGF0ZShzdGFydCksXG4gICAgZW5kOiBmb3JtYXREYXRlKGVuZClcbiAgfTtcbn1cblxuLyoqXG4gKiBHZXQgbGFzdCB3ZWVrIChNb25kYXkgdG8gU3VuZGF5KVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFzdFdlZWsoKTogUHJlc2V0UmFuZ2Uge1xuICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IGRheU9mV2VlayA9IHRvZGF5LmdldERheSgpO1xuICBjb25zdCBkYXlzVG9Nb25kYXkgPSBkYXlPZldlZWsgPT09IDAgPyA2IDogZGF5T2ZXZWVrIC0gMTtcbiAgXG4gIGNvbnN0IGxhc3RNb25kYXkgPSBuZXcgRGF0ZSh0b2RheSk7XG4gIGxhc3RNb25kYXkuc2V0RGF0ZShsYXN0TW9uZGF5LmdldERhdGUoKSAtIGRheXNUb01vbmRheSAtIDcpO1xuICBcbiAgY29uc3QgbGFzdFN1bmRheSA9IG5ldyBEYXRlKGxhc3RNb25kYXkpO1xuICBsYXN0U3VuZGF5LnNldERhdGUobGFzdFN1bmRheS5nZXREYXRlKCkgKyA2KTtcbiAgXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IGZvcm1hdERhdGUobGFzdE1vbmRheSksXG4gICAgZW5kOiBmb3JtYXREYXRlKGxhc3RTdW5kYXkpXG4gIH07XG59XG5cbi8qKlxuICogR2V0IHRoaXMgbW9udGggKDFzdCB0byBsYXN0IGRheSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRoaXNNb250aCgpOiBQcmVzZXRSYW5nZSB7XG4gIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCAxKTtcbiAgY29uc3QgZW5kID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSArIDEsIDApO1xuICBcbiAgcmV0dXJuIHtcbiAgICBzdGFydDogZm9ybWF0RGF0ZShzdGFydCksXG4gICAgZW5kOiBmb3JtYXREYXRlKGVuZClcbiAgfTtcbn1cblxuLyoqXG4gKiBHZXQgbGFzdCBtb250aCAoMXN0IHRvIGxhc3QgZGF5KVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFzdE1vbnRoKCk6IFByZXNldFJhbmdlIHtcbiAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCkgLSAxLCAxKTtcbiAgY29uc3QgZW5kID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSwgMCk7XG4gIFxuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBmb3JtYXREYXRlKHN0YXJ0KSxcbiAgICBlbmQ6IGZvcm1hdERhdGUoZW5kKVxuICB9O1xufVxuXG4vKipcbiAqIEdldCBtb250aCB0byBkYXRlICgxc3Qgb2YgY3VycmVudCBtb250aCB0byB0b2RheSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vbnRoVG9EYXRlKCk6IFByZXNldFJhbmdlIHtcbiAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIDEpO1xuICBcbiAgcmV0dXJuIHtcbiAgICBzdGFydDogZm9ybWF0RGF0ZShzdGFydCksXG4gICAgZW5kOiBmb3JtYXREYXRlKHRvZGF5KVxuICB9O1xufVxuXG4vKipcbiAqIEdldCB0aGlzIHF1YXJ0ZXIgKFExLCBRMiwgUTMsIG9yIFE0KVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGhpc1F1YXJ0ZXIoKTogUHJlc2V0UmFuZ2Uge1xuICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IGN1cnJlbnRNb250aCA9IHRvZGF5LmdldE1vbnRoKCk7XG4gIGNvbnN0IHF1YXJ0ZXJTdGFydE1vbnRoID0gTWF0aC5mbG9vcihjdXJyZW50TW9udGggLyAzKSAqIDM7XG4gIFxuICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHF1YXJ0ZXJTdGFydE1vbnRoLCAxKTtcbiAgY29uc3QgZW5kID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgcXVhcnRlclN0YXJ0TW9udGggKyAzLCAwKTtcbiAgXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IGZvcm1hdERhdGUoc3RhcnQpLFxuICAgIGVuZDogZm9ybWF0RGF0ZShlbmQpXG4gIH07XG59XG5cbi8qKlxuICogR2V0IGxhc3QgcXVhcnRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFzdFF1YXJ0ZXIoKTogUHJlc2V0UmFuZ2Uge1xuICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IGN1cnJlbnRNb250aCA9IHRvZGF5LmdldE1vbnRoKCk7XG4gIGNvbnN0IGxhc3RRdWFydGVyU3RhcnRNb250aCA9IE1hdGguZmxvb3IoY3VycmVudE1vbnRoIC8gMykgKiAzIC0gMztcbiAgXG4gIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgbGFzdFF1YXJ0ZXJTdGFydE1vbnRoLCAxKTtcbiAgY29uc3QgZW5kID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgbGFzdFF1YXJ0ZXJTdGFydE1vbnRoICsgMywgMCk7XG4gIFxuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBmb3JtYXREYXRlKHN0YXJ0KSxcbiAgICBlbmQ6IGZvcm1hdERhdGUoZW5kKVxuICB9O1xufVxuXG4vKipcbiAqIEdldCBxdWFydGVyIHRvIGRhdGUgKHN0YXJ0IG9mIGN1cnJlbnQgcXVhcnRlciB0byB0b2RheSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFF1YXJ0ZXJUb0RhdGUoKTogUHJlc2V0UmFuZ2Uge1xuICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IGN1cnJlbnRNb250aCA9IHRvZGF5LmdldE1vbnRoKCk7XG4gIGNvbnN0IHF1YXJ0ZXJTdGFydE1vbnRoID0gTWF0aC5mbG9vcihjdXJyZW50TW9udGggLyAzKSAqIDM7XG4gIFxuICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHF1YXJ0ZXJTdGFydE1vbnRoLCAxKTtcbiAgXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IGZvcm1hdERhdGUoc3RhcnQpLFxuICAgIGVuZDogZm9ybWF0RGF0ZSh0b2RheSlcbiAgfTtcbn1cblxuLyoqXG4gKiBHZXQgdGhpcyB5ZWFyIChKYW51YXJ5IDEgdG8gRGVjZW1iZXIgMzEpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaGlzWWVhcigpOiBQcmVzZXRSYW5nZSB7XG4gIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCAwLCAxKTtcbiAgY29uc3QgZW5kID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgMTEsIDMxKTtcbiAgXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IGZvcm1hdERhdGUoc3RhcnQpLFxuICAgIGVuZDogZm9ybWF0RGF0ZShlbmQpXG4gIH07XG59XG5cbi8qKlxuICogR2V0IGxhc3QgeWVhclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFzdFllYXIoKTogUHJlc2V0UmFuZ2Uge1xuICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSAtIDEsIDAsIDEpO1xuICBjb25zdCBlbmQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpIC0gMSwgMTEsIDMxKTtcbiAgXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IGZvcm1hdERhdGUoc3RhcnQpLFxuICAgIGVuZDogZm9ybWF0RGF0ZShlbmQpXG4gIH07XG59XG5cbi8qKlxuICogR2V0IHllYXIgdG8gZGF0ZSAoSmFudWFyeSAxIHRvIHRvZGF5KVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0WWVhclRvRGF0ZSgpOiBQcmVzZXRSYW5nZSB7XG4gIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCAwLCAxKTtcbiAgXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IGZvcm1hdERhdGUoc3RhcnQpLFxuICAgIGVuZDogZm9ybWF0RGF0ZSh0b2RheSlcbiAgfTtcbn1cblxuLyoqXG4gKiBHZXQgbGFzdCBOIG1vbnRocyAoaW5jbHVkaW5nIGN1cnJlbnQgcGFydGlhbCBtb250aClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExhc3ROTW9udGhzKG1vbnRoczogbnVtYmVyKTogUHJlc2V0UmFuZ2Uge1xuICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUodG9kYXkpO1xuICBzdGFydC5zZXRNb250aChzdGFydC5nZXRNb250aCgpIC0gbW9udGhzKTtcbiAgXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IGZvcm1hdERhdGUoc3RhcnQpLFxuICAgIGVuZDogZm9ybWF0RGF0ZSh0b2RheSlcbiAgfTtcbn1cblxuLyoqXG4gKiBHZXQgbGFzdCBOIHllYXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXN0TlllYXJzKHllYXJzOiBudW1iZXIpOiBQcmVzZXRSYW5nZSB7XG4gIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSh0b2RheSk7XG4gIHN0YXJ0LnNldEZ1bGxZZWFyKHN0YXJ0LmdldEZ1bGxZZWFyKCkgLSB5ZWFycyk7XG4gIFxuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBmb3JtYXREYXRlKHN0YXJ0KSxcbiAgICBlbmQ6IGZvcm1hdERhdGUodG9kYXkpXG4gIH07XG59XG5cbi8qKlxuICogUHJlLWJ1aWx0IHByZXNldCBjb25maWd1cmF0aW9ucyBmb3IgY29tbW9uIHVzZSBjYXNlc1xuICogSW1wb3J0IGFuZCB1c2UgdGhlc2UgZGlyZWN0bHkgaW4geW91ciBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGNvbnN0IENvbW1vblByZXNldHMgPSB7XG4gIC8qKlxuICAgKiBEYXNoYm9hcmQgcHJlc2V0cyAtIFBlcmZlY3QgZm9yIGFuYWx5dGljcyBkYXNoYm9hcmRzXG4gICAqL1xuICBkYXNoYm9hcmQ6IFtcbiAgICB7IGxhYmVsOiAnVG9kYXknLCBnZXRWYWx1ZTogZ2V0VG9kYXkgfSxcbiAgICB7IGxhYmVsOiAnWWVzdGVyZGF5JywgZ2V0VmFsdWU6IGdldFllc3RlcmRheSB9LFxuICAgIHsgbGFiZWw6ICdMYXN0IDcgZGF5cycsIGdldFZhbHVlOiAoKSA9PiBnZXRMYXN0TkRheXMoNykgfSxcbiAgICB7IGxhYmVsOiAnTGFzdCAzMCBkYXlzJywgZ2V0VmFsdWU6ICgpID0+IGdldExhc3RORGF5cygzMCkgfSxcbiAgICB7IGxhYmVsOiAnVGhpcyBtb250aCcsIGdldFZhbHVlOiBnZXRUaGlzTW9udGggfSxcbiAgICB7IGxhYmVsOiAnTGFzdCBtb250aCcsIGdldFZhbHVlOiBnZXRMYXN0TW9udGggfVxuICBdIGFzIFByZXNldENvbmZpZ1tdLFxuXG4gIC8qKlxuICAgKiBSZXBvcnRpbmcgcHJlc2V0cyAtIFBlcmZlY3QgZm9yIGJ1c2luZXNzIHJlcG9ydGluZ1xuICAgKi9cbiAgcmVwb3J0aW5nOiBbXG4gICAgeyBsYWJlbDogJ1RvZGF5JywgZ2V0VmFsdWU6IGdldFRvZGF5IH0sXG4gICAgeyBsYWJlbDogJ1RoaXMgd2VlaycsIGdldFZhbHVlOiBnZXRUaGlzV2VlayB9LFxuICAgIHsgbGFiZWw6ICdMYXN0IHdlZWsnLCBnZXRWYWx1ZTogZ2V0TGFzdFdlZWsgfSxcbiAgICB7IGxhYmVsOiAnVGhpcyBtb250aCcsIGdldFZhbHVlOiBnZXRUaGlzTW9udGggfSxcbiAgICB7IGxhYmVsOiAnTGFzdCBtb250aCcsIGdldFZhbHVlOiBnZXRMYXN0TW9udGggfSxcbiAgICB7IGxhYmVsOiAnVGhpcyBxdWFydGVyJywgZ2V0VmFsdWU6IGdldFRoaXNRdWFydGVyIH0sXG4gICAgeyBsYWJlbDogJ0xhc3QgcXVhcnRlcicsIGdldFZhbHVlOiBnZXRMYXN0UXVhcnRlciB9XG4gIF0gYXMgUHJlc2V0Q29uZmlnW10sXG5cbiAgLyoqXG4gICAqIEZpbmFuY2lhbCBwcmVzZXRzIC0gUGVyZmVjdCBmb3IgRVJQIGFuZCBhY2NvdW50aW5nIHN5c3RlbXNcbiAgICovXG4gIGZpbmFuY2lhbDogW1xuICAgIHsgbGFiZWw6ICdNb250aCB0byBkYXRlJywgZ2V0VmFsdWU6IGdldE1vbnRoVG9EYXRlIH0sXG4gICAgeyBsYWJlbDogJ1F1YXJ0ZXIgdG8gZGF0ZScsIGdldFZhbHVlOiBnZXRRdWFydGVyVG9EYXRlIH0sXG4gICAgeyBsYWJlbDogJ1llYXIgdG8gZGF0ZScsIGdldFZhbHVlOiBnZXRZZWFyVG9EYXRlIH0sXG4gICAgeyBsYWJlbDogJ0xhc3QgbW9udGgnLCBnZXRWYWx1ZTogZ2V0TGFzdE1vbnRoIH0sXG4gICAgeyBsYWJlbDogJ0xhc3QgcXVhcnRlcicsIGdldFZhbHVlOiBnZXRMYXN0UXVhcnRlciB9LFxuICAgIHsgbGFiZWw6ICdMYXN0IHllYXInLCBnZXRWYWx1ZTogZ2V0TGFzdFllYXIgfVxuICBdIGFzIFByZXNldENvbmZpZ1tdLFxuXG4gIC8qKlxuICAgKiBBbmFseXRpY3MgcHJlc2V0cyAtIFBlcmZlY3QgZm9yIEJJIGFuZCBkYXRhIGFuYWx5c2lzXG4gICAqL1xuICBhbmFseXRpY3M6IFtcbiAgICB7IGxhYmVsOiAnTGFzdCA3IGRheXMnLCBnZXRWYWx1ZTogKCkgPT4gZ2V0TGFzdE5EYXlzKDcpIH0sXG4gICAgeyBsYWJlbDogJ0xhc3QgMTQgZGF5cycsIGdldFZhbHVlOiAoKSA9PiBnZXRMYXN0TkRheXMoMTQpIH0sXG4gICAgeyBsYWJlbDogJ0xhc3QgMzAgZGF5cycsIGdldFZhbHVlOiAoKSA9PiBnZXRMYXN0TkRheXMoMzApIH0sXG4gICAgeyBsYWJlbDogJ0xhc3QgNjAgZGF5cycsIGdldFZhbHVlOiAoKSA9PiBnZXRMYXN0TkRheXMoNjApIH0sXG4gICAgeyBsYWJlbDogJ0xhc3QgOTAgZGF5cycsIGdldFZhbHVlOiAoKSA9PiBnZXRMYXN0TkRheXMoOTApIH0sXG4gICAgeyBsYWJlbDogJ0xhc3QgMTgwIGRheXMnLCBnZXRWYWx1ZTogKCkgPT4gZ2V0TGFzdE5EYXlzKDE4MCkgfSxcbiAgICB7IGxhYmVsOiAnTGFzdCAzNjUgZGF5cycsIGdldFZhbHVlOiAoKSA9PiBnZXRMYXN0TkRheXMoMzY1KSB9XG4gIF0gYXMgUHJlc2V0Q29uZmlnW10sXG5cbiAgLyoqXG4gICAqIFNpbXBsZSBwcmVzZXRzIC0gQmFzaWMgY29tbW9uIHJhbmdlc1xuICAgKi9cbiAgc2ltcGxlOiBbXG4gICAgeyBsYWJlbDogJ1RvZGF5JywgZ2V0VmFsdWU6IGdldFRvZGF5IH0sXG4gICAgeyBsYWJlbDogJ0xhc3QgNyBkYXlzJywgZ2V0VmFsdWU6ICgpID0+IGdldExhc3RORGF5cyg3KSB9LFxuICAgIHsgbGFiZWw6ICdMYXN0IDMwIGRheXMnLCBnZXRWYWx1ZTogKCkgPT4gZ2V0TGFzdE5EYXlzKDMwKSB9LFxuICAgIHsgbGFiZWw6ICdUaGlzIHllYXInLCBnZXRWYWx1ZTogZ2V0VGhpc1llYXIgfVxuICBdIGFzIFByZXNldENvbmZpZ1tdXG59O1xuIl19
@@ -5,4 +5,6 @@ export { DualDatepickerComponent } from './dual-datepicker.component';
5
5
  // Date Adapter System
6
6
  export { DateAdapter, DATE_ADAPTER } from './date-adapter';
7
7
  export { NativeDateAdapter } from './native-date-adapter';
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFHdEUsc0JBQXNCO0FBQ3RCLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBAb25lbHVpei9kdWFsLWRhdGVwaWNrZXJcbiAqL1xuXG5leHBvcnQgeyBEdWFsRGF0ZXBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4vZHVhbC1kYXRlcGlja2VyLmNvbXBvbmVudCc7XG5leHBvcnQgdHlwZSB7IERhdGVSYW5nZSwgUHJlc2V0Q29uZmlnLCBMb2NhbGVDb25maWcgfSBmcm9tICcuL2R1YWwtZGF0ZXBpY2tlci5jb21wb25lbnQnO1xuXG4vLyBEYXRlIEFkYXB0ZXIgU3lzdGVtXG5leHBvcnQgeyBEYXRlQWRhcHRlciwgREFURV9BREFQVEVSIH0gZnJvbSAnLi9kYXRlLWFkYXB0ZXInO1xuZXhwb3J0IHsgTmF0aXZlRGF0ZUFkYXB0ZXIgfSBmcm9tICcuL25hdGl2ZS1kYXRlLWFkYXB0ZXInO1xuIl19
8
+ // Preset Utilities
9
+ export * from './preset-utils';
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFHdEUsc0JBQXNCO0FBQ3RCLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUQsbUJBQW1CO0FBQ25CLGNBQWMsZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBAb25lbHVpei9kdWFsLWRhdGVwaWNrZXJcbiAqL1xuXG5leHBvcnQgeyBEdWFsRGF0ZXBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4vZHVhbC1kYXRlcGlja2VyLmNvbXBvbmVudCc7XG5leHBvcnQgdHlwZSB7IERhdGVSYW5nZSwgUHJlc2V0Q29uZmlnLCBQcmVzZXRSYW5nZSwgTG9jYWxlQ29uZmlnIH0gZnJvbSAnLi9kdWFsLWRhdGVwaWNrZXIuY29tcG9uZW50JztcblxuLy8gRGF0ZSBBZGFwdGVyIFN5c3RlbVxuZXhwb3J0IHsgRGF0ZUFkYXB0ZXIsIERBVEVfQURBUFRFUiB9IGZyb20gJy4vZGF0ZS1hZGFwdGVyJztcbmV4cG9ydCB7IE5hdGl2ZURhdGVBZGFwdGVyIH0gZnJvbSAnLi9uYXRpdmUtZGF0ZS1hZGFwdGVyJztcblxuLy8gUHJlc2V0IFV0aWxpdGllc1xuZXhwb3J0ICogZnJvbSAnLi9wcmVzZXQtdXRpbHMnO1xuIl19
@@ -329,10 +329,27 @@ class DualDatepickerComponent {
329
329
  return this.locale.dayNamesShort || this.defaultDayNamesShort;
330
330
  }
331
331
  seleccionarRangoPredefinido(preset) {
332
- const hoy = this.dateAdapter.today();
333
- const fechaInicio = this.dateAdapter.addDays(hoy, -preset.daysAgo);
334
- this.fechaInicio = this.formatearFecha(fechaInicio);
335
- this.fechaFin = this.formatearFecha(hoy);
332
+ let start;
333
+ let end;
334
+ // New flexible pattern with getValue()
335
+ if (preset.getValue) {
336
+ const range = preset.getValue();
337
+ start = range.start;
338
+ end = range.end;
339
+ }
340
+ // Backward compatibility with daysAgo pattern
341
+ else if (preset.daysAgo !== undefined) {
342
+ const hoy = this.dateAdapter.today();
343
+ const fechaInicio = this.dateAdapter.addDays(hoy, -preset.daysAgo);
344
+ start = this.formatearFecha(fechaInicio);
345
+ end = this.formatearFecha(hoy);
346
+ }
347
+ else {
348
+ console.error('PresetConfig must have either getValue() or daysAgo');
349
+ return;
350
+ }
351
+ this.fechaInicio = start;
352
+ this.fechaFin = end;
336
353
  this.actualizarRangoFechasTexto();
337
354
  this.generarCalendarios();
338
355
  if (this.closeOnPresetSelection) {
@@ -462,6 +479,282 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
462
479
  args: ['document:click', ['$event']]
463
480
  }] } });
464
481
 
482
+ /**
483
+ * Utility functions for creating common date range presets
484
+ * Perfect for dashboards, reporting, POS, BI apps, and ERP systems
485
+ */
486
+ /**
487
+ * Format a date as YYYY-MM-DD string
488
+ */
489
+ function formatDate(date) {
490
+ const year = date.getFullYear();
491
+ const month = String(date.getMonth() + 1).padStart(2, '0');
492
+ const day = String(date.getDate()).padStart(2, '0');
493
+ return `${year}-${month}-${day}`;
494
+ }
495
+ /**
496
+ * Get the start of today
497
+ */
498
+ function getToday() {
499
+ const today = new Date();
500
+ return {
501
+ start: formatDate(today),
502
+ end: formatDate(today)
503
+ };
504
+ }
505
+ /**
506
+ * Get yesterday's date range
507
+ */
508
+ function getYesterday() {
509
+ const yesterday = new Date();
510
+ yesterday.setDate(yesterday.getDate() - 1);
511
+ return {
512
+ start: formatDate(yesterday),
513
+ end: formatDate(yesterday)
514
+ };
515
+ }
516
+ /**
517
+ * Get last N days (including today)
518
+ */
519
+ function getLastNDays(days) {
520
+ const end = new Date();
521
+ const start = new Date();
522
+ start.setDate(start.getDate() - days + 1);
523
+ return {
524
+ start: formatDate(start),
525
+ end: formatDate(end)
526
+ };
527
+ }
528
+ /**
529
+ * Get this week (Monday to Sunday)
530
+ */
531
+ function getThisWeek() {
532
+ const today = new Date();
533
+ const dayOfWeek = today.getDay();
534
+ const start = new Date(today);
535
+ // Adjust to Monday (1) as first day of week
536
+ const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
537
+ start.setDate(start.getDate() - daysToMonday);
538
+ const end = new Date(start);
539
+ end.setDate(end.getDate() + 6);
540
+ return {
541
+ start: formatDate(start),
542
+ end: formatDate(end)
543
+ };
544
+ }
545
+ /**
546
+ * Get last week (Monday to Sunday)
547
+ */
548
+ function getLastWeek() {
549
+ const today = new Date();
550
+ const dayOfWeek = today.getDay();
551
+ const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
552
+ const lastMonday = new Date(today);
553
+ lastMonday.setDate(lastMonday.getDate() - daysToMonday - 7);
554
+ const lastSunday = new Date(lastMonday);
555
+ lastSunday.setDate(lastSunday.getDate() + 6);
556
+ return {
557
+ start: formatDate(lastMonday),
558
+ end: formatDate(lastSunday)
559
+ };
560
+ }
561
+ /**
562
+ * Get this month (1st to last day)
563
+ */
564
+ function getThisMonth() {
565
+ const today = new Date();
566
+ const start = new Date(today.getFullYear(), today.getMonth(), 1);
567
+ const end = new Date(today.getFullYear(), today.getMonth() + 1, 0);
568
+ return {
569
+ start: formatDate(start),
570
+ end: formatDate(end)
571
+ };
572
+ }
573
+ /**
574
+ * Get last month (1st to last day)
575
+ */
576
+ function getLastMonth() {
577
+ const today = new Date();
578
+ const start = new Date(today.getFullYear(), today.getMonth() - 1, 1);
579
+ const end = new Date(today.getFullYear(), today.getMonth(), 0);
580
+ return {
581
+ start: formatDate(start),
582
+ end: formatDate(end)
583
+ };
584
+ }
585
+ /**
586
+ * Get month to date (1st of current month to today)
587
+ */
588
+ function getMonthToDate() {
589
+ const today = new Date();
590
+ const start = new Date(today.getFullYear(), today.getMonth(), 1);
591
+ return {
592
+ start: formatDate(start),
593
+ end: formatDate(today)
594
+ };
595
+ }
596
+ /**
597
+ * Get this quarter (Q1, Q2, Q3, or Q4)
598
+ */
599
+ function getThisQuarter() {
600
+ const today = new Date();
601
+ const currentMonth = today.getMonth();
602
+ const quarterStartMonth = Math.floor(currentMonth / 3) * 3;
603
+ const start = new Date(today.getFullYear(), quarterStartMonth, 1);
604
+ const end = new Date(today.getFullYear(), quarterStartMonth + 3, 0);
605
+ return {
606
+ start: formatDate(start),
607
+ end: formatDate(end)
608
+ };
609
+ }
610
+ /**
611
+ * Get last quarter
612
+ */
613
+ function getLastQuarter() {
614
+ const today = new Date();
615
+ const currentMonth = today.getMonth();
616
+ const lastQuarterStartMonth = Math.floor(currentMonth / 3) * 3 - 3;
617
+ const start = new Date(today.getFullYear(), lastQuarterStartMonth, 1);
618
+ const end = new Date(today.getFullYear(), lastQuarterStartMonth + 3, 0);
619
+ return {
620
+ start: formatDate(start),
621
+ end: formatDate(end)
622
+ };
623
+ }
624
+ /**
625
+ * Get quarter to date (start of current quarter to today)
626
+ */
627
+ function getQuarterToDate() {
628
+ const today = new Date();
629
+ const currentMonth = today.getMonth();
630
+ const quarterStartMonth = Math.floor(currentMonth / 3) * 3;
631
+ const start = new Date(today.getFullYear(), quarterStartMonth, 1);
632
+ return {
633
+ start: formatDate(start),
634
+ end: formatDate(today)
635
+ };
636
+ }
637
+ /**
638
+ * Get this year (January 1 to December 31)
639
+ */
640
+ function getThisYear() {
641
+ const today = new Date();
642
+ const start = new Date(today.getFullYear(), 0, 1);
643
+ const end = new Date(today.getFullYear(), 11, 31);
644
+ return {
645
+ start: formatDate(start),
646
+ end: formatDate(end)
647
+ };
648
+ }
649
+ /**
650
+ * Get last year
651
+ */
652
+ function getLastYear() {
653
+ const today = new Date();
654
+ const start = new Date(today.getFullYear() - 1, 0, 1);
655
+ const end = new Date(today.getFullYear() - 1, 11, 31);
656
+ return {
657
+ start: formatDate(start),
658
+ end: formatDate(end)
659
+ };
660
+ }
661
+ /**
662
+ * Get year to date (January 1 to today)
663
+ */
664
+ function getYearToDate() {
665
+ const today = new Date();
666
+ const start = new Date(today.getFullYear(), 0, 1);
667
+ return {
668
+ start: formatDate(start),
669
+ end: formatDate(today)
670
+ };
671
+ }
672
+ /**
673
+ * Get last N months (including current partial month)
674
+ */
675
+ function getLastNMonths(months) {
676
+ const today = new Date();
677
+ const start = new Date(today);
678
+ start.setMonth(start.getMonth() - months);
679
+ return {
680
+ start: formatDate(start),
681
+ end: formatDate(today)
682
+ };
683
+ }
684
+ /**
685
+ * Get last N years
686
+ */
687
+ function getLastNYears(years) {
688
+ const today = new Date();
689
+ const start = new Date(today);
690
+ start.setFullYear(start.getFullYear() - years);
691
+ return {
692
+ start: formatDate(start),
693
+ end: formatDate(today)
694
+ };
695
+ }
696
+ /**
697
+ * Pre-built preset configurations for common use cases
698
+ * Import and use these directly in your component
699
+ */
700
+ const CommonPresets = {
701
+ /**
702
+ * Dashboard presets - Perfect for analytics dashboards
703
+ */
704
+ dashboard: [
705
+ { label: 'Today', getValue: getToday },
706
+ { label: 'Yesterday', getValue: getYesterday },
707
+ { label: 'Last 7 days', getValue: () => getLastNDays(7) },
708
+ { label: 'Last 30 days', getValue: () => getLastNDays(30) },
709
+ { label: 'This month', getValue: getThisMonth },
710
+ { label: 'Last month', getValue: getLastMonth }
711
+ ],
712
+ /**
713
+ * Reporting presets - Perfect for business reporting
714
+ */
715
+ reporting: [
716
+ { label: 'Today', getValue: getToday },
717
+ { label: 'This week', getValue: getThisWeek },
718
+ { label: 'Last week', getValue: getLastWeek },
719
+ { label: 'This month', getValue: getThisMonth },
720
+ { label: 'Last month', getValue: getLastMonth },
721
+ { label: 'This quarter', getValue: getThisQuarter },
722
+ { label: 'Last quarter', getValue: getLastQuarter }
723
+ ],
724
+ /**
725
+ * Financial presets - Perfect for ERP and accounting systems
726
+ */
727
+ financial: [
728
+ { label: 'Month to date', getValue: getMonthToDate },
729
+ { label: 'Quarter to date', getValue: getQuarterToDate },
730
+ { label: 'Year to date', getValue: getYearToDate },
731
+ { label: 'Last month', getValue: getLastMonth },
732
+ { label: 'Last quarter', getValue: getLastQuarter },
733
+ { label: 'Last year', getValue: getLastYear }
734
+ ],
735
+ /**
736
+ * Analytics presets - Perfect for BI and data analysis
737
+ */
738
+ analytics: [
739
+ { label: 'Last 7 days', getValue: () => getLastNDays(7) },
740
+ { label: 'Last 14 days', getValue: () => getLastNDays(14) },
741
+ { label: 'Last 30 days', getValue: () => getLastNDays(30) },
742
+ { label: 'Last 60 days', getValue: () => getLastNDays(60) },
743
+ { label: 'Last 90 days', getValue: () => getLastNDays(90) },
744
+ { label: 'Last 180 days', getValue: () => getLastNDays(180) },
745
+ { label: 'Last 365 days', getValue: () => getLastNDays(365) }
746
+ ],
747
+ /**
748
+ * Simple presets - Basic common ranges
749
+ */
750
+ simple: [
751
+ { label: 'Today', getValue: getToday },
752
+ { label: 'Last 7 days', getValue: () => getLastNDays(7) },
753
+ { label: 'Last 30 days', getValue: () => getLastNDays(30) },
754
+ { label: 'This year', getValue: getThisYear }
755
+ ]
756
+ };
757
+
465
758
  /**
466
759
  * Public API Surface of @oneluiz/dual-datepicker
467
760
  */
@@ -470,5 +763,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
470
763
  * Generated bundle index. Do not edit.
471
764
  */
472
765
 
473
- export { DATE_ADAPTER, DateAdapter, DualDatepickerComponent, NativeDateAdapter };
766
+ export { CommonPresets, DATE_ADAPTER, DateAdapter, DualDatepickerComponent, NativeDateAdapter, getLastMonth, getLastNDays, getLastNMonths, getLastNYears, getLastQuarter, getLastWeek, getLastYear, getMonthToDate, getQuarterToDate, getThisMonth, getThisQuarter, getThisWeek, getThisYear, getToday, getYearToDate, getYesterday };
474
767
  //# sourceMappingURL=oneluiz-dual-datepicker.mjs.map