@true-engineering/true-react-common-ui-kit 4.0.0-alpha3 → 4.0.0-alpha31

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 (237) hide show
  1. package/README.md +11 -607
  2. package/dist/components/Button/Button.styles.d.ts +1 -1
  3. package/dist/components/Checkbox/Checkbox.styles.d.ts +1 -1
  4. package/dist/components/ControlWrapper/ControlWrapper.d.ts +4 -2
  5. package/dist/components/ControlWrapper/ControlWrapper.styles.d.ts +2 -1
  6. package/dist/components/ControlWrapper/helpers.d.ts +4 -0
  7. package/dist/components/ControlWrapper/index.d.ts +2 -0
  8. package/dist/components/ControlWrapper/types.d.ts +12 -0
  9. package/dist/components/DateInput/DateInput.d.ts +1 -2
  10. package/dist/components/DatePicker/DatePicker.d.ts +4 -3
  11. package/dist/components/DatePicker/DatePicker.styles.d.ts +1 -1
  12. package/dist/components/DatePicker/components/DatePickerBase/DatePickerBase.d.ts +5 -0
  13. package/dist/components/DatePicker/components/DatePickerBase/index.d.ts +1 -0
  14. package/dist/components/DatePicker/components/PopperContainer/PopperContainer.d.ts +2 -4
  15. package/dist/components/DatePicker/components/index.d.ts +1 -0
  16. package/dist/components/DatePicker/constants.d.ts +7 -2
  17. package/dist/components/DatePicker/index.d.ts +1 -0
  18. package/dist/components/DatePicker/types.d.ts +3 -3
  19. package/dist/components/FiltersPane/FiltersPane.d.ts +7 -2
  20. package/dist/components/FiltersPane/components/Filter/Filter.d.ts +2 -2
  21. package/dist/components/FiltersPane/components/Filter/helpers.d.ts +4 -0
  22. package/dist/components/FiltersPane/components/FilterInterval/FilterInterval.styles.d.ts +1 -1
  23. package/dist/components/FiltersPane/components/FilterSelect/FilterSelect.styles.d.ts +1 -1
  24. package/dist/components/FiltersPane/components/FilterValueView/FilterValueView.d.ts +3 -1
  25. package/dist/components/FiltersPane/components/FilterWithDates/FilterWithDates.styles.d.ts +2 -2
  26. package/dist/components/FiltersPane/components/FilterWrapper/FilterWrapper.d.ts +2 -2
  27. package/dist/components/FiltersPane/components/FiltersPaneSearch/FiltersPaneSearch.styles.d.ts +1 -1
  28. package/dist/components/FiltersPane/types.d.ts +16 -5
  29. package/dist/components/Flag/customFlags/customFlags.d.ts +10 -0
  30. package/dist/components/Flag/customFlags/index.d.ts +1 -0
  31. package/dist/components/FlexibleTable/FlexibleTable.d.ts +4 -2
  32. package/dist/components/FlexibleTable/components/FlexibleTableCell/FlexibleTableCell.d.ts +4 -3
  33. package/dist/components/FlexibleTable/components/FlexibleTableRow/FlexibleTableRow.d.ts +6 -6
  34. package/dist/components/FlexibleTable/constants.d.ts +18 -2
  35. package/dist/components/FlexibleTable/types.d.ts +20 -12
  36. package/dist/components/Icon/icons-list.d.ts +1 -1
  37. package/dist/components/IconButton/IconButton.styles.d.ts +1 -1
  38. package/dist/components/IncrementInput/IncrementInput.styles.d.ts +1 -3
  39. package/dist/components/Input/Input.d.ts +3 -2
  40. package/dist/components/Input/InputBase.d.ts +2 -2
  41. package/dist/components/List/List.d.ts +1 -1
  42. package/dist/components/List/index.d.ts +2 -1
  43. package/dist/components/List/types.d.ts +4 -0
  44. package/dist/components/Modal/Modal.styles.d.ts +1 -1
  45. package/dist/components/Notification/Notification.styles.d.ts +1 -1
  46. package/dist/components/RadioButton/RadioButton.styles.d.ts +1 -1
  47. package/dist/components/ScrollIntoViewIfNeeded/ScrollIntoViewIfNeeded.d.ts +1 -1
  48. package/dist/components/SearchInput/SearchInput.d.ts +2 -2
  49. package/dist/components/Select/Select.d.ts +5 -3
  50. package/dist/components/Select/Select.styles.d.ts +5 -5
  51. package/dist/components/Select/components/SelectListItem/SelectListItem.d.ts +2 -1
  52. package/dist/components/Select/index.d.ts +1 -1
  53. package/dist/components/Status/Status.styles.d.ts +3 -2
  54. package/dist/components/Status/constants.d.ts +0 -1
  55. package/dist/components/Status/index.d.ts +1 -0
  56. package/dist/components/Status/types.d.ts +5 -2
  57. package/dist/components/TextArea/TextArea.d.ts +4 -5
  58. package/dist/components/TextArea/TextArea.styles.d.ts +5 -4
  59. package/dist/components/TextArea/index.d.ts +1 -1
  60. package/dist/components/TextArea/types.d.ts +4 -2
  61. package/dist/components/TextButton/TextButton.styles.d.ts +1 -1
  62. package/dist/components/Tooltip/Tooltip.d.ts +1 -1
  63. package/dist/components/Tooltip/Tooltip.styles.d.ts +1 -1
  64. package/dist/components/WithMessages/WithMessages.styles.d.ts +1 -1
  65. package/dist/components/WithPopup/WithPopup.d.ts +11 -3
  66. package/dist/hooks/index.d.ts +7 -4
  67. package/dist/hooks/use-intersection-ref.d.ts +8 -0
  68. package/dist/hooks/use-latest-ref.d.ts +2 -0
  69. package/dist/hooks/use-merge.d.ts +1 -0
  70. package/dist/hooks/use-mixed-styles.d.ts +3 -1
  71. package/dist/hooks/use-on-click-outside.d.ts +2 -2
  72. package/dist/hooks/use-tweak-styles.d.ts +5 -5
  73. package/dist/style.css +78 -142
  74. package/dist/theme/Provider.d.ts +6 -3
  75. package/dist/theme/create-themed-styles.d.ts +2 -0
  76. package/dist/theme/helpers.d.ts +9 -3
  77. package/dist/theme/index.d.ts +2 -0
  78. package/dist/theme/true-jss/ThemedStylesManager.d.ts +18 -0
  79. package/dist/theme/true-jss/TweakStylesManager.d.ts +34 -0
  80. package/dist/theme/true-jss/index.d.ts +2 -0
  81. package/dist/theme/true-jss/jss-context.d.ts +9 -0
  82. package/dist/theme/types.d.ts +5 -3
  83. package/dist/true-react-common-ui-kit.js +8157 -6924
  84. package/dist/true-react-common-ui-kit.js.map +1 -1
  85. package/dist/true-react-common-ui-kit.umd.cjs +8004 -6772
  86. package/dist/true-react-common-ui-kit.umd.cjs.map +1 -1
  87. package/dist/types.d.ts +10 -3
  88. package/package.json +4 -5
  89. package/src/components/ControlWrapper/ControlWrapper.stories.tsx +8 -3
  90. package/src/components/ControlWrapper/ControlWrapper.styles.ts +7 -6
  91. package/src/components/ControlWrapper/ControlWrapper.tsx +31 -20
  92. package/src/components/ControlWrapper/helpers.ts +11 -0
  93. package/src/components/ControlWrapper/index.ts +2 -0
  94. package/src/components/ControlWrapper/types.ts +16 -0
  95. package/src/components/DateInput/DateInput.stories.tsx +0 -1
  96. package/src/components/DateInput/DateInput.tsx +3 -4
  97. package/src/components/DatePicker/DatePicker.stories.tsx +24 -11
  98. package/src/components/DatePicker/DatePicker.styles.ts +3 -1
  99. package/src/components/DatePicker/DatePicker.tsx +47 -16
  100. package/src/components/DatePicker/components/DatePickerBase/DatePickerBase.tsx +14 -0
  101. package/src/components/DatePicker/components/DatePickerBase/index.ts +1 -0
  102. package/src/components/DatePicker/components/PopperContainer/PopperContainer.tsx +4 -4
  103. package/src/components/DatePicker/components/index.ts +1 -0
  104. package/src/components/DatePicker/constants.ts +9 -3
  105. package/src/components/DatePicker/helpers.ts +1 -1
  106. package/src/components/DatePicker/index.ts +1 -0
  107. package/src/components/DatePicker/types.ts +6 -4
  108. package/src/components/FiltersPane/FiltersPane.stories.tsx +4 -2
  109. package/src/components/FiltersPane/FiltersPane.tsx +28 -19
  110. package/src/components/FiltersPane/components/Filter/Filter.tsx +36 -30
  111. package/src/components/FiltersPane/components/Filter/helpers.ts +18 -0
  112. package/src/components/FiltersPane/components/FilterSelect/FilterSelect.tsx +22 -23
  113. package/src/components/FiltersPane/components/FilterValueView/FilterValueView.tsx +27 -22
  114. package/src/components/FiltersPane/components/FilterWithDates/FilterWithDates.styles.ts +2 -1
  115. package/src/components/FiltersPane/components/FilterWithDates/FilterWithDates.tsx +3 -4
  116. package/src/components/FiltersPane/components/FilterWithPeriod/FilterWithPeriod.tsx +4 -3
  117. package/src/components/FiltersPane/components/FilterWrapper/FilterWrapper.tsx +14 -10
  118. package/src/components/FiltersPane/components/FiltersPaneSearch/FiltersPaneSearch.styles.ts +5 -0
  119. package/src/components/FiltersPane/components/FiltersPaneSearch/FiltersPaneSearch.tsx +16 -19
  120. package/src/components/FiltersPane/types.ts +24 -5
  121. package/src/components/Flag/Flag.stories.tsx +2 -1
  122. package/src/components/Flag/Flag.styles.ts +4 -0
  123. package/src/components/Flag/Flag.tsx +23 -9
  124. package/src/components/Flag/customFlags/AB.svg +1 -0
  125. package/src/components/Flag/customFlags/OS.svg +1 -0
  126. package/src/components/Flag/customFlags/augment.d.ts +1 -0
  127. package/src/components/Flag/customFlags/customFlags.ts +13 -0
  128. package/src/components/Flag/customFlags/index.ts +1 -0
  129. package/src/components/FlexibleTable/FlexibleTable.tsx +40 -63
  130. package/src/components/FlexibleTable/components/FlexibleTableCell/FlexibleTableCell.tsx +8 -5
  131. package/src/components/FlexibleTable/components/FlexibleTableRow/FlexibleTableRow.tsx +13 -12
  132. package/src/components/FlexibleTable/constants.ts +6 -3
  133. package/src/components/FlexibleTable/types.ts +20 -16
  134. package/src/components/IncrementInput/IncrementInput.stories.tsx +2 -0
  135. package/src/components/IncrementInput/IncrementInput.styles.ts +31 -39
  136. package/src/components/IncrementInput/IncrementInput.tsx +28 -25
  137. package/src/components/Input/Input.stories.tsx +1 -6
  138. package/src/components/Input/Input.tsx +5 -3
  139. package/src/components/Input/InputBase.tsx +27 -25
  140. package/src/components/List/List.tsx +5 -2
  141. package/src/components/List/index.ts +2 -1
  142. package/src/components/List/types.ts +5 -0
  143. package/src/components/MultiSelectList/MultiSelectList.tsx +15 -11
  144. package/src/components/NumberInput/NumberInput.stories.tsx +5 -1
  145. package/src/components/PhoneInput/PhoneInput.stories.tsx +2 -1
  146. package/src/components/PhoneInput/PhoneInput.tsx +5 -2
  147. package/src/components/SearchInput/SearchInput.tsx +20 -29
  148. package/src/components/Select/CustomSelect.stories.tsx +1 -0
  149. package/src/components/Select/MultiSelect.stories.tsx +5 -0
  150. package/src/components/Select/Select.stories.tsx +6 -0
  151. package/src/components/Select/Select.styles.ts +5 -40
  152. package/src/components/Select/Select.tsx +36 -22
  153. package/src/components/Select/components/SelectList/SelectList.tsx +4 -2
  154. package/src/components/Select/components/SelectListItem/SelectListItem.tsx +5 -2
  155. package/src/components/Select/index.ts +1 -1
  156. package/src/components/Status/Status.stories.tsx +54 -1
  157. package/src/components/Status/Status.styles.ts +2 -37
  158. package/src/components/Status/constants.ts +0 -10
  159. package/src/components/Status/index.ts +1 -1
  160. package/src/components/Status/types.ts +7 -3
  161. package/src/components/TextArea/TextArea.stories.tsx +15 -1
  162. package/src/components/TextArea/TextArea.styles.ts +15 -8
  163. package/src/components/TextArea/TextArea.tsx +96 -62
  164. package/src/components/TextArea/index.ts +1 -1
  165. package/src/components/TextArea/types.ts +5 -5
  166. package/src/components/TextButton/TextButton.styles.ts +1 -0
  167. package/src/components/Tooltip/Tooltip.styles.ts +2 -0
  168. package/src/components/Tooltip/Tooltip.tsx +1 -1
  169. package/src/components/WithMessages/WithMessages.stories.tsx +1 -1
  170. package/src/components/WithPopup/WithPopup.tsx +36 -15
  171. package/src/constants/phone-info.ts +20 -33
  172. package/src/helpers/phone.ts +19 -15
  173. package/src/hooks/index.ts +7 -4
  174. package/src/hooks/use-intersection-ref.ts +30 -0
  175. package/src/hooks/use-latest-ref.ts +7 -0
  176. package/src/hooks/use-merge.ts +8 -0
  177. package/src/hooks/use-mixed-styles.ts +9 -11
  178. package/src/hooks/use-on-click-outside.ts +22 -14
  179. package/src/hooks/use-tweak-styles.ts +49 -27
  180. package/src/theme/Provider.tsx +10 -5
  181. package/src/theme/create-themed-styles.ts +78 -0
  182. package/src/theme/helpers.ts +39 -39
  183. package/src/theme/index.ts +2 -0
  184. package/src/theme/true-jss/ThemedStylesManager.ts +92 -0
  185. package/src/theme/true-jss/TweakStylesManager.ts +157 -0
  186. package/src/theme/true-jss/index.ts +2 -0
  187. package/src/theme/true-jss/jss-context.tsx +34 -0
  188. package/src/theme/types.ts +5 -3
  189. package/src/types.ts +17 -4
  190. package/dist/components/AccountInfo/AccountInfo.stories.d.ts +0 -6
  191. package/dist/components/AddButton/AddButton.stories.d.ts +0 -6
  192. package/dist/components/Button/Button.stories.d.ts +0 -6
  193. package/dist/components/Checkbox/Checkbox.stories.d.ts +0 -8
  194. package/dist/components/CloseButton/CloseButton.stories.d.ts +0 -5
  195. package/dist/components/Colors/Colors.stories.d.ts +0 -5
  196. package/dist/components/ControlWrapper/ControlWrapper.stories.d.ts +0 -6
  197. package/dist/components/DateInput/DateInput.stories.d.ts +0 -7
  198. package/dist/components/DatePicker/DatePicker.stories.d.ts +0 -7
  199. package/dist/components/Description/Description.stories.d.ts +0 -16
  200. package/dist/components/FileInput/FileInput.stories.d.ts +0 -7
  201. package/dist/components/FileItem/FileItem.stories.d.ts +0 -8
  202. package/dist/components/FiltersPane/FiltersPane.stories.d.ts +0 -31
  203. package/dist/components/Flag/Flag.stories.d.ts +0 -12
  204. package/dist/components/FlexibleTable/FlexibleTable.stories.d.ts +0 -19
  205. package/dist/components/Icon/Icon.stories.d.ts +0 -6
  206. package/dist/components/IconButton/IconButton.stories.d.ts +0 -6
  207. package/dist/components/IncrementInput/IncrementInput.stories.d.ts +0 -6
  208. package/dist/components/Input/Input.stories.d.ts +0 -25
  209. package/dist/components/List/List.stories.d.ts +0 -5
  210. package/dist/components/Modal/Modal.stories.d.ts +0 -29
  211. package/dist/components/MoreMenu/MoreMenu.stories.d.ts +0 -6
  212. package/dist/components/MultiSelect/MultiSelect.stories.d.ts +0 -13
  213. package/dist/components/NewMoreMenu/NewMoreMenu.stories.d.ts +0 -12
  214. package/dist/components/Notification/Notification.stories.d.ts +0 -8
  215. package/dist/components/NumberInput/NumberInput.stories.d.ts +0 -7
  216. package/dist/components/PhoneInput/PhoneInput.stories.d.ts +0 -28
  217. package/dist/components/PhoneInput/components/PhoneInputCountryList/PhoneInputCountryList.stories.d.ts +0 -5
  218. package/dist/components/RadioButton/RadioButton.stories.d.ts +0 -7
  219. package/dist/components/SearchInput/SearchInput.stories.d.ts +0 -6
  220. package/dist/components/Select/CustomSelect.stories.d.ts +0 -11
  221. package/dist/components/Select/MultiSelect.stories.d.ts +0 -15
  222. package/dist/components/Select/Select.stories.d.ts +0 -15
  223. package/dist/components/Selector/Selector.stories.d.ts +0 -7
  224. package/dist/components/Skeleton/Skeleton.stories.d.ts +0 -6
  225. package/dist/components/SmartInput/SmartInput.stories.d.ts +0 -18
  226. package/dist/components/Status/Status.stories.d.ts +0 -6
  227. package/dist/components/Switch/Switch.stories.d.ts +0 -16
  228. package/dist/components/TextArea/TextArea.stories.d.ts +0 -17
  229. package/dist/components/TextButton/TextButton.stories.d.ts +0 -6
  230. package/dist/components/TextWithInfo/TextWithInfo.stories.d.ts +0 -12
  231. package/dist/components/TextWithTooltip/TextWithTooltip.stories.d.ts +0 -24
  232. package/dist/components/ThemedPreloader/ThemedPreloader.stories.d.ts +0 -17
  233. package/dist/components/Toaster/Toaster.stories.d.ts +0 -5
  234. package/dist/components/Tooltip/Tooltip.stories.d.ts +0 -5
  235. package/dist/components/WithMessages/WithMessages.stories.d.ts +0 -7
  236. package/dist/components/WithPopup/WithPopup.stories.d.ts +0 -16
  237. package/dist/components/WithTooltip/WithTooltip.stories.d.ts +0 -6
