@automattic/date-range-picker 1.0.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.
- package/README.md +80 -0
- package/dist/cjs/button-stack.js +9 -0
- package/dist/cjs/button-stack.js.map +1 -0
- package/dist/cjs/date-inputs.js +37 -0
- package/dist/cjs/date-inputs.js.map +1 -0
- package/dist/cjs/date-range-content.js +194 -0
- package/dist/cjs/date-range-content.js.map +1 -0
- package/dist/cjs/date-range-picker.js +48 -0
- package/dist/cjs/date-range-picker.js.map +1 -0
- package/dist/cjs/datetime.js +56 -0
- package/dist/cjs/datetime.js.map +1 -0
- package/dist/cjs/index.js +16 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/presets-listbox.js +18 -0
- package/dist/cjs/presets-listbox.js.map +1 -0
- package/dist/cjs/utils.js +137 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/esm/button-stack.js +6 -0
- package/dist/esm/button-stack.js.map +1 -0
- package/dist/esm/date-inputs.js +34 -0
- package/dist/esm/date-inputs.js.map +1 -0
- package/dist/esm/date-range-content.js +191 -0
- package/dist/esm/date-range-content.js.map +1 -0
- package/dist/esm/date-range-picker.js +45 -0
- package/dist/esm/date-range-picker.js.map +1 -0
- package/dist/esm/datetime.js +50 -0
- package/dist/esm/datetime.js.map +1 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/presets-listbox.js +15 -0
- package/dist/esm/presets-listbox.js.map +1 -0
- package/dist/esm/utils.js +130 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/tsconfig-cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/button-stack.d.ts +8 -0
- package/dist/types/button-stack.d.ts.map +1 -0
- package/dist/types/date-inputs.d.ts +21 -0
- package/dist/types/date-inputs.d.ts.map +1 -0
- package/dist/types/date-range-content.d.ts +39 -0
- package/dist/types/date-range-content.d.ts.map +1 -0
- package/dist/types/date-range-picker.d.ts +25 -0
- package/dist/types/date-range-picker.d.ts.map +1 -0
- package/dist/types/datetime.d.ts +15 -0
- package/dist/types/datetime.d.ts.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/presets-listbox.d.ts +12 -0
- package/dist/types/presets-listbox.d.ts.map +1 -0
- package/dist/types/utils.d.ts +40 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/package.json +71 -0
- package/src/button-stack.tsx +17 -0
- package/src/date-inputs.tsx +142 -0
- package/src/date-range-content.tsx +379 -0
- package/src/date-range-picker.tsx +197 -0
- package/src/datetime.ts +58 -0
- package/src/index.ts +11 -0
- package/src/presets-listbox.tsx +65 -0
- package/src/style.scss +72 -0
- package/src/test/date-range-picker.test.tsx +334 -0
- package/src/test/utils.test.ts +58 -0
- package/src/types.d.ts +1 -0
- package/src/utils.ts +174 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { __, sprintf } from '@wordpress/i18n';
|
|
2
|
+
import { startOfDay, isSameDay, addDays, addYears, startOfMonth, startOfYear, differenceInCalendarDays, } from 'date-fns';
|
|
3
|
+
import { formatDate, parseYmdLocal, formatYmd } from './datetime';
|
|
4
|
+
// Range helpers (inclusive)
|
|
5
|
+
const lastNDays = (date, number) => ({
|
|
6
|
+
from: new Date(date.getFullYear(), date.getMonth(), date.getDate() - (number - 1)),
|
|
7
|
+
to: date,
|
|
8
|
+
});
|
|
9
|
+
const monthToDate = (date) => ({
|
|
10
|
+
from: new Date(date.getFullYear(), date.getMonth(), 1),
|
|
11
|
+
to: date,
|
|
12
|
+
});
|
|
13
|
+
const yearToDate = (date) => ({
|
|
14
|
+
from: new Date(date.getFullYear(), 0, 1),
|
|
15
|
+
to: date,
|
|
16
|
+
});
|
|
17
|
+
const lastTwelveMonths = (date) => ({
|
|
18
|
+
from: new Date(date.getFullYear() - 1, date.getMonth(), date.getDate() + 1),
|
|
19
|
+
to: date,
|
|
20
|
+
});
|
|
21
|
+
const lastThreeYears = (date) => ({
|
|
22
|
+
from: new Date(date.getFullYear() - 3, date.getMonth(), date.getDate() + 1),
|
|
23
|
+
to: date,
|
|
24
|
+
});
|
|
25
|
+
export const presetDefs = [
|
|
26
|
+
{ id: 'today', label: __('Today') },
|
|
27
|
+
{ id: 'yesterday', label: __('Yesterday') },
|
|
28
|
+
{ id: 'last-7-days', label: __('Last 7 days') },
|
|
29
|
+
{ id: 'last-30-days', label: __('Last 30 days') },
|
|
30
|
+
{ id: 'last-90-days', label: __('Last 90 days') },
|
|
31
|
+
{ id: 'month-to-date', label: __('Month to date') },
|
|
32
|
+
{ id: 'last-12-months', label: __('Last 12 months') },
|
|
33
|
+
{ id: 'year-to-date', label: __('Year to date') },
|
|
34
|
+
{ id: 'last-3-years', label: __('Last 3 years') },
|
|
35
|
+
];
|
|
36
|
+
export function computePresetRange(preset, baseDate) {
|
|
37
|
+
switch (preset) {
|
|
38
|
+
case 'today':
|
|
39
|
+
return { from: baseDate, to: baseDate };
|
|
40
|
+
case 'yesterday':
|
|
41
|
+
return {
|
|
42
|
+
from: new Date(baseDate.getFullYear(), baseDate.getMonth(), baseDate.getDate() - 1),
|
|
43
|
+
to: new Date(baseDate.getFullYear(), baseDate.getMonth(), baseDate.getDate() - 1),
|
|
44
|
+
};
|
|
45
|
+
case 'last-7-days':
|
|
46
|
+
return lastNDays(baseDate, 7);
|
|
47
|
+
case 'last-30-days':
|
|
48
|
+
return lastNDays(baseDate, 30);
|
|
49
|
+
case 'last-90-days':
|
|
50
|
+
return lastNDays(baseDate, 90);
|
|
51
|
+
case 'month-to-date':
|
|
52
|
+
return monthToDate(baseDate);
|
|
53
|
+
case 'last-12-months':
|
|
54
|
+
return lastTwelveMonths(baseDate);
|
|
55
|
+
case 'year-to-date':
|
|
56
|
+
return yearToDate(baseDate);
|
|
57
|
+
case 'last-3-years':
|
|
58
|
+
return lastThreeYears(baseDate);
|
|
59
|
+
default:
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export function getActivePresetId(from, to, baseDate) {
|
|
64
|
+
if (!from || !to || !baseDate) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
let newFrom = startOfDay(from);
|
|
68
|
+
let newTo = startOfDay(to);
|
|
69
|
+
if (newFrom.getTime() > newTo.getTime()) {
|
|
70
|
+
const tmp = newFrom;
|
|
71
|
+
newFrom = newTo;
|
|
72
|
+
newTo = tmp;
|
|
73
|
+
}
|
|
74
|
+
const todayStart = startOfDay(baseDate);
|
|
75
|
+
const yesterdayStart = addDays(todayStart, -1);
|
|
76
|
+
if (isSameDay(newFrom, todayStart) && isSameDay(newTo, todayStart)) {
|
|
77
|
+
return 'today';
|
|
78
|
+
}
|
|
79
|
+
if (isSameDay(newFrom, yesterdayStart) && isSameDay(newTo, yesterdayStart)) {
|
|
80
|
+
return 'yesterday';
|
|
81
|
+
}
|
|
82
|
+
if (isSameDay(newTo, todayStart)) {
|
|
83
|
+
const diff = differenceInCalendarDays(todayStart, newFrom); // inclusive days = diff + 1
|
|
84
|
+
if (diff === 6) {
|
|
85
|
+
return 'last-7-days';
|
|
86
|
+
}
|
|
87
|
+
if (diff === 29) {
|
|
88
|
+
return 'last-30-days';
|
|
89
|
+
}
|
|
90
|
+
if (diff === 89) {
|
|
91
|
+
return 'last-90-days';
|
|
92
|
+
}
|
|
93
|
+
if (isSameDay(newFrom, addYears(todayStart, -1)) ||
|
|
94
|
+
isSameDay(newFrom, addDays(addYears(todayStart, -1), 1))) {
|
|
95
|
+
return 'last-12-months';
|
|
96
|
+
}
|
|
97
|
+
if (isSameDay(newFrom, addYears(todayStart, -3)) ||
|
|
98
|
+
isSameDay(newFrom, addDays(addYears(todayStart, -3), 1))) {
|
|
99
|
+
return 'last-3-years';
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (isSameDay(newFrom, startOfMonth(todayStart)) && isSameDay(newTo, todayStart)) {
|
|
103
|
+
return 'month-to-date';
|
|
104
|
+
}
|
|
105
|
+
if (isSameDay(newFrom, startOfYear(todayStart)) && isSameDay(newTo, todayStart)) {
|
|
106
|
+
return 'year-to-date';
|
|
107
|
+
}
|
|
108
|
+
for (const preset of presetDefs) {
|
|
109
|
+
const range = computePresetRange(preset.id, todayStart);
|
|
110
|
+
if (range &&
|
|
111
|
+
isSameDay(newFrom, startOfDay(range.from)) &&
|
|
112
|
+
isSameDay(newTo, startOfDay(range.to))) {
|
|
113
|
+
return preset.id;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
// UI-specific: Date range label for the picker
|
|
119
|
+
export function formatLabel(start, end, locale) {
|
|
120
|
+
return sprintf(
|
|
121
|
+
/* translators: %1$s: start date, %2$s: end date */
|
|
122
|
+
__('%1$s to %2$s'), formatDate(start, locale, { dateStyle: 'medium' }), formatDate(end, locale, { dateStyle: 'medium' }));
|
|
123
|
+
}
|
|
124
|
+
// Determine if the given date range matches the last 7 days preset
|
|
125
|
+
export function isLast7Days(range, timezoneString, gmtOffset) {
|
|
126
|
+
const siteToday = parseYmdLocal(formatYmd(new Date(), timezoneString, gmtOffset)) ??
|
|
127
|
+
new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate());
|
|
128
|
+
return getActivePresetId(range.start, range.end, siteToday) === 'last-7-days';
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
|