@true-engineering/true-react-common-ui-kit 4.0.0-alpha54 → 4.0.0-alpha61

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 (151) hide show
  1. package/README.md +1 -0
  2. package/dist/components/AddButton/AddButton.d.ts +1 -0
  3. package/dist/components/AddButton/AddButton.styles.d.ts +1 -1
  4. package/dist/components/Button/Button.styles.d.ts +1 -1
  5. package/dist/components/Checkbox/Checkbox.styles.d.ts +1 -1
  6. package/dist/components/ControlWrapper/ControlWrapper.d.ts +1 -1
  7. package/dist/components/ControlWrapper/ControlWrapper.styles.d.ts +1 -1
  8. package/dist/components/CssBaseline/CssBaseline.styles.d.ts +1 -1
  9. package/dist/components/DatePicker/components/DatePickerHeader/DatePickerHeader.styles.d.ts +1 -1
  10. package/dist/components/Description/Description.styles.d.ts +1 -1
  11. package/dist/components/FileInput/FileInput.styles.d.ts +1 -1
  12. package/dist/components/FileItem/FileItem.styles.d.ts +1 -1
  13. package/dist/components/FiltersPane/components/FilterInterval/FilterInterval.styles.d.ts +1 -1
  14. package/dist/components/FiltersPane/components/FilterSelect/FilterSelect.styles.d.ts +2 -2
  15. package/dist/components/FiltersPane/components/FilterWithDates/FilterWithDates.styles.d.ts +2 -2
  16. package/dist/components/FiltersPane/components/FilterWrapper/FilterWrapper.d.ts +1 -1
  17. package/dist/components/FiltersPane/components/FilterWrapper/FilterWrapper.styles.d.ts +1 -1
  18. package/dist/components/FiltersPane/components/FiltersPaneSearch/FiltersPaneSearch.styles.d.ts +1 -1
  19. package/dist/components/FiltersPane/types.d.ts +2 -1
  20. package/dist/components/FlexibleTable/FlexibleTable.styles.d.ts +1 -1
  21. package/dist/components/FlexibleTable/components/FlexibleTableCell/FlexibleTableCell.styles.d.ts +1 -1
  22. package/dist/components/FlexibleTable/components/FlexibleTableRow/FlexibleTableRow.d.ts +1 -3
  23. package/dist/components/FlexibleTable/components/FlexibleTableRow/FlexibleTableRow.styles.d.ts +1 -1
  24. package/dist/components/FloatDocActions/components/DocActions/DocActions.styles.d.ts +1 -1
  25. package/dist/components/IconButton/IconButton.styles.d.ts +1 -1
  26. package/dist/components/List/components/ListItem/ListItem.styles.d.ts +1 -1
  27. package/dist/components/Modal/Modal.styles.d.ts +1 -1
  28. package/dist/components/MoreMenu/MoreMenu.styles.d.ts +1 -1
  29. package/dist/components/MultiSelect/MultiSelect.styles.d.ts +1 -1
  30. package/dist/components/MultiSelect/components/MultiSelectInput/MultiSelectInput.styles.d.ts +1 -1
  31. package/dist/components/MultiSelectList/MultiSelectList.styles.d.ts +1 -1
  32. package/dist/components/NewMoreMenu/NewMoreMenu.styles.d.ts +1 -1
  33. package/dist/components/Notification/Notification.styles.d.ts +1 -1
  34. package/dist/components/PhoneInput/PhoneInput.styles.d.ts +1 -1
  35. package/dist/components/PhoneInput/components/PhoneInputCountryList/PhoneInputCountryList.styles.d.ts +1 -1
  36. package/dist/components/RadioButton/RadioButton.styles.d.ts +1 -1
  37. package/dist/components/SearchInput/SearchInput.d.ts +1 -1
  38. package/dist/components/Select/Select.styles.d.ts +3 -3
  39. package/dist/components/Select/components/SelectList/SelectList.styles.d.ts +1 -1
  40. package/dist/components/Selector/Selector.styles.d.ts +1 -1
  41. package/dist/components/Status/Status.styles.d.ts +1 -1
  42. package/dist/components/Switch/Switch.d.ts +3 -2
  43. package/dist/components/Switch/Switch.styles.d.ts +3 -2
  44. package/dist/components/Switch/types.d.ts +3 -0
  45. package/dist/components/TextArea/TextArea.styles.d.ts +1 -1
  46. package/dist/components/TextButton/TextButton.styles.d.ts +1 -1
  47. package/dist/components/TextWithInfo/TextWithInfo.styles.d.ts +1 -1
  48. package/dist/components/TextWithTooltip/TextWithTooltip.d.ts +2 -0
  49. package/dist/components/TextWithTooltip/TextWithTooltip.styles.d.ts +1 -1
  50. package/dist/components/ThemedPreloader/ThemedPreloader.styles.d.ts +1 -1
  51. package/dist/components/ThemedPreloader/components/DotsPreloader/DotsPreloader.styles.d.ts +1 -1
  52. package/dist/components/Toaster/Toaster.styles.d.ts +1 -1
  53. package/dist/components/Tooltip/Tooltip.d.ts +3 -0
  54. package/dist/components/Tooltip/Tooltip.styles.d.ts +2 -1
  55. package/dist/components/Tooltip/types.d.ts +3 -0
  56. package/dist/components/WithMessages/WithMessages.styles.d.ts +1 -1
  57. package/dist/components/WithPopup/WithPopup.styles.d.ts +1 -1
  58. package/dist/components/WithTooltip/WithTooltip.d.ts +2 -0
  59. package/dist/helpers/misc.d.ts +2 -0
  60. package/dist/hooks/index.d.ts +1 -0
  61. package/dist/hooks/use-intersection-ref.d.ts +2 -1
  62. package/dist/hooks/use-resize-ref.d.ts +7 -0
  63. package/dist/hooks/use-tweak-styles.d.ts +3 -2
  64. package/dist/theme/Provider.d.ts +2 -12
  65. package/dist/theme/common.d.ts +34 -4
  66. package/dist/theme/helpers.d.ts +3 -16
  67. package/dist/theme/index.d.ts +0 -2
  68. package/dist/theme/types.d.ts +9 -8
  69. package/dist/true-react-common-ui-kit.js +12132 -10
  70. package/dist/true-react-common-ui-kit.js.map +1 -1
  71. package/dist/true-react-common-ui-kit.umd.cjs +2 -10
  72. package/dist/true-react-common-ui-kit.umd.cjs.map +1 -1
  73. package/dist/types.d.ts +3 -3
  74. package/package.json +1 -3
  75. package/src/components/AccountInfo/AccountInfo.tsx +2 -3
  76. package/src/components/AddButton/AddButton.tsx +3 -5
  77. package/src/components/Button/Button.tsx +76 -77
  78. package/src/components/CloseButton/CloseButton.tsx +2 -4
  79. package/src/components/Colors/Colors.stories.tsx +3 -2
  80. package/src/components/ControlWrapper/ControlWrapper.tsx +2 -2
  81. package/src/components/CssBaseline/CssBaseline.styles.ts +2 -0
  82. package/src/components/CssBaseline/CssBaseline.tsx +2 -3
  83. package/src/components/DateInput/DateInput.tsx +59 -61
  84. package/src/components/DatePicker/DatePicker.tsx +259 -262
  85. package/src/components/Description/Description.tsx +2 -3
  86. package/src/components/FileInput/FileInput.tsx +87 -95
  87. package/src/components/FileItem/FileItem.tsx +2 -4
  88. package/src/components/FiltersPane/FiltersPane.stories.tsx +3 -0
  89. package/src/components/FiltersPane/components/FilterInterval/FilterInterval.tsx +2 -3
  90. package/src/components/FiltersPane/components/FilterWithDates/FilterWithDates.tsx +6 -3
  91. package/src/components/FiltersPane/components/FilterWrapper/FilterWrapper.tsx +3 -2
  92. package/src/components/FiltersPane/types.ts +2 -0
  93. package/src/components/FlexibleTable/FlexibleTable.styles.ts +1 -0
  94. package/src/components/FlexibleTable/components/FlexibleTableCell/FlexibleTableCell.styles.ts +1 -0
  95. package/src/components/FlexibleTable/components/FlexibleTableCell/FlexibleTableCell.tsx +5 -2
  96. package/src/components/FlexibleTable/components/FlexibleTableRow/FlexibleTableRow.tsx +9 -7
  97. package/src/components/IconButton/IconButton.tsx +44 -48
  98. package/src/components/Input/Input.tsx +26 -24
  99. package/src/components/Input/InputBase.tsx +183 -187
  100. package/src/components/List/List.tsx +2 -3
  101. package/src/components/List/components/ListItem/ListItem.tsx +2 -4
  102. package/src/components/Modal/Modal.tsx +2 -4
  103. package/src/components/MoreMenu/MoreMenu.tsx +2 -4
  104. package/src/components/MultiSelect/MultiSelect.tsx +2 -4
  105. package/src/components/NewMoreMenu/NewMoreMenu.tsx +2 -4
  106. package/src/components/Notification/Notification.tsx +2 -3
  107. package/src/components/NumberInput/NumberInput.tsx +91 -93
  108. package/src/components/PhoneInput/PhoneInput.tsx +2 -3
  109. package/src/components/SearchInput/SearchInput.tsx +20 -19
  110. package/src/components/Select/Select.tsx +1 -1
  111. package/src/components/Selector/Selector.tsx +4 -6
  112. package/src/components/SmartInput/SmartInput.tsx +85 -87
  113. package/src/components/Status/Status.tsx +5 -4
  114. package/src/components/Switch/Switch.styles.ts +21 -13
  115. package/src/components/Switch/Switch.tsx +11 -6
  116. package/src/components/Switch/types.ts +5 -0
  117. package/src/components/TextArea/TextArea.tsx +128 -130
  118. package/src/components/TextButton/TextButton.tsx +68 -69
  119. package/src/components/TextWithInfo/TextWithInfo.tsx +2 -4
  120. package/src/components/TextWithTooltip/TextWithTooltip.tsx +6 -4
  121. package/src/components/ThemedPreloader/ThemedPreloader.tsx +2 -4
  122. package/src/components/Toaster/Toaster.tsx +2 -4
  123. package/src/components/Tooltip/Tooltip.stories.tsx +10 -0
  124. package/src/components/Tooltip/Tooltip.styles.ts +2 -1
  125. package/src/components/Tooltip/Tooltip.tsx +12 -5
  126. package/src/components/Tooltip/types.ts +5 -0
  127. package/src/components/WithMessages/WithMessages.tsx +41 -40
  128. package/src/components/WithTooltip/WithTooltip.tsx +4 -0
  129. package/src/helpers/misc.ts +6 -0
  130. package/src/hooks/index.ts +1 -0
  131. package/src/hooks/use-intersection-ref.ts +24 -6
  132. package/src/hooks/use-latest-ref.ts +6 -2
  133. package/src/hooks/use-resize-ref.ts +35 -0
  134. package/src/hooks/use-tweak-styles.ts +14 -51
  135. package/src/theme/Provider.tsx +4 -21
  136. package/src/theme/common.ts +33 -36
  137. package/src/theme/helpers.ts +50 -42
  138. package/src/theme/index.ts +0 -2
  139. package/src/theme/types.ts +13 -10
  140. package/src/types.ts +3 -3
  141. package/dist/theme/create-themed-styles.d.ts +0 -2
  142. package/dist/theme/true-jss/ThemedStylesManager.d.ts +0 -18
  143. package/dist/theme/true-jss/TweakStylesManager.d.ts +0 -34
  144. package/dist/theme/true-jss/index.d.ts +0 -2
  145. package/dist/theme/true-jss/jss-context.d.ts +0 -9
  146. package/dist/true-react-common-ui-kit.css +0 -756
  147. package/src/theme/create-themed-styles.ts +0 -78
  148. package/src/theme/true-jss/ThemedStylesManager.ts +0 -93
  149. package/src/theme/true-jss/TweakStylesManager.ts +0 -156
  150. package/src/theme/true-jss/index.ts +0 -2
  151. package/src/theme/true-jss/jss-context.tsx +0 -34
