@synerise/ds-factors 1.1.13 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,25 @@
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
+ # [1.2.0](https://github.com/Synerise/synerise-design/compare/@synerise/ds-factors@1.1.14...@synerise/ds-factors@1.2.0) (2025-06-05)
7
+
8
+
9
+ ### Features
10
+
11
+ * **factors:** relative date type ([e3d17f1](https://github.com/Synerise/synerise-design/commit/e3d17f18350044322c06c6b51263d69f97ee7dba))
12
+
13
+
14
+
15
+
16
+
17
+ ## [1.1.14](https://github.com/Synerise/synerise-design/compare/@synerise/ds-factors@1.1.13...@synerise/ds-factors@1.1.14) (2025-06-03)
18
+
19
+ **Note:** Version bump only for package @synerise/ds-factors
20
+
21
+
22
+
23
+
24
+
6
25
  ## [1.1.13](https://github.com/Synerise/synerise-design/compare/@synerise/ds-factors@1.1.12...@synerise/ds-factors@1.1.13) (2025-06-02)
7
26
 
8
27
  **Note:** Version bump only for package @synerise/ds-factors
@@ -1,4 +1,4 @@
1
1
  import React from 'react';
2
2
  import { FactorValueProps } from '../Factors.types';
3
- declare const FactorValue: ({ selectedFactorType, value, onChangeValue, onParamsClick, selectedFactor, textType, parameters, autocompleteText, withoutTypeSelector, texts, formulaEditor, opened, loading, factorKey, preventAutoloadData, getPopupContainerOverride, onActivate, onDeactivate, error, inputProps, allowClear, readOnly, getMenuEntryProps, }: FactorValueProps) => React.JSX.Element;
3
+ declare const FactorValue: ({ selectedFactorType, value, onChangeValue, onParamsClick, selectedFactor, textType, parameters, autocompleteText, withoutTypeSelector, texts, formulaEditor, opened, loading, factorKey, preventAutoloadData, getPopupContainerOverride, onActivate, onDeactivate, error, inputProps, allowClear, readOnly, getMenuEntryProps, relativeDateProps, }: FactorValueProps) => React.JSX.Element;
4
4
  export default FactorValue;
@@ -1,3 +1,4 @@
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
1
2
  import React from 'react';
2
3
  import * as S from './FactorValue.style';
3
4
  var FactorValue = function FactorValue(_ref) {
@@ -25,13 +26,14 @@ var FactorValue = function FactorValue(_ref) {
25
26
  allowClear = _ref.allowClear,
26
27
  _ref$readOnly = _ref.readOnly,
27
28
  readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
28
- getMenuEntryProps = _ref.getMenuEntryProps;
29
+ getMenuEntryProps = _ref.getMenuEntryProps,
30
+ relativeDateProps = _ref.relativeDateProps;
29
31
  var inputType = React.useMemo(function () {
30
32
  if (!selectedFactor) {
31
33
  return undefined;
32
34
  }
33
35
  var FactorValueComponent = selectedFactor.component;
34
- return /*#__PURE__*/React.createElement(FactorValueComponent, {
36
+ return /*#__PURE__*/React.createElement(FactorValueComponent, _extends({
35
37
  key: factorKey + "-" + selectedFactor.name,
36
38
  value: value
37
39
  // placeholder={texts.valuePlaceholder}
@@ -43,7 +45,6 @@ var FactorValue = function FactorValue(_ref) {
43
45
  parameters: ['parameter', 'contextParameter'].indexOf(selectedFactorType) >= 0 ? parameters : undefined,
44
46
  withoutTypeSelector: withoutTypeSelector,
45
47
  texts: texts,
46
- inputProps: inputProps,
47
48
  formulaEditor: formulaEditor,
48
49
  opened: opened,
49
50
  loading: loading,
@@ -55,9 +56,10 @@ var FactorValue = function FactorValue(_ref) {
55
56
  error: error,
56
57
  allowClear: allowClear,
57
58
  readOnly: readOnly,
58
- getMenuEntryProps: getMenuEntryProps
59
- });
60
- }, [selectedFactor, factorKey, value, texts, onChangeValue, textType, selectedFactorType, autocompleteText, parameters, withoutTypeSelector, inputProps, formulaEditor, opened, loading, onParamsClick, preventAutoloadData, getPopupContainerOverride, onActivate, onDeactivate, error, allowClear, readOnly, getMenuEntryProps]);
59
+ getMenuEntryProps: getMenuEntryProps,
60
+ inputProps: inputProps
61
+ }, relativeDateProps));
62
+ }, [selectedFactor, factorKey, value, texts, onChangeValue, textType, selectedFactorType, autocompleteText, parameters, withoutTypeSelector, inputProps, formulaEditor, opened, loading, onParamsClick, preventAutoloadData, getPopupContainerOverride, onActivate, onDeactivate, error, allowClear, readOnly, getMenuEntryProps, relativeDateProps]);
61
63
  return /*#__PURE__*/React.createElement(S.FactorInput, {
62
64
  inputType: selectedFactorType,
63
65
  inputTextType: textType,
@@ -0,0 +1,6 @@
1
+ import { RelativeDateUnit, RelativeTimeRelation } from '../../Factors.types';
2
+ export declare const INTERVALS: RelativeDateUnit[];
3
+ export declare const BEFORE: RelativeTimeRelation;
4
+ export declare const AFTER: RelativeTimeRelation;
5
+ export declare const TIME_RELATIONS: ("BEFORE" | "AFTER")[];
6
+ export declare const DEFAULT_VALUE = 1;
@@ -0,0 +1,5 @@
1
+ export var INTERVALS = ['SECONDS', 'MINUTES', 'HOURS', 'DAYS', 'WEEKS', 'MONTHS', 'YEARS'];
2
+ export var BEFORE = 'BEFORE';
3
+ export var AFTER = 'AFTER';
4
+ export var TIME_RELATIONS = [BEFORE, AFTER];
5
+ export var DEFAULT_VALUE = 1;
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { FactorValueComponentProps } from '../../Factors.types';
3
+ declare const RelativeDateInput: ({ value, onChange, texts: allTexts, opened, onDeactivate, onActivate, error, allowClear, readOnly, triggerValueFormatter, getPopupContainerOverride, availableUnits, }: FactorValueComponentProps) => React.JSX.Element;
4
+ export default RelativeDateInput;
@@ -0,0 +1,107 @@
1
+ import React, { useCallback, useEffect, useMemo, useState } from 'react';
2
+ import { useTheme } from '@synerise/ds-core';
3
+ import { getPopupContainer } from '@synerise/ds-utils';
4
+ import Dropdown from '@synerise/ds-dropdown';
5
+ import Icon, { AngleDownS, Close3S } from '@synerise/ds-icon';
6
+ import { RelativeDateDropdown } from './RelativeDateDropdown';
7
+ import * as S from './RelativeDateDropdown.styles';
8
+ import { defaultTriggerModifier } from './RelativeDate.utils';
9
+ var RelativeDateInput = function RelativeDateInput(_ref) {
10
+ var value = _ref.value,
11
+ onChange = _ref.onChange,
12
+ allTexts = _ref.texts,
13
+ opened = _ref.opened,
14
+ onDeactivate = _ref.onDeactivate,
15
+ onActivate = _ref.onActivate,
16
+ error = _ref.error,
17
+ allowClear = _ref.allowClear,
18
+ _ref$readOnly = _ref.readOnly,
19
+ readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
20
+ triggerValueFormatter = _ref.triggerValueFormatter,
21
+ getPopupContainerOverride = _ref.getPopupContainerOverride,
22
+ availableUnits = _ref.availableUnits;
23
+ var _useState = useState(opened),
24
+ isOpen = _useState[0],
25
+ setIsOpen = _useState[1];
26
+ var _useState2 = useState(value),
27
+ localValue = _useState2[0],
28
+ setLocalValue = _useState2[1];
29
+ var theme = useTheme();
30
+ var texts = allTexts.relativeDate;
31
+ useEffect(function () {
32
+ setLocalValue(value);
33
+ }, [value]);
34
+ var handleOpenChange = useCallback(function (open) {
35
+ if (!open) {
36
+ onDeactivate && onDeactivate();
37
+ } else {
38
+ onActivate && onActivate();
39
+ }
40
+ setIsOpen(open);
41
+ }, [onActivate, onDeactivate]);
42
+ var handleApply = useCallback(function (date) {
43
+ onChange(date);
44
+ handleOpenChange(false);
45
+ }, [onChange, handleOpenChange]);
46
+ var handleClear = useCallback(function () {
47
+ onChange(undefined);
48
+ }, [onChange]);
49
+ var handleOpen = useCallback(function () {
50
+ setIsOpen(true);
51
+ }, []);
52
+ var handleClose = useCallback(function () {
53
+ setIsOpen(false);
54
+ }, []);
55
+ var triggerValue = useMemo(function () {
56
+ if (!localValue) {
57
+ return undefined;
58
+ }
59
+ return triggerValueFormatter ? triggerValueFormatter(localValue) : defaultTriggerModifier(localValue, texts);
60
+ }, [texts, localValue, triggerValueFormatter]);
61
+ var icon = useMemo(function () {
62
+ if (!localValue || !allowClear) return /*#__PURE__*/React.createElement(Icon, {
63
+ component: /*#__PURE__*/React.createElement(AngleDownS, null),
64
+ onClick: handleOpen
65
+ });
66
+ return /*#__PURE__*/React.createElement(S.IconWrapper, null, /*#__PURE__*/React.createElement(S.ChevronIcon, {
67
+ onClick: handleOpen,
68
+ component: /*#__PURE__*/React.createElement(AngleDownS, null)
69
+ }), /*#__PURE__*/React.createElement(S.ClearIcon, {
70
+ onClick: handleClear,
71
+ color: theme.palette['red-600'],
72
+ component: /*#__PURE__*/React.createElement(Close3S, null)
73
+ }));
74
+ }, [localValue, allowClear, handleClear, handleOpen, theme.palette]);
75
+ var trigger = useMemo(function () {
76
+ return /*#__PURE__*/React.createElement(S.Trigger, {
77
+ "data-testid": "ds-factors-relative-date-trigger",
78
+ error: error,
79
+ readOnly: true,
80
+ autoResize: {
81
+ minWidth: '123px',
82
+ stretchToFit: true
83
+ },
84
+ autoResizeProps: {
85
+ placeholderIsMinWidth: true
86
+ },
87
+ placeholder: texts.triggerPlaceholder,
88
+ value: triggerValue,
89
+ icon1: !readOnly ? icon : undefined
90
+ });
91
+ }, [error, triggerValue, readOnly, icon, texts.triggerPlaceholder]);
92
+ return readOnly ? trigger : /*#__PURE__*/React.createElement(Dropdown, {
93
+ getPopupContainer: getPopupContainerOverride || getPopupContainer,
94
+ open: isOpen,
95
+ onOpenChange: handleOpenChange,
96
+ dropdownRender: function dropdownRender() {
97
+ return /*#__PURE__*/React.createElement(RelativeDateDropdown, {
98
+ onApply: handleApply,
99
+ onCancel: handleClose,
100
+ value: localValue,
101
+ texts: texts,
102
+ availableUnits: availableUnits
103
+ });
104
+ }
105
+ }, trigger);
106
+ };
107
+ export default RelativeDateInput;
@@ -0,0 +1,3 @@
1
+ import type { RelativeDateFactorTexts, RelativeDateValueType } from '../../Factors.types';
2
+ export declare const getTranslation: (texts: RelativeDateFactorTexts, key: string) => string;
3
+ export declare const defaultTriggerModifier: (value: RelativeDateValueType, texts: RelativeDateFactorTexts) => string;
@@ -0,0 +1,8 @@
1
+ export var getTranslation = function getTranslation(texts, key) {
2
+ return key.toLocaleLowerCase() in texts ? texts[key.toLocaleLowerCase()] : key;
3
+ };
4
+ export var defaultTriggerModifier = function defaultTriggerModifier(value, texts) {
5
+ var relation = value.temporalModifier < 0 ? texts.before : texts.after;
6
+ var absValue = Math.abs(value.temporalModifier);
7
+ return absValue + " " + getTranslation(texts, value.temporalUnit).toLocaleLowerCase() + " " + relation.toLocaleLowerCase() + " " + texts.currentDatetime;
8
+ };
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { RelativeDateFactorTexts, RelativeDateUnit, RelativeDateValueType } from '../../Factors.types';
3
+ type RelativeDateDropdownProps = {
4
+ value?: RelativeDateValueType;
5
+ texts: RelativeDateFactorTexts;
6
+ onApply: (value: RelativeDateValueType) => void;
7
+ onCancel: () => void;
8
+ availableUnits?: RelativeDateUnit[];
9
+ };
10
+ export declare const RelativeDateDropdown: ({ onApply, onCancel, value: relativeDateValue, texts, availableUnits, }: RelativeDateDropdownProps) => React.JSX.Element;
11
+ export {};
@@ -0,0 +1,97 @@
1
+ import React, { useEffect, useMemo, useState } from 'react';
2
+ import Button from '@synerise/ds-button';
3
+ import { InputGroup } from '@synerise/ds-input';
4
+ import Select from '@synerise/ds-select/dist/Select';
5
+ import InputNumber from '@synerise/ds-input-number';
6
+ import { AFTER, BEFORE, DEFAULT_VALUE, INTERVALS, TIME_RELATIONS } from './RelativeDate.const';
7
+ import * as S from './RelativeDateDropdown.styles';
8
+ import { getTranslation } from './RelativeDate.utils';
9
+ var getRelationForModifier = function getRelationForModifier(value) {
10
+ return value < 0 ? BEFORE : AFTER;
11
+ };
12
+ export var RelativeDateDropdown = function RelativeDateDropdown(_ref) {
13
+ var onApply = _ref.onApply,
14
+ onCancel = _ref.onCancel,
15
+ relativeDateValue = _ref.value,
16
+ texts = _ref.texts,
17
+ availableUnits = _ref.availableUnits;
18
+ var defaultTimeRelation = relativeDateValue ? getRelationForModifier(relativeDateValue.temporalModifier) : BEFORE;
19
+ var defaultTemporalUnit = (relativeDateValue == null ? void 0 : relativeDateValue.temporalUnit) || (availableUnits != null && availableUnits.length ? availableUnits : INTERVALS)[0];
20
+ var defaultModifier = Math.abs((relativeDateValue == null ? void 0 : relativeDateValue.temporalModifier) || DEFAULT_VALUE);
21
+ var _useState = useState(defaultTimeRelation),
22
+ timeRelation = _useState[0],
23
+ setTimeRelation = _useState[1];
24
+ var _useState2 = useState(defaultTemporalUnit),
25
+ temporalUnit = _useState2[0],
26
+ setTemporalUnit = _useState2[1];
27
+ var _useState3 = useState(defaultModifier),
28
+ temporalModifier = _useState3[0],
29
+ setTemporalModifier = _useState3[1];
30
+ useEffect(function () {
31
+ setTimeRelation(relativeDateValue ? getRelationForModifier(relativeDateValue.temporalModifier) : BEFORE);
32
+ setTemporalUnit((relativeDateValue == null ? void 0 : relativeDateValue.temporalUnit) || INTERVALS[0]);
33
+ setTemporalModifier(Math.abs((relativeDateValue == null ? void 0 : relativeDateValue.temporalModifier) || DEFAULT_VALUE));
34
+ }, [relativeDateValue]);
35
+ var isApplyEnabled = temporalModifier && temporalUnit !== undefined;
36
+ var handleApply = function handleApply() {
37
+ var finalModifier = timeRelation === BEFORE ? -temporalModifier : temporalModifier;
38
+ isApplyEnabled && onApply({
39
+ temporalModifier: finalModifier,
40
+ temporalUnit: temporalUnit
41
+ });
42
+ };
43
+ var temporalUnitOptions = useMemo(function () {
44
+ return (availableUnits != null && availableUnits.length ? availableUnits : INTERVALS).map(function (intervalOption) {
45
+ return /*#__PURE__*/React.createElement(Select.Option, {
46
+ key: intervalOption,
47
+ value: intervalOption
48
+ }, getTranslation(texts, intervalOption));
49
+ });
50
+ }, [texts, availableUnits]);
51
+ var timeRelationOptions = useMemo(function () {
52
+ return TIME_RELATIONS.map(function (option) {
53
+ return /*#__PURE__*/React.createElement(Select.Option, {
54
+ key: option,
55
+ value: option
56
+ }, getTranslation(texts, option));
57
+ });
58
+ }, [texts]);
59
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(S.RelativeDateDropdownWrapper, {
60
+ "data-testid": "ds-factors-relative-date-dropdown"
61
+ }, /*#__PURE__*/React.createElement(InputGroup, {
62
+ resetMargin: true,
63
+ compact: true
64
+ }, /*#__PURE__*/React.createElement(InputNumber, {
65
+ "data-testid": "ds-factors-relative-date-modifier",
66
+ defaultValue: 1,
67
+ min: 1,
68
+ raw: true,
69
+ value: temporalModifier,
70
+ onChange: function onChange(newTemporalModifier) {
71
+ return newTemporalModifier && setTemporalModifier(newTemporalModifier);
72
+ }
73
+ }), /*#__PURE__*/React.createElement(Select, {
74
+ value: temporalUnit,
75
+ "data-testid": "ds-factors-relative-date-unit",
76
+ defaultValue: defaultTemporalUnit,
77
+ onChange: function onChange(newTemporalUnit) {
78
+ setTemporalUnit(newTemporalUnit);
79
+ },
80
+ dropdownMatchSelectWidth: false
81
+ }, temporalUnitOptions)), /*#__PURE__*/React.createElement(Select, {
82
+ value: timeRelation,
83
+ "data-testid": "ds-factors-relative-date-relation",
84
+ defaultValue: defaultTimeRelation,
85
+ onChange: function onChange(newTimeRelation) {
86
+ setTimeRelation(newTimeRelation);
87
+ },
88
+ dropdownMatchSelectWidth: false
89
+ }, timeRelationOptions), /*#__PURE__*/React.createElement(S.RelativeDateCurrentLabel, null, texts.currentDatetime)), /*#__PURE__*/React.createElement(S.RelativeDateDropdownFooter, null, /*#__PURE__*/React.createElement(Button, {
90
+ type: "ghost",
91
+ onClick: onCancel
92
+ }, texts.cancel), /*#__PURE__*/React.createElement(Button, {
93
+ type: "primary",
94
+ onClick: handleApply,
95
+ disabled: !isApplyEnabled
96
+ }, texts.apply)));
97
+ };
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ export declare const RelativeDateDropdownWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
3
+ export declare const RelativeDateDropdownFooter: import("styled-components").StyledComponent<"div", any, {}, never>;
4
+ export declare const RelativeDateCurrentLabel: import("styled-components").StyledComponent<"div", any, {}, never>;
5
+ export declare const IconWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
6
+ export declare const ClearIcon: import("styled-components").StyledComponent<({ name, component, className, ...rest }: import("@synerise/ds-icon").IconProps) => import("react").JSX.Element, any, {}, never>;
7
+ export declare const ChevronIcon: import("styled-components").StyledComponent<({ name, component, className, ...rest }: import("@synerise/ds-icon").IconProps) => import("react").JSX.Element, any, {}, never>;
8
+ export declare const Trigger: import("styled-components").StyledComponent<({ className, errorText, label, description, counterLimit, tooltip, tooltipConfig, icon1, icon1Tooltip, autoResize, icon2, icon2Tooltip, resetMargin, handleInputRef, prefixel, suffixel, error, expandable, expandableTooltip, renderCustomCounter, autoResizeProps, ...antdInputProps }: import("@synerise/ds-input").InputProps) => import("react").JSX.Element, any, {}, never>;
@@ -0,0 +1,39 @@
1
+ import styled from 'styled-components';
2
+ import Icon from '@synerise/ds-icon';
3
+ import { InputNumberWrapper } from '@synerise/ds-input-number/dist/InputNumber.styles';
4
+ import Dropdown from '@synerise/ds-dropdown';
5
+ import { Input } from '@synerise/ds-input';
6
+ export var RelativeDateDropdownWrapper = styled(Dropdown.Wrapper).withConfig({
7
+ displayName: "RelativeDateDropdownstyles__RelativeDateDropdownWrapper",
8
+ componentId: "sc-1xn8l81-0"
9
+ })(["padding:24px;display:flex;align-items:center;width:100%;gap:8px;min-width:420px;", "{width:70px;}& > *{flex:1 1 auto;}"], InputNumberWrapper);
10
+ export var RelativeDateDropdownFooter = styled.div.withConfig({
11
+ displayName: "RelativeDateDropdownstyles__RelativeDateDropdownFooter",
12
+ componentId: "sc-1xn8l81-1"
13
+ })(["background:", ";display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:8px;"], function (props) {
14
+ return props.theme.palette['grey-100'];
15
+ });
16
+ export var RelativeDateCurrentLabel = styled.div.withConfig({
17
+ displayName: "RelativeDateDropdownstyles__RelativeDateCurrentLabel",
18
+ componentId: "sc-1xn8l81-2"
19
+ })(["font-weight:500;"]);
20
+ export var IconWrapper = styled.div.withConfig({
21
+ displayName: "RelativeDateDropdownstyles__IconWrapper",
22
+ componentId: "sc-1xn8l81-3"
23
+ })([""]);
24
+ export var ClearIcon = styled(Icon).withConfig({
25
+ displayName: "RelativeDateDropdownstyles__ClearIcon",
26
+ componentId: "sc-1xn8l81-4"
27
+ })([""]);
28
+ export var ChevronIcon = styled(Icon).withConfig({
29
+ displayName: "RelativeDateDropdownstyles__ChevronIcon",
30
+ componentId: "sc-1xn8l81-5"
31
+ })([""]);
32
+ export var Trigger = styled(Input).withConfig({
33
+ displayName: "RelativeDateDropdownstyles__Trigger",
34
+ componentId: "sc-1xn8l81-6"
35
+ })(["", "{display:none;}&:hover{", "{display:block;svg{fill:", ";}&:hover svg{fill:", ";}}", "{display:none;}}"], ClearIcon, ClearIcon, function (props) {
36
+ return props.theme.palette['red-600'];
37
+ }, function (props) {
38
+ return props.theme.palette['red-500'];
39
+ }, ChevronIcon);
@@ -1,4 +1,4 @@
1
1
  import React from 'react';
2
2
  import { FactorValueComponentProps } from '../../Factors.types';
3
- declare const TextInput: ({ value, onChange, texts, textType, autocompleteText, factorType, opened, onDeactivate, error, inputProps, getPopupContainerOverride, readOnly, }: FactorValueComponentProps) => React.JSX.Element;
3
+ declare const TextInput: ({ value, onChange, texts, textType, autocompleteText, factorType, opened, onDeactivate, onActivate, error, inputProps, getPopupContainerOverride, readOnly, }: FactorValueComponentProps) => React.JSX.Element;
4
4
  export default TextInput;
@@ -15,6 +15,7 @@ var TextInput = function TextInput(_ref) {
15
15
  factorType = _ref.factorType,
16
16
  opened = _ref.opened,
17
17
  onDeactivate = _ref.onDeactivate,
18
+ onActivate = _ref.onActivate,
18
19
  error = _ref.error,
19
20
  inputProps = _ref.inputProps,
20
21
  getPopupContainerOverride = _ref.getPopupContainerOverride,
@@ -70,6 +71,7 @@ var TextInput = function TextInput(_ref) {
70
71
  value: localValue,
71
72
  onChange: handleAutocomplete,
72
73
  onBlur: onDeactivate,
74
+ onFocus: onActivate,
73
75
  error: localError || error,
74
76
  handleInputRef: setInputRef,
75
77
  defaultOpen: true,
@@ -89,6 +91,7 @@ var TextInput = function TextInput(_ref) {
89
91
  value: localValue,
90
92
  onChange: handleChange,
91
93
  onBlur: onDeactivate,
94
+ onFocus: onActivate,
92
95
  error: localError || error,
93
96
  readOnly: readOnly
94
97
  })));
@@ -109,6 +112,7 @@ var TextInput = function TextInput(_ref) {
109
112
  value: localValue,
110
113
  onChange: handleChange,
111
114
  onBlur: onDeactivate,
115
+ onFocus: onActivate,
112
116
  error: localError || error,
113
117
  readOnly: readOnly
114
118
  }))), /*#__PURE__*/React.createElement(TextModal, {
package/dist/Factors.js CHANGED
@@ -1,6 +1,6 @@
1
1
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
2
  import React, { useMemo } from 'react';
3
- import { BookM, Calendar2M, DynamicKeyM, FormulaM, HashM, ListM, ShowM, TextM } from '@synerise/ds-icon';
3
+ import { BookM, Calendar2M, CalendarSwitchM, DynamicKeyM, FormulaM, HashM, ListM, ShowM, TextM } from '@synerise/ds-icon';
4
4
  import { NOOP } from '@synerise/ds-utils';
5
5
  import * as S from './style/Factors.style';
6
6
  import FactorTypeSelector from './FactorTypeSelector/FactorTypeSelector';
@@ -12,6 +12,7 @@ import TextInput from './FactorValue/Text/Text';
12
12
  import ParameterInput from './FactorValue/Parameter/Parameter';
13
13
  import NumberInput from './FactorValue/Number/NumberInput';
14
14
  import DateRangeInput from './FactorValue/DateRange/DateRange';
15
+ import RelativeDateInput from './FactorValue/RelativeDate/RelativeDate';
15
16
  import { useTexts } from './hooks/useTexts';
16
17
  export var FACTOR_TYPE_MAPPING = {
17
18
  text: {
@@ -54,6 +55,11 @@ export var FACTOR_TYPE_MAPPING = {
54
55
  name: 'Date',
55
56
  component: DateInput
56
57
  },
58
+ relativeDate: {
59
+ icon: /*#__PURE__*/React.createElement(CalendarSwitchM, null),
60
+ name: 'Relative date',
61
+ component: RelativeDateInput
62
+ },
57
63
  dateRange: {
58
64
  icon: /*#__PURE__*/React.createElement(Calendar2M, null),
59
65
  name: 'Date range',
@@ -1,14 +1,20 @@
1
1
  import type { ReactText, ReactNode, ComponentType } from 'react';
2
- import type { DateFilter } from '@synerise/ds-date-range-picker/dist/date.types';
2
+ import type { DateFilter, RelativeUnits } from '@synerise/ds-date-range-picker/dist/date.types';
3
3
  import type { Texts as DateRangeTexts } from '@synerise/ds-date-range-picker/dist/DateRangePicker.types';
4
4
  import type { MenuItemProps } from '@synerise/ds-menu';
5
- import type { AutoResizeProp } from '@synerise/ds-input';
5
+ import type { AutoResizeProp, InputProps } from '@synerise/ds-input';
6
6
  import type { InformationCardProps } from '@synerise/ds-information-card';
7
7
  import type { ListItemProps } from '@synerise/ds-list-item';
8
8
  import type { LiteralStringUnion, DeepPartial } from '@synerise/ds-utils';
9
- export declare const ALL_FACTOR_TYPES: readonly ["text", "number", "parameter", "contextParameter", "dynamicKey", "formula", "array", "date", "dateRange"];
9
+ export declare const ALL_FACTOR_TYPES: readonly ["text", "number", "parameter", "contextParameter", "dynamicKey", "formula", "array", "date", "relativeDate", "dateRange"];
10
10
  export type FactorType = LiteralStringUnion<typeof ALL_FACTOR_TYPES[number]>;
11
11
  export type DefinedFactorTypes = typeof ALL_FACTOR_TYPES[number];
12
+ export type RelativeDateUnit = Exclude<RelativeUnits, 'SINCE'>;
13
+ export type RelativeTimeRelation = 'BEFORE' | 'AFTER';
14
+ export type RelativeDateValueType = {
15
+ temporalUnit: RelativeDateUnit;
16
+ temporalModifier: number;
17
+ };
12
18
  export type DynamicKeyValueType = {
13
19
  key: ReactText;
14
20
  value: ReactText;
@@ -45,12 +51,28 @@ export type ParameterItem = {
45
51
  disabled?: boolean;
46
52
  excludeFromSearchResults?: boolean;
47
53
  };
48
- export type FactorValueType = string | number | null | Date | undefined | DynamicKeyValueType | FormulaValueType | ParameterValueType | Partial<DateFilter>;
54
+ export type FactorValueType = string | number | null | Date | RelativeDateValueType | undefined | DynamicKeyValueType | FormulaValueType | ParameterValueType | Partial<DateFilter>;
49
55
  export type SelectedFactorType = {
50
56
  name: string;
51
57
  icon: ReactNode;
52
58
  component: ComponentType<FactorValueComponentProps>;
53
59
  };
60
+ export type RelativeDateFactorTexts = {
61
+ triggerValue: string;
62
+ triggerPlaceholder: string;
63
+ currentDatetime: ReactNode;
64
+ seconds: string;
65
+ minutes: string;
66
+ hours: string;
67
+ days: string;
68
+ weeks: string;
69
+ months: string;
70
+ years: string;
71
+ before: string;
72
+ after: string;
73
+ apply: ReactNode;
74
+ cancel: ReactNode;
75
+ };
54
76
  export type FactorsTexts = {
55
77
  dateRangePicker: DateRangeTexts;
56
78
  datePicker: {
@@ -75,6 +97,7 @@ export type FactorsTexts = {
75
97
  recentItemsGroupName: string;
76
98
  allItemsGroupName: string;
77
99
  };
100
+ relativeDate: RelativeDateFactorTexts;
78
101
  valuePlaceholder: string;
79
102
  modalApply: string;
80
103
  modalCancel: string;
@@ -102,6 +125,10 @@ export type FactorsProps = {
102
125
  value: FactorValueType;
103
126
  textType?: LiteralStringUnion<'autocomplete' | 'expansible' | 'default'>;
104
127
  autoResize?: AutoResizeProp;
128
+ relativeDateProps?: {
129
+ triggerValueFormatter?: (value: RelativeDateValueType) => string;
130
+ availableUnits?: RelativeDateUnit[];
131
+ };
105
132
  autocompleteText?: {
106
133
  options: string[];
107
134
  };
@@ -127,8 +154,7 @@ export type FactorsProps = {
127
154
  allowClear?: boolean;
128
155
  loading?: boolean;
129
156
  preventAutoloadData?: boolean;
130
- withCustomFactor?: ReactNode;
131
- inputProps?: Partial<FactorValueComponentProps>;
157
+ inputProps?: Partial<Omit<InputProps, 'handleInputRef' | 'defaultOpen' | 'placeholder' | 'value' | 'onChange' | 'onBlur' | 'error' | 'getPopupContainer' | 'readOnly' | 'allowClear'>>;
132
158
  readOnly?: boolean;
133
159
  getMenuEntryProps?: (arg?: ParameterValueType) => MenuItemProps;
134
160
  };
@@ -140,7 +166,7 @@ export type FactorTypeSelectorProps = Pick<FactorsProps, 'unavailableFactorTypes
140
166
  [k in DefinedFactorTypes]: string;
141
167
  };
142
168
  };
143
- export type FactorValueProps = Pick<FactorsProps, 'onChangeValue' | 'onParamsClick' | 'value' | 'selectedFactorType' | 'parameters' | 'autocompleteText' | 'withoutTypeSelector' | 'textType' | 'formulaEditor' | 'opened' | 'loading' | 'factorKey' | 'preventAutoloadData' | 'getPopupContainerOverride' | 'onActivate' | 'onDeactivate' | 'error' | 'allowClear' | 'inputProps' | 'autoResize' | 'readOnly' | 'getMenuEntryProps'> & {
169
+ export type FactorValueProps = Pick<FactorsProps, 'onChangeValue' | 'onParamsClick' | 'value' | 'selectedFactorType' | 'parameters' | 'autocompleteText' | 'withoutTypeSelector' | 'textType' | 'formulaEditor' | 'opened' | 'loading' | 'factorKey' | 'preventAutoloadData' | 'getPopupContainerOverride' | 'onActivate' | 'onDeactivate' | 'error' | 'allowClear' | 'inputProps' | 'autoResize' | 'readOnly' | 'relativeDateProps' | 'getMenuEntryProps'> & {
144
170
  texts: FactorsTexts;
145
171
  selectedFactor: SelectedFactorType;
146
172
  };
@@ -152,7 +178,7 @@ export type FactorValueComponentProps = Pick<FactorsProps, 'value' | 'parameters
152
178
  formulaEditor?: ReactNode;
153
179
  loading?: boolean;
154
180
  preventAutoloadData?: boolean;
155
- };
181
+ } & FactorsProps['relativeDateProps'];
156
182
  export type TextModalProps = {
157
183
  value: string;
158
184
  onApply: (value: string) => void;
@@ -1 +1 @@
1
- export var ALL_FACTOR_TYPES = ['text', 'number', 'parameter', 'contextParameter', 'dynamicKey', 'formula', 'array', 'date', 'dateRange'];
1
+ export var ALL_FACTOR_TYPES = ['text', 'number', 'parameter', 'contextParameter', 'dynamicKey', 'formula', 'array', 'date', 'relativeDate', 'dateRange'];
@@ -35,6 +35,68 @@ export var useTexts = function useTexts(defaultTexts) {
35
35
  defaultMessage: 'Value'
36
36
  })
37
37
  },
38
+ relativeDate: {
39
+ currentDatetime: intl.formatMessage({
40
+ id: 'DS.FACTORS.RELATIVE_DATE.CURRENT_DATETIME',
41
+ defaultMessage: 'current datetime'
42
+ }),
43
+ seconds: intl.formatMessage({
44
+ id: 'DS.FACTORS.RELATIVE_DATE.SECONDS',
45
+ defaultMessage: 'Seconds'
46
+ }),
47
+ minutes: intl.formatMessage({
48
+ id: 'DS.FACTORS.RELATIVE_DATE.MINUTE',
49
+ defaultMessage: 'Minutes'
50
+ }),
51
+ hours: intl.formatMessage({
52
+ id: 'DS.FACTORS.RELATIVE_DATE.HOURS',
53
+ defaultMessage: 'Hours'
54
+ }),
55
+ days: intl.formatMessage({
56
+ id: 'DS.FACTORS.RELATIVE_DATE.DAYS',
57
+ defaultMessage: 'Days'
58
+ }),
59
+ weeks: intl.formatMessage({
60
+ id: 'DS.FACTORS.RELATIVE_DATE.WEEKS',
61
+ defaultMessage: 'Weeks'
62
+ }),
63
+ months: intl.formatMessage({
64
+ id: 'DS.FACTORS.RELATIVE_DATE.MONTHS',
65
+ defaultMessage: 'Months'
66
+ }),
67
+ years: intl.formatMessage({
68
+ id: 'DS.FACTORS.RELATIVE_DATE.YEARS',
69
+ defaultMessage: 'Years'
70
+ }),
71
+ before: intl.formatMessage({
72
+ id: 'DS.FACTORS.RELATIVE_DATE.BEFORE',
73
+ defaultMessage: 'Before'
74
+ }),
75
+ after: intl.formatMessage({
76
+ id: 'DS.FACTORS.RELATIVE_DATE.AFTER',
77
+ defaultMessage: 'After'
78
+ }),
79
+ apply: intl.formatMessage({
80
+ id: 'DS.FACTORS.RELATIVE_DATE.APPLY',
81
+ defaultMessage: 'Apply'
82
+ }),
83
+ cancel: intl.formatMessage({
84
+ id: 'DS.FACTORS.RELATIVE_DATE.CANCEL',
85
+ defaultMessage: 'Cancel'
86
+ }),
87
+ triggerPlaceholder: intl.formatMessage({
88
+ id: 'DS.FACTORS.RELATIVE_DATE.TRIGGER_PLACEHOLDER',
89
+ defaultMessage: 'Select date'
90
+ }),
91
+ triggerValue: intl.formatMessage({
92
+ id: 'DS.FACTORS.RELATIVE_DATE.TRIGGER_VALUE',
93
+ defaultMessage: '{value} {interval} {timeRelation} current datetime'
94
+ }, {
95
+ value: '1',
96
+ interval: 'days',
97
+ timeRelation: 'before'
98
+ })
99
+ },
38
100
  formula: {
39
101
  buttonPlaceholder: intl.formatMessage({
40
102
  id: 'DS.FACTORS.FORMULA.BUTTON_PLACEHOLDER',
@@ -120,6 +182,10 @@ export var useTexts = function useTexts(defaultTexts) {
120
182
  id: 'DS.FACTORS.FACTOR_TYPES.DATE',
121
183
  defaultMessage: 'Date'
122
184
  }),
185
+ relativeDate: intl.formatMessage({
186
+ id: 'DS.FACTORS.FACTOR_TYPES.RELATIVE_DATE',
187
+ defaultMessage: 'Relative date'
188
+ }),
123
189
  dateRange: intl.formatMessage({
124
190
  id: 'DS.FACTORS.FACTOR_TYPES.DATE_RANGE',
125
191
  defaultMessage: 'Date range'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synerise/ds-factors",
3
- "version": "1.1.13",
3
+ "version": "1.2.0",
4
4
  "description": "Factors UI Component for the Synerise Design System",
5
5
  "license": "ISC",
6
6
  "repository": "Synerise/synerise-design",
@@ -34,26 +34,26 @@
34
34
  ],
35
35
  "types": "dist/index.d.ts",
36
36
  "dependencies": {
37
- "@synerise/ds-autocomplete": "^1.1.4",
38
- "@synerise/ds-badge": "^1.0.9",
39
- "@synerise/ds-button": "^1.3.1",
40
- "@synerise/ds-date-picker": "^1.1.4",
41
- "@synerise/ds-date-range-picker": "^1.3.3",
42
- "@synerise/ds-dropdown": "^1.0.9",
43
- "@synerise/ds-icon": "^1.5.1",
44
- "@synerise/ds-information-card": "^1.0.11",
45
- "@synerise/ds-inline-edit": "^1.0.10",
46
- "@synerise/ds-input": "^1.1.4",
47
- "@synerise/ds-input-number": "^1.1.4",
48
- "@synerise/ds-list-item": "^1.0.9",
49
- "@synerise/ds-menu": "^1.0.9",
50
- "@synerise/ds-modal": "^1.1.2",
51
- "@synerise/ds-result": "^1.0.9",
52
- "@synerise/ds-scrollbar": "^1.0.9",
53
- "@synerise/ds-skeleton": "^1.0.10",
54
- "@synerise/ds-tabs": "^1.0.9",
55
- "@synerise/ds-tooltip": "^1.1.8",
56
- "@synerise/ds-utils": "^1.1.1",
37
+ "@synerise/ds-autocomplete": "^1.1.5",
38
+ "@synerise/ds-badge": "^1.0.10",
39
+ "@synerise/ds-button": "^1.3.3",
40
+ "@synerise/ds-date-picker": "^1.1.6",
41
+ "@synerise/ds-date-range-picker": "^1.3.5",
42
+ "@synerise/ds-dropdown": "^1.0.10",
43
+ "@synerise/ds-icon": "^1.5.2",
44
+ "@synerise/ds-information-card": "^1.0.13",
45
+ "@synerise/ds-inline-edit": "^1.0.12",
46
+ "@synerise/ds-input": "^1.2.0",
47
+ "@synerise/ds-input-number": "^1.2.0",
48
+ "@synerise/ds-list-item": "^1.0.10",
49
+ "@synerise/ds-menu": "^1.0.11",
50
+ "@synerise/ds-modal": "^1.1.4",
51
+ "@synerise/ds-result": "^1.0.11",
52
+ "@synerise/ds-scrollbar": "^1.0.10",
53
+ "@synerise/ds-skeleton": "^1.0.11",
54
+ "@synerise/ds-tabs": "^1.0.11",
55
+ "@synerise/ds-tooltip": "^1.1.9",
56
+ "@synerise/ds-utils": "^1.2.0",
57
57
  "lodash": "^4.17.21",
58
58
  "react-window": "1.8.5",
59
59
  "uuid": "^8.3.2"
@@ -65,5 +65,5 @@
65
65
  "react-intl": ">=3.12.0 <= 6.8",
66
66
  "styled-components": "^5.3.3"
67
67
  },
68
- "gitHead": "022e7ef05dd9d54cdb148bdd03dcf592fbaf3a52"
68
+ "gitHead": "93bc81d59d20bc8f3bc80c5d56ae7f7c0838380d"
69
69
  }