@finam/web-ui-kit-components 3.34.2 → 3.34.3
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/CHANGELOG.md +2 -0
- package/dist/Breadcrumbs/utils/getRenderOnPageItems.d.ts.map +1 -1
- package/dist/Breadcrumbs/utils/getRenderOnPageItems.js +6 -3
- package/dist/Breadcrumbs/utils/getRenderOnPageItems.js.map +1 -1
- package/dist/Breadcrumbs/utils/intersperseWithKeys.d.ts.map +1 -1
- package/dist/Breadcrumbs/utils/intersperseWithKeys.js +6 -3
- package/dist/Breadcrumbs/utils/intersperseWithKeys.js.map +1 -1
- package/dist/CodeInput/CodeInput.js +4 -1
- package/dist/CodeInput/CodeInput.js.map +1 -1
- package/dist/DraggablePopover/layersManager.d.ts.map +1 -1
- package/dist/DraggablePopover/layersManager.js +1 -0
- package/dist/DraggablePopover/layersManager.js.map +1 -1
- package/dist/MultiSelectField/MultiSelectField.d.ts.map +1 -1
- package/dist/MultiSelectField/MultiSelectField.js +1 -0
- package/dist/MultiSelectField/MultiSelectField.js.map +1 -1
- package/dist/NumberTextField/NumberTextField.js +4 -2
- package/dist/NumberTextField/NumberTextField.js.map +1 -1
- package/dist/NumberTextField/utils.js +5 -1
- package/dist/NumberTextField/utils.js.map +1 -1
- package/dist/Paper/Paper.styles.d.ts.map +1 -1
- package/dist/Paper/Paper.styles.js +3 -1
- package/dist/Paper/Paper.styles.js.map +1 -1
- package/dist/PickersUtilsProvider/defaultDateFormatUtils.js +4 -3
- package/dist/PickersUtilsProvider/defaultDateFormatUtils.js.map +1 -1
- package/dist/PickersUtilsProvider/defaultTimeFormatUtils.js +5 -4
- package/dist/PickersUtilsProvider/defaultTimeFormatUtils.js.map +1 -1
- package/dist/ProductCard/badges/utils.js +2 -1
- package/dist/ProductCard/badges/utils.js.map +1 -1
- package/dist/ProductCard/layouts/common/chartUtils.d.ts.map +1 -1
- package/dist/ProductCard/layouts/common/chartUtils.js +1 -0
- package/dist/ProductCard/layouts/common/chartUtils.js.map +1 -1
- package/dist/ProductCard/utils.js +1 -1
- package/dist/ProductCard/utils.js.map +1 -1
- package/dist/SecurityIcon/constants.d.ts +2 -2
- package/dist/SecurityIcon/constants.d.ts.map +1 -1
- package/dist/SecurityIcon/constants.js.map +1 -1
- package/dist/SecurityIcon/utils.d.ts.map +1 -1
- package/dist/SecurityIcon/utils.js +2 -1
- package/dist/SecurityIcon/utils.js.map +1 -1
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +4 -2
- package/dist/Slider/Slider.js.map +1 -1
- package/dist/Slider/utils.js +1 -1
- package/dist/Slider/utils.js.map +1 -1
- package/dist/Snackbar/Snackbar.js +4 -4
- package/dist/Snackbar/Snackbar.js.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getRenderOnPageItems.d.ts","sourceRoot":"","sources":["../../../src/Breadcrumbs/utils/getRenderOnPageItems.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAK7D,UAAU,0BAA0B;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,cAAc,EAAE,CAAC;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACjD,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,uBAAuB,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;CAClE;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAAI,mJAWlC,0BAA0B,
|
|
1
|
+
{"version":3,"file":"getRenderOnPageItems.d.ts","sourceRoot":"","sources":["../../../src/Breadcrumbs/utils/getRenderOnPageItems.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAK7D,UAAU,0BAA0B;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,cAAc,EAAE,CAAC;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACjD,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,uBAAuB,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;CAClE;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAAI,mJAWlC,0BAA0B,8CAsG5B,CAAC"}
|
|
@@ -33,9 +33,12 @@ const getRenderOnPageItems = ({ count, shouldShowOverflow, processedItems, hasMe
|
|
|
33
33
|
} else {
|
|
34
34
|
const middleItemsToShow = Math.max(0, visibleItemsCount - FIXED_ITEMS_COUNT);
|
|
35
35
|
const startIndexOfMiddle = count - 1 - middleItemsToShow;
|
|
36
|
-
for(let i = startIndexOfMiddle; i < count - 1; i++)
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
for(let i = startIndexOfMiddle; i < count - 1; i++){
|
|
37
|
+
const item = processedItems[i];
|
|
38
|
+
if (item) segments.push(/*#__PURE__*/ jsx(Breadcrumb, _({
|
|
39
|
+
"aria-current": false
|
|
40
|
+
}, item), `${item.text}-${item.value}`));
|
|
41
|
+
}
|
|
39
42
|
}
|
|
40
43
|
else if (count >= MAX_VISIBLE_ITEMS_COUNT) {
|
|
41
44
|
const penultimateIndex = count - 2;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Breadcrumbs/utils/getRenderOnPageItems.js","sources":["../../../src/Breadcrumbs/utils/getRenderOnPageItems.tsx"],"sourcesContent":["import type { KeyboardEvent, MouseEvent } from 'react';\nimport type { BreadcrumbItem } from '../Breadcrumb/types.js';\nimport { ICON_BUTTON_KEY, MAX_VISIBLE_ITEMS_COUNT, FIXED_ITEMS_COUNT, BREADCRUMB_SIZES } from '../constants.js';\nimport HiddenItemsButton from '../HiddenItemsButton/index.js';\nimport Breadcrumb from '../Breadcrumb/Breadcrumb.js';\n\ninterface GetRenderOnPageItemsParams {\n count: number;\n shouldShowOverflow: boolean;\n processedItems: BreadcrumbItem[];\n hasMeasured: boolean;\n visibleItemsCount: number;\n menuItems: JSX.Element;\n open: boolean;\n handleOpen: (e: MouseEvent<HTMLElement>) => void;\n handleClose: () => void;\n handleIconButtonKeyDown: (e: KeyboardEvent<HTMLElement>) => void;\n}\n\n/**\n * Возвращает хлебные крошки\n */\nexport const getRenderOnPageItems = ({\n count,\n shouldShowOverflow,\n processedItems,\n hasMeasured,\n visibleItemsCount,\n menuItems,\n open,\n handleOpen,\n handleClose,\n handleIconButtonKeyDown,\n}: GetRenderOnPageItemsParams) => {\n if (count === 0) {\n return [];\n }\n\n if (!shouldShowOverflow) {\n return processedItems.map((item, i) => (\n <Breadcrumb\n key={`${item.text}-${item.value}`}\n aria-current={i === count - 1}\n data-breadcrumb-item={hasMeasured ? undefined : true}\n {...item}\n />\n ));\n }\n\n const segments = [];\n const measureAttr = hasMeasured ? undefined : true;\n\n // Добавляем первый элемент\n if (processedItems[0]) {\n segments.push(\n <Breadcrumb\n key={`${processedItems[0].text}-${processedItems[0].value}`}\n aria-current={false}\n data-breadcrumb-item={measureAttr}\n {...processedItems[0]}\n />,\n );\n }\n\n // Добавляем IconButton\n segments.push(\n <HiddenItemsButton\n key={ICON_BUTTON_KEY}\n size={processedItems[0]?.size ?? BREADCRUMB_SIZES.regular}\n menuItems={menuItems}\n open={open}\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n onKeyDown={handleIconButtonKeyDown}\n />,\n );\n\n // Логика для средних элементов\n if (!hasMeasured) {\n if (count >= MAX_VISIBLE_ITEMS_COUNT) {\n const penultimateIndex = count - 2;\n if (processedItems[penultimateIndex]) {\n segments.push(\n <Breadcrumb\n key={`${processedItems[penultimateIndex].text}-${processedItems[penultimateIndex].value}`}\n aria-current={false}\n data-breadcrumb-item={true}\n {...processedItems[penultimateIndex]}\n />,\n );\n }\n }\n } else if (count >= MAX_VISIBLE_ITEMS_COUNT) {\n const penultimateIndex = count - FIXED_ITEMS_COUNT;\n if (processedItems[penultimateIndex]) {\n segments.push(\n <Breadcrumb\n key={`${processedItems[penultimateIndex].text}-${processedItems[penultimateIndex].value}`}\n aria-current={false}\n {...processedItems[penultimateIndex]}\n />,\n );\n }\n } else {\n const middleItemsToShow = Math.max(0, visibleItemsCount - FIXED_ITEMS_COUNT);\n const startIndexOfMiddle = count - 1 - middleItemsToShow;\n\n for (let i = startIndexOfMiddle; i < count - 1; i++) {\n
|
|
1
|
+
{"version":3,"file":"Breadcrumbs/utils/getRenderOnPageItems.js","sources":["../../../src/Breadcrumbs/utils/getRenderOnPageItems.tsx"],"sourcesContent":["import type { KeyboardEvent, MouseEvent } from 'react';\nimport type { BreadcrumbItem } from '../Breadcrumb/types.js';\nimport { ICON_BUTTON_KEY, MAX_VISIBLE_ITEMS_COUNT, FIXED_ITEMS_COUNT, BREADCRUMB_SIZES } from '../constants.js';\nimport HiddenItemsButton from '../HiddenItemsButton/index.js';\nimport Breadcrumb from '../Breadcrumb/Breadcrumb.js';\n\ninterface GetRenderOnPageItemsParams {\n count: number;\n shouldShowOverflow: boolean;\n processedItems: BreadcrumbItem[];\n hasMeasured: boolean;\n visibleItemsCount: number;\n menuItems: JSX.Element;\n open: boolean;\n handleOpen: (e: MouseEvent<HTMLElement>) => void;\n handleClose: () => void;\n handleIconButtonKeyDown: (e: KeyboardEvent<HTMLElement>) => void;\n}\n\n/**\n * Возвращает хлебные крошки\n */\nexport const getRenderOnPageItems = ({\n count,\n shouldShowOverflow,\n processedItems,\n hasMeasured,\n visibleItemsCount,\n menuItems,\n open,\n handleOpen,\n handleClose,\n handleIconButtonKeyDown,\n}: GetRenderOnPageItemsParams) => {\n if (count === 0) {\n return [];\n }\n\n if (!shouldShowOverflow) {\n return processedItems.map((item, i) => (\n <Breadcrumb\n key={`${item.text}-${item.value}`}\n aria-current={i === count - 1}\n data-breadcrumb-item={hasMeasured ? undefined : true}\n {...item}\n />\n ));\n }\n\n const segments = [];\n const measureAttr = hasMeasured ? undefined : true;\n\n // Добавляем первый элемент\n if (processedItems[0]) {\n segments.push(\n <Breadcrumb\n key={`${processedItems[0].text}-${processedItems[0].value}`}\n aria-current={false}\n data-breadcrumb-item={measureAttr}\n {...processedItems[0]}\n />,\n );\n }\n\n // Добавляем IconButton\n segments.push(\n <HiddenItemsButton\n key={ICON_BUTTON_KEY}\n size={processedItems[0]?.size ?? BREADCRUMB_SIZES.regular}\n menuItems={menuItems}\n open={open}\n onMouseEnter={handleOpen}\n onMouseLeave={handleClose}\n onKeyDown={handleIconButtonKeyDown}\n />,\n );\n\n // Логика для средних элементов\n if (!hasMeasured) {\n if (count >= MAX_VISIBLE_ITEMS_COUNT) {\n const penultimateIndex = count - 2;\n if (processedItems[penultimateIndex]) {\n segments.push(\n <Breadcrumb\n key={`${processedItems[penultimateIndex].text}-${processedItems[penultimateIndex].value}`}\n aria-current={false}\n data-breadcrumb-item={true}\n {...processedItems[penultimateIndex]}\n />,\n );\n }\n }\n } else if (count >= MAX_VISIBLE_ITEMS_COUNT) {\n const penultimateIndex = count - FIXED_ITEMS_COUNT;\n if (processedItems[penultimateIndex]) {\n segments.push(\n <Breadcrumb\n key={`${processedItems[penultimateIndex].text}-${processedItems[penultimateIndex].value}`}\n aria-current={false}\n {...processedItems[penultimateIndex]}\n />,\n );\n }\n } else {\n const middleItemsToShow = Math.max(0, visibleItemsCount - FIXED_ITEMS_COUNT);\n const startIndexOfMiddle = count - 1 - middleItemsToShow;\n\n for (let i = startIndexOfMiddle; i < count - 1; i++) {\n const item = processedItems[i];\n if (item) {\n segments.push(\n <Breadcrumb\n key={`${item.text}-${item.value}`}\n aria-current={false}\n {...item}\n />,\n );\n }\n }\n }\n\n // Добавляем последний элемент\n const lastIndex = count - 1;\n if (processedItems[lastIndex]) {\n segments.push(\n <Breadcrumb\n key={`${processedItems[lastIndex].text}-${processedItems[lastIndex].value}`}\n aria-current={true}\n data-breadcrumb-item={measureAttr}\n {...processedItems[lastIndex]}\n />,\n );\n }\n\n return segments;\n};\n"],"names":["getRenderOnPageItems","count","shouldShowOverflow","processedItems","hasMeasured","visibleItemsCount","menuItems","open","handleOpen","handleClose","handleIconButtonKeyDown","_processedItems_","item","i","Breadcrumb","undefined","segments","measureAttr","HiddenItemsButton","BREADCRUMB_SIZES","ICON_BUTTON_KEY","MAX_VISIBLE_ITEMS_COUNT","penultimateIndex","FIXED_ITEMS_COUNT","middleItemsToShow","Math","startIndexOfMiddle","lastIndex"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intersperseWithKeys.d.ts","sourceRoot":"","sources":["../../../src/Breadcrumbs/utils/intersperseWithKeys.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,YAAY,GAAG,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"intersperseWithKeys.d.ts","sourceRoot":"","sources":["../../../src/Breadcrumbs/utils/intersperseWithKeys.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,YAAY,GAAG,YAAY,EAAE,CAwBhG"}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { _ } from "@swc/helpers/_/_object_spread";
|
|
2
2
|
import { _ as _object_spread_props__ } from "@swc/helpers/_/_object_spread_props";
|
|
3
3
|
function intersperseWithKeys(arr, separator) {
|
|
4
|
-
|
|
4
|
+
const [firstItem] = arr;
|
|
5
|
+
if (null == firstItem) return [];
|
|
5
6
|
const result = [
|
|
6
|
-
|
|
7
|
+
firstItem
|
|
7
8
|
];
|
|
8
9
|
for(let i = 1; i < arr.length; i++){
|
|
10
|
+
const item = arr[i];
|
|
11
|
+
if (null == item) break;
|
|
9
12
|
const separatorWithKey = _object_spread_props__(_({}, separator), {
|
|
10
13
|
key: `separator-${i - 1}`
|
|
11
14
|
});
|
|
12
|
-
result.push(separatorWithKey,
|
|
15
|
+
result.push(separatorWithKey, item);
|
|
13
16
|
}
|
|
14
17
|
return result;
|
|
15
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Breadcrumbs/utils/intersperseWithKeys.js","sources":["../../../src/Breadcrumbs/utils/intersperseWithKeys.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\n\nexport function intersperseWithKeys(arr: ReactElement[], separator: ReactElement): ReactElement[] {\n if (
|
|
1
|
+
{"version":3,"file":"Breadcrumbs/utils/intersperseWithKeys.js","sources":["../../../src/Breadcrumbs/utils/intersperseWithKeys.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\n\nexport function intersperseWithKeys(arr: ReactElement[], separator: ReactElement): ReactElement[] {\n const [firstItem] = arr;\n\n if (firstItem == null) {\n return [];\n }\n\n const result: ReactElement[] = [firstItem];\n\n for (let i = 1; i < arr.length; i++) {\n const item = arr[i];\n\n if (item == null) {\n break;\n }\n\n const separatorWithKey = {\n ...separator,\n key: `separator-${i - 1}`,\n };\n result.push(separatorWithKey, item);\n }\n\n return result;\n}\n"],"names":["intersperseWithKeys","arr","separator","firstItem","result","i","item","separatorWithKey"],"mappings":";;AAEO,SAASA,oBAAoBC,GAAmB,EAAEC,SAAuB;IAC9E,MAAM,CAACC,UAAU,GAAGF;IAEpB,IAAIE,AAAa,QAAbA,WACF,OAAO,EAAE;IAGX,MAAMC,SAAyB;QAACD;KAAU;IAE1C,IAAK,IAAIE,IAAI,GAAGA,IAAIJ,IAAI,MAAM,EAAEI,IAAK;QACnC,MAAMC,OAAOL,GAAG,CAACI,EAAE;QAEnB,IAAIC,AAAQ,QAARA,MACF;QAGF,MAAMC,mBAAmB,6BACpBL,YAAAA;YACH,KAAK,CAAC,UAAU,EAAEG,IAAI,GAAG;;QAE3BD,OAAO,IAAI,CAACG,kBAAkBD;IAChC;IAEA,OAAOF;AACT"}
|
|
@@ -28,7 +28,10 @@ const CodeInput = (_0)=>{
|
|
|
28
28
|
const focusCell = useCallback((index)=>{
|
|
29
29
|
var _cellsRef_current;
|
|
30
30
|
const cells = null == (_cellsRef_current = cellsRef.current) ? void 0 : _cellsRef_current.querySelectorAll('input');
|
|
31
|
-
if (null == cells ? void 0 : cells.length)
|
|
31
|
+
if (null == cells ? void 0 : cells.length) {
|
|
32
|
+
var _cells_Math_min;
|
|
33
|
+
null == (_cells_Math_min = cells[Math.min(Math.max(index, 0), cells.length - 1)]) || _cells_Math_min.focus();
|
|
34
|
+
}
|
|
32
35
|
}, []);
|
|
33
36
|
const update = useCallback((next)=>{
|
|
34
37
|
valueRef.current = next;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeInput/CodeInput.js","sources":["../../src/CodeInput/CodeInput.tsx"],"sourcesContent":["import {\n memo,\n useCallback,\n useRef,\n type ChangeEvent,\n type ClipboardEvent,\n type ComponentPropsWithoutRef,\n type FocusEvent,\n type KeyboardEvent,\n} from 'react';\nimport classnames from 'clsx';\nimport { KeyboardEventKey } from '../types.js';\nimport Input from '../Input/index.js';\nimport { Cells, cellClassName } from './CodeInput.styles.js';\n\nconst MASK_CHAR = '•';\n\nexport type Size = 'm' | 's';\n\nexport type Variant = 'primary' | 'outline';\n\nexport interface Props extends Omit<ComponentPropsWithoutRef<typeof Cells>, 'onChange'> {\n /** Введённый код */\n value: string;\n /** Количество ячеек */\n length: number;\n /** Скрывать введённые цифры */\n mask?: boolean;\n /** Обработчик изменения кода */\n onChange: (value: string) => void;\n /** Вызывается, когда заполнены все ячейки */\n onComplete?: (value: string) => void;\n /** Вариант отображения ячеек */\n variant?: Variant;\n /** Размер ячеек */\n size?: Size;\n /** Применение стиля, указывающее на наличие ошибки */\n error?: boolean;\n /** Блокировка ввода */\n disabled?: boolean;\n /** Установка фокуса на первую ячейку при монтировании */\n autoFocus?: boolean;\n}\n\nconst CodeInput = ({\n value,\n length,\n mask = false,\n onChange,\n onComplete,\n variant = 'primary',\n size = 's',\n error = false,\n disabled = false,\n autoFocus = false,\n className,\n ...props\n}: Props) => {\n const cellsRef = useRef<HTMLDivElement>(null);\n\n const valueRef = useRef(value);\n valueRef.current = value;\n\n const focusCell = useCallback((index: number) => {\n const cells = cellsRef.current?.querySelectorAll('input');\n\n if (cells?.length) {\n cells[Math.min(Math.max(index, 0), cells.length - 1)]
|
|
1
|
+
{"version":3,"file":"CodeInput/CodeInput.js","sources":["../../src/CodeInput/CodeInput.tsx"],"sourcesContent":["import {\n memo,\n useCallback,\n useRef,\n type ChangeEvent,\n type ClipboardEvent,\n type ComponentPropsWithoutRef,\n type FocusEvent,\n type KeyboardEvent,\n} from 'react';\nimport classnames from 'clsx';\nimport { KeyboardEventKey } from '../types.js';\nimport Input from '../Input/index.js';\nimport { Cells, cellClassName } from './CodeInput.styles.js';\n\nconst MASK_CHAR = '•';\n\nexport type Size = 'm' | 's';\n\nexport type Variant = 'primary' | 'outline';\n\nexport interface Props extends Omit<ComponentPropsWithoutRef<typeof Cells>, 'onChange'> {\n /** Введённый код */\n value: string;\n /** Количество ячеек */\n length: number;\n /** Скрывать введённые цифры */\n mask?: boolean;\n /** Обработчик изменения кода */\n onChange: (value: string) => void;\n /** Вызывается, когда заполнены все ячейки */\n onComplete?: (value: string) => void;\n /** Вариант отображения ячеек */\n variant?: Variant;\n /** Размер ячеек */\n size?: Size;\n /** Применение стиля, указывающее на наличие ошибки */\n error?: boolean;\n /** Блокировка ввода */\n disabled?: boolean;\n /** Установка фокуса на первую ячейку при монтировании */\n autoFocus?: boolean;\n}\n\nconst CodeInput = ({\n value,\n length,\n mask = false,\n onChange,\n onComplete,\n variant = 'primary',\n size = 's',\n error = false,\n disabled = false,\n autoFocus = false,\n className,\n ...props\n}: Props) => {\n const cellsRef = useRef<HTMLDivElement>(null);\n\n const valueRef = useRef(value);\n valueRef.current = value;\n\n const focusCell = useCallback((index: number) => {\n const cells = cellsRef.current?.querySelectorAll('input');\n\n if (cells?.length) {\n cells[Math.min(Math.max(index, 0), cells.length - 1)]?.focus();\n }\n }, []);\n\n const update = useCallback((next: string) => {\n valueRef.current = next;\n onChange(next);\n\n if (next.length === length) {\n onComplete?.(next);\n }\n }, [length, onChange, onComplete]);\n\n const write = useCallback((index: number, chars: string) => {\n update((value.slice(0, index) + chars + value.slice(index + chars.length)).slice(0, length));\n focusCell(index + chars.length);\n }, [focusCell, length, update, value]);\n\n const handleChange = (index: number) => (e: ChangeEvent<HTMLInputElement>) => {\n const digits = e.currentTarget.value.replace(/\\D/g, '');\n\n if (digits) {\n write(index, digits);\n return;\n }\n\n update(value.slice(0, index) + value.slice(index + 1));\n };\n\n const handleKeyDown = (index: number) => (e: KeyboardEvent<HTMLInputElement>) => {\n switch (e.key) {\n case KeyboardEventKey.BACKSPACE:\n if (!value[index] && index > 0) {\n e.preventDefault();\n update(value.slice(0, index - 1) + value.slice(index));\n focusCell(index - 1);\n }\n break;\n case KeyboardEventKey.ARROW_LEFT:\n case KeyboardEventKey.LEFT:\n e.preventDefault();\n focusCell(index - 1);\n break;\n case KeyboardEventKey.ARROW_RIGHT:\n case KeyboardEventKey.RIGHT:\n e.preventDefault();\n focusCell(index + 1);\n break;\n }\n };\n\n const handlePaste = (index: number) => (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n\n const digits = e.clipboardData.getData('text').replace(/\\D/g, '').slice(0, length - index);\n\n if (digits) {\n write(index, digits);\n }\n };\n\n const handleFocus = (index: number) => (e: FocusEvent<HTMLInputElement>) => {\n if (index > valueRef.current.length) {\n focusCell(valueRef.current.length);\n return;\n }\n\n e.currentTarget.select();\n };\n\n return (\n <Cells\n {...props}\n ref={cellsRef}\n className={classnames(className, { error: error && !disabled })}\n >\n {Array.from({ length }, (_, index) => (\n <Input\n key={index}\n className={cellClassName}\n variant={variant}\n size={size}\n error={error}\n disabled={disabled}\n hintTooltip={false}\n hideEmptyHint={true}\n singleLine={true}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete={index === 0 ? 'one-time-code' : 'off'}\n maxLength={1}\n value={value[index] ? (mask ? MASK_CHAR : value[index]) : ''}\n autoFocus={autoFocus && index === 0 ? true : undefined}\n onChange={handleChange(index)}\n onKeyDown={handleKeyDown(index)}\n onPaste={handlePaste(index)}\n onFocus={handleFocus(index)}\n />\n ))}\n </Cells>\n );\n};\n\nexport default memo(CodeInput);\n"],"names":["MASK_CHAR","CodeInput","value","length","mask","onChange","onComplete","variant","size","error","disabled","autoFocus","className","props","cellsRef","useRef","valueRef","focusCell","useCallback","index","_cellsRef_current","cells","_cells_Math_min","Math","update","next","write","chars","handleChange","e","digits","handleKeyDown","KeyboardEventKey","handlePaste","handleFocus","Cells","classnames","Array","_","Input","cellClassName","undefined","memo"],"mappings":";;;;;;;;;AAeA,MAAMA,YAAY;AA6BlB,MAAMC,YAAY,CAAC;QAAA,EACjBC,KAAK,EACLC,MAAM,EACNC,OAAO,KAAK,EACZC,QAAQ,EACRC,UAAU,EACVC,UAAU,SAAS,EACnBC,OAAO,GAAG,EACVC,QAAQ,KAAK,EACbC,WAAW,KAAK,EAChBC,YAAY,KAAK,EACjBC,SAAS,EAEH,OADHC,QAAAA,6BAAAA,IAAAA;;;;;;;;;;;;;IAEH,MAAMC,WAAWC,OAAuB;IAExC,MAAMC,WAAWD,OAAOb;IACxBc,SAAS,OAAO,GAAGd;IAEnB,MAAMe,YAAYC,YAAY,CAACC;YACfC;QAAd,MAAMC,QAAQ,QAAAD,CAAAA,oBAAAA,SAAS,OAAO,AAAD,IAAfA,KAAAA,IAAAA,kBAAkB,gBAAgB,CAAC;QAEjD,IAAIC,QAAAA,QAAAA,KAAAA,IAAAA,MAAO,MAAM,EAAE;gBACjBC;oBAAAA,CAAAA,kBAAAA,KAAK,CAACC,KAAK,GAAG,CAACA,KAAK,GAAG,CAACJ,OAAO,IAAIE,MAAM,MAAM,GAAG,GAAG,AAAD,KAApDC,gBAAuD,KAAK;QAC9D;IACF,GAAG,EAAE;IAEL,MAAME,SAASN,YAAY,CAACO;QAC1BT,SAAS,OAAO,GAAGS;QACnBpB,SAASoB;QAET,IAAIA,KAAK,MAAM,KAAKtB,QAClBG,QAAAA,cAAAA,WAAamB;IAEjB,GAAG;QAACtB;QAAQE;QAAUC;KAAW;IAEjC,MAAMoB,QAAQR,YAAY,CAACC,OAAeQ;QACxCH,OAAQtB,AAAAA,CAAAA,MAAM,KAAK,CAAC,GAAGiB,SAASQ,QAAQzB,MAAM,KAAK,CAACiB,QAAQQ,MAAM,MAAM,GAAG,KAAK,CAAC,GAAGxB;QACpFc,UAAUE,QAAQQ,MAAM,MAAM;IAChC,GAAG;QAACV;QAAWd;QAAQqB;QAAQtB;KAAM;IAErC,MAAM0B,eAAe,CAACT,QAAkB,CAACU;YACvC,MAAMC,SAASD,EAAE,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO;YAEpD,IAAIC,QAAQ,YACVJ,MAAMP,OAAOW;YAIfN,OAAOtB,MAAM,KAAK,CAAC,GAAGiB,SAASjB,MAAM,KAAK,CAACiB,QAAQ;QACrD;IAEA,MAAMY,gBAAgB,CAACZ,QAAkB,CAACU;YACxC,OAAQA,EAAE,GAAG;gBACX,KAAKG,iBAAiB,SAAS;oBAC7B,IAAI,CAAC9B,KAAK,CAACiB,MAAM,IAAIA,QAAQ,GAAG;wBAC9BU,EAAE,cAAc;wBAChBL,OAAOtB,MAAM,KAAK,CAAC,GAAGiB,QAAQ,KAAKjB,MAAM,KAAK,CAACiB;wBAC/CF,UAAUE,QAAQ;oBACpB;oBACA;gBACF,KAAKa,iBAAiB,UAAU;gBAChC,KAAKA,iBAAiB,IAAI;oBACxBH,EAAE,cAAc;oBAChBZ,UAAUE,QAAQ;oBAClB;gBACF,KAAKa,iBAAiB,WAAW;gBACjC,KAAKA,iBAAiB,KAAK;oBACzBH,EAAE,cAAc;oBAChBZ,UAAUE,QAAQ;oBAClB;YACJ;QACF;IAEA,MAAMc,cAAc,CAACd,QAAkB,CAACU;YACtCA,EAAE,cAAc;YAEhB,MAAMC,SAASD,EAAE,aAAa,CAAC,OAAO,CAAC,QAAQ,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,GAAG1B,SAASgB;YAEpF,IAAIW,QACFJ,MAAMP,OAAOW;QAEjB;IAEA,MAAMI,cAAc,CAACf,QAAkB,CAACU;YACtC,IAAIV,QAAQH,SAAS,OAAO,CAAC,MAAM,EAAE,YACnCC,UAAUD,SAAS,OAAO,CAAC,MAAM;YAInCa,EAAE,aAAa,CAAC,MAAM;QACxB;IAEA,OAAO,WAAP,GACE,IAACM,OAAKA,uBAAAA,iBAAAA,CAAAA,GACAtB,QAAAA;QACJ,KAAKC;QACL,WAAWsB,KAAWxB,WAAW;YAAE,OAAOH,SAAS,CAACC;QAAS;kBAE5D2B,MAAM,IAAI,CAAC;YAAElC;QAAO,GAAG,CAACmC,GAAGnB,QAAAA,WAAAA,GAC1B,IAACoB,OAAKA;gBAEJ,WAAWC;gBACX,SAASjC;gBACT,MAAMC;gBACN,OAAOC;gBACP,UAAUC;gBACV,aAAa;gBACb,eAAe;gBACf,YAAY;gBACZ,MAAK;gBACL,WAAU;gBACV,cAAcS,AAAU,MAAVA,QAAc,kBAAkB;gBAC9C,WAAW;gBACX,OAAOjB,KAAK,CAACiB,MAAM,GAAIf,OAAOJ,YAAYE,KAAK,CAACiB,MAAM,GAAI;gBAC1D,WAAWR,aAAaQ,AAAU,MAAVA,QAAc,OAAOsB;gBAC7C,UAAUb,aAAaT;gBACvB,WAAWY,cAAcZ;gBACzB,SAASc,YAAYd;gBACrB,SAASe,YAAYf;eAlBhBA;;AAuBf;AAEA,0CAAeuB,KAAKzC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layersManager.d.ts","sourceRoot":"","sources":["../../src/DraggablePopover/layersManager.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,cAAM,aAAa;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IAEtC,cAAc,GAAI,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"layersManager.d.ts","sourceRoot":"","sources":["../../src/DraggablePopover/layersManager.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,cAAM,aAAa;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IAEtC,cAAc,GAAI,IAAI,MAAM,UAiB1B;IAEF,mBAAmB,GAAI,IAAI,MAAM,UAW/B;IAEF,gBAAgB,GAAI,IAAI,MAAM,EAAE,SAAS,MAAM,IAAI,EAAE,QAAQ,MAAM,IAAI,gBAerE;IAEF,aAAa,GAAI,IAAI,MAAM,aAAoD;CAChF;AAED,eAAO,MAAM,oBAAoB,eAAsB,CAAC;AAExD,eAAe,aAAa,CAAC"}
|
|
@@ -5,6 +5,7 @@ class LayersManager {
|
|
|
5
5
|
const layerIndex = this.layers.findIndex((layer)=>layer.id === id);
|
|
6
6
|
if (layerIndex < 0 || layerIndex >= this.layers.length - 1) return;
|
|
7
7
|
const [layer] = this.layers.splice(layerIndex, 1);
|
|
8
|
+
if (null == layer) return;
|
|
8
9
|
this.layers.forEach((layerValue, index)=>{
|
|
9
10
|
if (index >= layerIndex) layerValue.onBack();
|
|
10
11
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DraggablePopover/layersManager.js","sources":["../../src/DraggablePopover/layersManager.ts"],"sourcesContent":["export interface Layer {\n id: string;\n onFront: () => void;\n onBack: () => void;\n}\n\nclass LayersManager {\n private readonly layers: Layer[] = [];\n\n setLayerActive = (id: string) => {\n const layerIndex = this.layers.findIndex(layer => layer.id === id);\n if (layerIndex < 0 || layerIndex >= this.layers.length - 1) {\n return;\n }\n const [layer] = this.layers.splice(layerIndex, 1);\n this.layers.forEach((layerValue, index) => {\n if (index >= layerIndex) {\n layerValue.onBack();\n }\n });\n this.layers.push(layer);\n layer.onFront();\n };\n\n removeLayerListener = (id: string) => {\n const layerIndex = this.layers.findIndex(layer => layer.id === id);\n if (layerIndex < 0) {\n return;\n }\n this.layers.splice(layerIndex, 1);\n this.layers.forEach((layer, index) => {\n if (index < layerIndex) {\n layer.onFront();\n }\n });\n };\n\n addLayerListener = (id: string, onFront: () => void, onBack: () => void) => {\n if (!this.layers.some(layer => layer.id === id)) {\n this.layers.forEach((layer) => {\n layer.onBack();\n });\n this.layers.push({\n id,\n onFront,\n onBack,\n });\n }\n\n return () => {\n this.removeLayerListener(id);\n };\n };\n\n isLayerActive = (id: string) => this.layers[this.layers.length - 1]?.id === id;\n}\n\nexport const defaultLayersManager = new LayersManager();\n\nexport default LayersManager;\n"],"names":["LayersManager","id","layerIndex","layer","layerValue","index","onFront","onBack","_this_layers_","defaultLayersManager"],"mappings":"AAMA,MAAMA;;aACa,MAAM,GAAY,EAAE;aAErC,cAAc,GAAG,CAACC;YAChB,MAAMC,aAAa,IAAI,CAAC,MAAM,CAAC,SAAS,CAACC,CAAAA,QAASA,MAAM,EAAE,KAAKF;YAC/D,IAAIC,aAAa,KAAKA,cAAc,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,GACvD;YAEF,MAAM,CAACC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAACD,YAAY;YAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"DraggablePopover/layersManager.js","sources":["../../src/DraggablePopover/layersManager.ts"],"sourcesContent":["export interface Layer {\n id: string;\n onFront: () => void;\n onBack: () => void;\n}\n\nclass LayersManager {\n private readonly layers: Layer[] = [];\n\n setLayerActive = (id: string) => {\n const layerIndex = this.layers.findIndex(layer => layer.id === id);\n if (layerIndex < 0 || layerIndex >= this.layers.length - 1) {\n return;\n }\n const [layer] = this.layers.splice(layerIndex, 1);\n if (layer == null) {\n return;\n }\n\n this.layers.forEach((layerValue, index) => {\n if (index >= layerIndex) {\n layerValue.onBack();\n }\n });\n this.layers.push(layer);\n layer.onFront();\n };\n\n removeLayerListener = (id: string) => {\n const layerIndex = this.layers.findIndex(layer => layer.id === id);\n if (layerIndex < 0) {\n return;\n }\n this.layers.splice(layerIndex, 1);\n this.layers.forEach((layer, index) => {\n if (index < layerIndex) {\n layer.onFront();\n }\n });\n };\n\n addLayerListener = (id: string, onFront: () => void, onBack: () => void) => {\n if (!this.layers.some(layer => layer.id === id)) {\n this.layers.forEach((layer) => {\n layer.onBack();\n });\n this.layers.push({\n id,\n onFront,\n onBack,\n });\n }\n\n return () => {\n this.removeLayerListener(id);\n };\n };\n\n isLayerActive = (id: string) => this.layers[this.layers.length - 1]?.id === id;\n}\n\nexport const defaultLayersManager = new LayersManager();\n\nexport default LayersManager;\n"],"names":["LayersManager","id","layerIndex","layer","layerValue","index","onFront","onBack","_this_layers_","defaultLayersManager"],"mappings":"AAMA,MAAMA;;aACa,MAAM,GAAY,EAAE;aAErC,cAAc,GAAG,CAACC;YAChB,MAAMC,aAAa,IAAI,CAAC,MAAM,CAAC,SAAS,CAACC,CAAAA,QAASA,MAAM,EAAE,KAAKF;YAC/D,IAAIC,aAAa,KAAKA,cAAc,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,GACvD;YAEF,MAAM,CAACC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAACD,YAAY;YAC/C,IAAIC,AAAS,QAATA,OACF;YAGF,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAACC,YAAYC;gBAC/B,IAAIA,SAASH,YACXE,WAAW,MAAM;YAErB;YACA,IAAI,CAAC,MAAM,CAAC,IAAI,CAACD;YACjBA,MAAM,OAAO;QACf;aAEA,mBAAmB,GAAG,CAACF;YACrB,MAAMC,aAAa,IAAI,CAAC,MAAM,CAAC,SAAS,CAACC,CAAAA,QAASA,MAAM,EAAE,KAAKF;YAC/D,IAAIC,aAAa,GACf;YAEF,IAAI,CAAC,MAAM,CAAC,MAAM,CAACA,YAAY;YAC/B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAACC,OAAOE;gBAC1B,IAAIA,QAAQH,YACVC,MAAM,OAAO;YAEjB;QACF;aAEA,gBAAgB,GAAG,CAACF,IAAYK,SAAqBC;YACnD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAACJ,CAAAA,QAASA,MAAM,EAAE,KAAKF,KAAK;gBAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAACE;oBACnBA,MAAM,MAAM;gBACd;gBACA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBACfF;oBACAK;oBACAC;gBACF;YACF;YAEA,OAAO;gBACL,IAAI,CAAC,mBAAmB,CAACN;YAC3B;QACF;aAEA,aAAa,GAAG,CAACA;gBAAeO;mBAAAA,AAAAA,SAAAA,CAAAA,gBAAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,AAAD,IAAlCA,KAAAA,IAAAA,cAAqC,EAAE,AAAD,MAAMP;;;AAC9E;AAEO,MAAMQ,uBAAuB,IAAIT;AAExC,sBAAeA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiSelectField.d.ts","sourceRoot":"","sources":["../../src/MultiSelectField/MultiSelectField.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EAAE,SAAS,EAAE,YAAY,EACjD,WAAW,EAIZ,MAAM,OAAO,CAAC;AAOf,OAAqB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAoB,MAAM,aAAa,CAAC;AAEnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,OAAO,EAEL,aAAa,EAad,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAK/D,KAAK,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AAG1B,MAAM,WAAW,KAAM,SAAQ,IAAI,CAAC,wBAAwB,CAAC,OAAO,aAAa,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IACtG,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa;IACb,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,+CAA+C;IAC/C,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAC1D,gCAAgC;IAChC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gCAAgC;IAChC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8BAA8B;IAC9B,QAAQ,EAAE,YAAY,CAAC,kBAAkB,CAAC,GAAG,YAAY,CAAC,kBAAkB,CAAC,EAAE,CAAC;IAChF,0DAA0D;IAC1D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+CAA+C;IAC/C,oBAAoB,CAAC,EAAE,SAAS,CAAC;IACjC,sDAAsD;IACtD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;iEAC6D;IAC7D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;mFAC+E;IAC/E,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,6EAA6E;IAC7E,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,wEAAwE;IACxE,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACvC,qEAAqE;IACrE,mBAAmB,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAC/C,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;;
|
|
1
|
+
{"version":3,"file":"MultiSelectField.d.ts","sourceRoot":"","sources":["../../src/MultiSelectField/MultiSelectField.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EAAE,SAAS,EAAE,YAAY,EACjD,WAAW,EAIZ,MAAM,OAAO,CAAC;AAOf,OAAqB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAoB,MAAM,aAAa,CAAC;AAEnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,OAAO,EAEL,aAAa,EAad,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAK/D,KAAK,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AAG1B,MAAM,WAAW,KAAM,SAAQ,IAAI,CAAC,wBAAwB,CAAC,OAAO,aAAa,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IACtG,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa;IACb,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,+CAA+C;IAC/C,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAC1D,gCAAgC;IAChC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gCAAgC;IAChC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8BAA8B;IAC9B,QAAQ,EAAE,YAAY,CAAC,kBAAkB,CAAC,GAAG,YAAY,CAAC,kBAAkB,CAAC,EAAE,CAAC;IAChF,0DAA0D;IAC1D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+CAA+C;IAC/C,oBAAoB,CAAC,EAAE,SAAS,CAAC;IACjC,sDAAsD;IACtD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;iEAC6D;IAC7D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;mFAC+E;IAC/E,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,6EAA6E;IAC7E,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,wEAAwE;IACxE,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACvC,qEAAqE;IACrE,mBAAmB,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAC/C,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;;AAgoBD,wBAAsC"}
|
|
@@ -341,6 +341,7 @@ const MultiSelectField = /*#__PURE__*/ forwardRef((_0, _1)=>{
|
|
|
341
341
|
let visibleCount = 0;
|
|
342
342
|
for(let i = 0; i < selectedItems.length; i++){
|
|
343
343
|
const item = selectedItems[i];
|
|
344
|
+
if (null == item) break;
|
|
344
345
|
const tempTag = createStyledTag(String(item.props.label));
|
|
345
346
|
tempContainer.appendChild(tempTag);
|
|
346
347
|
const tagWidth = tempTag.offsetWidth + 8;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiSelectField/MultiSelectField.js","sources":["../../src/MultiSelectField/MultiSelectField.tsx"],"sourcesContent":["import {\n ComponentPropsWithoutRef, ReactNode, ReactElement,\n ChangeEvent, MouseEvent, KeyboardEvent,\n useCallback, useEffect, useMemo, useRef, useState, Children, isValidElement, memo,\n Fragment, RefObject,\n forwardRef,\n} from 'react';\nimport classnames from 'clsx';\nimport DismissGhostMid from '@finam/web-ui-kit-icons/Dismiss/DismissGhostMid';\nimport DismissIcon from '@finam/web-ui-kit-icons/Dismiss/DismissCircleSmallColored';\nimport { tag as tagClassNames } from '@finam/web-ui-kit-core/styles/tag';\nimport FieldHint from '../FieldHint/index.js';\nimport { useModalState } from '../ModalsProvider/index.js';\nimport DropDownMenu, { DropDownMenuProps } from '../DropDownMenu/index.js';\nimport type { Origin } from '../Popover/index.js';\nimport { Placement, InputVariant, InputSize, KeyboardEventKey } from '../types.js';\nimport type { MenuItemProps } from '../MenuItem/index.js';\nimport type { TypographyProps } from '../Typography/index.js';\nimport { triggerChangeEvent } from '../utils/event.js';\nimport { setRef, useForkRef } from '../utils/withForwardedRef.js';\nimport { useIsomorphicEffect } from '../utils/useIsomorphicEffect.js';\nimport {\n Root,\n PrimarySelect,\n OutlineSelect,\n TextSelect,\n IconUp,\n IconDown,\n Icon,\n LockIcon, HiddenInput,\n DisplayValue,\n Adornment,\n SecondaryLabel,\n Border,\n Container,\n IconLeft,\n} from '../Select/SelectField.styles.js';\nimport { styles } from './MultiSelectField.styles.js';\nimport { getMenuSize, getDisplayValueVariant, getSecondaryLabelVariant } from '../Select/utils.js';\nimport { CheckboxFieldProps } from '../CheckboxField/index.js';\nimport Tag from '../Tag/Tag.js';\nimport MenuItem from '../MenuItem/index.js';\nimport LoaderDots from '../LoaderDots/LoaderDots.js';\n\ntype Locale = 'ru' | 'en';\ntype FocusedItemValue = string | number | undefined;\n\nexport interface Props extends Omit<ComponentPropsWithoutRef<typeof PrimarySelect>, 'type' | 'onChange'> {\n /** from HTMLInputElement */\n name?: string;\n /** Локаль */\n locale: Locale;\n /** Состояние значения выпадающего списка */\n value?: string | string[];\n /** Отображаемое значение выпадающего списка */\n displayValue?: ReactNode;\n /** from HTMLInputElement */\n onChange?: (event: ChangeEvent<HTMLInputElement>) => void;\n /** Текст сообщения подсказки */\n message?: ReactNode;\n /** Текст побочного label выпадающего списка */\n secondaryLabel?: string;\n /** Текст метки-заполнителя */\n placeholder?: string;\n /** Иконка, размещающаяся в блоке отображаемого значения */\n icon?: ReactNode;\n /** Иконка, размещающаяся слева от блока отображаемого значения */\n iconLeft?: ReactNode;\n /** Вариант отображения выпадающего списка */\n variant?: InputVariant;\n /** Флаг неактивного состояния выпадающего списка */\n disabled?: boolean;\n /** Флаг доступности выпадающего списка только для чтения */\n readOnly?: boolean;\n /** Растяжение компонента по ширине контейнера */\n fullWidth?: boolean;\n /** Размер выпадающего списка */\n size?: InputSize;\n /** Сообщение об ошибке */\n errorText?: string;\n /** Отображение иконки, если есть ошибка */\n errorIcon?: boolean;\n /** Пункты выпадающего меню */\n children: ReactElement<CheckboxFieldProps> | ReactElement<CheckboxFieldProps>[];\n /** Скрывать блок подсказки, если `message` отсутствует */\n hideEmptyHint?: boolean;\n /** Флаг отображения подсказки в виде всплывающего окна */\n hintTooltip?: boolean;\n /** Расположение всплывающего окна подсказки */\n hintTooltipPlacement?: Placement;\n /** Максимальная ширина всплывающего окна подсказки */\n hintTooltipMaxWidth?: number;\n /** Флаг, отключающий расширение блока выпадающего списка,\n * если содержимое пунктов меню не вмещается в данный блок */\n disableMenuGrow?: boolean;\n /** Флаг, отключающий раскрытие выпадающего списка в случае,\n * если значение не задано и количество пунктов меню меньше или равно одному */\n disableOneItemDropDown?: boolean;\n /** Флаг, отключающий закрытие выпадающего списка после выбора пункта меню */\n disableCloseOnItemClick?: boolean;\n /** Дополнительные свойства для компонента обертки выпадающего списка */\n MenuProps?: Partial<DropDownMenuProps>;\n /** Дополнительные свойства для побочного label выпадающего списка */\n SecondaryLabelProps?: Partial<TypographyProps>;\n /** Флаг, показывающий LoaderDots в выпадающем списке */\n loading?: boolean;\n}\n\nconst selectVariant = (variant?: InputVariant) => {\n switch (variant) {\n case 'primary': {\n return PrimarySelect;\n }\n case 'outline': {\n return OutlineSelect;\n }\n case 'ghost': {\n return TextSelect;\n }\n default:\n return PrimarySelect;\n }\n};\n\nconst moreTextTranslations: Record<Locale, string> = {\n ru: 'Еще',\n en: 'More',\n};\n\nconst anchorOrigin: Origin = { vertical: 'bottom', horizontal: 'left' };\nconst transformOrigin: Origin = { vertical: -8, horizontal: 'left' };\n\nconst defaultMenuProps: Props['MenuProps'] = {};\nconst defaultSecondaryLabelProps: Props['SecondaryLabelProps'] = {};\n\nconst MultiSelectField = forwardRef<HTMLButtonElement, Props>(({\n variant = 'primary',\n fullWidth = true,\n size = 'l',\n locale,\n name,\n value: valueProp,\n displayValue: displayValueProp,\n message,\n secondaryLabel,\n icon,\n iconLeft,\n errorText,\n errorIcon,\n disabled,\n readOnly,\n className,\n children,\n placeholder,\n onChange,\n onClick,\n onKeyDown,\n onMouseDown,\n hideEmptyHint,\n hintTooltip = size !== 'l',\n hintTooltipPlacement,\n hintTooltipMaxWidth,\n disableMenuGrow = false,\n disableOneItemDropDown,\n disableCloseOnItemClick = true,\n MenuProps = defaultMenuProps,\n SecondaryLabelProps = defaultSecondaryLabelProps,\n loading,\n ...buttonProps\n}, forwardedRef) => {\n const paperRef = useRef<HTMLDivElement | null>(null);\n const hiddenInputRef = useRef<HTMLInputElement | null>(null);\n const itemsCountRef = useRef(Children.count(children));\n const focusedItemValueRef = useRef<FocusedItemValue>(undefined);\n const tagsContainerRef = useRef<HTMLDivElement | null>(null);\n const selectRef = useRef<HTMLButtonElement | null>(null);\n const forkedRef = useForkRef(selectRef, forwardedRef);\n\n const { open: initialOpen } = useModalState(MenuProps.id);\n const [open, setOpen] = useState(initialOpen ?? false);\n const [menuMinWidth, setMenuMinWidth] = useState(0);\n const [focusedIndex, setFocusedIndex] = useState(-1);\n const [visibleTagsCount, setVisibleTagsCount] = useState<number | null>(null);\n\n const [value, valueArray] = useMemo(() => {\n if (Array.isArray(valueProp)) {\n return [valueProp.join(','), valueProp];\n }\n\n return [valueProp, valueProp?.split(',')];\n }, [valueProp]);\n\n useEffect(() => {\n if (hiddenInputRef.current && hiddenInputRef.current.value !== value) {\n hiddenInputRef.current.value = value || '';\n }\n }, [value]);\n\n useEffect(() => {\n if (focusedIndex >= itemsCountRef.current) {\n setFocusedIndex(-1);\n }\n }, [focusedIndex, open]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n setFocusedIndex(-1);\n }, []);\n\n const getResultValue = useCallback(\n (itemValue: string | number | undefined) => {\n if (itemValue === '') {\n return '';\n }\n\n let resultValue = itemValue;\n\n if (valueArray?.length && itemValue != null) {\n if (valueArray.includes(String(itemValue))) {\n const index = valueArray.indexOf(String(itemValue));\n\n if (index !== -1) {\n valueArray.splice(index, 1);\n resultValue = valueArray.join(',');\n }\n } else if (value) {\n resultValue = `${value},${itemValue}`;\n }\n }\n\n return resultValue;\n },\n [value, valueArray],\n );\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n const target = event.target as HTMLElement;\n const isTag = target.closest('svg');\n\n if (isTag) {\n return;\n }\n\n setOpen(true);\n setMenuMinWidth(selectRef.current?.clientWidth || 0);\n onClick?.(event);\n },\n [onClick],\n );\n\n const handleItemClick = useCallback(\n (itemProps: MenuItemProps) => (event: MouseEvent<HTMLLIElement>) => {\n if (readOnly) {\n return;\n }\n\n if (!disableCloseOnItemClick) {\n handleClose();\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n itemProps.onClick?.(event);\n\n if (onChange && hiddenInputRef.current) {\n triggerChangeEvent(hiddenInputRef.current, getResultValue(itemProps.value));\n }\n },\n [disableCloseOnItemClick, onChange, handleClose, getResultValue, readOnly],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n if (event.defaultPrevented || !open) {\n return;\n }\n\n switch (event.key) {\n case KeyboardEventKey.ARROW_UP:\n case KeyboardEventKey.UP:\n event.preventDefault();\n setFocusedIndex(prevIndex => (prevIndex > 0 ? prevIndex - 1 : itemsCountRef.current - 1));\n break;\n case KeyboardEventKey.ARROW_DOWN:\n case KeyboardEventKey.DOWN:\n event.preventDefault();\n setFocusedIndex(prevIndex => (prevIndex < itemsCountRef.current - 1 ? prevIndex + 1 : 0));\n break;\n case KeyboardEventKey.ENTER:\n case KeyboardEventKey.SPACE:\n if (focusedItemValueRef.current != null) {\n event.preventDefault();\n\n if (onChange && hiddenInputRef.current) {\n triggerChangeEvent(\n hiddenInputRef.current,\n getResultValue(focusedItemValueRef.current),\n );\n }\n }\n break;\n case KeyboardEventKey.ESCAPE:\n case KeyboardEventKey.ESC:\n event.preventDefault();\n handleClose();\n break;\n case KeyboardEventKey.DELETE:\n case KeyboardEventKey.DEL:\n case KeyboardEventKey.BACKSPACE:\n break;\n }\n },\n [open, onChange, getResultValue, handleClose],\n );\n\n const handleSelectKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>) => {\n if (readOnly) {\n return;\n }\n\n onKeyDown?.(event);\n handleKeyDown(event);\n },\n [readOnly, onKeyDown, handleKeyDown],\n );\n\n const handleDropDownKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (readOnly) {\n return;\n }\n\n MenuProps.onKeyDown?.(event);\n handleKeyDown(event);\n },\n [MenuProps, handleKeyDown, readOnly],\n );\n\n const handleTagIconClick = useCallback(\n (tagValue: string) => {\n if (readOnly) {\n return;\n }\n\n const resultValue = getResultValue(tagValue ?? '');\n\n if (hiddenInputRef.current != null) {\n triggerChangeEvent(hiddenInputRef.current, resultValue);\n }\n },\n [getResultValue, readOnly],\n );\n\n const handleClearAll = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n if (hiddenInputRef.current != null) {\n triggerChangeEvent(hiddenInputRef.current, '');\n }\n },\n [],\n );\n\n const handlePaperRef = useCallback(\n (el: HTMLDivElement) => {\n setRef(paperRef, el);\n\n if (MenuProps.PaperProps?.ref) {\n setRef(MenuProps.PaperProps.ref, el);\n }\n },\n [MenuProps.PaperProps?.ref],\n );\n\n const { items, checkedExists } = useMemo(() => {\n focusedItemValueRef.current = undefined;\n let itemIndex = 0;\n let checkedExist = false;\n\n const resultItems = Children.map(children, (child) => {\n if (!isValidElement<MenuItemProps>(child)) {\n return null;\n }\n\n const val: string | number | undefined = child.props.value;\n\n const childValue = child.props.value;\n const selected = val != null\n ? (valueArray?.length ? valueArray.includes(String(val)) : false)\n : false;\n\n const isFocused = child.props.focused == null && !child.props.disabled\n ? focusedIndex === itemIndex\n : child.props.focused;\n\n const childProps = {\n ...child.props,\n label: child.props.label,\n disabled: child.props.disabled,\n size,\n selected,\n paperRef,\n checked: Boolean(selected),\n 'data-value': val,\n style: { pointerEvents: 'none' },\n };\n\n if (childProps.selected) {\n checkedExist = true;\n }\n\n if (open && isFocused) {\n focusedItemValueRef.current = childValue;\n }\n\n if (!childProps.disabled) {\n itemIndex += 1;\n }\n\n return {\n type: child.type,\n props: {\n ...childProps,\n },\n focused: isFocused,\n onClick: childProps.disabled ? undefined : handleItemClick({\n value: childProps.value,\n onClick: child.props.onClick,\n }),\n };\n });\n\n itemsCountRef.current = itemIndex;\n\n return {\n items: resultItems,\n checkedExists: checkedExist,\n };\n }, [children, valueArray, size, handleItemClick, focusedIndex, open]);\n\n const handleClearHiddenTags = useCallback(() => {\n if (readOnly) {\n return;\n }\n const selectedItems = items.filter(item => item.props.selected);\n const visibleItems = selectedItems.slice(0, visibleTagsCount || 0);\n\n const newValue = visibleItems.map(item => item.props.value).join(',');\n\n if (hiddenInputRef.current != null) {\n triggerChangeEvent(hiddenInputRef.current, newValue);\n }\n }, [items, visibleTagsCount, readOnly]);\n\n const moreText = useMemo(() => {\n return moreTextTranslations[locale] ?? '';\n }, [locale]);\n\n const measureTagsWidth = useCallback(() => {\n if (!tagsContainerRef.current || !selectRef.current) {\n return;\n }\n\n const selectedItems = items.filter(item => item.props.selected);\n\n if (selectedItems.length === 0) {\n setVisibleTagsCount(null);\n\n return;\n }\n\n const containerWidth = tagsContainerRef.current.offsetWidth;\n const adornmentElement = selectRef.current.querySelector('[data-testid=\"multiselect-adornment\"]');\n const adornmentWidth = adornmentElement ? adornmentElement.getBoundingClientRect().width : 60;\n // Небольшой запас, чтобы теги не прилипали к иконкам\n const safetyMargin = 64;\n const availableWidth = containerWidth - adornmentWidth - safetyMargin;\n\n const createStyledTag = (text: string): HTMLSpanElement => {\n const tag = document.createElement('span');\n\n const classes = tagClassNames({ size, variant: 'fill', color: 'info', priority: 'low' }).split(' ');\n\n tag.classList.add(...classes);\n tag.textContent = text;\n\n return tag;\n };\n\n const tempContainer = document.createElement('div');\n tempContainer.style.position = 'absolute';\n tempContainer.style.visibility = 'hidden';\n tempContainer.style.whiteSpace = 'nowrap';\n document.body.appendChild(tempContainer);\n\n try {\n const moreTag = createStyledTag(`${moreText} ${selectedItems.length}`);\n tempContainer.appendChild(moreTag);\n const moreTagWidth = moreTag.offsetWidth + 8;\n moreTag.remove();\n\n let totalWidth = 0;\n let visibleCount = 0;\n\n for (let i = 0; i < selectedItems.length; i++) {\n const item = selectedItems[i];\n const tempTag = createStyledTag(String(item.props.label));\n tempContainer.appendChild(tempTag);\n\n const tagWidth = tempTag.offsetWidth + 8;\n\n const hasMoreItems = i < selectedItems.length - 1;\n const requiredWidth = totalWidth + tagWidth + (hasMoreItems ? moreTagWidth : 0);\n\n if (requiredWidth <= availableWidth) {\n totalWidth += tagWidth;\n visibleCount++;\n } else {\n break;\n }\n }\n\n const newVisibleCount = selectedItems.length > 0 ? Math.max(1, visibleCount) : null;\n setVisibleTagsCount(newVisibleCount);\n } finally {\n tempContainer.remove();\n }\n }, [items, moreText, size]);\n\n useIsomorphicEffect(() => {\n if (checkedExists) {\n measureTagsWidth();\n }\n }, [checkedExists, measureTagsWidth]);\n\n useIsomorphicEffect(() => {\n const resizeObserver = new ResizeObserver(() => {\n if (checkedExists) {\n measureTagsWidth();\n }\n });\n\n if (tagsContainerRef.current) {\n resizeObserver.observe(tagsContainerRef.current);\n }\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [checkedExists, measureTagsWidth]);\n\n const PaperProps = useMemo(\n () => ({\n ...MenuProps.PaperProps,\n ref: handlePaperRef,\n style: {\n minWidth: disableMenuGrow ? undefined : menuMinWidth,\n width: disableMenuGrow ? menuMinWidth : undefined,\n ...(MenuProps.PaperProps?.style || null),\n },\n }),\n [MenuProps.PaperProps, handlePaperRef, menuMinWidth, disableMenuGrow],\n );\n\n const SelectElement = selectVariant(variant);\n const withLabel = Boolean(\n placeholder && size !== 's' && size !== 'xs',\n );\n const dropDownHidden = disableOneItemDropDown && items.length <= 1;\n\n const rootClassName = classnames(className, size, {\n error: Boolean(errorText),\n disabled,\n opened: open,\n selected: Array.isArray(valueProp) && !!value,\n fullWidth,\n disableTextOverflow: true,\n });\n\n const DisplayValueWrapper = iconLeft && withLabel ? Container : Fragment;\n\n const displayValue = useMemo(() => {\n if (!checkedExists) {\n return placeholder;\n }\n\n const selectedItems = items.filter(item => item.props.selected);\n const visibleItems = selectedItems.slice(0, visibleTagsCount || selectedItems.length);\n const hiddenItems = selectedItems.slice(visibleTagsCount || selectedItems.length);\n\n const tags = visibleItems.map(item => (\n <Tag\n key={item.props.value}\n size={size}\n priority=\"low\"\n variant=\"fill\"\n color=\"info\"\n icon={<DismissGhostMid />}\n className={styles.tag}\n iconPlacement=\"right\"\n onIconClick={readOnly ? undefined : () => handleTagIconClick(String(item.props.value))}\n >\n {item.props.label}\n </Tag>\n ));\n\n if (hiddenItems.length > 0 && visibleTagsCount && visibleTagsCount < selectedItems.length) {\n tags.push(\n <Tag\n key=\"more-tag\"\n size={size}\n priority=\"low\"\n variant=\"fill\"\n color=\"info\"\n icon={<DismissGhostMid />}\n className={styles.tag}\n iconPlacement=\"right\"\n onIconClick={readOnly ? undefined : handleClearHiddenTags}\n >\n {`${moreText} ${hiddenItems.length}`}\n </Tag>,\n );\n }\n\n return tags;\n }, [checkedExists, placeholder, items, size, handleTagIconClick, visibleTagsCount, handleClearHiddenTags, readOnly, moreText]);\n\n return (\n <Root className={rootClassName}>\n <FieldHint\n variant={hintTooltip ? 'tooltip' : 'static'}\n size={size}\n message={!open || !hintTooltip ? errorText || message : undefined}\n disabled={disabled}\n error={Boolean(errorText)}\n errorIcon={errorIcon}\n hideEmpty={hideEmptyHint}\n tooltipPlacement={hintTooltipPlacement}\n tooltipMaxWidth={hintTooltipMaxWidth}\n >\n <SelectElement\n type=\"button\"\n {...buttonProps}\n ref={forkedRef}\n disabled={disabled}\n className={classnames({ dropDownHidden, readOnly })}\n onClick={disabled || readOnly || dropDownHidden ? undefined : handleClick}\n onKeyDown={handleSelectKeyDown}\n >\n {iconLeft && (\n <IconLeft className=\"ui-select-field_icon-left\">{iconLeft}</IconLeft>\n )}\n <DisplayValueWrapper>\n <DisplayValue\n ref={tagsContainerRef}\n className=\"ui-select-field__value\"\n variant={getDisplayValueVariant(size)}\n color={disabled ? 'disabled' : undefined}\n >\n {displayValue}\n </DisplayValue>\n </DisplayValueWrapper>\n <Adornment className=\"ui-select-field__adornment\" data-testid=\"multiselect-adornment\">\n {(secondaryLabel || icon) && (\n <>\n {secondaryLabel && (\n <SecondaryLabel color=\"custom\" variant={getSecondaryLabelVariant(size)} {...SecondaryLabelProps}>\n {secondaryLabel}\n </SecondaryLabel>\n )}\n {icon && <Icon className=\"ui-select-field__icon\">{icon}</Icon>}\n </>\n )}\n {checkedExists && !readOnly\n ? (\n <Icon\n className=\"ui-select-field__icon\"\n onClick={handleClearAll}\n >\n <DismissIcon />\n </Icon>\n )\n : null}\n {readOnly ? (\n <LockIcon />\n ) : open ? (\n <IconUp />\n ) : (\n <IconDown />\n )}\n </Adornment>\n <Border className=\"ui-select__border\" />\n </SelectElement>\n </FieldHint>\n <DropDownMenu\n anchorEl={selectRef.current || undefined}\n open={open}\n anchorOrigin={anchorOrigin}\n transformOrigin={transformOrigin}\n onClose={handleClose}\n size={getMenuSize(size)}\n {...MenuProps}\n onKeyDown={handleDropDownKeyDown}\n PaperProps={PaperProps}\n >\n {loading\n ? <LoaderDots className={styles.loaderDots} size={size} />\n : (\n items.map(item => (\n <MenuItem\n key={item.props.value}\n onClick={item.onClick}\n focused={item.focused}\n disabled={item.props.disabled}\n paperRef={paperRef.current ? paperRef as RefObject<HTMLElement> : undefined}\n value={item.props.value}\n >\n <item.type\n key={item.props.value}\n {...item.props}\n />\n </MenuItem>\n ))\n )}\n </DropDownMenu>\n <HiddenInput\n type=\"text\"\n name={name}\n // We don't want use autoComplete in hidden input\n // Use set manually\n autoComplete=\"off\"\n onChange={onChange}\n ref={hiddenInputRef}\n />\n </Root>\n );\n});\n\nexport default memo(MultiSelectField);\n"],"names":["selectVariant","variant","PrimarySelect","OutlineSelect","TextSelect","moreTextTranslations","anchorOrigin","transformOrigin","defaultMenuProps","defaultSecondaryLabelProps","MultiSelectField","forwardRef","fullWidth","size","locale","name","valueProp","displayValueProp","message","secondaryLabel","icon","iconLeft","errorText","errorIcon","disabled","readOnly","className","children","placeholder","onChange","onClick","onKeyDown","onMouseDown","hideEmptyHint","hintTooltip","hintTooltipPlacement","hintTooltipMaxWidth","disableMenuGrow","disableOneItemDropDown","disableCloseOnItemClick","MenuProps","SecondaryLabelProps","loading","buttonProps","forwardedRef","_MenuProps_PaperProps","paperRef","useRef","hiddenInputRef","itemsCountRef","Children","focusedItemValueRef","undefined","tagsContainerRef","selectRef","forkedRef","useForkRef","initialOpen","useModalState","open","setOpen","useState","menuMinWidth","setMenuMinWidth","focusedIndex","setFocusedIndex","visibleTagsCount","setVisibleTagsCount","value","valueArray","useMemo","Array","useEffect","handleClose","useCallback","getResultValue","itemValue","resultValue","String","index","handleClick","event","_selectRef_current","target","isTag","handleItemClick","itemProps","triggerChangeEvent","handleKeyDown","KeyboardEventKey","prevIndex","handleSelectKeyDown","handleDropDownKeyDown","handleTagIconClick","tagValue","handleClearAll","e","handlePaperRef","el","setRef","items","checkedExists","itemIndex","checkedExist","resultItems","child","isValidElement","val","childValue","selected","isFocused","childProps","Boolean","handleClearHiddenTags","selectedItems","item","visibleItems","newValue","moreText","_moreTextTranslations_locale","measureTagsWidth","containerWidth","adornmentElement","adornmentWidth","safetyMargin","availableWidth","createStyledTag","text","tag","document","classes","tagClassNames","tempContainer","moreTag","moreTagWidth","totalWidth","visibleCount","i","tempTag","tagWidth","hasMoreItems","requiredWidth","newVisibleCount","Math","useIsomorphicEffect","resizeObserver","ResizeObserver","PaperProps","SelectElement","withLabel","dropDownHidden","rootClassName","classnames","DisplayValueWrapper","Container","Fragment","displayValue","hiddenItems","tags","Tag","DismissGhostMid","styles","Root","FieldHint","IconLeft","DisplayValue","getDisplayValueVariant","Adornment","SecondaryLabel","getSecondaryLabelVariant","Icon","DismissIcon","LockIcon","IconUp","IconDown","Border","DropDownMenu","getMenuSize","LoaderDots","MenuItem","HiddenInput","memo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MultiSelectField/MultiSelectField.js","sources":["../../src/MultiSelectField/MultiSelectField.tsx"],"sourcesContent":["import {\n ComponentPropsWithoutRef, ReactNode, ReactElement,\n ChangeEvent, MouseEvent, KeyboardEvent,\n useCallback, useEffect, useMemo, useRef, useState, Children, isValidElement, memo,\n Fragment, RefObject,\n forwardRef,\n} from 'react';\nimport classnames from 'clsx';\nimport DismissGhostMid from '@finam/web-ui-kit-icons/Dismiss/DismissGhostMid';\nimport DismissIcon from '@finam/web-ui-kit-icons/Dismiss/DismissCircleSmallColored';\nimport { tag as tagClassNames } from '@finam/web-ui-kit-core/styles/tag';\nimport FieldHint from '../FieldHint/index.js';\nimport { useModalState } from '../ModalsProvider/index.js';\nimport DropDownMenu, { DropDownMenuProps } from '../DropDownMenu/index.js';\nimport type { Origin } from '../Popover/index.js';\nimport { Placement, InputVariant, InputSize, KeyboardEventKey } from '../types.js';\nimport type { MenuItemProps } from '../MenuItem/index.js';\nimport type { TypographyProps } from '../Typography/index.js';\nimport { triggerChangeEvent } from '../utils/event.js';\nimport { setRef, useForkRef } from '../utils/withForwardedRef.js';\nimport { useIsomorphicEffect } from '../utils/useIsomorphicEffect.js';\nimport {\n Root,\n PrimarySelect,\n OutlineSelect,\n TextSelect,\n IconUp,\n IconDown,\n Icon,\n LockIcon, HiddenInput,\n DisplayValue,\n Adornment,\n SecondaryLabel,\n Border,\n Container,\n IconLeft,\n} from '../Select/SelectField.styles.js';\nimport { styles } from './MultiSelectField.styles.js';\nimport { getMenuSize, getDisplayValueVariant, getSecondaryLabelVariant } from '../Select/utils.js';\nimport { CheckboxFieldProps } from '../CheckboxField/index.js';\nimport Tag from '../Tag/Tag.js';\nimport MenuItem from '../MenuItem/index.js';\nimport LoaderDots from '../LoaderDots/LoaderDots.js';\n\ntype Locale = 'ru' | 'en';\ntype FocusedItemValue = string | number | undefined;\n\nexport interface Props extends Omit<ComponentPropsWithoutRef<typeof PrimarySelect>, 'type' | 'onChange'> {\n /** from HTMLInputElement */\n name?: string;\n /** Локаль */\n locale: Locale;\n /** Состояние значения выпадающего списка */\n value?: string | string[];\n /** Отображаемое значение выпадающего списка */\n displayValue?: ReactNode;\n /** from HTMLInputElement */\n onChange?: (event: ChangeEvent<HTMLInputElement>) => void;\n /** Текст сообщения подсказки */\n message?: ReactNode;\n /** Текст побочного label выпадающего списка */\n secondaryLabel?: string;\n /** Текст метки-заполнителя */\n placeholder?: string;\n /** Иконка, размещающаяся в блоке отображаемого значения */\n icon?: ReactNode;\n /** Иконка, размещающаяся слева от блока отображаемого значения */\n iconLeft?: ReactNode;\n /** Вариант отображения выпадающего списка */\n variant?: InputVariant;\n /** Флаг неактивного состояния выпадающего списка */\n disabled?: boolean;\n /** Флаг доступности выпадающего списка только для чтения */\n readOnly?: boolean;\n /** Растяжение компонента по ширине контейнера */\n fullWidth?: boolean;\n /** Размер выпадающего списка */\n size?: InputSize;\n /** Сообщение об ошибке */\n errorText?: string;\n /** Отображение иконки, если есть ошибка */\n errorIcon?: boolean;\n /** Пункты выпадающего меню */\n children: ReactElement<CheckboxFieldProps> | ReactElement<CheckboxFieldProps>[];\n /** Скрывать блок подсказки, если `message` отсутствует */\n hideEmptyHint?: boolean;\n /** Флаг отображения подсказки в виде всплывающего окна */\n hintTooltip?: boolean;\n /** Расположение всплывающего окна подсказки */\n hintTooltipPlacement?: Placement;\n /** Максимальная ширина всплывающего окна подсказки */\n hintTooltipMaxWidth?: number;\n /** Флаг, отключающий расширение блока выпадающего списка,\n * если содержимое пунктов меню не вмещается в данный блок */\n disableMenuGrow?: boolean;\n /** Флаг, отключающий раскрытие выпадающего списка в случае,\n * если значение не задано и количество пунктов меню меньше или равно одному */\n disableOneItemDropDown?: boolean;\n /** Флаг, отключающий закрытие выпадающего списка после выбора пункта меню */\n disableCloseOnItemClick?: boolean;\n /** Дополнительные свойства для компонента обертки выпадающего списка */\n MenuProps?: Partial<DropDownMenuProps>;\n /** Дополнительные свойства для побочного label выпадающего списка */\n SecondaryLabelProps?: Partial<TypographyProps>;\n /** Флаг, показывающий LoaderDots в выпадающем списке */\n loading?: boolean;\n}\n\nconst selectVariant = (variant?: InputVariant) => {\n switch (variant) {\n case 'primary': {\n return PrimarySelect;\n }\n case 'outline': {\n return OutlineSelect;\n }\n case 'ghost': {\n return TextSelect;\n }\n default:\n return PrimarySelect;\n }\n};\n\nconst moreTextTranslations: Record<Locale, string> = {\n ru: 'Еще',\n en: 'More',\n};\n\nconst anchorOrigin: Origin = { vertical: 'bottom', horizontal: 'left' };\nconst transformOrigin: Origin = { vertical: -8, horizontal: 'left' };\n\nconst defaultMenuProps: Props['MenuProps'] = {};\nconst defaultSecondaryLabelProps: Props['SecondaryLabelProps'] = {};\n\nconst MultiSelectField = forwardRef<HTMLButtonElement, Props>(({\n variant = 'primary',\n fullWidth = true,\n size = 'l',\n locale,\n name,\n value: valueProp,\n displayValue: displayValueProp,\n message,\n secondaryLabel,\n icon,\n iconLeft,\n errorText,\n errorIcon,\n disabled,\n readOnly,\n className,\n children,\n placeholder,\n onChange,\n onClick,\n onKeyDown,\n onMouseDown,\n hideEmptyHint,\n hintTooltip = size !== 'l',\n hintTooltipPlacement,\n hintTooltipMaxWidth,\n disableMenuGrow = false,\n disableOneItemDropDown,\n disableCloseOnItemClick = true,\n MenuProps = defaultMenuProps,\n SecondaryLabelProps = defaultSecondaryLabelProps,\n loading,\n ...buttonProps\n}, forwardedRef) => {\n const paperRef = useRef<HTMLDivElement | null>(null);\n const hiddenInputRef = useRef<HTMLInputElement | null>(null);\n const itemsCountRef = useRef(Children.count(children));\n const focusedItemValueRef = useRef<FocusedItemValue>(undefined);\n const tagsContainerRef = useRef<HTMLDivElement | null>(null);\n const selectRef = useRef<HTMLButtonElement | null>(null);\n const forkedRef = useForkRef(selectRef, forwardedRef);\n\n const { open: initialOpen } = useModalState(MenuProps.id);\n const [open, setOpen] = useState(initialOpen ?? false);\n const [menuMinWidth, setMenuMinWidth] = useState(0);\n const [focusedIndex, setFocusedIndex] = useState(-1);\n const [visibleTagsCount, setVisibleTagsCount] = useState<number | null>(null);\n\n const [value, valueArray] = useMemo(() => {\n if (Array.isArray(valueProp)) {\n return [valueProp.join(','), valueProp];\n }\n\n return [valueProp, valueProp?.split(',')];\n }, [valueProp]);\n\n useEffect(() => {\n if (hiddenInputRef.current && hiddenInputRef.current.value !== value) {\n hiddenInputRef.current.value = value || '';\n }\n }, [value]);\n\n useEffect(() => {\n if (focusedIndex >= itemsCountRef.current) {\n setFocusedIndex(-1);\n }\n }, [focusedIndex, open]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n setFocusedIndex(-1);\n }, []);\n\n const getResultValue = useCallback(\n (itemValue: string | number | undefined) => {\n if (itemValue === '') {\n return '';\n }\n\n let resultValue = itemValue;\n\n if (valueArray?.length && itemValue != null) {\n if (valueArray.includes(String(itemValue))) {\n const index = valueArray.indexOf(String(itemValue));\n\n if (index !== -1) {\n valueArray.splice(index, 1);\n resultValue = valueArray.join(',');\n }\n } else if (value) {\n resultValue = `${value},${itemValue}`;\n }\n }\n\n return resultValue;\n },\n [value, valueArray],\n );\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n const target = event.target as HTMLElement;\n const isTag = target.closest('svg');\n\n if (isTag) {\n return;\n }\n\n setOpen(true);\n setMenuMinWidth(selectRef.current?.clientWidth || 0);\n onClick?.(event);\n },\n [onClick],\n );\n\n const handleItemClick = useCallback(\n (itemProps: MenuItemProps) => (event: MouseEvent<HTMLLIElement>) => {\n if (readOnly) {\n return;\n }\n\n if (!disableCloseOnItemClick) {\n handleClose();\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n itemProps.onClick?.(event);\n\n if (onChange && hiddenInputRef.current) {\n triggerChangeEvent(hiddenInputRef.current, getResultValue(itemProps.value));\n }\n },\n [disableCloseOnItemClick, onChange, handleClose, getResultValue, readOnly],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n if (event.defaultPrevented || !open) {\n return;\n }\n\n switch (event.key) {\n case KeyboardEventKey.ARROW_UP:\n case KeyboardEventKey.UP:\n event.preventDefault();\n setFocusedIndex(prevIndex => (prevIndex > 0 ? prevIndex - 1 : itemsCountRef.current - 1));\n break;\n case KeyboardEventKey.ARROW_DOWN:\n case KeyboardEventKey.DOWN:\n event.preventDefault();\n setFocusedIndex(prevIndex => (prevIndex < itemsCountRef.current - 1 ? prevIndex + 1 : 0));\n break;\n case KeyboardEventKey.ENTER:\n case KeyboardEventKey.SPACE:\n if (focusedItemValueRef.current != null) {\n event.preventDefault();\n\n if (onChange && hiddenInputRef.current) {\n triggerChangeEvent(\n hiddenInputRef.current,\n getResultValue(focusedItemValueRef.current),\n );\n }\n }\n break;\n case KeyboardEventKey.ESCAPE:\n case KeyboardEventKey.ESC:\n event.preventDefault();\n handleClose();\n break;\n case KeyboardEventKey.DELETE:\n case KeyboardEventKey.DEL:\n case KeyboardEventKey.BACKSPACE:\n break;\n }\n },\n [open, onChange, getResultValue, handleClose],\n );\n\n const handleSelectKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>) => {\n if (readOnly) {\n return;\n }\n\n onKeyDown?.(event);\n handleKeyDown(event);\n },\n [readOnly, onKeyDown, handleKeyDown],\n );\n\n const handleDropDownKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (readOnly) {\n return;\n }\n\n MenuProps.onKeyDown?.(event);\n handleKeyDown(event);\n },\n [MenuProps, handleKeyDown, readOnly],\n );\n\n const handleTagIconClick = useCallback(\n (tagValue: string) => {\n if (readOnly) {\n return;\n }\n\n const resultValue = getResultValue(tagValue ?? '');\n\n if (hiddenInputRef.current != null) {\n triggerChangeEvent(hiddenInputRef.current, resultValue);\n }\n },\n [getResultValue, readOnly],\n );\n\n const handleClearAll = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n if (hiddenInputRef.current != null) {\n triggerChangeEvent(hiddenInputRef.current, '');\n }\n },\n [],\n );\n\n const handlePaperRef = useCallback(\n (el: HTMLDivElement) => {\n setRef(paperRef, el);\n\n if (MenuProps.PaperProps?.ref) {\n setRef(MenuProps.PaperProps.ref, el);\n }\n },\n [MenuProps.PaperProps?.ref],\n );\n\n const { items, checkedExists } = useMemo(() => {\n focusedItemValueRef.current = undefined;\n let itemIndex = 0;\n let checkedExist = false;\n\n const resultItems = Children.map(children, (child) => {\n if (!isValidElement<MenuItemProps>(child)) {\n return null;\n }\n\n const val: string | number | undefined = child.props.value;\n\n const childValue = child.props.value;\n const selected = val != null\n ? (valueArray?.length ? valueArray.includes(String(val)) : false)\n : false;\n\n const isFocused = child.props.focused == null && !child.props.disabled\n ? focusedIndex === itemIndex\n : child.props.focused;\n\n const childProps = {\n ...child.props,\n label: child.props.label,\n disabled: child.props.disabled,\n size,\n selected,\n paperRef,\n checked: Boolean(selected),\n 'data-value': val,\n style: { pointerEvents: 'none' },\n };\n\n if (childProps.selected) {\n checkedExist = true;\n }\n\n if (open && isFocused) {\n focusedItemValueRef.current = childValue;\n }\n\n if (!childProps.disabled) {\n itemIndex += 1;\n }\n\n return {\n type: child.type,\n props: {\n ...childProps,\n },\n focused: isFocused,\n onClick: childProps.disabled ? undefined : handleItemClick({\n value: childProps.value,\n onClick: child.props.onClick,\n }),\n };\n });\n\n itemsCountRef.current = itemIndex;\n\n return {\n items: resultItems,\n checkedExists: checkedExist,\n };\n }, [children, valueArray, size, handleItemClick, focusedIndex, open]);\n\n const handleClearHiddenTags = useCallback(() => {\n if (readOnly) {\n return;\n }\n const selectedItems = items.filter(item => item.props.selected);\n const visibleItems = selectedItems.slice(0, visibleTagsCount || 0);\n\n const newValue = visibleItems.map(item => item.props.value).join(',');\n\n if (hiddenInputRef.current != null) {\n triggerChangeEvent(hiddenInputRef.current, newValue);\n }\n }, [items, visibleTagsCount, readOnly]);\n\n const moreText = useMemo(() => {\n return moreTextTranslations[locale] ?? '';\n }, [locale]);\n\n const measureTagsWidth = useCallback(() => {\n if (!tagsContainerRef.current || !selectRef.current) {\n return;\n }\n\n const selectedItems = items.filter(item => item.props.selected);\n\n if (selectedItems.length === 0) {\n setVisibleTagsCount(null);\n\n return;\n }\n\n const containerWidth = tagsContainerRef.current.offsetWidth;\n const adornmentElement = selectRef.current.querySelector('[data-testid=\"multiselect-adornment\"]');\n const adornmentWidth = adornmentElement ? adornmentElement.getBoundingClientRect().width : 60;\n // Небольшой запас, чтобы теги не прилипали к иконкам\n const safetyMargin = 64;\n const availableWidth = containerWidth - adornmentWidth - safetyMargin;\n\n const createStyledTag = (text: string): HTMLSpanElement => {\n const tag = document.createElement('span');\n\n const classes = tagClassNames({ size, variant: 'fill', color: 'info', priority: 'low' }).split(' ');\n\n tag.classList.add(...classes);\n tag.textContent = text;\n\n return tag;\n };\n\n const tempContainer = document.createElement('div');\n tempContainer.style.position = 'absolute';\n tempContainer.style.visibility = 'hidden';\n tempContainer.style.whiteSpace = 'nowrap';\n document.body.appendChild(tempContainer);\n\n try {\n const moreTag = createStyledTag(`${moreText} ${selectedItems.length}`);\n tempContainer.appendChild(moreTag);\n const moreTagWidth = moreTag.offsetWidth + 8;\n moreTag.remove();\n\n let totalWidth = 0;\n let visibleCount = 0;\n\n for (let i = 0; i < selectedItems.length; i++) {\n const item = selectedItems[i];\n\n if (item == null) {\n break;\n }\n\n const tempTag = createStyledTag(String(item.props.label));\n tempContainer.appendChild(tempTag);\n\n const tagWidth = tempTag.offsetWidth + 8;\n\n const hasMoreItems = i < selectedItems.length - 1;\n const requiredWidth = totalWidth + tagWidth + (hasMoreItems ? moreTagWidth : 0);\n\n if (requiredWidth <= availableWidth) {\n totalWidth += tagWidth;\n visibleCount++;\n } else {\n break;\n }\n }\n\n const newVisibleCount = selectedItems.length > 0 ? Math.max(1, visibleCount) : null;\n setVisibleTagsCount(newVisibleCount);\n } finally {\n tempContainer.remove();\n }\n }, [items, moreText, size]);\n\n useIsomorphicEffect(() => {\n if (checkedExists) {\n measureTagsWidth();\n }\n }, [checkedExists, measureTagsWidth]);\n\n useIsomorphicEffect(() => {\n const resizeObserver = new ResizeObserver(() => {\n if (checkedExists) {\n measureTagsWidth();\n }\n });\n\n if (tagsContainerRef.current) {\n resizeObserver.observe(tagsContainerRef.current);\n }\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [checkedExists, measureTagsWidth]);\n\n const PaperProps = useMemo(\n () => ({\n ...MenuProps.PaperProps,\n ref: handlePaperRef,\n style: {\n minWidth: disableMenuGrow ? undefined : menuMinWidth,\n width: disableMenuGrow ? menuMinWidth : undefined,\n ...(MenuProps.PaperProps?.style || null),\n },\n }),\n [MenuProps.PaperProps, handlePaperRef, menuMinWidth, disableMenuGrow],\n );\n\n const SelectElement = selectVariant(variant);\n const withLabel = Boolean(\n placeholder && size !== 's' && size !== 'xs',\n );\n const dropDownHidden = disableOneItemDropDown && items.length <= 1;\n\n const rootClassName = classnames(className, size, {\n error: Boolean(errorText),\n disabled,\n opened: open,\n selected: Array.isArray(valueProp) && !!value,\n fullWidth,\n disableTextOverflow: true,\n });\n\n const DisplayValueWrapper = iconLeft && withLabel ? Container : Fragment;\n\n const displayValue = useMemo(() => {\n if (!checkedExists) {\n return placeholder;\n }\n\n const selectedItems = items.filter(item => item.props.selected);\n const visibleItems = selectedItems.slice(0, visibleTagsCount || selectedItems.length);\n const hiddenItems = selectedItems.slice(visibleTagsCount || selectedItems.length);\n\n const tags = visibleItems.map(item => (\n <Tag\n key={item.props.value}\n size={size}\n priority=\"low\"\n variant=\"fill\"\n color=\"info\"\n icon={<DismissGhostMid />}\n className={styles.tag}\n iconPlacement=\"right\"\n onIconClick={readOnly ? undefined : () => handleTagIconClick(String(item.props.value))}\n >\n {item.props.label}\n </Tag>\n ));\n\n if (hiddenItems.length > 0 && visibleTagsCount && visibleTagsCount < selectedItems.length) {\n tags.push(\n <Tag\n key=\"more-tag\"\n size={size}\n priority=\"low\"\n variant=\"fill\"\n color=\"info\"\n icon={<DismissGhostMid />}\n className={styles.tag}\n iconPlacement=\"right\"\n onIconClick={readOnly ? undefined : handleClearHiddenTags}\n >\n {`${moreText} ${hiddenItems.length}`}\n </Tag>,\n );\n }\n\n return tags;\n }, [checkedExists, placeholder, items, size, handleTagIconClick, visibleTagsCount, handleClearHiddenTags, readOnly, moreText]);\n\n return (\n <Root className={rootClassName}>\n <FieldHint\n variant={hintTooltip ? 'tooltip' : 'static'}\n size={size}\n message={!open || !hintTooltip ? errorText || message : undefined}\n disabled={disabled}\n error={Boolean(errorText)}\n errorIcon={errorIcon}\n hideEmpty={hideEmptyHint}\n tooltipPlacement={hintTooltipPlacement}\n tooltipMaxWidth={hintTooltipMaxWidth}\n >\n <SelectElement\n type=\"button\"\n {...buttonProps}\n ref={forkedRef}\n disabled={disabled}\n className={classnames({ dropDownHidden, readOnly })}\n onClick={disabled || readOnly || dropDownHidden ? undefined : handleClick}\n onKeyDown={handleSelectKeyDown}\n >\n {iconLeft && (\n <IconLeft className=\"ui-select-field_icon-left\">{iconLeft}</IconLeft>\n )}\n <DisplayValueWrapper>\n <DisplayValue\n ref={tagsContainerRef}\n className=\"ui-select-field__value\"\n variant={getDisplayValueVariant(size)}\n color={disabled ? 'disabled' : undefined}\n >\n {displayValue}\n </DisplayValue>\n </DisplayValueWrapper>\n <Adornment className=\"ui-select-field__adornment\" data-testid=\"multiselect-adornment\">\n {(secondaryLabel || icon) && (\n <>\n {secondaryLabel && (\n <SecondaryLabel color=\"custom\" variant={getSecondaryLabelVariant(size)} {...SecondaryLabelProps}>\n {secondaryLabel}\n </SecondaryLabel>\n )}\n {icon && <Icon className=\"ui-select-field__icon\">{icon}</Icon>}\n </>\n )}\n {checkedExists && !readOnly\n ? (\n <Icon\n className=\"ui-select-field__icon\"\n onClick={handleClearAll}\n >\n <DismissIcon />\n </Icon>\n )\n : null}\n {readOnly ? (\n <LockIcon />\n ) : open ? (\n <IconUp />\n ) : (\n <IconDown />\n )}\n </Adornment>\n <Border className=\"ui-select__border\" />\n </SelectElement>\n </FieldHint>\n <DropDownMenu\n anchorEl={selectRef.current || undefined}\n open={open}\n anchorOrigin={anchorOrigin}\n transformOrigin={transformOrigin}\n onClose={handleClose}\n size={getMenuSize(size)}\n {...MenuProps}\n onKeyDown={handleDropDownKeyDown}\n PaperProps={PaperProps}\n >\n {loading\n ? <LoaderDots className={styles.loaderDots} size={size} />\n : (\n items.map(item => (\n <MenuItem\n key={item.props.value}\n onClick={item.onClick}\n focused={item.focused}\n disabled={item.props.disabled}\n paperRef={paperRef.current ? paperRef as RefObject<HTMLElement> : undefined}\n value={item.props.value}\n >\n <item.type\n key={item.props.value}\n {...item.props}\n />\n </MenuItem>\n ))\n )}\n </DropDownMenu>\n <HiddenInput\n type=\"text\"\n name={name}\n // We don't want use autoComplete in hidden input\n // Use set manually\n autoComplete=\"off\"\n onChange={onChange}\n ref={hiddenInputRef}\n />\n </Root>\n );\n});\n\nexport default memo(MultiSelectField);\n"],"names":["selectVariant","variant","PrimarySelect","OutlineSelect","TextSelect","moreTextTranslations","anchorOrigin","transformOrigin","defaultMenuProps","defaultSecondaryLabelProps","MultiSelectField","forwardRef","fullWidth","size","locale","name","valueProp","displayValueProp","message","secondaryLabel","icon","iconLeft","errorText","errorIcon","disabled","readOnly","className","children","placeholder","onChange","onClick","onKeyDown","onMouseDown","hideEmptyHint","hintTooltip","hintTooltipPlacement","hintTooltipMaxWidth","disableMenuGrow","disableOneItemDropDown","disableCloseOnItemClick","MenuProps","SecondaryLabelProps","loading","buttonProps","forwardedRef","_MenuProps_PaperProps","paperRef","useRef","hiddenInputRef","itemsCountRef","Children","focusedItemValueRef","undefined","tagsContainerRef","selectRef","forkedRef","useForkRef","initialOpen","useModalState","open","setOpen","useState","menuMinWidth","setMenuMinWidth","focusedIndex","setFocusedIndex","visibleTagsCount","setVisibleTagsCount","value","valueArray","useMemo","Array","useEffect","handleClose","useCallback","getResultValue","itemValue","resultValue","String","index","handleClick","event","_selectRef_current","target","isTag","handleItemClick","itemProps","triggerChangeEvent","handleKeyDown","KeyboardEventKey","prevIndex","handleSelectKeyDown","handleDropDownKeyDown","handleTagIconClick","tagValue","handleClearAll","e","handlePaperRef","el","setRef","items","checkedExists","itemIndex","checkedExist","resultItems","child","isValidElement","val","childValue","selected","isFocused","childProps","Boolean","handleClearHiddenTags","selectedItems","item","visibleItems","newValue","moreText","_moreTextTranslations_locale","measureTagsWidth","containerWidth","adornmentElement","adornmentWidth","safetyMargin","availableWidth","createStyledTag","text","tag","document","classes","tagClassNames","tempContainer","moreTag","moreTagWidth","totalWidth","visibleCount","i","tempTag","tagWidth","hasMoreItems","requiredWidth","newVisibleCount","Math","useIsomorphicEffect","resizeObserver","ResizeObserver","PaperProps","SelectElement","withLabel","dropDownHidden","rootClassName","classnames","DisplayValueWrapper","Container","Fragment","displayValue","hiddenItems","tags","Tag","DismissGhostMid","styles","Root","FieldHint","IconLeft","DisplayValue","getDisplayValueVariant","Adornment","SecondaryLabel","getSecondaryLabelVariant","Icon","DismissIcon","LockIcon","IconUp","IconDown","Border","DropDownMenu","getMenuSize","LoaderDots","MenuItem","HiddenInput","memo"],"mappings":"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"}
|
|
@@ -90,6 +90,8 @@ const NumberTextField = /*#__PURE__*/ forwardRef((_0, _1)=>{
|
|
|
90
90
|
getMin
|
|
91
91
|
]);
|
|
92
92
|
const normalizeInputValue = useCallback((value)=>{
|
|
93
|
+
var _ref;
|
|
94
|
+
var _fractionParts_;
|
|
93
95
|
let formattedValue = (value || '').trim().replace(/[^\d.]/g, (str, index)=>{
|
|
94
96
|
if (',' === str) return '.';
|
|
95
97
|
if ('-' === str && 0 === index) return '-';
|
|
@@ -102,10 +104,10 @@ const NumberTextField = /*#__PURE__*/ forwardRef((_0, _1)=>{
|
|
|
102
104
|
formattedValue = formattedValue.replace('-', '');
|
|
103
105
|
parsedValue = parseFloat(formattedValue);
|
|
104
106
|
}
|
|
105
|
-
const [integerPart, ...fractionParts] = formattedValue.split('.');
|
|
107
|
+
const [integerPart = '', ...fractionParts] = formattedValue.split('.');
|
|
106
108
|
const dcpl = getDcpl(parsedValue);
|
|
107
109
|
const maxIntLength = getIntLength(parsedValue < 0 || formattedValue.startsWith('-') ? min : getMax(parsedValue), integerPart.length);
|
|
108
|
-
if ((null == fractionParts ? void 0 : fractionParts.length) && (fractionParts.length > 1 || fractionParts[0].length > dcpl)) formattedValue = `${integerPart.slice(0, maxIntLength)}.${fractionParts.join('').slice(0, dcpl)}`;
|
|
110
|
+
if ((null == fractionParts ? void 0 : fractionParts.length) && (fractionParts.length > 1 || (null != (_ref = null == (_fractionParts_ = fractionParts[0]) ? void 0 : _fractionParts_.length) ? _ref : 0) > dcpl)) formattedValue = `${integerPart.slice(0, maxIntLength)}.${fractionParts.join('').slice(0, dcpl)}`;
|
|
109
111
|
else if (integerPart) formattedValue = formattedValue.replace(integerPart, integerPart.slice(0, maxIntLength));
|
|
110
112
|
return formattedValue;
|
|
111
113
|
}, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberTextField/NumberTextField.js","sources":["../../src/NumberTextField/NumberTextField.tsx"],"sourcesContent":["import {\n memo,\n Ref,\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n FocusEvent,\n ChangeEvent,\n KeyboardEvent,\n MouseEvent,\n useState,\n} from 'react';\nimport classnames from 'clsx';\n\nimport Stepper from '../Stepper/index.js';\nimport TextField, { type TextFieldProps } from '../TextField/index.js';\nimport { triggerChangeEvent } from '../utils/event.js';\nimport { KeyboardEventKey } from '../types.js';\nimport {\n calculateFloatPrecision,\n lastCharIsFloatingSymbol,\n getIntLength,\n normalizeValueByStep,\n} from './utils.js';\nimport { setRef, useForkRef } from '../utils/withForwardedRef.js';\nimport { adornmentStepsStyles } from './NumberTextField.styles.js';\n\nconst MAX_VALUE_DEFAULT = 999999999999;\nconst MIN_VALUE_DEFAULT = -999999999999;\nconst MAX_INT_VALUE = 999999999999999;\nconst MIN_INT_VALUE = -999999999999999;\nexport const STEP_DEFAULT = 1;\n\nexport interface Props extends Omit<TextFieldProps, 'value' | 'step' | 'type'> {\n /** Состояние значения числового поля */\n value?: string | number;\n /** Минимально возможное значение числового поля */\n min?: number;\n /** Максимально возможное значение числового поля */\n max?: number;\n /** Шаг изменения значения числового поля */\n step?: number | ((nextValue: number) => number);\n /** Отображаемое количество цифр дробной части */\n dcpl?: number;\n /** Скрытие кнопок пошагового изменения значения числового поля */\n hideSteps?: boolean;\n /** ref для получения функции управления шагом по увеличению значения */\n upRef?: Ref<VoidFunction | undefined>;\n /** ref для получения функции управления шагом по уменьшению значения */\n downRef?: Ref<VoidFunction | undefined>;\n /** Отключение пошагового изменения на событие onWheel */\n disableOnWheel?: boolean;\n}\n\nconst NumberTextField = forwardRef<HTMLInputElement, Props>(({\n value: valueProp,\n min: minProp,\n max: maxProp,\n step: stepProp = STEP_DEFAULT,\n dcpl: dcplProp,\n hideSteps,\n disableOnWheel,\n upRef,\n downRef,\n size,\n ...textFieldProps\n}, forwardedRef) => {\n const {\n className,\n disabled,\n readOnly,\n onChange,\n onFocus,\n onBlur,\n onMouseEnter,\n onMouseLeave,\n onKeyDown,\n adornment: adornmentProp,\n } = textFieldProps;\n const [focused, setFocused] = useState<boolean>(false);\n const [hovered, setHovered] = useState<boolean>(false);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const forkedRef = useForkRef(inputRef, forwardedRef);\n\n const valueParsed = useMemo((): number | undefined => {\n if (typeof valueProp === 'string') {\n if (valueProp.trim() === '') {\n return undefined;\n }\n const numberValue = parseFloat(valueProp);\n if (!Number.isNaN(numberValue) && Number.isFinite(numberValue)) {\n return numberValue;\n }\n return 0;\n }\n return valueProp || 0;\n }, [valueProp]);\n const valueParsedRef = useRef<number | undefined>(valueParsed);\n valueParsedRef.current = valueParsed;\n\n const getStep = useCallback((value: number) => (\n typeof stepProp === 'number' ? stepProp : stepProp(value)\n ), [stepProp]);\n\n const getDcpl = useCallback((value: number) => {\n if (dcplProp != null && typeof stepProp === 'number') {\n return dcplProp;\n }\n\n return calculateFloatPrecision(getStep(value || 0));\n }, [dcplProp, stepProp, getStep]);\n\n const getMax = useCallback((value: number) => {\n const dcpl = getDcpl(value);\n if (maxProp == null || Number.isNaN(maxProp) || maxProp <= MIN_INT_VALUE) {\n return MAX_VALUE_DEFAULT / (10 ** dcpl);\n }\n return Math.min(maxProp, MAX_INT_VALUE / (10 ** dcpl));\n }, [getDcpl, maxProp]);\n\n const getMin = useCallback((value: number) => {\n const dcpl = getDcpl(value);\n if (minProp == null || Number.isNaN(minProp) || minProp >= MAX_INT_VALUE) {\n return MIN_VALUE_DEFAULT / (10 ** dcpl);\n }\n return Math.max(minProp, MIN_INT_VALUE / (10 ** dcpl));\n }, [getDcpl, minProp]);\n\n const filterMaxValue = useCallback((value: number) => {\n const max = getMax(value);\n return Math.min(value, max);\n }, [getMax]);\n\n const filterMinValue = useCallback((value: number) => {\n const min = getMin(value);\n return Math.max(value, min);\n }, [getMin]);\n\n const normalizeInputValue = useCallback((value: string) => {\n let formattedValue = (value || '').trim().replace(\n /[^\\d.]/g,\n (str, index) => {\n if (str === ',') return '.'; // нужно для работы цифровой клавиатуры на мобильных утройствах\n if (str === '-' && index === 0) return '-';\n return '';\n },\n ).replace(/\\.+/g, '.');\n let parsedValue = parseFloat(formattedValue);\n if (Number.isNaN(parsedValue)) {\n return formattedValue;\n }\n\n const min = getMin(parsedValue);\n if (min >= 0 && parsedValue < 0) {\n formattedValue = formattedValue.replace('-', '');\n parsedValue = parseFloat(formattedValue);\n }\n const [integerPart, ...fractionParts] = formattedValue.split('.');\n const dcpl = getDcpl(parsedValue);\n const maxIntLength = getIntLength(\n (parsedValue < 0 || formattedValue.startsWith('-'))\n ? min\n : getMax(parsedValue),\n integerPart.length,\n );\n\n if (\n fractionParts?.length &&\n (fractionParts.length > 1 || fractionParts[0].length > dcpl)\n ) {\n formattedValue = `${\n integerPart.slice(0, maxIntLength)\n }.${\n fractionParts.join('').slice(0, dcpl)\n }`;\n } else if (integerPart) {\n formattedValue = formattedValue.replace(\n integerPart,\n integerPart.slice(0, maxIntLength),\n );\n }\n return formattedValue;\n }, [getMin, getMax, getDcpl]);\n\n const fireChange = (value: string | number) => {\n if (inputRef.current) {\n triggerChangeEvent(inputRef.current, value);\n }\n };\n\n const stringValue = useMemo((): string => {\n if (typeof valueProp === 'number') {\n return valueProp.toFixed(getDcpl(valueProp));\n }\n\n if (valueProp == null) {\n return '';\n }\n\n return valueProp;\n }, [valueProp, getDcpl]);\n\n const handleFocus = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(event);\n },\n [onFocus],\n );\n\n const fireFormat = useCallback(() => {\n let value = valueParsedRef.current;\n if (value !== undefined) {\n value = filterMaxValue(value);\n value = filterMinValue(value);\n\n let formattedValue = value.toString();\n\n const dcpl = getDcpl(value);\n if (dcpl === 0 || !lastCharIsFloatingSymbol(formattedValue)) {\n formattedValue = value.toFixed(dcpl);\n }\n\n if (formattedValue !== (valueProp?.toString() || '')) {\n fireChange(formattedValue);\n }\n }\n }, [filterMinValue, filterMaxValue, getDcpl, valueProp]);\n\n const handleBlur = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n fireFormat();\n onBlur?.(event);\n },\n [fireFormat, onBlur],\n );\n\n const handleChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n if (onChange) {\n event.persist();\n const selectionStart = event.target.selectionStart;\n const selectionEnd = event.target.selectionEnd;\n const selectionDirection = event.target.selectionDirection || undefined;\n\n event.target.value = normalizeInputValue(event.target.value);\n onChange(event);\n\n if (selectionStart != null && selectionEnd != null && selectionDirection !== 'none') {\n event.target.setSelectionRange(selectionStart, selectionEnd, selectionDirection as any);\n }\n }\n }, [onChange, normalizeInputValue]);\n\n const handleMouseEnter = useCallback(\n (event: MouseEvent<HTMLInputElement>) => {\n setHovered(true);\n onMouseEnter?.(event);\n },\n [onMouseEnter],\n );\n\n const handleMouseLeave = useCallback(\n (event: MouseEvent<HTMLInputElement>) => {\n setHovered(false);\n onMouseLeave?.(event);\n },\n [onMouseLeave],\n );\n\n const handleWheel = useCallback((event: WheelEvent) => {\n event.preventDefault();\n\n const { deltaY } = event;\n let newValue = valueParsedRef.current || 0;\n const delta = Math.sign(-deltaY);\n const step = getStep(newValue + Math.min(0, delta * getStep(newValue)));\n\n newValue += delta * step;\n const nextStep = getStep(newValue);\n newValue = normalizeValueByStep(\n newValue,\n nextStep,\n getDcpl(newValue),\n delta < 0 ? (nextStep === step ? 'up' : 'down') : nextStep === step ? 'down' : 'up',\n );\n newValue = filterMaxValue(newValue);\n newValue = filterMinValue(newValue);\n\n fireChange(newValue.toFixed(getDcpl(newValue)));\n }, [filterMaxValue, filterMinValue, getDcpl, getStep]);\n\n const isWheelEnabled = focused && hovered && !readOnly && !disabled && !disableOnWheel;\n useEffect(() => {\n if (!isWheelEnabled) return undefined;\n\n const input = inputRef.current;\n if (!input) return undefined;\n\n input.addEventListener('wheel', handleWheel, { passive: false });\n\n return () => {\n input.removeEventListener('wheel', handleWheel);\n };\n }, [isWheelEnabled, handleWheel]);\n\n const handleStepUpClick = useCallback(() => {\n if (disabled) return;\n\n let value = valueParsedRef.current || 0;\n const step = getStep(value);\n\n value += step;\n const nextStep = getStep(value);\n value = normalizeValueByStep(\n value,\n nextStep,\n getDcpl(value),\n nextStep === step ? 'down' : 'up',\n );\n value = filterMaxValue(value);\n\n fireChange(value.toFixed(getDcpl(value)));\n }, [disabled, filterMaxValue, getStep, getDcpl]);\n\n if (upRef != null) {\n setRef(upRef, handleStepUpClick);\n }\n\n const handleStepDownClick = useCallback(() => {\n if (disabled) return;\n\n let value = valueParsedRef.current || 0;\n const step = getStep(value - getStep(value));\n\n value -= step;\n const nextStep = getStep(value);\n value = normalizeValueByStep(\n value,\n nextStep,\n getDcpl(value),\n nextStep === step ? 'up' : 'down',\n );\n value = filterMinValue(value);\n\n fireChange(value.toFixed(getDcpl(value)));\n }, [disabled, filterMinValue, getStep, getDcpl]);\n\n if (downRef != null) {\n setRef(downRef, handleStepDownClick);\n }\n\n const handleKeyDown = useCallback((event: KeyboardEvent<HTMLInputElement>) => {\n if (!readOnly && !event.defaultPrevented) {\n switch (event.key) {\n case KeyboardEventKey.ARROW_UP:\n case KeyboardEventKey.UP:\n event.preventDefault();\n handleStepUpClick();\n break;\n case KeyboardEventKey.ARROW_DOWN:\n case KeyboardEventKey.DOWN:\n event.preventDefault();\n handleStepDownClick();\n break;\n case KeyboardEventKey.ENTER:\n fireFormat();\n break;\n }\n }\n\n if (onKeyDown) {\n onKeyDown(event);\n }\n }, [readOnly, onKeyDown, handleStepUpClick, handleStepDownClick, fireFormat]);\n\n const handleMouseDown = useCallback((event: MouseEvent<HTMLButtonElement>) => {\n if (!event.defaultPrevented) {\n event.preventDefault();\n }\n\n if (!readOnly) {\n inputRef.current?.focus();\n }\n }, [readOnly]);\n\n useEffect(() => {\n if (valueProp && typeof valueProp === 'string' && valueParsed !== undefined) {\n const formattedValue = valueParsed.toFixed(getDcpl(valueParsed));\n\n if (formattedValue !== valueProp) {\n fireChange(formattedValue);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const withSteps = !hideSteps && !readOnly;\n\n const adornment = useMemo(() => {\n if (!withSteps) {\n return adornmentProp;\n }\n\n return (\n <Stepper\n size={size}\n disabled={disabled}\n onIncrement={handleStepUpClick}\n onIncrementMouseDown={handleMouseDown}\n onDecrement={handleStepDownClick}\n onDecrementMouseDown={handleMouseDown}\n tabIndex={-1}\n />\n );\n }, [\n adornmentProp, disabled, handleMouseDown,\n handleStepDownClick, handleStepUpClick, withSteps, size,\n ]);\n\n return (\n <TextField\n {...textFieldProps}\n size={size}\n className={classnames(withSteps ? adornmentStepsStyles : '', className)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onChange={handleChange}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n value={stringValue}\n ref={forkedRef}\n type=\"text\"\n adornment={adornment}\n />\n );\n});\n\nexport default memo(NumberTextField);\n"],"names":["MAX_VALUE_DEFAULT","MIN_VALUE_DEFAULT","MAX_INT_VALUE","MIN_INT_VALUE","STEP_DEFAULT","NumberTextField","forwardRef","valueProp","minProp","maxProp","stepProp","dcplProp","hideSteps","disableOnWheel","upRef","downRef","size","textFieldProps","forwardedRef","className","disabled","readOnly","onChange","onFocus","onBlur","onMouseEnter","onMouseLeave","onKeyDown","adornmentProp","focused","setFocused","useState","hovered","setHovered","inputRef","useRef","forkedRef","useForkRef","valueParsed","useMemo","numberValue","parseFloat","Number","valueParsedRef","getStep","useCallback","value","getDcpl","calculateFloatPrecision","getMax","dcpl","Math","getMin","filterMaxValue","max","filterMinValue","min","normalizeInputValue","formattedValue","str","index","parsedValue","integerPart","fractionParts","maxIntLength","getIntLength","fireChange","triggerChangeEvent","stringValue","handleFocus","event","fireFormat","undefined","lastCharIsFloatingSymbol","handleBlur","handleChange","selectionStart","selectionEnd","selectionDirection","handleMouseEnter","handleMouseLeave","handleWheel","deltaY","newValue","delta","step","nextStep","normalizeValueByStep","isWheelEnabled","useEffect","input","handleStepUpClick","setRef","handleStepDownClick","handleKeyDown","KeyboardEventKey","handleMouseDown","_inputRef_current","withSteps","adornment","Stepper","TextField","classnames","adornmentStepsStyles","memo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NumberTextField/NumberTextField.js","sources":["../../src/NumberTextField/NumberTextField.tsx"],"sourcesContent":["import {\n memo,\n Ref,\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n FocusEvent,\n ChangeEvent,\n KeyboardEvent,\n MouseEvent,\n useState,\n} from 'react';\nimport classnames from 'clsx';\n\nimport Stepper from '../Stepper/index.js';\nimport TextField, { type TextFieldProps } from '../TextField/index.js';\nimport { triggerChangeEvent } from '../utils/event.js';\nimport { KeyboardEventKey } from '../types.js';\nimport {\n calculateFloatPrecision,\n lastCharIsFloatingSymbol,\n getIntLength,\n normalizeValueByStep,\n} from './utils.js';\nimport { setRef, useForkRef } from '../utils/withForwardedRef.js';\nimport { adornmentStepsStyles } from './NumberTextField.styles.js';\n\nconst MAX_VALUE_DEFAULT = 999999999999;\nconst MIN_VALUE_DEFAULT = -999999999999;\nconst MAX_INT_VALUE = 999999999999999;\nconst MIN_INT_VALUE = -999999999999999;\nexport const STEP_DEFAULT = 1;\n\nexport interface Props extends Omit<TextFieldProps, 'value' | 'step' | 'type'> {\n /** Состояние значения числового поля */\n value?: string | number;\n /** Минимально возможное значение числового поля */\n min?: number;\n /** Максимально возможное значение числового поля */\n max?: number;\n /** Шаг изменения значения числового поля */\n step?: number | ((nextValue: number) => number);\n /** Отображаемое количество цифр дробной части */\n dcpl?: number;\n /** Скрытие кнопок пошагового изменения значения числового поля */\n hideSteps?: boolean;\n /** ref для получения функции управления шагом по увеличению значения */\n upRef?: Ref<VoidFunction | undefined>;\n /** ref для получения функции управления шагом по уменьшению значения */\n downRef?: Ref<VoidFunction | undefined>;\n /** Отключение пошагового изменения на событие onWheel */\n disableOnWheel?: boolean;\n}\n\nconst NumberTextField = forwardRef<HTMLInputElement, Props>(({\n value: valueProp,\n min: minProp,\n max: maxProp,\n step: stepProp = STEP_DEFAULT,\n dcpl: dcplProp,\n hideSteps,\n disableOnWheel,\n upRef,\n downRef,\n size,\n ...textFieldProps\n}, forwardedRef) => {\n const {\n className,\n disabled,\n readOnly,\n onChange,\n onFocus,\n onBlur,\n onMouseEnter,\n onMouseLeave,\n onKeyDown,\n adornment: adornmentProp,\n } = textFieldProps;\n const [focused, setFocused] = useState<boolean>(false);\n const [hovered, setHovered] = useState<boolean>(false);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const forkedRef = useForkRef(inputRef, forwardedRef);\n\n const valueParsed = useMemo((): number | undefined => {\n if (typeof valueProp === 'string') {\n if (valueProp.trim() === '') {\n return undefined;\n }\n const numberValue = parseFloat(valueProp);\n if (!Number.isNaN(numberValue) && Number.isFinite(numberValue)) {\n return numberValue;\n }\n return 0;\n }\n return valueProp || 0;\n }, [valueProp]);\n const valueParsedRef = useRef<number | undefined>(valueParsed);\n valueParsedRef.current = valueParsed;\n\n const getStep = useCallback((value: number) => (\n typeof stepProp === 'number' ? stepProp : stepProp(value)\n ), [stepProp]);\n\n const getDcpl = useCallback((value: number) => {\n if (dcplProp != null && typeof stepProp === 'number') {\n return dcplProp;\n }\n\n return calculateFloatPrecision(getStep(value || 0));\n }, [dcplProp, stepProp, getStep]);\n\n const getMax = useCallback((value: number) => {\n const dcpl = getDcpl(value);\n if (maxProp == null || Number.isNaN(maxProp) || maxProp <= MIN_INT_VALUE) {\n return MAX_VALUE_DEFAULT / (10 ** dcpl);\n }\n return Math.min(maxProp, MAX_INT_VALUE / (10 ** dcpl));\n }, [getDcpl, maxProp]);\n\n const getMin = useCallback((value: number) => {\n const dcpl = getDcpl(value);\n if (minProp == null || Number.isNaN(minProp) || minProp >= MAX_INT_VALUE) {\n return MIN_VALUE_DEFAULT / (10 ** dcpl);\n }\n return Math.max(minProp, MIN_INT_VALUE / (10 ** dcpl));\n }, [getDcpl, minProp]);\n\n const filterMaxValue = useCallback((value: number) => {\n const max = getMax(value);\n return Math.min(value, max);\n }, [getMax]);\n\n const filterMinValue = useCallback((value: number) => {\n const min = getMin(value);\n return Math.max(value, min);\n }, [getMin]);\n\n const normalizeInputValue = useCallback((value: string) => {\n let formattedValue = (value || '').trim().replace(\n /[^\\d.]/g,\n (str, index) => {\n if (str === ',') return '.'; // нужно для работы цифровой клавиатуры на мобильных утройствах\n if (str === '-' && index === 0) return '-';\n return '';\n },\n ).replace(/\\.+/g, '.');\n let parsedValue = parseFloat(formattedValue);\n if (Number.isNaN(parsedValue)) {\n return formattedValue;\n }\n\n const min = getMin(parsedValue);\n if (min >= 0 && parsedValue < 0) {\n formattedValue = formattedValue.replace('-', '');\n parsedValue = parseFloat(formattedValue);\n }\n const [integerPart = '', ...fractionParts] = formattedValue.split('.');\n const dcpl = getDcpl(parsedValue);\n const maxIntLength = getIntLength(\n (parsedValue < 0 || formattedValue.startsWith('-'))\n ? min\n : getMax(parsedValue),\n integerPart.length,\n );\n\n if (\n fractionParts?.length &&\n (fractionParts.length > 1 || (fractionParts[0]?.length ?? 0) > dcpl)\n ) {\n formattedValue = `${\n integerPart.slice(0, maxIntLength)\n }.${\n fractionParts.join('').slice(0, dcpl)\n }`;\n } else if (integerPart) {\n formattedValue = formattedValue.replace(\n integerPart,\n integerPart.slice(0, maxIntLength),\n );\n }\n return formattedValue;\n }, [getMin, getMax, getDcpl]);\n\n const fireChange = (value: string | number) => {\n if (inputRef.current) {\n triggerChangeEvent(inputRef.current, value);\n }\n };\n\n const stringValue = useMemo((): string => {\n if (typeof valueProp === 'number') {\n return valueProp.toFixed(getDcpl(valueProp));\n }\n\n if (valueProp == null) {\n return '';\n }\n\n return valueProp;\n }, [valueProp, getDcpl]);\n\n const handleFocus = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(event);\n },\n [onFocus],\n );\n\n const fireFormat = useCallback(() => {\n let value = valueParsedRef.current;\n if (value !== undefined) {\n value = filterMaxValue(value);\n value = filterMinValue(value);\n\n let formattedValue = value.toString();\n\n const dcpl = getDcpl(value);\n if (dcpl === 0 || !lastCharIsFloatingSymbol(formattedValue)) {\n formattedValue = value.toFixed(dcpl);\n }\n\n if (formattedValue !== (valueProp?.toString() || '')) {\n fireChange(formattedValue);\n }\n }\n }, [filterMinValue, filterMaxValue, getDcpl, valueProp]);\n\n const handleBlur = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n fireFormat();\n onBlur?.(event);\n },\n [fireFormat, onBlur],\n );\n\n const handleChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n if (onChange) {\n event.persist();\n const selectionStart = event.target.selectionStart;\n const selectionEnd = event.target.selectionEnd;\n const selectionDirection = event.target.selectionDirection || undefined;\n\n event.target.value = normalizeInputValue(event.target.value);\n onChange(event);\n\n if (selectionStart != null && selectionEnd != null && selectionDirection !== 'none') {\n event.target.setSelectionRange(selectionStart, selectionEnd, selectionDirection as any);\n }\n }\n }, [onChange, normalizeInputValue]);\n\n const handleMouseEnter = useCallback(\n (event: MouseEvent<HTMLInputElement>) => {\n setHovered(true);\n onMouseEnter?.(event);\n },\n [onMouseEnter],\n );\n\n const handleMouseLeave = useCallback(\n (event: MouseEvent<HTMLInputElement>) => {\n setHovered(false);\n onMouseLeave?.(event);\n },\n [onMouseLeave],\n );\n\n const handleWheel = useCallback((event: WheelEvent) => {\n event.preventDefault();\n\n const { deltaY } = event;\n let newValue = valueParsedRef.current || 0;\n const delta = Math.sign(-deltaY);\n const step = getStep(newValue + Math.min(0, delta * getStep(newValue)));\n\n newValue += delta * step;\n const nextStep = getStep(newValue);\n newValue = normalizeValueByStep(\n newValue,\n nextStep,\n getDcpl(newValue),\n delta < 0 ? (nextStep === step ? 'up' : 'down') : nextStep === step ? 'down' : 'up',\n );\n newValue = filterMaxValue(newValue);\n newValue = filterMinValue(newValue);\n\n fireChange(newValue.toFixed(getDcpl(newValue)));\n }, [filterMaxValue, filterMinValue, getDcpl, getStep]);\n\n const isWheelEnabled = focused && hovered && !readOnly && !disabled && !disableOnWheel;\n useEffect(() => {\n if (!isWheelEnabled) return undefined;\n\n const input = inputRef.current;\n if (!input) return undefined;\n\n input.addEventListener('wheel', handleWheel, { passive: false });\n\n return () => {\n input.removeEventListener('wheel', handleWheel);\n };\n }, [isWheelEnabled, handleWheel]);\n\n const handleStepUpClick = useCallback(() => {\n if (disabled) return;\n\n let value = valueParsedRef.current || 0;\n const step = getStep(value);\n\n value += step;\n const nextStep = getStep(value);\n value = normalizeValueByStep(\n value,\n nextStep,\n getDcpl(value),\n nextStep === step ? 'down' : 'up',\n );\n value = filterMaxValue(value);\n\n fireChange(value.toFixed(getDcpl(value)));\n }, [disabled, filterMaxValue, getStep, getDcpl]);\n\n if (upRef != null) {\n setRef(upRef, handleStepUpClick);\n }\n\n const handleStepDownClick = useCallback(() => {\n if (disabled) return;\n\n let value = valueParsedRef.current || 0;\n const step = getStep(value - getStep(value));\n\n value -= step;\n const nextStep = getStep(value);\n value = normalizeValueByStep(\n value,\n nextStep,\n getDcpl(value),\n nextStep === step ? 'up' : 'down',\n );\n value = filterMinValue(value);\n\n fireChange(value.toFixed(getDcpl(value)));\n }, [disabled, filterMinValue, getStep, getDcpl]);\n\n if (downRef != null) {\n setRef(downRef, handleStepDownClick);\n }\n\n const handleKeyDown = useCallback((event: KeyboardEvent<HTMLInputElement>) => {\n if (!readOnly && !event.defaultPrevented) {\n switch (event.key) {\n case KeyboardEventKey.ARROW_UP:\n case KeyboardEventKey.UP:\n event.preventDefault();\n handleStepUpClick();\n break;\n case KeyboardEventKey.ARROW_DOWN:\n case KeyboardEventKey.DOWN:\n event.preventDefault();\n handleStepDownClick();\n break;\n case KeyboardEventKey.ENTER:\n fireFormat();\n break;\n }\n }\n\n if (onKeyDown) {\n onKeyDown(event);\n }\n }, [readOnly, onKeyDown, handleStepUpClick, handleStepDownClick, fireFormat]);\n\n const handleMouseDown = useCallback((event: MouseEvent<HTMLButtonElement>) => {\n if (!event.defaultPrevented) {\n event.preventDefault();\n }\n\n if (!readOnly) {\n inputRef.current?.focus();\n }\n }, [readOnly]);\n\n useEffect(() => {\n if (valueProp && typeof valueProp === 'string' && valueParsed !== undefined) {\n const formattedValue = valueParsed.toFixed(getDcpl(valueParsed));\n\n if (formattedValue !== valueProp) {\n fireChange(formattedValue);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const withSteps = !hideSteps && !readOnly;\n\n const adornment = useMemo(() => {\n if (!withSteps) {\n return adornmentProp;\n }\n\n return (\n <Stepper\n size={size}\n disabled={disabled}\n onIncrement={handleStepUpClick}\n onIncrementMouseDown={handleMouseDown}\n onDecrement={handleStepDownClick}\n onDecrementMouseDown={handleMouseDown}\n tabIndex={-1}\n />\n );\n }, [\n adornmentProp, disabled, handleMouseDown,\n handleStepDownClick, handleStepUpClick, withSteps, size,\n ]);\n\n return (\n <TextField\n {...textFieldProps}\n size={size}\n className={classnames(withSteps ? adornmentStepsStyles : '', className)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onChange={handleChange}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n value={stringValue}\n ref={forkedRef}\n type=\"text\"\n adornment={adornment}\n />\n );\n});\n\nexport default memo(NumberTextField);\n"],"names":["MAX_VALUE_DEFAULT","MIN_VALUE_DEFAULT","MAX_INT_VALUE","MIN_INT_VALUE","STEP_DEFAULT","NumberTextField","forwardRef","valueProp","minProp","maxProp","stepProp","dcplProp","hideSteps","disableOnWheel","upRef","downRef","size","textFieldProps","forwardedRef","className","disabled","readOnly","onChange","onFocus","onBlur","onMouseEnter","onMouseLeave","onKeyDown","adornmentProp","focused","setFocused","useState","hovered","setHovered","inputRef","useRef","forkedRef","useForkRef","valueParsed","useMemo","numberValue","parseFloat","Number","valueParsedRef","getStep","useCallback","value","getDcpl","calculateFloatPrecision","getMax","dcpl","Math","getMin","filterMaxValue","max","filterMinValue","min","normalizeInputValue","_fractionParts_","formattedValue","str","index","parsedValue","integerPart","fractionParts","maxIntLength","getIntLength","fireChange","triggerChangeEvent","stringValue","handleFocus","event","fireFormat","undefined","lastCharIsFloatingSymbol","handleBlur","handleChange","selectionStart","selectionEnd","selectionDirection","handleMouseEnter","handleMouseLeave","handleWheel","deltaY","newValue","delta","step","nextStep","normalizeValueByStep","isWheelEnabled","useEffect","input","handleStepUpClick","setRef","handleStepDownClick","handleKeyDown","KeyboardEventKey","handleMouseDown","_inputRef_current","withSteps","adornment","Stepper","TextField","classnames","adornmentStepsStyles","memo"],"mappings":"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"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
const lastCharIsFloatingSymbol = (value)=>/[.,]$/.test(value);
|
|
2
2
|
const calculateFloatPrecision = (value)=>{
|
|
3
3
|
const splitNumber = value.toString().split('.');
|
|
4
|
-
if (splitNumber.length > 1)
|
|
4
|
+
if (splitNumber.length > 1) {
|
|
5
|
+
var _ref;
|
|
6
|
+
var _splitNumber_;
|
|
7
|
+
return null != (_ref = null == (_splitNumber_ = splitNumber[1]) ? void 0 : _splitNumber_.length) ? _ref : 0;
|
|
8
|
+
}
|
|
5
9
|
return 0;
|
|
6
10
|
};
|
|
7
11
|
const getIntLength = (value, defaultLength)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberTextField/utils.js","sources":["../../src/NumberTextField/utils.ts"],"sourcesContent":["export const lastCharIsFloatingSymbol = (value: string) => /[.,]$/.test(value);\n\nexport const calculateFloatPrecision = (value: number) => {\n const splitNumber = value.toString().split('.');\n if (splitNumber.length > 1) {\n return splitNumber[1]
|
|
1
|
+
{"version":3,"file":"NumberTextField/utils.js","sources":["../../src/NumberTextField/utils.ts"],"sourcesContent":["export const lastCharIsFloatingSymbol = (value: string) => /[.,]$/.test(value);\n\nexport const calculateFloatPrecision = (value: number) => {\n const splitNumber = value.toString().split('.');\n if (splitNumber.length > 1) {\n return splitNumber[1]?.length ?? 0;\n }\n\n return 0;\n};\n\nexport const getIntLength = (value: number, defaultLength: number) => {\n if (Number.isFinite(value)) {\n const intValue = parseInt(value.toString(), 10);\n return intValue.toString().length + (intValue === 0 && value < 0 ? 1 : 0);\n }\n return defaultLength;\n};\n\nexport const normalizeValueByStep = (\n value: number,\n step: number,\n dcpl: number,\n roundDirection: 'up' | 'down',\n) => {\n if (!step) {\n return value;\n }\n\n const intifiedValue = Math.round(value * (10 ** dcpl));\n const intifiedStep = step * (10 ** dcpl);\n\n if (intifiedValue % intifiedStep !== 0) {\n const n = roundDirection === 'up'\n ? Math.ceil(intifiedValue / intifiedStep)\n : Math.floor(intifiedValue / intifiedStep);\n return (n * intifiedStep) / (10 ** dcpl);\n }\n\n return value;\n};\n"],"names":["lastCharIsFloatingSymbol","value","calculateFloatPrecision","splitNumber","_splitNumber_","getIntLength","defaultLength","Number","intValue","parseInt","normalizeValueByStep","step","dcpl","roundDirection","intifiedValue","Math","intifiedStep","n"],"mappings":"AAAO,MAAMA,2BAA2B,CAACC,QAAkB,QAAQ,IAAI,CAACA;AAEjE,MAAMC,0BAA0B,CAACD;IACtC,MAAME,cAAcF,MAAM,QAAQ,GAAG,KAAK,CAAC;IAC3C,IAAIE,YAAY,MAAM,GAAG,GAAG;;YACnBC;QAAP,OAAO,QAAP,gBAAOA,CAAAA,gBAAAA,WAAW,CAAC,EAAE,AAAD,IAAbA,KAAAA,IAAAA,cAAgB,MAAM,AAAD,IAAC,OAAI;IACnC;IAEA,OAAO;AACT;AAEO,MAAMC,eAAe,CAACJ,OAAeK;IAC1C,IAAIC,OAAO,QAAQ,CAACN,QAAQ;QAC1B,MAAMO,WAAWC,SAASR,MAAM,QAAQ,IAAI;QAC5C,OAAOO,SAAS,QAAQ,GAAG,MAAM,GAAIA,CAAAA,AAAa,MAAbA,YAAkBP,QAAQ,IAAI,IAAI;IACzE;IACA,OAAOK;AACT;AAEO,MAAMI,uBAAuB,CAClCT,OACAU,MACAC,MACAC;IAEA,IAAI,CAACF,MACH,OAAOV;IAGT,MAAMa,gBAAgBC,KAAK,KAAK,CAACd,QAAQ,KAARA,GAAAA,CAAS,IAAMW;IAChD,MAAMI,eAAeL,OAAO,KAAPA,GAAAA,CAAQ,IAAMC;IAEnC,IAAIE,gBAAgBE,iBAAiB,GAAG;QACtC,MAAMC,IAAIJ,AAAmB,SAAnBA,iBACNE,KAAK,IAAI,CAACD,gBAAgBE,gBAC1BD,KAAK,KAAK,CAACD,gBAAgBE;QAC/B,OAAQC,IAAID,eAAAA,KAAAA,GAAAA,CAAiB,IAAMJ;IACrC;IAEA,OAAOX;AACT"}
|