@alfalab/core-components-select 19.1.10 → 19.2.0
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/components/arrow/index.css +4 -4
- package/components/arrow/index.module.css.js +1 -1
- package/components/base-checkmark/index.css +9 -9
- package/components/base-checkmark/index.module.css.js +1 -1
- package/components/base-option/index.css +14 -14
- package/components/base-option/index.module.css.js +1 -1
- package/components/base-select/Component.js +36 -49
- package/components/base-select/Component.js.map +1 -1
- package/components/base-select/index.css +70 -20
- package/components/base-select/index.module.css.js +1 -1
- package/components/base-select/index.module.css.js.map +1 -1
- package/components/base-select/mobile.css +12 -11
- package/components/base-select/mobile.module.css.js +1 -1
- package/components/base-select/mobile.module.css.js.map +1 -1
- package/components/checkmark/index.css +11 -11
- package/components/checkmark/index.module.css.js +1 -1
- package/components/checkmark-mobile/index.css +6 -6
- package/components/checkmark-mobile/index.module.css.js +1 -1
- package/components/clear-button/index.css +4 -4
- package/components/clear-button/index.module.css.js +1 -1
- package/components/field/index.css +13 -13
- package/components/field/index.module.css.js +1 -1
- package/components/footer/index.css +4 -4
- package/components/footer/index.module.css.js +1 -1
- package/components/optgroup/index.css +4 -4
- package/components/optgroup/index.module.css.js +1 -1
- package/components/option/desktop/index.css +23 -19
- package/components/option/desktop/index.module.css.js +1 -1
- package/components/option/desktop/index.module.css.js.map +1 -1
- package/components/option/mobile/index.css +20 -16
- package/components/option/mobile/index.module.css.js +1 -1
- package/components/option/mobile/index.module.css.js.map +1 -1
- package/components/options-list/Component.d.ts +4 -0
- package/components/options-list/Component.js +32 -53
- package/components/options-list/Component.js.map +1 -1
- package/components/options-list/index.css +13 -33
- package/components/options-list/index.module.css.js +1 -1
- package/components/options-list/index.module.css.js.map +1 -1
- package/components/search/index.css +1 -1
- package/components/search/index.module.css.js +1 -1
- package/components/virtual-options-list/Component.d.ts +4 -0
- package/components/virtual-options-list/Component.js +61 -48
- package/components/virtual-options-list/Component.js.map +1 -1
- package/cssm/components/base-select/Component.js +36 -49
- package/cssm/components/base-select/Component.js.map +1 -1
- package/cssm/components/base-select/index.module.css +61 -11
- package/cssm/components/base-select/mobile.module.css +1 -0
- package/cssm/components/option/desktop/index.module.css +4 -0
- package/cssm/components/option/mobile/index.module.css +4 -0
- package/cssm/components/options-list/Component.d.ts +4 -0
- package/cssm/components/options-list/Component.js +32 -53
- package/cssm/components/options-list/Component.js.map +1 -1
- package/cssm/components/options-list/index.module.css +6 -26
- package/cssm/components/virtual-options-list/Component.d.ts +4 -0
- package/cssm/components/virtual-options-list/Component.js +61 -48
- package/cssm/components/virtual-options-list/Component.js.map +1 -1
- package/cssm/presets/useSelectWithApply/hook.d.ts +12 -0
- package/cssm/presets/useSelectWithApply/options-list-with-apply/Component.d.ts +4 -0
- package/cssm/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css +0 -5
- package/cssm/presets/useSelectWithApply/options-list-with-apply/header/index.module.css +9 -6
- package/cssm/shared/index.js +0 -1
- package/cssm/shared/index.js.map +1 -1
- package/cssm/typings.d.ts +21 -1
- package/cssm/utils.d.ts +1 -6
- package/cssm/utils.js +19 -28
- package/cssm/utils.js.map +1 -1
- package/esm/components/arrow/index.css +4 -4
- package/esm/components/arrow/index.module.css.js +1 -1
- package/esm/components/base-checkmark/index.css +9 -9
- package/esm/components/base-checkmark/index.module.css.js +1 -1
- package/esm/components/base-option/index.css +14 -14
- package/esm/components/base-option/index.module.css.js +1 -1
- package/esm/components/base-select/Component.js +37 -50
- package/esm/components/base-select/Component.js.map +1 -1
- package/esm/components/base-select/index.css +70 -20
- package/esm/components/base-select/index.module.css.js +1 -1
- package/esm/components/base-select/index.module.css.js.map +1 -1
- package/esm/components/base-select/mobile.css +12 -11
- package/esm/components/base-select/mobile.module.css.js +1 -1
- package/esm/components/base-select/mobile.module.css.js.map +1 -1
- package/esm/components/checkmark/index.css +11 -11
- package/esm/components/checkmark/index.module.css.js +1 -1
- package/esm/components/checkmark-mobile/index.css +6 -6
- package/esm/components/checkmark-mobile/index.module.css.js +1 -1
- package/esm/components/clear-button/index.css +4 -4
- package/esm/components/clear-button/index.module.css.js +1 -1
- package/esm/components/field/index.css +13 -13
- package/esm/components/field/index.module.css.js +1 -1
- package/esm/components/footer/index.css +4 -4
- package/esm/components/footer/index.module.css.js +1 -1
- package/esm/components/optgroup/index.css +4 -4
- package/esm/components/optgroup/index.module.css.js +1 -1
- package/esm/components/option/desktop/index.css +23 -19
- package/esm/components/option/desktop/index.module.css.js +1 -1
- package/esm/components/option/desktop/index.module.css.js.map +1 -1
- package/esm/components/option/mobile/index.css +20 -16
- package/esm/components/option/mobile/index.module.css.js +1 -1
- package/esm/components/option/mobile/index.module.css.js.map +1 -1
- package/esm/components/options-list/Component.d.ts +4 -0
- package/esm/components/options-list/Component.js +33 -54
- package/esm/components/options-list/Component.js.map +1 -1
- package/esm/components/options-list/index.css +13 -33
- package/esm/components/options-list/index.module.css.js +1 -1
- package/esm/components/options-list/index.module.css.js.map +1 -1
- package/esm/components/search/index.css +1 -1
- package/esm/components/search/index.module.css.js +1 -1
- package/esm/components/virtual-options-list/Component.d.ts +4 -0
- package/esm/components/virtual-options-list/Component.js +63 -49
- package/esm/components/virtual-options-list/Component.js.map +1 -1
- package/esm/mobile/modal.mobile.css +1 -1
- package/esm/mobile/modal.mobile.module.css.js +1 -1
- package/esm/presets/useSelectWithApply/hook.d.ts +12 -0
- package/esm/presets/useSelectWithApply/options-list-with-apply/Component.d.ts +4 -0
- package/esm/presets/useSelectWithApply/options-list-with-apply/footer/index.css +2 -7
- package/esm/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css.js +1 -1
- package/esm/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css.js.map +1 -1
- package/esm/presets/useSelectWithApply/options-list-with-apply/header/index.css +12 -9
- package/esm/presets/useSelectWithApply/options-list-with-apply/header/index.module.css.js +1 -1
- package/esm/presets/useSelectWithApply/options-list-with-apply/header/index.module.css.js.map +1 -1
- package/esm/presets/useSelectWithLoading/index.css +1 -1
- package/esm/presets/useSelectWithLoading/index.module.css.js +1 -1
- package/esm/shared/index.js +1 -1
- package/esm/typings.d.ts +21 -1
- package/esm/utils.d.ts +1 -6
- package/esm/utils.js +21 -29
- package/esm/utils.js.map +1 -1
- package/mobile/modal.mobile.css +1 -1
- package/mobile/modal.mobile.module.css.js +1 -1
- package/modern/components/arrow/index.css +4 -4
- package/modern/components/arrow/index.module.css.js +1 -1
- package/modern/components/base-checkmark/index.css +9 -9
- package/modern/components/base-checkmark/index.module.css.js +1 -1
- package/modern/components/base-option/index.css +14 -14
- package/modern/components/base-option/index.module.css.js +1 -1
- package/modern/components/base-select/Component.js +34 -47
- package/modern/components/base-select/Component.js.map +1 -1
- package/modern/components/base-select/index.css +70 -20
- package/modern/components/base-select/index.module.css.js +1 -1
- package/modern/components/base-select/index.module.css.js.map +1 -1
- package/modern/components/base-select/mobile.css +12 -11
- package/modern/components/base-select/mobile.module.css.js +1 -1
- package/modern/components/base-select/mobile.module.css.js.map +1 -1
- package/modern/components/checkmark/index.css +11 -11
- package/modern/components/checkmark/index.module.css.js +1 -1
- package/modern/components/checkmark-mobile/index.css +6 -6
- package/modern/components/checkmark-mobile/index.module.css.js +1 -1
- package/modern/components/clear-button/index.css +4 -4
- package/modern/components/clear-button/index.module.css.js +1 -1
- package/modern/components/field/index.css +13 -13
- package/modern/components/field/index.module.css.js +1 -1
- package/modern/components/footer/index.css +4 -4
- package/modern/components/footer/index.module.css.js +1 -1
- package/modern/components/optgroup/index.css +4 -4
- package/modern/components/optgroup/index.module.css.js +1 -1
- package/modern/components/option/desktop/index.css +23 -19
- package/modern/components/option/desktop/index.module.css.js +1 -1
- package/modern/components/option/desktop/index.module.css.js.map +1 -1
- package/modern/components/option/mobile/index.css +20 -16
- package/modern/components/option/mobile/index.module.css.js +1 -1
- package/modern/components/option/mobile/index.module.css.js.map +1 -1
- package/modern/components/options-list/Component.d.ts +4 -0
- package/modern/components/options-list/Component.js +29 -49
- package/modern/components/options-list/Component.js.map +1 -1
- package/modern/components/options-list/index.css +13 -33
- package/modern/components/options-list/index.module.css.js +1 -1
- package/modern/components/options-list/index.module.css.js.map +1 -1
- package/modern/components/search/index.css +1 -1
- package/modern/components/search/index.module.css.js +1 -1
- package/modern/components/virtual-options-list/Component.d.ts +4 -0
- package/modern/components/virtual-options-list/Component.js +59 -45
- package/modern/components/virtual-options-list/Component.js.map +1 -1
- package/modern/mobile/modal.mobile.css +1 -1
- package/modern/mobile/modal.mobile.module.css.js +1 -1
- package/modern/presets/useSelectWithApply/hook.d.ts +12 -0
- package/modern/presets/useSelectWithApply/options-list-with-apply/Component.d.ts +4 -0
- package/modern/presets/useSelectWithApply/options-list-with-apply/footer/index.css +2 -7
- package/modern/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css.js +1 -1
- package/modern/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css.js.map +1 -1
- package/modern/presets/useSelectWithApply/options-list-with-apply/header/index.css +12 -9
- package/modern/presets/useSelectWithApply/options-list-with-apply/header/index.module.css.js +1 -1
- package/modern/presets/useSelectWithApply/options-list-with-apply/header/index.module.css.js.map +1 -1
- package/modern/presets/useSelectWithLoading/index.css +1 -1
- package/modern/presets/useSelectWithLoading/index.module.css.js +1 -1
- package/modern/shared/index.js +1 -1
- package/modern/typings.d.ts +21 -1
- package/modern/utils.d.ts +1 -6
- package/modern/utils.js +21 -29
- package/modern/utils.js.map +1 -1
- package/moderncssm/components/base-select/Component.js +34 -47
- package/moderncssm/components/base-select/Component.js.map +1 -1
- package/moderncssm/components/base-select/index.module.css +67 -9
- package/moderncssm/components/base-select/mobile.module.css +1 -0
- package/moderncssm/components/option/desktop/index.module.css +3 -0
- package/moderncssm/components/option/mobile/index.module.css +3 -0
- package/moderncssm/components/options-list/Component.d.ts +4 -0
- package/moderncssm/components/options-list/Component.js +29 -49
- package/moderncssm/components/options-list/Component.js.map +1 -1
- package/moderncssm/components/options-list/index.module.css +7 -32
- package/moderncssm/components/virtual-options-list/Component.d.ts +4 -0
- package/moderncssm/components/virtual-options-list/Component.js +59 -45
- package/moderncssm/components/virtual-options-list/Component.js.map +1 -1
- package/moderncssm/presets/useSelectWithApply/hook.d.ts +12 -0
- package/moderncssm/presets/useSelectWithApply/options-list-with-apply/Component.d.ts +4 -0
- package/moderncssm/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css +0 -4
- package/moderncssm/presets/useSelectWithApply/options-list-with-apply/header/index.module.css +8 -6
- package/moderncssm/shared/index.js +1 -1
- package/moderncssm/typings.d.ts +21 -1
- package/moderncssm/utils.d.ts +1 -6
- package/moderncssm/utils.js +21 -29
- package/moderncssm/utils.js.map +1 -1
- package/package.json +13 -14
- package/presets/useSelectWithApply/hook.d.ts +12 -0
- package/presets/useSelectWithApply/options-list-with-apply/Component.d.ts +4 -0
- package/presets/useSelectWithApply/options-list-with-apply/footer/index.css +2 -7
- package/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css.js +1 -1
- package/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css.js.map +1 -1
- package/presets/useSelectWithApply/options-list-with-apply/header/index.css +12 -9
- package/presets/useSelectWithApply/options-list-with-apply/header/index.module.css.js +1 -1
- package/presets/useSelectWithApply/options-list-with-apply/header/index.module.css.js.map +1 -1
- package/presets/useSelectWithLoading/index.css +1 -1
- package/presets/useSelectWithLoading/index.module.css.js +1 -1
- package/shared/index.js +0 -1
- package/shared/index.js.map +1 -1
- package/src/components/base-select/Component.tsx +41 -55
- package/src/components/base-select/index.module.css +60 -8
- package/src/components/base-select/mobile.module.css +1 -0
- package/src/components/option/index.module.css +4 -0
- package/src/components/options-list/Component.tsx +54 -97
- package/src/components/options-list/index.module.css +7 -31
- package/src/components/virtual-options-list/Component.tsx +95 -72
- package/src/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css +0 -4
- package/src/presets/useSelectWithApply/options-list-with-apply/header/index.module.css +4 -4
- package/src/typings.ts +26 -0
- package/src/utils.ts +30 -34
- package/src/vars.css +3 -0
- package/typings.d.ts +21 -1
- package/utils.d.ts +1 -6
- package/utils.js +19 -28
- package/utils.js.map +1 -1
- package/components/virtual-options-list/index.css +0 -83
- package/components/virtual-options-list/index.module.css.js +0 -8
- package/components/virtual-options-list/index.module.css.js.map +0 -1
- package/cssm/components/virtual-options-list/index.module.css +0 -83
- package/esm/components/virtual-options-list/index.css +0 -83
- package/esm/components/virtual-options-list/index.module.css.js +0 -6
- package/esm/components/virtual-options-list/index.module.css.js.map +0 -1
- package/modern/components/virtual-options-list/index.css +0 -83
- package/modern/components/virtual-options-list/index.module.css.js +0 -6
- package/modern/components/virtual-options-list/index.module.css.js.map +0 -1
- package/moderncssm/components/virtual-options-list/index.module.css +0 -81
- package/src/components/virtual-options-list/index.module.css +0 -77
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { __assign } from 'tslib';
|
|
2
|
-
import React, { forwardRef,
|
|
2
|
+
import React, { forwardRef, useRef, useState } from 'react';
|
|
3
3
|
import mergeRefs from 'react-merge-refs';
|
|
4
4
|
import cn from 'classnames';
|
|
5
|
-
import {
|
|
5
|
+
import { ScrollbarPrivate } from '@alfalab/core-components-scrollbar-private/esm';
|
|
6
6
|
import { DEFAULT_VISIBLE_OPTIONS } from '../../consts.js';
|
|
7
7
|
import { useNativeScrollbar } from '../../hooks/use-native-scrollbar.js';
|
|
8
8
|
import { useVisibleOptions, isGroup } from '../../utils.js';
|
|
@@ -16,24 +16,34 @@ var createCounter = function () {
|
|
|
16
16
|
};
|
|
17
17
|
var OptionsList = forwardRef(function (_a, ref) {
|
|
18
18
|
var _b, _c;
|
|
19
|
-
var _d = _a.size, size = _d === void 0 ? 48 : _d, className = _a.className, optionGroupClassName = _a.optionGroupClassName, footerClassName = _a.footerClassName, scrollbarClassName = _a.scrollbarClassName, Option = _a.Option, getOptionProps = _a.getOptionProps, _e = _a.groupOptionProps, groupOptionProps = _e === void 0 ? {} : _e, _f = _a.options, options = _f === void 0 ? [] : _f, _g = _a.Optgroup, Optgroup$1 = _g === void 0 ? Optgroup : _g, dataTestId = _a.dataTestId, emptyPlaceholder = _a.emptyPlaceholder, _h = _a.visibleOptions, visibleOptions = _h === void 0 ? DEFAULT_VISIBLE_OPTIONS : _h, onScroll = _a.onScroll, open = _a.open, header = _a.header, footer = _a.footer, _j = _a.showFooter, showFooter = _j === void 0 ? true : _j,
|
|
20
|
-
var
|
|
21
|
-
var
|
|
19
|
+
var _d = _a.size, size = _d === void 0 ? 48 : _d, className = _a.className, optionGroupClassName = _a.optionGroupClassName, footerClassName = _a.footerClassName, scrollbarClassName = _a.scrollbarClassName, Option = _a.Option, getOptionProps = _a.getOptionProps, _e = _a.groupOptionProps, groupOptionProps = _e === void 0 ? {} : _e, _f = _a.options, options = _f === void 0 ? [] : _f, _g = _a.Optgroup, Optgroup$1 = _g === void 0 ? Optgroup : _g, dataTestId = _a.dataTestId, emptyPlaceholder = _a.emptyPlaceholder, _h = _a.visibleOptions, visibleOptions = _h === void 0 ? DEFAULT_VISIBLE_OPTIONS : _h, onScroll = _a.onScroll, open = _a.open, header = _a.header, footer = _a.footer, _j = _a.showFooter, showFooter = _j === void 0 ? true : _j, nativeScrollbarProp = _a.nativeScrollbar, _k = _a.flatOptions, flatOptions = _k === void 0 ? [] : _k, setHighlightedIndex = _a.setHighlightedIndex, selectedItems = _a.selectedItems, search = _a.search, setSelectedItems = _a.setSelectedItems, multiple = _a.multiple, _l = _a.limitDynamicOptionGroupSize, limitDynamicOptionGroupSize = _l === void 0 ? false : _l, client = _a.client, scrollableNodeClassName = _a.scrollableNodeClassName, contentNodeClassName = _a.contentNodeClassName, listNodeClassName = _a.listNodeClassName;
|
|
20
|
+
var actualOptionsCount = limitDynamicOptionGroupSize && options.length > 0;
|
|
21
|
+
var listRef = useRef(null);
|
|
22
|
+
var scrollableNodeRef = useRef(null);
|
|
23
|
+
var _m = useVisibleOptions({
|
|
24
|
+
visibleOptions: visibleOptions,
|
|
25
|
+
listRef: listRef,
|
|
26
|
+
open: open,
|
|
27
|
+
options: options,
|
|
28
|
+
actualOptionsCount: actualOptionsCount,
|
|
29
|
+
size: actualOptionsCount ? size : undefined,
|
|
30
|
+
}), maxHeight = _m[1];
|
|
31
|
+
var noOptions = options.length === 0;
|
|
32
|
+
var _o = useState(true), scrollTop = _o[0], setScrollTop = _o[1];
|
|
33
|
+
var _p = useState(false), scrollBottom = _p[0], setScrollBottom = _p[1];
|
|
22
34
|
var nativeScrollbar = useNativeScrollbar({
|
|
23
35
|
nativeScrollbar: nativeScrollbarProp,
|
|
24
36
|
client: client,
|
|
25
37
|
});
|
|
26
|
-
var handleScroll =
|
|
38
|
+
var handleScroll = function (event) {
|
|
27
39
|
var scrolledToHeader = event.currentTarget.scrollTop <= 0;
|
|
28
40
|
var scrolledToFooter = event.currentTarget.scrollHeight - event.currentTarget.offsetHeight <=
|
|
29
41
|
event.currentTarget.scrollTop;
|
|
30
42
|
setScrollTop(scrolledToHeader);
|
|
31
43
|
setScrollBottom(scrolledToFooter);
|
|
32
44
|
onScroll === null || onScroll === void 0 ? void 0 : onScroll(event);
|
|
33
|
-
}
|
|
45
|
+
};
|
|
34
46
|
var renderOption = function (option, index) { return (React.createElement(Option, __assign({ key: option.key }, getOptionProps(option, index)))); };
|
|
35
|
-
var listRef = useRef(null);
|
|
36
|
-
var scrollbarRef = useRef(null);
|
|
37
47
|
var counter = createCounter();
|
|
38
48
|
var renderGroup = function (group) {
|
|
39
49
|
var groupSelectedItems = selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.filter(function (_a) {
|
|
@@ -49,59 +59,28 @@ var OptionsList = forwardRef(function (_a, ref) {
|
|
|
49
59
|
};
|
|
50
60
|
return (React.createElement(Optgroup$1, __assign({ className: optionGroupClassName, label: group.label, key: group.label, size: size, options: group.options, selectedItems: groupSelectedItems, setSelectedItems: handleSelectedItems, search: search, multiple: multiple }, groupOptionProps), group.options.map(function (option) { return renderOption(option, counter()); })));
|
|
51
61
|
};
|
|
52
|
-
var actualOptionsCount = limitDynamicOptionGroupSize && options.length > 0;
|
|
53
|
-
var _p = useVisibleOptions({
|
|
54
|
-
visibleOptions: visibleOptions,
|
|
55
|
-
listRef: listRef,
|
|
56
|
-
open: open,
|
|
57
|
-
options: options,
|
|
58
|
-
actualOptionsCount: actualOptionsCount,
|
|
59
|
-
size: actualOptionsCount
|
|
60
|
-
? (function () {
|
|
61
|
-
switch (typeof size) {
|
|
62
|
-
case 'string':
|
|
63
|
-
throw new Error('OptionsList with `limitDynamicOptionGroupSize` enabled needs a `size` with number type');
|
|
64
|
-
default:
|
|
65
|
-
return size;
|
|
66
|
-
}
|
|
67
|
-
})()
|
|
68
|
-
: undefined,
|
|
69
|
-
}), measured = _p[0], maxHeight = _p[1];
|
|
70
62
|
if (options.length === 0 && !emptyPlaceholder && !header && !footer) {
|
|
71
63
|
return null;
|
|
72
64
|
}
|
|
73
|
-
var renderListItems = function () { return (React.createElement(React.Fragment, null,
|
|
74
|
-
options.map(function (option) {
|
|
75
|
-
return isGroup(option) ? renderGroup(option) : renderOption(option, counter());
|
|
76
|
-
}),
|
|
77
|
-
emptyPlaceholder && options.length === 0 && (React.createElement("div", { className: styles.emptyPlaceholder }, emptyPlaceholder)))); };
|
|
78
|
-
var renderWithCustomScrollbar = function () {
|
|
79
|
-
var _a, _b;
|
|
80
|
-
var scrollableNodeProps = {
|
|
81
|
-
onScroll: handleScroll,
|
|
82
|
-
'data-test-id': dataTestId,
|
|
83
|
-
ref: ref,
|
|
84
|
-
};
|
|
85
|
-
return (React.createElement(Scrollbar, { className: cn(styles.scrollable, scrollbarClassName), verticalBarClassName: cn(styles.verticalBar, (_a = {},
|
|
86
|
-
_a[styles.verticalBarWithHeader] = Boolean(header),
|
|
87
|
-
_a[styles.verticalBarWithFooter] = Boolean(footer),
|
|
88
|
-
_a)), ref: scrollbarRef, style: { maxHeight: maxHeight }, horizontalAutoStretch: optionsListWidth === 'content', scrollableNodeProps: scrollableNodeProps, contentNodeProps: { ref: listRef }, maskProps: {
|
|
89
|
-
/*
|
|
90
|
-
* Для корректного подсчета высоты опций(иначе для optionsListWidth: 'field'
|
|
91
|
-
* высота опции всегда будет равна высоте одной строчки)
|
|
92
|
-
*/
|
|
93
|
-
className: cn((_b = {},
|
|
94
|
-
_b[styles.mask] = optionsListWidth === 'content' && !measured,
|
|
95
|
-
_b)),
|
|
96
|
-
} }, renderListItems()));
|
|
97
|
-
};
|
|
98
|
-
var renderWithNativeScrollbar = function () { return (React.createElement("div", { className: cn(styles.scrollable, scrollbarClassName), ref: mergeRefs([listRef, ref]), onScroll: handleScroll, style: { maxHeight: maxHeight } }, renderListItems())); };
|
|
99
65
|
var resetHighlightedIndex = function () { return setHighlightedIndex === null || setHighlightedIndex === void 0 ? void 0 : setHighlightedIndex(-1); };
|
|
100
66
|
return (React.createElement("div", __assign({}, (nativeScrollbar && { 'data-test-id': dataTestId }), { className: cn(styles.optionsList, styles["size-".concat(size)], className) }),
|
|
101
67
|
header && (React.createElement("div", { className: cn(styles.optionsListHeader, (_b = {},
|
|
102
68
|
_b[styles.headerHighlighted] = !scrollTop,
|
|
103
69
|
_b)), onMouseEnter: resetHighlightedIndex }, header)),
|
|
104
|
-
|
|
70
|
+
!noOptions && (React.createElement(ScrollbarPrivate, { native: nativeScrollbar, className: scrollbarClassName, style: { maxHeight: maxHeight }, scrollableNodeProps: {
|
|
71
|
+
ref: mergeRefs([scrollableNodeRef, ref]),
|
|
72
|
+
onScroll: handleScroll,
|
|
73
|
+
className: scrollableNodeClassName,
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
75
|
+
// @ts-expect-error
|
|
76
|
+
'data-test-id': nativeScrollbar ? undefined : dataTestId,
|
|
77
|
+
}, contentNodeProps: { className: contentNodeClassName } },
|
|
78
|
+
React.createElement("div", { className: listNodeClassName, ref: listRef }, options.map(function (option) {
|
|
79
|
+
return isGroup(option)
|
|
80
|
+
? renderGroup(option)
|
|
81
|
+
: renderOption(option, counter());
|
|
82
|
+
})))),
|
|
83
|
+
emptyPlaceholder && noOptions && (React.createElement("div", { className: styles.emptyPlaceholder }, emptyPlaceholder)),
|
|
105
84
|
showFooter && footer && (React.createElement("div", { onMouseEnter: resetHighlightedIndex, className: cn(styles.optionsListFooter, footerClassName, (_c = {},
|
|
106
85
|
_c[styles.withBorder] = visibleOptions &&
|
|
107
86
|
flatOptions.length > visibleOptions &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Component.js","sources":["../../../src/components/options-list/Component.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useRef, useState } from 'react';\nimport mergeRefs from 'react-merge-refs';\nimport cn from 'classnames';\n\nimport { Scrollbar } from '@alfalab/core-components-scrollbar';\n\nimport { DEFAULT_VISIBLE_OPTIONS } from '../../consts';\nimport { useNativeScrollbar } from '../../hooks/use-native-scrollbar';\nimport { type GroupShape, type OptionShape, type OptionsListProps } from '../../typings';\nimport { isGroup, useVisibleOptions } from '../../utils';\nimport { Optgroup as DefaultOptgroup } from '../optgroup';\n\nimport styles from './index.module.css';\n\nconst createCounter = () => {\n let count = 0;\n\n // eslint-disable-next-line no-plusplus\n return () => count++;\n};\n\nexport const OptionsList = forwardRef<HTMLDivElement, OptionsListProps>(\n (\n {\n size = 48,\n className,\n optionGroupClassName,\n footerClassName,\n scrollbarClassName,\n Option,\n getOptionProps,\n groupOptionProps = {},\n options = [],\n Optgroup = DefaultOptgroup,\n dataTestId,\n emptyPlaceholder,\n visibleOptions = DEFAULT_VISIBLE_OPTIONS,\n onScroll,\n open,\n header,\n footer,\n showFooter = true,\n optionsListWidth,\n nativeScrollbar: nativeScrollbarProp,\n flatOptions = [],\n setHighlightedIndex,\n selectedItems,\n search,\n setSelectedItems,\n multiple,\n limitDynamicOptionGroupSize = false,\n client,\n },\n ref,\n ) => {\n const [scrollTop, setScrollTop] = useState(true);\n const [scrollBottom, setScrollBottom] = useState(false);\n\n const nativeScrollbar = useNativeScrollbar({\n nativeScrollbar: nativeScrollbarProp,\n client,\n });\n\n const handleScroll = useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n const scrolledToHeader = event.currentTarget.scrollTop <= 0;\n const scrolledToFooter =\n event.currentTarget.scrollHeight - event.currentTarget.offsetHeight <=\n event.currentTarget.scrollTop;\n\n setScrollTop(scrolledToHeader);\n setScrollBottom(scrolledToFooter);\n\n onScroll?.(event);\n },\n [onScroll],\n );\n\n const renderOption = (option: OptionShape, index: number) => (\n <Option key={option.key} {...getOptionProps(option, index)} />\n );\n\n const listRef = useRef<HTMLDivElement>(null);\n const scrollbarRef = useRef<HTMLDivElement>(null);\n const counter = createCounter();\n const renderGroup = (group: GroupShape) => {\n const groupSelectedItems = selectedItems?.filter(({ key: selectedItemKey }) =>\n group.options.some((option) => option.key === selectedItemKey),\n );\n const handleSelectedItems = (items: OptionShape[]) => {\n setSelectedItems(\n (\n selectedItems?.filter(\n ({ key: selectedItemKey }) =>\n !group.options.some((option) => option.key === selectedItemKey),\n ) ?? []\n ).concat(items),\n );\n };\n\n return (\n <Optgroup\n className={optionGroupClassName}\n label={group.label}\n key={group.label}\n size={size}\n options={group.options}\n selectedItems={groupSelectedItems}\n setSelectedItems={handleSelectedItems}\n search={search}\n multiple={multiple}\n {...groupOptionProps}\n >\n {group.options.map((option) => renderOption(option, counter()))}\n </Optgroup>\n );\n };\n\n const actualOptionsCount = limitDynamicOptionGroupSize && options.length > 0;\n\n const [measured, maxHeight] = useVisibleOptions({\n visibleOptions,\n listRef,\n open,\n options,\n actualOptionsCount,\n size: actualOptionsCount\n ? (() => {\n switch (typeof size) {\n case 'string':\n throw new Error(\n 'OptionsList with `limitDynamicOptionGroupSize` enabled needs a `size` with number type',\n );\n default:\n return size;\n }\n })()\n : undefined,\n });\n\n if (options.length === 0 && !emptyPlaceholder && !header && !footer) {\n return null;\n }\n\n const renderListItems = () => (\n <React.Fragment>\n {options.map((option) =>\n isGroup(option) ? renderGroup(option) : renderOption(option, counter()),\n )}\n\n {emptyPlaceholder && options.length === 0 && (\n <div className={styles.emptyPlaceholder}>{emptyPlaceholder}</div>\n )}\n </React.Fragment>\n );\n\n const renderWithCustomScrollbar = () => {\n const scrollableNodeProps = {\n onScroll: handleScroll,\n 'data-test-id': dataTestId,\n ref: ref as React.RefObject<HTMLDivElement>,\n };\n\n return (\n <Scrollbar\n className={cn(styles.scrollable, scrollbarClassName)}\n verticalBarClassName={cn(styles.verticalBar, {\n [styles.verticalBarWithHeader]: Boolean(header),\n [styles.verticalBarWithFooter]: Boolean(footer),\n })}\n ref={scrollbarRef}\n style={{ maxHeight }}\n horizontalAutoStretch={optionsListWidth === 'content'}\n scrollableNodeProps={scrollableNodeProps}\n contentNodeProps={{ ref: listRef }}\n maskProps={{\n /*\n * Для корректного подсчета высоты опций(иначе для optionsListWidth: 'field'\n * высота опции всегда будет равна высоте одной строчки)\n */\n className: cn({\n [styles.mask]: optionsListWidth === 'content' && !measured,\n }),\n }}\n >\n {renderListItems()}\n </Scrollbar>\n );\n };\n\n const renderWithNativeScrollbar = () => (\n <div\n className={cn(styles.scrollable, scrollbarClassName)}\n ref={mergeRefs([listRef, ref])}\n onScroll={handleScroll}\n style={{ maxHeight }}\n >\n {renderListItems()}\n </div>\n );\n\n const resetHighlightedIndex = () => setHighlightedIndex?.(-1);\n\n return (\n <div\n {...(nativeScrollbar && { 'data-test-id': dataTestId })}\n className={cn(styles.optionsList, styles[`size-${size}`], className)}\n >\n {header && (\n <div\n className={cn(styles.optionsListHeader, {\n [styles.headerHighlighted]: !scrollTop,\n })}\n onMouseEnter={resetHighlightedIndex}\n >\n {header}\n </div>\n )}\n\n {nativeScrollbar ? renderWithNativeScrollbar() : renderWithCustomScrollbar()}\n\n {showFooter && footer && (\n <div\n onMouseEnter={resetHighlightedIndex}\n className={cn(styles.optionsListFooter, footerClassName, {\n [styles.withBorder]:\n visibleOptions &&\n flatOptions.length > visibleOptions &&\n !scrollBottom,\n })}\n >\n {footer}\n </div>\n )}\n </div>\n );\n },\n);\n"],"names":["Optgroup","DefaultOptgroup"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Component.js","sources":["../../../src/components/options-list/Component.tsx"],"sourcesContent":["import React, { forwardRef, useRef, useState } from 'react';\nimport mergeRefs from 'react-merge-refs';\nimport cn from 'classnames';\n\nimport { ScrollbarPrivate } from '@alfalab/core-components-scrollbar-private';\n\nimport { DEFAULT_VISIBLE_OPTIONS } from '../../consts';\nimport { useNativeScrollbar } from '../../hooks/use-native-scrollbar';\nimport { type GroupShape, type OptionShape, type OptionsListProps } from '../../typings';\nimport { isGroup, useVisibleOptions } from '../../utils';\nimport { Optgroup as DefaultOptgroup } from '../optgroup';\n\nimport styles from './index.module.css';\n\nconst createCounter = () => {\n let count = 0;\n\n // eslint-disable-next-line no-plusplus\n return () => count++;\n};\n\nexport const OptionsList = forwardRef<HTMLDivElement, OptionsListProps>(\n (\n {\n size = 48,\n className,\n optionGroupClassName,\n footerClassName,\n scrollbarClassName,\n Option,\n getOptionProps,\n groupOptionProps = {},\n options = [],\n Optgroup = DefaultOptgroup,\n dataTestId,\n emptyPlaceholder,\n visibleOptions = DEFAULT_VISIBLE_OPTIONS,\n onScroll,\n open,\n header,\n footer,\n showFooter = true,\n nativeScrollbar: nativeScrollbarProp,\n flatOptions = [],\n setHighlightedIndex,\n selectedItems,\n search,\n setSelectedItems,\n multiple,\n limitDynamicOptionGroupSize = false,\n client,\n scrollableNodeClassName,\n contentNodeClassName,\n listNodeClassName,\n },\n ref,\n ) => {\n const actualOptionsCount = limitDynamicOptionGroupSize && options.length > 0;\n const listRef = useRef<HTMLDivElement>(null);\n const scrollableNodeRef = useRef<HTMLDivElement>(null);\n const [, maxHeight] = useVisibleOptions({\n visibleOptions,\n listRef,\n open,\n options,\n actualOptionsCount,\n size: actualOptionsCount ? size : undefined,\n });\n const noOptions = options.length === 0;\n const [scrollTop, setScrollTop] = useState(true);\n const [scrollBottom, setScrollBottom] = useState(false);\n\n const nativeScrollbar = useNativeScrollbar({\n nativeScrollbar: nativeScrollbarProp,\n client,\n });\n\n const handleScroll: React.MouseEventHandler<HTMLDivElement> = (event) => {\n const scrolledToHeader = event.currentTarget.scrollTop <= 0;\n const scrolledToFooter =\n event.currentTarget.scrollHeight - event.currentTarget.offsetHeight <=\n event.currentTarget.scrollTop;\n\n setScrollTop(scrolledToHeader);\n setScrollBottom(scrolledToFooter);\n\n onScroll?.(event);\n };\n\n const renderOption = (option: OptionShape, index: number) => (\n <Option key={option.key} {...getOptionProps(option, index)} />\n );\n\n const counter = createCounter();\n const renderGroup = (group: GroupShape) => {\n const groupSelectedItems = selectedItems?.filter(({ key: selectedItemKey }) =>\n group.options.some((option) => option.key === selectedItemKey),\n );\n const handleSelectedItems = (items: OptionShape[]) => {\n setSelectedItems(\n (\n selectedItems?.filter(\n ({ key: selectedItemKey }) =>\n !group.options.some((option) => option.key === selectedItemKey),\n ) ?? []\n ).concat(items),\n );\n };\n\n return (\n <Optgroup\n className={optionGroupClassName}\n label={group.label}\n key={group.label}\n size={size}\n options={group.options}\n selectedItems={groupSelectedItems}\n setSelectedItems={handleSelectedItems}\n search={search}\n multiple={multiple}\n {...groupOptionProps}\n >\n {group.options.map((option) => renderOption(option, counter()))}\n </Optgroup>\n );\n };\n\n if (options.length === 0 && !emptyPlaceholder && !header && !footer) {\n return null;\n }\n\n const resetHighlightedIndex = () => setHighlightedIndex?.(-1);\n\n return (\n <div\n {...(nativeScrollbar && { 'data-test-id': dataTestId })}\n className={cn(styles.optionsList, styles[`size-${size}`], className)}\n >\n {header && (\n <div\n className={cn(styles.optionsListHeader, {\n [styles.headerHighlighted]: !scrollTop,\n })}\n onMouseEnter={resetHighlightedIndex}\n >\n {header}\n </div>\n )}\n\n {!noOptions && (\n <ScrollbarPrivate\n native={nativeScrollbar}\n className={scrollbarClassName}\n style={{ maxHeight }}\n scrollableNodeProps={{\n ref: mergeRefs([scrollableNodeRef, ref]),\n onScroll: handleScroll,\n className: scrollableNodeClassName,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n 'data-test-id': nativeScrollbar ? undefined : dataTestId,\n }}\n contentNodeProps={{ className: contentNodeClassName }}\n >\n <div className={listNodeClassName} ref={listRef}>\n {options.map((option) =>\n isGroup(option)\n ? renderGroup(option)\n : renderOption(option, counter()),\n )}\n </div>\n </ScrollbarPrivate>\n )}\n\n {emptyPlaceholder && noOptions && (\n <div className={styles.emptyPlaceholder}>{emptyPlaceholder}</div>\n )}\n\n {showFooter && footer && (\n <div\n onMouseEnter={resetHighlightedIndex}\n className={cn(styles.optionsListFooter, footerClassName, {\n [styles.withBorder]:\n visibleOptions &&\n flatOptions.length > visibleOptions &&\n !scrollBottom,\n })}\n >\n {footer}\n </div>\n )}\n </div>\n );\n },\n);\n"],"names":["Optgroup","DefaultOptgroup"],"mappings":"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"}
|
|
@@ -12,60 +12,40 @@
|
|
|
12
12
|
--gap-24: var(--gap-xl);
|
|
13
13
|
}
|
|
14
14
|
:root {
|
|
15
|
-
--select-options-list-scrollbar-gap: var(--gap-12);
|
|
16
15
|
--select-options-list-empty-placeholder-color: var(--color-light-text-secondary);
|
|
17
16
|
}
|
|
18
|
-
.
|
|
17
|
+
.select__optionsList_a23kz {
|
|
19
18
|
width: 100%;
|
|
20
19
|
outline: none;
|
|
21
20
|
box-sizing: border-box;
|
|
22
21
|
position: relative;
|
|
23
22
|
}
|
|
24
|
-
.
|
|
25
|
-
overflow: auto;
|
|
26
|
-
width: 100%;
|
|
27
|
-
}
|
|
28
|
-
.select__optionsList_hane5 .select__scrollable_hane5 .select__verticalBar_hane5.select__verticalBar_hane5 {
|
|
29
|
-
top: var(--select-options-list-scrollbar-gap);
|
|
30
|
-
height: calc(100% - 2 * var(--select-options-list-scrollbar-gap));
|
|
31
|
-
}
|
|
32
|
-
.select__optionsList_hane5 .select__scrollable_hane5 .select__verticalBar_hane5.select__verticalBar_hane5.select__verticalBarWithHeader_hane5 {
|
|
33
|
-
top: 0;
|
|
34
|
-
height: calc(100% - var(--select-options-list-scrollbar-gap));
|
|
35
|
-
}
|
|
36
|
-
.select__optionsList_hane5 .select__scrollable_hane5 .select__verticalBar_hane5.select__verticalBar_hane5.select__verticalBarWithFooter_hane5 {
|
|
37
|
-
top: var(--select-options-list-scrollbar-gap);
|
|
38
|
-
height: calc(100% - var(--select-options-list-scrollbar-gap));
|
|
39
|
-
}
|
|
40
|
-
.select__optionsList_hane5 .select__scrollable_hane5 .select__verticalBar_hane5.select__verticalBar_hane5.select__verticalBarWithHeader_hane5.select__verticalBarWithFooter_hane5 {
|
|
41
|
-
top: 0;
|
|
42
|
-
height: 100%;
|
|
43
|
-
}
|
|
44
|
-
.select__optionsListHeader_hane5 {
|
|
23
|
+
.select__optionsListHeader_a23kz {
|
|
45
24
|
box-sizing: border-box;
|
|
46
25
|
border-bottom: 1px solid transparent;
|
|
47
|
-
transition: border-color 0.2s ease;
|
|
48
26
|
}
|
|
49
|
-
.
|
|
27
|
+
.select__optionsListHeader_a23kz.select__headerHighlighted_a23kz {
|
|
50
28
|
border-bottom-color: var(--color-light-neutral-300);
|
|
51
29
|
}
|
|
52
|
-
.
|
|
30
|
+
.select__optionsListFooter_a23kz {
|
|
53
31
|
position: sticky;
|
|
54
32
|
bottom: var(--gap-0);
|
|
55
33
|
box-sizing: border-box;
|
|
56
34
|
border-top: 1px solid transparent;
|
|
57
|
-
transition: border-color 0.2s ease;
|
|
58
35
|
}
|
|
59
|
-
.
|
|
36
|
+
.select__optionsListFooter_a23kz.select__withBorder_a23kz {
|
|
60
37
|
border-top-color: var(--color-light-neutral-300);
|
|
61
38
|
}
|
|
62
|
-
.
|
|
63
|
-
min-width: 4000px;
|
|
64
|
-
}
|
|
65
|
-
.select__emptyPlaceholder_hane5 {
|
|
39
|
+
.select__emptyPlaceholder_a23kz {
|
|
66
40
|
padding: var(--gap-16) var(--gap-12);
|
|
67
41
|
color: var(--select-options-list-empty-placeholder-color);
|
|
42
|
+
flex: 1;
|
|
68
43
|
}
|
|
69
|
-
.select__size-
|
|
44
|
+
.select__size-64_a23kz .select__emptyPlaceholder_a23kz,
|
|
45
|
+
.select__size-72_a23kz .select__emptyPlaceholder_a23kz {
|
|
70
46
|
padding: var(--gap-24) var(--gap-16);
|
|
71
47
|
}
|
|
48
|
+
.select__list_a23kz {
|
|
49
|
+
will-change: transform;
|
|
50
|
+
height: auto;
|
|
51
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './index.css';
|
|
2
2
|
|
|
3
|
-
var styles = {"optionsList":"
|
|
3
|
+
var styles = {"optionsList":"select__optionsList_a23kz","optionsListHeader":"select__optionsListHeader_a23kz","headerHighlighted":"select__headerHighlighted_a23kz","optionsListFooter":"select__optionsListFooter_a23kz","withBorder":"select__withBorder_a23kz","emptyPlaceholder":"select__emptyPlaceholder_a23kz","size-64":"select__size-64_a23kz","size-72":"select__size-72_a23kz","list":"select__list_a23kz"};
|
|
4
4
|
|
|
5
5
|
export { styles as default };
|
|
6
6
|
//# sourceMappingURL=index.module.css.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.module.css.js","sources":["../../src/components/options-list/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/index.css';\n@import '../../vars.css';\n\n.optionsList {\n width: 100%;\n outline: none;\n box-sizing: border-box;\n position: relative;\n
|
|
1
|
+
{"version":3,"file":"index.module.css.js","sources":["../../src/components/options-list/index.module.css"],"sourcesContent":["@import '@alfalab/core-components-vars/src/index.css';\n@import '../../vars.css';\n\n.optionsList {\n width: 100%;\n outline: none;\n box-sizing: border-box;\n position: relative;\n}\n\n.optionsListHeader {\n box-sizing: border-box;\n border-bottom: 1px solid transparent;\n\n &.headerHighlighted {\n border-bottom-color: var(--color-light-neutral-300);\n }\n}\n\n.optionsListFooter {\n position: sticky;\n bottom: var(--gap-0);\n box-sizing: border-box;\n border-top: 1px solid transparent;\n\n &.withBorder {\n border-top-color: var(--color-light-neutral-300);\n }\n}\n\n.emptyPlaceholder {\n padding: var(--gap-16) var(--gap-12);\n color: var(--select-options-list-empty-placeholder-color);\n flex: 1; /* needed in mobile */\n}\n\n.size-64 .emptyPlaceholder,\n.size-72 .emptyPlaceholder {\n padding: var(--gap-24) var(--gap-16);\n}\n\n.list {\n will-change: transform;\n height: auto;\n}\n"],"names":[],"mappings":";;AAEgB,aAAe,CAAC,aAAa,CAAC,2BAA2B,CAAC,mBAAmB,CAAC,iCAAiC,CAAC,mBAAmB,CAAC,iCAAiC,CAAC,mBAAmB,CAAC,iCAAiC,CAAC,YAAY,CAAC,0BAA0B,CAAC,kBAAkB,CAAC,gCAAgC,CAAC,SAAS,CAAC,uBAAuB,CAAC,SAAS,CAAC,uBAAuB,CAAC,MAAM,CAAC,oBAAoB,CAAC;;;;"}
|
|
@@ -33,4 +33,8 @@ export declare const VirtualOptionsList: React.ForwardRefExoticComponent<Pick<im
|
|
|
33
33
|
search?: string;
|
|
34
34
|
multiple?: boolean;
|
|
35
35
|
limitDynamicOptionGroupSize?: import("../../typings").BaseSelectProps["limitDynamicOptionGroupSize"];
|
|
36
|
+
scrollableNodeClassName?: string;
|
|
37
|
+
contentNodeClassName?: string;
|
|
38
|
+
listNodeClassName?: string;
|
|
39
|
+
ctrlRef?: React.Ref<import("../../typings").OptionsListController>;
|
|
36
40
|
} & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -1,26 +1,43 @@
|
|
|
1
1
|
import { __assign } from 'tslib';
|
|
2
|
-
import React, { forwardRef, useRef, useState, useEffect, useMemo } from 'react';
|
|
3
|
-
import mergeRefs from 'react-merge-refs';
|
|
2
|
+
import React, { forwardRef, useRef, useState, useEffect, useImperativeHandle, useMemo } from 'react';
|
|
4
3
|
import { useVirtual } from 'react-virtual';
|
|
5
4
|
import cn from 'classnames';
|
|
6
|
-
import {
|
|
5
|
+
import { ScrollbarPrivate } from '@alfalab/core-components-scrollbar-private/esm';
|
|
6
|
+
import { getElementWindow } from '@alfalab/core-components-shared/esm';
|
|
7
7
|
import { DEFAULT_VISIBLE_OPTIONS } from '../../consts.js';
|
|
8
8
|
import { useNativeScrollbar } from '../../hooks/use-native-scrollbar.js';
|
|
9
|
-
import { usePrevious,
|
|
9
|
+
import { usePrevious, useVirtualVisibleOptions, isGroup } from '../../utils.js';
|
|
10
10
|
import { Optgroup } from '../optgroup/Component.js';
|
|
11
|
-
import styles from '
|
|
11
|
+
import styles from '../options-list/index.module.css.js';
|
|
12
12
|
|
|
13
13
|
var VirtualOptionsList = forwardRef(function (_a, ref) {
|
|
14
|
-
var _b;
|
|
15
|
-
var
|
|
14
|
+
var _b, _c;
|
|
15
|
+
var _d;
|
|
16
|
+
var _e = _a.size, size = _e === void 0 ? 48 : _e, _f = _a.flatOptions, flatOptions = _f === void 0 ? [] : _f, _g = _a.highlightedIndex, highlightedIndex = _g === void 0 ? -1 : _g, optionGroupClassName = _a.optionGroupClassName, className = _a.className, getOptionProps = _a.getOptionProps, _h = _a.groupOptionProps, groupOptionProps = _h === void 0 ? {} : _h, Option = _a.Option, open = _a.open, _j = _a.options, options = _j === void 0 ? [] : _j, _k = _a.Optgroup, Optgroup$1 = _k === void 0 ? Optgroup : _k, dataTestId = _a.dataTestId, emptyPlaceholder = _a.emptyPlaceholder, _l = _a.visibleOptions, visibleOptions = _l === void 0 ? DEFAULT_VISIBLE_OPTIONS : _l, header = _a.header, footer = _a.footer, _m = _a.showFooter, showFooter = _m === void 0 ? true : _m, onScroll = _a.onScroll, nativeScrollbarProp = _a.nativeScrollbar, setHighlightedIndex = _a.setHighlightedIndex, selectedItems = _a.selectedItems, setSelectedItems = _a.setSelectedItems, search = _a.search, multiple = _a.multiple, scrollbarClassName = _a.scrollbarClassName, client = _a.client, scrollableNodeClassName = _a.scrollableNodeClassName, contentNodeClassName = _a.contentNodeClassName, listNodeClassName = _a.listNodeClassName, footerClassName = _a.footerClassName, ctrlRef = _a.ctrlRef;
|
|
16
17
|
var listRef = useRef(null);
|
|
17
|
-
var
|
|
18
|
-
var
|
|
19
|
-
var
|
|
18
|
+
var scrollableNodeRef = useRef(null);
|
|
19
|
+
var noOptions = options.length === 0;
|
|
20
|
+
var _o = useState(true), scrollTop = _o[0], setScrollTop = _o[1];
|
|
21
|
+
var _p = useState(false), scrollBottom = _p[0], setScrollBottom = _p[1];
|
|
22
|
+
var _q = useState(''), visibleOptionsInvalidateKey = _q[0], setVisibleOptionsInvalidateKey = _q[1];
|
|
20
23
|
var prevHighlightedIndex = usePrevious(highlightedIndex) || -1;
|
|
21
24
|
var rowVirtualizer = useVirtual({
|
|
25
|
+
scrollToFn: function (offset, defaultScrollToFn) {
|
|
26
|
+
var delta = 0;
|
|
27
|
+
var list = listRef.current;
|
|
28
|
+
if (list) {
|
|
29
|
+
var win_1 = getElementWindow(list);
|
|
30
|
+
delta = ['::before', '::after']
|
|
31
|
+
.map(function (pseudo) {
|
|
32
|
+
var paddingTop = win_1.getComputedStyle(list, pseudo).paddingTop;
|
|
33
|
+
return parseFloat(paddingTop) || 0;
|
|
34
|
+
})
|
|
35
|
+
.reduce(function (a, b) { return a + b; });
|
|
36
|
+
}
|
|
37
|
+
defaultScrollToFn === null || defaultScrollToFn === void 0 ? void 0 : defaultScrollToFn(offset === 0 ? offset : offset + delta);
|
|
38
|
+
},
|
|
22
39
|
size: flatOptions.length,
|
|
23
|
-
parentRef:
|
|
40
|
+
parentRef: ref || scrollableNodeRef,
|
|
24
41
|
overscan: 15,
|
|
25
42
|
});
|
|
26
43
|
var nativeScrollbar = useNativeScrollbar({
|
|
@@ -34,20 +51,12 @@ var VirtualOptionsList = forwardRef(function (_a, ref) {
|
|
|
34
51
|
}
|
|
35
52
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
36
53
|
}, [open]);
|
|
37
|
-
|
|
38
|
-
useEffect(function () {
|
|
39
|
-
if (highlightedIndex === -1)
|
|
40
|
-
return;
|
|
41
|
-
if (!rowVirtualizer.virtualItems.some(function (option) { return option.index === highlightedIndex; })) {
|
|
42
|
-
rowVirtualizer.scrollToIndex(highlightedIndex, { align: 'end' });
|
|
43
|
-
}
|
|
44
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
45
|
-
}, [highlightedIndex]);
|
|
54
|
+
useImperativeHandle(ctrlRef, function () { return rowVirtualizer; }, [rowVirtualizer]);
|
|
46
55
|
// Циклическая навигация
|
|
47
56
|
useEffect(function () {
|
|
48
57
|
var notDisabled = function (option) { return !option.disabled; };
|
|
49
58
|
var firstNonDisabled = flatOptions.findIndex(notDisabled);
|
|
50
|
-
var lastNonDisabled =
|
|
59
|
+
var lastNonDisabled = flatOptions.findLastIndex(notDisabled);
|
|
51
60
|
if (prevHighlightedIndex <= firstNonDisabled &&
|
|
52
61
|
highlightedIndex === flatOptions.length - 1) {
|
|
53
62
|
rowVirtualizer.scrollToIndex(lastNonDisabled);
|
|
@@ -70,11 +79,10 @@ var VirtualOptionsList = forwardRef(function (_a, ref) {
|
|
|
70
79
|
.join('_'));
|
|
71
80
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
72
81
|
}, [rowVirtualizer.virtualItems.length, flatOptions]);
|
|
73
|
-
useVirtualVisibleOptions({
|
|
82
|
+
var maxHeight = useVirtualVisibleOptions({
|
|
74
83
|
visibleOptions: visibleOptions,
|
|
75
84
|
invalidate: visibleOptionsInvalidateKey,
|
|
76
85
|
listRef: listRef,
|
|
77
|
-
styleTargetRef: nativeScrollbar ? parentRef : scrollbarRef,
|
|
78
86
|
open: open,
|
|
79
87
|
});
|
|
80
88
|
// Т.к. рендерится плоский список, необходимо знать индекс, когда начинается новая группа
|
|
@@ -91,9 +99,16 @@ var VirtualOptionsList = forwardRef(function (_a, ref) {
|
|
|
91
99
|
return acc;
|
|
92
100
|
}, {});
|
|
93
101
|
}, [options]);
|
|
102
|
+
var handleScroll = function (event) {
|
|
103
|
+
var scrolledToHeader = event.currentTarget.scrollTop <= 0;
|
|
104
|
+
var scrolledToFooter = event.currentTarget.scrollHeight - event.currentTarget.offsetHeight <=
|
|
105
|
+
event.currentTarget.scrollTop;
|
|
106
|
+
setScrollTop(scrolledToHeader);
|
|
107
|
+
setScrollBottom(scrolledToFooter);
|
|
108
|
+
onScroll === null || onScroll === void 0 ? void 0 : onScroll(event);
|
|
109
|
+
};
|
|
94
110
|
var renderList = function () {
|
|
95
111
|
return rowVirtualizer.virtualItems.map(function (virtualRow) {
|
|
96
|
-
var _a;
|
|
97
112
|
var option = flatOptions[virtualRow.index];
|
|
98
113
|
var renderGroup = function () {
|
|
99
114
|
var group = options[groupStartIndexes[virtualRow.index]];
|
|
@@ -112,39 +127,38 @@ var VirtualOptionsList = forwardRef(function (_a, ref) {
|
|
|
112
127
|
};
|
|
113
128
|
return (React.createElement(Optgroup$1, __assign({ label: group.label, size: size, className: optionGroupClassName, options: group.options, selectedItems: groupSelectedItems, setSelectedItems: handleSelectedItems, search: search, multiple: multiple }, groupOptionProps)));
|
|
114
129
|
};
|
|
115
|
-
return (React.createElement("div", { key: virtualRow.index, ref: virtualRow.measureRef
|
|
116
|
-
_a[styles.highlighted] = highlightedIndex === virtualRow.index,
|
|
117
|
-
_a)), style: {
|
|
118
|
-
transform: "translateY(".concat(virtualRow.start, "px)"),
|
|
119
|
-
} },
|
|
130
|
+
return (React.createElement("div", { key: virtualRow.index, ref: virtualRow.measureRef },
|
|
120
131
|
renderGroup(),
|
|
121
132
|
!isGroup(option) && (React.createElement(Option, __assign({}, getOptionProps(option, virtualRow.index))))));
|
|
122
133
|
});
|
|
123
134
|
};
|
|
124
|
-
var contentNodeProps = {
|
|
125
|
-
className: styles.inner,
|
|
126
|
-
style: { height: "".concat(rowVirtualizer.totalSize, "px") },
|
|
127
|
-
ref: listRef,
|
|
128
|
-
};
|
|
129
|
-
var renderWithCustomScrollbar = function () { return (React.createElement(Scrollbar, { className: cn(styles.scrollable, scrollbarClassName), ref: scrollbarRef, horizontalAutoStretch: optionsListWidth === 'content', scrollableNodeProps: { onScroll: onScroll, ref: parentRef }, contentNodeProps: contentNodeProps }, renderList())); };
|
|
130
|
-
var renderWithNativeScrollbar = function () {
|
|
131
|
-
if (visibleOptions) {
|
|
132
|
-
return (React.createElement("div", { className: cn(styles.scrollable, scrollbarClassName), ref: mergeRefs([parentRef, ref]), onScroll: onScroll },
|
|
133
|
-
React.createElement("div", __assign({}, contentNodeProps), renderList())));
|
|
134
|
-
}
|
|
135
|
-
return React.createElement("div", __assign({}, contentNodeProps), renderList());
|
|
136
|
-
};
|
|
137
135
|
var resetHighlightedIndex = function () { return setHighlightedIndex === null || setHighlightedIndex === void 0 ? void 0 : setHighlightedIndex(-1); };
|
|
138
136
|
if (options.length === 0 && !emptyPlaceholder) {
|
|
139
137
|
return null;
|
|
140
138
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
139
|
+
var firstVirualRow = rowVirtualizer.virtualItems[0];
|
|
140
|
+
return (React.createElement("div", __assign({}, (nativeScrollbar && { 'data-test-id': dataTestId }), { className: cn(styles.optionsList, styles["size-".concat(size)], className) }),
|
|
141
|
+
header && (React.createElement("div", { className: cn(styles.optionsListHeader, (_b = {},
|
|
142
|
+
_b[styles.headerHighlighted] = !scrollTop,
|
|
143
|
+
_b)), onMouseEnter: resetHighlightedIndex }, header)),
|
|
144
|
+
!noOptions && (React.createElement(ScrollbarPrivate, { native: nativeScrollbar, className: scrollbarClassName, style: { maxHeight: maxHeight }, scrollableNodeProps: {
|
|
145
|
+
ref: scrollableNodeRef,
|
|
146
|
+
onScroll: handleScroll,
|
|
147
|
+
className: scrollableNodeClassName,
|
|
148
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
149
|
+
// @ts-expect-error
|
|
150
|
+
'data-test-id': nativeScrollbar ? undefined : dataTestId,
|
|
151
|
+
}, contentNodeProps: {
|
|
152
|
+
className: contentNodeClassName,
|
|
153
|
+
style: { minHeight: rowVirtualizer.totalSize },
|
|
154
|
+
} },
|
|
155
|
+
React.createElement("div", { className: cn(styles.list, listNodeClassName), ref: listRef, style: { transform: "translateY(".concat((_d = firstVirualRow === null || firstVirualRow === void 0 ? void 0 : firstVirualRow.start) !== null && _d !== void 0 ? _d : 0, "px)") } }, renderList()))),
|
|
156
|
+
emptyPlaceholder && noOptions && (React.createElement("div", { className: styles.emptyPlaceholder }, emptyPlaceholder)),
|
|
157
|
+
showFooter && footer && (React.createElement("div", { onMouseEnter: resetHighlightedIndex, className: cn(styles.optionsListFooter, footerClassName, (_c = {},
|
|
158
|
+
_c[styles.withBorder] = visibleOptions &&
|
|
159
|
+
flatOptions.length > visibleOptions &&
|
|
160
|
+
!scrollBottom,
|
|
161
|
+
_c)) }, footer))));
|
|
148
162
|
});
|
|
149
163
|
|
|
150
164
|
export { VirtualOptionsList };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Component.js","sources":["../../../src/components/virtual-options-list/Component.tsx"],"sourcesContent":["import React, { forwardRef, useEffect, useMemo, useRef, useState } from 'react';\nimport mergeRefs from 'react-merge-refs';\nimport { useVirtual } from 'react-virtual';\nimport cn from 'classnames';\n\nimport { Scrollbar } from '@alfalab/core-components-scrollbar';\n\nimport { DEFAULT_VISIBLE_OPTIONS } from '../../consts';\nimport { useNativeScrollbar } from '../../hooks/use-native-scrollbar';\nimport { type GroupShape, type OptionShape, type OptionsListProps } from '../../typings';\nimport { isGroup, lastIndexOf, usePrevious, useVirtualVisibleOptions } from '../../utils';\nimport { Optgroup as DefaultOptgroup } from '../optgroup';\n\nimport styles from './index.module.css';\n\nexport const VirtualOptionsList = forwardRef<HTMLDivElement, OptionsListProps>(\n (\n {\n size = 48,\n flatOptions = [],\n highlightedIndex = -1,\n optionGroupClassName,\n className,\n getOptionProps,\n groupOptionProps = {},\n Option,\n open,\n options = [],\n Optgroup = DefaultOptgroup,\n dataTestId,\n emptyPlaceholder,\n visibleOptions = DEFAULT_VISIBLE_OPTIONS,\n header,\n footer,\n showFooter = true,\n optionsListWidth,\n onScroll,\n nativeScrollbar: nativeScrollbarProp,\n setHighlightedIndex,\n selectedItems,\n setSelectedItems,\n search,\n multiple,\n scrollbarClassName,\n client,\n },\n ref,\n ) => {\n const listRef = useRef<HTMLDivElement>(null);\n const parentRef = useRef<HTMLDivElement>(null);\n const scrollbarRef = useRef<HTMLDivElement>(null);\n const [visibleOptionsInvalidateKey, setVisibleOptionsInvalidateKey] = useState('');\n const prevHighlightedIndex = usePrevious(highlightedIndex) || -1;\n\n const rowVirtualizer = useVirtual({\n size: flatOptions.length,\n parentRef: (ref || parentRef) as React.RefObject<HTMLDivElement>,\n overscan: 15,\n });\n\n const nativeScrollbar = useNativeScrollbar({\n nativeScrollbar: nativeScrollbarProp,\n client,\n });\n\n // Сколл к выбранному пункту при открытии меню\n useEffect(() => {\n if (open) {\n rowVirtualizer.scrollToIndex(highlightedIndex, { align: 'end' });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n // Скролл к пункту, которого нет на экране\n useEffect(() => {\n if (highlightedIndex === -1) return;\n\n if (!rowVirtualizer.virtualItems.some((option) => option.index === highlightedIndex)) {\n rowVirtualizer.scrollToIndex(highlightedIndex, { align: 'end' });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [highlightedIndex]);\n\n // Циклическая навигация\n useEffect(() => {\n const notDisabled = (option: OptionShape) => !option.disabled;\n const firstNonDisabled = flatOptions.findIndex(notDisabled);\n const lastNonDisabled = lastIndexOf(flatOptions, notDisabled);\n\n if (\n prevHighlightedIndex <= firstNonDisabled &&\n highlightedIndex === flatOptions.length - 1\n ) {\n rowVirtualizer.scrollToIndex(lastNonDisabled);\n }\n\n if (prevHighlightedIndex >= lastNonDisabled && highlightedIndex === 0) {\n rowVirtualizer.scrollToIndex(0);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [prevHighlightedIndex, highlightedIndex]);\n\n useEffect(() => {\n setVisibleOptionsInvalidateKey(\n /**\n * react-virtual может несколько раз отрендерить список с одним элементом,\n * поэтому нужно еще раз пересчитать высоту, когда список ВИДИМЫХ пунктов будет отрендерен полностью\n * Также, высоту нужно пересчитывать при изменении пунктов меню\n */\n rowVirtualizer.virtualItems\n .slice(0, Math.min(rowVirtualizer.virtualItems.length, visibleOptions + 1))\n .map((item) => flatOptions[item.index].key)\n .join('_'),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rowVirtualizer.virtualItems.length, flatOptions]);\n\n useVirtualVisibleOptions({\n visibleOptions,\n invalidate: visibleOptionsInvalidateKey,\n listRef,\n styleTargetRef: nativeScrollbar ? parentRef : scrollbarRef,\n open,\n });\n\n // Т.к. рендерится плоский список, необходимо знать индекс, когда начинается новая группа\n const groupStartIndexes = useMemo(() => {\n let currentIndex = 0;\n\n return options.reduce((acc: { [key: number]: number }, option, index) => {\n if (isGroup(option)) {\n acc[currentIndex] = index;\n currentIndex += option.options.length;\n } else {\n currentIndex += 1;\n }\n\n return acc;\n }, {});\n }, [options]);\n\n const renderList = () =>\n rowVirtualizer.virtualItems.map((virtualRow) => {\n const option = flatOptions[virtualRow.index];\n const renderGroup = () => {\n const group = options[groupStartIndexes[virtualRow.index]] as GroupShape;\n\n if (!group) return null;\n\n const groupSelectedItems = selectedItems?.filter(({ key: selectedItemKey }) =>\n group.options.some((opt) => opt.key === selectedItemKey),\n );\n const handleSelectedItems = (items: OptionShape[]) => {\n setSelectedItems(\n (\n selectedItems?.filter(\n ({ key: selectedItemKey }) =>\n !group.options.some((opt) => opt.key === selectedItemKey),\n ) ?? []\n ).concat(items),\n );\n };\n\n return (\n <Optgroup\n label={group.label}\n size={size}\n className={optionGroupClassName}\n options={group.options}\n selectedItems={groupSelectedItems}\n setSelectedItems={handleSelectedItems}\n search={search}\n multiple={multiple}\n {...groupOptionProps}\n />\n );\n };\n\n return (\n <div\n key={virtualRow.index}\n ref={virtualRow.measureRef}\n className={cn(styles.virtualRow, {\n [styles.highlighted]: highlightedIndex === virtualRow.index,\n })}\n style={{\n transform: `translateY(${virtualRow.start}px)`,\n }}\n >\n {renderGroup()}\n {!isGroup(option) && (\n <Option {...getOptionProps(option, virtualRow.index)} />\n )}\n </div>\n );\n });\n\n const contentNodeProps = {\n className: styles.inner,\n style: { height: `${rowVirtualizer.totalSize}px` },\n ref: listRef,\n };\n\n const renderWithCustomScrollbar = () => (\n <Scrollbar\n className={cn(styles.scrollable, scrollbarClassName)}\n ref={scrollbarRef}\n horizontalAutoStretch={optionsListWidth === 'content'}\n scrollableNodeProps={{ onScroll, ref: parentRef }}\n contentNodeProps={contentNodeProps}\n >\n {renderList()}\n </Scrollbar>\n );\n\n const renderWithNativeScrollbar = () => {\n if (visibleOptions) {\n return (\n <div\n className={cn(styles.scrollable, scrollbarClassName)}\n ref={mergeRefs([parentRef, ref])}\n onScroll={onScroll}\n >\n <div {...contentNodeProps}>{renderList()}</div>\n </div>\n );\n }\n\n return <div {...contentNodeProps}>{renderList()}</div>;\n };\n\n const resetHighlightedIndex = () => setHighlightedIndex?.(-1);\n\n if (options.length === 0 && !emptyPlaceholder) {\n return null;\n }\n\n return (\n <div\n className={cn(styles.virtualOptionsList, styles[`size-${size}`], className)}\n data-test-id={dataTestId}\n >\n {header && (\n <div\n className={styles.virtualOptionsListHeader}\n onMouseEnter={resetHighlightedIndex}\n >\n {header}\n </div>\n )}\n\n {nativeScrollbar ? renderWithNativeScrollbar() : renderWithCustomScrollbar()}\n\n {emptyPlaceholder && options.length === 0 && (\n <div className={styles.emptyPlaceholder}>{emptyPlaceholder}</div>\n )}\n\n {showFooter && footer && (\n <div\n onMouseEnter={resetHighlightedIndex}\n className={cn(styles.virtualOptionsListFooter, {\n [styles.withBorder]:\n visibleOptions && flatOptions.length > visibleOptions,\n })}\n >\n {footer}\n </div>\n )}\n </div>\n );\n },\n);\n"],"names":["Optgroup","DefaultOptgroup"],"mappings":";;;;;;;;;;;;IAea,kBAAkB,GAAG,UAAU,CACxC,UACI,EA4BC,EACD,GAAG,EAAA;;QA5BC,EAAS,GAAA,EAAA,CAAA,IAAA,EAAT,IAAI,GAAA,EAAA,KAAA,MAAA,GAAG,EAAE,GAAA,EAAA,EACT,EAAgB,GAAA,EAAA,CAAA,WAAA,EAAhB,WAAW,GAAA,EAAA,KAAA,MAAA,GAAG,EAAE,GAAA,EAAA,EAChB,EAAqB,GAAA,EAAA,CAAA,gBAAA,EAArB,gBAAgB,GAAA,EAAA,KAAA,MAAA,GAAG,EAAE,KAAA,EACrB,oBAAoB,GAAA,EAAA,CAAA,oBAAA,EACpB,SAAS,GAAA,EAAA,CAAA,SAAA,EACT,cAAc,GAAA,EAAA,CAAA,cAAA,EACd,EAAA,GAAA,EAAA,CAAA,gBAAqB,EAArB,gBAAgB,mBAAG,EAAE,GAAA,EAAA,EACrB,MAAM,GAAA,EAAA,CAAA,MAAA,EACN,IAAI,GAAA,EAAA,CAAA,IAAA,EACJ,EAAY,GAAA,EAAA,CAAA,OAAA,EAAZ,OAAO,GAAA,EAAA,KAAA,MAAA,GAAG,EAAE,GAAA,EAAA,EACZ,EAAA,GAAA,EAAA,CAAA,QAA0B,EAA1BA,UAAQ,GAAG,EAAA,KAAA,MAAA,GAAAC,QAAe,KAAA,EAC1B,UAAU,GAAA,EAAA,CAAA,UAAA,EACV,gBAAgB,GAAA,EAAA,CAAA,gBAAA,EAChB,EAAwC,GAAA,EAAA,CAAA,cAAA,EAAxC,cAAc,GAAA,EAAA,KAAA,MAAA,GAAG,uBAAuB,GAAA,EAAA,EACxC,MAAM,GAAA,EAAA,CAAA,MAAA,EACN,MAAM,GAAA,EAAA,CAAA,MAAA,EACN,EAAiB,GAAA,EAAA,CAAA,UAAA,EAAjB,UAAU,GAAA,EAAA,KAAA,MAAA,GAAG,IAAI,GAAA,EAAA,EACjB,gBAAgB,sBAAA,EAChB,QAAQ,GAAA,EAAA,CAAA,QAAA,EACS,mBAAmB,GAAA,EAAA,CAAA,eAAA,EACpC,mBAAmB,GAAA,EAAA,CAAA,mBAAA,EACnB,aAAa,GAAA,EAAA,CAAA,aAAA,EACb,gBAAgB,GAAA,EAAA,CAAA,gBAAA,EAChB,MAAM,GAAA,EAAA,CAAA,MAAA,EACN,QAAQ,GAAA,EAAA,CAAA,QAAA,EACR,kBAAkB,GAAA,EAAA,CAAA,kBAAA,EAClB,MAAM,GAAA,EAAA,CAAA,MAAA;AAIV,IAAA,IAAM,OAAO,GAAG,MAAM,CAAiB,IAAI,CAAC;AAC5C,IAAA,IAAM,SAAS,GAAG,MAAM,CAAiB,IAAI,CAAC;AAC9C,IAAA,IAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC;IAC3C,IAAA,EAAA,GAAgE,QAAQ,CAAC,EAAE,CAAC,EAA3E,2BAA2B,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,8BAA8B,GAAA,EAAA,CAAA,CAAA,CAAgB;IAClF,IAAM,oBAAoB,GAAG,WAAW,CAAC,gBAAgB,CAAC,IAAI,EAAE;IAEhE,IAAM,cAAc,GAAG,UAAU,CAAC;QAC9B,IAAI,EAAE,WAAW,CAAC,MAAM;AACxB,QAAA,SAAS,GAAG,GAAG,IAAI,SAAS,CAAoC;AAChE,QAAA,QAAQ,EAAE,EAAE;AACf,KAAA,CAAC;IAEF,IAAM,eAAe,GAAG,kBAAkB,CAAC;AACvC,QAAA,eAAe,EAAE,mBAAmB;AACpC,QAAA,MAAM,EAAA,MAAA;AACT,KAAA,CAAC;;AAGF,IAAA,SAAS,CAAC,YAAA;QACN,IAAI,IAAI,EAAE;YACN,cAAc,CAAC,aAAa,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;;;AAGxE,KAAC,EAAE,CAAC,IAAI,CAAC,CAAC;;AAGV,IAAA,SAAS,CAAC,YAAA;QACN,IAAI,gBAAgB,KAAK,EAAE;YAAE;QAE7B,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,UAAC,MAAM,EAAA,EAAK,OAAA,MAAM,CAAC,KAAK,KAAK,gBAAgB,GAAA,CAAC,EAAE;YAClF,cAAc,CAAC,aAAa,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;;;AAGxE,KAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;;AAGtB,IAAA,SAAS,CAAC,YAAA;AACN,QAAA,IAAM,WAAW,GAAG,UAAC,MAAmB,EAAK,EAAA,OAAA,CAAC,MAAM,CAAC,QAAQ,CAAhB,EAAgB;QAC7D,IAAM,gBAAgB,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC;QAC3D,IAAM,eAAe,GAAG,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC;QAE7D,IACI,oBAAoB,IAAI,gBAAgB;AACxC,YAAA,gBAAgB,KAAK,WAAW,CAAC,MAAM,GAAG,CAAC,EAC7C;AACE,YAAA,cAAc,CAAC,aAAa,CAAC,eAAe,CAAC;;QAGjD,IAAI,oBAAoB,IAAI,eAAe,IAAI,gBAAgB,KAAK,CAAC,EAAE;AACnE,YAAA,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;;;AAGvC,KAAC,EAAE,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,CAAC;AAE5C,IAAA,SAAS,CAAC,YAAA;QACN,8BAA8B;AAC1B;;;;AAIG;AACH,QAAA,cAAc,CAAC;AACV,aAAA,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,CAAC,CAAC;AACzE,aAAA,GAAG,CAAC,UAAC,IAAI,EAAA,EAAK,OAAA,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAA,EAAA;AACzC,aAAA,IAAI,CAAC,GAAG,CAAC,CACjB;;KAEJ,EAAE,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAErD,IAAA,wBAAwB,CAAC;AACrB,QAAA,cAAc,EAAA,cAAA;AACd,QAAA,UAAU,EAAE,2BAA2B;AACvC,QAAA,OAAO,EAAA,OAAA;QACP,cAAc,EAAE,eAAe,GAAG,SAAS,GAAG,YAAY;AAC1D,QAAA,IAAI,EAAA,IAAA;AACP,KAAA,CAAC;;IAGF,IAAM,iBAAiB,GAAG,OAAO,CAAC,YAAA;QAC9B,IAAI,YAAY,GAAG,CAAC;QAEpB,OAAO,OAAO,CAAC,MAAM,CAAC,UAAC,GAA8B,EAAE,MAAM,EAAE,KAAK,EAAA;AAChE,YAAA,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE;AACjB,gBAAA,GAAG,CAAC,YAAY,CAAC,GAAG,KAAK;AACzB,gBAAA,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM;;iBAClC;gBACH,YAAY,IAAI,CAAC;;AAGrB,YAAA,OAAO,GAAG;SACb,EAAE,EAAE,CAAC;AACV,KAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAEb,IAAA,IAAM,UAAU,GAAG,YAAA;AACf,QAAA,OAAA,cAAc,CAAC,YAAY,CAAC,GAAG,CAAC,UAAC,UAAU,EAAA;;YACvC,IAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC;AAC5C,YAAA,IAAM,WAAW,GAAG,YAAA;gBAChB,IAAM,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAe;AAExE,gBAAA,IAAI,CAAC,KAAK;AAAE,oBAAA,OAAO,IAAI;gBAEvB,IAAM,kBAAkB,GAAG,aAAa,KAAb,IAAA,IAAA,aAAa,KAAb,MAAA,GAAA,MAAA,GAAA,aAAa,CAAE,MAAM,CAAC,UAAC,EAAwB,EAAA;AAAjB,oBAAA,IAAA,eAAe,GAAA,EAAA,CAAA,GAAA;AACpE,oBAAA,OAAA,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAC,GAAG,EAAK,EAAA,OAAA,GAAG,CAAC,GAAG,KAAK,eAAe,CAAA,EAAA,CAAC;AAAxD,iBAAwD,CAC3D;gBACD,IAAM,mBAAmB,GAAG,UAAC,KAAoB,EAAA;;AAC7C,oBAAA,gBAAgB,CACZ,CACI,CAAA,EAAA,GAAA,aAAa,KAAb,IAAA,IAAA,aAAa,KAAb,MAAA,GAAA,MAAA,GAAA,aAAa,CAAE,MAAM,CACjB,UAAC,EAAwB,EAAA;AAAjB,wBAAA,IAAA,eAAe,GAAA,EAAA,CAAA,GAAA;AACnB,wBAAA,OAAA,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAC,GAAG,EAAK,EAAA,OAAA,GAAG,CAAC,GAAG,KAAK,eAAe,CAAA,EAAA,CAAC;qBAAA,CAChE,MAAI,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAA,EAAE,EACT,MAAM,CAAC,KAAK,CAAC,CAClB;AACL,iBAAC;AAED,gBAAA,QACI,KAAC,CAAA,aAAA,CAAAD,UAAQ,aACL,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,oBAAoB,EAC/B,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,aAAa,EAAE,kBAAkB,EACjC,gBAAgB,EAAE,mBAAmB,EACrC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,IACd,gBAAgB,CAAA,CACtB;AAEV,aAAC;YAED,QACI,6BACI,GAAG,EAAE,UAAU,CAAC,KAAK,EACrB,GAAG,EAAE,UAAU,CAAC,UAAU,EAC1B,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,GAAA,EAAA,GAAA,EAAA;oBAC3B,EAAC,CAAA,MAAM,CAAC,WAAW,CAAA,GAAG,gBAAgB,KAAK,UAAU,CAAC,KAAK;AAC7D,oBAAA,EAAA,EAAA,EACF,KAAK,EAAE;AACH,oBAAA,SAAS,EAAE,aAAA,CAAA,MAAA,CAAc,UAAU,CAAC,KAAK,EAAK,KAAA,CAAA;AACjD,iBAAA,EAAA;AAEA,gBAAA,WAAW,EAAE;gBACb,CAAC,OAAO,CAAC,MAAM,CAAC,KACb,KAAA,CAAA,aAAA,CAAC,MAAM,EAAK,QAAA,CAAA,EAAA,EAAA,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,CAAI,CAAA,CAC3D,CACC;AAEd,SAAC,CAAC;AArDF,KAqDE;AAEN,IAAA,IAAM,gBAAgB,GAAG;QACrB,SAAS,EAAE,MAAM,CAAC,KAAK;QACvB,KAAK,EAAE,EAAE,MAAM,EAAE,UAAG,cAAc,CAAC,SAAS,EAAA,IAAA,CAAI,EAAE;AAClD,QAAA,GAAG,EAAE,OAAO;KACf;IAED,IAAM,yBAAyB,GAAG,YAAM,EAAA,QACpC,KAAC,CAAA,aAAA,CAAA,SAAS,EACN,EAAA,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,kBAAkB,CAAC,EACpD,GAAG,EAAE,YAAY,EACjB,qBAAqB,EAAE,gBAAgB,KAAK,SAAS,EACrD,mBAAmB,EAAE,EAAE,QAAQ,EAAA,QAAA,EAAE,GAAG,EAAE,SAAS,EAAE,EACjD,gBAAgB,EAAE,gBAAgB,EAEjC,EAAA,UAAU,EAAE,CACL,EATwB,EAUvC;AAED,IAAA,IAAM,yBAAyB,GAAG,YAAA;QAC9B,IAAI,cAAc,EAAE;YAChB,QACI,KACI,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,kBAAkB,CAAC,EACpD,GAAG,EAAE,SAAS,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,EAChC,QAAQ,EAAE,QAAQ,EAAA;AAElB,gBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,QAAA,CAAA,EAAA,EAAS,gBAAgB,CAAG,EAAA,UAAU,EAAE,CAAO,CAC7C;;AAId,QAAA,OAAO,wCAAS,gBAAgB,CAAA,EAAG,UAAU,EAAE,CAAO;AAC1D,KAAC;AAED,IAAA,IAAM,qBAAqB,GAAG,YAAM,EAAA,OAAA,mBAAmB,KAAnB,IAAA,IAAA,mBAAmB,KAAnB,MAAA,GAAA,MAAA,GAAA,mBAAmB,CAAG,EAAE,CAAC,CAAA,EAAA;IAE7D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC3C,QAAA,OAAO,IAAI;;IAGf,QACI,6BACI,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,OAAA,CAAA,MAAA,CAAQ,IAAI,CAAE,CAAC,EAAE,SAAS,CAAC,kBAC7D,UAAU,EAAA;AAEvB,QAAA,MAAM,KACH,KACI,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,wBAAwB,EAC1C,YAAY,EAAE,qBAAqB,EAElC,EAAA,MAAM,CACL,CACT;QAEA,eAAe,GAAG,yBAAyB,EAAE,GAAG,yBAAyB,EAAE;AAE3E,QAAA,gBAAgB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,KACrC,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,gBAAgB,EAAG,EAAA,gBAAgB,CAAO,CACpE;AAEA,QAAA,UAAU,IAAI,MAAM,KACjB,6BACI,YAAY,EAAE,qBAAqB,EACnC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,wBAAwB,GAAA,EAAA,GAAA,EAAA;gBACzC,EAAC,CAAA,MAAM,CAAC,UAAU,CACd,GAAA,cAAc,IAAI,WAAW,CAAC,MAAM,GAAG,cAAc;AAC3D,gBAAA,EAAA,EAAA,EAAA,EAED,MAAM,CACL,CACT,CACC;AAEd,CAAC;;;;"}
|
|
1
|
+
{"version":3,"file":"Component.js","sources":["../../../src/components/virtual-options-list/Component.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useVirtual } from 'react-virtual';\nimport cn from 'classnames';\n\nimport { ScrollbarPrivate } from '@alfalab/core-components-scrollbar-private';\nimport { getElementWindow } from '@alfalab/core-components-shared';\n\nimport { DEFAULT_VISIBLE_OPTIONS } from '../../consts';\nimport { useNativeScrollbar } from '../../hooks/use-native-scrollbar';\nimport { type GroupShape, type OptionShape, type OptionsListProps } from '../../typings';\nimport { isGroup, usePrevious, useVirtualVisibleOptions } from '../../utils';\nimport { Optgroup as DefaultOptgroup } from '../optgroup';\n\nimport styles from '../options-list/index.module.css';\n\nexport const VirtualOptionsList = forwardRef<HTMLDivElement, OptionsListProps>(\n (\n {\n size = 48,\n flatOptions = [],\n highlightedIndex = -1,\n optionGroupClassName,\n className,\n getOptionProps,\n groupOptionProps = {},\n Option,\n open,\n options = [],\n Optgroup = DefaultOptgroup,\n dataTestId,\n emptyPlaceholder,\n visibleOptions = DEFAULT_VISIBLE_OPTIONS,\n header,\n footer,\n showFooter = true,\n onScroll,\n nativeScrollbar: nativeScrollbarProp,\n setHighlightedIndex,\n selectedItems,\n setSelectedItems,\n search,\n multiple,\n scrollbarClassName,\n client,\n scrollableNodeClassName,\n contentNodeClassName,\n listNodeClassName,\n footerClassName,\n ctrlRef,\n },\n ref,\n ) => {\n const listRef = useRef<HTMLDivElement>(null);\n const scrollableNodeRef = useRef<HTMLDivElement>(null);\n const noOptions = options.length === 0;\n const [scrollTop, setScrollTop] = useState(true);\n const [scrollBottom, setScrollBottom] = useState(false);\n const [visibleOptionsInvalidateKey, setVisibleOptionsInvalidateKey] = useState('');\n const prevHighlightedIndex = usePrevious(highlightedIndex) || -1;\n\n const rowVirtualizer = useVirtual({\n scrollToFn(offset, defaultScrollToFn) {\n let delta = 0;\n const list = listRef.current;\n\n if (list) {\n const win = getElementWindow(list);\n\n delta = ['::before', '::after']\n .map((pseudo) => {\n const { paddingTop } = win.getComputedStyle(list, pseudo);\n\n return parseFloat(paddingTop) || 0;\n })\n .reduce((a, b) => a + b);\n }\n\n defaultScrollToFn?.(offset === 0 ? offset : offset + delta);\n },\n size: flatOptions.length,\n parentRef: (ref as React.RefObject<HTMLDivElement>) || scrollableNodeRef,\n overscan: 15,\n });\n\n const nativeScrollbar = useNativeScrollbar({\n nativeScrollbar: nativeScrollbarProp,\n client,\n });\n\n // Сколл к выбранному пункту при открытии меню\n useEffect(() => {\n if (open) {\n rowVirtualizer.scrollToIndex(highlightedIndex, { align: 'end' });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n useImperativeHandle(ctrlRef, () => rowVirtualizer, [rowVirtualizer]);\n\n // Циклическая навигация\n useEffect(() => {\n const notDisabled = (option: OptionShape) => !option.disabled;\n const firstNonDisabled = flatOptions.findIndex(notDisabled);\n const lastNonDisabled = flatOptions.findLastIndex(notDisabled);\n\n if (\n prevHighlightedIndex <= firstNonDisabled &&\n highlightedIndex === flatOptions.length - 1\n ) {\n rowVirtualizer.scrollToIndex(lastNonDisabled);\n }\n\n if (prevHighlightedIndex >= lastNonDisabled && highlightedIndex === 0) {\n rowVirtualizer.scrollToIndex(0);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [prevHighlightedIndex, highlightedIndex]);\n\n useEffect(() => {\n setVisibleOptionsInvalidateKey(\n /**\n * react-virtual может несколько раз отрендерить список с одним элементом,\n * поэтому нужно еще раз пересчитать высоту, когда список ВИДИМЫХ пунктов будет отрендерен полностью\n * Также, высоту нужно пересчитывать при изменении пунктов меню\n */\n rowVirtualizer.virtualItems\n .slice(0, Math.min(rowVirtualizer.virtualItems.length, visibleOptions + 1))\n .map((item) => flatOptions[item.index].key)\n .join('_'),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rowVirtualizer.virtualItems.length, flatOptions]);\n\n const maxHeight = useVirtualVisibleOptions({\n visibleOptions,\n invalidate: visibleOptionsInvalidateKey,\n listRef,\n open,\n });\n\n // Т.к. рендерится плоский список, необходимо знать индекс, когда начинается новая группа\n const groupStartIndexes = useMemo(() => {\n let currentIndex = 0;\n\n return options.reduce((acc: { [key: number]: number }, option, index) => {\n if (isGroup(option)) {\n acc[currentIndex] = index;\n currentIndex += option.options.length;\n } else {\n currentIndex += 1;\n }\n\n return acc;\n }, {});\n }, [options]);\n\n const handleScroll: React.MouseEventHandler<HTMLDivElement> = (event) => {\n const scrolledToHeader = event.currentTarget.scrollTop <= 0;\n const scrolledToFooter =\n event.currentTarget.scrollHeight - event.currentTarget.offsetHeight <=\n event.currentTarget.scrollTop;\n\n setScrollTop(scrolledToHeader);\n setScrollBottom(scrolledToFooter);\n\n onScroll?.(event);\n };\n\n const renderList = () =>\n rowVirtualizer.virtualItems.map((virtualRow) => {\n const option = flatOptions[virtualRow.index];\n const renderGroup = () => {\n const group = options[groupStartIndexes[virtualRow.index]] as GroupShape;\n\n if (!group) return null;\n\n const groupSelectedItems = selectedItems?.filter(({ key: selectedItemKey }) =>\n group.options.some((opt) => opt.key === selectedItemKey),\n );\n const handleSelectedItems = (items: OptionShape[]) => {\n setSelectedItems(\n (\n selectedItems?.filter(\n ({ key: selectedItemKey }) =>\n !group.options.some((opt) => opt.key === selectedItemKey),\n ) ?? []\n ).concat(items),\n );\n };\n\n return (\n <Optgroup\n label={group.label}\n size={size}\n className={optionGroupClassName}\n options={group.options}\n selectedItems={groupSelectedItems}\n setSelectedItems={handleSelectedItems}\n search={search}\n multiple={multiple}\n {...groupOptionProps}\n />\n );\n };\n\n return (\n <div key={virtualRow.index} ref={virtualRow.measureRef}>\n {renderGroup()}\n {!isGroup(option) && (\n <Option {...getOptionProps(option, virtualRow.index)} />\n )}\n </div>\n );\n });\n\n const resetHighlightedIndex = () => setHighlightedIndex?.(-1);\n\n if (options.length === 0 && !emptyPlaceholder) {\n return null;\n }\n\n const [firstVirualRow] = rowVirtualizer.virtualItems;\n\n return (\n <div\n {...(nativeScrollbar && { 'data-test-id': dataTestId })}\n className={cn(styles.optionsList, styles[`size-${size}`], className)}\n >\n {header && (\n <div\n className={cn(styles.optionsListHeader, {\n [styles.headerHighlighted]: !scrollTop,\n })}\n onMouseEnter={resetHighlightedIndex}\n >\n {header}\n </div>\n )}\n\n {!noOptions && (\n <ScrollbarPrivate\n native={nativeScrollbar}\n className={scrollbarClassName}\n style={{ maxHeight }}\n scrollableNodeProps={{\n ref: scrollableNodeRef,\n onScroll: handleScroll,\n className: scrollableNodeClassName,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n 'data-test-id': nativeScrollbar ? undefined : dataTestId,\n }}\n contentNodeProps={{\n className: contentNodeClassName,\n style: { minHeight: rowVirtualizer.totalSize },\n }}\n >\n <div\n className={cn(styles.list, listNodeClassName)}\n ref={listRef}\n style={{ transform: `translateY(${firstVirualRow?.start ?? 0}px)` }}\n >\n {renderList()}\n </div>\n </ScrollbarPrivate>\n )}\n\n {emptyPlaceholder && noOptions && (\n <div className={styles.emptyPlaceholder}>{emptyPlaceholder}</div>\n )}\n\n {showFooter && footer && (\n <div\n onMouseEnter={resetHighlightedIndex}\n className={cn(styles.optionsListFooter, footerClassName, {\n [styles.withBorder]:\n visibleOptions &&\n flatOptions.length > visibleOptions &&\n !scrollBottom,\n })}\n >\n {footer}\n </div>\n )}\n </div>\n );\n },\n);\n"],"names":["Optgroup","DefaultOptgroup"],"mappings":"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"}
|