@true-engineering/true-react-common-ui-kit 4.0.0-alpha3 → 4.0.0-alpha30
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/README.md +11 -607
- package/dist/components/Button/Button.styles.d.ts +1 -1
- package/dist/components/Checkbox/Checkbox.styles.d.ts +1 -1
- package/dist/components/ControlWrapper/ControlWrapper.d.ts +4 -2
- package/dist/components/ControlWrapper/ControlWrapper.styles.d.ts +2 -1
- package/dist/components/ControlWrapper/helpers.d.ts +4 -0
- package/dist/components/ControlWrapper/index.d.ts +2 -0
- package/dist/components/ControlWrapper/types.d.ts +12 -0
- package/dist/components/DatePicker/DatePicker.d.ts +3 -3
- package/dist/components/DatePicker/DatePicker.styles.d.ts +1 -1
- package/dist/components/DatePicker/components/PopperContainer/PopperContainer.d.ts +2 -4
- package/dist/components/DatePicker/helpers.d.ts +3 -0
- package/dist/components/DatePicker/types.d.ts +5 -3
- package/dist/components/FiltersPane/FiltersPane.d.ts +7 -2
- package/dist/components/FiltersPane/components/Filter/Filter.d.ts +2 -2
- package/dist/components/FiltersPane/components/Filter/helpers.d.ts +4 -0
- package/dist/components/FiltersPane/components/FilterInterval/FilterInterval.styles.d.ts +1 -1
- package/dist/components/FiltersPane/components/FilterSelect/FilterSelect.styles.d.ts +1 -1
- package/dist/components/FiltersPane/components/FilterValueView/FilterValueView.d.ts +3 -1
- package/dist/components/FiltersPane/components/FilterWithDates/FilterWithDates.styles.d.ts +2 -2
- package/dist/components/FiltersPane/components/FilterWrapper/FilterWrapper.d.ts +2 -2
- package/dist/components/FiltersPane/components/FiltersPaneSearch/FiltersPaneSearch.styles.d.ts +1 -1
- package/dist/components/FiltersPane/types.d.ts +16 -5
- package/dist/components/Flag/customFlags/customFlags.d.ts +10 -0
- package/dist/components/Flag/customFlags/index.d.ts +1 -0
- package/dist/components/FlexibleTable/FlexibleTable.d.ts +4 -2
- package/dist/components/FlexibleTable/components/FlexibleTableCell/FlexibleTableCell.d.ts +4 -3
- package/dist/components/FlexibleTable/components/FlexibleTableRow/FlexibleTableRow.d.ts +6 -6
- package/dist/components/FlexibleTable/constants.d.ts +18 -2
- package/dist/components/FlexibleTable/types.d.ts +20 -12
- package/dist/components/Icon/icons-list.d.ts +1 -1
- package/dist/components/IconButton/IconButton.styles.d.ts +1 -1
- package/dist/components/IncrementInput/IncrementInput.styles.d.ts +1 -3
- package/dist/components/Input/Input.d.ts +3 -2
- package/dist/components/Input/InputBase.d.ts +2 -2
- package/dist/components/List/List.d.ts +1 -1
- package/dist/components/List/index.d.ts +2 -1
- package/dist/components/List/types.d.ts +4 -0
- package/dist/components/Modal/Modal.styles.d.ts +1 -1
- package/dist/components/Notification/Notification.styles.d.ts +1 -1
- package/dist/components/ScrollIntoViewIfNeeded/ScrollIntoViewIfNeeded.d.ts +1 -1
- package/dist/components/SearchInput/SearchInput.d.ts +2 -2
- package/dist/components/Select/Select.d.ts +5 -3
- package/dist/components/Select/Select.styles.d.ts +5 -5
- package/dist/components/Select/components/SelectListItem/SelectListItem.d.ts +2 -1
- package/dist/components/Select/index.d.ts +1 -1
- package/dist/components/Status/Status.styles.d.ts +3 -2
- package/dist/components/Status/constants.d.ts +0 -1
- package/dist/components/Status/index.d.ts +1 -0
- package/dist/components/Status/types.d.ts +5 -2
- package/dist/components/TextArea/TextArea.d.ts +4 -5
- package/dist/components/TextArea/TextArea.styles.d.ts +5 -4
- package/dist/components/TextArea/index.d.ts +1 -1
- package/dist/components/TextArea/types.d.ts +4 -2
- package/dist/components/TextButton/TextButton.styles.d.ts +1 -1
- package/dist/components/Tooltip/Tooltip.d.ts +1 -1
- package/dist/components/Tooltip/Tooltip.styles.d.ts +1 -1
- package/dist/components/WithMessages/WithMessages.styles.d.ts +1 -1
- package/dist/components/WithPopup/WithPopup.d.ts +11 -3
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/use-intersection-ref.d.ts +8 -0
- package/dist/hooks/use-merge.d.ts +1 -0
- package/dist/hooks/use-mixed-styles.d.ts +3 -1
- package/dist/hooks/use-tweak-styles.d.ts +5 -5
- package/dist/style.css +78 -142
- package/dist/theme/Provider.d.ts +6 -3
- package/dist/theme/create-themed-styles.d.ts +2 -0
- package/dist/theme/helpers.d.ts +9 -3
- package/dist/theme/index.d.ts +2 -0
- package/dist/theme/true-jss/ThemedStylesManager.d.ts +18 -0
- package/dist/theme/true-jss/TweakStylesManager.d.ts +34 -0
- package/dist/theme/true-jss/index.d.ts +2 -0
- package/dist/theme/true-jss/jss-context.d.ts +9 -0
- package/dist/theme/types.d.ts +5 -3
- package/dist/true-react-common-ui-kit.js +7593 -6483
- package/dist/true-react-common-ui-kit.js.map +1 -1
- package/dist/true-react-common-ui-kit.umd.cjs +7618 -6509
- package/dist/true-react-common-ui-kit.umd.cjs.map +1 -1
- package/dist/types.d.ts +10 -3
- package/package.json +4 -5
- package/src/components/ControlWrapper/ControlWrapper.stories.tsx +8 -3
- package/src/components/ControlWrapper/ControlWrapper.styles.ts +7 -6
- package/src/components/ControlWrapper/ControlWrapper.tsx +31 -20
- package/src/components/ControlWrapper/helpers.ts +11 -0
- package/src/components/ControlWrapper/index.ts +2 -0
- package/src/components/ControlWrapper/types.ts +16 -0
- package/src/components/DateInput/DateInput.stories.tsx +0 -1
- package/src/components/DatePicker/DatePicker.stories.tsx +24 -11
- package/src/components/DatePicker/DatePicker.styles.ts +3 -1
- package/src/components/DatePicker/DatePicker.tsx +18 -10
- package/src/components/DatePicker/components/PopperContainer/PopperContainer.tsx +4 -4
- package/src/components/DatePicker/helpers.ts +13 -1
- package/src/components/DatePicker/types.ts +9 -4
- package/src/components/FiltersPane/FiltersPane.stories.tsx +4 -2
- package/src/components/FiltersPane/FiltersPane.tsx +28 -19
- package/src/components/FiltersPane/components/Filter/Filter.tsx +36 -30
- package/src/components/FiltersPane/components/Filter/helpers.ts +18 -0
- package/src/components/FiltersPane/components/FilterSelect/FilterSelect.tsx +22 -23
- package/src/components/FiltersPane/components/FilterValueView/FilterValueView.tsx +27 -22
- package/src/components/FiltersPane/components/FilterWithDates/FilterWithDates.styles.ts +2 -1
- package/src/components/FiltersPane/components/FilterWithDates/FilterWithDates.tsx +3 -4
- package/src/components/FiltersPane/components/FilterWithPeriod/FilterWithPeriod.tsx +4 -3
- package/src/components/FiltersPane/components/FilterWrapper/FilterWrapper.tsx +14 -10
- package/src/components/FiltersPane/components/FiltersPaneSearch/FiltersPaneSearch.styles.ts +5 -0
- package/src/components/FiltersPane/components/FiltersPaneSearch/FiltersPaneSearch.tsx +16 -19
- package/src/components/FiltersPane/types.ts +24 -5
- package/src/components/Flag/Flag.stories.tsx +2 -1
- package/src/components/Flag/Flag.styles.ts +4 -0
- package/src/components/Flag/Flag.tsx +23 -9
- package/src/components/Flag/customFlags/AB.svg +1 -0
- package/src/components/Flag/customFlags/OS.svg +1 -0
- package/src/components/Flag/customFlags/augment.d.ts +1 -0
- package/src/components/Flag/customFlags/customFlags.ts +13 -0
- package/src/components/Flag/customFlags/index.ts +1 -0
- package/src/components/FlexibleTable/FlexibleTable.tsx +40 -63
- package/src/components/FlexibleTable/components/FlexibleTableCell/FlexibleTableCell.tsx +8 -5
- package/src/components/FlexibleTable/components/FlexibleTableRow/FlexibleTableRow.tsx +13 -12
- package/src/components/FlexibleTable/constants.ts +6 -3
- package/src/components/FlexibleTable/types.ts +20 -16
- package/src/components/IncrementInput/IncrementInput.stories.tsx +2 -0
- package/src/components/IncrementInput/IncrementInput.styles.ts +31 -39
- package/src/components/IncrementInput/IncrementInput.tsx +28 -25
- package/src/components/Input/Input.stories.tsx +1 -6
- package/src/components/Input/Input.tsx +5 -3
- package/src/components/Input/InputBase.tsx +27 -25
- package/src/components/List/List.tsx +5 -2
- package/src/components/List/index.ts +2 -1
- package/src/components/List/types.ts +5 -0
- package/src/components/MultiSelectList/MultiSelectList.tsx +15 -11
- package/src/components/NumberInput/NumberInput.stories.tsx +5 -1
- package/src/components/PhoneInput/PhoneInput.stories.tsx +2 -1
- package/src/components/PhoneInput/PhoneInput.tsx +5 -2
- package/src/components/SearchInput/SearchInput.tsx +20 -29
- package/src/components/Select/CustomSelect.stories.tsx +1 -0
- package/src/components/Select/MultiSelect.stories.tsx +5 -0
- package/src/components/Select/Select.stories.tsx +6 -0
- package/src/components/Select/Select.styles.ts +5 -40
- package/src/components/Select/Select.tsx +36 -22
- package/src/components/Select/components/SelectList/SelectList.tsx +4 -2
- package/src/components/Select/components/SelectListItem/SelectListItem.tsx +5 -2
- package/src/components/Select/index.ts +1 -1
- package/src/components/Status/Status.stories.tsx +54 -1
- package/src/components/Status/Status.styles.ts +2 -37
- package/src/components/Status/constants.ts +0 -10
- package/src/components/Status/index.ts +1 -1
- package/src/components/Status/types.ts +7 -3
- package/src/components/TextArea/TextArea.stories.tsx +15 -1
- package/src/components/TextArea/TextArea.styles.ts +15 -8
- package/src/components/TextArea/TextArea.tsx +96 -62
- package/src/components/TextArea/index.ts +1 -1
- package/src/components/TextArea/types.ts +5 -5
- package/src/components/TextButton/TextButton.styles.ts +1 -0
- package/src/components/Tooltip/Tooltip.styles.ts +2 -0
- package/src/components/Tooltip/Tooltip.tsx +1 -1
- package/src/components/WithMessages/WithMessages.stories.tsx +1 -1
- package/src/components/WithPopup/WithPopup.tsx +36 -15
- package/src/constants/phone-info.ts +20 -33
- package/src/helpers/phone.ts +19 -15
- package/src/hooks/index.ts +2 -0
- package/src/hooks/use-intersection-ref.ts +30 -0
- package/src/hooks/use-merge.ts +8 -0
- package/src/hooks/use-mixed-styles.ts +9 -11
- package/src/hooks/use-tweak-styles.ts +49 -27
- package/src/theme/Provider.tsx +10 -5
- package/src/theme/create-themed-styles.ts +78 -0
- package/src/theme/helpers.ts +39 -39
- package/src/theme/index.ts +2 -0
- package/src/theme/true-jss/ThemedStylesManager.ts +92 -0
- package/src/theme/true-jss/TweakStylesManager.ts +157 -0
- package/src/theme/true-jss/index.ts +2 -0
- package/src/theme/true-jss/jss-context.tsx +34 -0
- package/src/theme/types.ts +5 -3
- package/src/types.ts +17 -4
- package/dist/components/AccountInfo/AccountInfo.stories.d.ts +0 -6
- package/dist/components/AddButton/AddButton.stories.d.ts +0 -6
- package/dist/components/Button/Button.stories.d.ts +0 -6
- package/dist/components/Checkbox/Checkbox.stories.d.ts +0 -8
- package/dist/components/CloseButton/CloseButton.stories.d.ts +0 -5
- package/dist/components/Colors/Colors.stories.d.ts +0 -5
- package/dist/components/ControlWrapper/ControlWrapper.stories.d.ts +0 -6
- package/dist/components/DateInput/DateInput.stories.d.ts +0 -7
- package/dist/components/DatePicker/DatePicker.stories.d.ts +0 -7
- package/dist/components/Description/Description.stories.d.ts +0 -16
- package/dist/components/FileInput/FileInput.stories.d.ts +0 -7
- package/dist/components/FileItem/FileItem.stories.d.ts +0 -8
- package/dist/components/FiltersPane/FiltersPane.stories.d.ts +0 -31
- package/dist/components/Flag/Flag.stories.d.ts +0 -12
- package/dist/components/FlexibleTable/FlexibleTable.stories.d.ts +0 -19
- package/dist/components/Icon/Icon.stories.d.ts +0 -6
- package/dist/components/IconButton/IconButton.stories.d.ts +0 -6
- package/dist/components/IncrementInput/IncrementInput.stories.d.ts +0 -6
- package/dist/components/Input/Input.stories.d.ts +0 -25
- package/dist/components/List/List.stories.d.ts +0 -5
- package/dist/components/Modal/Modal.stories.d.ts +0 -29
- package/dist/components/MoreMenu/MoreMenu.stories.d.ts +0 -6
- package/dist/components/MultiSelect/MultiSelect.stories.d.ts +0 -13
- package/dist/components/NewMoreMenu/NewMoreMenu.stories.d.ts +0 -12
- package/dist/components/Notification/Notification.stories.d.ts +0 -8
- package/dist/components/NumberInput/NumberInput.stories.d.ts +0 -7
- package/dist/components/PhoneInput/PhoneInput.stories.d.ts +0 -28
- package/dist/components/PhoneInput/components/PhoneInputCountryList/PhoneInputCountryList.stories.d.ts +0 -5
- package/dist/components/RadioButton/RadioButton.stories.d.ts +0 -7
- package/dist/components/SearchInput/SearchInput.stories.d.ts +0 -6
- package/dist/components/Select/CustomSelect.stories.d.ts +0 -11
- package/dist/components/Select/MultiSelect.stories.d.ts +0 -15
- package/dist/components/Select/Select.stories.d.ts +0 -15
- package/dist/components/Selector/Selector.stories.d.ts +0 -7
- package/dist/components/Skeleton/Skeleton.stories.d.ts +0 -6
- package/dist/components/SmartInput/SmartInput.stories.d.ts +0 -18
- package/dist/components/Status/Status.stories.d.ts +0 -6
- package/dist/components/Switch/Switch.stories.d.ts +0 -16
- package/dist/components/TextArea/TextArea.stories.d.ts +0 -17
- package/dist/components/TextButton/TextButton.stories.d.ts +0 -6
- package/dist/components/TextWithInfo/TextWithInfo.stories.d.ts +0 -12
- package/dist/components/TextWithTooltip/TextWithTooltip.stories.d.ts +0 -24
- package/dist/components/ThemedPreloader/ThemedPreloader.stories.d.ts +0 -17
- package/dist/components/Toaster/Toaster.stories.d.ts +0 -5
- package/dist/components/Tooltip/Tooltip.stories.d.ts +0 -5
- package/dist/components/WithMessages/WithMessages.stories.d.ts +0 -7
- package/dist/components/WithPopup/WithPopup.stories.d.ts +0 -16
- package/dist/components/WithTooltip/WithTooltip.stories.d.ts +0 -6
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import { useMemo } from 'react';
|
|
2
|
-
import {
|
|
3
|
-
|
|
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 {
|
|
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
|
|
74
|
+
const filtersKeys = enabledFilters ?? Object.keys(filtersConfig);
|
|
65
75
|
|
|
66
76
|
const handleClear = () => {
|
|
67
|
-
if (onClear
|
|
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
|
|
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} {...
|
|
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
|
|
126
|
-
const
|
|
132
|
+
const filterKey = String(key);
|
|
133
|
+
const currentValue = values[filterKey];
|
|
134
|
+
const filter = filtersConfig[filterKey];
|
|
127
135
|
if (filter === undefined) {
|
|
128
|
-
console.error(`enabledFilters содержит фильтр ${
|
|
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, [
|
|
148
|
+
onChange={(value) => onChangeFilters({ ...values, [filterKey]: value })}
|
|
141
149
|
value={currentValue}
|
|
142
|
-
key={
|
|
150
|
+
key={filterKey}
|
|
143
151
|
isDisabled={isDisabled || filter?.requiredFilledFilters?.some((item) => !values[item])}
|
|
144
152
|
tweakStyles={tweakFilterWrapperStyles}
|
|
145
|
-
|
|
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={
|
|
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
|
|
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={
|
|
47
|
+
value={preparedValue}
|
|
45
48
|
onChange={onChange}
|
|
46
49
|
onClose={onClose}
|
|
47
50
|
localeKey={translatesLocaleKey}
|
|
48
51
|
locale={translates}
|
|
49
|
-
testId={testId
|
|
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
|
-
<
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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={
|
|
79
|
+
value={preparedValue}
|
|
75
80
|
onChange={onChange}
|
|
76
81
|
onClose={onClose}
|
|
77
82
|
localeKey={translatesLocaleKey}
|
|
78
83
|
locale={translates}
|
|
79
|
-
testId={testId
|
|
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={
|
|
95
|
+
value={preparedValue}
|
|
89
96
|
onChange={onChange}
|
|
90
97
|
localeKey={translatesLocaleKey}
|
|
91
98
|
locale={translates}
|
|
92
99
|
labelName={filter.name}
|
|
93
|
-
testId={testId
|
|
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
|
-
|
|
108
|
+
|
|
109
|
+
return <Component {...props} filter={filter} testId={getTestId(testId, 'dropdown')} />;
|
|
106
110
|
}
|
|
107
111
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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 {
|
|
5
|
-
|
|
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
|
|
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
|
|
252
|
+
{isArrayNotEmpty(allOptions) && (
|
|
247
253
|
<div
|
|
248
|
-
className={clsx(classes.list,
|
|
249
|
-
|
|
254
|
+
className={clsx(classes.list, { [classes.withClearButton]: hasClearButton })}
|
|
255
|
+
{...addDataTestId(testId, 'list')}
|
|
250
256
|
>
|
|
251
|
-
{isGroupingEnabled && value
|
|
257
|
+
{isGroupingEnabled && isNotEmpty(value) && (
|
|
252
258
|
<>
|
|
253
259
|
<div
|
|
254
|
-
className={clsx(
|
|
255
|
-
classes.
|
|
256
|
-
|
|
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
|
|
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
|
-
{
|
|
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
|
|
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
|
|
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
|
|
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
|
-
}:
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
150
|
+
testId={getTestId(testId, 'select')}
|
|
150
151
|
/>
|
|
151
152
|
</div>
|
|
152
153
|
)}
|
|
153
154
|
{isDatePickerShown && (
|
|
154
|
-
<div className={classes.picker}
|
|
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
|
|
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 {
|
|
4
|
-
|
|
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<
|
|
16
|
-
extends
|
|
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
|
-
{...
|
|
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
|
|
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}
|