@synerise/ds-date-range-picker 0.17.3 → 0.17.4

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 (28) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/DateRangePicker.js +12 -10
  3. package/dist/DateRangePicker.types.d.ts +14 -1
  4. package/dist/DateRangePicker.types.js +2 -1
  5. package/dist/Footer/Footer.js +4 -3
  6. package/dist/Footer/Footer.types.d.ts +1 -1
  7. package/dist/RangePicker/RangePicker.d.ts +1 -1
  8. package/dist/RangePicker/RangePicker.js +44 -7
  9. package/dist/RangePicker/RangePicker.types.d.ts +6 -1
  10. package/dist/RangePickerInput/RangePickerInput.d.ts +2 -2
  11. package/dist/RangePickerInput/RangePickerInput.js +15 -5
  12. package/dist/RangePickerInput/RangePickerInput.types.d.ts +6 -1
  13. package/dist/RawDateRangePicker.d.ts +8 -6
  14. package/dist/RawDateRangePicker.js +120 -47
  15. package/dist/RelativeRangePicker/Elements/RangeDropdown/RangeDropdown.d.ts +10 -2
  16. package/dist/RelativeRangePicker/Elements/RangeDropdown/RangeDropdown.js +35 -2
  17. package/dist/RelativeRangePicker/Elements/RangeDropdown/RangeDropdown.types.d.ts +7 -2
  18. package/dist/RelativeRangePicker/Elements/TimestampRange/TimestampRange.d.ts +1 -1
  19. package/dist/RelativeRangePicker/Elements/TimestampRange/TimestampRange.js +45 -11
  20. package/dist/RelativeRangePicker/Elements/TimestampRange/TimestampRange.types.d.ts +6 -1
  21. package/dist/RelativeRangePicker/RelativeRangePicker.d.ts +2 -3
  22. package/dist/RelativeRangePicker/RelativeRangePicker.js +19 -11
  23. package/dist/RelativeRangePicker/RelativeRangePicker.types.d.ts +7 -2
  24. package/dist/constants.d.ts +3 -3
  25. package/dist/date.types.d.ts +3 -1
  26. package/dist/utils.d.ts +3 -0
  27. package/dist/utils.js +17 -4
  28. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -3,6 +3,17 @@
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
+ ## [0.17.4](https://github.com/Synerise/synerise-design/compare/@synerise/ds-date-range-picker@0.17.3...@synerise/ds-date-range-picker@0.17.4) (2022-10-14)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **date-range-picker:** lifetime, onApply fixes, refactor, custom-day ([735b4b4](https://github.com/Synerise/synerise-design/commit/735b4b4b6375ed083e60831f641126346d63f14f))
12
+
13
+
14
+
15
+
16
+
6
17
  ## [0.17.3](https://github.com/Synerise/synerise-design/compare/@synerise/ds-date-range-picker@0.17.2...@synerise/ds-date-range-picker@0.17.3) (2022-10-11)
7
18
 
8
19
  **Note:** Version bump only for package @synerise/ds-date-range-picker
@@ -19,7 +19,6 @@ var DateRangePicker = function DateRangePicker(props) {
19
19
  var value = props.value,
20
20
  onApply = props.onApply,
21
21
  showTime = props.showTime,
22
- onValueChange = props.onValueChange,
23
22
  texts = props.texts,
24
23
  popoverTrigger = props.popoverTrigger,
25
24
  forceAdjacentMonths = props.forceAdjacentMonths,
@@ -27,7 +26,13 @@ var DateRangePicker = function DateRangePicker(props) {
27
26
  arrowColor = props.arrowColor,
28
27
  _onVisibleChange = props.onVisibleChange,
29
28
  _props$popoverProps = props.popoverProps,
30
- popoverProps = _props$popoverProps === void 0 ? {} : _props$popoverProps;
29
+ popoverProps = _props$popoverProps === void 0 ? {} : _props$popoverProps,
30
+ _props$rangePickerInp = props.rangePickerInputProps,
31
+ rangePickerInputProps = _props$rangePickerInp === void 0 ? {} : _props$rangePickerInp,
32
+ _props$renderPopoverT = props.renderPopoverTrigger,
33
+ renderPopoverTrigger = _props$renderPopoverT === void 0 ? function () {
34
+ return undefined;
35
+ } : _props$renderPopoverT;
31
36
  var intl = useIntl();
32
37
 
33
38
  var _React$useState = React.useState(false),
@@ -56,10 +61,6 @@ var DateRangePicker = function DateRangePicker(props) {
56
61
  } // eslint-disable-next-line react-hooks/exhaustive-deps
57
62
 
58
63
  }, [value]);
59
- var onValueChangeCallback = React.useCallback(function (val) {
60
- onValueChange && onValueChange(val);
61
- setSelectedDate(val);
62
- }, [onValueChange]);
63
64
  var onApplyCallback = React.useCallback(function (val) {
64
65
  onApply && onApply(val);
65
66
  setSelectedDate(val);
@@ -77,7 +78,6 @@ var DateRangePicker = function DateRangePicker(props) {
77
78
  content: /*#__PURE__*/React.createElement(RawDateRangePicker, _extends({}, props, {
78
79
  showTime: showTime,
79
80
  onApply: onApplyCallback,
80
- onValueChange: onValueChangeCallback,
81
81
  value: selectedDate,
82
82
  texts: allTexts,
83
83
  forceAdjacentMonths: forceAdjacentMonths
@@ -95,16 +95,18 @@ var DateRangePicker = function DateRangePicker(props) {
95
95
  setInputActive(visibility);
96
96
  _onVisibleChange && _onVisibleChange(visibility);
97
97
  }
98
- }, popoverProps, conditionalVisibilityProps), popoverTrigger || /*#__PURE__*/React.createElement(RangePickerInput, {
98
+ }, popoverProps, conditionalVisibilityProps), popoverTrigger || renderPopoverTrigger({
99
+ setPopupVisible: setPopupVisible
100
+ }) || /*#__PURE__*/React.createElement(RangePickerInput, _extends({
99
101
  onClick: function onClick() {
100
102
  return setPopupVisible(undefined);
101
103
  },
102
104
  value: selectedDate,
103
105
  showTime: showTime,
104
106
  texts: allTexts,
105
- onChange: onValueChangeCallback,
107
+ onChange: onApplyCallback,
106
108
  active: !!inputActive
107
- })));
109
+ }, rangePickerInputProps))));
108
110
  };
109
111
 
110
112
  export default DateRangePicker;
@@ -5,6 +5,8 @@ import { DateFilter, DateRange, RelativeUnits } from './date.types';
5
5
  import { FilterDefinition } from './RangeFilter/RangeFilter.types';
6
6
  import { SavedFilter } from './RangeFilter/Shared/FilterDropdown/FilterDropdown.types';
7
7
  import { Props as FooterProps } from './Footer/Footer.types';
8
+ import { RangePickerInputProps } from './RangePickerInput/RangePickerInput.types';
9
+ export { DateRange } from './date.types';
8
10
  export declare type CustomColorArrow = 'blue' | 'grey' | 'red' | 'green' | 'yellow' | 'pink' | 'mars' | 'orange' | 'fern' | 'cyan' | 'purple' | 'violet';