@@ -53,293 +53,290 @@ export interface IDatePickerProps extends IDatePickerBaseProps, ICommonProps<IDa
53
53
  onChangeRange?: (date: IRange, event?: SyntheticEvent) => void;
54
54
  }
55
55
 
56
- export const DatePicker = forwardRef<ReactDatePicker, IDatePickerProps>(
57
- (
58
- {
59
- data,
60
- selectedDate = null,
61
- minDate,
62
- maxDate,
63
- endDate = null,
64
- startDate = null,
65
- locale,
66
- months,
67
- calendarStartDay = 1,
68
- dateFormat = DEFAULT_DATE_FORMAT,
69
- monthsShown,
70
- placeholder,
71
- isRange = false,
72
- isInline = false,
73
- isDisabled,
74
- isClearable,
75
- strictParsing,
76
- fixedHeight,
77
- focusSelectedMonth,
78
- disabledKeyboardNavigation,
79
- shouldRenderPopperInBody = false,
80
- allowSameDay = false,
81
- shouldCloseOnSelect,
82
- showPreviousMonths,
83
- preventOpenOnFocus,
84
- popperModifiers = [],
85
- popperPlacement = 'bottom-start',
86
- todayButton,
87
- highlightDates,
88
- calendarContainer,
89
- dayClassName,
90
- customInput: CustomInput = DateInput,
91
- customInputRef,
92
- renderCustomHeader,
93
- filterDate,
94
- onYearChange,
95
- onMonthChange,
96
- onCalendarOpen,
97
- onCalendarClose,
98
- onChangeDate,
99
- onChangeRange,
100
- onBlur,
101
- onFocus,
102
- onKeyDown,
103
- tweakStyles,
104
- ...inputProps
105
- },
106
- ref,
107
- ) => {
108
- const classes = useStyles({ theme: tweakStyles });
56
+ export const DatePicker = forwardRef<ReactDatePicker, IDatePickerProps>(function DatePicker(
57
+ {
58
+ data,
59
+ selectedDate = null,
60
+ minDate,
61
+ maxDate,
62
+ endDate = null,
63
+ startDate = null,
64
+ locale,
65
+ months,
66
+ calendarStartDay = 1,
67
+ dateFormat = DEFAULT_DATE_FORMAT,
68
+ monthsShown,
69
+ placeholder,
70
+ isRange = false,
71
+ isInline = false,
72
+ isDisabled,
73
+ isClearable,
74
+ strictParsing,
75
+ fixedHeight,
76
+ focusSelectedMonth,
77
+ disabledKeyboardNavigation,
78
+ shouldRenderPopperInBody = false,
79
+ allowSameDay = false,
80
+ shouldCloseOnSelect,
81
+ showPreviousMonths,
82
+ preventOpenOnFocus,
83
+ popperModifiers = [],
84
+ popperPlacement = 'bottom-start',
85
+ todayButton,
86
+ highlightDates,
87
+ calendarContainer,
88
+ dayClassName,
89
+ customInput: CustomInput = DateInput,
90
+ customInputRef,
91
+ renderCustomHeader,
92
+ filterDate,
93
+ onYearChange,
94
+ onMonthChange,
95
+ onCalendarOpen,
96
+ onCalendarClose,
97
+ onChangeDate,
98
+ onChangeRange,
99
+ onBlur,
100
+ onFocus,
101
+ onKeyDown,
102
+ tweakStyles,
103
+ ...inputProps
104
+ },
105
+ ref,
106
+ ) {
107
+ const classes = useStyles({ theme: tweakStyles });
109
108
 
110
- const tweakDateInputStyles = useTweakStyles({
111
- tweakStyles,
112
- className: 'tweakDateInput',
113
- currentComponentName: 'DatePicker',
114
- });
109
+ const tweakDateInputStyles = useTweakStyles({
110
+ tweakStyles,
111
+ className: 'tweakDateInput',
112
+ currentComponentName: 'DatePicker',
113
+ });
115
114
 
116
- const { formatDate, parseDateValue } = useMemo(
117
- () => ({
118
- formatDate: getDateFormatter(dateFormat),
119
- parseDateValue: getDateValueParser(dateFormat),
120
- }),
121
- [dateFormat],
122
- );
115
+ const { formatDate, parseDateValue } = useMemo(
116
+ () => ({
117
+ formatDate: getDateFormatter(dateFormat),
118
+ parseDateValue: getDateValueParser(dateFormat),
119
+ }),
120
+ [dateFormat],
121
+ );
123
122
 
124
- const datePickerRef = useRef<DatePickerBase>();
123
+ const datePickerRef = useRef<DatePickerBase>();
125
124
 
126
- const componentRef = useMergedRefs([ref, datePickerRef]);
125
+ const componentRef = useMergedRefs([ref, datePickerRef]);
127
126
 
128
- const [isOpen, setIsOpen] = useState(false);
127
+ const [isOpen, setIsOpen] = useState(false);
129
128
 
130
- const [dateValue, setDateValue] = useState(formatDate(selectedDate));
129
+ const [dateValue, setDateValue] = useState(formatDate(selectedDate));
131
130
 
132
- const [start, setStart] = useState(startDate);
133
- const [startDateValue, setStartDateValue] = useState(formatDate(startDate));
134
- const [end, setEnd] = useState(endDate);
135
- const [endDateValue, setEndDateValue] = useState(formatDate(endDate));
131
+ const [start, setStart] = useState(startDate);
132
+ const [startDateValue, setStartDateValue] = useState(formatDate(startDate));
133
+ const [end, setEnd] = useState(endDate);
134
+ const [endDateValue, setEndDateValue] = useState(formatDate(endDate));
136
135
 
137
- const hasDateInputValue = isRange
138
- ? isStringNotEmpty(startDateValue) || isStringNotEmpty(endDateValue)
139
- : isStringNotEmpty(dateValue);
136
+ const hasDateInputValue = isRange
137
+ ? isStringNotEmpty(startDateValue) || isStringNotEmpty(endDateValue)
138
+ : isStringNotEmpty(dateValue);
140
139
 
141
- const dateInputProps: IDateInputProps = {
142
- ...inputProps,
143
- isRange,
144
- isDisabled,
145
- isClearable,
146
- isActive: isOpen,
147
- icon: isClearable && hasDateInputValue ? undefined : 'calendar',
148
- tweakStyles: tweakDateInputStyles,
149
- ...(isRange ? { startDate: startDateValue, endDate: endDateValue } : { date: dateValue }),
150
- };
140
+ const dateInputProps: IDateInputProps = {
141
+ ...inputProps,
142
+ isRange,
143
+ isDisabled,
144
+ isClearable,
145
+ isActive: isOpen,
146
+ icon: isClearable && hasDateInputValue ? undefined : 'calendar',
147
+ tweakStyles: tweakDateInputStyles,
148
+ ...(isRange ? { startDate: startDateValue, endDate: endDateValue } : { date: dateValue }),
149
+ };
151
150
 
152
- const handleChangeDate = (value: Date | null, event?: SyntheticEvent) => {
153
- onChangeDate?.(value, event);
154
- };
151
+ const handleChangeDate = (value: Date | null, event?: SyntheticEvent) => {
152
+ onChangeDate?.(value, event);
153
+ };
155
154
 
156
- const isDateInRange = (date: Date) =>
157
- (isEmpty(minDate) || isAfter(date, minDate)) && (isEmpty(maxDate) || isBefore(date, maxDate));
155
+ const isDateInRange = (date: Date) =>
156
+ (isEmpty(minDate) || isAfter(date, minDate)) && (isEmpty(maxDate) || isBefore(date, maxDate));
158
157
 
159
- // TODO: Если пропса allowSameDay равна true и введена только начальная дата, то
160
- // невозможно будет стереть значение в инпуте. Обойти это можно только если
161
- // полностью выбрать период, а затем уже очищать инпут (баг в react-datepicker. В этом
162
- // случае value равняется не [null, null], а [start, null])
163
- const handleChangeRange = (value: IRange, event?: SyntheticEvent) => {
164
- if (
165
- allowSameDay ||
166
- !areDatesEquals(value?.[0], startDate) ||
167
- !areDatesEquals(value?.[1], endDate)
168
- ) {
169
- setStart(value?.[0] ?? null);
170
- setEnd(value?.[1] ?? null);
171
- onChangeRange?.(value, event);
172
- }
173
- };
158
+ // TODO: Если пропса allowSameDay равна true и введена только начальная дата, то
159
+ // невозможно будет стереть значение в инпуте. Обойти это можно только если
160
+ // полностью выбрать период, а затем уже очищать инпут (баг в react-datepicker. В этом
161
+ // случае value равняется не [null, null], а [start, null])
162
+ const handleChangeRange = (value: IRange, event?: SyntheticEvent) => {
163
+ if (
164
+ allowSameDay ||
165
+ !areDatesEquals(value?.[0], startDate) ||
166
+ !areDatesEquals(value?.[1], endDate)
167
+ ) {
168
+ setStart(value?.[0] ?? null);
169
+ setEnd(value?.[1] ?? null);
170
+ onChangeRange?.(value, event);
171
+ }
172
+ };
174
173
 
175
- // TODO: кажется это можно улучшить, т.к проблему пофиксили (https://github.com/Hacker0x01/react-datepicker/pull/5060)
176
- const handleChangeDateRangeInput = (value: string) => {
177
- const newStartDateValue = value.slice(0, 10);
178
- let newStart = parseDateValue(newStartDateValue);
179
- const newEndDateValue = value.slice(13);
180
- let newEnd = parseDateValue(newEndDateValue);
174
+ // TODO: кажется это можно улучшить, т.к проблему пофиксили (https://github.com/Hacker0x01/react-datepicker/pull/5060)
175
+ const handleChangeDateRangeInput = (value: string) => {
176
+ const newStartDateValue = value.slice(0, 10);
177
+ let newStart = parseDateValue(newStartDateValue);
178
+ const newEndDateValue = value.slice(13);
179
+ let newEnd = parseDateValue(newEndDateValue);
181
180
 
182
- if (
183
- (isNotEmpty(newStart) && !isValid(newStart)) ||
184
- (isNotEmpty(newStart) && !isDateInRange(newStart))
185
- ) {
186
- newStart = start;
187
- }
181
+ if (
182
+ (isNotEmpty(newStart) && !isValid(newStart)) ||
183
+ (isNotEmpty(newStart) && !isDateInRange(newStart))
184
+ ) {
185
+ newStart = start;
186
+ }
188
187
 
189
- if (
190
- (isNotEmpty(newEnd) && !isValid(newEnd)) ||
191
- (isNotEmpty(newEnd) && !isDateInRange(newEnd))
192
- ) {
193
- newEnd = end;
194
- }
188
+ if (
189
+ (isNotEmpty(newEnd) && !isValid(newEnd)) ||
190
+ (isNotEmpty(newEnd) && !isDateInRange(newEnd))
191
+ ) {
192
+ newEnd = end;
193
+ }
195
194
 
196
- // Если оставить пустой начальную дату и заполненной конечную,
197
- // то ломается react-datepicker и в календарике ничего нельзя выбирать
198
- if (
199
- (isEmpty(newStart) && isValid(newEnd)) ||
200
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
201
- (isValid(newStart) && isValid(newEnd) && isAfter(newStart!, newEnd!))
202
- ) {
203
- newStart = newEnd;
204
- newEnd = null;
205
- }
195
+ // Если оставить пустой начальную дату и заполненной конечную,
196
+ // то ломается react-datepicker и в календарике ничего нельзя выбирать
197
+ if (
198
+ (isEmpty(newStart) && isValid(newEnd)) ||
199
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
200
+ (isValid(newStart) && isValid(newEnd) && isAfter(newStart!, newEnd!))
201
+ ) {
202
+ newStart = newEnd;
203
+ newEnd = null;
204
+ }
206
205
 
207
- setStartDateValue(newStartDateValue);
208
- setStart(newStart);
209
- setEndDateValue(newEndDateValue);
210
- setEnd(newEnd);
211
- };
206
+ setStartDateValue(newStartDateValue);
207
+ setStart(newStart);
208
+ setEndDateValue(newEndDateValue);
209
+ setEnd(newEnd);
210
+ };
212
211
 
213
- const handleDateInputBlur = (event: FocusEvent<HTMLInputElement>) => {
214
- onBlur?.(event);
215
- setDateValue(formatDate(selectedDate));
216
- };
212
+ const handleDateInputBlur = (event: FocusEvent<HTMLInputElement>) => {
213
+ onBlur?.(event);
214
+ setDateValue(formatDate(selectedDate));
215
+ };
217
216
 
218
- const setDateRangeValues = (startValue: Date | null = null, endValue: Date | null = null) => {
219
- let convertedStartDate = formatDate(startValue);
220
- const convertedEndDate = formatDate(endValue);
221
- if (convertedStartDate === '' && convertedEndDate !== '') {
222
- // Если выставлять пустую строку, то конечная дата перепрыгивает на место начальной
223
- convertedStartDate = EMPTY_DATE_INPUT_VALUE;
224
- }
217
+ const setDateRangeValues = (startValue: Date | null = null, endValue: Date | null = null) => {
218
+ let convertedStartDate = formatDate(startValue);
219
+ const convertedEndDate = formatDate(endValue);
220
+ if (convertedStartDate === '' && convertedEndDate !== '') {
221
+ // Если выставлять пустую строку, то конечная дата перепрыгивает на место начальной
222
+ convertedStartDate = EMPTY_DATE_INPUT_VALUE;
223
+ }
225
224
 
226
- setStart(startValue);
227
- setStartDateValue(convertedStartDate);
228
- setEnd(endValue);
229
- setEndDateValue(convertedEndDate);
230
- };
225
+ setStart(startValue);
226
+ setStartDateValue(convertedStartDate);
227
+ setEnd(endValue);
228
+ setEndDateValue(convertedEndDate);
229
+ };
231
230
 
232
- const handleDateRangeInputBlur = (event: FocusEvent<HTMLInputElement>) => {
233
- onBlur?.(event);
234
- handleChangeRange([start, end], event);
235
- setDateRangeValues(start, end);
236
- };
231
+ const handleDateRangeInputBlur = (event: FocusEvent<HTMLInputElement>) => {
232
+ onBlur?.(event);
233
+ handleChangeRange([start, end], event);
234
+ setDateRangeValues(start, end);
235
+ };
237
236
 
238
- const handleOpenCalendar = () => {
239
- setIsOpen(true);
240
- onCalendarOpen?.();
241
- };
237
+ const handleOpenCalendar = () => {
238
+ setIsOpen(true);
239
+ onCalendarOpen?.();
240
+ };
242
241
 
243
- const handleCloseCalendar = () => {
244
- setIsOpen(false);
245
- if (isRange) {
246
- handleChangeRange([start, end]);
247
- setDateRangeValues(start, end);
248
- } else {
249
- setDateValue(formatDate(selectedDate));
250
- }
251
- onCalendarClose?.();
252
- };
253
-
254
- useEffect(() => {
242
+ const handleCloseCalendar = () => {
243
+ setIsOpen(false);
244
+ if (isRange) {
245
+ handleChangeRange([start, end]);
246
+ setDateRangeValues(start, end);
247
+ } else {
255
248
  setDateValue(formatDate(selectedDate));
256
- setDateRangeValues(startDate, endDate);
257
- }, [selectedDate, startDate, endDate]);
249
+ }
250
+ onCalendarClose?.();
251
+ };
258
252
 
259
- // Кастомный обработчик клика снаружи, чтобы можно было поставить фокус на Input при открытом календаре.
260
- // Проблема в том, что класс OUTSIDE_CLICK_IGNORE_CLASS висит контейнере Input'а. А react-datepicker
261
- // проверяет наличие класса непосредственно на элементе, который вызвал клик, но не на его родителях
262
- useOnClickOutside(
263
- () => datePickerRef.current?.calendar?.containerRef?.current,
264
- (event) => datePickerRef.current?.handleClickOutside(event as MouseEvent),
265
- OUTSIDE_CLICK_IGNORE_CLASS,
266
- );
253
+ useEffect(() => {
254
+ setDateValue(formatDate(selectedDate));
255
+ setDateRangeValues(startDate, endDate);
256
+ }, [selectedDate, startDate, endDate]);
267
257
 
268
- return (
269
- <div className={classes.root} {...addDataAttributes(data)}>
270
- <DatePickerBase
271
- ref={componentRef}
272
- minDate={minDate}
273
- maxDate={maxDate}
274
- locale={isString(locale) ? LocalesMap[locale] : locale}
275
- dateFormat={dateFormat}
276
- placeholderText={placeholder}
277
- calendarStartDay={calendarStartDay}
278
- inline={isInline}
279
- disabled={isDisabled}
280
- fixedHeight={fixedHeight}
281
- showPreviousMonths={showPreviousMonths}
282
- focusSelectedMonth={focusSelectedMonth}
283
- monthsShown={monthsShown}
284
- allowSameDay={allowSameDay}
285
- showPopperArrow={false}
286
- popperClassName={classes.popper}
287
- calendarClassName={classes.datepicker}
288
- dayClassName={(v) => clsx(classes.day, dayClassName?.(v))}
289
- disabledKeyboardNavigation={disabledKeyboardNavigation}
290
- popperContainer={shouldRenderPopperInBody ? PopperContainer : undefined}
291
- // Убираем дефолтный отступ в 10px из либы
292
- // https://github.com/Hacker0x01/react-datepicker/blob/db67a58de2b05d2681bdf0a4977b606095d514c4/src/with_floating.tsx#L58
293
- popperModifiers={[offset(-10), ...popperModifiers]}
294
- popperPlacement={popperPlacement}
295
- strictParsing={strictParsing}
296
- preventOpenOnFocus={preventOpenOnFocus}
297
- shouldCloseOnSelect={shouldCloseOnSelect}
298
- customInputRef={customInputRef}
299
- customInput={<CustomInput {...dateInputProps} />}
300
- renderDayContents={(day) => <div className={classes.dayInner}>{day}</div>}
301
- renderCustomHeader={
302
- renderCustomHeader ??
303
- ((baseProps) => <DatePickerHeader {...baseProps} months={months} />)
258
+ // Кастомный обработчик клика снаружи, чтобы можно было поставить фокус на Input при открытом календаре.
259
+ // Проблема в том, что класс OUTSIDE_CLICK_IGNORE_CLASS висит контейнере Input'а. А react-datepicker
260
+ // проверяет наличие класса непосредственно на элементе, который вызвал клик, но не на его родителях
261
+ useOnClickOutside(
262
+ () => datePickerRef.current?.calendar?.containerRef?.current,
263
+ (event) => datePickerRef.current?.handleClickOutside(event as MouseEvent),
264
+ OUTSIDE_CLICK_IGNORE_CLASS,
265
+ );
266
+
267
+ return (
268
+ <div className={classes.root} {...addDataAttributes(data)}>
269
+ <DatePickerBase
270
+ ref={componentRef}
271
+ minDate={minDate}
272
+ maxDate={maxDate}
273
+ locale={isString(locale) ? LocalesMap[locale] : locale}
274
+ dateFormat={dateFormat}
275
+ placeholderText={placeholder}
276
+ calendarStartDay={calendarStartDay}
277
+ inline={isInline}
278
+ disabled={isDisabled}
279
+ fixedHeight={fixedHeight}
280
+ showPreviousMonths={showPreviousMonths}
281
+ focusSelectedMonth={focusSelectedMonth}
282
+ monthsShown={monthsShown}
283
+ allowSameDay={allowSameDay}
284
+ showPopperArrow={false}
285
+ popperClassName={classes.popper}
286
+ calendarClassName={classes.datepicker}
287
+ dayClassName={(v) => clsx(classes.day, dayClassName?.(v))}
288
+ disabledKeyboardNavigation={disabledKeyboardNavigation}
289
+ popperContainer={shouldRenderPopperInBody ? PopperContainer : undefined}
290
+ // Убираем дефолтный отступ в 10px из либы
291
+ // https://github.com/Hacker0x01/react-datepicker/blob/db67a58de2b05d2681bdf0a4977b606095d514c4/src/with_floating.tsx#L58
292
+ popperModifiers={[offset(-10), ...popperModifiers]}
293
+ popperPlacement={popperPlacement}
294
+ strictParsing={strictParsing}
295
+ preventOpenOnFocus={preventOpenOnFocus}
296
+ shouldCloseOnSelect={shouldCloseOnSelect}
297
+ customInputRef={customInputRef}
298
+ customInput={<CustomInput {...dateInputProps} />}
299
+ renderDayContents={(day) => <div className={classes.dayInner}>{day}</div>}
300
+ renderCustomHeader={
301
+ renderCustomHeader ?? ((baseProps) => <DatePickerHeader {...baseProps} months={months} />)
302
+ }
303
+ todayButton={todayButton}
304
+ highlightDates={highlightDates}
305
+ calendarContainer={calendarContainer}
306
+ filterDate={filterDate}
307
+ onYearChange={onYearChange}
308
+ onMonthChange={onMonthChange}
309
+ onFocus={onFocus}
310
+ onKeyDown={onKeyDown}
311
+ onCalendarOpen={handleOpenCalendar}
312
+ onCalendarClose={handleCloseCalendar}
313
+ onChangeRaw={(_, value?: string) => {
314
+ // Если передали value, значит этот обработчик вызвался после изменения значения в инпуте
315
+ // (react-datepicker вызывает эту функцию также при клике на дату в календаре)
316
+ if (value === undefined) {
317
+ return;
304
318
  }
305
- todayButton={todayButton}
306
- highlightDates={highlightDates}
307
- calendarContainer={calendarContainer}
308
- filterDate={filterDate}
309
- onYearChange={onYearChange}
310
- onMonthChange={onMonthChange}
311
- onFocus={onFocus}
312
- onKeyDown={onKeyDown}
313
- onCalendarOpen={handleOpenCalendar}
314
- onCalendarClose={handleCloseCalendar}
315
- onChangeRaw={(_, value?: string) => {
316
- // Если передали value, значит этот обработчик вызвался после изменения значения в инпуте
317
- // (react-datepicker вызывает эту функцию также при клике на дату в календаре)
318
- if (value === undefined) {
319
- return;
320
- }
321
- if (isRange) {
322
- handleChangeDateRangeInput(value);
323
- } else {
324
- setDateValue(value);
319
+ if (isRange) {
320
+ handleChangeDateRangeInput(value);
321
+ } else {
322
+ setDateValue(value);
323
+ }
324
+ }}
325
+ {...(isRange
326
+ ? {
327
+ startDate: start,
328
+ endDate: end,
329
+ selected: start,
330
+ selectsRange: true,
331
+ onBlur: handleDateRangeInputBlur,
332
+ onChange: handleChangeRange,
325
333
  }
326
- }}
327
- {...(isRange
328
- ? {
329
- startDate: start,
330
- endDate: end,
331
- selected: start,
332
- selectsRange: true,
333
- onBlur: handleDateRangeInputBlur,
334
- onChange: handleChangeRange,
335
- }
336
- : {
337
- selected: selectedDate,
338
- onBlur: handleDateInputBlur,
339
- onChange: handleChangeDate,
340
- })}
341
- />
342
- </div>
343
- );
344
- },
345
- );
334
+ : {
335
+ selected: selectedDate,
336
+ onBlur: handleDateInputBlur,
337
+ onChange: handleChangeDate,
338
+ })}
339
+ />
340
+ </div>
341
+ );
342
+ });
@@ -1,6 +1,5 @@
1
1
  import { FC, useState } from 'react';
2
- import { addDataTestId } from '@true-engineering/true-react-platform-helpers';
3
- import { addDataAttributes } from '../../helpers';
2
+ import { addDataAttributes } from '@true-engineering/true-react-platform-helpers';
4
3
  import { ICommonProps } from '../../types';
5
4
  import { LINK_REGEXP } from './constants';
6
5
  import { useStyles, IDescriptionStyles } from './Description.styles';
@@ -36,7 +35,7 @@ export const Description: FC<IDescriptionProps> = ({
36
35
  const shortText = text.slice(0, text.slice(0, truncateIndex).lastIndexOf(' '));
37
36
 
38
37
  return (
39
- <div className={classes.root} {...addDataTestId(testId)} {...addDataAttributes(data)}>
38
+ <div className={classes.root} {...addDataAttributes(data, testId)}>
40
39
  {isAlwaysOpen || isOpen || isTooShort ? (
41
40
  <div>
42
41
  <span>{textWithNoLink} </span>