react-day-picker 9.0.4 → 9.0.5
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 +1 -1
- package/dist/cjs/selection/useRange.js +3 -19
- package/dist/cjs/selection/useRange.js.map +1 -1
- package/dist/cjs/utils/addToRange.d.ts +6 -2
- package/dist/cjs/utils/addToRange.js +68 -24
- package/dist/cjs/utils/addToRange.js.map +1 -1
- package/dist/esm/selection/useRange.js +3 -19
- package/dist/esm/selection/useRange.js.map +1 -1
- package/dist/esm/utils/addToRange.d.ts +6 -2
- package/dist/esm/utils/addToRange.js +68 -24
- package/dist/esm/utils/addToRange.js.map +1 -1
- package/examples/MultipleRequired.tsx +7 -0
- package/examples/RangeMinMax.test.tsx +5 -16
- package/examples/RangeMinMax.tsx +5 -6
- package/examples/RangeRequired.tsx +30 -0
- package/examples/RangeShiftKey.tsx +1 -3
- package/examples/index.ts +2 -0
- package/package.json +3 -3
- package/src/selection/useRange.test.tsx +2 -2
- package/src/selection/useRange.tsx +3 -25
- package/src/style.css +11 -5
- package/src/style.module.css +12 -6
- package/src/utils/addToRange.test.ts +95 -97
- package/src/utils/addToRange.ts +64 -28
- package/website/docs/docs/selection-modes.mdx +51 -75
- package/website/docs/guides/custom-components.mdx +16 -88
- package/website/docs/intro.mdx +1 -1
- package/website/docs/upgrading.mdx +4 -9
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ DayPicker is a [React](https://react.dev) component to create date pickers, cale
|
|
|
11
11
|
- 📅 Supports [selections](./docs/selection-modes.mdx) of single day, multiple days, ranges of days, or [custom selections](./guides/custom-selections.mdx).
|
|
12
12
|
- 🌍 Can be [localized](./docs/localization.mdx) into any language, supports [ISO 8601 dates](./docs/localization.mdx#iso-week-dates), [UTC dates](./docs/localization.mdx#utc-dates), and [Jalali calendar](./docs/localization.mdx#jalali-calendar).
|
|
13
13
|
- 🦮 Complies with WCAG 2.1 AA requirements for [accessibility](./docs/accessibility.mdx).
|
|
14
|
-
- ⚙️ [Customizable components](./guides/custom-components.mdx)
|
|
14
|
+
- ⚙️ [Customizable components](./guides/custom-components.mdx) to extend the rendered elements.
|
|
15
15
|
- 🔤 Easy integration [with input fields](./guides/input-fields.mdx).
|
|
16
16
|
|
|
17
17
|
DayPicker is written in TypeScript and compiled to CommonJS and ESM. It relies on [date-fns](https://date-fns.org) for date manipulation and formatting.
|
|
@@ -9,7 +9,6 @@ const index_js_1 = require("../utils/index.js");
|
|
|
9
9
|
const rangeIncludesDate_js_1 = require("../utils/rangeIncludesDate.js");
|
|
10
10
|
function useRange(props, dateLib) {
|
|
11
11
|
const { mode, disabled, excludeDisabled, selected: initiallySelected, required, onSelect } = props;
|
|
12
|
-
const { differenceInCalendarDays } = dateLib;
|
|
13
12
|
const [selected, setSelected] = react_1.default.useState(initiallySelected);
|
|
14
13
|
// Update the selected date if the required flag is set.
|
|
15
14
|
react_1.default.useEffect(() => {
|
|
@@ -23,26 +22,10 @@ function useRange(props, dateLib) {
|
|
|
23
22
|
}, [initiallySelected]);
|
|
24
23
|
const isSelected = (date) => selected && (0, rangeIncludesDate_js_1.rangeIncludesDate)(selected, date, false, dateLib);
|
|
25
24
|
const select = (triggerDate, modifiers, e) => {
|
|
25
|
+
const { min, max } = props;
|
|
26
26
|
const newRange = triggerDate
|
|
27
|
-
? (0, index_js_1.addToRange)(triggerDate, selected, dateLib)
|
|
27
|
+
? (0, index_js_1.addToRange)(triggerDate, selected, min, max, required, dateLib)
|
|
28
28
|
: undefined;
|
|
29
|
-
const { min, max } = props;
|
|
30
|
-
if (min) {
|
|
31
|
-
if (newRange?.from &&
|
|
32
|
-
newRange.to &&
|
|
33
|
-
differenceInCalendarDays(newRange.to, newRange.from) < min - 1) {
|
|
34
|
-
newRange.from = triggerDate;
|
|
35
|
-
newRange.to = undefined;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
if (max) {
|
|
39
|
-
if (newRange?.from &&
|
|
40
|
-
newRange.to &&
|
|
41
|
-
differenceInCalendarDays(newRange.to, newRange.from) >= max) {
|
|
42
|
-
newRange.from = triggerDate;
|
|
43
|
-
newRange.to = undefined;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
29
|
if (newRange?.from && newRange.to) {
|
|
47
30
|
let newDate = newRange.from;
|
|
48
31
|
while (dateLib.differenceInCalendarDays(newRange.to, newDate) > 0) {
|
|
@@ -50,6 +33,7 @@ function useRange(props, dateLib) {
|
|
|
50
33
|
if (excludeDisabled &&
|
|
51
34
|
disabled &&
|
|
52
35
|
(0, index_js_1.dateMatchModifiers)(newDate, disabled, dateLib)) {
|
|
36
|
+
// if a disabled days is found, the range is reset
|
|
53
37
|
newRange.from = triggerDate;
|
|
54
38
|
newRange.to = undefined;
|
|
55
39
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRange.js","sourceRoot":"","sources":["../../../src/selection/useRange.tsx"],"names":[],"mappings":";;;;;AAaA,
|
|
1
|
+
{"version":3,"file":"useRange.js","sourceRoot":"","sources":["../../../src/selection/useRange.tsx"],"names":[],"mappings":";;;;;AAaA,4BAsEC;AAnFD,kDAA0B;AAU1B,gDAAmE;AACnE,wEAAkE;AAElE,SAAgB,QAAQ,CACtB,KAAQ,EACR,OAAgB;IAEhB,MAAM,EACJ,IAAI,EACJ,QAAQ,EACR,eAAe,EACf,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EACR,QAAQ,EACT,GAAG,KAAmB,CAAC;IAExB,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,eAAK,CAAC,QAAQ,CAC5C,iBAAiB,CAClB,CAAC;IAEF,wDAAwD;IACxD,eAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,QAAQ,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACvC,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAE/B,2DAA2D;IAC3D,eAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,WAAW,CAAC,iBAAiB,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAExB,MAAM,UAAU,GAAG,CAAC,IAAU,EAAE,EAAE,CAChC,QAAQ,IAAI,IAAA,wCAAiB,EAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAEhE,MAAM,MAAM,GAAG,CACb,WAAiB,EACjB,SAAoB,EACpB,CAAyC,EACzC,EAAE;QACF,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAmB,CAAC;QACzC,MAAM,QAAQ,GAAG,WAAW;YAC1B,CAAC,CAAC,IAAA,qBAAU,EAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC;YAChE,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,QAAQ,EAAE,IAAI,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClC,IAAI,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC5B,OAAO,OAAO,CAAC,wBAAwB,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACtC,IACE,eAAe;oBACf,QAAQ;oBACR,IAAA,6BAAkB,EAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EAC9C,CAAC;oBACD,kDAAkD;oBAClD,QAAQ,CAAC,IAAI,GAAG,WAAW,CAAC;oBAC5B,QAAQ,CAAC,EAAE,GAAG,SAAS,CAAC;oBACxB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtB,QAAQ,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAEhD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO;QACL,QAAQ;QACR,MAAM;QACN,UAAU;KACK,CAAC;AACpB,CAAC"}
|
|
@@ -7,6 +7,10 @@ import type { DateRange, DateLib } from "../types/index.js";
|
|
|
7
7
|
*
|
|
8
8
|
* @group Utilities
|
|
9
9
|
*/
|
|
10
|
-
export declare function addToRange(
|
|
10
|
+
export declare function addToRange(
|
|
11
|
+
/** The date to add to the range. */
|
|
12
|
+
date: Date,
|
|
13
|
+
/** The range where to add `date`. */
|
|
14
|
+
initialRange: DateRange | undefined, min?: number, max?: number, required?: boolean,
|
|
11
15
|
/** @ignore */
|
|
12
|
-
dateLib?: DateLib): DateRange;
|
|
16
|
+
dateLib?: DateLib): DateRange | undefined;
|
|
@@ -10,41 +10,85 @@ const index_js_1 = require("../lib/index.js");
|
|
|
10
10
|
*
|
|
11
11
|
* @group Utilities
|
|
12
12
|
*/
|
|
13
|
-
function addToRange(
|
|
13
|
+
function addToRange(
|
|
14
|
+
/** The date to add to the range. */
|
|
15
|
+
date,
|
|
16
|
+
/** The range where to add `date`. */
|
|
17
|
+
initialRange, min = 0, max = 0, required = false,
|
|
14
18
|
/** @ignore */
|
|
15
19
|
dateLib = index_js_1.dateLib) {
|
|
16
|
-
const { from, to } =
|
|
20
|
+
const { from, to } = initialRange || {};
|
|
17
21
|
const { isSameDay, isAfter, isBefore } = dateLib;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
let range;
|
|
23
|
+
if (!from && !to) {
|
|
24
|
+
// the range is empty, add the date
|
|
25
|
+
range = { from: date, to: min > 0 ? undefined : date };
|
|
26
|
+
}
|
|
27
|
+
else if (from && !to) {
|
|
28
|
+
// adding date to an incomplete range
|
|
25
29
|
if (isSameDay(from, date)) {
|
|
26
|
-
|
|
30
|
+
// adding a date equal to the start of the range
|
|
31
|
+
if (required) {
|
|
32
|
+
range = { from, to: undefined };
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
range = undefined;
|
|
36
|
+
}
|
|
27
37
|
}
|
|
28
|
-
if (
|
|
29
|
-
|
|
38
|
+
else if (isBefore(date, from)) {
|
|
39
|
+
// adding a date before the start of the range
|
|
40
|
+
range = { from: date, to: from };
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
// adding a date after the start of the range
|
|
44
|
+
range = { from, to: date };
|
|
30
45
|
}
|
|
31
|
-
return { from, to: date };
|
|
32
46
|
}
|
|
33
|
-
if (to) {
|
|
34
|
-
|
|
35
|
-
|
|
47
|
+
else if (from && to) {
|
|
48
|
+
// adding date to a complete range
|
|
49
|
+
if (isSameDay(from, date) && isSameDay(to, date)) {
|
|
50
|
+
// adding a date that is equal to both start and end of the range
|
|
51
|
+
if (required) {
|
|
52
|
+
range = { from, to };
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
range = undefined;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else if (isSameDay(from, date)) {
|
|
59
|
+
// adding a date equal to the the start of the range
|
|
60
|
+
range = { from, to: min > 0 ? undefined : date };
|
|
61
|
+
}
|
|
62
|
+
else if (isSameDay(to, date)) {
|
|
63
|
+
// adding a dare equal to the end of the range
|
|
64
|
+
range = { from: date, to: min > 0 ? undefined : date };
|
|
65
|
+
}
|
|
66
|
+
else if (isBefore(date, from)) {
|
|
67
|
+
// adding a date before the start of the range
|
|
68
|
+
range = { from: date, to: to };
|
|
69
|
+
}
|
|
70
|
+
else if (isAfter(date, from)) {
|
|
71
|
+
// adding a date after the start of the range
|
|
72
|
+
range = { from, to: date };
|
|
73
|
+
}
|
|
74
|
+
else if (isAfter(date, to)) {
|
|
75
|
+
// adding a date after the end of the range
|
|
76
|
+
range = { from, to: date };
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
throw new Error("Invalid range");
|
|
36
80
|
}
|
|
37
|
-
return { from: date, to };
|
|
38
81
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
82
|
+
// check for min / max
|
|
83
|
+
if (range?.from && range?.to) {
|
|
84
|
+
const diff = dateLib.differenceInCalendarDays(range.to, range.from);
|
|
85
|
+
if (max > 0 && diff > max) {
|
|
86
|
+
range = { from: date, to: undefined };
|
|
42
87
|
}
|
|
43
|
-
if (
|
|
44
|
-
|
|
88
|
+
else if (min > 1 && diff < min) {
|
|
89
|
+
range = { from: date, to: undefined };
|
|
45
90
|
}
|
|
46
|
-
return { from, to: date };
|
|
47
91
|
}
|
|
48
|
-
return
|
|
92
|
+
return range;
|
|
49
93
|
}
|
|
50
94
|
//# sourceMappingURL=addToRange.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addToRange.js","sourceRoot":"","sources":["../../../src/utils/addToRange.ts"],"names":[],"mappings":";;AAWA,
|
|
1
|
+
{"version":3,"file":"addToRange.js","sourceRoot":"","sources":["../../../src/utils/addToRange.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,6 @@ import { addToRange, dateMatchModifiers } from "../utils/index.js";
|
|
|
3
3
|
import { rangeIncludesDate } from "../utils/rangeIncludesDate.js";
|
|
4
4
|
export function useRange(props, dateLib) {
|
|
5
5
|
const { mode, disabled, excludeDisabled, selected: initiallySelected, required, onSelect } = props;
|
|
6
|
-
const { differenceInCalendarDays } = dateLib;
|
|
7
6
|
const [selected, setSelected] = React.useState(initiallySelected);
|
|
8
7
|
// Update the selected date if the required flag is set.
|
|
9
8
|
React.useEffect(() => {
|
|
@@ -17,26 +16,10 @@ export function useRange(props, dateLib) {
|
|
|
17
16
|
}, [initiallySelected]);
|
|
18
17
|
const isSelected = (date) => selected && rangeIncludesDate(selected, date, false, dateLib);
|
|
19
18
|
const select = (triggerDate, modifiers, e) => {
|
|
19
|
+
const { min, max } = props;
|
|
20
20
|
const newRange = triggerDate
|
|
21
|
-
? addToRange(triggerDate, selected, dateLib)
|
|
21
|
+
? addToRange(triggerDate, selected, min, max, required, dateLib)
|
|
22
22
|
: undefined;
|
|
23
|
-
const { min, max } = props;
|
|
24
|
-
if (min) {
|
|
25
|
-
if (newRange?.from &&
|
|
26
|
-
newRange.to &&
|
|
27
|
-
differenceInCalendarDays(newRange.to, newRange.from) < min - 1) {
|
|
28
|
-
newRange.from = triggerDate;
|
|
29
|
-
newRange.to = undefined;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
if (max) {
|
|
33
|
-
if (newRange?.from &&
|
|
34
|
-
newRange.to &&
|
|
35
|
-
differenceInCalendarDays(newRange.to, newRange.from) >= max) {
|
|
36
|
-
newRange.from = triggerDate;
|
|
37
|
-
newRange.to = undefined;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
23
|
if (newRange?.from && newRange.to) {
|
|
41
24
|
let newDate = newRange.from;
|
|
42
25
|
while (dateLib.differenceInCalendarDays(newRange.to, newDate) > 0) {
|
|
@@ -44,6 +27,7 @@ export function useRange(props, dateLib) {
|
|
|
44
27
|
if (excludeDisabled &&
|
|
45
28
|
disabled &&
|
|
46
29
|
dateMatchModifiers(newDate, disabled, dateLib)) {
|
|
30
|
+
// if a disabled days is found, the range is reset
|
|
47
31
|
newRange.from = triggerDate;
|
|
48
32
|
newRange.to = undefined;
|
|
49
33
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRange.js","sourceRoot":"","sources":["../../../src/selection/useRange.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,MAAM,UAAU,QAAQ,CACtB,KAAQ,EACR,OAAgB;IAEhB,MAAM,EACJ,IAAI,EACJ,QAAQ,EACR,eAAe,EACf,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EACR,QAAQ,EACT,GAAG,KAAmB,CAAC;IAExB,MAAM,
|
|
1
|
+
{"version":3,"file":"useRange.js","sourceRoot":"","sources":["../../../src/selection/useRange.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,MAAM,UAAU,QAAQ,CACtB,KAAQ,EACR,OAAgB;IAEhB,MAAM,EACJ,IAAI,EACJ,QAAQ,EACR,eAAe,EACf,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EACR,QAAQ,EACT,GAAG,KAAmB,CAAC;IAExB,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAC5C,iBAAiB,CAClB,CAAC;IAEF,wDAAwD;IACxD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,QAAQ,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACvC,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAE/B,2DAA2D;IAC3D,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,WAAW,CAAC,iBAAiB,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAExB,MAAM,UAAU,GAAG,CAAC,IAAU,EAAE,EAAE,CAChC,QAAQ,IAAI,iBAAiB,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAEhE,MAAM,MAAM,GAAG,CACb,WAAiB,EACjB,SAAoB,EACpB,CAAyC,EACzC,EAAE;QACF,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAmB,CAAC;QACzC,MAAM,QAAQ,GAAG,WAAW;YAC1B,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC;YAChE,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,QAAQ,EAAE,IAAI,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClC,IAAI,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC5B,OAAO,OAAO,CAAC,wBAAwB,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACtC,IACE,eAAe;oBACf,QAAQ;oBACR,kBAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EAC9C,CAAC;oBACD,kDAAkD;oBAClD,QAAQ,CAAC,IAAI,GAAG,WAAW,CAAC;oBAC5B,QAAQ,CAAC,EAAE,GAAG,SAAS,CAAC;oBACxB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtB,QAAQ,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAEhD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO;QACL,QAAQ;QACR,MAAM;QACN,UAAU;KACK,CAAC;AACpB,CAAC"}
|
|
@@ -7,6 +7,10 @@ import type { DateRange, DateLib } from "../types/index.js";
|
|
|
7
7
|
*
|
|
8
8
|
* @group Utilities
|
|
9
9
|
*/
|
|
10
|
-
export declare function addToRange(
|
|
10
|
+
export declare function addToRange(
|
|
11
|
+
/** The date to add to the range. */
|
|
12
|
+
date: Date,
|
|
13
|
+
/** The range where to add `date`. */
|
|
14
|
+
initialRange: DateRange | undefined, min?: number, max?: number, required?: boolean,
|
|
11
15
|
/** @ignore */
|
|
12
|
-
dateLib?: DateLib): DateRange;
|
|
16
|
+
dateLib?: DateLib): DateRange | undefined;
|
|
@@ -7,41 +7,85 @@ import { dateLib as defaultDateLib } from "../lib/index.js";
|
|
|
7
7
|
*
|
|
8
8
|
* @group Utilities
|
|
9
9
|
*/
|
|
10
|
-
export function addToRange(
|
|
10
|
+
export function addToRange(
|
|
11
|
+
/** The date to add to the range. */
|
|
12
|
+
date,
|
|
13
|
+
/** The range where to add `date`. */
|
|
14
|
+
initialRange, min = 0, max = 0, required = false,
|
|
11
15
|
/** @ignore */
|
|
12
16
|
dateLib = defaultDateLib) {
|
|
13
|
-
const { from, to } =
|
|
17
|
+
const { from, to } = initialRange || {};
|
|
14
18
|
const { isSameDay, isAfter, isBefore } = dateLib;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
let range;
|
|
20
|
+
if (!from && !to) {
|
|
21
|
+
// the range is empty, add the date
|
|
22
|
+
range = { from: date, to: min > 0 ? undefined : date };
|
|
23
|
+
}
|
|
24
|
+
else if (from && !to) {
|
|
25
|
+
// adding date to an incomplete range
|
|
22
26
|
if (isSameDay(from, date)) {
|
|
23
|
-
|
|
27
|
+
// adding a date equal to the start of the range
|
|
28
|
+
if (required) {
|
|
29
|
+
range = { from, to: undefined };
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
range = undefined;
|
|
33
|
+
}
|
|
24
34
|
}
|
|
25
|
-
if (
|
|
26
|
-
|
|
35
|
+
else if (isBefore(date, from)) {
|
|
36
|
+
// adding a date before the start of the range
|
|
37
|
+
range = { from: date, to: from };
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// adding a date after the start of the range
|
|
41
|
+
range = { from, to: date };
|
|
27
42
|
}
|
|
28
|
-
return { from, to: date };
|
|
29
43
|
}
|
|
30
|
-
if (to) {
|
|
31
|
-
|
|
32
|
-
|
|
44
|
+
else if (from && to) {
|
|
45
|
+
// adding date to a complete range
|
|
46
|
+
if (isSameDay(from, date) && isSameDay(to, date)) {
|
|
47
|
+
// adding a date that is equal to both start and end of the range
|
|
48
|
+
if (required) {
|
|
49
|
+
range = { from, to };
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
range = undefined;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else if (isSameDay(from, date)) {
|
|
56
|
+
// adding a date equal to the the start of the range
|
|
57
|
+
range = { from, to: min > 0 ? undefined : date };
|
|
58
|
+
}
|
|
59
|
+
else if (isSameDay(to, date)) {
|
|
60
|
+
// adding a dare equal to the end of the range
|
|
61
|
+
range = { from: date, to: min > 0 ? undefined : date };
|
|
62
|
+
}
|
|
63
|
+
else if (isBefore(date, from)) {
|
|
64
|
+
// adding a date before the start of the range
|
|
65
|
+
range = { from: date, to: to };
|
|
66
|
+
}
|
|
67
|
+
else if (isAfter(date, from)) {
|
|
68
|
+
// adding a date after the start of the range
|
|
69
|
+
range = { from, to: date };
|
|
70
|
+
}
|
|
71
|
+
else if (isAfter(date, to)) {
|
|
72
|
+
// adding a date after the end of the range
|
|
73
|
+
range = { from, to: date };
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
throw new Error("Invalid range");
|
|
33
77
|
}
|
|
34
|
-
return { from: date, to };
|
|
35
78
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
79
|
+
// check for min / max
|
|
80
|
+
if (range?.from && range?.to) {
|
|
81
|
+
const diff = dateLib.differenceInCalendarDays(range.to, range.from);
|
|
82
|
+
if (max > 0 && diff > max) {
|
|
83
|
+
range = { from: date, to: undefined };
|
|
39
84
|
}
|
|
40
|
-
if (
|
|
41
|
-
|
|
85
|
+
else if (min > 1 && diff < min) {
|
|
86
|
+
range = { from: date, to: undefined };
|
|
42
87
|
}
|
|
43
|
-
return { from, to: date };
|
|
44
88
|
}
|
|
45
|
-
return
|
|
89
|
+
return range;
|
|
46
90
|
}
|
|
47
91
|
//# sourceMappingURL=addToRange.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addToRange.js","sourceRoot":"","sources":["../../../src/utils/addToRange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAG5D;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,
|
|
1
|
+
{"version":3,"file":"addToRange.js","sourceRoot":"","sources":["../../../src/utils/addToRange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAG5D;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU;AACxB,oCAAoC;AACpC,IAAU;AACV,qCAAqC;AACrC,YAAmC,EACnC,GAAG,GAAG,CAAC,EACP,GAAG,GAAG,CAAC,EACP,QAAQ,GAAG,KAAK;AAChB,cAAc;AACd,UAAmB,cAAc;IAEjC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,YAAY,IAAI,EAAE,CAAC;IACxC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAEjD,IAAI,KAA4B,CAAC;IAEjC,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QACjB,mCAAmC;QACnC,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,CAAC;SAAM,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QACvB,qCAAqC;QACrC,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YAC1B,gDAAgD;YAChD,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,SAAS,CAAC;YACpB,CAAC;QACH,CAAC;aAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YAChC,8CAA8C;YAC9C,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,6CAA6C;YAC7C,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;QACtB,kCAAkC;QAClC,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;YACjD,iEAAiE;YACjE,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,SAAS,CAAC;YACpB,CAAC;QACH,CAAC;aAAM,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACjC,oDAAoD;YACpD,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACnD,CAAC;aAAM,IAAI,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;YAC/B,8CAA8C;YAC9C,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,CAAC;aAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YAChC,8CAA8C;YAC9C,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QACjC,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YAC/B,6CAA6C;YAC7C,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;YAC7B,2CAA2C;YAC3C,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,EAAE,EAAE,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;YAC1B,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;QACxC,CAAC;aAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;YACjC,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;QACxC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -8,6 +8,11 @@ import { user } from "@/test/user";
|
|
|
8
8
|
|
|
9
9
|
import { RangeMinMax } from "./RangeMinMax";
|
|
10
10
|
|
|
11
|
+
const today = new Date(2022, 8, 12);
|
|
12
|
+
|
|
13
|
+
beforeAll(() => jest.setSystemTime(today));
|
|
14
|
+
afterAll(() => jest.useRealTimers());
|
|
15
|
+
|
|
11
16
|
beforeEach(() => render(<RangeMinMax />));
|
|
12
17
|
|
|
13
18
|
describe("when a day is clicked", () => {
|
|
@@ -18,22 +23,6 @@ describe("when a day is clicked", () => {
|
|
|
18
23
|
test("should be selected", () => {
|
|
19
24
|
expect(gridcell(firstDay, true)).toHaveAttribute("aria-selected", "true");
|
|
20
25
|
});
|
|
21
|
-
describe("when the day before min is clicked", () => {
|
|
22
|
-
const dayAfter = addDays(firstDay, 1);
|
|
23
|
-
beforeEach(async () => {
|
|
24
|
-
await user.click(dateButton(dayAfter));
|
|
25
|
-
});
|
|
26
|
-
test("the first day should not be selected", () => {
|
|
27
|
-
expect(gridcell(firstDay, true)).not.toHaveAttribute(
|
|
28
|
-
"aria-selected",
|
|
29
|
-
"true"
|
|
30
|
-
);
|
|
31
|
-
});
|
|
32
|
-
test("the day after should be selected", () => {
|
|
33
|
-
expect(gridcell(dayAfter, true)).toHaveAttribute("aria-selected", "true");
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
|
|
37
26
|
describe("when the day after min is clicked", () => {
|
|
38
27
|
const dayAfter = addDays(firstDay, 4);
|
|
39
28
|
beforeEach(async () => {
|
package/examples/RangeMinMax.tsx
CHANGED
|
@@ -9,20 +9,19 @@ export function RangeMinMax() {
|
|
|
9
9
|
let footer = `Please pick the first day.`;
|
|
10
10
|
if (range?.from) {
|
|
11
11
|
if (!range.to) {
|
|
12
|
-
footer = format(range.from, "PPP")
|
|
12
|
+
footer = `${format(range.from, "PPP")}—`;
|
|
13
13
|
} else if (range.to) {
|
|
14
|
-
footer = `${format(range.from, "PPP")}
|
|
14
|
+
footer = `${format(range.from, "PPP")}—${format(range.to, "PPP")}`;
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
return (
|
|
19
19
|
<div>
|
|
20
|
-
<p>Select
|
|
20
|
+
<p>Select up to 6 nights.</p>
|
|
21
21
|
<DayPicker
|
|
22
|
-
defaultMonth={new Date(2022, 8)}
|
|
23
22
|
mode="range"
|
|
24
|
-
min={
|
|
25
|
-
max={
|
|
23
|
+
min={1}
|
|
24
|
+
max={6}
|
|
26
25
|
selected={range}
|
|
27
26
|
onSelect={setRange}
|
|
28
27
|
footer={footer}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
|
|
3
|
+
import { addDays, format, startOfMonth } from "date-fns";
|
|
4
|
+
import { DateRange, DayPicker } from "react-day-picker";
|
|
5
|
+
|
|
6
|
+
export function RangeRequired() {
|
|
7
|
+
const [range, setRange] = useState<DateRange>({
|
|
8
|
+
from: startOfMonth(new Date()),
|
|
9
|
+
to: addDays(startOfMonth(new Date()), 4)
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
let footer = `Please pick the first day.`;
|
|
13
|
+
if (range?.from) {
|
|
14
|
+
if (!range.to) {
|
|
15
|
+
footer = `${format(range.from, "PPP")}—`;
|
|
16
|
+
} else if (range.to) {
|
|
17
|
+
footer = `${format(range.from, "PPP")}—${format(range.to, "PPP")}`;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<DayPicker
|
|
23
|
+
mode="range"
|
|
24
|
+
required
|
|
25
|
+
selected={range}
|
|
26
|
+
onSelect={setRange}
|
|
27
|
+
footer={footer}
|
|
28
|
+
/>
|
|
29
|
+
);
|
|
30
|
+
}
|
|
@@ -13,9 +13,7 @@ function DayWithShiftKey(props: DayButtonProps) {
|
|
|
13
13
|
|
|
14
14
|
const handleClick: MouseEventHandler<HTMLButtonElement> = (e) => {
|
|
15
15
|
const requireShiftKey =
|
|
16
|
-
selected?.from &&
|
|
17
|
-
!selected.to &&
|
|
18
|
-
!isSameDay(props.day.date, selected.from);
|
|
16
|
+
selected?.from && !isSameDay(props.day.date, selected.from);
|
|
19
17
|
|
|
20
18
|
if (!e.shiftKey && requireShiftKey) {
|
|
21
19
|
return;
|
package/examples/index.ts
CHANGED
|
@@ -38,6 +38,7 @@ export * from "./ModifiersStyle";
|
|
|
38
38
|
export * from "./ModifiersToday";
|
|
39
39
|
export * from "./Multiple";
|
|
40
40
|
export * from "./MultipleMinMax";
|
|
41
|
+
export * from "./MultipleRequired";
|
|
41
42
|
export * from "./MultipleMonths";
|
|
42
43
|
export * from "./MultipleMonthsPaged";
|
|
43
44
|
export * from "./NumberingSystem";
|
|
@@ -45,6 +46,7 @@ export * from "./OutsideDays";
|
|
|
45
46
|
export * from "./Range";
|
|
46
47
|
export * from "./RangeExcludeDisabled";
|
|
47
48
|
export * from "./RangeMinMax";
|
|
49
|
+
export * from "./RangeRequired";
|
|
48
50
|
export * from "./RangeShiftKey";
|
|
49
51
|
export * from "./Rtl";
|
|
50
52
|
export * from "./Single";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-day-picker",
|
|
3
|
-
"version": "9.0.
|
|
3
|
+
"version": "9.0.5",
|
|
4
4
|
"description": "Customizable Date Picker for React",
|
|
5
5
|
"author": "Giampaolo Bellavite <io@gpbl.dev>",
|
|
6
6
|
"homepage": "https://daypicker.dev",
|
|
@@ -144,7 +144,7 @@
|
|
|
144
144
|
"@types/node": "^20.14.10",
|
|
145
145
|
"@types/react": "^18.3.3",
|
|
146
146
|
"@types/react-dom": "^18.3.0",
|
|
147
|
-
"@typescript-eslint/eslint-plugin": "^7.
|
|
147
|
+
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
|
148
148
|
"@typescript-eslint/parser": "^7.16.0",
|
|
149
149
|
"date-fns": "^3.6.0",
|
|
150
150
|
"date-fns-jalali": "3.6.0-1",
|
|
@@ -169,7 +169,7 @@
|
|
|
169
169
|
"ts-jest": "^29.2.3",
|
|
170
170
|
"ts-node": "^10.9.2",
|
|
171
171
|
"tslib": "^2.6.3",
|
|
172
|
-
"typescript": "~5.5.
|
|
172
|
+
"typescript": "~5.5.4",
|
|
173
173
|
"typescript-css-modules": "^1.0.4"
|
|
174
174
|
},
|
|
175
175
|
"peerDependencies": {
|
|
@@ -90,7 +90,7 @@ describe("useRange", () => {
|
|
|
90
90
|
|
|
91
91
|
expect(result.current.selected).toEqual({
|
|
92
92
|
from: new Date(2023, 6, 10),
|
|
93
|
-
to:
|
|
93
|
+
to: new Date(2023, 6, 10)
|
|
94
94
|
});
|
|
95
95
|
});
|
|
96
96
|
|
|
@@ -135,7 +135,7 @@ describe("useRange", () => {
|
|
|
135
135
|
|
|
136
136
|
expect(result.current.selected).toEqual({
|
|
137
137
|
from: new Date(2023, 6, 10),
|
|
138
|
-
to:
|
|
138
|
+
to: new Date(2023, 6, 10)
|
|
139
139
|
});
|
|
140
140
|
});
|
|
141
141
|
});
|
|
@@ -24,7 +24,6 @@ export function useRange<T extends DayPickerProps>(
|
|
|
24
24
|
onSelect
|
|
25
25
|
} = props as PropsRange;
|
|
26
26
|
|
|
27
|
-
const { differenceInCalendarDays } = dateLib;
|
|
28
27
|
const [selected, setSelected] = React.useState<DateRange | undefined>(
|
|
29
28
|
initiallySelected
|
|
30
29
|
);
|
|
@@ -49,32 +48,10 @@ export function useRange<T extends DayPickerProps>(
|
|
|
49
48
|
modifiers: Modifiers,
|
|
50
49
|
e: React.MouseEvent | React.KeyboardEvent
|
|
51
50
|
) => {
|
|
51
|
+
const { min, max } = props as PropsRange;
|
|
52
52
|
const newRange = triggerDate
|
|
53
|
-
? addToRange(triggerDate, selected, dateLib)
|
|
53
|
+
? addToRange(triggerDate, selected, min, max, required, dateLib)
|
|
54
54
|
: undefined;
|
|
55
|
-
const { min, max } = props as PropsRange;
|
|
56
|
-
|
|
57
|
-
if (min) {
|
|
58
|
-
if (
|
|
59
|
-
newRange?.from &&
|
|
60
|
-
newRange.to &&
|
|
61
|
-
differenceInCalendarDays(newRange.to, newRange.from) < min - 1
|
|
62
|
-
) {
|
|
63
|
-
newRange.from = triggerDate;
|
|
64
|
-
newRange.to = undefined;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (max) {
|
|
69
|
-
if (
|
|
70
|
-
newRange?.from &&
|
|
71
|
-
newRange.to &&
|
|
72
|
-
differenceInCalendarDays(newRange.to, newRange.from) >= max
|
|
73
|
-
) {
|
|
74
|
-
newRange.from = triggerDate;
|
|
75
|
-
newRange.to = undefined;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
55
|
|
|
79
56
|
if (newRange?.from && newRange.to) {
|
|
80
57
|
let newDate = newRange.from;
|
|
@@ -85,6 +62,7 @@ export function useRange<T extends DayPickerProps>(
|
|
|
85
62
|
disabled &&
|
|
86
63
|
dateMatchModifiers(newDate, disabled, dateLib)
|
|
87
64
|
) {
|
|
65
|
+
// if a disabled days is found, the range is reset
|
|
88
66
|
newRange.from = triggerDate;
|
|
89
67
|
newRange.to = undefined;
|
|
90
68
|
break;
|