@vkontakte/vkui 5.0.1 → 5.0.2
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/dist/cjs/components/Alert/Alert.d.ts +3 -3
- package/dist/cjs/components/Alert/Alert.js +13 -9
- package/dist/cjs/components/Alert/Alert.js.map +1 -1
- package/dist/cjs/components/CustomSelect/CustomSelect.d.ts +4 -0
- package/dist/cjs/components/CustomSelect/CustomSelect.js +11 -6
- package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cjs/components/SegmentedControl/SegmentedControl.js +3 -2
- package/dist/cjs/components/SegmentedControl/SegmentedControl.js.map +1 -1
- package/dist/cjs/components/Tappable/Tappable.d.ts +2 -2
- package/dist/cjs/components/Tappable/Tappable.js.map +1 -1
- package/dist/cjs/lib/utils.d.ts +0 -1
- package/dist/cjs/lib/utils.js +0 -5
- package/dist/cjs/lib/utils.js.map +1 -1
- package/dist/cjs/types.d.ts +6 -0
- package/dist/cjs/types.js.map +1 -1
- package/dist/components/Alert/Alert.d.ts +3 -3
- package/dist/components/Alert/Alert.js +13 -9
- package/dist/components/Alert/Alert.js.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.d.ts +4 -0
- package/dist/components/CustomSelect/CustomSelect.js +11 -6
- package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.js +4 -3
- package/dist/components/SegmentedControl/SegmentedControl.js.map +1 -1
- package/dist/components/Tappable/Tappable.d.ts +2 -2
- package/dist/components/Tappable/Tappable.js.map +1 -1
- package/dist/components.css +2 -2
- package/dist/components.css.map +1 -1
- package/dist/cssm/components/Alert/Alert.d.ts +3 -3
- package/dist/cssm/components/Alert/Alert.js +13 -9
- package/dist/cssm/components/Alert/Alert.js.map +1 -1
- package/dist/cssm/components/Banner/Banner.module.css +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.d.ts +4 -0
- package/dist/cssm/components/CustomSelect/CustomSelect.js +11 -6
- package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cssm/components/PanelHeader/PanelHeader.module.css +1 -1
- package/dist/cssm/components/SegmentedControl/SegmentedControl.js +4 -3
- package/dist/cssm/components/SegmentedControl/SegmentedControl.js.map +1 -1
- package/dist/cssm/components/SubnavigationButton/SubnavigationButton.module.css +1 -1
- package/dist/cssm/components/Tappable/Tappable.d.ts +2 -2
- package/dist/cssm/components/Tappable/Tappable.js.map +1 -1
- package/dist/cssm/lib/utils.d.ts +0 -1
- package/dist/cssm/lib/utils.js +0 -3
- package/dist/cssm/lib/utils.js.map +1 -1
- package/dist/cssm/styles/components.css +2 -2
- package/dist/cssm/types.d.ts +6 -0
- package/dist/cssm/types.js.map +1 -1
- package/dist/lib/utils.d.ts +0 -1
- package/dist/lib/utils.js +0 -3
- package/dist/lib/utils.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.js.map +1 -1
- package/dist/vkui.css +2 -2
- package/dist/vkui.css.map +1 -1
- package/package.json +3 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { ButtonProps } from "../Button/Button";
|
|
3
|
-
|
|
4
|
-
export interface
|
|
3
|
+
import { AnchorHTMLAttributesOnly } from "../../types";
|
|
4
|
+
export interface AlertActionInterface extends Pick<ButtonProps, "Component">, AnchorHTMLAttributesOnly {
|
|
5
5
|
title: string;
|
|
6
6
|
action?: VoidFunction;
|
|
7
7
|
autoClose?: boolean;
|
|
@@ -9,7 +9,7 @@ export interface AlertAction extends Pick<ButtonProps, "Component" | "href"> {
|
|
|
9
9
|
}
|
|
10
10
|
export interface AlertProps extends React.HTMLAttributes<HTMLElement> {
|
|
11
11
|
actionsLayout?: "vertical" | "horizontal";
|
|
12
|
-
actions?:
|
|
12
|
+
actions?: AlertActionInterface[];
|
|
13
13
|
header?: React.ReactNode;
|
|
14
14
|
text?: React.ReactNode;
|
|
15
15
|
onClose: VoidFunction;
|
|
@@ -27,7 +27,8 @@ var _useWaitTransitionFinish = require("../../hooks/useWaitTransitionFinish");
|
|
|
27
27
|
var _usePlatform = require("../../hooks/usePlatform");
|
|
28
28
|
var _useAdaptivityWithJSMediaQueries = require("../../hooks/useAdaptivityWithJSMediaQueries");
|
|
29
29
|
var _excluded = ["action", "onItemClick"],
|
|
30
|
-
_excluded2 = ["
|
|
30
|
+
_excluded2 = ["Component", "title", "action", "autoClose", "mode"],
|
|
31
|
+
_excluded3 = ["actions", "actionsLayout", "children", "className", "style", "text", "header", "onClose", "dismissLabel"];
|
|
31
32
|
var AlertHeader = function AlertHeader(props) {
|
|
32
33
|
var platform = (0, _usePlatform.usePlatform)();
|
|
33
34
|
switch (platform) {
|
|
@@ -74,14 +75,17 @@ var AlertAction = function AlertAction(_ref) {
|
|
|
74
75
|
}, [onItemClick, action]);
|
|
75
76
|
if (platform === _platform.Platform.IOS) {
|
|
76
77
|
var _action$Component = action.Component,
|
|
77
|
-
Component = _action$Component === void 0 ? "button" : _action$Component
|
|
78
|
+
Component = _action$Component === void 0 ? "button" : _action$Component,
|
|
79
|
+
title = action.title,
|
|
80
|
+
actionProp = action.action,
|
|
81
|
+
autoClose = action.autoClose,
|
|
82
|
+
_mode = action.mode,
|
|
83
|
+
restActionProps = (0, _objectWithoutProperties2.default)(action, _excluded2);
|
|
78
84
|
return /*#__PURE__*/React.createElement(_Tappable.Tappable, (0, _extends2.default)({
|
|
79
|
-
Component:
|
|
80
|
-
className: (0, _classNames.classNamesString)("vkuiAlert__action", styles["Alert__action--mode-".concat(
|
|
81
|
-
onClick: handleItemClick
|
|
82
|
-
|
|
83
|
-
target: action.target
|
|
84
|
-
}, restProps), action.title);
|
|
85
|
+
Component: restActionProps.href ? "a" : Component,
|
|
86
|
+
className: (0, _classNames.classNamesString)("vkuiAlert__action", styles["Alert__action--mode-".concat(_mode)]),
|
|
87
|
+
onClick: handleItemClick
|
|
88
|
+
}, restActionProps, restProps), title);
|
|
85
89
|
}
|
|
86
90
|
var mode = "tertiary";
|
|
87
91
|
if (platform === _platform.Platform.VKCOM) {
|
|
@@ -114,7 +118,7 @@ var Alert = function Alert(_ref2) {
|
|
|
114
118
|
onClose = _ref2.onClose,
|
|
115
119
|
_ref2$dismissLabel = _ref2.dismissLabel,
|
|
116
120
|
dismissLabel = _ref2$dismissLabel === void 0 ? "Закрыть предупреждение" : _ref2$dismissLabel,
|
|
117
|
-
restProps = (0, _objectWithoutProperties2.default)(_ref2,
|
|
121
|
+
restProps = (0, _objectWithoutProperties2.default)(_ref2, _excluded3);
|
|
118
122
|
var platform = (0, _usePlatform.usePlatform)();
|
|
119
123
|
var _useAdaptivityWithJSM = (0, _useAdaptivityWithJSMediaQueries.useAdaptivityWithJSMediaQueries)(),
|
|
120
124
|
isDesktop = _useAdaptivityWithJSM.isDesktop;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Alert.js","names":["AlertHeader","props","platform","usePlatform","Platform","IOS","AlertText","VKCOM","AlertAction","action","onItemClick","restProps","handleItemClick","React","useCallback","Component","href","classNamesString","styles","mode","target","title","Alert","actions","actionsLayout","children","className","style","text","header","onClose","dismissLabel","useAdaptivityWithJSMediaQueries","isDesktop","useWaitTransitionFinish","waitTransitionFinish","useState","closing","setClosing","elementRef","useRef","resolvedActionsLayout","timeout","close","current","e","propertyName","item","autoClose","useScrollLock","stopPropagation","hasReactNode","map","i"],"sources":["../../../../src/components/Alert/Alert.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Tappable } from \"../Tappable/Tappable\";\nimport { PopoutWrapper } from \"../PopoutWrapper/PopoutWrapper\";\nimport { classNamesString } from \"../../lib/classNames\";\nimport { Platform } from \"../../lib/platform\";\nimport { Button, ButtonProps } from \"../Button/Button\";\nimport { hasReactNode, stopPropagation } from \"../../lib/utils\";\nimport { Title } from \"../Typography/Title/Title\";\nimport { Caption } from \"../Typography/Caption/Caption\";\nimport { Footnote } from \"../Typography/Footnote/Footnote\";\nimport { Text } from \"../Typography/Text/Text\";\nimport { ModalDismissButton } from \"../ModalDismissButton/ModalDismissButton\";\nimport { FocusTrap } from \"../FocusTrap/FocusTrap\";\nimport { useScrollLock } from \"../AppRoot/ScrollContext\";\nimport { useWaitTransitionFinish } from \"../../hooks/useWaitTransitionFinish\";\nimport { usePlatform } from \"../../hooks/usePlatform\";\nimport { useAdaptivityWithJSMediaQueries } from \"../../hooks/useAdaptivityWithJSMediaQueries\";\nimport styles from \"./Alert.module.css\";\n\nexport type AlertActionInterface = AlertAction &\n React.AnchorHTMLAttributes<HTMLElement>;\n\nexport interface AlertAction extends Pick<ButtonProps, \"Component\" | \"href\"> {\n title: string;\n action?: VoidFunction;\n autoClose?: boolean;\n mode: \"cancel\" | \"destructive\" | \"default\";\n}\n\nexport interface AlertProps extends React.HTMLAttributes<HTMLElement> {\n actionsLayout?: \"vertical\" | \"horizontal\";\n actions?: AlertAction[];\n header?: React.ReactNode;\n text?: React.ReactNode;\n onClose: VoidFunction;\n\n /**\n * `aria-label` для кнопки закрытия. Необходим, чтобы кнопка была доступной.\n */\n dismissLabel?: string;\n}\n\ntype ItemClickHandler = (item: AlertActionInterface) => void;\n\ninterface AlertTypography {\n id: string;\n children?: React.ReactNode;\n}\n\nconst AlertHeader = (props: AlertTypography) => {\n const platform = usePlatform();\n\n switch (platform) {\n case Platform.IOS:\n return (\n <Title\n className={styles[\"Alert__header\"]}\n weight=\"1\"\n level=\"3\"\n {...props}\n />\n );\n default:\n return (\n <Title\n className={styles[\"Alert__header\"]}\n weight=\"2\"\n level=\"2\"\n {...props}\n />\n );\n }\n};\n\nconst AlertText = (props: AlertTypography) => {\n const platform = usePlatform();\n\n switch (platform) {\n case Platform.VKCOM:\n return <Footnote className={styles[\"Alert__text\"]} {...props} />;\n case Platform.IOS:\n return <Caption className={styles[\"Alert__text\"]} {...props} />;\n default:\n return (\n <Text\n Component=\"span\"\n className={styles[\"Alert__text\"]}\n weight=\"3\"\n {...props}\n />\n );\n }\n};\n\ninterface AlertActionProps {\n action: AlertActionInterface;\n onItemClick: ItemClickHandler;\n}\n\nconst AlertAction = ({\n action,\n onItemClick,\n ...restProps\n}: AlertActionProps) => {\n const platform = usePlatform();\n const handleItemClick = React.useCallback(\n () => onItemClick(action),\n [onItemClick, action]\n );\n\n if (platform === Platform.IOS) {\n const { Component = \"button\" } = action;\n return (\n <Tappable\n Component={action.href ? \"a\" : Component}\n className={classNamesString(\n styles[\"Alert__action\"],\n styles[`Alert__action--mode-${action.mode}`]\n )}\n onClick={handleItemClick}\n href={action.href}\n target={action.target}\n {...restProps}\n >\n {action.title}\n </Tappable>\n );\n }\n\n let mode: ButtonProps[\"mode\"] = \"tertiary\";\n\n if (platform === Platform.VKCOM) {\n mode = action.mode === \"cancel\" ? \"secondary\" : \"primary\";\n }\n\n return (\n <Button\n className={classNamesString(\n styles[\"Alert__button\"],\n styles[`Alert__button--mode-${action.mode}`]\n )}\n mode={mode}\n size=\"m\"\n onClick={handleItemClick}\n Component={action.Component}\n href={action.href}\n target={action.target}\n >\n {action.title}\n </Button>\n );\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Alert\n */\nexport const Alert = ({\n actions = [],\n actionsLayout = \"horizontal\",\n children,\n className,\n style,\n text,\n header,\n onClose,\n dismissLabel = \"Закрыть предупреждение\",\n ...restProps\n}: AlertProps) => {\n const platform = usePlatform();\n const { isDesktop } = useAdaptivityWithJSMediaQueries();\n const { waitTransitionFinish } = useWaitTransitionFinish();\n\n const [closing, setClosing] = React.useState(false);\n\n const elementRef = React.useRef<HTMLDivElement>(null);\n\n const resolvedActionsLayout: AlertProps[\"actionsLayout\"] =\n platform === Platform.VKCOM ? \"horizontal\" : actionsLayout;\n\n const timeout = platform === Platform.IOS ? 300 : 200;\n\n const close = React.useCallback(() => {\n setClosing(true);\n waitTransitionFinish(\n elementRef.current,\n (e?: TransitionEvent) => {\n if (!e || e.propertyName === \"opacity\") {\n onClose();\n }\n },\n timeout\n );\n }, [elementRef, waitTransitionFinish, onClose, timeout]);\n\n const onItemClick: ItemClickHandler = React.useCallback(\n (item: AlertActionInterface) => {\n const { action, autoClose } = item;\n\n if (autoClose) {\n setClosing(true);\n waitTransitionFinish(\n elementRef.current,\n (e?: TransitionEvent) => {\n if (!e || e.propertyName === \"opacity\") {\n onClose();\n action && action();\n }\n },\n timeout\n );\n } else {\n action && action();\n }\n },\n [elementRef, waitTransitionFinish, onClose, timeout]\n );\n\n useScrollLock();\n\n return (\n <PopoutWrapper\n className={className}\n closing={closing}\n style={style}\n onClick={close}\n >\n <FocusTrap\n {...restProps}\n getRootRef={elementRef}\n onClick={stopPropagation}\n onClose={close}\n timeout={timeout}\n className={classNamesString(\n styles[\"Alert\"],\n platform === Platform.IOS && styles[\"Alert--ios\"],\n platform === Platform.VKCOM && styles[\"Alert--vkcom\"],\n resolvedActionsLayout === \"vertical\"\n ? styles[\"Alert--v\"]\n : styles[\"Alert--h\"],\n closing && styles[\"Alert--closing\"],\n isDesktop && styles[\"Alert--desktop\"]\n )}\n role=\"alertdialog\"\n aria-modal\n aria-labelledby=\"vkui--alert--title\"\n aria-describedby=\"vkui--alert--desc\"\n >\n <div className={styles[\"Alert__content\"]}>\n {hasReactNode(header) && (\n <AlertHeader id=\"vkui--alert--title\">{header}</AlertHeader>\n )}\n {hasReactNode(text) && (\n <AlertText id=\"vkui--alert--desc\">{text}</AlertText>\n )}\n {children}\n </div>\n <div className={styles[\"Alert__actions\"]}>\n {actions.map((action, i) => (\n <AlertAction key={i} action={action} onItemClick={onItemClick} />\n ))}\n </div>\n {isDesktop && (\n <ModalDismissButton onClick={close} aria-label={dismissLabel} />\n )}\n </FocusTrap>\n </PopoutWrapper>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Alert.js","names":["AlertHeader","props","platform","usePlatform","Platform","IOS","AlertText","VKCOM","AlertAction","action","onItemClick","restProps","handleItemClick","React","useCallback","Component","title","actionProp","autoClose","mode","restActionProps","href","classNamesString","styles","target","Alert","actions","actionsLayout","children","className","style","text","header","onClose","dismissLabel","useAdaptivityWithJSMediaQueries","isDesktop","useWaitTransitionFinish","waitTransitionFinish","useState","closing","setClosing","elementRef","useRef","resolvedActionsLayout","timeout","close","current","e","propertyName","item","useScrollLock","stopPropagation","hasReactNode","map","i"],"sources":["../../../../src/components/Alert/Alert.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Tappable } from \"../Tappable/Tappable\";\nimport { PopoutWrapper } from \"../PopoutWrapper/PopoutWrapper\";\nimport { classNamesString } from \"../../lib/classNames\";\nimport { Platform } from \"../../lib/platform\";\nimport { Button, ButtonProps } from \"../Button/Button\";\nimport { hasReactNode, stopPropagation } from \"../../lib/utils\";\nimport { Title } from \"../Typography/Title/Title\";\nimport { Caption } from \"../Typography/Caption/Caption\";\nimport { Footnote } from \"../Typography/Footnote/Footnote\";\nimport { Text } from \"../Typography/Text/Text\";\nimport { ModalDismissButton } from \"../ModalDismissButton/ModalDismissButton\";\nimport { FocusTrap } from \"../FocusTrap/FocusTrap\";\nimport { useScrollLock } from \"../AppRoot/ScrollContext\";\nimport { useWaitTransitionFinish } from \"../../hooks/useWaitTransitionFinish\";\nimport { usePlatform } from \"../../hooks/usePlatform\";\nimport { useAdaptivityWithJSMediaQueries } from \"../../hooks/useAdaptivityWithJSMediaQueries\";\nimport { AnchorHTMLAttributesOnly } from \"../../types\";\nimport styles from \"./Alert.module.css\";\n\nexport interface AlertActionInterface\n extends Pick<ButtonProps, \"Component\">,\n AnchorHTMLAttributesOnly {\n title: string;\n action?: VoidFunction;\n autoClose?: boolean;\n mode: \"cancel\" | \"destructive\" | \"default\";\n}\n\nexport interface AlertProps extends React.HTMLAttributes<HTMLElement> {\n actionsLayout?: \"vertical\" | \"horizontal\";\n actions?: AlertActionInterface[];\n header?: React.ReactNode;\n text?: React.ReactNode;\n onClose: VoidFunction;\n\n /**\n * `aria-label` для кнопки закрытия. Необходим, чтобы кнопка была доступной.\n */\n dismissLabel?: string;\n}\n\ntype ItemClickHandler = (item: AlertActionInterface) => void;\n\ninterface AlertTypography {\n id: string;\n children?: React.ReactNode;\n}\n\nconst AlertHeader = (props: AlertTypography) => {\n const platform = usePlatform();\n\n switch (platform) {\n case Platform.IOS:\n return (\n <Title\n className={styles[\"Alert__header\"]}\n weight=\"1\"\n level=\"3\"\n {...props}\n />\n );\n default:\n return (\n <Title\n className={styles[\"Alert__header\"]}\n weight=\"2\"\n level=\"2\"\n {...props}\n />\n );\n }\n};\n\nconst AlertText = (props: AlertTypography) => {\n const platform = usePlatform();\n\n switch (platform) {\n case Platform.VKCOM:\n return <Footnote className={styles[\"Alert__text\"]} {...props} />;\n case Platform.IOS:\n return <Caption className={styles[\"Alert__text\"]} {...props} />;\n default:\n return (\n <Text\n Component=\"span\"\n className={styles[\"Alert__text\"]}\n weight=\"3\"\n {...props}\n />\n );\n }\n};\n\ninterface AlertActionProps {\n action: AlertActionInterface;\n onItemClick: ItemClickHandler;\n}\n\nconst AlertAction = ({\n action,\n onItemClick,\n ...restProps\n}: AlertActionProps) => {\n const platform = usePlatform();\n const handleItemClick = React.useCallback(\n () => onItemClick(action),\n [onItemClick, action]\n );\n\n if (platform === Platform.IOS) {\n const {\n Component = \"button\",\n title,\n action: actionProp,\n autoClose,\n mode,\n ...restActionProps\n } = action;\n\n return (\n <Tappable\n Component={restActionProps.href ? \"a\" : Component}\n className={classNamesString(\n styles[\"Alert__action\"],\n styles[`Alert__action--mode-${mode}`]\n )}\n onClick={handleItemClick}\n {...restActionProps}\n {...restProps}\n >\n {title}\n </Tappable>\n );\n }\n\n let mode: ButtonProps[\"mode\"] = \"tertiary\";\n\n if (platform === Platform.VKCOM) {\n mode = action.mode === \"cancel\" ? \"secondary\" : \"primary\";\n }\n\n return (\n <Button\n className={classNamesString(\n styles[\"Alert__button\"],\n styles[`Alert__button--mode-${action.mode}`]\n )}\n mode={mode}\n size=\"m\"\n onClick={handleItemClick}\n Component={action.Component}\n href={action.href}\n target={action.target}\n >\n {action.title}\n </Button>\n );\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Alert\n */\nexport const Alert = ({\n actions = [],\n actionsLayout = \"horizontal\",\n children,\n className,\n style,\n text,\n header,\n onClose,\n dismissLabel = \"Закрыть предупреждение\",\n ...restProps\n}: AlertProps) => {\n const platform = usePlatform();\n const { isDesktop } = useAdaptivityWithJSMediaQueries();\n const { waitTransitionFinish } = useWaitTransitionFinish();\n\n const [closing, setClosing] = React.useState(false);\n\n const elementRef = React.useRef<HTMLDivElement>(null);\n\n const resolvedActionsLayout: AlertProps[\"actionsLayout\"] =\n platform === Platform.VKCOM ? \"horizontal\" : actionsLayout;\n\n const timeout = platform === Platform.IOS ? 300 : 200;\n\n const close = React.useCallback(() => {\n setClosing(true);\n waitTransitionFinish(\n elementRef.current,\n (e?: TransitionEvent) => {\n if (!e || e.propertyName === \"opacity\") {\n onClose();\n }\n },\n timeout\n );\n }, [elementRef, waitTransitionFinish, onClose, timeout]);\n\n const onItemClick: ItemClickHandler = React.useCallback(\n (item: AlertActionInterface) => {\n const { action, autoClose } = item;\n\n if (autoClose) {\n setClosing(true);\n waitTransitionFinish(\n elementRef.current,\n (e?: TransitionEvent) => {\n if (!e || e.propertyName === \"opacity\") {\n onClose();\n action && action();\n }\n },\n timeout\n );\n } else {\n action && action();\n }\n },\n [elementRef, waitTransitionFinish, onClose, timeout]\n );\n\n useScrollLock();\n\n return (\n <PopoutWrapper\n className={className}\n closing={closing}\n style={style}\n onClick={close}\n >\n <FocusTrap\n {...restProps}\n getRootRef={elementRef}\n onClick={stopPropagation}\n onClose={close}\n timeout={timeout}\n className={classNamesString(\n styles[\"Alert\"],\n platform === Platform.IOS && styles[\"Alert--ios\"],\n platform === Platform.VKCOM && styles[\"Alert--vkcom\"],\n resolvedActionsLayout === \"vertical\"\n ? styles[\"Alert--v\"]\n : styles[\"Alert--h\"],\n closing && styles[\"Alert--closing\"],\n isDesktop && styles[\"Alert--desktop\"]\n )}\n role=\"alertdialog\"\n aria-modal\n aria-labelledby=\"vkui--alert--title\"\n aria-describedby=\"vkui--alert--desc\"\n >\n <div className={styles[\"Alert__content\"]}>\n {hasReactNode(header) && (\n <AlertHeader id=\"vkui--alert--title\">{header}</AlertHeader>\n )}\n {hasReactNode(text) && (\n <AlertText id=\"vkui--alert--desc\">{text}</AlertText>\n )}\n {children}\n </div>\n <div className={styles[\"Alert__actions\"]}>\n {actions.map((action, i) => (\n <AlertAction key={i} action={action} onItemClick={onItemClick} />\n ))}\n </div>\n {isDesktop && (\n <ModalDismissButton onClick={close} aria-label={dismissLabel} />\n )}\n </FocusTrap>\n </PopoutWrapper>\n );\n};\n"],"mappings":"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"}
|
|
@@ -21,6 +21,10 @@ export interface SelectProps extends NativeSelectProps, FormFieldProps, TrackerO
|
|
|
21
21
|
* Текст, который будет отображен, если приходит пустой `options`.
|
|
22
22
|
*/
|
|
23
23
|
emptyText?: string;
|
|
24
|
+
/**
|
|
25
|
+
* > ⚠️ В v6 из возвращаемых типов будет удалён `CustomSelectOptionInterface[]`. Для кастомной фильтрации используйте
|
|
26
|
+
* > `filterFn`.
|
|
27
|
+
*/
|
|
24
28
|
onInputChange?: (e: React.ChangeEvent, options: CustomSelectOptionInterface[]) => void | CustomSelectOptionInterface[];
|
|
25
29
|
options: CustomSelectOptionInterface[];
|
|
26
30
|
/**
|
|
@@ -255,14 +255,18 @@ function CustomSelect(props) {
|
|
|
255
255
|
}
|
|
256
256
|
setKeyboardInput(fullInput);
|
|
257
257
|
}, [focusOptionByIndex, keyboardInput, options]);
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Note: сбрасывать `options` через `setOptions(optionsProp)` не нужно.
|
|
261
|
+
* Сброс происходит в одном из эффекте `updateOptionsAndSelectedOptionIndex()`.
|
|
262
|
+
*/
|
|
258
263
|
var close = React.useCallback(function () {
|
|
259
264
|
resetKeyboardInput();
|
|
260
265
|
setInputValue("");
|
|
261
266
|
setOpened(false);
|
|
262
267
|
setFocusedOptionIndex(-1);
|
|
263
|
-
setOptions(optionsProp);
|
|
264
268
|
onClose === null || onClose === void 0 ? void 0 : onClose();
|
|
265
|
-
}, [onClose,
|
|
269
|
+
}, [onClose, resetKeyboardInput]);
|
|
266
270
|
var selectFocused = React.useCallback(function () {
|
|
267
271
|
if (focusedOptionIndex !== undefined && isValidIndex(focusedOptionIndex)) {
|
|
268
272
|
var item = options[focusedOptionIndex];
|
|
@@ -313,7 +317,7 @@ function CustomSelect(props) {
|
|
|
313
317
|
|
|
314
318
|
focusOptionByIndex(index);
|
|
315
319
|
}, [focusOptionByIndex, focusedOptionIndex, options]);
|
|
316
|
-
React.useEffect(function () {
|
|
320
|
+
React.useEffect(function updateOptionsAndSelectedOptionIndex() {
|
|
317
321
|
var _ref2, _props$value4;
|
|
318
322
|
var value = (_ref2 = (_props$value4 = props.value) !== null && _props$value4 !== void 0 ? _props$value4 : nativeSelectValue) !== null && _ref2 !== void 0 ? _ref2 : props.defaultValue;
|
|
319
323
|
var options = searchable && inputValue !== undefined ? filter(optionsProp, inputValue, filterFn) : optionsProp;
|
|
@@ -331,7 +335,7 @@ function CustomSelect(props) {
|
|
|
331
335
|
e.preventDefault();
|
|
332
336
|
}
|
|
333
337
|
}, []);
|
|
334
|
-
var onNativeSelectChange =
|
|
338
|
+
var onNativeSelectChange = function onNativeSelectChange(e) {
|
|
335
339
|
var newSelectedOptionIndex = findSelectedIndex(options, e.currentTarget.value);
|
|
336
340
|
if (selectedOptionIndex !== newSelectedOptionIndex) {
|
|
337
341
|
if (!isControlledOutside) {
|
|
@@ -339,7 +343,7 @@ function CustomSelect(props) {
|
|
|
339
343
|
}
|
|
340
344
|
onChange === null || onChange === void 0 ? void 0 : onChange(e);
|
|
341
345
|
}
|
|
342
|
-
}
|
|
346
|
+
};
|
|
343
347
|
var onInputKeyDown = React.useCallback(function (event) {
|
|
344
348
|
["ArrowUp", "ArrowDown", "Escape", "Enter"].includes(event.key) && areOptionsShown() && event.preventDefault();
|
|
345
349
|
switch (event.key) {
|
|
@@ -358,11 +362,12 @@ function CustomSelect(props) {
|
|
|
358
362
|
}
|
|
359
363
|
}, [areOptionsShown, close, focusOption, selectFocused]);
|
|
360
364
|
var onInputChange = React.useCallback(function (e) {
|
|
365
|
+
// TODO v6 удалить `onInputChangeProp`.
|
|
361
366
|
if (onInputChangeProp) {
|
|
362
367
|
var _options = onInputChangeProp(e, optionsProp);
|
|
363
368
|
if (_options) {
|
|
364
369
|
if (process.env.NODE_ENV === "development") {
|
|
365
|
-
warn("Этот метод фильтрации устарел. Возвращаемое значение onInputChange будет " + "проигнорировано в
|
|
370
|
+
warn("Этот метод фильтрации устарел. Возвращаемое значение onInputChange будет " + "проигнорировано в v6.0.0. Для фильтрации обновляйте props.options самостоятельно или используйте свойство filterFn.");
|
|
366
371
|
}
|
|
367
372
|
setOptions(_options);
|
|
368
373
|
setSelectedOptionIndex(findSelectedIndex(_options, nativeSelectValue));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomSelect.js","names":["findIndexAfter","options","startIndex","length","findIndex","option","i","disabled","findIndexBefore","endIndex","result","warn","warnOnce","checkOptionsValueType","Set","map","item","value","size","defaultRenderOptionFn","props","handleOptionDown","e","preventDefault","findSelectedIndex","Number","filter","inputValue","filterFn","defaultOptions","CustomSelect","React","useState","opened","setOpened","before","name","className","getRef","getRootRef","popupDirection","style","onChange","children","onInputChangeProp","onInputChange","renderDropdown","onOpen","onClose","fetching","forceDropdownPortal","selectType","autoHideScrollbar","autoHideScrollbarDelay","searchable","renderOption","renderOptionProp","optionsProp","emptyText","defaultFilterFn","icon","dropdownOffsetDistance","fixDropdownWidth","restProps","process","env","NODE_ENV","containerRef","useRef","scrollBoxRef","selectElRef","focusedOptionIndex","setFocusedOptionIndex","undefined","isControlledOutside","setIsControlledOutside","setInputValue","defaultValue","nativeSelectValue","setNativeSelectValue","keyboardInput","setKeyboardInput","popperPlacement","setPopperPlacement","setOptions","selectedOptionIndex","setSelectedOptionIndex","useEffect","useIsomorphicLayoutEffect","event","Event","bubbles","current","dispatchEvent","selected","useMemo","openedClassNames","classNamesString","includes","resetKeyboardInput","useCallback","scrollToElement","index","center","dropdown","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","isValidIndex","focusOptionByIndex","scrollTo","areOptionsShown","setScrollBoxRef","ref","onKeyboardInput","key","fullInput","optionIndex","getTitleFromChildren","label","toLowerCase","close","selectFocused","open","onBlur","resetFocusedOption","onFocus","onClick","handleKeyUp","debounce","focusOption","type","nextIndex","beforeIndex","onLabelClick","contains","target","onNativeSelectChange","newSelectedOptionIndex","currentTarget","onInputKeyDown","handleKeyDownSelect","handleOptionClick","Array","prototype","indexOf","call","parentNode","handleOptionHover","hovered","onMouseDown","onMouseOver","resolvedContent","defaultDropdownContent","multiRef","placeholder","getFormFieldModeFromSelectType"],"sources":["../../../../src/components/CustomSelect/CustomSelect.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { SelectMimicry } from \"../SelectMimicry/SelectMimicry\";\nimport { debounce, multiRef, getTitleFromChildren } from \"../../lib/utils\";\nimport { classNamesString } from \"../../lib/classNames\";\nimport { NativeSelectProps } from \"../NativeSelect/NativeSelect\";\nimport {\n CustomSelectOption,\n CustomSelectOptionProps,\n} from \"../CustomSelectOption/CustomSelectOption\";\nimport { FormFieldProps } from \"../FormField/FormField\";\nimport { Input } from \"../Input/Input\";\nimport { DropdownIcon } from \"../DropdownIcon/DropdownIcon\";\nimport { Footnote } from \"../Typography/Footnote/Footnote\";\nimport { warnOnce } from \"../../lib/warnOnce\";\nimport {\n defaultFilterFn,\n getFormFieldModeFromSelectType,\n} from \"../../lib/select\";\nimport { Placement } from \"../Popper/Popper\";\nimport { CustomSelectDropdown } from \"../CustomSelectDropdown/CustomSelectDropdown\";\nimport { TrackerOptionsProps } from \"../CustomScrollView/useTrackerVisibility\";\nimport { SelectType } from \"../Select/Select\";\nimport { useIsomorphicLayoutEffect } from \"../../lib/useIsomorphicLayoutEffect\";\nimport styles from \"./CustomSelect.module.css\";\n\nconst findIndexAfter = (\n options: CustomSelectOptionInterface[] = [],\n startIndex = -1\n) => {\n if (startIndex >= options.length - 1) {\n return -1;\n }\n return options.findIndex((option, i) => i > startIndex && !option.disabled);\n};\n\nconst findIndexBefore = (\n options: CustomSelectOptionInterface[] = [],\n endIndex: number = options.length\n) => {\n let result = -1;\n if (endIndex <= 0) {\n return result;\n }\n for (let i = endIndex - 1; i >= 0; i--) {\n let option = options[i];\n\n if (!option.disabled) {\n result = i;\n break;\n }\n }\n return result;\n};\n\nconst warn = warnOnce(\"CustomSelect\");\n\nconst checkOptionsValueType = (options: CustomSelectOptionInterface[]) => {\n if (new Set(options.map((item) => typeof item.value)).size > 1) {\n warn(\n \"Некоторые значения ваших опций имеют разные типы. onChange всегда возвращает строковый тип.\",\n \"error\"\n );\n }\n};\n\nfunction defaultRenderOptionFn({\n option,\n ...props\n}: CustomSelectOptionProps): React.ReactNode {\n return <CustomSelectOption {...props} />;\n}\n\nconst handleOptionDown: MouseEventHandler = (\n e: React.MouseEvent<HTMLElement>\n) => {\n e.preventDefault();\n};\n\nfunction findSelectedIndex(\n options: CustomSelectOptionInterface[],\n value: SelectValue\n) {\n return (\n options.findIndex((item) => {\n value = typeof item.value === \"number\" ? Number(value) : value;\n return item.value === value;\n }) ?? -1\n );\n}\n\nconst filter = (\n options: SelectProps[\"options\"],\n inputValue: string,\n filterFn: SelectProps[\"filterFn\"]\n) => {\n return typeof filterFn === \"function\"\n ? options.filter((option) => filterFn(inputValue, option))\n : options;\n};\n\nconst defaultOptions: CustomSelectOptionInterface[] = [];\n\ntype SelectValue = React.SelectHTMLAttributes<HTMLSelectElement>[\"value\"];\n\nexport interface CustomSelectOptionInterface {\n value: SelectValue;\n label: React.ReactElement | string;\n disabled?: boolean;\n [index: string]: any;\n}\n\nexport interface SelectProps\n extends NativeSelectProps,\n FormFieldProps,\n TrackerOptionsProps {\n /**\n * Если `true`, то при клике на селект в нём появится текстовое поле для поиска по `options`. По умолчанию поиск\n * производится по `option.label`.\n */\n searchable?: boolean;\n /**\n * Текст, который будет отображен, если приходит пустой `options`.\n */\n emptyText?: string;\n onInputChange?: (\n e: React.ChangeEvent,\n options: CustomSelectOptionInterface[]\n ) => void | CustomSelectOptionInterface[];\n options: CustomSelectOptionInterface[];\n /**\n * Функция для кастомной фильтрации. По умолчанию поиск производится по `option.label`.\n */\n filterFn?:\n | false\n | ((\n value: string,\n option: CustomSelectOptionInterface,\n getOptionLabel?: (\n option: Partial<CustomSelectOptionInterface>\n ) => string\n ) => boolean);\n popupDirection?: \"top\" | \"bottom\";\n /**\n * Рендер-проп для кастомного рендера опции.\n * В объекте аргумента приходят [свойства опции](https://vkcom.github.io/VKUI/#/CustomSelectOption?id=props)\n */\n renderOption?: (props: CustomSelectOptionProps) => React.ReactNode;\n /**\n * Рендер-проп для кастомного рендера содержимого дропдауна.\n * В `defaultDropdownContent` содержится список опций в виде скроллящегося блока.\n */\n renderDropdown?: ({\n defaultDropdownContent,\n }: {\n defaultDropdownContent: React.ReactNode;\n }) => React.ReactNode;\n /**\n * Если `true`, то в дропдауне вместо списка опций рисуется спиннер. При переданных `renderDropdown` и `fetching: true`\n * \"победит\" `renderDropdown`.\n */\n fetching?: boolean;\n onClose?: VoidFunction;\n onOpen?: VoidFunction;\n icon?: React.ReactNode;\n dropdownOffsetDistance?: number;\n fixDropdownWidth?: boolean;\n forceDropdownPortal?: boolean;\n selectType?: SelectType;\n}\n\ntype MouseEventHandler = (event: React.MouseEvent<HTMLElement>) => void;\n\n/**\n * @see https://vkcom.github.io/VKUI/#/CustomSelect\n */\nexport function CustomSelect(props: SelectProps) {\n const [opened, setOpened] = React.useState(false);\n const {\n before,\n name,\n className,\n getRef,\n getRootRef,\n popupDirection,\n style,\n onChange,\n children,\n onInputChange: onInputChangeProp,\n renderDropdown,\n onOpen,\n onClose,\n fetching,\n forceDropdownPortal,\n selectType = \"default\",\n autoHideScrollbar,\n autoHideScrollbarDelay,\n searchable = false,\n renderOption: renderOptionProp = defaultRenderOptionFn,\n options: optionsProp = defaultOptions,\n emptyText = \"Ничего не найдено\",\n filterFn = defaultFilterFn,\n icon = <DropdownIcon opened={opened} />,\n dropdownOffsetDistance = 0,\n fixDropdownWidth = true,\n ...restProps\n } = props;\n\n if (process.env.NODE_ENV === \"development\") {\n checkOptionsValueType(optionsProp);\n }\n\n const containerRef = React.useRef<HTMLLabelElement>(null);\n const scrollBoxRef = React.useRef<HTMLDivElement | null>(null);\n const selectElRef = React.useRef<HTMLSelectElement>(null);\n\n const [focusedOptionIndex, setFocusedOptionIndex] = React.useState<\n number | undefined\n >(-1);\n const [isControlledOutside, setIsControlledOutside] = React.useState(\n props.value !== undefined\n );\n const [inputValue, setInputValue] = React.useState(\"\");\n const [nativeSelectValue, setNativeSelectValue] = React.useState(\n props.value ?? props.defaultValue\n );\n const [keyboardInput, setKeyboardInput] = React.useState(\"\");\n const [popperPlacement, setPopperPlacement] = React.useState<\n Placement | undefined\n >(undefined);\n const [options, setOptions] = React.useState(optionsProp);\n const [selectedOptionIndex, setSelectedOptionIndex] = React.useState<\n number | undefined\n >(findSelectedIndex(optionsProp, props.value ?? props.defaultValue));\n\n React.useEffect(() => {\n setIsControlledOutside(props.value !== undefined);\n setNativeSelectValue(\n (nativeSelectValue) => props.value ?? nativeSelectValue\n );\n }, [props.value]);\n\n useIsomorphicLayoutEffect(() => {\n if (nativeSelectValue !== undefined) {\n const event = new Event(\"change\", { bubbles: true });\n\n selectElRef.current?.dispatchEvent(event);\n }\n }, [nativeSelectValue]);\n\n const selected = React.useMemo(() => {\n if (!options.length) {\n return null;\n }\n\n return selectedOptionIndex !== undefined\n ? options[selectedOptionIndex]\n : undefined;\n }, [options, selectedOptionIndex]);\n\n const openedClassNames = React.useMemo(\n () =>\n classNamesString(\n opened &&\n dropdownOffsetDistance === 0 &&\n (popperPlacement?.includes(\"top\")\n ? styles[\"CustomSelect--pop-up\"]\n : styles[\"CustomSelect--pop-down\"])\n ),\n [dropdownOffsetDistance, opened, popperPlacement]\n );\n\n const resetKeyboardInput = React.useCallback(() => {\n setKeyboardInput(\"\");\n }, []);\n\n const scrollToElement = React.useCallback((index: number, center = false) => {\n const dropdown = scrollBoxRef.current;\n const item = dropdown ? (dropdown.children[index] as HTMLElement) : null;\n\n if (!item || !dropdown) {\n return;\n }\n\n const dropdownHeight = dropdown.offsetHeight;\n const scrollTop = dropdown.scrollTop;\n const itemTop = item.offsetTop;\n const itemHeight = item.offsetHeight;\n\n if (center) {\n dropdown.scrollTop = itemTop - dropdownHeight / 2 + itemHeight / 2;\n } else if (itemTop + itemHeight > dropdownHeight + scrollTop) {\n dropdown.scrollTop = itemTop - dropdownHeight + itemHeight;\n } else if (itemTop < scrollTop) {\n dropdown.scrollTop = itemTop;\n }\n }, []);\n\n const isValidIndex = React.useCallback(\n (index: number) => {\n return index >= 0 && index < (options.length ?? 0);\n },\n [options.length]\n );\n\n const focusOptionByIndex = React.useCallback(\n (index: number | undefined, scrollTo = true) => {\n if (\n index === undefined ||\n index < 0 ||\n index > (options.length ?? 0) - 1\n ) {\n return;\n }\n\n const option = options[index];\n\n if (option?.disabled) {\n return;\n }\n\n if (scrollTo) {\n scrollToElement(index);\n }\n\n // Это оптимизация, прежде всего, под `onMouseOver`\n setFocusedOptionIndex((focusedOptionIndex) =>\n focusedOptionIndex !== index ? index : focusedOptionIndex\n );\n },\n [options, scrollToElement]\n );\n\n const areOptionsShown = React.useCallback(() => {\n return scrollBoxRef.current !== null;\n }, []);\n\n const setScrollBoxRef = React.useCallback(\n (ref: HTMLDivElement | null) => {\n scrollBoxRef.current = ref;\n\n if (\n ref &&\n selectedOptionIndex !== undefined &&\n isValidIndex(selectedOptionIndex)\n ) {\n {\n scrollToElement(selectedOptionIndex, true);\n }\n }\n },\n [isValidIndex, scrollToElement, selectedOptionIndex]\n );\n\n const onKeyboardInput = React.useCallback(\n (key: string) => {\n const fullInput = keyboardInput + key;\n\n const optionIndex = options.findIndex((option) => {\n return getTitleFromChildren(option.label)\n .toLowerCase()\n .includes(fullInput);\n });\n\n if (optionIndex !== undefined && optionIndex > -1) {\n focusOptionByIndex(optionIndex);\n }\n\n setKeyboardInput(fullInput);\n },\n [focusOptionByIndex, keyboardInput, options]\n );\n\n const close = React.useCallback(() => {\n resetKeyboardInput();\n\n setInputValue(\"\");\n setOpened(false);\n setFocusedOptionIndex(-1);\n setOptions(optionsProp);\n onClose?.();\n }, [onClose, optionsProp, resetKeyboardInput]);\n\n const selectFocused = React.useCallback(() => {\n if (focusedOptionIndex !== undefined && isValidIndex(focusedOptionIndex)) {\n const item = options[focusedOptionIndex];\n\n setNativeSelectValue(item?.value);\n close();\n }\n }, [close, focusedOptionIndex, isValidIndex, options]);\n\n const open = React.useCallback(() => {\n setOpened(true);\n setFocusedOptionIndex(selectedOptionIndex);\n\n if (typeof onOpen === \"function\") {\n onOpen();\n }\n }, [onOpen, selectedOptionIndex]);\n\n const onBlur = React.useCallback(() => {\n close();\n const event = new Event(\"blur\");\n selectElRef.current?.dispatchEvent(event);\n }, [close]);\n\n const resetFocusedOption = React.useCallback(() => {\n setFocusedOptionIndex(-1);\n }, []);\n\n const onFocus = React.useCallback(() => {\n const event = new Event(\"focus\");\n selectElRef.current?.dispatchEvent(event);\n }, []);\n\n const onClick = React.useCallback(() => {\n if (opened) {\n close();\n } else {\n open();\n }\n }, [close, open, opened]);\n\n const handleKeyUp = React.useMemo(\n () => debounce(resetKeyboardInput, 1000),\n [resetKeyboardInput]\n );\n\n const focusOption = React.useCallback(\n (type: \"next\" | \"prev\") => {\n let index = focusedOptionIndex;\n\n if (type === \"next\") {\n const nextIndex = findIndexAfter(options, index);\n index = nextIndex === -1 ? findIndexAfter(options) : nextIndex; // Следующий за index или первый валидный до index\n } else if (type === \"prev\") {\n const beforeIndex = findIndexBefore(options, index);\n index = beforeIndex === -1 ? findIndexBefore(options) : beforeIndex; // Предшествующий index или последний валидный после index\n }\n\n focusOptionByIndex(index);\n },\n [focusOptionByIndex, focusedOptionIndex, options]\n );\n\n React.useEffect(() => {\n const value = props.value ?? nativeSelectValue ?? props.defaultValue;\n\n const options =\n searchable && inputValue !== undefined\n ? filter(optionsProp, inputValue, filterFn)\n : optionsProp;\n\n setOptions(options);\n setSelectedOptionIndex(findSelectedIndex(options, value));\n }, [\n filterFn,\n inputValue,\n nativeSelectValue,\n optionsProp,\n props.defaultValue,\n props.value,\n searchable,\n ]);\n\n /**\n * Нужен для правильного поведения обработчика onClick на select. Фильтрует клики, которые были сделаны по\n * выпадающему списку.\n */\n const onLabelClick = React.useCallback(\n (e: React.MouseEvent<HTMLLabelElement>) => {\n if (scrollBoxRef.current?.contains(e.target as Node)) {\n e.preventDefault();\n }\n },\n []\n );\n\n const onNativeSelectChange: React.ChangeEventHandler<HTMLSelectElement> =\n React.useCallback(\n (e) => {\n const newSelectedOptionIndex = findSelectedIndex(\n options,\n e.currentTarget.value\n );\n\n if (selectedOptionIndex !== newSelectedOptionIndex) {\n if (!isControlledOutside) {\n setSelectedOptionIndex(newSelectedOptionIndex);\n }\n onChange?.(e);\n }\n },\n [isControlledOutside, onChange, options, selectedOptionIndex]\n );\n\n const onInputKeyDown: React.KeyboardEventHandler<HTMLInputElement> =\n React.useCallback(\n (event) => {\n [\"ArrowUp\", \"ArrowDown\", \"Escape\", \"Enter\"].includes(event.key) &&\n areOptionsShown() &&\n event.preventDefault();\n\n switch (event.key) {\n case \"ArrowUp\":\n areOptionsShown() && focusOption(\"prev\");\n break;\n case \"ArrowDown\":\n areOptionsShown() && focusOption(\"next\");\n break;\n case \"Escape\":\n close();\n break;\n case \"Enter\":\n areOptionsShown() && selectFocused();\n break;\n }\n },\n [areOptionsShown, close, focusOption, selectFocused]\n );\n\n const onInputChange: React.ChangeEventHandler<HTMLInputElement> =\n React.useCallback(\n (e) => {\n if (onInputChangeProp) {\n const options = onInputChangeProp(e, optionsProp);\n if (options) {\n if (process.env.NODE_ENV === \"development\") {\n warn(\n \"Этот метод фильтрации устарел. Возвращаемое значение onInputChange будет \" +\n \"проигнорировано в v5.0.0. Для фильтрации обновляйте props.options самостоятельно или используйте свойство filterFn.\"\n );\n }\n setOptions(options);\n setSelectedOptionIndex(\n findSelectedIndex(options, nativeSelectValue)\n );\n }\n } else {\n const options = filter(optionsProp, e.target.value, filterFn);\n setOptions(options);\n setSelectedOptionIndex(findSelectedIndex(options, nativeSelectValue));\n }\n setInputValue(e.target.value);\n },\n [filterFn, nativeSelectValue, onInputChangeProp, optionsProp]\n );\n\n const handleKeyDownSelect = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key.length === 1 && event.key !== \" \") {\n onKeyboardInput(event.key);\n return;\n }\n\n [\"ArrowUp\", \"ArrowDown\", \"Escape\", \"Enter\"].includes(event.key) &&\n areOptionsShown() &&\n event.preventDefault();\n\n switch (event.key) {\n case \"ArrowUp\":\n if (opened) {\n areOptionsShown() && focusOption(\"prev\");\n } else {\n open();\n }\n break;\n case \"ArrowDown\":\n if (opened) {\n areOptionsShown() && focusOption(\"next\");\n } else {\n open();\n }\n break;\n case \"Escape\":\n close();\n break;\n case \"Enter\":\n case \"Spacebar\":\n case \" \":\n if (opened) {\n areOptionsShown() && selectFocused();\n } else {\n open();\n }\n break;\n }\n },\n [\n areOptionsShown,\n close,\n focusOption,\n onKeyboardInput,\n open,\n opened,\n selectFocused,\n ]\n );\n\n const handleOptionClick = React.useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n const index = Array.prototype.indexOf.call(\n e.currentTarget.parentNode?.children,\n e.currentTarget\n );\n const option = options[index];\n\n if (option && !option.disabled) {\n selectFocused();\n }\n },\n [options, selectFocused]\n );\n\n const handleOptionHover = React.useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n focusOptionByIndex(\n Array.prototype.indexOf.call(\n e.currentTarget.parentNode?.children,\n e.currentTarget\n ),\n false\n );\n },\n [focusOptionByIndex]\n );\n\n const renderOption = React.useCallback(\n (option: CustomSelectOptionInterface, index: number) => {\n const hovered = index === focusedOptionIndex;\n const selected = index === selectedOptionIndex;\n\n return (\n <React.Fragment key={`${option.value}`}>\n {renderOptionProp({\n option,\n hovered,\n children: option.label,\n selected,\n disabled: option.disabled,\n onClick: handleOptionClick,\n onMouseDown: handleOptionDown,\n // Используем `onMouseOver` вместо `onMouseEnter`.\n // При параметре `searchable`, обновляется \"ребёнок\", из-за чего `onMouseEnter` не срабатывает в следующих кейсах:\n // 1. До загрузки выпадающего списка, курсор мышки находится над произвольным элементом этого списка.\n // > Лечение: только увод курсора мыши и возвращении его обратно вызывает событие `onMouseEnter` на этот элемент.\n // 2. Если это тач-устройство.\n // > Лечение: нужно нажать на какой-нибудь произвольный элемент списка, после чего `onMouseEnter` будет работать на соседние элементы,\n // но не на тот, на который нажали в первый раз.\n // Более подробно по ссылке https://github.com/facebook/react/issues/13956#issuecomment-1082055744\n onMouseOver: handleOptionHover,\n })}\n </React.Fragment>\n );\n },\n [\n focusedOptionIndex,\n handleOptionClick,\n handleOptionHover,\n renderOptionProp,\n selectedOptionIndex,\n ]\n );\n\n const resolvedContent = React.useMemo(() => {\n const defaultDropdownContent =\n options?.length > 0 ? (\n options.map(renderOption)\n ) : (\n <Footnote className={styles[\"CustomSelect__empty\"]}>\n {emptyText}\n </Footnote>\n );\n\n if (typeof renderDropdown === \"function\") {\n return renderDropdown({ defaultDropdownContent });\n } else {\n return defaultDropdownContent;\n }\n }, [emptyText, options, renderDropdown, renderOption]);\n\n return (\n <label\n className={classNamesString(styles[\"CustomSelect\"], className)}\n style={style}\n ref={multiRef(containerRef, getRootRef)}\n onClick={onLabelClick}\n >\n {opened && searchable ? (\n <Input\n {...restProps}\n autoFocus\n onBlur={onBlur}\n className={openedClassNames}\n value={inputValue}\n onKeyDown={onInputKeyDown}\n onChange={onInputChange}\n // TODO Ожидается, что клик поймает нативный select, но его перехватывает Input. К сожалению, это приводит к конфликтам типизации.\n // TODO Нужно перестать пытаться превратить CustomSelect в select. Тогда эта проблема уйдёт.\n // @ts-expect-error: TS2322 MouseEventHandler<HTMLSelectElement> !== MouseEventHandler<HTMLInputElement>\n onClick={props.onClick}\n before={before}\n after={icon}\n placeholder={restProps.placeholder}\n mode={getFormFieldModeFromSelectType(selectType)}\n />\n ) : (\n <SelectMimicry\n {...restProps}\n aria-hidden={true}\n onClick={onClick}\n onKeyDown={handleKeyDownSelect}\n onKeyUp={handleKeyUp}\n onFocus={onFocus}\n onBlur={onBlur}\n className={openedClassNames}\n after={icon}\n selectType={selectType}\n >\n {selected?.label}\n </SelectMimicry>\n )}\n <select\n ref={selectElRef}\n name={name}\n onChange={onNativeSelectChange}\n onBlur={props.onBlur}\n onFocus={props.onFocus}\n onClick={props.onClick}\n value={nativeSelectValue}\n aria-hidden={true}\n className={styles[\"CustomSelect__control\"]}\n >\n {optionsProp.map((item) => (\n <option key={`${item.value}`} value={item.value} />\n ))}\n </select>\n {opened && (\n <CustomSelectDropdown\n targetRef={containerRef}\n placement={popupDirection}\n scrollBoxRef={setScrollBoxRef}\n onPlacementChange={setPopperPlacement}\n onMouseLeave={resetFocusedOption}\n fetching={fetching}\n offsetDistance={dropdownOffsetDistance}\n sameWidth={fixDropdownWidth}\n forcePortal={forceDropdownPortal}\n autoHideScrollbar={autoHideScrollbar}\n autoHideScrollbarDelay={autoHideScrollbarDelay}\n observableRefs={scrollBoxRef}\n >\n {resolvedContent}\n </CustomSelectDropdown>\n )}\n </label>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CustomSelect.js","names":["findIndexAfter","options","startIndex","length","findIndex","option","i","disabled","findIndexBefore","endIndex","result","warn","warnOnce","checkOptionsValueType","Set","map","item","value","size","defaultRenderOptionFn","props","handleOptionDown","e","preventDefault","findSelectedIndex","Number","filter","inputValue","filterFn","defaultOptions","CustomSelect","React","useState","opened","setOpened","before","name","className","getRef","getRootRef","popupDirection","style","onChange","children","onInputChangeProp","onInputChange","renderDropdown","onOpen","onClose","fetching","forceDropdownPortal","selectType","autoHideScrollbar","autoHideScrollbarDelay","searchable","renderOption","renderOptionProp","optionsProp","emptyText","defaultFilterFn","icon","dropdownOffsetDistance","fixDropdownWidth","restProps","process","env","NODE_ENV","containerRef","useRef","scrollBoxRef","selectElRef","focusedOptionIndex","setFocusedOptionIndex","undefined","isControlledOutside","setIsControlledOutside","setInputValue","defaultValue","nativeSelectValue","setNativeSelectValue","keyboardInput","setKeyboardInput","popperPlacement","setPopperPlacement","setOptions","selectedOptionIndex","setSelectedOptionIndex","useEffect","useIsomorphicLayoutEffect","event","Event","bubbles","current","dispatchEvent","selected","useMemo","openedClassNames","classNamesString","includes","resetKeyboardInput","useCallback","scrollToElement","index","center","dropdown","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","isValidIndex","focusOptionByIndex","scrollTo","areOptionsShown","setScrollBoxRef","ref","onKeyboardInput","key","fullInput","optionIndex","getTitleFromChildren","label","toLowerCase","close","selectFocused","open","onBlur","resetFocusedOption","onFocus","onClick","handleKeyUp","debounce","focusOption","type","nextIndex","beforeIndex","updateOptionsAndSelectedOptionIndex","onLabelClick","contains","target","onNativeSelectChange","newSelectedOptionIndex","currentTarget","onInputKeyDown","handleKeyDownSelect","handleOptionClick","Array","prototype","indexOf","call","parentNode","handleOptionHover","hovered","onMouseDown","onMouseOver","resolvedContent","defaultDropdownContent","multiRef","placeholder","getFormFieldModeFromSelectType"],"sources":["../../../../src/components/CustomSelect/CustomSelect.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { SelectMimicry } from \"../SelectMimicry/SelectMimicry\";\nimport { debounce, multiRef, getTitleFromChildren } from \"../../lib/utils\";\nimport { classNamesString } from \"../../lib/classNames\";\nimport { NativeSelectProps } from \"../NativeSelect/NativeSelect\";\nimport {\n CustomSelectOption,\n CustomSelectOptionProps,\n} from \"../CustomSelectOption/CustomSelectOption\";\nimport { FormFieldProps } from \"../FormField/FormField\";\nimport { Input } from \"../Input/Input\";\nimport { DropdownIcon } from \"../DropdownIcon/DropdownIcon\";\nimport { Footnote } from \"../Typography/Footnote/Footnote\";\nimport { warnOnce } from \"../../lib/warnOnce\";\nimport {\n defaultFilterFn,\n getFormFieldModeFromSelectType,\n} from \"../../lib/select\";\nimport { Placement } from \"../Popper/Popper\";\nimport { CustomSelectDropdown } from \"../CustomSelectDropdown/CustomSelectDropdown\";\nimport { TrackerOptionsProps } from \"../CustomScrollView/useTrackerVisibility\";\nimport { SelectType } from \"../Select/Select\";\nimport { useIsomorphicLayoutEffect } from \"../../lib/useIsomorphicLayoutEffect\";\nimport styles from \"./CustomSelect.module.css\";\n\nconst findIndexAfter = (\n options: CustomSelectOptionInterface[] = [],\n startIndex = -1\n) => {\n if (startIndex >= options.length - 1) {\n return -1;\n }\n return options.findIndex((option, i) => i > startIndex && !option.disabled);\n};\n\nconst findIndexBefore = (\n options: CustomSelectOptionInterface[] = [],\n endIndex: number = options.length\n) => {\n let result = -1;\n if (endIndex <= 0) {\n return result;\n }\n for (let i = endIndex - 1; i >= 0; i--) {\n let option = options[i];\n\n if (!option.disabled) {\n result = i;\n break;\n }\n }\n return result;\n};\n\nconst warn = warnOnce(\"CustomSelect\");\n\nconst checkOptionsValueType = (options: CustomSelectOptionInterface[]) => {\n if (new Set(options.map((item) => typeof item.value)).size > 1) {\n warn(\n \"Некоторые значения ваших опций имеют разные типы. onChange всегда возвращает строковый тип.\",\n \"error\"\n );\n }\n};\n\nfunction defaultRenderOptionFn({\n option,\n ...props\n}: CustomSelectOptionProps): React.ReactNode {\n return <CustomSelectOption {...props} />;\n}\n\nconst handleOptionDown: MouseEventHandler = (\n e: React.MouseEvent<HTMLElement>\n) => {\n e.preventDefault();\n};\n\nfunction findSelectedIndex(\n options: CustomSelectOptionInterface[],\n value: SelectValue\n) {\n return (\n options.findIndex((item) => {\n value = typeof item.value === \"number\" ? Number(value) : value;\n return item.value === value;\n }) ?? -1\n );\n}\n\nconst filter = (\n options: SelectProps[\"options\"],\n inputValue: string,\n filterFn: SelectProps[\"filterFn\"]\n) => {\n return typeof filterFn === \"function\"\n ? options.filter((option) => filterFn(inputValue, option))\n : options;\n};\n\nconst defaultOptions: CustomSelectOptionInterface[] = [];\n\ntype SelectValue = React.SelectHTMLAttributes<HTMLSelectElement>[\"value\"];\n\nexport interface CustomSelectOptionInterface {\n value: SelectValue;\n label: React.ReactElement | string;\n disabled?: boolean;\n [index: string]: any;\n}\n\nexport interface SelectProps\n extends NativeSelectProps,\n FormFieldProps,\n TrackerOptionsProps {\n /**\n * Если `true`, то при клике на селект в нём появится текстовое поле для поиска по `options`. По умолчанию поиск\n * производится по `option.label`.\n */\n searchable?: boolean;\n /**\n * Текст, который будет отображен, если приходит пустой `options`.\n */\n emptyText?: string;\n /**\n * > ⚠️ В v6 из возвращаемых типов будет удалён `CustomSelectOptionInterface[]`. Для кастомной фильтрации используйте\n * > `filterFn`.\n */\n onInputChange?: (\n e: React.ChangeEvent,\n options: CustomSelectOptionInterface[]\n ) => void | CustomSelectOptionInterface[];\n options: CustomSelectOptionInterface[];\n /**\n * Функция для кастомной фильтрации. По умолчанию поиск производится по `option.label`.\n */\n filterFn?:\n | false\n | ((\n value: string,\n option: CustomSelectOptionInterface,\n getOptionLabel?: (\n option: Partial<CustomSelectOptionInterface>\n ) => string\n ) => boolean);\n popupDirection?: \"top\" | \"bottom\";\n /**\n * Рендер-проп для кастомного рендера опции.\n * В объекте аргумента приходят [свойства опции](https://vkcom.github.io/VKUI/#/CustomSelectOption?id=props)\n */\n renderOption?: (props: CustomSelectOptionProps) => React.ReactNode;\n /**\n * Рендер-проп для кастомного рендера содержимого дропдауна.\n * В `defaultDropdownContent` содержится список опций в виде скроллящегося блока.\n */\n renderDropdown?: ({\n defaultDropdownContent,\n }: {\n defaultDropdownContent: React.ReactNode;\n }) => React.ReactNode;\n /**\n * Если `true`, то в дропдауне вместо списка опций рисуется спиннер. При переданных `renderDropdown` и `fetching: true`\n * \"победит\" `renderDropdown`.\n */\n fetching?: boolean;\n onClose?: VoidFunction;\n onOpen?: VoidFunction;\n icon?: React.ReactNode;\n dropdownOffsetDistance?: number;\n fixDropdownWidth?: boolean;\n forceDropdownPortal?: boolean;\n selectType?: SelectType;\n}\n\ntype MouseEventHandler = (event: React.MouseEvent<HTMLElement>) => void;\n\n/**\n * @see https://vkcom.github.io/VKUI/#/CustomSelect\n */\nexport function CustomSelect(props: SelectProps) {\n const [opened, setOpened] = React.useState(false);\n const {\n before,\n name,\n className,\n getRef,\n getRootRef,\n popupDirection,\n style,\n onChange,\n children,\n onInputChange: onInputChangeProp,\n renderDropdown,\n onOpen,\n onClose,\n fetching,\n forceDropdownPortal,\n selectType = \"default\",\n autoHideScrollbar,\n autoHideScrollbarDelay,\n searchable = false,\n renderOption: renderOptionProp = defaultRenderOptionFn,\n options: optionsProp = defaultOptions,\n emptyText = \"Ничего не найдено\",\n filterFn = defaultFilterFn,\n icon = <DropdownIcon opened={opened} />,\n dropdownOffsetDistance = 0,\n fixDropdownWidth = true,\n ...restProps\n } = props;\n\n if (process.env.NODE_ENV === \"development\") {\n checkOptionsValueType(optionsProp);\n }\n\n const containerRef = React.useRef<HTMLLabelElement>(null);\n const scrollBoxRef = React.useRef<HTMLDivElement | null>(null);\n const selectElRef = React.useRef<HTMLSelectElement>(null);\n\n const [focusedOptionIndex, setFocusedOptionIndex] = React.useState<\n number | undefined\n >(-1);\n const [isControlledOutside, setIsControlledOutside] = React.useState(\n props.value !== undefined\n );\n const [inputValue, setInputValue] = React.useState(\"\");\n const [nativeSelectValue, setNativeSelectValue] = React.useState(\n props.value ?? props.defaultValue\n );\n const [keyboardInput, setKeyboardInput] = React.useState(\"\");\n const [popperPlacement, setPopperPlacement] = React.useState<\n Placement | undefined\n >(undefined);\n const [options, setOptions] = React.useState(optionsProp);\n const [selectedOptionIndex, setSelectedOptionIndex] = React.useState<\n number | undefined\n >(findSelectedIndex(optionsProp, props.value ?? props.defaultValue));\n\n React.useEffect(() => {\n setIsControlledOutside(props.value !== undefined);\n setNativeSelectValue(\n (nativeSelectValue) => props.value ?? nativeSelectValue\n );\n }, [props.value]);\n\n useIsomorphicLayoutEffect(() => {\n if (nativeSelectValue !== undefined) {\n const event = new Event(\"change\", { bubbles: true });\n\n selectElRef.current?.dispatchEvent(event);\n }\n }, [nativeSelectValue]);\n\n const selected = React.useMemo(() => {\n if (!options.length) {\n return null;\n }\n\n return selectedOptionIndex !== undefined\n ? options[selectedOptionIndex]\n : undefined;\n }, [options, selectedOptionIndex]);\n\n const openedClassNames = React.useMemo(\n () =>\n classNamesString(\n opened &&\n dropdownOffsetDistance === 0 &&\n (popperPlacement?.includes(\"top\")\n ? styles[\"CustomSelect--pop-up\"]\n : styles[\"CustomSelect--pop-down\"])\n ),\n [dropdownOffsetDistance, opened, popperPlacement]\n );\n\n const resetKeyboardInput = React.useCallback(() => {\n setKeyboardInput(\"\");\n }, []);\n\n const scrollToElement = React.useCallback((index: number, center = false) => {\n const dropdown = scrollBoxRef.current;\n const item = dropdown ? (dropdown.children[index] as HTMLElement) : null;\n\n if (!item || !dropdown) {\n return;\n }\n\n const dropdownHeight = dropdown.offsetHeight;\n const scrollTop = dropdown.scrollTop;\n const itemTop = item.offsetTop;\n const itemHeight = item.offsetHeight;\n\n if (center) {\n dropdown.scrollTop = itemTop - dropdownHeight / 2 + itemHeight / 2;\n } else if (itemTop + itemHeight > dropdownHeight + scrollTop) {\n dropdown.scrollTop = itemTop - dropdownHeight + itemHeight;\n } else if (itemTop < scrollTop) {\n dropdown.scrollTop = itemTop;\n }\n }, []);\n\n const isValidIndex = React.useCallback(\n (index: number) => {\n return index >= 0 && index < (options.length ?? 0);\n },\n [options.length]\n );\n\n const focusOptionByIndex = React.useCallback(\n (index: number | undefined, scrollTo = true) => {\n if (\n index === undefined ||\n index < 0 ||\n index > (options.length ?? 0) - 1\n ) {\n return;\n }\n\n const option = options[index];\n\n if (option?.disabled) {\n return;\n }\n\n if (scrollTo) {\n scrollToElement(index);\n }\n\n // Это оптимизация, прежде всего, под `onMouseOver`\n setFocusedOptionIndex((focusedOptionIndex) =>\n focusedOptionIndex !== index ? index : focusedOptionIndex\n );\n },\n [options, scrollToElement]\n );\n\n const areOptionsShown = React.useCallback(() => {\n return scrollBoxRef.current !== null;\n }, []);\n\n const setScrollBoxRef = React.useCallback(\n (ref: HTMLDivElement | null) => {\n scrollBoxRef.current = ref;\n\n if (\n ref &&\n selectedOptionIndex !== undefined &&\n isValidIndex(selectedOptionIndex)\n ) {\n {\n scrollToElement(selectedOptionIndex, true);\n }\n }\n },\n [isValidIndex, scrollToElement, selectedOptionIndex]\n );\n\n const onKeyboardInput = React.useCallback(\n (key: string) => {\n const fullInput = keyboardInput + key;\n\n const optionIndex = options.findIndex((option) => {\n return getTitleFromChildren(option.label)\n .toLowerCase()\n .includes(fullInput);\n });\n\n if (optionIndex !== undefined && optionIndex > -1) {\n focusOptionByIndex(optionIndex);\n }\n\n setKeyboardInput(fullInput);\n },\n [focusOptionByIndex, keyboardInput, options]\n );\n\n /**\n * Note: сбрасывать `options` через `setOptions(optionsProp)` не нужно.\n * Сброс происходит в одном из эффекте `updateOptionsAndSelectedOptionIndex()`.\n */\n const close = React.useCallback(() => {\n resetKeyboardInput();\n\n setInputValue(\"\");\n setOpened(false);\n setFocusedOptionIndex(-1);\n onClose?.();\n }, [onClose, resetKeyboardInput]);\n\n const selectFocused = React.useCallback(() => {\n if (focusedOptionIndex !== undefined && isValidIndex(focusedOptionIndex)) {\n const item = options[focusedOptionIndex];\n\n setNativeSelectValue(item?.value);\n close();\n }\n }, [close, focusedOptionIndex, isValidIndex, options]);\n\n const open = React.useCallback(() => {\n setOpened(true);\n setFocusedOptionIndex(selectedOptionIndex);\n\n if (typeof onOpen === \"function\") {\n onOpen();\n }\n }, [onOpen, selectedOptionIndex]);\n\n const onBlur = React.useCallback(() => {\n close();\n const event = new Event(\"blur\");\n selectElRef.current?.dispatchEvent(event);\n }, [close]);\n\n const resetFocusedOption = React.useCallback(() => {\n setFocusedOptionIndex(-1);\n }, []);\n\n const onFocus = React.useCallback(() => {\n const event = new Event(\"focus\");\n selectElRef.current?.dispatchEvent(event);\n }, []);\n\n const onClick = React.useCallback(() => {\n if (opened) {\n close();\n } else {\n open();\n }\n }, [close, open, opened]);\n\n const handleKeyUp = React.useMemo(\n () => debounce(resetKeyboardInput, 1000),\n [resetKeyboardInput]\n );\n\n const focusOption = React.useCallback(\n (type: \"next\" | \"prev\") => {\n let index = focusedOptionIndex;\n\n if (type === \"next\") {\n const nextIndex = findIndexAfter(options, index);\n index = nextIndex === -1 ? findIndexAfter(options) : nextIndex; // Следующий за index или первый валидный до index\n } else if (type === \"prev\") {\n const beforeIndex = findIndexBefore(options, index);\n index = beforeIndex === -1 ? findIndexBefore(options) : beforeIndex; // Предшествующий index или последний валидный после index\n }\n\n focusOptionByIndex(index);\n },\n [focusOptionByIndex, focusedOptionIndex, options]\n );\n\n React.useEffect(\n function updateOptionsAndSelectedOptionIndex() {\n const value = props.value ?? nativeSelectValue ?? props.defaultValue;\n\n const options =\n searchable && inputValue !== undefined\n ? filter(optionsProp, inputValue, filterFn)\n : optionsProp;\n\n setOptions(options);\n setSelectedOptionIndex(findSelectedIndex(options, value));\n },\n [\n filterFn,\n inputValue,\n nativeSelectValue,\n optionsProp,\n props.defaultValue,\n props.value,\n searchable,\n ]\n );\n\n /**\n * Нужен для правильного поведения обработчика onClick на select. Фильтрует клики, которые были сделаны по\n * выпадающему списку.\n */\n const onLabelClick = React.useCallback(\n (e: React.MouseEvent<HTMLLabelElement>) => {\n if (scrollBoxRef.current?.contains(e.target as Node)) {\n e.preventDefault();\n }\n },\n []\n );\n\n const onNativeSelectChange: React.ChangeEventHandler<HTMLSelectElement> = (\n e\n ) => {\n const newSelectedOptionIndex = findSelectedIndex(\n options,\n e.currentTarget.value\n );\n\n if (selectedOptionIndex !== newSelectedOptionIndex) {\n if (!isControlledOutside) {\n setSelectedOptionIndex(newSelectedOptionIndex);\n }\n onChange?.(e);\n }\n };\n\n const onInputKeyDown: React.KeyboardEventHandler<HTMLInputElement> =\n React.useCallback(\n (event) => {\n [\"ArrowUp\", \"ArrowDown\", \"Escape\", \"Enter\"].includes(event.key) &&\n areOptionsShown() &&\n event.preventDefault();\n\n switch (event.key) {\n case \"ArrowUp\":\n areOptionsShown() && focusOption(\"prev\");\n break;\n case \"ArrowDown\":\n areOptionsShown() && focusOption(\"next\");\n break;\n case \"Escape\":\n close();\n break;\n case \"Enter\":\n areOptionsShown() && selectFocused();\n break;\n }\n },\n [areOptionsShown, close, focusOption, selectFocused]\n );\n\n const onInputChange: React.ChangeEventHandler<HTMLInputElement> =\n React.useCallback(\n (e) => {\n // TODO v6 удалить `onInputChangeProp`.\n if (onInputChangeProp) {\n const options = onInputChangeProp(e, optionsProp);\n if (options) {\n if (process.env.NODE_ENV === \"development\") {\n warn(\n \"Этот метод фильтрации устарел. Возвращаемое значение onInputChange будет \" +\n \"проигнорировано в v6.0.0. Для фильтрации обновляйте props.options самостоятельно или используйте свойство filterFn.\"\n );\n }\n setOptions(options);\n setSelectedOptionIndex(\n findSelectedIndex(options, nativeSelectValue)\n );\n }\n } else {\n const options = filter(optionsProp, e.target.value, filterFn);\n setOptions(options);\n setSelectedOptionIndex(findSelectedIndex(options, nativeSelectValue));\n }\n setInputValue(e.target.value);\n },\n [filterFn, nativeSelectValue, onInputChangeProp, optionsProp]\n );\n\n const handleKeyDownSelect = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key.length === 1 && event.key !== \" \") {\n onKeyboardInput(event.key);\n return;\n }\n\n [\"ArrowUp\", \"ArrowDown\", \"Escape\", \"Enter\"].includes(event.key) &&\n areOptionsShown() &&\n event.preventDefault();\n\n switch (event.key) {\n case \"ArrowUp\":\n if (opened) {\n areOptionsShown() && focusOption(\"prev\");\n } else {\n open();\n }\n break;\n case \"ArrowDown\":\n if (opened) {\n areOptionsShown() && focusOption(\"next\");\n } else {\n open();\n }\n break;\n case \"Escape\":\n close();\n break;\n case \"Enter\":\n case \"Spacebar\":\n case \" \":\n if (opened) {\n areOptionsShown() && selectFocused();\n } else {\n open();\n }\n break;\n }\n },\n [\n areOptionsShown,\n close,\n focusOption,\n onKeyboardInput,\n open,\n opened,\n selectFocused,\n ]\n );\n\n const handleOptionClick = React.useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n const index = Array.prototype.indexOf.call(\n e.currentTarget.parentNode?.children,\n e.currentTarget\n );\n const option = options[index];\n\n if (option && !option.disabled) {\n selectFocused();\n }\n },\n [options, selectFocused]\n );\n\n const handleOptionHover = React.useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n focusOptionByIndex(\n Array.prototype.indexOf.call(\n e.currentTarget.parentNode?.children,\n e.currentTarget\n ),\n false\n );\n },\n [focusOptionByIndex]\n );\n\n const renderOption = React.useCallback(\n (option: CustomSelectOptionInterface, index: number) => {\n const hovered = index === focusedOptionIndex;\n const selected = index === selectedOptionIndex;\n\n return (\n <React.Fragment key={`${option.value}`}>\n {renderOptionProp({\n option,\n hovered,\n children: option.label,\n selected,\n disabled: option.disabled,\n onClick: handleOptionClick,\n onMouseDown: handleOptionDown,\n // Используем `onMouseOver` вместо `onMouseEnter`.\n // При параметре `searchable`, обновляется \"ребёнок\", из-за чего `onMouseEnter` не срабатывает в следующих кейсах:\n // 1. До загрузки выпадающего списка, курсор мышки находится над произвольным элементом этого списка.\n // > Лечение: только увод курсора мыши и возвращении его обратно вызывает событие `onMouseEnter` на этот элемент.\n // 2. Если это тач-устройство.\n // > Лечение: нужно нажать на какой-нибудь произвольный элемент списка, после чего `onMouseEnter` будет работать на соседние элементы,\n // но не на тот, на который нажали в первый раз.\n // Более подробно по ссылке https://github.com/facebook/react/issues/13956#issuecomment-1082055744\n onMouseOver: handleOptionHover,\n })}\n </React.Fragment>\n );\n },\n [\n focusedOptionIndex,\n handleOptionClick,\n handleOptionHover,\n renderOptionProp,\n selectedOptionIndex,\n ]\n );\n\n const resolvedContent = React.useMemo(() => {\n const defaultDropdownContent =\n options?.length > 0 ? (\n options.map(renderOption)\n ) : (\n <Footnote className={styles[\"CustomSelect__empty\"]}>\n {emptyText}\n </Footnote>\n );\n\n if (typeof renderDropdown === \"function\") {\n return renderDropdown({ defaultDropdownContent });\n } else {\n return defaultDropdownContent;\n }\n }, [emptyText, options, renderDropdown, renderOption]);\n\n return (\n <label\n className={classNamesString(styles[\"CustomSelect\"], className)}\n style={style}\n ref={multiRef(containerRef, getRootRef)}\n onClick={onLabelClick}\n >\n {opened && searchable ? (\n <Input\n {...restProps}\n autoFocus\n onBlur={onBlur}\n className={openedClassNames}\n value={inputValue}\n onKeyDown={onInputKeyDown}\n onChange={onInputChange}\n // TODO Ожидается, что клик поймает нативный select, но его перехватывает Input. К сожалению, это приводит к конфликтам типизации.\n // TODO Нужно перестать пытаться превратить CustomSelect в select. Тогда эта проблема уйдёт.\n // @ts-expect-error: TS2322 MouseEventHandler<HTMLSelectElement> !== MouseEventHandler<HTMLInputElement>\n onClick={props.onClick}\n before={before}\n after={icon}\n placeholder={restProps.placeholder}\n mode={getFormFieldModeFromSelectType(selectType)}\n />\n ) : (\n <SelectMimicry\n {...restProps}\n aria-hidden={true}\n onClick={onClick}\n onKeyDown={handleKeyDownSelect}\n onKeyUp={handleKeyUp}\n onFocus={onFocus}\n onBlur={onBlur}\n className={openedClassNames}\n after={icon}\n selectType={selectType}\n >\n {selected?.label}\n </SelectMimicry>\n )}\n <select\n ref={selectElRef}\n name={name}\n onChange={onNativeSelectChange}\n onBlur={props.onBlur}\n onFocus={props.onFocus}\n onClick={props.onClick}\n value={nativeSelectValue}\n aria-hidden={true}\n className={styles[\"CustomSelect__control\"]}\n >\n {optionsProp.map((item) => (\n <option key={`${item.value}`} value={item.value} />\n ))}\n </select>\n {opened && (\n <CustomSelectDropdown\n targetRef={containerRef}\n placement={popupDirection}\n scrollBoxRef={setScrollBoxRef}\n onPlacementChange={setPopperPlacement}\n onMouseLeave={resetFocusedOption}\n fetching={fetching}\n offsetDistance={dropdownOffsetDistance}\n sameWidth={fixDropdownWidth}\n forcePortal={forceDropdownPortal}\n autoHideScrollbar={autoHideScrollbar}\n autoHideScrollbarDelay={autoHideScrollbarDelay}\n observableRefs={scrollBoxRef}\n >\n {resolvedContent}\n </CustomSelectDropdown>\n )}\n </label>\n );\n}\n"],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ var React = _interopRequireWildcard(require("react"));
|
|
|
13
13
|
var _classNames = require("../../lib/classNames");
|
|
14
14
|
var _useIsomorphicLayoutEffect = require("../../lib/useIsomorphicLayoutEffect");
|
|
15
15
|
var _utils = require("../../lib/utils");
|
|
16
|
+
var _useId = require("../../hooks/useId");
|
|
16
17
|
var _warnOnce = require("../../lib/warnOnce");
|
|
17
18
|
var _SegmentedControlOption = require("./SegmentedControlOption/SegmentedControlOption");
|
|
18
19
|
var _useAdaptivity2 = require("../../hooks/useAdaptivity");
|
|
@@ -38,6 +39,7 @@ var SegmentedControl = function SegmentedControl(_ref) {
|
|
|
38
39
|
children = _ref.children,
|
|
39
40
|
className = _ref.className,
|
|
40
41
|
restProps = (0, _objectWithoutProperties2.default)(_ref, _excluded);
|
|
42
|
+
var id = (0, _useId.useId)();
|
|
41
43
|
var _useAdaptivity = (0, _useAdaptivity2.useAdaptivity)(),
|
|
42
44
|
sizeY = _useAdaptivity.sizeY;
|
|
43
45
|
var initialValue = defaultValue !== null && defaultValue !== void 0 ? defaultValue : (_options$ = options[0]) === null || _options$ === void 0 ? void 0 : _options$.value;
|
|
@@ -55,7 +57,6 @@ var SegmentedControl = function SegmentedControl(_ref) {
|
|
|
55
57
|
valueLocal = _React$useState4[0],
|
|
56
58
|
updateValueLocal = _React$useState4[1];
|
|
57
59
|
var value = valueProp !== null && valueProp !== void 0 ? valueProp : valueLocal;
|
|
58
|
-
var nameRef = React.useRef(name !== null && name !== void 0 ? name : (0, _utils.generateRandomId)());
|
|
59
60
|
(0, _useIsomorphicLayoutEffect.useIsomorphicLayoutEffect)(function () {
|
|
60
61
|
var _activeOptionIdx = options.findIndex(function (option) {
|
|
61
62
|
return option.value === value;
|
|
@@ -94,7 +95,7 @@ var SegmentedControl = function SegmentedControl(_ref) {
|
|
|
94
95
|
key: "".concat(optionProps.value)
|
|
95
96
|
}, optionProps, {
|
|
96
97
|
className: (0, _classNames.classNamesString)("vkuiSegmentedControl__option", optionClassName),
|
|
97
|
-
name:
|
|
98
|
+
name: name !== null && name !== void 0 ? name : id,
|
|
98
99
|
checked: value === optionProps.value,
|
|
99
100
|
onChange: function onChange() {
|
|
100
101
|
return handleOnChange(optionProps.value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SegmentedControl.js","names":["warn","warnOnce","SegmentedControl","size","name","options","getRootRef","onChange","noop","valueProp","value","defaultValue","children","className","restProps","useAdaptivity","sizeY","initialValue","process","env","NODE_ENV","undefined","React","useState","activeOptionIdx","updateActiveOptionIdx","valueLocal","updateValueLocal","
|
|
1
|
+
{"version":3,"file":"SegmentedControl.js","names":["warn","warnOnce","SegmentedControl","size","name","options","getRootRef","onChange","noop","valueProp","value","defaultValue","children","className","restProps","id","useId","useAdaptivity","sizeY","initialValue","process","env","NODE_ENV","undefined","React","useState","activeOptionIdx","updateActiveOptionIdx","valueLocal","updateValueLocal","useIsomorphicLayoutEffect","_activeOptionIdx","findIndex","option","translateX","handleOnChange","classNamesString","getSizeYClassName","styles","width","length","transform","WebkitTransform","map","label","optionClassName","optionProps"],"sources":["../../../../src/components/SegmentedControl/SegmentedControl.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { classNamesString } from \"../../lib/classNames\";\nimport { useIsomorphicLayoutEffect } from \"../../lib/useIsomorphicLayoutEffect\";\nimport { noop } from \"../../lib/utils\";\nimport { useId } from \"../../hooks/useId\";\nimport { warnOnce } from \"../../lib/warnOnce\";\nimport { SegmentedControlOption } from \"./SegmentedControlOption/SegmentedControlOption\";\nimport { HasRootRef } from \"../../types\";\nimport { useAdaptivity } from \"../../hooks/useAdaptivity\";\nimport { getSizeYClassName } from \"../../helpers/getSizeYClassName\";\nimport styles from \"./SegmentedControl.module.css\";\n\nexport type SegmentedControlValue = string | number | undefined;\n\nexport interface SegmentedControlOptionInterface\n extends Omit<React.HTMLAttributes<HTMLElement>, \"label\"> {\n label: React.ReactChild;\n value: SegmentedControlValue;\n}\n\nexport interface SegmentedControlProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\">,\n HasRootRef<HTMLDivElement> {\n options: SegmentedControlOptionInterface[];\n size?: \"m\" | \"l\";\n name?: string;\n onChange?: (value: SegmentedControlValue) => void;\n value?: SegmentedControlValue;\n defaultValue?: SegmentedControlValue;\n}\n\nconst warn = warnOnce(\"SegmentedControl\");\n\n/**\n * @see https://vkcom.github.io/VKUI/#/SegmentedControl\n */\nexport const SegmentedControl = ({\n size = \"l\",\n name,\n options,\n getRootRef,\n onChange = noop,\n value: valueProp,\n defaultValue,\n children,\n className,\n ...restProps\n}: SegmentedControlProps) => {\n const id = useId();\n\n const { sizeY } = useAdaptivity();\n const initialValue = defaultValue ?? options[0]?.value;\n\n if (process.env.NODE_ENV === \"development\") {\n if (valueProp !== undefined && defaultValue !== undefined) {\n warn(\n \"SegmentedControl должен быть либо управляемым, либо неуправляемым\" +\n \"(укажите либо свойство value, либо свойство defaultValue, но не оба).\",\n \"error\"\n );\n }\n }\n\n const [activeOptionIdx, updateActiveOptionIdx] = React.useState<number>(0);\n const [valueLocal, updateValueLocal] =\n React.useState<SegmentedControlValue>(initialValue);\n\n const value = valueProp ?? valueLocal;\n\n useIsomorphicLayoutEffect(() => {\n const _activeOptionIdx = options.findIndex(\n (option) => option.value === value\n );\n\n if (_activeOptionIdx === -1 && process.env.NODE_ENV === \"development\") {\n warn(\"defaultValue: такого значения нет среди опций!\", \"error\");\n }\n\n updateActiveOptionIdx(_activeOptionIdx);\n }, [value, options]);\n\n const translateX = `translateX(${100 * activeOptionIdx}%)`;\n\n const handleOnChange = (value: SegmentedControlValue) => {\n if (valueProp === undefined) {\n updateValueLocal(value);\n }\n onChange(value);\n };\n\n return (\n <div\n {...restProps}\n className={classNamesString(\n styles[\"SegmentedControl\"],\n getSizeYClassName(styles[\"SegmentedControl\"], sizeY),\n styles[`SegmentedControl--size-${size}`],\n className\n )}\n ref={getRootRef}\n >\n <div role=\"radiogroup\" className={styles[\"SegmentedControl__in\"]}>\n {activeOptionIdx > -1 && (\n <div\n aria-hidden=\"true\"\n className={styles[\"SegmentedControl__slider\"]}\n style={{\n width: `${100 / options.length}%`,\n transform: translateX,\n WebkitTransform: translateX,\n }}\n />\n )}\n {options.map(\n ({ label, className: optionClassName, ...optionProps }) => (\n <SegmentedControlOption\n key={`${optionProps.value}`}\n {...optionProps}\n className={classNamesString(\n styles[\"SegmentedControl__option\"],\n optionClassName\n )}\n name={name ?? id}\n checked={value === optionProps.value}\n onChange={() => handleOnChange(optionProps.value)}\n >\n {label}\n </SegmentedControlOption>\n )\n )}\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { TouchProps } from "../Touch/Touch";
|
|
3
|
-
import { HasComponent, HasRootRef } from "../../types";
|
|
3
|
+
import { AnchorHTMLAttributesOnly, HasComponent, HasRootRef } from "../../types";
|
|
4
4
|
import { FocusVisibleMode } from "../FocusVisible/FocusVisible";
|
|
5
5
|
declare type StateMode = "opacity" | "background";
|
|
6
|
-
export declare type TappableElementProps = Omit<React.AllHTMLAttributes<HTMLElement>, "onTouchStart" | "onTouchMove" | "onTouchEnd" | "onTouchCancel" | "onMouseDown" | "onMouseMove" | "onMouseUp" | "onMouseLeave"
|
|
6
|
+
export declare type TappableElementProps = Omit<React.AllHTMLAttributes<HTMLElement>, "onTouchStart" | "onTouchMove" | "onTouchEnd" | "onTouchCancel" | "onMouseDown" | "onMouseMove" | "onMouseUp" | "onMouseLeave"> & AnchorHTMLAttributesOnly;
|
|
7
7
|
export interface TappableProps extends TappableElementProps, HasRootRef<HTMLElement>, HasComponent, Pick<TouchProps, "onStart" | "onEnd" | "onMove"> {
|
|
8
8
|
/**
|
|
9
9
|
* Длительность показа active-состояния
|