@synerise/ds-date-range-picker 2.0.1 → 2.0.3
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/CHANGELOG.md +8 -0
- package/CLAUDE.md +2 -1
- package/dist/RangeFilter/Shared/TimeWindow/RangeFormContainer/RangeForm/RangeForm.styles.js +1 -1
- package/dist/RangePicker/RangePicker.js +11 -40
- package/dist/RangePicker/utils.d.ts +2 -2
- package/dist/RangePicker/utils.js +13 -8
- package/package.json +21 -21
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [2.0.3](https://github.com/Synerise/synerise-design/compare/@synerise/ds-date-range-picker@2.0.2...@synerise/ds-date-range-picker@2.0.3) (2026-09-07)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @synerise/ds-date-range-picker
|
|
9
|
+
|
|
10
|
+
## [2.0.2](https://github.com/Synerise/synerise-design/compare/@synerise/ds-date-range-picker@2.0.1...@synerise/ds-date-range-picker@2.0.2) (2026-09-02)
|
|
11
|
+
|
|
12
|
+
**Note:** Version bump only for package @synerise/ds-date-range-picker
|
|
13
|
+
|
|
6
14
|
## [2.0.1](https://github.com/Synerise/synerise-design/compare/@synerise/ds-date-range-picker@2.0.0...@synerise/ds-date-range-picker@2.0.1) (2026-09-01)
|
|
7
15
|
|
|
8
16
|
**Note:** Version bump only for package @synerise/ds-date-range-picker
|
package/CLAUDE.md
CHANGED
|
@@ -196,7 +196,7 @@ Addons (relative picker, filter) appear below the calendar and are toggled via `
|
|
|
196
196
|
|
|
197
197
|
## Key dependencies
|
|
198
198
|
|
|
199
|
-
- `react-day-picker ^
|
|
199
|
+
- `react-day-picker ^10` — calendar grid rendering inside `RangePicker` (see the v10 notes in `ds-date-picker`'s CLAUDE.md; day cells now contain a `<button class="DayPicker-Day-Button">`)
|
|
200
200
|
- `@synerise/ds-popover` — floating popover (floating-ui underneath)
|
|
201
201
|
- `date-fns ^2` + `date-fns-tz 1.1.4` — date arithmetic and timezone support
|
|
202
202
|
- `dayjs ^1.8` — used in parts of `RangeFilter`
|
|
@@ -210,6 +210,7 @@ Addons (relative picker, filter) appear below the calendar and are toggled via `
|
|
|
210
210
|
- `valueTransformer` is applied inside `RawDateRangePicker` before calling `onApply` — default transformer strips `ALL_TIME`-specific props.
|
|
211
211
|
- `forceAbsolute` converts relative `DateRange` values to absolute bounds before emitting — useful when downstream systems don't understand relative types.
|
|
212
212
|
- `RangePicker` (absolute calendar) is a class-based `PureComponent` — avoid passing new function references on every render to prevent unnecessary re-renders.
|
|
213
|
+
- `getModifiers()` in `RangePicker/utils.ts` returns react-day-picker `Matcher`s keyed by modifier name; each key becomes a `DayPicker-Day--<key>` class. It normalises the `Date | string | null` range bounds to `Date`, which the v7 code did with casts.
|
|
213
214
|
- `RelativeRangePicker` is also a class-based `PureComponent`.
|
|
214
215
|
- The `SINCE` mode is a variant of relative dating anchored to a specific timestamp rather than "now".
|
|
215
216
|
- `normalizeRange()` from `utils` converts relative ranges to absolute `Date` objects — used internally and safe to call from consuming code.
|
|
@@ -10,7 +10,7 @@ const Container = /* @__PURE__ */ styled.div.withConfig({
|
|
|
10
10
|
const Row = /* @__PURE__ */ styled.div.withConfig({
|
|
11
11
|
displayName: "RangeFormstyles__Row",
|
|
12
12
|
componentId: "sc-4k3o5r-2"
|
|
13
|
-
})(["width:100%;display:flex;justify-content:", ";min-height:32px;margin:8px 0;", " .ant-slider{width:100%;margin:24px 8px 8px;}
|
|
13
|
+
})(["width:100%;display:flex;justify-content:", ";min-height:32px;margin:8px 0;", " .ant-slider{width:100%;margin:24px 8px 8px;}"], (props) => props.justifyContent, (props) => props.mode === "slider" && css(["&{column-gap:8px;margin-top:16px;", "{margin-top:14px;}}"], RemoveIconWrapper));
|
|
14
14
|
const Separator = /* @__PURE__ */ styled.span.withConfig({
|
|
15
15
|
displayName: "RangeFormstyles__Separator",
|
|
16
16
|
componentId: "sc-4k3o5r-3"
|
|
@@ -2,7 +2,6 @@ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import fnsIsSameDay from "date-fns/isSameDay";
|
|
3
3
|
import fnsIsValid from "date-fns/isValid";
|
|
4
4
|
import { PureComponent } from "react";
|
|
5
|
-
import { DateUtils } from "react-day-picker";
|
|
6
5
|
import { legacyParse } from "@date-fns/upgrade/v2";
|
|
7
6
|
import { withDataFormat, getDefaultDataTimeOptions } from "@synerise/ds-core";
|
|
8
7
|
import { YearPicker, MonthPicker, fnsDifferenceInYears, DayPicker, localeUtils, TimePicker, datePickerFormat } from "@synerise/ds-date-picker";
|
|
@@ -25,7 +24,7 @@ import "date-fns/endOfMonth";
|
|
|
25
24
|
import "date-fns/format";
|
|
26
25
|
import "date-fns/getYear";
|
|
27
26
|
import fnsIsAfter from "date-fns/isAfter";
|
|
28
|
-
import "date-fns/isBefore";
|
|
27
|
+
import fnsIsBefore from "date-fns/isBefore";
|
|
29
28
|
import fnsIsSameMonth from "date-fns/isSameMonth";
|
|
30
29
|
import "date-fns/isSameYear";
|
|
31
30
|
import "date-fns/setDate";
|
|
@@ -35,6 +34,7 @@ import fnsStartOfDay from "date-fns/startOfDay";
|
|
|
35
34
|
import "date-fns/startOfMonth";
|
|
36
35
|
import { Sides, Side, PickerFooter, FooterSeparator, DateTimeModeSwitch } from "./RangePicker.styles.js";
|
|
37
36
|
import { getModifiers, getDisabledTimeOptions, getSidesState } from "./utils.js";
|
|
37
|
+
const isDayBefore = (day, reference) => fnsIsBefore(fnsStartOfDay(day), fnsStartOfDay(reference));
|
|
38
38
|
const NOOP = () => {
|
|
39
39
|
};
|
|
40
40
|
const TOOLTIP_FORMAT = "MMM d, yyyy, HH:mm";
|
|
@@ -51,10 +51,10 @@ function replaceRange(value, day) {
|
|
|
51
51
|
}
|
|
52
52
|
if (!from) {
|
|
53
53
|
from = day;
|
|
54
|
-
} else if (from && to &&
|
|
54
|
+
} else if (from && to && fnsIsSameDay(from, to) && fnsIsSameDay(day, from)) {
|
|
55
55
|
from = null;
|
|
56
56
|
to = null;
|
|
57
|
-
} else if (to &&
|
|
57
|
+
} else if (to && fnsIsSameDay(day, to)) {
|
|
58
58
|
from = day;
|
|
59
59
|
to = day;
|
|
60
60
|
} else if (from && to) {
|
|
@@ -62,7 +62,7 @@ function replaceRange(value, day) {
|
|
|
62
62
|
to = null;
|
|
63
63
|
} else {
|
|
64
64
|
to = day;
|
|
65
|
-
if (
|
|
65
|
+
if (isDayBefore(to, from)) {
|
|
66
66
|
to = from;
|
|
67
67
|
from = day;
|
|
68
68
|
}
|
|
@@ -229,7 +229,7 @@ class RangePicker extends PureComponent {
|
|
|
229
229
|
} = value;
|
|
230
230
|
const rangeFrom = from ? legacyParse(from) : null;
|
|
231
231
|
const rangeTo = to ? legacyParse(to) : null;
|
|
232
|
-
const isSelectedRangeDay = !!rangeFrom && !!rangeTo && fnsIsValid(rangeFrom) && fnsIsValid(rangeTo) && !
|
|
232
|
+
const isSelectedRangeDay = !!rangeFrom && !!rangeTo && fnsIsValid(rangeFrom) && fnsIsValid(rangeTo) && !isDayBefore(day, rangeFrom) && !isDayBefore(rangeTo, day);
|
|
233
233
|
const dayForeground = /* @__PURE__ */ jsx(DayForeground, { className: "DayPicker-Day-FG" });
|
|
234
234
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
235
235
|
/* @__PURE__ */ jsx(DayBackground, { className: "DayPicker-Day-BG" }),
|
|
@@ -273,44 +273,15 @@ class RangePicker extends PureComponent {
|
|
|
273
273
|
type
|
|
274
274
|
} = value;
|
|
275
275
|
const modifiers = getModifiers(fnsIsValid(from) ? from : null, fnsIsValid(to) ? to : null, enteredTo);
|
|
276
|
-
const selectedDays = fnsIsValid(from) && fnsIsValid(to) ? [from, {
|
|
277
|
-
from,
|
|
278
|
-
to
|
|
279
|
-
}] : [
|
|
280
|
-
from: void 0,
|
|
281
|
-
to: void 0
|
|
282
|
-
}];
|
|
276
|
+
const selectedDays = fnsIsValid(from) && fnsIsValid(to) ? [legacyParse(from), {
|
|
277
|
+
from: legacyParse(from),
|
|
278
|
+
to: legacyParse(to)
|
|
279
|
+
}] : [];
|
|
283
280
|
const parsedLeft = legacyParse(left.month);
|
|
284
281
|
const parsedRight = legacyParse(right.month);
|
|
285
282
|
const adjacentMonths = forceAdjacentMonths || fnsIsSameMonth(ADD.MONTHS(parsedLeft, 1), parsedRight);
|
|
286
283
|
const adjacentYears = forceAdjacentMonths || fnsDifferenceInYears(ADD.MONTHS(parsedLeft, 1), parsedRight) === 0;
|
|
287
|
-
return /* @__PURE__ */ jsx(
|
|
288
|
-
DayPicker,
|
|
289
|
-
{
|
|
290
|
-
className: type.toLowerCase(),
|
|
291
|
-
canChangeMonth: false,
|
|
292
|
-
disabledDays: disabledDate,
|
|
293
|
-
localeUtils,
|
|
294
|
-
month: getDateFromString(sideState.month),
|
|
295
|
-
title: sideState.monthTitle,
|
|
296
|
-
hideLongNext: side === COLUMNS.LEFT && adjacentYears,
|
|
297
|
-
hideShortNext: side === COLUMNS.LEFT && adjacentMonths,
|
|
298
|
-
hideLongPrev: side === COLUMNS.RIGHT && adjacentYears,
|
|
299
|
-
hideShortPrev: side === COLUMNS.RIGHT && adjacentMonths,
|
|
300
|
-
renderDay: this.renderDay,
|
|
301
|
-
onDayMouseEnter: this.handleDayMouseEnter,
|
|
302
|
-
onDayMouseLeave: this.handleDayMouseLeave,
|
|
303
|
-
onMonthNameClick: () => this.handleSideModeChange(side, "month"),
|
|
304
|
-
onYearNameClick: () => this.handleSideModeChange(side, "year"),
|
|
305
|
-
onMonthChange: (month) => this.handleSideMonthChange(side, month, "date"),
|
|
306
|
-
fixedWeeks: true,
|
|
307
|
-
showOutsideDay: true,
|
|
308
|
-
modifiers,
|
|
309
|
-
onDayClick: this.handleDayClick,
|
|
310
|
-
selectedDays
|
|
311
|
-
},
|
|
312
|
-
`day_picker_${side}`
|
|
313
|
-
);
|
|
284
|
+
return /* @__PURE__ */ jsx(DayPicker, { className: type.toLowerCase(), canChangeMonth: false, disabledDays: disabledDate, localeUtils, month: getDateFromString(sideState.month), title: sideState.monthTitle, hideLongNext: side === COLUMNS.LEFT && adjacentYears, hideShortNext: side === COLUMNS.LEFT && adjacentMonths, hideLongPrev: side === COLUMNS.RIGHT && adjacentYears, hideShortPrev: side === COLUMNS.RIGHT && adjacentMonths, renderDay: this.renderDay, onDayMouseEnter: this.handleDayMouseEnter, onDayMouseLeave: this.handleDayMouseLeave, onMonthNameClick: () => this.handleSideModeChange(side, "month"), onYearNameClick: () => this.handleSideModeChange(side, "year"), onMonthChange: (month) => this.handleSideMonthChange(side, month, "date"), fixedWeeks: true, showOutsideDays: true, modifiers, onDayClick: this.handleDayClick, selectedDays }, `day_picker_${side}`);
|
|
314
285
|
};
|
|
315
286
|
this.renderTimePicker = (side) => {
|
|
316
287
|
const {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Matcher } from 'react-day-picker';
|
|
2
2
|
import { DateRange, NullableDateLimit } from '../date.types';
|
|
3
3
|
import { State } from './RangePicker.types';
|
|
4
4
|
export declare const getDisabledTimeOptions: (initialDay: string | Date | undefined, granularity: string, initialLowerLimit?: NullableDateLimit, initialUpperLimit?: NullableDateLimit, is12HoursClock?: boolean) => number[];
|
|
5
5
|
export declare const getSidesState: (value: DateRange, forceAdjacentMonths?: boolean) => State;
|
|
6
|
-
export declare const getModifiers: (from: NullableDateLimit | undefined, to: NullableDateLimit | undefined, enteredTo: NullableDateLimit | undefined) =>
|
|
6
|
+
export declare const getModifiers: (from: NullableDateLimit | undefined, to: NullableDateLimit | undefined, enteredTo: NullableDateLimit | undefined) => Record<string, Matcher | undefined>;
|
|
@@ -122,6 +122,12 @@ const getSidesState = (value, forceAdjacentMonths) => {
|
|
|
122
122
|
}
|
|
123
123
|
};
|
|
124
124
|
};
|
|
125
|
+
const toDate = (value) => {
|
|
126
|
+
if (value === null || value === void 0) {
|
|
127
|
+
return void 0;
|
|
128
|
+
}
|
|
129
|
+
return value instanceof Date ? value : legacyParse(value);
|
|
130
|
+
};
|
|
125
131
|
const getModifiers = (from, to, enteredTo) => {
|
|
126
132
|
const isSelecting = from && !to && enteredTo;
|
|
127
133
|
const enteredStart = isSelecting ? fnsMin([legacyParse(from), legacyParse(enteredTo)]) : enteredTo;
|
|
@@ -133,15 +139,14 @@ const getModifiers = (from, to, enteredTo) => {
|
|
|
133
139
|
const startModifier = isSelecting && !!enteredTo && !!from && enteredTo < from ? void 0 : from;
|
|
134
140
|
const endModifier = isSelecting && !!enteredTo && !!from && enteredTo < from ? from : to;
|
|
135
141
|
return {
|
|
136
|
-
start: startModifier,
|
|
137
|
-
end: endModifier,
|
|
138
|
-
entered,
|
|
139
|
-
outside: void 0,
|
|
142
|
+
start: toDate(startModifier),
|
|
143
|
+
end: toDate(endModifier),
|
|
144
|
+
entered: typeof entered === "function" ? entered : toDate(entered),
|
|
140
145
|
today: NOW,
|
|
141
|
-
"entered-start": enteredStart,
|
|
142
|
-
"entered-end": enteredEnd,
|
|
143
|
-
"initial-entered": !endModifier ? startModifier : void 0,
|
|
144
|
-
initial: !entered && !endModifier ? startModifier : void 0
|
|
146
|
+
"entered-start": toDate(enteredStart),
|
|
147
|
+
"entered-end": toDate(enteredEnd),
|
|
148
|
+
"initial-entered": !endModifier ? toDate(startModifier) : void 0,
|
|
149
|
+
initial: !entered && !endModifier ? toDate(startModifier) : void 0
|
|
145
150
|
};
|
|
146
151
|
};
|
|
147
152
|
export {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@synerise/ds-date-range-picker",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.3",
|
|
4
4
|
"description": "Date-Range-Picker UI Component for the Synerise Design System",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"repository": "Synerise/synerise-design",
|
|
@@ -43,25 +43,25 @@
|
|
|
43
43
|
"types": "dist/index.d.ts",
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@date-fns/upgrade": "^1.0.3",
|
|
46
|
-
"@synerise/ds-badge": "^2.0.
|
|
47
|
-
"@synerise/ds-button": "^2.0.
|
|
48
|
-
"@synerise/ds-button-group": "^2.0.
|
|
49
|
-
"@synerise/ds-date-picker": "^2.0.
|
|
50
|
-
"@synerise/ds-dropdown": "^2.0.
|
|
51
|
-
"@synerise/ds-form-field": "^2.0.
|
|
52
|
-
"@synerise/ds-icon": "^2.
|
|
53
|
-
"@synerise/ds-inline-edit": "^2.0.
|
|
54
|
-
"@synerise/ds-input": "^2.0.
|
|
55
|
-
"@synerise/ds-input-number": "^2.0.
|
|
56
|
-
"@synerise/ds-list-item": "^2.0.
|
|
57
|
-
"@synerise/ds-manageable-list": "^2.0.
|
|
46
|
+
"@synerise/ds-badge": "^2.0.1",
|
|
47
|
+
"@synerise/ds-button": "^2.0.1",
|
|
48
|
+
"@synerise/ds-button-group": "^2.0.1",
|
|
49
|
+
"@synerise/ds-date-picker": "^2.0.2",
|
|
50
|
+
"@synerise/ds-dropdown": "^2.0.2",
|
|
51
|
+
"@synerise/ds-form-field": "^2.0.1",
|
|
52
|
+
"@synerise/ds-icon": "^2.1.0",
|
|
53
|
+
"@synerise/ds-inline-edit": "^2.0.2",
|
|
54
|
+
"@synerise/ds-input": "^2.0.2",
|
|
55
|
+
"@synerise/ds-input-number": "^2.0.2",
|
|
56
|
+
"@synerise/ds-list-item": "^2.0.1",
|
|
57
|
+
"@synerise/ds-manageable-list": "^2.0.2",
|
|
58
58
|
"@synerise/ds-popover": "^2.0.0",
|
|
59
|
-
"@synerise/ds-scrollbar": "^2.0.
|
|
60
|
-
"@synerise/ds-select": "^2.0.
|
|
61
|
-
"@synerise/ds-slider": "^2.0.
|
|
62
|
-
"@synerise/ds-tag": "^2.0.
|
|
63
|
-
"@synerise/ds-time-picker": "^2.0.
|
|
64
|
-
"@synerise/ds-tooltip": "^2.0.
|
|
59
|
+
"@synerise/ds-scrollbar": "^2.0.1",
|
|
60
|
+
"@synerise/ds-select": "^2.0.3",
|
|
61
|
+
"@synerise/ds-slider": "^2.0.1",
|
|
62
|
+
"@synerise/ds-tag": "^2.0.1",
|
|
63
|
+
"@synerise/ds-time-picker": "^2.0.2",
|
|
64
|
+
"@synerise/ds-tooltip": "^2.0.1",
|
|
65
65
|
"@synerise/ds-utils": "^2.0.0",
|
|
66
66
|
"date-fns": "^2.16.1",
|
|
67
67
|
"date-fns-tz": "1.1.4",
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"lodash.reverse": "^4.0.1",
|
|
79
79
|
"lodash.values": "^4.3.0",
|
|
80
80
|
"ramda": "^0.27.0",
|
|
81
|
-
"react-day-picker": "^
|
|
81
|
+
"react-day-picker": "^10.0.1",
|
|
82
82
|
"uuid": "^8.3.2"
|
|
83
83
|
},
|
|
84
84
|
"devDependencies": {
|
|
@@ -102,5 +102,5 @@
|
|
|
102
102
|
"react-intl": ">=3.12.0 <= 6.8",
|
|
103
103
|
"styled-components": "^5.3.3"
|
|
104
104
|
},
|
|
105
|
-
"gitHead": "
|
|
105
|
+
"gitHead": "788eba77544b291f7e938864a3994df4b4d904e2"
|
|
106
106
|
}
|