9
11
  export declare type AdditionalMapper = {
10
12
  topLeft: CustomColorArrow;
@@ -16,7 +18,7 @@ export declare type AdditionalMapper = {
16
18
  rightTop: CustomColorArrow;
17
19
  rightBottom: CustomColorArrow;
18
20
  };
19
- export interface Props extends WrappedComponentProps {
21
+ export interface DateRangePickerProps extends WrappedComponentProps {
20
22
  /**
21
23
  * overwrite default container's class. Default value is `ds-date-range-picker`.
22
24
  */
@@ -49,8 +51,19 @@ export interface Props extends WrappedComponentProps {
49
51
  message?: string;
50
52
  };
51
53
  value: DateRange;
54
+ /**
55
+ * transforms value, by default omits ALL_TIME props
56
+ */
57
+ valueTransformer?: (value: DateRange) => DateRange;
52
58
  arrowColor?: AdditionalMapper;
59
+ disableAbsoluteTimepickerInRelative?: boolean;
60
+ rangePickerInputProps?: RangePickerInputProps;
61
+ renderPopoverTrigger?: (...args: any) => JSX.Element;
53
62
  }
63
+ /**
64
+ * @deprecated use `DateRangePickerProps`
65
+ */
66
+ export declare type Props = DateRangePickerProps;
54
67
  export declare type RelativeMode = 'PAST' | 'FUTURE' | 'SINCE';
55
68
  export interface State {
56
69
  mode: string;
@@ -1 +1,2 @@
1
- export {};
1
+ import { DateRange } from './date.types';
2
+ export { DateRange } from './date.types';
@@ -13,6 +13,7 @@ import * as S from './Footer.styles';
13
13
  import fnsFormat from '../dateUtils/format';
14
14
  import getDateFromString from '../dateUtils/getDateFromString';
15
15
  import * as CONST from '../constants';
16
+ import { isLifetime } from '../RelativeRangePicker/Elements/RangeDropdown/RangeDropdown';
16
17
 
17
18
  var Footer = function Footer(_ref) {
18
19
  var canApply = _ref.canApply,
@@ -33,12 +34,12 @@ var Footer = function Footer(_ref) {
33
34
 
34
35
  var footerFormat = format || (showTime ? 'MMM D, YYYY, HH:mm' : 'MMM D, YYYY');
35
36
  var ChosenRange = React.useMemo(function () {
36
- if ((value == null ? void 0 : value.key) === CONST.ALL_TIME) {
37
+ if ((value == null ? void 0 : value.key) === CONST.ALL_TIME || value && isLifetime(value)) {
37
38
  var _texts$value$translat;
38
39
 
39
40
  return /*#__PURE__*/React.createElement(S.ChosenRange, {
40
41
  className: "ds-date-range-picker-value"
41
- }, value.translationKey ? (_texts$value$translat = texts[value.translationKey]) != null ? _texts$value$translat : value.translationKey : value == null ? void 0 : value.key);
42
+ }, value != null && value.translationKey ? (_texts$value$translat = texts[value.translationKey]) != null ? _texts$value$translat : value.translationKey : (value == null ? void 0 : value.key) || 'LIFETIME');
42
43
  }
43
44
 
44
45
  return /*#__PURE__*/React.createElement(S.ChosenRange, {
@@ -55,7 +56,7 @@ var Footer = function Footer(_ref) {
55
56
  disabled: !canApply,
56
57
  type: "primary",
57
58
  onClick: function onClick() {
58
- onApply && onApply();
59
+ onApply && onApply(value);
59
60
  }
60
61
  }, texts.apply))));
61
62
  };
@@ -8,7 +8,7 @@ export declare type Props = {
8
8
  value?: DateRange;
9
9
  canApply?: boolean;
10
10
  canSwitchMode?: boolean;
11
- onApply?: (date?: Date | undefined) => void;
11
+ onApply?: (date?: Date | DateRange | undefined) => void;
12
12
  onSwitchMode?: () => void;
13
13
  message?: React.ReactNode | string;
14
14
  texts: Texts;
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { DayModifiers } from 'react-day-picker';
3
- import { Props, State, Side as SideType } from './RangePicker.types';
3
+ import { RangePickerProps as Props, State, Side as SideType } from './RangePicker.types';
4
4
  export default class RangePicker extends React.PureComponent<Props, State> {
5
5
  constructor(props: Props);
6
6
  getSnapshotBeforeUpdate(prevProps: Readonly<Props>): null;
@@ -36,7 +36,15 @@ var TOOLTIP_FORMAT = 'MMM d, yyyy, HH:mm';
36
36
 
37
37
  function replaceRange(value, day) {
38
38
  var from = value.from,
39
- to = value.to; // arguments to DateUtils functions are casted to Date because function arguments require Date
39
+ to = value.to;
40
+
41
+ if (from && typeof from === 'object') {
42
+ from = new Date(from.getTime());
43
+ }
44
+
45
+ if (to && typeof to === 'object') {
46
+ to = new Date(to.getTime());
47
+ }
40
48
 
41
49
  if (!from) {
42
50
  from = day;
@@ -405,16 +413,40 @@ var RangePicker = /*#__PURE__*/function (_React$PureComponent) {
405
413
  value = _this$props8.value,
406
414
  forceAdjacentMonths = _this$props8.forceAdjacentMonths,
407
415
  startAlwaysOnTheLeft = _this$props8.startAlwaysOnTheLeft;
408
- var left = this.state.left;
416
+ var _this$props$jumpToSta = this.props.jumpToStartAndEnd,
417
+ jumpToStartAndEnd = _this$props$jumpToSta === void 0 ? true : _this$props$jumpToSta;
418
+ var _this$state3 = this.state,
419
+ left = _this$state3.left,
420
+ right = _this$state3.right;
409
421
  var toDateChanged = !!(value != null && value.to) && (value == null ? void 0 : value.to) !== (prevProps == null ? void 0 : (_prevProps$value = prevProps.value) == null ? void 0 : _prevProps$value.to);
410
422
  var fromDateChanged = !!(value != null && value.from) && (value == null ? void 0 : value.from) !== (prevProps == null ? void 0 : (_prevProps$value2 = prevProps.value) == null ? void 0 : _prevProps$value2.from);
423
+ var startOnLeft = fnsIsSameMonth(legacyParse(value.from), legacyParse(left.month));
424
+ var endOnLeft = fnsIsSameMonth(legacyParse(value.to), legacyParse(left.month));
411
425
 
412
- if (toDateChanged && !fnsIsSameMonth(legacyParse(value.to), legacyParse(left.month)) || fromDateChanged && !fnsIsSameMonth(legacyParse(value.from), legacyParse(left.month)) || forceAdjacentMonths !== prevProps.forceAdjacentMonths) {
426
+ if (fromDateChanged && !endOnLeft || toDateChanged && !endOnLeft || forceAdjacentMonths !== prevProps.forceAdjacentMonths) {
413
427
  if (startAlwaysOnTheLeft) {
414
428
  this.setState(getSidesState(value, forceAdjacentMonths));
415
429
  }
416
430
  }
417
431
 
432
+ if (jumpToStartAndEnd && (fromDateChanged || toDateChanged)) {
433
+ var startOnRight = fnsIsSameMonth(legacyParse(value.from), legacyParse(right.month));
434
+ var isStartVisible = startOnLeft || startOnRight;
435
+
436
+ if (!isStartVisible) {
437
+ this.setState(getSidesState(value, forceAdjacentMonths));
438
+ return null;
439
+ }
440
+
441
+ var endOnRight = fnsIsSameMonth(legacyParse(value.to), legacyParse(right.month));
442
+ var isEndVisible = endOnLeft || endOnRight;
443
+
444
+ if (!isEndVisible) {
445
+ this.setState(getSidesState(value, forceAdjacentMonths));
446
+ return null;
447
+ }
448
+ }
449
+
418
450
  return null;
419
451
  };
420
452
 
@@ -433,11 +465,16 @@ var RangePicker = /*#__PURE__*/function (_React$PureComponent) {
433
465
  mode: mode
434
466
  }, this.renderSide(COLUMNS.RIGHT))), /*#__PURE__*/React.createElement(S.PickerFooter, null, /*#__PURE__*/React.createElement(Range, {
435
467
  onClick: function onClick() {
436
- onChange(_objectSpread({}, value, {
468
+ var now = new Date();
469
+
470
+ var literallyNow = _objectSpread({}, value, {
471
+ translationKey: 'now',
437
472
  type: 'ABSOLUTE',
438
- to: fnsAddMinutes(new Date(), 1),
439
- from: new Date()
440
- }));
473
+ from: now,
474
+ to: fnsAddMinutes(now, 1)
475
+ });
476
+
477
+ onChange(literallyNow);
441
478
  }
442
479
  }, texts.now), /*#__PURE__*/React.createElement(S.FooterSeparator, null), !dateOnly && /*#__PURE__*/React.createElement(S.DateTimeModeSwitch, {
443
480
  type: "ghost",
@@ -1,7 +1,7 @@
1
1
  import { WrappedComponentProps } from 'react-intl';
2
2
  import { DateRange } from '../date.types';
3
3
  import { Texts } from '../DateRangePicker.types';
4
- export interface Props extends WrappedComponentProps {
4
+ export interface RangePickerProps extends WrappedComponentProps {
5
5
  value: DateRange;
6
6
  onChange: (value: DateRange) => void;
7
7
  mode: string;
@@ -13,7 +13,12 @@ export interface Props extends WrappedComponentProps {
13
13
  forceAdjacentMonths?: boolean;
14
14
  showCustomRange?: boolean;
15
15
  startAlwaysOnTheLeft?: boolean;
16
+ jumpToStartAndEnd?: boolean;
16
17
  }
18
+ /**
19
+ * @deprecated use @{type RangePickerProps}
20
+ */
21
+ export declare type Props = RangePickerProps;
17
22
  export interface State {
18
23
  enteredTo?: Date | null;
19
24
  left: {
@@ -1,4 +1,4 @@
1
1
  import * as React from 'react';
2
- import { Props } from './RangePickerInput.types';
3
- declare const RangePickerInput: React.FC<Props>;
2
+ import { RangePickerInputProps } from './RangePickerInput.types';
3
+ declare const RangePickerInput: React.FC<RangePickerInputProps>;
4
4
  export default RangePickerInput;
@@ -7,6 +7,7 @@ import Tooltip from '@synerise/ds-tooltip'; // eslint-disable-next-line import/n
7
7
  import { default as fnsFormat } from '../dateUtils/format';
8
8
  import * as S from './RangePickerInput.styles';
9
9
  import { normalizeRange } from '../utils';
10
+ import { isLifetime } from '../RelativeRangePicker/Elements/RangeDropdown/RangeDropdown';
10
11
 
11
12
  var RangePickerInput = function RangePickerInput(_ref) {
12
13
  var value = _ref.value,
@@ -24,7 +25,9 @@ var RangePickerInput = function RangePickerInput(_ref) {
24
25
  onFocus = _ref.onFocus,
25
26
  onBlur = _ref.onBlur,
26
27
  error = _ref.error,
27
- errorText = _ref.errorText;
28
+ errorText = _ref.errorText,
29
+ _ref$preferRelativeDe = _ref.preferRelativeDesc,
30
+ preferRelativeDesc = _ref$preferRelativeDe === void 0 ? false : _ref$preferRelativeDe;
28
31
  var dateRangeValue = value ? normalizeRange(value) : value;
29
32
 
30
33
  var _React$useState = React.useState(false),
@@ -66,6 +69,16 @@ var RangePickerInput = function RangePickerInput(_ref) {
66
69
  highlight: active && !!isFromDateDefined && !isEndDateDefined && highlight
67
70
  }, text);
68
71
  }, [dateRangeValue, getText, active, texts, highlight]);
72
+ var placeholder = React.useMemo(function () {
73
+ if (isLifetime(value)) {
74
+ return /*#__PURE__*/React.createElement(React.Fragment, null, (texts == null ? void 0 : texts['allTime']) || 'Lifetime');
75
+ }
76
+
77
+ return /*#__PURE__*/React.createElement(React.Fragment, null, preferRelativeDesc && (dateRangeValue == null ? void 0 : dateRangeValue.translationKey) && ((texts == null ? void 0 : texts[dateRangeValue.translationKey]) || (dateRangeValue == null ? void 0 : dateRangeValue.translationKey)) + " (", renderFromDate(), /*#__PURE__*/React.createElement(Icon, {
78
+ component: /*#__PURE__*/React.createElement(ArrowRightS, null),
79
+ color: theme.palette['grey-400']
80
+ }), renderEndDate(), preferRelativeDesc && (dateRangeValue == null ? void 0 : dateRangeValue.translationKey) && value && ')');
81
+ }, [dateRangeValue, renderFromDate, renderEndDate, preferRelativeDesc, texts, value]);
69
82
  return /*#__PURE__*/React.createElement(React.Fragment, null, label && /*#__PURE__*/React.createElement(S.Label, {
70
83
  label: label,
71
84
  tooltip: tooltip
@@ -82,10 +95,7 @@ var RangePickerInput = function RangePickerInput(_ref) {
82
95
  active: !!highlight && !disabled,
83
96
  tabIndex: disabled ? -1 : 0,
84
97
  focus: active && !disabled
85
- }, renderFromDate(), /*#__PURE__*/React.createElement(Icon, {
86
- component: /*#__PURE__*/React.createElement(ArrowRightS, null),
87
- color: theme.palette['grey-400']
88
- }), renderEndDate(), /*#__PURE__*/React.createElement(S.IconSeparator, null), hovered && !!value && !!value.to && !!value.from ? /*#__PURE__*/React.createElement(Tooltip, {
98
+ }, placeholder, /*#__PURE__*/React.createElement(S.IconSeparator, null), hovered && !!value && !!value.to && !!value.from ? /*#__PURE__*/React.createElement(Tooltip, {
89
99
  title: texts == null ? void 0 : texts.clear
90
100
  }, /*#__PURE__*/React.createElement(S.ClearIconWrapper, null, /*#__PURE__*/React.createElement(Icon, {
91
101
  component: /*#__PURE__*/React.createElement(Close3S, null),
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { DateFilter, DateRange } from '../date.types';
3
3
  import { Texts } from '../DateRangePicker.types';
4
- export declare type Props = {
4
+ export declare type RangePickerInputProps = {
5
5
  size?: 'large' | 'default' | 'small';
6
6
  format?: string;
7
7
  showTime?: boolean;
@@ -24,4 +24,9 @@ export declare type Props = {
24
24
  tooltip?: string | React.ReactNode;
25
25
  error?: boolean;
26
26
  errorText?: React.ReactNode | string;
27
+ preferRelativeDesc?: boolean;
27
28
  };
29
+ /**
30
+ * @deprecated use `RangePickerInputProps`
31
+ */
32
+ export declare type Props = RangePickerInputProps;
@@ -1,8 +1,9 @@
1
1
  import * as React from 'react';
2
- import { Props, State, AddonType } from './DateRangePicker.types';
3
- import { DateRange, RelativeDateRange } from './date.types';
2
+ import type { DateRangePickerProps, DateRangePickerProps as Props, State, AddonType } from './DateRangePicker.types';
3
+ import type { DateRange, RelativeDateRange } from './date.types';
4
4
  import { FilterDefinition, FilterValue } from './RangeFilter/RangeFilter.types';
5
- export declare class RawDateRangePicker extends React.PureComponent<Props, State> {
5
+ export declare function defaultValueTransformer(value: DateRange): DateRange;
6
+ export declare class RawDateRangePicker extends React.PureComponent<DateRangePickerProps, State> {
6
7
  static defaultProps: {
7
8
  ranges: DateRange[];
8
9
  relativePast: boolean;
@@ -10,8 +11,9 @@ export declare class RawDateRangePicker extends React.PureComponent<Props, State
10
11
  validate: () => {
11
12
  valid: boolean;
12
13
  };
14
+ valueTransformer: typeof defaultValueTransformer;
13
15
  };
14
- constructor(props: Props);
16
+ constructor(props: DateRangePickerProps);
15
17
  componentDidUpdate(prevProps: Readonly<Props>): void;
16
18
  handleFilterCancel: () => void;
17
19
  handleFilterApply: (filter?: FilterValue<FilterDefinition> | undefined) => void;
@@ -24,9 +26,9 @@ export declare class RawDateRangePicker extends React.PureComponent<Props, State
24
26
  getAddons: () => AddonType[];
25
27
  render(): JSX.Element;
26
28
  }
27
- declare const _default: React.ForwardRefExoticComponent<Pick<Props, "texts" | "format" | "value" | "onVisibleChange" | "rangeUnits" | "containerClass" | "disableDefaultTexts" | "disabledDate" | "forceAdjacentMonths" | "forceAbsolute" | "footerProps" | "onValueChange" | "onApply" | "onFilterSave" | "popoverProps" | "popoverTrigger" | "ranges" | "relativeFuture" | "relativePast" | "relativeModes" | "savedFilters" | "showRelativePicker" | "showFilter" | "showTime" | "showCustomRange" | "validate" | "arrowColor"> & {
29
+ declare const _default: React.ForwardRefExoticComponent<Pick<DateRangePickerProps, "texts" | "format" | "value" | "onVisibleChange" | "rangeUnits" | "containerClass" | "disableDefaultTexts" | "disabledDate" | "forceAdjacentMonths" | "forceAbsolute" | "footerProps" | "onValueChange" | "onApply" | "onFilterSave" | "popoverProps" | "popoverTrigger" | "ranges" | "relativeFuture" | "relativePast" | "relativeModes" | "savedFilters" | "showRelativePicker" | "showFilter" | "showTime" | "showCustomRange" | "validate" | "valueTransformer" | "arrowColor" | "disableAbsoluteTimepickerInRelative" | "rangePickerInputProps" | "renderPopoverTrigger"> & {
28
30
  forwardedRef?: ((instance: any) => void) | React.RefObject<any> | null | undefined;
29
31
  } & React.RefAttributes<any>> & {
30
- WrappedComponent: React.ComponentType<Props>;
32
+ WrappedComponent: React.ComponentType<DateRangePickerProps>;
31
33
  };
32
34
  export default _default;
@@ -1,13 +1,13 @@
1
1
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
2
 
3
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
4
-
5
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
6
-
7
3
  function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
8
4
 
9
5
  function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
10
6
 
7
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
8
+
9
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
10
+
11
11
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
12
12
 
13
13
  import * as React from 'react';
@@ -25,6 +25,50 @@ import Footer from './Footer/Footer';
25
25
  import { normalizeRange } from './utils';
26
26
  import RangeFilter from './RangeFilter/RangeFilter';
27
27
  import RangeFilterStatus from './RangeFilter/Shared/RangeFilterStatus/RangeFilterStatus';
28
+ import { isLifetime } from './RelativeRangePicker/Elements/RangeDropdown/RangeDropdown';
29
+ export function defaultValueTransformer(value) {
30
+ if (value.key === 'ALL_TIME' || isLifetime(value)) {
31
+ return {
32
+ type: 'ABSOLUTE'
33
+ };
34
+ }
35
+
36
+ var id = value.id,
37
+ timestamp = value.timestamp,
38
+ translationKey = value.translationKey;
39
+
40
+ var baseValue = _objectSpread({}, id ? {
41
+ id: id
42
+ } : {}, {}, timestamp ? {
43
+ timestamp: timestamp
44
+ } : {}, {}, translationKey ? {
45
+ translationKey: translationKey
46
+ } : {});
47
+
48
+ if (value.type === 'ABSOLUTE') {
49
+ return _objectSpread({}, baseValue, {
50
+ type: value.type
51
+ }, value.from ? {
52
+ from: value.from
53
+ } : {}, {}, value.to ? {
54
+ to: value.to
55
+ } : {});
56
+ }
57
+
58
+ if (value.type === 'RELATIVE') {
59
+ return _objectSpread({}, baseValue, {
60
+ type: value.type,
61
+ key: value.key,
62
+ duration: value.duration,
63
+ offset: value.offset,
64
+ future: value.future
65
+ }, value.filter ? {
66
+ filter: value.filter
67
+ } : {});
68
+ }
69
+
70
+ return value;
71
+ }
28
72
  export var RawDateRangePicker = /*#__PURE__*/function (_React$PureComponent) {
29
73
  _inheritsLoose(RawDateRangePicker, _React$PureComponent);
30
74
 
@@ -51,6 +95,8 @@ export var RawDateRangePicker = /*#__PURE__*/function (_React$PureComponent) {
51
95
  });
52
96
 
53
97
  _defineProperty(_assertThisInitialized(_this), "handleRangeChange", function (range) {
98
+ var _valueTransformer;
99
+
54
100
  if (!range) {
55
101
  return;
56
102
  }
@@ -59,7 +105,9 @@ export var RawDateRangePicker = /*#__PURE__*/function (_React$PureComponent) {
59
105
  return;
60
106
  }
61
107
 
62
- var onValueChange = _this.props.onValueChange;
108
+ var _this$props = _this.props,
109
+ onValueChange = _this$props.onValueChange,
110
+ valueTransformer = _this$props.valueTransformer;
63
111
  var _this$state = _this.state,
64
112
  value = _this$state.value,
65
113
  mode = _this$state.mode;
@@ -68,31 +116,33 @@ export var RawDateRangePicker = /*#__PURE__*/function (_React$PureComponent) {
68
116
  }));
69
117
 
70
118
  if ((newValue.type === 'RELATIVE' || newValue.key === CONST.ALL_TIME) && mode === MODES.TIME) {
71
- // clicked on RangeButtons and was selecting time
72
119
  _this.setState({
73
120
  mode: MODES.DATE
74
121
  });
75
122
  }
76
123
 
77
124
  if (range != null && range.key) {
78
- // for validation, see `isValidAbsolute`, this key shouldn't be present
79
125
  newValue.key = range == null ? void 0 : range.key;
80
- }
126
+ } // transformation has to take place here, because `key` property might get omitted by valueTransformer
127
+
128
+
129
+ var legacyValue = (_valueTransformer = valueTransformer == null ? void 0 : valueTransformer(newValue)) != null ? _valueTransformer : newValue;
81
130
 
82
131
  _this.setState({
83
- value: _objectSpread({}, newValue, {
132
+ value: _objectSpread({}, legacyValue, {
84
133
  translationKey: range == null ? void 0 : range.translationKey
85
134
  })
86
135
  });
87
136
 
88
- onValueChange && onValueChange(newValue);
137
+ onValueChange && onValueChange(legacyValue);
89
138
  });
90
139
 
91
140
  _defineProperty(_assertThisInitialized(_this), "handleApply", function () {
92
141
  var value = _this.state.value;
93
- var _this$props = _this.props,
94
- forceAbsolute = _this$props.forceAbsolute,
95
- onApply = _this$props.onApply;
142
+ var _this$props2 = _this.props,
143
+ forceAbsolute = _this$props2.forceAbsolute,
144
+ onApply = _this$props2.onApply,
145
+ valueTransformer = _this$props2.valueTransformer;
96
146
 
97
147
  if (forceAbsolute && value.type === RELATIVE) {
98
148
  onApply && onApply(_objectSpread({}, value, {}, relativeToAbsolute(value)));
@@ -104,11 +154,17 @@ export var RawDateRangePicker = /*#__PURE__*/function (_React$PureComponent) {
104
154
  return;
105
155
  }
106
156
 
107
- onApply && onApply(_objectSpread({}, value, {
108
- from: value.type === ABSOLUTE && value.from instanceof Date ? value.from.toISOString() : undefined,
109
- to: value.type === ABSOLUTE && value.to instanceof Date ? value.to.toISOString() : undefined,
110
- type: value.type
111
- }));
157
+ if (onApply) {
158
+ var _valueTransformer2;
159
+
160
+ var valueToEmit = _objectSpread({}, value, {
161
+ from: value.type === ABSOLUTE && value.from instanceof Date ? value.from.toISOString() : undefined,
162
+ to: value.type === ABSOLUTE && value.to instanceof Date ? value.to.toISOString() : undefined,
163
+ type: value.type
164
+ });
165
+
166
+ onApply((_valueTransformer2 = valueTransformer == null ? void 0 : valueTransformer(valueToEmit)) != null ? _valueTransformer2 : valueToEmit);
167
+ }
112
168
  });
113
169
 
114
170
  _defineProperty(_assertThisInitialized(_this), "handleModalOpenClick", function () {
@@ -139,17 +195,18 @@ export var RawDateRangePicker = /*#__PURE__*/function (_React$PureComponent) {
139
195
  });
140
196
 
141
197
  _defineProperty(_assertThisInitialized(_this), "getAddons", function () {
142
- var _this$props2 = _this.props,
143
- showRelativePicker = _this$props2.showRelativePicker,
144
- showFilter = _this$props2.showFilter,
145
- relativeFuture = _this$props2.relativeFuture,
146
- relativePast = _this$props2.relativePast,
147
- ranges = _this$props2.ranges,
148
- relativeModes = _this$props2.relativeModes,
149
- texts = _this$props2.texts,
150
- intl = _this$props2.intl,
151
- rangeUnits = _this$props2.rangeUnits,
152
- showCustomRange = _this$props2.showCustomRange;
198
+ var _this$props3 = _this.props,
199
+ showRelativePicker = _this$props3.showRelativePicker,
200
+ showFilter = _this$props3.showFilter,
201
+ relativeFuture = _this$props3.relativeFuture,
202
+ relativePast = _this$props3.relativePast,
203
+ ranges = _this$props3.ranges,
204
+ relativeModes = _this$props3.relativeModes,
205
+ texts = _this$props3.texts,
206
+ intl = _this$props3.intl,
207
+ rangeUnits = _this$props3.rangeUnits,
208
+ showCustomRange = _this$props3.showCustomRange,
209
+ valueTransformer = _this$props3.valueTransformer;
153
210
  var _this$state2 = _this.state,
154
211
  value = _this$state2.value,
155
212
  visibleAddonKey = _this$state2.visibleAddonKey;
@@ -169,7 +226,8 @@ export var RawDateRangePicker = /*#__PURE__*/function (_React$PureComponent) {
169
226
  relativeModes: relativeModes,
170
227
  texts: texts,
171
228
  rangeUnits: rangeUnits,
172
- showCustomRange: showCustomRange
229
+ showCustomRange: showCustomRange,
230
+ valueTransformer: valueTransformer
173
231
  }),
174
232
  expanded: addonKey === visibleAddonKey,
175
233
  title: texts == null ? void 0 : texts.relativeDateRange,
@@ -230,22 +288,33 @@ export var RawDateRangePicker = /*#__PURE__*/function (_React$PureComponent) {
230
288
  };
231
289
 
232
290
  _proto.render = function render() {
233
- var _this$props3 = this.props,
234
- showTime = _this$props3.showTime,
235
- format = _this$props3.format,
236
- disabledDate = _this$props3.disabledDate,
237
- validate = _this$props3.validate,
238
- forceAdjacentMonths = _this$props3.forceAdjacentMonths,
239
- texts = _this$props3.texts,
240
- savedFilters = _this$props3.savedFilters,
241
- onFilterSave = _this$props3.onFilterSave,
242
- intl = _this$props3.intl,
243
- _this$props3$containe = _this$props3.containerClass,
244
- containerClass = _this$props3$containe === void 0 ? 'ds-date-range-picker' : _this$props3$containe,
245
- footerProps = _this$props3.footerProps;
291
+ var _this$props4 = this.props,
292
+ showTime = _this$props4.showTime,
293
+ format = _this$props4.format,
294
+ disabledDate = _this$props4.disabledDate,
295
+ validate = _this$props4.validate,
296
+ forceAdjacentMonths = _this$props4.forceAdjacentMonths,
297
+ texts = _this$props4.texts,
298
+ savedFilters = _this$props4.savedFilters,
299
+ onFilterSave = _this$props4.onFilterSave,
300
+ intl = _this$props4.intl,
301
+ _this$props4$containe = _this$props4.containerClass,
302
+ containerClass = _this$props4$containe === void 0 ? 'ds-date-range-picker' : _this$props4$containe,
303
+ footerProps = _this$props4.footerProps,
304
+ _this$props4$disableA = _this$props4.disableAbsoluteTimepickerInRelative,
305
+ disableAbsoluteTimepickerInRelative = _this$props4$disableA === void 0 ? false : _this$props4$disableA;
246
306
  var _this$state3 = this.state,
247
307
  value = _this$state3.value,
248
308
  mode = _this$state3.mode;
309
+
310
+ if (value.type === 'RELATIVE' && (!value.from || !value.to)) {
311
+ var absolute = normalizeRange(value);
312
+ Object.assign(value, {
313
+ from: absolute.from,
314
+ to: absolute.to
315
+ });
316
+ }
317
+
249
318
  var from = value.from,
250
319
  to = value.to,
251
320
  key = value.key;
@@ -271,7 +340,10 @@ export var RawDateRangePicker = /*#__PURE__*/function (_React$PureComponent) {
271
340
  }
272
341
 
273
342
  var isValidRelative = isRelative(value) && Boolean(value.offset && value.duration);
274
- var isValid = (isValidAbsolute || isValidRelative || key === CONST.ALL_TIME) && validator.valid;
343
+ var isValidSince = value.type === 'SINCE' && Boolean(value.offset && value.duration); // TODO apply ranges and find mapped lifetime here, this applies only for defaultValueTransformer
344
+
345
+ var isValid = (isValidAbsolute || isValidRelative || isValidSince || key === CONST.ALL_TIME) && validator.valid;
346
+ var canSwitchToTimePicker = isValid && (!disableAbsoluteTimepickerInRelative || value.type === 'ABSOLUTE');
275
347
  return /*#__PURE__*/React.createElement(Container, {
276
348
  className: containerClass
277
349
  }, /*#__PURE__*/React.createElement(RangePicker, {
@@ -281,7 +353,7 @@ export var RawDateRangePicker = /*#__PURE__*/function (_React$PureComponent) {
281
353
  disabledDate: disabledDate,
282
354
  onSwitchMode: this.handleSwitchMode,
283
355
  dateOnly: !showTime,
284
- canSwitchMode: isValid,
356
+ canSwitchMode: canSwitchToTimePicker,
285
357
  texts: texts,
286
358
  forceAdjacentMonths: forceAdjacentMonths,
287
359
  intl: intl
@@ -292,7 +364,7 @@ export var RawDateRangePicker = /*#__PURE__*/function (_React$PureComponent) {
292
364
  key: addon.key
293
365
  }, addon.content);
294
366
  }), /*#__PURE__*/React.createElement(Footer, _extends({
295
- canApply: isValid,
367
+ canApply: isValid || isLifetime(value),
296
368
  onApply: this.handleApply,
297
369
  dateOnly: !showTime,
298
370
  mode: mode,
@@ -318,7 +390,8 @@ _defineProperty(RawDateRangePicker, "defaultProps", {
318
390
  return {
319
391
  valid: true
320
392
  };
321
- }
393
+ },
394
+ valueTransformer: defaultValueTransformer
322
395
  });
323
396
 
324
397
  export default injectIntl(RawDateRangePicker);
@@ -1,4 +1,12 @@
1
1
  import * as React from 'react';
2
- import { Props } from './RangeDropdown.types';
3
- declare const RangeDropdown: React.FC<Props>;
2
+ import { RangeDropdownProps } from './RangeDropdown.types';
3
+ import { RelativeDateRange } from '../../../date.types';
4
+ /**
5
+ * Tell whether given date (range) is a lifetime value.
6
+ *
7
+ * @param date-value @{type DateRange}
8
+ * @param fallback whether to accept existing properties, but set to `undefined`, default `false`
9
+ */
10
+ export declare const isLifetime: (range?: import("../../../date.types").AbsoluteDateRange | RelativeDateRange | undefined, fallback?: boolean) => boolean;
11
+ declare const RangeDropdown: React.FC<RangeDropdownProps>;
4
12
  export default RangeDropdown;
@@ -1,5 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import find from 'ramda/src/find';
3
+ import { isEqual } from 'lodash';
3
4
  import Icon, { AngleDownS, CheckS } from '@synerise/ds-icon';
4
5
  import { useOnClickOutside } from '@synerise/ds-utils';
5
6
  import Scrollbar from '@synerise/ds-scrollbar';
@@ -9,12 +10,39 @@ var MAX_ITEMS_COUNT = 7;
9
10
  var ITEMS_HEIGHT = 32;
10
11
  var DROPDOWN_WIDTH = 160;
11
12
  var DROPDOWN_PADDING = 8;
13
+ /**
14
+ * Tell whether given date (range) is a lifetime value.
15
+ *
16
+ * @param date-value @{type DateRange}
17
+ * @param fallback whether to accept existing properties, but set to `undefined`, default `false`
18
+ */
19
+
20
+ export var isLifetime = function isLifetime(range, fallback) {
21
+ if (fallback === void 0) {
22
+ fallback = false;
23
+ }
24
+
25
+ if (!range) {
26
+ return false;
27
+ }
28
+
29
+ var keys = Object.keys(range);
30
+ var legacyDef = range.type === 'ABSOLUTE' && !keys.includes('from') && !keys.includes('to'); // reasonable def comes from the fact that empty from and to sometimes might be also set like this (from/to as undefined)
31
+
32
+ var reasonableDef = range.type === 'ABSOLUTE' && range.from === undefined && range.to === undefined;
33
+ var legacyValueButLifetimeForSure = reasonableDef && range.translationKey === 'allTime';
34
+ return legacyDef || fallback && reasonableDef || legacyValueButLifetimeForSure;
35
+ };
12
36
 
13
37
  var RangeDropdown = function RangeDropdown(_ref) {
14
38
  var ranges = _ref.ranges,
15
39
  currentRange = _ref.currentRange,
16
40
  texts = _ref.texts,
17
- onChange = _ref.onChange;
41
+ onChange = _ref.onChange,
42
+ _ref$valueTransformer = _ref.valueTransformer,
43
+ valueTransformer = _ref$valueTransformer === void 0 ? function (e) {
44
+ return e;
45
+ } : _ref$valueTransformer;
18
46
 
19
47
  var _React$useState = React.useState(false),
20
48
  dropVisible = _React$useState[0],
@@ -32,9 +60,14 @@ var RangeDropdown = function RangeDropdown(_ref) {
32
60
  setDropVisible(false);
33
61
  }, [onChange, ranges]);
34
62
  if (!ranges || ranges.length === 0) return null;
63
+ var mappedRanges = ranges.map(valueTransformer);
64
+ var transformedCurrentRange = valueTransformer(currentRange);
65
+ var anyOfTransformedRangesMatchesCurrentRange = find(function (r) {
66
+ return isEqual(transformedCurrentRange, r);
67
+ }, mappedRanges);
35
68
  var containsCurrentRange = currentRange && find(function (range) {
36
69
  return range.key === currentRange.key;
37
- }, ranges);
70
+ }, ranges) || anyOfTransformedRangesMatchesCurrentRange;
38
71
  var overlay = /*#__PURE__*/React.createElement(S.OverlayWrapper, {
39
72
  visible: dropVisible,
40
73
  ref: overlayRef,
@@ -1,8 +1,13 @@
1
1
  import { AbsoluteDateRange, DateRange, RelativeDateRange } from '../../../date.types';
2
- import { Texts } from '../../../DateRangePicker.types';
3
- export declare type Props = {
2
+ import { DateRangePickerProps, Texts } from '../../../DateRangePicker.types';
3
+ export declare type RangeDropdownProps = {
4
4
  ranges: DateRange[];
5
5
  currentRange: RelativeDateRange;
6
6
  texts: Texts;
7
7
  onChange: (range: AbsoluteDateRange | RelativeDateRange | undefined) => void;
8
+ valueTransformer?: ((value: DateRange | object) => DateRange | object) | DateRangePickerProps['valueTransformer'];
8
9
  };
10
+ /**
11
+ * @deprecated use `DateRangePickerProps`
12
+ */
13
+ export declare type Props = DateRangePickerProps;
@@ -1,4 +1,4 @@
1
1
  import * as React from 'react';
2
- import { Props } from './TimestampRange.types';
2
+ import { TimestampRangeProps as Props } from './TimestampRange.types';
3
3
  declare const TimestampRange: React.FC<Props>;
4
4
  export default TimestampRange;
@@ -4,6 +4,7 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
4
4
 
5
5
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
6
 
7
+ /* eslint-disable @typescript-eslint/no-explicit-any */
7
8
  import * as React from 'react';
8
9
  import DatePicker from '@synerise/ds-date-picker/dist/DatePicker';
9
10
  import * as S from '../../RelativeRangePicker.styles';
@@ -14,24 +15,41 @@ import END_OF from '../../../dateUtils/endOf';
14
15
  import DIFFERENCE from '../../../dateUtils/difference';
15
16
  import { DURATION_MODIFIERS } from '../../../constants';
16
17
  import { fnsIsAfter } from '../../../fns';
18
+ import { DEFAULT_RANGE } from '../../../utils';
17
19
 
18
20
  var TimestampRange = function TimestampRange(_ref) {
21
+ var _currentRange$duratio, _currentRange$duratio2;
22
+
19
23
  var currentRange = _ref.currentRange,
20
24
  currentGroup = _ref.currentGroup,
21
25
  handleChange = _ref.handleChange,
22
26
  texts = _ref.texts,
23
27
  onTimestampChange = _ref.onTimestampChange,
28
+ _ref$getValueOnReset = _ref.getValueOnReset,
29
+ getValueOnReset = _ref$getValueOnReset === void 0 ? function () {
30
+ return _objectSpread({}, DEFAULT_RANGE, {
31
+ type: 'RELATIVE',
32
+ offset: {
33
+ type: 'SINCE',
34
+ value: new Date()
35
+ },
36
+ duration: {
37
+ type: 'DAYS',
38
+ value: 30
39
+ }
40
+ });
41
+ } : _ref$getValueOnReset,
24
42
  timestamp = _ref.timestamp;
25
43
 
26
44
  var _React$useState = React.useState(DURATION_MODIFIERS.LAST),
27
45
  durationModifier = _React$useState[0],
28
46
  setDurationModifier = _React$useState[1];
29
47
 
30
- var _React$useState2 = React.useState(currentRange.duration.value),
48
+ var _React$useState2 = React.useState(currentRange == null ? void 0 : (_currentRange$duratio = currentRange.duration) == null ? void 0 : _currentRange$duratio.value),
31
49
  durationValue = _React$useState2[0],
32
50
  setDurationValue = _React$useState2[1];
33
51
 
34
- var _React$useState3 = React.useState(currentRange.duration.type),
52
+ var _React$useState3 = React.useState(currentRange == null ? void 0 : (_currentRange$duratio2 = currentRange.duration) == null ? void 0 : _currentRange$duratio2.type),
35
53
  durationUnit = _React$useState3[0],
36
54
  setDurationUnit = _React$useState3[1];
37
55
 
@@ -48,11 +66,27 @@ var TimestampRange = function TimestampRange(_ref) {
48
66
  var NOW = new Date();
49
67
  var rangeStart, newOffset, offsetToTimestamp;
50
68
  var future = fnsIsAfter(NOW, date);
69
+ var isSince = currentGroup === 'SINCE';
51
70
 
52
- if (durationModifier === DURATION_MODIFIERS.NEXT) {
71
+ if (isSince) {
72
+ offsetToTimestamp = {
73
+ future: durationModifier === DURATION_MODIFIERS.NEXT,
74
+ duration: {
75
+ type: duration.type,
76
+ value: duration.value
77
+ },
78
+ offset: {
79
+ type: 'SINCE',
80
+ value: timestamp
81
+ },
82
+ key: undefined
83
+ };
84
+ } else if (durationModifier === DURATION_MODIFIERS.NEXT) {
53
85
  rangeStart = END_OF[duration.type](ADD[duration.type](date, -Number(future)));
54
86
  newOffset = DIFFERENCE[duration.type](NOW, rangeStart);
55
- offsetToTimestamp = _objectSpread({}, currentRange, {
87
+ offsetToTimestamp = _objectSpread({
88
+ future: true
89
+ }, currentRange, {
56
90
  duration: {
57
91
  type: duration.type,
58
92
  value: duration.value
@@ -63,12 +97,12 @@ var TimestampRange = function TimestampRange(_ref) {
63
97
  },
64
98
  key: undefined
65
99
  });
66
- }
67
-
68
- if (durationModifier === DURATION_MODIFIERS.LAST) {
100
+ } else if (durationModifier === DURATION_MODIFIERS.LAST) {
69
101
  rangeStart = START_OF[duration.type](ADD[duration.type](date, -Number(future)));
70
102
  newOffset = DIFFERENCE[duration.type](NOW, rangeStart);
71
- offsetToTimestamp = _objectSpread({}, currentRange, {
103
+ offsetToTimestamp = _objectSpread({
104
+ future: false
105
+ }, currentRange, {
72
106
  duration: {
73
107
  type: duration.type,
74
108
  value: duration.value
@@ -81,7 +115,7 @@ var TimestampRange = function TimestampRange(_ref) {
81
115
  });
82
116
  }
83
117
 
84
- offsetToTimestamp && handleChange(offsetToTimestamp);
118
+ offsetToTimestamp && handleChange(offsetToTimestamp); // FIXME
85
119
  }
86
120
  };
87
121
 
@@ -106,7 +140,7 @@ var TimestampRange = function TimestampRange(_ref) {
106
140
  onTimestampChange && onTimestampChange(date);
107
141
  },
108
142
  onClear: function onClear() {
109
- onTimestampChange && onTimestampChange(undefined);
143
+ onTimestampChange && onTimestampChange(getValueOnReset()); // FIXME cannot reselect date after clearing
110
144
  },
111
145
  dropdownProps: {
112
146
  getPopupContainer: function getPopupContainer(node) {
@@ -142,7 +176,7 @@ var TimestampRange = function TimestampRange(_ref) {
142
176
  unit: durationUnit,
143
177
  durationModifier: durationModifier,
144
178
  onDurationModifierChange: function onDurationModifierChange(modifier) {
145
- setDurationModifier(modifier);
179
+ setDurationModifier(modifier); // FIXME
146
180
  },
147
181
  texts: texts
148
182
  }));
@@ -1,6 +1,6 @@
1
1
  import { RelativeDateRange } from '../../../date.types';
2
2
  import { RelativeMode, Texts } from '../../../DateRangePicker.types';
3
- export declare type Props = {
3
+ export declare type TimestampRangeProps = {
4
4
  currentRange: RelativeDateRange;
5
5
  currentGroup: string | null;
6
6
  handleChange: (value: RelativeDateRange) => void;
@@ -8,4 +8,9 @@ export declare type Props = {
8
8
  onTimestampChange?: (timestamp: Date | undefined) => void;
9
9
  timestamp?: Date | undefined;
10
10
  texts: Texts;
11
+ getValueOnReset?: (value?: Date) => RelativeDateRange | Date | undefined;
11
12
  };
13
+ /**
14
+ * @deprecated
15
+ */
16
+ export declare type Props = TimestampRangeProps;
@@ -1,9 +1,8 @@
1
1
  import * as React from 'react';
2
2
  import { WrappedComponentProps } from 'react-intl';
3
- import { Props } from './RelativeRangePicker.types';
4
- declare const _default: React.ForwardRefExoticComponent<Pick<Props & WrappedComponentProps<"intl">, "onChange" | "texts" | "value" | "since" | "rangeUnits" | "ranges" | "relativeModes" | "showCustomRange" | "future" | "past"> & {
3
+ declare const _default: React.ForwardRefExoticComponent<Pick<import("./RelativeRangePicker.types").RelativeRangePickerProps & WrappedComponentProps<"intl">, "onChange" | "texts" | "value" | "since" | "rangeUnits" | "ranges" | "relativeModes" | "showCustomRange" | "valueTransformer" | "future" | "past"> & {
5
4
  forwardedRef?: ((instance: any) => void) | React.RefObject<any> | null | undefined;
6
5
  } & React.RefAttributes<any>> & {
7
- WrappedComponent: React.ComponentType<Props & WrappedComponentProps<"intl">>;
6
+ WrappedComponent: React.ComponentType<import("./RelativeRangePicker.types").RelativeRangePickerProps & WrappedComponentProps<"intl">>;
8
7
  };
9
8
  export default _default;
@@ -60,14 +60,15 @@ var RelativeRangePicker = /*#__PURE__*/function (_React$PureComponent) {
60
60
  currentGroup = _this$state.currentGroup,
61
61
  currentRange = _this$state.currentRange;
62
62
 
63
- if (currentGroup !== RANGES_MODE.SINCE) {
64
- var sourceRange = getDefaultCustomRange(currentGroup);
65
- onChange(_objectSpread({}, sourceRange, {
63
+ if (currentGroup === RANGES_MODE.SINCE) {
64
+ onChange(_objectSpread({}, currentRange, {
65
+ type: 'RELATIVE',
66
66
  key: undefined,
67
67
  translationKey: CUSTOM_RANGE_KEY
68
- }));
68
+ })); // FIXME: make currentGroup rely on value rather than state
69
69
  } else {
70
- onChange(_objectSpread({}, currentRange, {
70
+ var sourceRange = getDefaultCustomRange(currentGroup);
71
+ onChange(_objectSpread({}, sourceRange, {
71
72
  key: undefined,
72
73
  translationKey: CUSTOM_RANGE_KEY
73
74
  }));
@@ -77,11 +78,13 @@ var RelativeRangePicker = /*#__PURE__*/function (_React$PureComponent) {
77
78
  _defineProperty(_assertThisInitialized(_this), "onChange", function (value) {
78
79
  var currentGroup = _this.state.currentGroup;
79
80
  var onChange = _this.props.onChange;
80
- var isFuture = value.timestamp && fnsIsAfter(value.timestamp, new Date());
81
+ var isSince = currentGroup === RANGES_MODE.SINCE;
82
+ var isFuture = isSince ? value.future : value.timestamp && fnsIsAfter(value.timestamp, new Date()); // FIXME since past/future
81
83
 
82
84
  var changes = _objectSpread({}, setFuture(currentGroup === RANGES_MODE.FUTURE || isFuture, value), {
83
- key: undefined
84
- });
85
+ type: 'RELATIVE'
86
+ }); // eslint-disable-next-line @typescript-eslint/no-explicit-any
87
+
85
88
 
86
89
  onChange(normalizeRange(changes));
87
90
  });
@@ -106,12 +109,14 @@ var RelativeRangePicker = /*#__PURE__*/function (_React$PureComponent) {
106
109
  var currentRange = _this.state.currentRange;
107
110
  var _this$props2 = _this.props,
108
111
  onChange = _this$props2.onChange,
109
- texts = _this$props2.texts;
112
+ texts = _this$props2.texts,
113
+ valueTransformer = _this$props2.valueTransformer;
110
114
  return /*#__PURE__*/React.createElement(RangeDropdown, {
111
115
  ranges: ranges,
112
116
  currentRange: currentRange,
113
117
  texts: texts,
114
- onChange: onChange
118
+ onChange: onChange,
119
+ valueTransformer: valueTransformer
115
120
  });
116
121
  });
117
122
 
@@ -233,7 +238,10 @@ _defineProperty(RelativeRangePicker, "defaultProps", {
233
238
  ranges: [].concat(CONST.RELATIVE_PRESETS, CONST.ABSOLUTE_PRESETS),
234
239
  relativeModes: ['PAST', 'FUTURE'],
235
240
  rangeUnits: CONST.RELATIVE_UNITS,
236
- showCustomRange: true
241
+ showCustomRange: true,
242
+ valueTransformer: function valueTransformer(e) {
243
+ return e;
244
+ }
237
245
  });
238
246
 
239
247
  export default injectIntl(RelativeRangePicker);
@@ -1,7 +1,7 @@
1
1
  import { IntlShape } from 'react-intl';
2
2
  import { DateRange, RelativeDateRange } from '../date.types';
3
- import { Props as DateRangePickerProps, RelativeMode, Texts } from '../DateRangePicker.types';
4
- export declare type Props = {
3
+ import { DateRangePickerProps, RelativeMode, Texts } from '../DateRangePicker.types';
4
+ export declare type RelativeRangePickerProps = {
5
5
  ranges?: DateRange[];
6
6
  value: DateRange;
7
7
  onChange: (range: DateRange | undefined) => void;
@@ -13,6 +13,7 @@ export declare type Props = {
13
13
  relativeModes?: RelativeMode[];
14
14
  rangeUnits: DateRangePickerProps['rangeUnits'];
15
15
  showCustomRange?: boolean;
16
+ valueTransformer?: (e: RelativeDateRange | any) => RelativeDateRange | any;
16
17
  };
17
18
  export declare type State = {
18
19
  currentGroup: RelativeMode | null;
@@ -23,3 +24,7 @@ export declare type State = {
23
24
  groupedRanges?: DateRange[];
24
25
  sinceTimestamp?: Date | undefined;
25
26
  };
27
+ /**
28
+ * @deprecated use `RelativeRangePickerProps`
29
+ */
30
+ export declare type Props = RelativeRangePickerProps;
@@ -2,7 +2,7 @@ import { AbsoluteDateRange, RelativeDateRange, RelativeUnits, RangeKey } from '.
2
2
  export declare const SECONDS = "SECONDS";
3
3
  export declare const MINUTES = "MINUTES";
4
4
  export declare const HOURS = "HOURS";
5
- export declare const DAYS = "DAYS";
5
+ export declare const DAYS: RelativeUnits;
6
6
  export declare const WEEKS = "WEEKS";
7
7
  export declare const MONTHS = "MONTHS";
8
8
  export declare const YEARS = "YEARS";
@@ -15,8 +15,8 @@ export declare const ALL_TIME: RangeKey;
15
15
  export declare const range: (start: number, end: number) => number[];
16
16
  export declare const CUSTOM_RANGE_KEY = "custom";
17
17
  export declare const DURATION_MODIFIERS: {
18
- LAST: string;
19
- NEXT: string;
18
+ readonly LAST: "timestampLast";
19
+ readonly NEXT: "timestampNext";
20
20
  };
21
21
  export declare const RELATIVE_PRESETS: RelativeDateRange[];
22
22
  export declare const ABSOLUTE_PRESETS: AbsoluteDateRange[];
@@ -1,5 +1,7 @@
1
1
  import * as React from 'react';
2
- export declare type RelativeUnits = 'SECONDS' | 'MINUTES' | 'HOURS' | 'DAYS' | 'WEEKS' | 'MONTHS' | 'YEARS';
2
+ import type startOf from './dateUtils/startOf';
3
+ import type endOf from './dateUtils/endOf';
4
+ export declare type RelativeUnits = 'SECONDS' | 'MINUTES' | 'HOURS' | 'DAYS' | 'WEEKS' | 'MONTHS' | 'YEARS' | 'SINCE' | keyof typeof startOf | keyof typeof endOf;
3
5
  export declare type RangeKey = 'TODAY' | 'YESTERDAY' | 'TOMORROW' | 'LAST_WEEK' | 'THIS_WEEK' | 'NEXT_WEEK' | 'LAST_7_DAYS' | 'NEXT_7_DAYS' | 'LAST_MONTH' | 'THIS_MONTH' | 'NEXT_MONTH' | 'LAST_3_MONTHS' | 'NEXT_3_MONTHS' | 'LAST_6_MONTHS' | 'NEXT_6_MONTHS' | 'LAST_YEAR' | 'NEXT_YEAR' | 'ALL_TIME';
4
6
  export declare type NullableDateLimit = null | string | Date;
5
7
  export interface DateFilter {
package/dist/utils.d.ts CHANGED
@@ -1,6 +1,9 @@
1
1
  import { IntlShape } from 'react-intl';
2
2
  import { DateRange } from './date.types';
3
+ import START_OF from './dateUtils/startOf';
4
+ import END_OF from './dateUtils/endOf';
3
5
  import { Texts } from './DateRangePicker.types';
6
+ export { START_OF, END_OF };
4
7
  export declare const normalizeRange: (range: DateRange) => DateRange;
5
8
  export declare const getDefaultTexts: (intl: IntlShape, disableDefault?: boolean | undefined, texts?: Partial<Texts> | undefined) => Texts;
6
9
  export declare const DEFAULT_RANGE: DateRange;
package/dist/utils.js CHANGED
@@ -12,12 +12,12 @@ import { ABSOLUTE, CUSTOM_RANGE_KEY, RELATIVE } from './constants';
12
12
  import ADD from './dateUtils/add';
13
13
  import START_OF from './dateUtils/startOf';
14
14
  import END_OF from './dateUtils/endOf';
15
+ export { START_OF, END_OF };
15
16
  export var normalizeRange = function normalizeRange(range) {
16
17
  if (!range || !range.type) {
17
18
  return {
18
19
  type: ABSOLUTE,
19
- from: undefined,
20
- to: undefined
20
+ from: undefined
21
21
  };
22
22
  }
23
23
 
@@ -29,7 +29,15 @@ export var normalizeRange = function normalizeRange(range) {
29
29
  var left;
30
30
  var right;
31
31
 
32
- if (future) {
32
+ if ((offset == null ? void 0 : offset.type) === 'SINCE') {
33
+ if (future) {
34
+ left = offset.value;
35
+ right = ADD[duration.type](offset.value, duration.value);
36
+ } else {
37
+ left = ADD[duration.type](offset.value, -duration.value);
38
+ right = offset.value;
39
+ }
40
+ } else if (future) {
33
41
  left = ADD[offset.type](START_OF[offset.type](now), offset.value);
34
42
  right = ADD[duration.type](END_OF[duration.type](left), duration.value - 1);
35
43
  } else {
@@ -53,11 +61,12 @@ export var normalizeRange = function normalizeRange(range) {
53
61
  return normalizedRange;
54
62
  }
55
63
 
64
+ var keys = Object.keys(range);
56
65
  var from = range.from ? legacyParse(range.from) : undefined;
57
66
  var to = range.to ? legacyParse(range.to) : undefined;
58
67
 
59
68
  var dropNonAbsolute = function dropNonAbsolute(dateRange) {
60
- return omit(dateRange, ['offset', 'duration']);
69
+ return omit(dateRange, ['offset', 'duration', 'future']);
61
70
  };
62
71
 
63
72
  var absoluteRange = _objectSpread({}, dropNonAbsolute(range), {
@@ -65,6 +74,10 @@ export var normalizeRange = function normalizeRange(range) {
65
74
  to: to
66
75
  });
67
76
 
77
+ if (!keys.includes('from') && !keys.includes('to')) {
78
+ absoluteRange.translationKey = 'allTime';
79
+ }
80
+
68
81
  return absoluteRange;
69
82
  };
70
83
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synerise/ds-date-range-picker",
3
- "version": "0.17.3",
3
+ "version": "0.17.4",
4
4
  "description": "Date-Range-Picker UI Component for the Synerise Design System",
5
5
  "license": "ISC",
6
6
  "repository": "Synerise/synerise-design",
@@ -54,5 +54,5 @@
54
54
  "devDependencies": {
55
55
  "@types/ramda": "^0.27.14"
56
56
  },
57
- "gitHead": "41d417bdee4ee513979582394f0b4cdcdb2fed2f"
57
+ "gitHead": "664dece0bd2c724cd411f46b35503fcb409b741e"
58
58
  }