@@ -70,7 +70,8 @@ type ConfigValues = {
70
70
  custom: string;
71
71
  };
72
72
 
73
- interface IFiltersPaneWithCustomProps<Values, Content> extends IFiltersPaneProps<Values, Content> {
73
+ interface IFiltersPaneWithCustomProps<Values extends Record<string, unknown>, Content>
74
+ extends IFiltersPaneProps<Values, Content> {
74
75
  containerWidth: number;
75
76
  isSearchDisabled: boolean;
76
77
  shouldShowSettingsButton: boolean;
@@ -80,7 +81,7 @@ interface IFiltersPaneWithCustomProps<Values, Content> extends IFiltersPaneProps
80
81
  isClearableFields: boolean;
81
82
  }
82
83
 
83
- function FiltersPaneWithCustomProps<Values, Content>({
84
+ function FiltersPaneWithCustomProps<Values extends Record<string, unknown>, Content>({
84
85
  containerWidth,
85
86
  isSearchDisabled,
86
87
  shouldShowSettingsButton,
@@ -288,6 +289,7 @@ Default.args = {
288
289
  hasClearButton: true,
289
290
  isClearableFields: false,
290
291
  isDisabled: false,
292
+ shouldRenderDataId: false,
291
293
  containerWidth: 400,
292
294
  withFieldNameInLabel: true,
293
295
  isGroupingEnabled: true,
@@ -1,16 +1,20 @@
1
1
  import { useMemo } from 'react';
2
- import { addDataTestId, getTestId } from '@true-engineering/true-react-platform-helpers';
3
- import { addDataAttributes } from '../../helpers';
2
+ import {
3
+ addDataAttributes,
4
+ addDataTestId,
5
+ getTestId,
6
+ isNotEmpty,
7
+ } from '@true-engineering/true-react-platform-helpers';
4
8
  import { useTweakStyles } from '../../hooks';
5
9
  import { ICommonProps } from '../../types';
6
10
  import { Button } from '../Button';
7
- import { Icon } from '../Icon';
11
+ import { IIcon, renderIcon } from '../Icon';
8
12
  import { FilterWrapper, IFiltersPaneSearchProps, FiltersPaneSearch } from './components';
9
13
  import { getLocale } from './helpers';
10
14
  import { ConfigType, IFilterLocaleKey, IPartialFilterLocale } from './types';
11
15
  import { useStyles, IFiltersPaneStyles, clearButtonStyles } from './FiltersPane.styles';
12
16
 
13
- export interface IFiltersPaneProps<Values, Content = Values>
17
+ export interface IFiltersPaneProps<Values extends Record<string, unknown>, Content = Values>
14
18
  extends ICommonProps<IFiltersPaneStyles> {
15
19
  filtersConfig: ConfigType<Values>;
16
20
  enabledFilters?: Array<keyof ConfigType<Values>>;
@@ -23,6 +27,10 @@ export interface IFiltersPaneProps<Values, Content = Values>
23
27
  isDisabled?: boolean;
24
28
  /** @default true */
25
29
  hasClearButton?: boolean;
30
+ /** @default false */
31
+ shouldRenderDataId?: boolean;
32
+ /** @default 'filter' */
33
+ settingsIcon?: IIcon;
26
34
  onChangeFilters: (values: Partial<Values>) => void;
27
35
  onSettingsButtonClick?: () => void;
28
36
  onClear?: () => void;
@@ -39,6 +47,8 @@ export function FiltersPane<Values extends Record<string, unknown>, Content = Va
39
47
  search,
40
48
  isDisabled = false,
41
49
  hasClearButton = true,
50
+ shouldRenderDataId = false,
51
+ settingsIcon = 'filter',
42
52
  testId,
43
53
  onChangeFilters,
44
54
  onSettingsButtonClick,
@@ -61,10 +71,10 @@ export function FiltersPane<Values extends Record<string, unknown>, Content = Va
61
71
 
62
72
  const translates = useMemo(() => getLocale(localeKey, locale), [localeKey, locale]);
63
73
 
64
- const filtersKeys = enabledFilters || Object.keys(filtersConfig);
74
+ const filtersKeys = enabledFilters ?? Object.keys(filtersConfig);
65
75
 
66
76
  const handleClear = () => {
67
- if (onClear !== undefined) {
77
+ if (isNotEmpty(onClear)) {
68
78
  onClear();
69
79
  return;
70
80
  }
@@ -76,8 +86,7 @@ export function FiltersPane<Values extends Record<string, unknown>, Content = Va
76
86
 
77
87
  const shouldShowClearButton =
78
88
  hasClearButton &&
79
- (search !== undefined ||
80
- filtersKeys.filter((key) => filtersConfig[key] !== undefined).length > 0);
89
+ (isNotEmpty(search) || filtersKeys.some((key) => isNotEmpty(filtersConfig[key])));
81
90
 
82
91
  const clearButton = (
83
92
  <div className={classes.clear}>
@@ -95,7 +104,7 @@ export function FiltersPane<Values extends Record<string, unknown>, Content = Va
95
104
  );
96
105
 
97
106
  return (
98
- <div className={classes.root} {...addDataTestId(testId)} {...addDataAttributes(data)}>
107
+ <div className={classes.root} {...addDataAttributes(data, testId)}>
99
108
  {/* Settings */}
100
109
  {onSettingsButtonClick !== undefined && (
101
110
  <div
@@ -104,9 +113,7 @@ export function FiltersPane<Values extends Record<string, unknown>, Content = Va
104
113
  {...addDataTestId(testId, 'settings-button')}
105
114
  onClick={!isDisabled ? onSettingsButtonClick : undefined}
106
115
  >
107
- <div className={classes.settingsIcon}>
108
- <Icon type="filter" />
109
- </div>
116
+ <div className={classes.settingsIcon}>{renderIcon(settingsIcon)}</div>
110
117
  </div>
111
118
  )}
112
119
  {/* Search */}
@@ -122,10 +129,11 @@ export function FiltersPane<Values extends Record<string, unknown>, Content = Va
122
129
  {/* Filters */}
123
130
  {filtersKeys.map((key, index) => {
124
131
  const isLast = index === filtersKeys.length - 1;
125
- const currentValue = values[key];
126
- const filter = filtersConfig[key];
132
+ const filterKey = String(key);
133
+ const currentValue = values[filterKey];
134
+ const filter = filtersConfig[filterKey];
127
135
  if (filter === undefined) {
128
- console.error(`enabledFilters содержит фильтр ${String(key)}, не описанный в конфиге`);
136
+ console.error(`enabledFilters содержит фильтр ${filterKey}, не описанный в конфиге`);
129
137
  if (isLast) {
130
138
  return clearButton;
131
139
  }
@@ -137,18 +145,19 @@ export function FiltersPane<Values extends Record<string, unknown>, Content = Va
137
145
  filter={filter}
138
146
  locale={locale}
139
147
  localeKey={localeKey}
140
- onChange={(value) => onChangeFilters({ ...values, [key]: value })}
148
+ onChange={(value) => onChangeFilters({ ...values, [filterKey]: value })}
141
149
  value={currentValue}
142
- key={key as string}
150
+ key={filterKey}
143
151
  isDisabled={isDisabled || filter?.requiredFilledFilters?.some((item) => !values[item])}
144
152
  tweakStyles={tweakFilterWrapperStyles}
145
- testId={getTestId(testId, `filter-${String(key)}`)}
153
+ data={shouldRenderDataId ? { id: filterKey } : undefined}
154
+ testId={getTestId(testId, `filter-${filterKey}`)}
146
155
  />
147
156
  );
148
157
 
149
158
  if (isLast) {
150
159
  return (
151
- <div className={classes.filterWithClearButton} key={key as string}>
160
+ <div className={classes.filterWithClearButton} key={filterKey}>
152
161
  {filterWrapper}
153
162
  {shouldShowClearButton && <>{clearButton}</>}
154
163
  </div>
@@ -1,20 +1,21 @@
1
1
  import { useMemo } from 'react';
2
+ import { getTestId } from '@true-engineering/true-react-platform-helpers';
2
3
  import { getLocale } from '../../helpers';
3
- import { IFilterMultiSelectValues, IFilterWithDatesValue, IPeriod } from '../../types';
4
4
  import { FilterInterval } from '../FilterInterval';
5
5
  import { FilterMultiSelect } from '../FilterMultiSelect';
6
6
  import { FilterSelect } from '../FilterSelect';
7
7
  import { FilterWithDates } from '../FilterWithDates';
8
8
  import { FilterWithPeriod } from '../FilterWithPeriod';
9
9
  import type { IFilterWrapperProps } from '../FilterWrapper';
10
+ import { isDatePeriodValue, isMultiSelectValue, isPeriodValue } from './helpers';
10
11
 
11
- export interface IFilterProps<Values, Key extends keyof Values>
12
+ export interface IFilterProps<Values extends Record<string, unknown>, Key extends keyof Values>
12
13
  extends IFilterWrapperProps<Values, Key> {
13
14
  onChange: <V>(v: V) => void;
14
15
  onClose?: () => void;
15
16
  }
16
17
 
17
- export function Filter<Values, Key extends keyof Values>(
18
+ export function Filter<Values extends Record<string, unknown>, Key extends keyof Values>(
18
19
  props: IFilterProps<Values, Key>,
19
20
  ): JSX.Element | null {
20
21
  const { filter, value, onChange, onClose, localeKey, locale, testId } = props;
@@ -32,83 +33,88 @@ export function Filter<Values, Key extends keyof Values>(
32
33
  onClose={onClose}
33
34
  localeKey={translatesLocaleKey}
34
35
  locale={translates}
35
- testId={testId !== undefined ? `${testId}-select` : undefined}
36
+ testId={getTestId(testId, 'select')}
36
37
  {...filter}
37
38
  />
38
39
  );
39
40
  }
40
41
 
41
42
  if (filter.type === 'dateRange') {
43
+ const preparedValue = isPeriodValue(value) ? { ...value } : undefined;
44
+
42
45
  return (
43
46
  <FilterWithPeriod
44
- value={{ ...value } as IPeriod}
47
+ value={preparedValue}
45
48
  onChange={onChange}
46
49
  onClose={onClose}
47
50
  localeKey={translatesLocaleKey}
48
51
  locale={translates}
49
- testId={testId !== undefined ? `${testId}-period` : undefined}
52
+ testId={getTestId(testId, 'period')}
50
53
  {...filter}
51
54
  />
52
55
  );
53
56
  }
54
57
 
55
58
  if (filter.type === 'dateRangeWithoutPeriod') {
59
+ const preparedValue = isDatePeriodValue(value) ? value : undefined;
60
+
56
61
  return (
57
- <div style={{ width: 320 }}>
58
- <FilterWithDates
59
- value={value as unknown as IFilterWithDatesValue}
60
- onChange={(v) => onChange({ ...v, periodType: 'CUSTOM' })}
61
- onEndBtnSubmit={() => onChange(undefined)}
62
- localeKey={translatesLocaleKey}
63
- locale={translates}
64
- testId={testId !== undefined ? `${testId}-dates` : undefined}
65
- {...filter}
66
- />
67
- </div>
62
+ <FilterWithDates
63
+ value={preparedValue}
64
+ onChange={(v) => onChange({ ...v, periodType: 'CUSTOM' })}
65
+ onEndBtnSubmit={() => onChange(undefined)}
66
+ localeKey={translatesLocaleKey}
67
+ locale={translates}
68
+ testId={getTestId(testId, 'dates')}
69
+ {...filter}
70
+ />
68
71
  );
69
72
  }
70
73
 
71
74
  if (filter.type === 'multiSelect') {
75
+ const preparedValue = isMultiSelectValue<any>(value) ? value : undefined; // eslint-disable-line @typescript-eslint/no-explicit-any
76
+
72
77
  return (
73
78
  <FilterMultiSelect
74
- value={value as unknown as IFilterMultiSelectValues<any>}
79
+ value={preparedValue}
75
80
  onChange={onChange}
76
81
  onClose={onClose}
77
82
  localeKey={translatesLocaleKey}
78
83
  locale={translates}
79
- testId={testId !== undefined ? `${testId}-multiSelect` : undefined}
84
+ testId={getTestId(testId, 'multiSelect')}
80
85
  {...filter}
81
86
  />
82
87
  );
83
88
  }
84
89
 
85
90
  if (filter.type === 'interval') {
91
+ const preparedValue = Array.isArray(value) ? (value as number[]) : undefined;
92
+
86
93
  return (
87
94
  <FilterInterval
88
- value={value as unknown as number[]}
95
+ value={preparedValue}
89
96
  onChange={onChange}
90
97
  localeKey={translatesLocaleKey}
91
98
  locale={translates}
92
99
  labelName={filter.name}
93
- testId={testId !== undefined ? `${testId}-interval` : undefined}
100
+ testId={getTestId(testId, 'interval')}
94
101
  {...filter}
95
102
  />
96
103
  );
97
104
  }
98
105
 
99
- if (filter.type === 'boolean') {
100
- return null;
101
- }
102
-
103
106
  if (filter.type === 'custom' && filter.component) {
104
107
  const Component = filter.component;
105
- return <Component {...props} filter={filter} />;
108
+
109
+ return <Component {...props} filter={filter} testId={getTestId(testId, 'dropdown')} />;
106
110
  }
107
111
 
108
- console.warn(
109
- `%cДля фильтра ${filter.name} не задан тип или component`,
110
- 'background: red; color: black',
111
- );
112
+ if (filter.type !== 'boolean') {
113
+ console.warn(
114
+ `%cДля фильтра ${filter.name} не задан тип или component`,
115
+ 'background: red; color: black',
116
+ );
117
+ }
112
118
 
113
119
  return null;
114
120
  }
@@ -0,0 +1,18 @@
1
+ import { isEmpty, isString } from '@true-engineering/true-react-platform-helpers';
2
+ import { IDatePeriod, IFilterMultiSelectValues, IPeriod } from '../../types';
3
+
4
+ const isDateOrEmpty = (value: unknown): value is Date | null | undefined =>
5
+ isEmpty(value) || value instanceof Date;
6
+
7
+ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any
8
+ export const isDatePeriodValue = (value: any): value is IDatePeriod =>
9
+ isDateOrEmpty(value?.from) && isDateOrEmpty(value?.to);
10
+
11
+ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any
12
+ export const isPeriodValue = (value: any): value is IPeriod =>
13
+ isString(value?.periodType) && isDatePeriodValue(value);
14
+
15
+ export const isMultiSelectValue = <T extends string>(
16
+ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any
17
+ value: any,
18
+ ): value is IFilterMultiSelectValues<T> => Array.isArray(value?.include);
@@ -1,8 +1,14 @@
1
1
  import { ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
2
  import clsx from 'clsx';
3
3
  import { debounce } from 'ts-debounce';
4
- import { isReactNodeNotEmpty } from '@true-engineering/true-react-platform-helpers';
5
- import { addDataAttributes } from '../../../../helpers';
4
+ import {
5
+ addDataTestId,
6
+ getTestId,
7
+ isReactNodeNotEmpty,
8
+ addDataAttributes,
9
+ isArrayNotEmpty,
10
+ isNotEmpty,
11
+ } from '@true-engineering/true-react-platform-helpers';
6
12
  import { useIsMounted, useTweakStyles } from '../../../../hooks';
7
13
  import { ICommonProps } from '../../../../types';
8
14
  import { Button } from '../../../Button';
@@ -227,7 +233,7 @@ export function FilterSelect<Value>({
227
233
  }, []);
228
234
 
229
235
  return (
230
- <div className={classes.root} {...addDataAttributes(data)}>
236
+ <div className={classes.root} {...addDataAttributes(data, testId)}>
231
237
  {isSearchEnabled && (
232
238
  <div className={classes.dropdownInput}>
233
239
  <SearchInput
@@ -235,7 +241,7 @@ export function FilterSelect<Value>({
235
241
  placeholder={translates.searchPlaceholder}
236
242
  onChange={handleOnChange}
237
243
  tweakStyles={tweakSearchInputStyles}
238
- testId={testId !== undefined ? `${testId}-search` : undefined}
244
+ testId={getTestId(testId, 'search')}
239
245
  shouldFocusOnMount
240
246
  />
241
247
  </div>
@@ -243,19 +249,17 @@ export function FilterSelect<Value>({
243
249
 
244
250
  {!isLoading && (
245
251
  <>
246
- {allOptions.length !== 0 && (
252
+ {isArrayNotEmpty(allOptions) && (
247
253
  <div
248
- className={clsx(classes.list, hasClearButton && classes.withClearButton)}
249
- data-testid={testId !== undefined ? `${testId}-list` : undefined}
254
+ className={clsx(classes.list, { [classes.withClearButton]: hasClearButton })}
255
+ {...addDataTestId(testId, 'list')}
250
256
  >
251
- {isGroupingEnabled && value !== undefined && (
257
+ {isGroupingEnabled && isNotEmpty(value) && (
252
258
  <>
253
259
  <div
254
- className={clsx(
255
- classes.label,
256
- classes.labelChosen,
257
- !isSearchEnabled && classes.withoutTopGap,
258
- )}
260
+ className={clsx(classes.label, classes.labelChosen, {
261
+ [classes.withoutTopGap]: !isSearchEnabled,
262
+ })}
259
263
  >
260
264
  {translates.chosen}
261
265
  </div>
@@ -269,7 +273,7 @@ export function FilterSelect<Value>({
269
273
  </>
270
274
  )}
271
275
  {allOptions.map((item, index) => {
272
- const isActive = value !== undefined && getValueId(value) === getValueId(item);
276
+ const isActive = isNotEmpty(value) && getValueId(value) === getValueId(item);
273
277
  if (isGroupingEnabled && isActive) {
274
278
  return null;
275
279
  }
@@ -287,8 +291,7 @@ export function FilterSelect<Value>({
287
291
  }
288
292
  onClick={() => handleChange(item)}
289
293
  >
290
- {/* data нужно ли? */}
291
- <div className={classes.option} data-option={id}>
294
+ <div className={classes.option} {...addDataAttributes({ id, option: id })}>
292
295
  {view}
293
296
  </div>
294
297
  {isActive && (
@@ -320,17 +323,13 @@ export function FilterSelect<Value>({
320
323
  )}
321
324
 
322
325
  {/* Nothing found */}
323
- {allOptions.length === 0 && (
326
+ {!isArrayNotEmpty(allOptions) && (
324
327
  <div className={classes.nothingFound}>{translates.nothingFound}</div>
325
328
  )}
326
329
 
327
330
  {/* Controls and footer */}
328
331
  {(hasClearButton || hasFooter) && (
329
- <div
330
- className={clsx(classes.panel, {
331
- [classes.panelWithFooter]: hasFooter,
332
- })}
333
- >
332
+ <div className={clsx(classes.panel, { [classes.panelWithFooter]: hasFooter })}>
334
333
  {hasFooter && <div className={classes.footer}>{footer}</div>}
335
334
 
336
335
  {hasClearButton && (
@@ -339,7 +338,7 @@ export function FilterSelect<Value>({
339
338
  onClick={handleClear}
340
339
  size="s"
341
340
  view="text"
342
- testId={testId !== undefined ? `${testId}-clear-button` : undefined}
341
+ testId={getTestId(testId, 'clear-button')}
343
342
  tweakStyles={tweakClearButtonStyles}
344
343
  >
345
344
  {translates.clear}
@@ -9,14 +9,17 @@ import { IDateRangeConfigItem, IFilterWithDatesValue, IPeriod } from '../../type
9
9
  import type { IFilterWrapperProps } from '../FilterWrapper';
10
10
  import { IFilterValueViewStyles, useStyles } from './FilterValueView.styles';
11
11
 
12
- export function FilterValueView<Values, Key extends keyof Values>({
12
+ export interface IFilterValueView<Values extends Record<string, unknown>, Key extends keyof Values>
13
+ extends Omit<IFilterWrapperProps<Values, Key>, 'filtersPaneRef' | 'tweakStyles' | 'onChange'>,
14
+ ICommonProps<IFilterValueViewStyles> {}
15
+
16
+ export function FilterValueView<Values extends Record<string, unknown>, Key extends keyof Values>({
17
+ value,
18
+ filter,
13
19
  locale,
14
20
  localeKey,
15
- filter,
16
- value,
17
21
  tweakStyles,
18
- }: Omit<IFilterWrapperProps<Values, Key>, 'onChange' | 'filtersPaneRef' | 'tweakStyles'> &
19
- ICommonProps<IFilterValueViewStyles>): JSX.Element {
22
+ }: IFilterValueView<Values, Key>): JSX.Element {
20
23
  const classes = useStyles({ theme: tweakStyles });
21
24
 
22
25
  const translatesLocaleKey = filter.localeKey ?? localeKey;
@@ -29,7 +32,7 @@ export function FilterValueView<Values, Key extends keyof Values>({
29
32
  return <></>;
30
33
  }
31
34
 
32
- if (filter.getSelectedValueView !== undefined) {
35
+ if (isNotEmpty(filter.getSelectedValueView)) {
33
36
  return <span className={classes.text}>{filter.getSelectedValueView(value)}</span>;
34
37
  }
35
38
 
@@ -94,7 +97,7 @@ export function FilterValueView<Values, Key extends keyof Values>({
94
97
  const intervalValueFrom = intervalValue[0];
95
98
  const intervalValueTo = intervalValue[1];
96
99
 
97
- const intervals = [];
100
+ const intervals: string[] = [];
98
101
  if (intervalValueFrom !== undefined) {
99
102
  intervals.push(`${translates.from.toLowerCase()} ${String(intervalValueFrom)}`);
100
103
  }
@@ -105,19 +108,6 @@ export function FilterValueView<Values, Key extends keyof Values>({
105
108
  return <span className={classes.text}>{intervals.join(' ')}</span>;
106
109
  }
107
110
 
108
- if (isMultiple) {
109
- return (
110
- <>
111
- {Array.isArray(value) && value.length > 0 && (
112
- <>
113
- <span className={classes.text}>{displayValue(value[0])}</span>
114
- <span className={classes.count}>{value.length > 1 && ` (+${value.length - 1})`}</span>
115
- </>
116
- )}
117
- </>
118
- );
119
- }
120
-
121
111
  if (isDate) {
122
112
  const { from, to, periodType, label } = value as unknown as IPeriod;
123
113
  const hasFrom = from !== undefined && from !== null;
@@ -127,7 +117,7 @@ export function FilterValueView<Values, Key extends keyof Values>({
127
117
  return <span className={classes.text}>{displayValue(label)}</span>;
128
118
  }
129
119
 
130
- const range = [];
120
+ const range: string[] = [];
131
121
  if (hasFrom) {
132
122
  if (!hasTo) {
133
123
  range.push(translates.from.toLowerCase());
@@ -146,12 +136,27 @@ export function FilterValueView<Values, Key extends keyof Values>({
146
136
  return <span className={classes.text}>{range.join(' ')}</span>;
147
137
  }
148
138
 
139
+ if (isMultiple) {
140
+ const convertValue = filter.getSelectedValue ?? displayValue;
141
+
142
+ return (
143
+ <>
144
+ {Array.isArray(value) && value.length > 0 && (
145
+ <>
146
+ <span className={classes.text}>{convertValue(value[0])}</span>
147
+ <span className={classes.count}>{value.length > 1 && ` (+${value.length - 1})`}</span>
148
+ </>
149
+ )}
150
+ </>
151
+ );
152
+ }
153
+
149
154
  if (isRange && Array.isArray(value)) {
150
155
  const rangeValue = value as unknown as number[];
151
156
  const rangeValueFrom = rangeValue[0];
152
157
  const rangeValueTo = rangeValue[1];
153
158
 
154
- const range = [];
159
+ const range: string[] = [];
155
160
  if (rangeValueFrom !== undefined) {
156
161
  range.push(`${translates.from.toLowerCase()} ${String(rangeValueFrom)}`);
157
162
  }
@@ -6,6 +6,7 @@ import { innerTextButtonStyles } from '../../FiltersPane.styles';
6
6
 
7
7
  export const useStyles = createThemedStyles('FilterWithDates', {
8
8
  root: {
9
+ width: 320,
9
10
  background: colors.CLASSIC_WHITE,
10
11
  position: 'relative',
11
12
  zIndex: 20,
@@ -37,7 +38,7 @@ export const clearButtonStyles = cloneDeep(innerTextButtonStyles);
37
38
  export const backButtonStyles = innerTextButtonStyles;
38
39
 
39
40
  const PICKER_TOP_MARGIN = 28;
40
- const PICKER_WITH_BUTTONS_TOP_MARGIN = 60;
41
+ const PICKER_WITH_BUTTONS_TOP_MARGIN = 56;
41
42
  const START_PICKER_LEFT_MARGIN = -20;
42
43
  const END_PICKER_LEFT_MARGIN = -170;
43
44
 
@@ -1,7 +1,6 @@
1
1
  import { FC, useMemo, useRef, useState } from 'react';
2
2
  import { isAfter, isBefore } from 'date-fns';
3
- import enUS from 'date-fns/locale/en-US';
4
- import ru from 'date-fns/locale/ru';
3
+ import { enUS, ru } from 'date-fns/locale';
5
4
  import { getTestId, isNotEmpty } from '@true-engineering/true-react-platform-helpers';
6
5
  import { addDataAttributes } from '../../../../helpers';
7
6
  import { useTweakStyles } from '../../../../hooks';
@@ -133,7 +132,7 @@ export const FilterWithDates: FC<IFilterWithDatesProps> = ({
133
132
  <div className={classes.containerItem}>
134
133
  <DatePicker
135
134
  selectedDate={value?.from}
136
- maxDate={value?.to}
135
+ maxDate={value?.to ?? undefined}
137
136
  label={translates.from}
138
137
  months={translates.months}
139
138
  locale={dateLocale}
@@ -149,7 +148,7 @@ export const FilterWithDates: FC<IFilterWithDatesProps> = ({
149
148
  selectedDate={value?.to}
150
149
  label={translates.to}
151
150
  months={translates.months}
152
- minDate={value?.from}
151
+ minDate={value?.from ?? undefined}
153
152
  locale={dateLocale}
154
153
  onChangeDate={handleChangeTo}
155
154
  tweakStyles={tweakEndDatePickerStyles}
@@ -1,4 +1,5 @@
1
1
  import { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
+ import { getTestId } from '@true-engineering/true-react-platform-helpers';
2
3
  import { useOnClickOutside, useTweakStyles } from '../../../../hooks';
3
4
  import { ICommonProps } from '../../../../types';
4
5
  import { PERIODS, PERIODS_GETTERS } from '../../constants';
@@ -146,12 +147,12 @@ export const FilterWithPeriod: FC<IFilterWithPeriodProps> = ({
146
147
  locale={translates}
147
148
  tweakStyles={tweakSelectStyles}
148
149
  getValueView={getPeriodTranslate}
149
- testId={testId !== undefined ? `${testId}-select` : undefined}
150
+ testId={getTestId(testId, 'select')}
150
151
  />
151
152
  </div>
152
153
  )}
153
154
  {isDatePickerShown && (
154
- <div className={classes.picker} style={{ width: 320 }} ref={refDatePicker}>
155
+ <div className={classes.picker} ref={refDatePicker}>
155
156
  <FilterWithDates
156
157
  onStartBtnSubmit={() => {
157
158
  setIsDatePickerShown(false);
@@ -168,7 +169,7 @@ export const FilterWithPeriod: FC<IFilterWithPeriodProps> = ({
168
169
  onChange={handleCustomDateChange}
169
170
  localeKey={localeKey}
170
171
  locale={translates}
171
- testId={testId !== undefined ? `${testId}-dates` : undefined}
172
+ testId={getTestId(testId, 'dates')}
172
173
  />
173
174
  </div>
174
175
  )}
@@ -1,7 +1,10 @@
1
1
  import { MouseEventHandler } from 'react';
2
2
  import clsx from 'clsx';
3
- import { addDataTestId, getTestId } from '@true-engineering/true-react-platform-helpers';
4
- import { addDataAttributes } from '../../../../helpers';
3
+ import {
4
+ addDataAttributes,
5
+ getTestId,
6
+ isNotEmpty,
7
+ } from '@true-engineering/true-react-platform-helpers';
5
8
  import { useTweakStyles } from '../../../../hooks';
6
9
  import { ICommonProps } from '../../../../types';
7
10
  import { Icon } from '../../../Icon';
@@ -12,8 +15,10 @@ import { FilterValueView } from '../FilterValueView';
12
15
  import { isContentNotEmpty } from './helpers';
13
16
  import { useStyles, IFilterWrapperStyles } from './FilterWrapper.styles';
14
17
 
15
- export interface IFilterWrapperProps<Values, Key extends keyof Values>
16
- extends ICommonProps<IFilterWrapperStyles> {
18
+ export interface IFilterWrapperProps<
19
+ Values extends Record<string, unknown>,
20
+ Key extends keyof Values,
21
+ > extends ICommonProps<IFilterWrapperStyles> {
17
22
  filter: ConfigItem<Values[Key]>;
18
23
  value?: Values[Key];
19
24
  isDisabled?: boolean;
@@ -22,7 +27,7 @@ export interface IFilterWrapperProps<Values, Key extends keyof Values>
22
27
  onChange: <V>(value: V) => void;
23
28
  }
24
29
 
25
- export function FilterWrapper<Values, Key extends keyof Values>({
30
+ export function FilterWrapper<Values extends Record<string, unknown>, Key extends keyof Values>({
26
31
  filter,
27
32
  value,
28
33
  isDisabled,
@@ -91,8 +96,7 @@ export function FilterWrapper<Values, Key extends keyof Values>({
91
96
  [classes.boolean]: isBoolean,
92
97
  [classes.disabled]: isDisabled,
93
98
  })}
94
- {...addDataTestId(testId)}
95
- {...addDataAttributes(data)}
99
+ {...addDataAttributes(data, testId)}
96
100
  {...referenceProps}
97
101
  >
98
102
  <div
@@ -100,13 +104,13 @@ export function FilterWrapper<Values, Key extends keyof Values>({
100
104
  className={clsx(classes.item, { [classes.booleanItem]: isBoolean })}
101
105
  >
102
106
  <div className={classes.name}>{filter.name}</div>
103
- {!isBoolean && value !== undefined && value !== null && (
107
+ {!isBoolean && isNotEmpty(value) && (
104
108
  <div className={classes.value}>
105
109
  <FilterValueView
106
110
  value={value}
107
111
  filter={filter}
108
- localeKey={localeKey}
109
112
  locale={locale}
113
+ localeKey={localeKey}
110
114
  testId={getTestId(testId, 'value')}
111
115
  tweakStyles={tweakFilterValueViewStyles}
112
116
  />
@@ -137,8 +141,8 @@ export function FilterWrapper<Values, Key extends keyof Values>({
137
141
  <Filter
138
142
  value={value}
139
143
  filter={filter}
140
- localeKey={localeKey}
141
144
  locale={locale}
145
+ localeKey={localeKey}
142
146
  onClose={onClose}
143
147
  onChange={onChange}
144
148
  testId={testId}