@true-engineering/true-react-common-ui-kit 3.32.0 → 3.33.1
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/LICENSE +201 -201
- package/README.md +15 -0
- package/dist/components/FlexibleTable/FlexibleTable.stories.d.ts +2 -0
- package/dist/components/FlexibleTable/components/FlexibleTableCell/FlexibleTableCell.d.ts +1 -1
- package/dist/components/FlexibleTable/components/FlexibleTableRow/FlexibleTableRow.d.ts +2 -1
- package/dist/components/SearchInput/SearchInput.stories.d.ts +1 -1
- package/dist/components/WithPopup/WithPopup.styles.d.ts +1 -1
- package/dist/components/WithPopup/types.d.ts +9 -3
- package/dist/true-react-common-ui-kit.js +144 -171
- package/dist/true-react-common-ui-kit.js.map +1 -1
- package/dist/true-react-common-ui-kit.umd.cjs +143 -170
- package/dist/true-react-common-ui-kit.umd.cjs.map +1 -1
- package/dist/types.d.ts +7 -2
- package/package.json +98 -98
- package/src/components/AccountInfo/AccountInfo.stories.tsx +32 -32
- package/src/components/AccountInfo/AccountInfo.tsx +80 -80
- package/src/components/AddButton/AddButton.stories.tsx +21 -21
- package/src/components/AddButton/AddButton.tsx +52 -52
- package/src/components/Colors/Colors.stories.tsx +7 -7
- package/src/components/DateInput/DateInput.tsx +90 -90
- package/src/components/DateInput/constants.ts +2 -2
- package/src/components/Description/Description.stories.tsx +27 -27
- package/src/components/Description/Description.tsx +61 -61
- package/src/components/FiltersPane/components/FilterValueView/FilterValueView.tsx +166 -166
- package/src/components/FiltersPane/components/FilterWithDates/FilterWithDates.tsx +210 -210
- package/src/components/FiltersPane/components/FilterWithPeriod/FilterWithPeriod.tsx +177 -177
- package/src/components/FiltersPane/components/FilterWrapper/FilterWrapper.tsx +2 -2
- package/src/components/Flag/Flag.stories.tsx +29 -29
- package/src/components/Flag/Flag.tsx +26 -26
- package/src/components/Flag/augment.d.ts +1 -1
- package/src/components/FlexibleTable/FlexibleTable.stories.tsx +14 -1
- package/src/components/FlexibleTable/FlexibleTable.tsx +22 -10
- package/src/components/FlexibleTable/components/FlexibleTableCell/FlexibleTableCell.styles.ts +39 -38
- package/src/components/FlexibleTable/components/FlexibleTableCell/FlexibleTableCell.tsx +4 -2
- package/src/components/FlexibleTable/components/FlexibleTableRow/FlexibleTableRow.styles.ts +25 -25
- package/src/components/FlexibleTable/components/FlexibleTableRow/FlexibleTableRow.tsx +2 -1
- package/src/components/FlexibleTable/types.ts +70 -70
- package/src/components/Icon/Icon.stories.tsx +86 -86
- package/src/components/Icon/complexIcons/augment.d.ts +1 -1
- package/src/components/Icon/complexIcons/avatarGreen.svg +57 -57
- package/src/components/Icon/complexIcons/index.ts +1 -1
- package/src/components/Icon/icons-list.ts +855 -856
- package/src/components/IncrementInput/IncrementInput.tsx +105 -105
- package/src/components/Input/types.ts +32 -32
- package/src/components/List/List.tsx +3 -1
- package/src/components/Modal/Modal.stories.tsx +105 -105
- package/src/components/MultiSelect/MultiSelect.stories.tsx +46 -46
- package/src/components/MultiSelect/MultiSelect.tsx +106 -106
- package/src/components/MultiSelect/components/MultiSelectInput/MultiSelectInput.tsx +53 -53
- package/src/components/NewMoreMenu/NewMoreMenu.tsx +5 -5
- package/src/components/Notification/Notification.stories.tsx +55 -55
- package/src/components/Notification/Notification.styles.ts +57 -57
- package/src/components/Notification/Notification.tsx +77 -77
- package/src/components/Notification/types.ts +1 -1
- package/src/components/NumberInput/NumberInput.tsx +137 -137
- package/src/components/NumberInput/index.ts +1 -1
- package/src/components/PhoneInput/PhoneInput.tsx +214 -214
- package/src/components/PhoneInput/components/PhoneInputCountryList/PhoneInputCountryList.tsx +155 -155
- package/src/components/PhoneInput/types.ts +16 -16
- package/src/components/RadioButton/RadioButton.stories.tsx +46 -46
- package/src/components/RadioButton/RadioButton.tsx +57 -57
- package/src/components/ScrollIntoViewIfNeeded/index.ts +1 -1
- package/src/components/Select/Select.stories.tsx +235 -235
- package/src/components/Select/constants.ts +2 -2
- package/src/components/Select/types.ts +1 -1
- package/src/components/Selector/Selector.stories.tsx +62 -62
- package/src/components/Selector/Selector.tsx +115 -115
- package/src/components/Selector/index.ts +2 -2
- package/src/components/Selector/types.ts +12 -12
- package/src/components/Skeleton/Skeleton.stories.tsx +19 -19
- package/src/components/SmartInput/SmartInput.tsx +134 -134
- package/src/components/Status/Status.stories.tsx +73 -73
- package/src/components/Status/Status.styles.ts +143 -143
- package/src/components/Status/Status.tsx +49 -49
- package/src/components/Status/constants.ts +11 -11
- package/src/components/Status/index.ts +3 -3
- package/src/components/Status/types.ts +5 -5
- package/src/components/Switch/Switch.stories.tsx +40 -40
- package/src/components/Switch/Switch.tsx +75 -75
- package/src/components/TextWithInfo/TextWithInfo.stories.tsx +53 -53
- package/src/components/TextWithInfo/TextWithInfo.tsx +62 -62
- package/src/components/TextWithTooltip/TextWithTooltip.stories.tsx +58 -58
- package/src/components/ThemedPreloader/ThemedPreloader.stories.tsx +41 -41
- package/src/components/ThemedPreloader/ThemedPreloader.tsx +54 -54
- package/src/components/ThemedPreloader/components/DefaultPreloader/index.ts +1 -1
- package/src/components/Toaster/Toaster.stories.tsx +30 -30
- package/src/components/Tooltip/Tooltip.stories.tsx +19 -19
- package/src/components/Tooltip/Tooltip.tsx +35 -35
- package/src/components/Tooltip/types.ts +1 -1
- package/src/components/WithPopup/WithPopup.stories.tsx +3 -3
- package/src/components/WithPopup/WithPopup.styles.ts +2 -0
- package/src/components/WithPopup/WithPopup.tsx +18 -8
- package/src/components/WithPopup/types.ts +11 -3
- package/src/helpers/popper-helpers.ts +17 -17
- package/src/hooks/use-dropdown.ts +84 -84
- package/src/hooks/use-is-mounted.ts +15 -15
- package/src/theme/helpers.ts +76 -76
- package/src/types.ts +10 -2
- package/src/vite-env.d.ts +1 -1
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
import { FC } from 'react';
|
|
2
|
-
import clsx from 'clsx';
|
|
3
|
-
import { addDataTestId } from '@true-engineering/true-react-platform-helpers';
|
|
4
|
-
import { addDataAttributes } from '../../helpers';
|
|
5
|
-
import { useTweakStyles } from '../../hooks';
|
|
6
|
-
import { ICommonProps } from '../../types';
|
|
7
|
-
import { SvgPreloader, DotsPreloader } from './components';
|
|
8
|
-
import { IPreloaderSvgType } from './types';
|
|
9
|
-
import { useStyles, IThemedPreloaderStyles } from './ThemedPreloader.styles';
|
|
10
|
-
|
|
11
|
-
export interface IThemedPreloaderProps extends ICommonProps<IThemedPreloaderStyles> {
|
|
12
|
-
/** @default 'default' */
|
|
13
|
-
type?: 'dots' | IPreloaderSvgType;
|
|
14
|
-
/** @default false */
|
|
15
|
-
useCurrentColor?: boolean;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export const ThemedPreloader: FC<IThemedPreloaderProps> = ({
|
|
19
|
-
type = 'default',
|
|
20
|
-
useCurrentColor = false,
|
|
21
|
-
data,
|
|
22
|
-
testId,
|
|
23
|
-
tweakStyles,
|
|
24
|
-
}) => {
|
|
25
|
-
const classes = useStyles({ theme: tweakStyles });
|
|
26
|
-
|
|
27
|
-
const tweakDotsPreloaderStyles = useTweakStyles({
|
|
28
|
-
tweakStyles,
|
|
29
|
-
className: 'tweakDotsPreloader',
|
|
30
|
-
currentComponentName: 'ThemedPreloader',
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
const tweakSvgPreloaderStyles = useTweakStyles({
|
|
34
|
-
tweakStyles,
|
|
35
|
-
className: 'tweakSvgPreloader',
|
|
36
|
-
currentComponentName: 'ThemedPreloader',
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
return (
|
|
40
|
-
<div
|
|
41
|
-
className={clsx(classes.root, classes[type], {
|
|
42
|
-
[classes.currentColor]: useCurrentColor,
|
|
43
|
-
})}
|
|
44
|
-
{...addDataTestId(testId)}
|
|
45
|
-
{...addDataAttributes(data)}
|
|
46
|
-
>
|
|
47
|
-
{type === 'dots' ? (
|
|
48
|
-
<DotsPreloader tweakStyles={tweakDotsPreloaderStyles} />
|
|
49
|
-
) : (
|
|
50
|
-
<SvgPreloader type={type} tweakStyles={tweakSvgPreloaderStyles} />
|
|
51
|
-
)}
|
|
52
|
-
</div>
|
|
53
|
-
);
|
|
54
|
-
};
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import { addDataTestId } from '@true-engineering/true-react-platform-helpers';
|
|
4
|
+
import { addDataAttributes } from '../../helpers';
|
|
5
|
+
import { useTweakStyles } from '../../hooks';
|
|
6
|
+
import { ICommonProps } from '../../types';
|
|
7
|
+
import { SvgPreloader, DotsPreloader } from './components';
|
|
8
|
+
import { IPreloaderSvgType } from './types';
|
|
9
|
+
import { useStyles, IThemedPreloaderStyles } from './ThemedPreloader.styles';
|
|
10
|
+
|
|
11
|
+
export interface IThemedPreloaderProps extends ICommonProps<IThemedPreloaderStyles> {
|
|
12
|
+
/** @default 'default' */
|
|
13
|
+
type?: 'dots' | IPreloaderSvgType;
|
|
14
|
+
/** @default false */
|
|
15
|
+
useCurrentColor?: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const ThemedPreloader: FC<IThemedPreloaderProps> = ({
|
|
19
|
+
type = 'default',
|
|
20
|
+
useCurrentColor = false,
|
|
21
|
+
data,
|
|
22
|
+
testId,
|
|
23
|
+
tweakStyles,
|
|
24
|
+
}) => {
|
|
25
|
+
const classes = useStyles({ theme: tweakStyles });
|
|
26
|
+
|
|
27
|
+
const tweakDotsPreloaderStyles = useTweakStyles({
|
|
28
|
+
tweakStyles,
|
|
29
|
+
className: 'tweakDotsPreloader',
|
|
30
|
+
currentComponentName: 'ThemedPreloader',
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const tweakSvgPreloaderStyles = useTweakStyles({
|
|
34
|
+
tweakStyles,
|
|
35
|
+
className: 'tweakSvgPreloader',
|
|
36
|
+
currentComponentName: 'ThemedPreloader',
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<div
|
|
41
|
+
className={clsx(classes.root, classes[type], {
|
|
42
|
+
[classes.currentColor]: useCurrentColor,
|
|
43
|
+
})}
|
|
44
|
+
{...addDataTestId(testId)}
|
|
45
|
+
{...addDataAttributes(data)}
|
|
46
|
+
>
|
|
47
|
+
{type === 'dots' ? (
|
|
48
|
+
<DotsPreloader tweakStyles={tweakDotsPreloaderStyles} />
|
|
49
|
+
) : (
|
|
50
|
+
<SvgPreloader type={type} tweakStyles={tweakSvgPreloaderStyles} />
|
|
51
|
+
)}
|
|
52
|
+
</div>
|
|
53
|
+
);
|
|
54
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './DefaultPreloader';
|
|
1
|
+
export * from './DefaultPreloader';
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import { ComponentStory, ComponentMeta } from '@storybook/react';
|
|
2
|
-
import { Button } from '../Button';
|
|
3
|
-
import { Toaster } from './Toaster';
|
|
4
|
-
|
|
5
|
-
const types = ['error', 'info', 'warning', 'ok', 'not-ok'];
|
|
6
|
-
|
|
7
|
-
export default {
|
|
8
|
-
title: 'Feedback/Toaster',
|
|
9
|
-
component: Toaster,
|
|
10
|
-
args: {
|
|
11
|
-
title: 'Произошла очень страшная ошибка',
|
|
12
|
-
text: 'Мы даже не знаем, чем вам помочь!',
|
|
13
|
-
type: types[0],
|
|
14
|
-
timeout: 7000,
|
|
15
|
-
hasCloseButton: false,
|
|
16
|
-
shouldCloseOnClick: false,
|
|
17
|
-
},
|
|
18
|
-
argTypes: {
|
|
19
|
-
type: { control: 'inline-radio', options: types },
|
|
20
|
-
},
|
|
21
|
-
parameters: {
|
|
22
|
-
controls: { exclude: ['onTimeEnd', 'onClose', 'data', 'tweakStyles'] },
|
|
23
|
-
},
|
|
24
|
-
} as ComponentMeta<typeof Toaster>;
|
|
25
|
-
|
|
26
|
-
export const Default: ComponentStory<typeof Toaster> = (args) => (
|
|
27
|
-
<Toaster {...args} onTimeEnd={() => console.log(1)} onClose={() => alert('closed')}>
|
|
28
|
-
<Button size="m">Нажмите</Button>
|
|
29
|
-
</Toaster>
|
|
30
|
-
);
|
|
1
|
+
import { ComponentStory, ComponentMeta } from '@storybook/react';
|
|
2
|
+
import { Button } from '../Button';
|
|
3
|
+
import { Toaster } from './Toaster';
|
|
4
|
+
|
|
5
|
+
const types = ['error', 'info', 'warning', 'ok', 'not-ok'];
|
|
6
|
+
|
|
7
|
+
export default {
|
|
8
|
+
title: 'Feedback/Toaster',
|
|
9
|
+
component: Toaster,
|
|
10
|
+
args: {
|
|
11
|
+
title: 'Произошла очень страшная ошибка',
|
|
12
|
+
text: 'Мы даже не знаем, чем вам помочь!',
|
|
13
|
+
type: types[0],
|
|
14
|
+
timeout: 7000,
|
|
15
|
+
hasCloseButton: false,
|
|
16
|
+
shouldCloseOnClick: false,
|
|
17
|
+
},
|
|
18
|
+
argTypes: {
|
|
19
|
+
type: { control: 'inline-radio', options: types },
|
|
20
|
+
},
|
|
21
|
+
parameters: {
|
|
22
|
+
controls: { exclude: ['onTimeEnd', 'onClose', 'data', 'tweakStyles'] },
|
|
23
|
+
},
|
|
24
|
+
} as ComponentMeta<typeof Toaster>;
|
|
25
|
+
|
|
26
|
+
export const Default: ComponentStory<typeof Toaster> = (args) => (
|
|
27
|
+
<Toaster {...args} onTimeEnd={() => console.log(1)} onClose={() => alert('closed')}>
|
|
28
|
+
<Button size="m">Нажмите</Button>
|
|
29
|
+
</Toaster>
|
|
30
|
+
);
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { ComponentStory, ComponentMeta } from '@storybook/react';
|
|
2
|
-
import { Tooltip } from './Tooltip';
|
|
3
|
-
|
|
4
|
-
export default {
|
|
5
|
-
title: 'Data Display/Tooltip',
|
|
6
|
-
component: Tooltip,
|
|
7
|
-
args: {
|
|
8
|
-
text: 'Tooltip Text',
|
|
9
|
-
view: 'tooltip',
|
|
10
|
-
type: 'info',
|
|
11
|
-
},
|
|
12
|
-
argTypes: {
|
|
13
|
-
text: { control: 'text' },
|
|
14
|
-
view: { control: 'inline-radio', options: ['tooltip', 'hint'] },
|
|
15
|
-
type: { control: 'inline-radio', options: ['info', 'error'] },
|
|
16
|
-
},
|
|
17
|
-
} as ComponentMeta<typeof Tooltip>;
|
|
18
|
-
|
|
19
|
-
export const Default: ComponentStory<typeof Tooltip> = (args) => <Tooltip {...args} />;
|
|
1
|
+
import { ComponentStory, ComponentMeta } from '@storybook/react';
|
|
2
|
+
import { Tooltip } from './Tooltip';
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
title: 'Data Display/Tooltip',
|
|
6
|
+
component: Tooltip,
|
|
7
|
+
args: {
|
|
8
|
+
text: 'Tooltip Text',
|
|
9
|
+
view: 'tooltip',
|
|
10
|
+
type: 'info',
|
|
11
|
+
},
|
|
12
|
+
argTypes: {
|
|
13
|
+
text: { control: 'text' },
|
|
14
|
+
view: { control: 'inline-radio', options: ['tooltip', 'hint'] },
|
|
15
|
+
type: { control: 'inline-radio', options: ['info', 'error'] },
|
|
16
|
+
},
|
|
17
|
+
} as ComponentMeta<typeof Tooltip>;
|
|
18
|
+
|
|
19
|
+
export const Default: ComponentStory<typeof Tooltip> = (args) => <Tooltip {...args} />;
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
import { FC, ReactNode } from 'react';
|
|
2
|
-
import clsx from 'clsx';
|
|
3
|
-
import { addDataTestId } from '@true-engineering/true-react-platform-helpers';
|
|
4
|
-
import { addDataAttributes } from '../../helpers';
|
|
5
|
-
import { ICommonProps } from '../../types';
|
|
6
|
-
import { useStyles, ITooltipStyles } from './Tooltip.styles';
|
|
7
|
-
|
|
8
|
-
export interface ITooltipProps extends ICommonProps<ITooltipStyles> {
|
|
9
|
-
text: ReactNode;
|
|
10
|
-
/** @default 'tooltip' */
|
|
11
|
-
view?: 'tooltip' | 'hint';
|
|
12
|
-
/** @default 'info' */
|
|
13
|
-
type?: 'info' | 'error';
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export const Tooltip: FC<ITooltipProps> = ({
|
|
17
|
-
text,
|
|
18
|
-
view = 'tooltip',
|
|
19
|
-
type = 'info',
|
|
20
|
-
data,
|
|
21
|
-
testId,
|
|
22
|
-
tweakStyles,
|
|
23
|
-
}) => {
|
|
24
|
-
const classes = useStyles({ theme: tweakStyles });
|
|
25
|
-
|
|
26
|
-
return (
|
|
27
|
-
<div
|
|
28
|
-
className={clsx(classes.root, classes[view], classes[type])}
|
|
29
|
-
{...addDataTestId(testId)}
|
|
30
|
-
{...addDataAttributes(data)}
|
|
31
|
-
>
|
|
32
|
-
{text}
|
|
33
|
-
</div>
|
|
34
|
-
);
|
|
35
|
-
};
|
|
1
|
+
import { FC, ReactNode } from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import { addDataTestId } from '@true-engineering/true-react-platform-helpers';
|
|
4
|
+
import { addDataAttributes } from '../../helpers';
|
|
5
|
+
import { ICommonProps } from '../../types';
|
|
6
|
+
import { useStyles, ITooltipStyles } from './Tooltip.styles';
|
|
7
|
+
|
|
8
|
+
export interface ITooltipProps extends ICommonProps<ITooltipStyles> {
|
|
9
|
+
text: ReactNode;
|
|
10
|
+
/** @default 'tooltip' */
|
|
11
|
+
view?: 'tooltip' | 'hint';
|
|
12
|
+
/** @default 'info' */
|
|
13
|
+
type?: 'info' | 'error';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const Tooltip: FC<ITooltipProps> = ({
|
|
17
|
+
text,
|
|
18
|
+
view = 'tooltip',
|
|
19
|
+
type = 'info',
|
|
20
|
+
data,
|
|
21
|
+
testId,
|
|
22
|
+
tweakStyles,
|
|
23
|
+
}) => {
|
|
24
|
+
const classes = useStyles({ theme: tweakStyles });
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<div
|
|
28
|
+
className={clsx(classes.root, classes[view], classes[type])}
|
|
29
|
+
{...addDataTestId(testId)}
|
|
30
|
+
{...addDataAttributes(data)}
|
|
31
|
+
>
|
|
32
|
+
{text}
|
|
33
|
+
</div>
|
|
34
|
+
);
|
|
35
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export type ITooltipType = 'info' | 'warning';
|
|
1
|
+
export type ITooltipType = 'info' | 'warning';
|
|
@@ -60,9 +60,9 @@ const Template: ComponentStory<typeof WithPopup> = (args) => (
|
|
|
60
60
|
<div onClick={() => console.log('parent onclick')}>
|
|
61
61
|
<WithPopup
|
|
62
62
|
{...args}
|
|
63
|
-
trigger={(
|
|
64
|
-
<Button icon="plus" isFullWidth {...
|
|
65
|
-
{
|
|
63
|
+
trigger={({ triggerProps }) => (
|
|
64
|
+
<Button icon="plus" isFullWidth {...triggerProps}>
|
|
65
|
+
{triggerProps.isActive ? 'Click (Active)' : 'Click (Not Active)'}
|
|
66
66
|
</Button>
|
|
67
67
|
)}
|
|
68
68
|
>
|
|
@@ -3,7 +3,6 @@ import clsx from 'clsx';
|
|
|
3
3
|
import {
|
|
4
4
|
addDataTestId,
|
|
5
5
|
applyAction,
|
|
6
|
-
isFunction,
|
|
7
6
|
stopPropagation,
|
|
8
7
|
} from '@true-engineering/true-react-platform-helpers';
|
|
9
8
|
import {
|
|
@@ -29,6 +28,7 @@ import { ICommonProps, IRenderNode } from '../../types';
|
|
|
29
28
|
import { DEFAULT_OFFSET } from './constants';
|
|
30
29
|
import {
|
|
31
30
|
IPopupEventType,
|
|
31
|
+
IReferenceProps,
|
|
32
32
|
IWithPopupChildrenProps,
|
|
33
33
|
IWithPopupToggleEvent,
|
|
34
34
|
IWithPopupTriggerProps,
|
|
@@ -100,7 +100,11 @@ export const WithPopup: FC<IWithPopupProps> = ({
|
|
|
100
100
|
|
|
101
101
|
const { refs, floatingStyles, context } = useFloating({
|
|
102
102
|
open: isOpen,
|
|
103
|
-
middleware: [
|
|
103
|
+
middleware: [
|
|
104
|
+
offset(popupOffset),
|
|
105
|
+
canBeFlipped && flip({ fallbackAxisSideDirection: 'start' }),
|
|
106
|
+
...middlewares,
|
|
107
|
+
],
|
|
104
108
|
whileElementsMounted: autoUpdate,
|
|
105
109
|
placement,
|
|
106
110
|
onOpenChange: handleToggle,
|
|
@@ -125,7 +129,7 @@ export const WithPopup: FC<IWithPopupProps> = ({
|
|
|
125
129
|
|
|
126
130
|
const { isMounted, status } = useTransitionStatus(context, { duration: { close: 500 } });
|
|
127
131
|
|
|
128
|
-
const referenceProps:
|
|
132
|
+
const referenceProps: IReferenceProps = getReferenceProps({
|
|
129
133
|
ref: refs.setReference,
|
|
130
134
|
...(shouldStopPropagation && {
|
|
131
135
|
onClick: stopPropagation,
|
|
@@ -133,16 +137,22 @@ export const WithPopup: FC<IWithPopupProps> = ({
|
|
|
133
137
|
});
|
|
134
138
|
|
|
135
139
|
const triggerElement = applyAction(trigger, {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
140
|
+
referenceProps: !isTriggerWrapped ? referenceProps : undefined,
|
|
141
|
+
triggerProps: {
|
|
142
|
+
isActive: isOpen,
|
|
143
|
+
isDisabled,
|
|
144
|
+
...(!isTriggerWrapped && { data, testId, ...referenceProps }),
|
|
145
|
+
},
|
|
139
146
|
});
|
|
140
147
|
|
|
141
148
|
return (
|
|
142
149
|
<>
|
|
143
150
|
{isTriggerWrapped ? (
|
|
144
151
|
<div
|
|
145
|
-
className={clsx(classes.trigger, {
|
|
152
|
+
className={clsx(classes.trigger, {
|
|
153
|
+
[classes.disabled]: isDisabled,
|
|
154
|
+
[classes.active]: isOpen,
|
|
155
|
+
})}
|
|
146
156
|
{...referenceProps}
|
|
147
157
|
{...addDataTestId(testId)}
|
|
148
158
|
{...addDataAttributes(data)}
|
|
@@ -163,7 +173,7 @@ export const WithPopup: FC<IWithPopupProps> = ({
|
|
|
163
173
|
{...getFloatingProps()}
|
|
164
174
|
>
|
|
165
175
|
<div className={classes[`dropdown-${status}`]}>
|
|
166
|
-
{
|
|
176
|
+
{applyAction(children, { onClose: handleClose })}
|
|
167
177
|
</div>
|
|
168
178
|
</div>
|
|
169
179
|
</FloatingPortal>
|
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
import type { MouseEvent, KeyboardEvent } from 'react';
|
|
2
|
-
import type { IDomElementInteractions } from '../../types';
|
|
2
|
+
import type { IDataAttributesProps, IDomElementInteractions } from '../../types';
|
|
3
3
|
import type { POPUP_EVENT_TYPES } from './constants';
|
|
4
4
|
|
|
5
5
|
export type IPopupEventType = (typeof POPUP_EVENT_TYPES)[number];
|
|
6
6
|
|
|
7
7
|
export type IWithPopupToggleEvent = MouseEvent | KeyboardEvent | Event;
|
|
8
8
|
|
|
9
|
-
export interface
|
|
9
|
+
export interface IReferenceProps extends IDomElementInteractions<HTMLElement> {
|
|
10
|
+
ref?: (node: Element | null) => void;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface IWithPopupTriggerComponentProps extends IReferenceProps, IDataAttributesProps {
|
|
10
14
|
isActive: boolean;
|
|
11
15
|
isDisabled?: boolean;
|
|
12
|
-
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface IWithPopupTriggerProps {
|
|
19
|
+
triggerProps: IWithPopupTriggerComponentProps;
|
|
20
|
+
referenceProps?: IReferenceProps;
|
|
13
21
|
}
|
|
14
22
|
|
|
15
23
|
export interface IWithPopupChildrenProps {
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { Modifier } from 'react-overlays/usePopper';
|
|
2
|
-
|
|
3
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
4
|
-
export const minWidthModifier: Partial<Modifier<any, any>> = {
|
|
5
|
-
name: 'minWidth',
|
|
6
|
-
enabled: true,
|
|
7
|
-
phase: 'beforeWrite',
|
|
8
|
-
requires: ['computeStyles'],
|
|
9
|
-
fn: ({ state }) => {
|
|
10
|
-
state.styles.popper.minWidth = `${state.rects.reference.width}px`;
|
|
11
|
-
},
|
|
12
|
-
effect: ({ state }) => {
|
|
13
|
-
state.elements.popper.style.minWidth = `${
|
|
14
|
-
(state.elements.reference as HTMLElement).offsetWidth
|
|
15
|
-
}px`;
|
|
16
|
-
},
|
|
17
|
-
};
|
|
1
|
+
import { Modifier } from 'react-overlays/usePopper';
|
|
2
|
+
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
4
|
+
export const minWidthModifier: Partial<Modifier<any, any>> = {
|
|
5
|
+
name: 'minWidth',
|
|
6
|
+
enabled: true,
|
|
7
|
+
phase: 'beforeWrite',
|
|
8
|
+
requires: ['computeStyles'],
|
|
9
|
+
fn: ({ state }) => {
|
|
10
|
+
state.styles.popper.minWidth = `${state.rects.reference.width}px`;
|
|
11
|
+
},
|
|
12
|
+
effect: ({ state }) => {
|
|
13
|
+
state.elements.popper.style.minWidth = `${
|
|
14
|
+
(state.elements.reference as HTMLElement).offsetWidth
|
|
15
|
+
}px`;
|
|
16
|
+
},
|
|
17
|
+
};
|
|
@@ -1,84 +1,84 @@
|
|
|
1
|
-
import { DependencyList, useEffect } from 'react';
|
|
2
|
-
import usePopper, { VirtualElement } from 'react-overlays/usePopper';
|
|
3
|
-
import { getScrollParent, minWidthModifier } from '../helpers';
|
|
4
|
-
import { IDropdownWithPopperOptions } from '../types';
|
|
5
|
-
|
|
6
|
-
export const useDropdown = ({
|
|
7
|
-
isOpen,
|
|
8
|
-
onDropdownClose,
|
|
9
|
-
referenceElement,
|
|
10
|
-
dropdownElement,
|
|
11
|
-
options,
|
|
12
|
-
dependenciesForPositionUpdating = [],
|
|
13
|
-
}: {
|
|
14
|
-
isOpen: boolean;
|
|
15
|
-
referenceElement: VirtualElement | null | undefined;
|
|
16
|
-
dropdownElement: HTMLElement | null | undefined;
|
|
17
|
-
options?: IDropdownWithPopperOptions;
|
|
18
|
-
dependenciesForPositionUpdating?: DependencyList;
|
|
19
|
-
onDropdownClose: (event: Event) => void;
|
|
20
|
-
}): ReturnType<typeof usePopper> | undefined => {
|
|
21
|
-
const {
|
|
22
|
-
shouldUsePopper = false,
|
|
23
|
-
shouldRenderInBody = false,
|
|
24
|
-
shouldHideOnScroll = false,
|
|
25
|
-
scrollParent = 'document',
|
|
26
|
-
canBeFlipped = false,
|
|
27
|
-
modifiers = [],
|
|
28
|
-
placement = 'bottom-start',
|
|
29
|
-
flipOptions,
|
|
30
|
-
} = options ?? {};
|
|
31
|
-
|
|
32
|
-
useEffect(() => {
|
|
33
|
-
if (!shouldHideOnScroll || !isOpen) {
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const scrollParentEl =
|
|
38
|
-
scrollParent === 'auto'
|
|
39
|
-
? getScrollParent(referenceElement as Element)
|
|
40
|
-
: scrollParent === 'document'
|
|
41
|
-
? document
|
|
42
|
-
: scrollParent;
|
|
43
|
-
scrollParentEl.addEventListener('scroll', onDropdownClose);
|
|
44
|
-
|
|
45
|
-
return () => {
|
|
46
|
-
scrollParentEl.removeEventListener('scroll', onDropdownClose);
|
|
47
|
-
};
|
|
48
|
-
}, [shouldHideOnScroll, isOpen]);
|
|
49
|
-
|
|
50
|
-
let popperData: ReturnType<typeof usePopper> | undefined;
|
|
51
|
-
if (shouldUsePopper) {
|
|
52
|
-
// TODO: Вытащить хук из под условия???
|
|
53
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
54
|
-
popperData = usePopper(referenceElement, dropdownElement, {
|
|
55
|
-
enabled: isOpen,
|
|
56
|
-
placement,
|
|
57
|
-
modifiers: [
|
|
58
|
-
...(shouldRenderInBody ? [minWidthModifier] : []),
|
|
59
|
-
{
|
|
60
|
-
name: 'offset',
|
|
61
|
-
options: {
|
|
62
|
-
offset: [0, 6],
|
|
63
|
-
},
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
name: 'flip',
|
|
67
|
-
options: {
|
|
68
|
-
fallbackPlacements: canBeFlipped ? ['bottom-start', 'top-start'] : ['bottom-start'],
|
|
69
|
-
...flipOptions,
|
|
70
|
-
},
|
|
71
|
-
},
|
|
72
|
-
...modifiers,
|
|
73
|
-
],
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
useEffect(() => {
|
|
78
|
-
if (dependenciesForPositionUpdating.length !== 0) {
|
|
79
|
-
popperData?.update();
|
|
80
|
-
}
|
|
81
|
-
}, dependenciesForPositionUpdating);
|
|
82
|
-
|
|
83
|
-
return popperData;
|
|
84
|
-
};
|
|
1
|
+
import { DependencyList, useEffect } from 'react';
|
|
2
|
+
import usePopper, { VirtualElement } from 'react-overlays/usePopper';
|
|
3
|
+
import { getScrollParent, minWidthModifier } from '../helpers';
|
|
4
|
+
import { IDropdownWithPopperOptions } from '../types';
|
|
5
|
+
|
|
6
|
+
export const useDropdown = ({
|
|
7
|
+
isOpen,
|
|
8
|
+
onDropdownClose,
|
|
9
|
+
referenceElement,
|
|
10
|
+
dropdownElement,
|
|
11
|
+
options,
|
|
12
|
+
dependenciesForPositionUpdating = [],
|
|
13
|
+
}: {
|
|
14
|
+
isOpen: boolean;
|
|
15
|
+
referenceElement: VirtualElement | null | undefined;
|
|
16
|
+
dropdownElement: HTMLElement | null | undefined;
|
|
17
|
+
options?: IDropdownWithPopperOptions;
|
|
18
|
+
dependenciesForPositionUpdating?: DependencyList;
|
|
19
|
+
onDropdownClose: (event: Event) => void;
|
|
20
|
+
}): ReturnType<typeof usePopper> | undefined => {
|
|
21
|
+
const {
|
|
22
|
+
shouldUsePopper = false,
|
|
23
|
+
shouldRenderInBody = false,
|
|
24
|
+
shouldHideOnScroll = false,
|
|
25
|
+
scrollParent = 'document',
|
|
26
|
+
canBeFlipped = false,
|
|
27
|
+
modifiers = [],
|
|
28
|
+
placement = 'bottom-start',
|
|
29
|
+
flipOptions,
|
|
30
|
+
} = options ?? {};
|
|
31
|
+
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (!shouldHideOnScroll || !isOpen) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const scrollParentEl =
|
|
38
|
+
scrollParent === 'auto'
|
|
39
|
+
? getScrollParent(referenceElement as Element)
|
|
40
|
+
: scrollParent === 'document'
|
|
41
|
+
? document
|
|
42
|
+
: scrollParent;
|
|
43
|
+
scrollParentEl.addEventListener('scroll', onDropdownClose);
|
|
44
|
+
|
|
45
|
+
return () => {
|
|
46
|
+
scrollParentEl.removeEventListener('scroll', onDropdownClose);
|
|
47
|
+
};
|
|
48
|
+
}, [shouldHideOnScroll, isOpen]);
|
|
49
|
+
|
|
50
|
+
let popperData: ReturnType<typeof usePopper> | undefined;
|
|
51
|
+
if (shouldUsePopper) {
|
|
52
|
+
// TODO: Вытащить хук из под условия???
|
|
53
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
54
|
+
popperData = usePopper(referenceElement, dropdownElement, {
|
|
55
|
+
enabled: isOpen,
|
|
56
|
+
placement,
|
|
57
|
+
modifiers: [
|
|
58
|
+
...(shouldRenderInBody ? [minWidthModifier] : []),
|
|
59
|
+
{
|
|
60
|
+
name: 'offset',
|
|
61
|
+
options: {
|
|
62
|
+
offset: [0, 6],
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: 'flip',
|
|
67
|
+
options: {
|
|
68
|
+
fallbackPlacements: canBeFlipped ? ['bottom-start', 'top-start'] : ['bottom-start'],
|
|
69
|
+
...flipOptions,
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
...modifiers,
|
|
73
|
+
],
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
if (dependenciesForPositionUpdating.length !== 0) {
|
|
79
|
+
popperData?.update();
|
|
80
|
+
}
|
|
81
|
+
}, dependenciesForPositionUpdating);
|
|
82
|
+
|
|
83
|
+
return popperData;
|
|
84
|
+
};
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { useCallback, useEffect, useRef } from 'react';
|
|
2
|
-
|
|
3
|
-
export const useIsMounted = (): (() => boolean) => {
|
|
4
|
-
const isMounted = useRef(false);
|
|
5
|
-
|
|
6
|
-
useEffect(() => {
|
|
7
|
-
isMounted.current = true;
|
|
8
|
-
|
|
9
|
-
return () => {
|
|
10
|
-
isMounted.current = false;
|
|
11
|
-
};
|
|
12
|
-
}, []);
|
|
13
|
-
|
|
14
|
-
return useCallback(() => isMounted.current, []);
|
|
15
|
-
};
|
|
1
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
2
|
+
|
|
3
|
+
export const useIsMounted = (): (() => boolean) => {
|
|
4
|
+
const isMounted = useRef(false);
|
|
5
|
+
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
isMounted.current = true;
|
|
8
|
+
|
|
9
|
+
return () => {
|
|
10
|
+
isMounted.current = false;
|
|
11
|
+
};
|
|
12
|
+
}, []);
|
|
13
|
+
|
|
14
|
+
return useCallback(() => isMounted.current, []);
|
|
15
|
+
};
|