@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.
Files changed (64) hide show
  1. package/README.md +80 -0
  2. package/dist/cjs/button-stack.js +9 -0
  3. package/dist/cjs/button-stack.js.map +1 -0
  4. package/dist/cjs/date-inputs.js +37 -0
  5. package/dist/cjs/date-inputs.js.map +1 -0
  6. package/dist/cjs/date-range-content.js +194 -0
  7. package/dist/cjs/date-range-content.js.map +1 -0
  8. package/dist/cjs/date-range-picker.js +48 -0
  9. package/dist/cjs/date-range-picker.js.map +1 -0
  10. package/dist/cjs/datetime.js +56 -0
  11. package/dist/cjs/datetime.js.map +1 -0
  12. package/dist/cjs/index.js +16 -0
  13. package/dist/cjs/index.js.map +1 -0
  14. package/dist/cjs/presets-listbox.js +18 -0
  15. package/dist/cjs/presets-listbox.js.map +1 -0
  16. package/dist/cjs/utils.js +137 -0
  17. package/dist/cjs/utils.js.map +1 -0
  18. package/dist/esm/button-stack.js +6 -0
  19. package/dist/esm/button-stack.js.map +1 -0
  20. package/dist/esm/date-inputs.js +34 -0
  21. package/dist/esm/date-inputs.js.map +1 -0
  22. package/dist/esm/date-range-content.js +191 -0
  23. package/dist/esm/date-range-content.js.map +1 -0
  24. package/dist/esm/date-range-picker.js +45 -0
  25. package/dist/esm/date-range-picker.js.map +1 -0
  26. package/dist/esm/datetime.js +50 -0
  27. package/dist/esm/datetime.js.map +1 -0
  28. package/dist/esm/index.js +4 -0
  29. package/dist/esm/index.js.map +1 -0
  30. package/dist/esm/presets-listbox.js +15 -0
  31. package/dist/esm/presets-listbox.js.map +1 -0
  32. package/dist/esm/utils.js +130 -0
  33. package/dist/esm/utils.js.map +1 -0
  34. package/dist/tsconfig-cjs.tsbuildinfo +1 -0
  35. package/dist/tsconfig.tsbuildinfo +1 -0
  36. package/dist/types/button-stack.d.ts +8 -0
  37. package/dist/types/button-stack.d.ts.map +1 -0
  38. package/dist/types/date-inputs.d.ts +21 -0
  39. package/dist/types/date-inputs.d.ts.map +1 -0
  40. package/dist/types/date-range-content.d.ts +39 -0
  41. package/dist/types/date-range-content.d.ts.map +1 -0
  42. package/dist/types/date-range-picker.d.ts +25 -0
  43. package/dist/types/date-range-picker.d.ts.map +1 -0
  44. package/dist/types/datetime.d.ts +15 -0
  45. package/dist/types/datetime.d.ts.map +1 -0
  46. package/dist/types/index.d.ts +6 -0
  47. package/dist/types/index.d.ts.map +1 -0
  48. package/dist/types/presets-listbox.d.ts +12 -0
  49. package/dist/types/presets-listbox.d.ts.map +1 -0
  50. package/dist/types/utils.d.ts +40 -0
  51. package/dist/types/utils.d.ts.map +1 -0
  52. package/package.json +71 -0
  53. package/src/button-stack.tsx +17 -0
  54. package/src/date-inputs.tsx +142 -0
  55. package/src/date-range-content.tsx +379 -0
  56. package/src/date-range-picker.tsx +197 -0
  57. package/src/datetime.ts +58 -0
  58. package/src/index.ts +11 -0
  59. package/src/presets-listbox.tsx +65 -0
  60. package/src/style.scss +72 -0
  61. package/src/test/date-range-picker.test.tsx +334 -0
  62. package/src/test/utils.test.ts +58 -0
  63. package/src/types.d.ts +1 -0
  64. 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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"}