@alfalab/core-components-select 19.1.0 → 19.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Component.responsive.d.ts +1 -1
- package/Component.responsive.js.map +1 -1
- package/components/arrow/index.css +4 -4
- package/components/arrow/index.module.css.js +1 -1
- package/components/arrow/index.module.css.js.map +1 -1
- package/components/base-checkmark/index.css +12 -12
- package/components/base-checkmark/index.module.css.js +1 -1
- package/components/base-checkmark/index.module.css.js.map +1 -1
- package/components/base-option/index.css +14 -14
- package/components/base-option/index.module.css.js +1 -1
- package/components/base-option/index.module.css.js.map +1 -1
- package/components/base-select/Component.d.ts +5 -5
- package/components/base-select/Component.js.map +1 -1
- package/components/base-select/index.css +11 -11
- 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 +11 -11
- package/components/base-select/mobile.module.css.js +1 -1
- package/components/base-select/mobile.module.css.js.map +1 -1
- package/components/base-select/types/component-types.d.ts +4 -4
- package/components/checkmark/index.css +11 -11
- package/components/checkmark/index.module.css.js +1 -1
- package/components/checkmark/index.module.css.js.map +1 -1
- package/components/checkmark-mobile/index.css +6 -6
- package/components/checkmark-mobile/index.module.css.js +1 -1
- package/components/checkmark-mobile/index.module.css.js.map +1 -1
- package/components/clear-button/index.css +4 -4
- package/components/clear-button/index.module.css.js +1 -1
- package/components/field/Component.d.ts +1 -1
- package/components/field/index.css +13 -13
- package/components/field/index.module.css.js +1 -1
- package/components/field/index.module.css.js.map +1 -1
- package/components/footer/Component.d.ts +1 -1
- package/components/footer/index.css +4 -4
- package/components/footer/index.module.css.js +1 -1
- package/components/footer/index.module.css.js.map +1 -1
- package/components/native-select/Component.d.ts +1 -1
- package/components/optgroup/index.css +4 -4
- package/components/optgroup/index.module.css.js +1 -1
- package/components/optgroup/index.module.css.js.map +1 -1
- package/components/option/Component.d.ts +1 -2
- package/components/option/desktop/index.css +19 -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 +16 -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 +25 -25
- package/components/options-list/Component.js +3 -3
- package/components/options-list/Component.js.map +1 -1
- package/components/options-list/index.css +13 -13
- package/components/options-list/index.module.css.js +1 -1
- package/components/options-list/index.module.css.js.map +1 -1
- package/components/search/Component.js.map +1 -1
- package/components/search/index.css +1 -1
- package/components/search/index.module.css.js +1 -1
- package/components/search/index.module.css.js.map +1 -1
- package/components/virtual-options-list/Component.d.ts +25 -25
- package/components/virtual-options-list/Component.js.map +1 -1
- package/components/virtual-options-list/index.css +13 -13
- package/components/virtual-options-list/index.module.css.js +1 -1
- package/components/virtual-options-list/index.module.css.js.map +1 -1
- package/cssm/Component.responsive.d.ts +1 -1
- package/cssm/Component.responsive.js.map +1 -1
- package/cssm/components/base-select/Component.d.ts +5 -5
- package/cssm/components/base-select/Component.js.map +1 -1
- package/cssm/components/base-select/types/component-types.d.ts +4 -4
- package/cssm/components/field/Component.d.ts +1 -1
- package/cssm/components/footer/Component.d.ts +1 -1
- package/cssm/components/native-select/Component.d.ts +1 -1
- package/cssm/components/option/Component.d.ts +1 -2
- package/cssm/components/options-list/Component.d.ts +25 -25
- package/cssm/components/options-list/Component.js +3 -3
- package/cssm/components/options-list/Component.js.map +1 -1
- package/cssm/components/search/Component.js.map +1 -1
- package/cssm/components/virtual-options-list/Component.d.ts +25 -25
- package/cssm/components/virtual-options-list/Component.js.map +1 -1
- package/cssm/desktop/Component.desktop.d.ts +1 -1
- package/cssm/hooks/use-native-scrollbar.d.ts +1 -1
- package/cssm/hooks/use-native-scrollbar.js.map +1 -1
- package/cssm/presets/useLazyLoading/hook.d.ts +2 -2
- package/cssm/presets/useLazyLoading/hook.js.map +1 -1
- package/cssm/presets/useSelectWithApply/hook.d.ts +97 -131
- package/cssm/presets/useSelectWithApply/hook.js.map +1 -1
- package/cssm/presets/useSelectWithApply/options-list-with-apply/Component.d.ts +36 -69
- package/cssm/presets/useSelectWithApply/options-list-with-apply/Component.js.map +1 -1
- package/cssm/presets/useSelectWithApply/options-list-with-apply/footer/Component.d.ts +1 -1
- package/cssm/presets/useSelectWithApply/options-list-with-apply/header/Component.d.ts +1 -1
- package/cssm/presets/useSelectWithLoading/hook.d.ts +1 -1
- package/cssm/typings.d.ts +21 -21
- package/cssm/utils.d.ts +4 -4
- package/cssm/utils.js.map +1 -1
- package/desktop/Component.desktop.d.ts +1 -1
- package/esm/Component.responsive.d.ts +1 -1
- package/esm/Component.responsive.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/arrow/index.module.css.js.map +1 -1
- package/esm/components/base-checkmark/index.css +12 -12
- package/esm/components/base-checkmark/index.module.css.js +1 -1
- package/esm/components/base-checkmark/index.module.css.js.map +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-option/index.module.css.js.map +1 -1
- package/esm/components/base-select/Component.d.ts +5 -5
- package/esm/components/base-select/Component.js.map +1 -1
- package/esm/components/base-select/index.css +11 -11
- 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 +11 -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/base-select/types/component-types.d.ts +4 -4
- package/esm/components/checkmark/index.css +11 -11
- package/esm/components/checkmark/index.module.css.js +1 -1
- package/esm/components/checkmark/index.module.css.js.map +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/checkmark-mobile/index.module.css.js.map +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/Component.d.ts +1 -1
- package/esm/components/field/index.css +13 -13
- package/esm/components/field/index.module.css.js +1 -1
- package/esm/components/field/index.module.css.js.map +1 -1
- package/esm/components/footer/Component.d.ts +1 -1
- package/esm/components/footer/index.css +4 -4
- package/esm/components/footer/index.module.css.js +1 -1
- package/esm/components/footer/index.module.css.js.map +1 -1
- package/esm/components/native-select/Component.d.ts +1 -1
- package/esm/components/optgroup/index.css +4 -4
- package/esm/components/optgroup/index.module.css.js +1 -1
- package/esm/components/optgroup/index.module.css.js.map +1 -1
- package/esm/components/option/Component.d.ts +1 -2
- package/esm/components/option/desktop/index.css +19 -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 +16 -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 +25 -25
- package/esm/components/options-list/Component.js +3 -3
- package/esm/components/options-list/Component.js.map +1 -1
- package/esm/components/options-list/index.css +13 -13
- 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/Component.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/search/index.module.css.js.map +1 -1
- package/esm/components/virtual-options-list/Component.d.ts +25 -25
- package/esm/components/virtual-options-list/Component.js.map +1 -1
- package/esm/components/virtual-options-list/index.css +13 -13
- package/esm/components/virtual-options-list/index.module.css.js +1 -1
- package/esm/components/virtual-options-list/index.module.css.js.map +1 -1
- package/esm/desktop/Component.desktop.d.ts +1 -1
- package/esm/hooks/use-native-scrollbar.d.ts +1 -1
- package/esm/hooks/use-native-scrollbar.js.map +1 -1
- package/esm/presets/useLazyLoading/hook.d.ts +2 -2
- package/esm/presets/useLazyLoading/hook.js.map +1 -1
- package/esm/presets/useSelectWithApply/hook.d.ts +97 -131
- package/esm/presets/useSelectWithApply/hook.js.map +1 -1
- package/esm/presets/useSelectWithApply/options-list-with-apply/Component.d.ts +36 -69
- package/esm/presets/useSelectWithApply/options-list-with-apply/Component.js.map +1 -1
- package/esm/presets/useSelectWithApply/options-list-with-apply/footer/Component.d.ts +1 -1
- package/esm/presets/useSelectWithApply/options-list-with-apply/footer/index.css +3 -3
- 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/Component.d.ts +1 -1
- package/esm/presets/useSelectWithApply/options-list-with-apply/header/index.css +4 -4
- 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/hook.d.ts +1 -1
- package/esm/presets/useSelectWithLoading/index.css +1 -1
- package/esm/presets/useSelectWithLoading/index.module.css.js +1 -1
- package/esm/typings.d.ts +21 -21
- package/esm/utils.d.ts +4 -4
- package/esm/utils.js.map +1 -1
- package/hooks/use-native-scrollbar.d.ts +1 -1
- package/hooks/use-native-scrollbar.js.map +1 -1
- package/modern/Component.responsive.d.ts +1 -1
- package/modern/Component.responsive.js.map +1 -1
- package/modern/components/arrow/index.css +4 -4
- package/modern/components/arrow/index.module.css.js +1 -1
- package/modern/components/arrow/index.module.css.js.map +1 -1
- package/modern/components/base-checkmark/index.css +12 -12
- package/modern/components/base-checkmark/index.module.css.js +1 -1
- package/modern/components/base-checkmark/index.module.css.js.map +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-option/index.module.css.js.map +1 -1
- package/modern/components/base-select/Component.d.ts +5 -5
- package/modern/components/base-select/Component.js.map +1 -1
- package/modern/components/base-select/index.css +11 -11
- 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 +11 -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/base-select/types/component-types.d.ts +4 -4
- package/modern/components/checkmark/index.css +11 -11
- package/modern/components/checkmark/index.module.css.js +1 -1
- package/modern/components/checkmark/index.module.css.js.map +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/checkmark-mobile/index.module.css.js.map +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/Component.d.ts +1 -1
- package/modern/components/field/index.css +13 -13
- package/modern/components/field/index.module.css.js +1 -1
- package/modern/components/field/index.module.css.js.map +1 -1
- package/modern/components/footer/Component.d.ts +1 -1
- package/modern/components/footer/index.css +4 -4
- package/modern/components/footer/index.module.css.js +1 -1
- package/modern/components/footer/index.module.css.js.map +1 -1
- package/modern/components/native-select/Component.d.ts +1 -1
- package/modern/components/optgroup/index.css +4 -4
- package/modern/components/optgroup/index.module.css.js +1 -1
- package/modern/components/optgroup/index.module.css.js.map +1 -1
- package/modern/components/option/Component.d.ts +1 -2
- package/modern/components/option/desktop/index.css +19 -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 +16 -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 +25 -25
- package/modern/components/options-list/Component.js +3 -3
- package/modern/components/options-list/Component.js.map +1 -1
- package/modern/components/options-list/index.css +13 -13
- 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/Component.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/search/index.module.css.js.map +1 -1
- package/modern/components/virtual-options-list/Component.d.ts +25 -25
- package/modern/components/virtual-options-list/Component.js.map +1 -1
- package/modern/components/virtual-options-list/index.css +13 -13
- package/modern/components/virtual-options-list/index.module.css.js +1 -1
- package/modern/components/virtual-options-list/index.module.css.js.map +1 -1
- package/modern/desktop/Component.desktop.d.ts +1 -1
- package/modern/hooks/use-native-scrollbar.d.ts +1 -1
- package/modern/hooks/use-native-scrollbar.js.map +1 -1
- package/modern/presets/useLazyLoading/hook.d.ts +2 -2
- package/modern/presets/useLazyLoading/hook.js.map +1 -1
- package/modern/presets/useSelectWithApply/hook.d.ts +97 -131
- package/modern/presets/useSelectWithApply/hook.js.map +1 -1
- package/modern/presets/useSelectWithApply/options-list-with-apply/Component.d.ts +36 -69
- package/modern/presets/useSelectWithApply/options-list-with-apply/Component.js.map +1 -1
- package/modern/presets/useSelectWithApply/options-list-with-apply/footer/Component.d.ts +1 -1
- package/modern/presets/useSelectWithApply/options-list-with-apply/footer/index.css +3 -3
- 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/Component.d.ts +1 -1
- package/modern/presets/useSelectWithApply/options-list-with-apply/header/index.css +4 -4
- 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/hook.d.ts +1 -1
- package/modern/presets/useSelectWithLoading/index.css +1 -1
- package/modern/presets/useSelectWithLoading/index.module.css.js +1 -1
- package/modern/typings.d.ts +21 -21
- package/modern/utils.d.ts +4 -4
- package/modern/utils.js.map +1 -1
- package/moderncssm/Component.responsive.d.ts +1 -1
- package/moderncssm/Component.responsive.js.map +1 -1
- package/moderncssm/components/base-select/Component.d.ts +5 -5
- package/moderncssm/components/base-select/Component.js.map +1 -1
- package/moderncssm/components/base-select/types/component-types.d.ts +4 -4
- package/moderncssm/components/field/Component.d.ts +1 -1
- package/moderncssm/components/footer/Component.d.ts +1 -1
- package/moderncssm/components/native-select/Component.d.ts +1 -1
- package/moderncssm/components/option/Component.d.ts +1 -2
- package/moderncssm/components/options-list/Component.d.ts +25 -25
- package/moderncssm/components/options-list/Component.js +3 -3
- package/moderncssm/components/options-list/Component.js.map +1 -1
- package/moderncssm/components/search/Component.js.map +1 -1
- package/moderncssm/components/virtual-options-list/Component.d.ts +25 -25
- package/moderncssm/components/virtual-options-list/Component.js.map +1 -1
- package/moderncssm/desktop/Component.desktop.d.ts +1 -1
- package/moderncssm/hooks/use-native-scrollbar.d.ts +1 -1
- package/moderncssm/hooks/use-native-scrollbar.js.map +1 -1
- package/moderncssm/presets/useLazyLoading/hook.d.ts +2 -2
- package/moderncssm/presets/useLazyLoading/hook.js.map +1 -1
- package/moderncssm/presets/useSelectWithApply/hook.d.ts +97 -131
- package/moderncssm/presets/useSelectWithApply/hook.js.map +1 -1
- package/moderncssm/presets/useSelectWithApply/options-list-with-apply/Component.d.ts +36 -69
- package/moderncssm/presets/useSelectWithApply/options-list-with-apply/Component.js.map +1 -1
- package/moderncssm/presets/useSelectWithApply/options-list-with-apply/footer/Component.d.ts +1 -1
- package/moderncssm/presets/useSelectWithApply/options-list-with-apply/header/Component.d.ts +1 -1
- package/moderncssm/presets/useSelectWithLoading/hook.d.ts +1 -1
- package/moderncssm/typings.d.ts +21 -21
- package/moderncssm/utils.d.ts +4 -4
- package/moderncssm/utils.js.map +1 -1
- package/package.json +14 -14
- package/presets/useLazyLoading/hook.d.ts +2 -2
- package/presets/useLazyLoading/hook.js.map +1 -1
- package/presets/useSelectWithApply/hook.d.ts +97 -130
- package/presets/useSelectWithApply/hook.js.map +1 -1
- package/presets/useSelectWithApply/options-list-with-apply/Component.d.ts +36 -69
- package/presets/useSelectWithApply/options-list-with-apply/Component.js.map +1 -1
- package/presets/useSelectWithApply/options-list-with-apply/footer/Component.d.ts +1 -1
- package/presets/useSelectWithApply/options-list-with-apply/footer/index.css +3 -3
- 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/Component.d.ts +1 -1
- package/presets/useSelectWithApply/options-list-with-apply/header/index.css +4 -4
- 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/hook.d.ts +1 -1
- package/presets/useSelectWithLoading/index.css +1 -1
- package/presets/useSelectWithLoading/index.module.css.js +1 -1
- package/src/components/arrow/index.module.css +1 -1
- package/src/components/base-checkmark/index.module.css +1 -1
- package/src/components/base-option/index.module.css +1 -1
- package/src/components/base-select/index.module.css +1 -1
- package/src/components/base-select/mobile.module.css +1 -1
- package/src/components/checkmark/index.module.css +1 -1
- package/src/components/checkmark-mobile/index.module.css +1 -1
- package/src/components/field/index.module.css +1 -1
- package/src/components/footer/index.module.css +1 -1
- package/src/components/optgroup/index.module.css +1 -1
- package/src/components/option/desktop/index.module.css +1 -1
- package/src/components/option/index.module.css +1 -1
- package/src/components/option/mobile/index.module.css +1 -1
- package/src/components/options-list/Component.tsx +3 -3
- package/src/components/options-list/index.module.css +1 -1
- package/src/components/search/index.module.css +1 -1
- package/src/components/virtual-options-list/index.module.css +1 -1
- package/src/presets/useSelectWithApply/options-list-with-apply/footer/index.module.css +1 -1
- package/src/presets/useSelectWithApply/options-list-with-apply/header/index.module.css +1 -1
- package/typings.d.ts +21 -21
- package/utils.d.ts +4 -4
- package/utils.js.map +1 -1
package/moderncssm/typings.d.ts
CHANGED
|
@@ -7,8 +7,8 @@ import { type ModalProps } from '@alfalab/core-components-modal/moderncssm';
|
|
|
7
7
|
import { type ModalFooterProps, type ModalHeaderProps } from '@alfalab/core-components-modal/moderncssm/shared';
|
|
8
8
|
import { type PopoverProps } from '@alfalab/core-components-popover/moderncssm';
|
|
9
9
|
import { type UseSelectWithApplyProps } from './presets/useSelectWithApply/hook';
|
|
10
|
-
export
|
|
11
|
-
export
|
|
10
|
+
export type AnyObject = Record<string, any>;
|
|
11
|
+
export type OptionShape = {
|
|
12
12
|
/**
|
|
13
13
|
* Текстовое представление пункта
|
|
14
14
|
*/
|
|
@@ -30,7 +30,7 @@ export declare type OptionShape = {
|
|
|
30
30
|
*/
|
|
31
31
|
value?: any;
|
|
32
32
|
};
|
|
33
|
-
export
|
|
33
|
+
export type GroupShape = {
|
|
34
34
|
/**
|
|
35
35
|
* Заголовок группы
|
|
36
36
|
*/
|
|
@@ -40,7 +40,7 @@ export declare type GroupShape = {
|
|
|
40
40
|
*/
|
|
41
41
|
options: OptionShape[];
|
|
42
42
|
};
|
|
43
|
-
export
|
|
43
|
+
export type BaseSelectChangePayload = {
|
|
44
44
|
selected: OptionShape | null;
|
|
45
45
|
selectedMultiple: OptionShape[];
|
|
46
46
|
initiator: OptionShape | null;
|
|
@@ -306,7 +306,7 @@ export interface BaseSelectProps {
|
|
|
306
306
|
*/
|
|
307
307
|
environment?: Environment;
|
|
308
308
|
}
|
|
309
|
-
export
|
|
309
|
+
export type FieldProps = {
|
|
310
310
|
/**
|
|
311
311
|
* Дополнительный класс
|
|
312
312
|
*/
|
|
@@ -390,7 +390,7 @@ export declare type FieldProps = {
|
|
|
390
390
|
*/
|
|
391
391
|
dataTestId?: string;
|
|
392
392
|
} & AnyObject;
|
|
393
|
-
export
|
|
393
|
+
export type ArrowProps = {
|
|
394
394
|
/**
|
|
395
395
|
* Дополнительный класс
|
|
396
396
|
*/
|
|
@@ -409,7 +409,7 @@ export declare type ArrowProps = {
|
|
|
409
409
|
*/
|
|
410
410
|
size?: BaseSelectProps['size'];
|
|
411
411
|
};
|
|
412
|
-
export
|
|
412
|
+
export type OptionsListProps = Pick<SelectProps, 'client'> & {
|
|
413
413
|
/**
|
|
414
414
|
* Дополнительный класс
|
|
415
415
|
*/
|
|
@@ -540,7 +540,7 @@ export declare type OptionsListProps = Pick<SelectProps, 'client'> & {
|
|
|
540
540
|
*/
|
|
541
541
|
limitDynamicOptionGroupSize?: BaseSelectProps['limitDynamicOptionGroupSize'];
|
|
542
542
|
};
|
|
543
|
-
export
|
|
543
|
+
export type OptgroupProps = {
|
|
544
544
|
/**
|
|
545
545
|
* Дополнительный класс для компонента группы пунктов
|
|
546
546
|
*/
|
|
@@ -578,7 +578,7 @@ export declare type OptgroupProps = {
|
|
|
578
578
|
*/
|
|
579
579
|
multiple?: boolean;
|
|
580
580
|
};
|
|
581
|
-
export
|
|
581
|
+
export type OptionCommonProps = {
|
|
582
582
|
/**
|
|
583
583
|
* Дополнительный класс
|
|
584
584
|
*/
|
|
@@ -648,7 +648,7 @@ export interface OptionProps extends OptionCommonProps, AriaAttributes {
|
|
|
648
648
|
*/
|
|
649
649
|
mobile?: boolean;
|
|
650
650
|
}
|
|
651
|
-
export
|
|
651
|
+
export type CheckmarkProps = {
|
|
652
652
|
/**
|
|
653
653
|
* Флаг, данный пункт выбран
|
|
654
654
|
*/
|
|
@@ -682,9 +682,9 @@ export declare type CheckmarkProps = {
|
|
|
682
682
|
*/
|
|
683
683
|
align?: 'start' | 'center';
|
|
684
684
|
};
|
|
685
|
-
export
|
|
686
|
-
export
|
|
687
|
-
export
|
|
685
|
+
export type SearchProps = InputProps & RefAttributes<HTMLInputElement>;
|
|
686
|
+
export type SelectFieldProps = Omit<FormControlProps, 'size'> & Record<string, unknown>;
|
|
687
|
+
export type AdditionalMobileProps = {
|
|
688
688
|
/**
|
|
689
689
|
* Показывать кнопку 'Сбросить' в футере мобильного компонента
|
|
690
690
|
*/
|
|
@@ -707,7 +707,7 @@ export declare type AdditionalMobileProps = {
|
|
|
707
707
|
*/
|
|
708
708
|
checkmarkPosition?: 'before' | 'after';
|
|
709
709
|
};
|
|
710
|
-
export
|
|
710
|
+
export type BottomSheetSelectMobileProps = {
|
|
711
711
|
/**
|
|
712
712
|
* Футер
|
|
713
713
|
* @deprecated Используйте bottomSheetProps.actionButton
|
|
@@ -725,7 +725,7 @@ export declare type BottomSheetSelectMobileProps = {
|
|
|
725
725
|
bottomAddons?: ((flatOptions: OptionShape[]) => ReactNode) | ReactNode;
|
|
726
726
|
};
|
|
727
727
|
};
|
|
728
|
-
export
|
|
728
|
+
export type ModalSelectMobileProps = {
|
|
729
729
|
/**
|
|
730
730
|
* Дополнительные пропсы шапки модалки
|
|
731
731
|
*/
|
|
@@ -741,20 +741,20 @@ export declare type ModalSelectMobileProps = {
|
|
|
741
741
|
*/
|
|
742
742
|
modalFooterProps?: Partial<ModalFooterProps>;
|
|
743
743
|
};
|
|
744
|
-
|
|
744
|
+
type ConditionalMobileProps = ({
|
|
745
745
|
isBottomSheet?: true;
|
|
746
746
|
} & BottomSheetSelectMobileProps) | ({
|
|
747
747
|
isBottomSheet: false;
|
|
748
748
|
} & ModalSelectMobileProps);
|
|
749
|
-
export
|
|
750
|
-
export
|
|
751
|
-
export
|
|
749
|
+
export type SelectModalMobileProps = Omit<BaseSelectProps, 'Checkmark'> & AdditionalMobileProps & ModalSelectMobileProps;
|
|
750
|
+
export type SelectMobileProps = Omit<BaseSelectProps, 'Checkmark'> & AdditionalMobileProps & ConditionalMobileProps;
|
|
751
|
+
export type SelectDesktopProps = Omit<BaseSelectProps, 'fieldProps'> & {
|
|
752
752
|
/**
|
|
753
753
|
* Пропсы, которые будут прокинуты в компонент поля
|
|
754
754
|
*/
|
|
755
755
|
fieldProps?: SelectFieldProps;
|
|
756
756
|
};
|
|
757
|
-
export
|
|
757
|
+
export type SelectProps = BaseSelectProps & AdditionalMobileProps & ConditionalMobileProps & {
|
|
758
758
|
/**
|
|
759
759
|
* Контрольная точка, с нее начинается desktop версия
|
|
760
760
|
* @default 1024
|
|
@@ -770,7 +770,7 @@ export declare type SelectProps = BaseSelectProps & AdditionalMobileProps & Cond
|
|
|
770
770
|
*/
|
|
771
771
|
defaultMatchMediaValue?: boolean | (() => boolean);
|
|
772
772
|
};
|
|
773
|
-
export
|
|
773
|
+
export type ClearButtonProps = {
|
|
774
774
|
/**
|
|
775
775
|
* Обработчик нажатия на крестик для очистки поля
|
|
776
776
|
*/
|
package/moderncssm/utils.d.ts
CHANGED
|
@@ -3,16 +3,16 @@ import { type BaseSelectProps, type GroupShape, type OptionShape, type OptionsLi
|
|
|
3
3
|
export declare const isGroup: (item: OptionShape | GroupShape) => item is GroupShape;
|
|
4
4
|
export declare const isOptionShape: (item: OptionShape | string | null) => item is OptionShape;
|
|
5
5
|
export declare const joinOptions: ({ selected, selectedMultiple, valueSeparator, }: {
|
|
6
|
-
selected?: OptionShape
|
|
7
|
-
selectedMultiple?: OptionShape[]
|
|
8
|
-
valueSeparator?: string
|
|
6
|
+
selected?: OptionShape;
|
|
7
|
+
selectedMultiple?: OptionShape[];
|
|
8
|
+
valueSeparator?: string;
|
|
9
9
|
}) => ReactNode[] | null;
|
|
10
10
|
export declare function processOptions(options: BaseSelectProps['options'], selected?: BaseSelectProps['selected'], filterFn?: (option: OptionShape | GroupShape) => boolean, filterGroup?: boolean): {
|
|
11
11
|
filteredOptions: (OptionShape | GroupShape)[];
|
|
12
12
|
flatOptions: OptionShape[];
|
|
13
13
|
selectedOptions: OptionShape[];
|
|
14
14
|
};
|
|
15
|
-
|
|
15
|
+
type useVisibleOptionsArgs = {
|
|
16
16
|
/**
|
|
17
17
|
* Количество видимых пунктов
|
|
18
18
|
*/
|
package/moderncssm/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../src/utils.ts"],"sourcesContent":["import {\n cloneElement,\n isValidElement,\n type ReactNode,\n type RefObject,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { fnUtils, getDataTestId, useIsMounted } from '@alfalab/core-components-shared';\nimport { useLayoutEffect_SAFE_FOR_SSR } from '@alfalab/hooks';\n\nimport { DEFAULT_SEPARATOR } from './consts';\nimport {\n type BaseSelectProps,\n type GroupShape,\n type OptionShape,\n type OptionsListProps,\n} from './typings';\n\nexport const isGroup = (item: OptionShape | GroupShape): item is GroupShape =>\n Object.prototype.hasOwnProperty.call(item, 'options');\n\nexport const isOptionShape = (item: OptionShape | string | null): item is OptionShape =>\n !!item && Object.prototype.hasOwnProperty.call(item, 'key');\n\nexport const joinOptions = ({\n selected,\n selectedMultiple,\n valueSeparator = DEFAULT_SEPARATOR,\n}: {\n selected?: OptionShape;\n selectedMultiple?: OptionShape[];\n valueSeparator?: string;\n}) => {\n const options = selectedMultiple || (selected ? [selected] : []);\n\n if (!options.length) return null;\n\n return options.reduce((acc: Array<ReactNode | string>, option: OptionShape, index: number) => {\n if (isValidElement(option.content)) {\n acc.push(cloneElement(option.content, { key: option.key }));\n } else {\n acc.push(option.content);\n }\n\n if (index < options.length - 1) acc.push(valueSeparator);\n\n return acc;\n }, []);\n};\n\n// За один проход делает список пунктов меню плоским и находит выбранные пункты по ключу\nexport function processOptions(\n options: BaseSelectProps['options'],\n selected: BaseSelectProps['selected'] = [],\n filterFn: (option: OptionShape | GroupShape) => boolean = () => true,\n filterGroup = false,\n) {\n const flatOptions: OptionShape[] = [];\n const filteredOptions: BaseSelectProps['options'] = [];\n\n const selectedArray = Array.isArray(selected) ? selected : [selected];\n const selectedOptions = selectedArray.filter(isOptionShape);\n const selectedKeys = selectedArray.filter(\n (option): option is string => typeof option === 'string',\n );\n\n const isSelected = (option: OptionShape) => selectedKeys.includes(option.key);\n\n const process = (option: OptionShape | GroupShape) => {\n const isGroupOption = isGroup(option);\n\n if (!isGroupOption && isSelected(option)) {\n selectedOptions.push(option);\n }\n\n if (!filterFn(option)) return false;\n\n if (isGroupOption) {\n if (filterGroup) {\n Array.prototype.push.apply(flatOptions, option.options);\n }\n } else {\n flatOptions.push(option);\n }\n\n return true;\n };\n\n options.forEach((option) => {\n if (isGroup(option)) {\n const group: GroupShape = {\n ...option,\n options: [],\n };\n\n option.options.forEach((groupOption) => {\n const matched = process(groupOption);\n\n if (matched) group.options.push(groupOption);\n });\n\n if (group.options.length) {\n filteredOptions.push(group);\n\n return;\n }\n\n if (!filterGroup) return;\n }\n const matched = process(option);\n\n if (matched) filteredOptions.push(option);\n });\n\n return { filteredOptions, flatOptions, selectedOptions };\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ntype useVisibleOptionsArgs = {\n /**\n * Количество видимых пунктов\n */\n visibleOptions: number;\n\n /**\n * Реф на контейнер с пунтами меню\n */\n listRef: RefObject<HTMLElement>;\n\n /**\n * Реф на контейнер, которому нужно установить высоту\n */\n styleTargetRef?: RefObject<HTMLElement>;\n\n /**\n * Флаг открытия меню\n */\n open?: boolean;\n\n /**\n * Позволяет вызвать пересчет высоты\n */\n invalidate?: unknown;\n\n /**\n * Список вариантов выбора\n */\n options?: Array<OptionShape | GroupShape>;\n\n /**\n * Максимальный размер варианта выбора\n */\n size?: Extract<OptionsListProps['size'], number>;\n\n /**\n * Учитывать действительное число вариантов выбора\n */\n actualOptionsCount?: boolean;\n};\n\n// copy-paste of original `useVisibleOptions` before https://github.com/core-ds/core-components/pull/1368\nexport function useVirtualVisibleOptions({\n visibleOptions,\n listRef,\n styleTargetRef = listRef,\n open,\n invalidate,\n options,\n size,\n actualOptionsCount,\n}: useVisibleOptionsArgs) {\n useEffect(() => {\n const measureOptionHeight = (element: HTMLElement) =>\n typeof size === 'number' ? Math.min(element.clientHeight, size) : element.clientHeight;\n\n const list = listRef.current;\n const styleTarget = styleTargetRef.current;\n\n if (open && list && styleTarget && visibleOptions > 0) {\n const childCount = list.children.length;\n const optionsNodes = ([] as HTMLElement[]).slice.call(\n list.children,\n 0,\n visibleOptions + 1,\n );\n\n let height = optionsNodes\n .slice(0, visibleOptions)\n .reduce((acc, child) => acc + measureOptionHeight(child), 0);\n\n if (visibleOptions < childCount) {\n const lastVisibleOptionHeight = measureOptionHeight(\n optionsNodes[optionsNodes.length - 1],\n );\n\n // Если кол-во опций больше visibleOptions на 1, то показываем все опции, иначе добавляем половинку\n height += Math.round(\n childCount - visibleOptions === 1\n ? lastVisibleOptionHeight\n : lastVisibleOptionHeight / 2,\n );\n } else if (\n visibleOptions > childCount &&\n actualOptionsCount &&\n typeof size === 'number'\n ) {\n const actualCount = (options ?? []).reduce(\n (sum, option) => sum + 1 + (isGroup(option) ? option.options.length : 0),\n 0,\n );\n\n height =\n Math.min(\n actualCount === 0 ? /** empty placeholder */ 1 : actualCount,\n visibleOptions,\n ) * size;\n\n if (visibleOptions < actualCount) {\n height += size / 2;\n }\n }\n\n styleTarget.style.height = `${height}px`;\n }\n }, [\n actualOptionsCount,\n listRef,\n open,\n options,\n size,\n styleTargetRef,\n visibleOptions,\n invalidate,\n ]);\n}\n\nexport function useVisibleOptions({\n visibleOptions,\n listRef,\n open,\n options,\n size,\n actualOptionsCount,\n}: useVisibleOptionsArgs) {\n const [, runIfMounted] = useIsMounted();\n const [measured, setMeasured] = useState(false);\n const [height, setHeight] = useState<number | undefined>();\n\n useLayoutEffect_SAFE_FOR_SSR(() => {\n const measureOptionHeight = (element: HTMLElement) =>\n typeof size === 'number' ? Math.min(element.clientHeight, size) : element.clientHeight;\n\n const list = listRef.current;\n\n if (open && list && visibleOptions > 0) {\n const childCount = list.children.length;\n const optionsNodes = ([] as HTMLElement[]).slice.call(\n list.children,\n 0,\n visibleOptions + 1,\n );\n\n let measuredHeight = optionsNodes\n .slice(0, visibleOptions)\n .reduce((acc, child) => acc + measureOptionHeight(child), 0);\n\n if (visibleOptions < childCount) {\n const lastVisibleOptionHeight = measureOptionHeight(\n optionsNodes[optionsNodes.length - 1],\n );\n\n // Если кол-во опций больше visibleOptions на 1, то показываем все опции, иначе добавляем половинку\n measuredHeight += Math.round(\n childCount - visibleOptions === 1\n ? lastVisibleOptionHeight\n : lastVisibleOptionHeight / 2,\n );\n } else if (\n visibleOptions > childCount &&\n actualOptionsCount &&\n typeof size === 'number'\n ) {\n const actualCount = (options ?? []).reduce(\n (sum, option) => sum + 1 + (isGroup(option) ? option.options.length : 0),\n 0,\n );\n\n measuredHeight =\n Math.min(\n actualCount === 0 ? /** empty placeholder */ 1 : actualCount,\n visibleOptions,\n ) * size;\n\n if (visibleOptions < actualCount) {\n measuredHeight += size / 2;\n }\n }\n\n setHeight(measuredHeight);\n\n setMeasured(true);\n\n return () => {\n runIfMounted(() => setMeasured(false));\n };\n }\n\n return fnUtils.noop;\n }, [actualOptionsCount, listRef, open, options, size, visibleOptions, runIfMounted]);\n\n return [measured, height] as const;\n}\n\nexport function defaultFilterFn(optionText: string, search: string) {\n if (!search) return true;\n\n return optionText.toLowerCase().includes(search.toLowerCase());\n}\n\nexport function defaultGroupAccessor(option: GroupShape) {\n return option.label;\n}\n\nexport function defaultAccessor(option: OptionShape) {\n if (typeof option.content === 'string') return option.content;\n if (typeof option.value === 'string') return option.value;\n\n return option.key;\n}\n\n// TODO: перенести\nexport function usePrevious<T>(value: T) {\n const ref = useRef<T>();\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref.current;\n}\n\n// TODO: перенести\nexport const lastIndexOf = <T>(array: T[], predicate: (item: T) => boolean) => {\n for (let i = array.length - 1; i >= 0; i--) {\n if (predicate(array[i])) return i;\n }\n\n return -1;\n};\n\nexport function getSelectTestIds(dataTestId: string) {\n return {\n select: dataTestId,\n option: getDataTestId(dataTestId, 'option'),\n optionsList: getDataTestId(dataTestId, 'options-list'),\n clearButton: getDataTestId(dataTestId, 'options-list-clear'),\n applyButton: getDataTestId(dataTestId, 'options-list-apply'),\n field: getDataTestId(dataTestId, 'field'),\n fieldFormControl: getDataTestId(dataTestId, 'field-form-control'),\n fieldLeftAddons: getDataTestId(dataTestId, 'field-form-control-left-addons'),\n fieldRightAddons: getDataTestId(dataTestId, 'field-form-control-right-addons'),\n fieldError: getDataTestId(dataTestId, 'field-form-control-error-message'),\n fieldHint: getDataTestId(dataTestId, 'field-form-control-hint'),\n fieldClearIcon: getDataTestId(dataTestId, 'field-clear-icon'),\n searchInput: getDataTestId(dataTestId, 'search'),\n searchFormControl: getDataTestId(dataTestId, 'search-form-control'),\n searchInner: getDataTestId(dataTestId, 'search-form-control-inner'),\n searchLeftAddons: getDataTestId(dataTestId, 'search-form-control-left-addons'),\n searchRightAddons: getDataTestId(dataTestId, 'search-form-control-right-addons'),\n searchError: getDataTestId(dataTestId, 'search-form-control-error-message'),\n searchHint: getDataTestId(dataTestId, 'search-form-control-hint'),\n\n bottomSheet: getDataTestId(dataTestId, 'bottom-sheet'),\n bottomSheetHeader: getDataTestId(dataTestId, 'bottom-sheet-header'),\n bottomSheetContent: getDataTestId(dataTestId, 'bottom-sheet-content'),\n\n modal: getDataTestId(dataTestId, 'modal'),\n modalHeader: getDataTestId(dataTestId, 'modal-header'),\n modalContent: getDataTestId(dataTestId, 'modal-content'),\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../src/utils.ts"],"sourcesContent":["import {\n cloneElement,\n isValidElement,\n type ReactNode,\n type RefObject,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { fnUtils, getDataTestId, useIsMounted } from '@alfalab/core-components-shared';\nimport { useLayoutEffect_SAFE_FOR_SSR } from '@alfalab/hooks';\n\nimport { DEFAULT_SEPARATOR } from './consts';\nimport {\n type BaseSelectProps,\n type GroupShape,\n type OptionShape,\n type OptionsListProps,\n} from './typings';\n\nexport const isGroup = (item: OptionShape | GroupShape): item is GroupShape =>\n Object.prototype.hasOwnProperty.call(item, 'options');\n\nexport const isOptionShape = (item: OptionShape | string | null): item is OptionShape =>\n !!item && Object.prototype.hasOwnProperty.call(item, 'key');\n\nexport const joinOptions = ({\n selected,\n selectedMultiple,\n valueSeparator = DEFAULT_SEPARATOR,\n}: {\n selected?: OptionShape;\n selectedMultiple?: OptionShape[];\n valueSeparator?: string;\n}) => {\n const options = selectedMultiple || (selected ? [selected] : []);\n\n if (!options.length) return null;\n\n return options.reduce((acc: Array<ReactNode | string>, option: OptionShape, index: number) => {\n if (isValidElement(option.content)) {\n acc.push(cloneElement(option.content, { key: option.key }));\n } else {\n acc.push(option.content);\n }\n\n if (index < options.length - 1) acc.push(valueSeparator);\n\n return acc;\n }, []);\n};\n\n// За один проход делает список пунктов меню плоским и находит выбранные пункты по ключу\nexport function processOptions(\n options: BaseSelectProps['options'],\n selected: BaseSelectProps['selected'] = [],\n filterFn: (option: OptionShape | GroupShape) => boolean = () => true,\n filterGroup = false,\n) {\n const flatOptions: OptionShape[] = [];\n const filteredOptions: BaseSelectProps['options'] = [];\n\n const selectedArray = Array.isArray(selected) ? selected : [selected];\n const selectedOptions = selectedArray.filter(isOptionShape);\n const selectedKeys = selectedArray.filter(\n (option): option is string => typeof option === 'string',\n );\n\n const isSelected = (option: OptionShape) => selectedKeys.includes(option.key);\n\n const process = (option: OptionShape | GroupShape) => {\n const isGroupOption = isGroup(option);\n\n if (!isGroupOption && isSelected(option)) {\n selectedOptions.push(option);\n }\n\n if (!filterFn(option)) return false;\n\n if (isGroupOption) {\n if (filterGroup) {\n Array.prototype.push.apply(flatOptions, option.options);\n }\n } else {\n flatOptions.push(option);\n }\n\n return true;\n };\n\n options.forEach((option) => {\n if (isGroup(option)) {\n const group: GroupShape = {\n ...option,\n options: [],\n };\n\n option.options.forEach((groupOption) => {\n const matched = process(groupOption);\n\n if (matched) group.options.push(groupOption);\n });\n\n if (group.options.length) {\n filteredOptions.push(group);\n\n return;\n }\n\n if (!filterGroup) return;\n }\n const matched = process(option);\n\n if (matched) filteredOptions.push(option);\n });\n\n return { filteredOptions, flatOptions, selectedOptions };\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ntype useVisibleOptionsArgs = {\n /**\n * Количество видимых пунктов\n */\n visibleOptions: number;\n\n /**\n * Реф на контейнер с пунтами меню\n */\n listRef: RefObject<HTMLElement>;\n\n /**\n * Реф на контейнер, которому нужно установить высоту\n */\n styleTargetRef?: RefObject<HTMLElement>;\n\n /**\n * Флаг открытия меню\n */\n open?: boolean;\n\n /**\n * Позволяет вызвать пересчет высоты\n */\n invalidate?: unknown;\n\n /**\n * Список вариантов выбора\n */\n options?: Array<OptionShape | GroupShape>;\n\n /**\n * Максимальный размер варианта выбора\n */\n size?: Extract<OptionsListProps['size'], number>;\n\n /**\n * Учитывать действительное число вариантов выбора\n */\n actualOptionsCount?: boolean;\n};\n\n// copy-paste of original `useVisibleOptions` before https://github.com/core-ds/core-components/pull/1368\nexport function useVirtualVisibleOptions({\n visibleOptions,\n listRef,\n styleTargetRef = listRef,\n open,\n invalidate,\n options,\n size,\n actualOptionsCount,\n}: useVisibleOptionsArgs) {\n useEffect(() => {\n const measureOptionHeight = (element: HTMLElement) =>\n typeof size === 'number' ? Math.min(element.clientHeight, size) : element.clientHeight;\n\n const list = listRef.current;\n const styleTarget = styleTargetRef.current;\n\n if (open && list && styleTarget && visibleOptions > 0) {\n const childCount = list.children.length;\n const optionsNodes = ([] as HTMLElement[]).slice.call(\n list.children,\n 0,\n visibleOptions + 1,\n );\n\n let height = optionsNodes\n .slice(0, visibleOptions)\n .reduce((acc, child) => acc + measureOptionHeight(child), 0);\n\n if (visibleOptions < childCount) {\n const lastVisibleOptionHeight = measureOptionHeight(\n optionsNodes[optionsNodes.length - 1],\n );\n\n // Если кол-во опций больше visibleOptions на 1, то показываем все опции, иначе добавляем половинку\n height += Math.round(\n childCount - visibleOptions === 1\n ? lastVisibleOptionHeight\n : lastVisibleOptionHeight / 2,\n );\n } else if (\n visibleOptions > childCount &&\n actualOptionsCount &&\n typeof size === 'number'\n ) {\n const actualCount = (options ?? []).reduce(\n (sum, option) => sum + 1 + (isGroup(option) ? option.options.length : 0),\n 0,\n );\n\n height =\n Math.min(\n actualCount === 0 ? /** empty placeholder */ 1 : actualCount,\n visibleOptions,\n ) * size;\n\n if (visibleOptions < actualCount) {\n height += size / 2;\n }\n }\n\n styleTarget.style.height = `${height}px`;\n }\n }, [\n actualOptionsCount,\n listRef,\n open,\n options,\n size,\n styleTargetRef,\n visibleOptions,\n invalidate,\n ]);\n}\n\nexport function useVisibleOptions({\n visibleOptions,\n listRef,\n open,\n options,\n size,\n actualOptionsCount,\n}: useVisibleOptionsArgs) {\n const [, runIfMounted] = useIsMounted();\n const [measured, setMeasured] = useState(false);\n const [height, setHeight] = useState<number | undefined>();\n\n useLayoutEffect_SAFE_FOR_SSR(() => {\n const measureOptionHeight = (element: HTMLElement) =>\n typeof size === 'number' ? Math.min(element.clientHeight, size) : element.clientHeight;\n\n const list = listRef.current;\n\n if (open && list && visibleOptions > 0) {\n const childCount = list.children.length;\n const optionsNodes = ([] as HTMLElement[]).slice.call(\n list.children,\n 0,\n visibleOptions + 1,\n );\n\n let measuredHeight = optionsNodes\n .slice(0, visibleOptions)\n .reduce((acc, child) => acc + measureOptionHeight(child), 0);\n\n if (visibleOptions < childCount) {\n const lastVisibleOptionHeight = measureOptionHeight(\n optionsNodes[optionsNodes.length - 1],\n );\n\n // Если кол-во опций больше visibleOptions на 1, то показываем все опции, иначе добавляем половинку\n measuredHeight += Math.round(\n childCount - visibleOptions === 1\n ? lastVisibleOptionHeight\n : lastVisibleOptionHeight / 2,\n );\n } else if (\n visibleOptions > childCount &&\n actualOptionsCount &&\n typeof size === 'number'\n ) {\n const actualCount = (options ?? []).reduce(\n (sum, option) => sum + 1 + (isGroup(option) ? option.options.length : 0),\n 0,\n );\n\n measuredHeight =\n Math.min(\n actualCount === 0 ? /** empty placeholder */ 1 : actualCount,\n visibleOptions,\n ) * size;\n\n if (visibleOptions < actualCount) {\n measuredHeight += size / 2;\n }\n }\n\n setHeight(measuredHeight);\n\n setMeasured(true);\n\n return () => {\n runIfMounted(() => setMeasured(false));\n };\n }\n\n return fnUtils.noop;\n }, [actualOptionsCount, listRef, open, options, size, visibleOptions, runIfMounted]);\n\n return [measured, height] as const;\n}\n\nexport function defaultFilterFn(optionText: string, search: string) {\n if (!search) return true;\n\n return optionText.toLowerCase().includes(search.toLowerCase());\n}\n\nexport function defaultGroupAccessor(option: GroupShape) {\n return option.label;\n}\n\nexport function defaultAccessor(option: OptionShape) {\n if (typeof option.content === 'string') return option.content;\n if (typeof option.value === 'string') return option.value;\n\n return option.key;\n}\n\n// TODO: перенести\nexport function usePrevious<T>(value: T) {\n const ref = useRef<T>();\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref.current;\n}\n\n// TODO: перенести\nexport const lastIndexOf = <T>(array: T[], predicate: (item: T) => boolean) => {\n for (let i = array.length - 1; i >= 0; i--) {\n if (predicate(array[i])) return i;\n }\n\n return -1;\n};\n\nexport function getSelectTestIds(dataTestId: string) {\n return {\n select: dataTestId,\n option: getDataTestId(dataTestId, 'option'),\n optionsList: getDataTestId(dataTestId, 'options-list'),\n clearButton: getDataTestId(dataTestId, 'options-list-clear'),\n applyButton: getDataTestId(dataTestId, 'options-list-apply'),\n field: getDataTestId(dataTestId, 'field'),\n fieldFormControl: getDataTestId(dataTestId, 'field-form-control'),\n fieldLeftAddons: getDataTestId(dataTestId, 'field-form-control-left-addons'),\n fieldRightAddons: getDataTestId(dataTestId, 'field-form-control-right-addons'),\n fieldError: getDataTestId(dataTestId, 'field-form-control-error-message'),\n fieldHint: getDataTestId(dataTestId, 'field-form-control-hint'),\n fieldClearIcon: getDataTestId(dataTestId, 'field-clear-icon'),\n searchInput: getDataTestId(dataTestId, 'search'),\n searchFormControl: getDataTestId(dataTestId, 'search-form-control'),\n searchInner: getDataTestId(dataTestId, 'search-form-control-inner'),\n searchLeftAddons: getDataTestId(dataTestId, 'search-form-control-left-addons'),\n searchRightAddons: getDataTestId(dataTestId, 'search-form-control-right-addons'),\n searchError: getDataTestId(dataTestId, 'search-form-control-error-message'),\n searchHint: getDataTestId(dataTestId, 'search-form-control-hint'),\n\n bottomSheet: getDataTestId(dataTestId, 'bottom-sheet'),\n bottomSheetHeader: getDataTestId(dataTestId, 'bottom-sheet-header'),\n bottomSheetContent: getDataTestId(dataTestId, 'bottom-sheet-content'),\n\n modal: getDataTestId(dataTestId, 'modal'),\n modalHeader: getDataTestId(dataTestId, 'modal-header'),\n modalContent: getDataTestId(dataTestId, 'modal-content'),\n };\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alfalab/core-components-select",
|
|
3
|
-
"version": "19.1.
|
|
3
|
+
"version": "19.1.1",
|
|
4
4
|
"description": "Select component",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "MIT",
|
|
@@ -10,18 +10,18 @@
|
|
|
10
10
|
"main": "index.js",
|
|
11
11
|
"module": "./esm/index.js",
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@alfalab/core-components-base-modal": "^7.1.
|
|
14
|
-
"@alfalab/core-components-bottom-sheet": "^8.1.
|
|
15
|
-
"@alfalab/core-components-button": "^13.1.
|
|
16
|
-
"@alfalab/core-components-checkbox": "^6.1.
|
|
17
|
-
"@alfalab/core-components-form-control": "^14.0.
|
|
18
|
-
"@alfalab/core-components-input": "^17.1.
|
|
19
|
-
"@alfalab/core-components-modal": "^11.0.
|
|
20
|
-
"@alfalab/core-components-mq": "^6.0.
|
|
21
|
-
"@alfalab/core-components-popover": "^8.0.
|
|
22
|
-
"@alfalab/core-components-scrollbar": "^5.0.
|
|
23
|
-
"@alfalab/core-components-shared": "^2.1.
|
|
24
|
-
"@alfalab/core-components-skeleton": "^7.0.
|
|
13
|
+
"@alfalab/core-components-base-modal": "^7.1.2",
|
|
14
|
+
"@alfalab/core-components-bottom-sheet": "^8.1.2",
|
|
15
|
+
"@alfalab/core-components-button": "^13.1.1",
|
|
16
|
+
"@alfalab/core-components-checkbox": "^6.1.1",
|
|
17
|
+
"@alfalab/core-components-form-control": "^14.0.4",
|
|
18
|
+
"@alfalab/core-components-input": "^17.1.3",
|
|
19
|
+
"@alfalab/core-components-modal": "^11.0.5",
|
|
20
|
+
"@alfalab/core-components-mq": "^6.0.3",
|
|
21
|
+
"@alfalab/core-components-popover": "^8.0.3",
|
|
22
|
+
"@alfalab/core-components-scrollbar": "^5.0.2",
|
|
23
|
+
"@alfalab/core-components-shared": "^2.1.1",
|
|
24
|
+
"@alfalab/core-components-skeleton": "^7.0.2",
|
|
25
25
|
"@alfalab/hooks": "^1.13.1",
|
|
26
26
|
"@alfalab/icons-glyph": "^2.260.0",
|
|
27
27
|
"@juggle/resize-observer": "^3.3.1",
|
|
@@ -43,5 +43,5 @@
|
|
|
43
43
|
"directory": "dist"
|
|
44
44
|
},
|
|
45
45
|
"themesVersion": "15.0.2",
|
|
46
|
-
"varsVersion": "11.0.
|
|
46
|
+
"varsVersion": "11.0.2"
|
|
47
47
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type OptionProps, type OptionShape } from '../../typings';
|
|
3
3
|
import 'intersection-observer';
|
|
4
|
-
|
|
4
|
+
type OptionsFetcherResponse = {
|
|
5
5
|
options: OptionShape[];
|
|
6
6
|
hasMore: boolean;
|
|
7
7
|
};
|
|
8
|
-
|
|
8
|
+
type useLazyLoadingProps = {
|
|
9
9
|
/** Количество элементов на "странице" */
|
|
10
10
|
limit?: number;
|
|
11
11
|
/** Начальный номер "страницы" */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.js","sources":["../../src/presets/useLazyLoading/hook.tsx"],"sourcesContent":["import React, { type Reducer, useCallback, useEffect, useMemo, useReducer, useRef } from 'react';\n\nimport { type InputProps } from '@alfalab/core-components-input';\nimport { Skeleton } from '@alfalab/core-components-skeleton';\n\nimport { Option as DefaultOption } from '../../components/option';\nimport { type OptionProps, type OptionShape } from '../../typings';\n\nimport 'intersection-observer';\n\nconst DEBOUNCE_TIMEOUT = 300;\n\ntype OptionsFetcherResponse = {\n options: OptionShape[];\n hasMore: boolean;\n};\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ntype useLazyLoadingProps = {\n /** Количество элементов на \"странице\" */\n limit?: number;\n\n /** Начальный номер \"страницы\" */\n initialOffset?: number;\n\n /** Скелетон загружаемых элементов */\n skeleton?: React.ReactNode;\n\n /** Компонент пункта меню */\n Option?: React.FC<OptionProps>;\n\n /**\n * Функция-загрузчик опций.\n * @param offset - текущая страница\n * @param limit - количество элементов на странице\n * @param queryString - строчные данные, пробрасываемые для поиска из кастомного инпута, расположенного в заголовке OptionsList\n * @returns Promise<{\n * options - список опций следующей \"страницы\". Они аппендятся к предыдущим\n * hasMore - указывает, есть ли еще незагруженные элементы (в случае false перестает загружать \"следующую страницу\")\n * }>\n */\n optionsFetcher(\n offset: number,\n limit: number,\n queryString?: string,\n ): Promise<OptionsFetcherResponse>;\n};\n\nconst actions = {\n fetchOptionsStart() {\n return { type: 'FETCH_OPTIONS_START' } as const;\n },\n fetchOptionsBreak() {\n return { type: 'FETCH_OPTIONS_BREAK' } as const;\n },\n fetchOptionsSuccess(payload: { options: OptionShape[]; hasMore: boolean }) {\n return { type: 'FETCH_OPTIONS_SUCCESS', payload } as const;\n },\n setIsOpened(opened: boolean) {\n return { type: 'SET_IS_OPENED', payload: opened } as const;\n },\n setQueryString(qs: string) {\n return { type: 'SET_QUERY_STRING', payload: qs } as const;\n },\n reset() {\n return { type: 'RESET' } as const;\n },\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Actions = typeof actions extends { [key: string]: (...args: any) => infer U } ? U : never;\n\nconst skeletonStyle: React.CSSProperties = {\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n height: '16px',\n width: '50%',\n};\n\nexport function useLazyLoading({\n limit = 10,\n initialOffset = 0,\n optionsFetcher,\n skeleton = <Skeleton style={skeletonStyle} visible={true} />,\n Option = DefaultOption,\n}: useLazyLoadingProps) {\n const initialOptions: OptionShape[] = [];\n const initialLoading = false;\n\n const lazyLoadingInitialState = {\n opened: false,\n offset: initialOffset,\n options: initialOptions,\n loading: initialLoading,\n allOptionsLoaded: false,\n queryString: '',\n };\n\n const lazyLoadingReducer: Reducer<typeof lazyLoadingInitialState, Actions> = (\n state,\n action,\n ) => {\n switch (action.type) {\n case 'FETCH_OPTIONS_START': {\n return {\n ...state,\n loading: true,\n };\n }\n case 'FETCH_OPTIONS_BREAK': {\n return {\n ...state,\n loading: false,\n };\n }\n case 'FETCH_OPTIONS_SUCCESS': {\n return {\n ...state,\n options: [...state.options, ...action.payload.options],\n offset: state.offset + (action.payload.options.length ? 1 : 0),\n allOptionsLoaded: !action.payload.hasMore,\n loading: false,\n };\n }\n case 'SET_IS_OPENED': {\n return {\n ...state,\n opened: action.payload,\n };\n }\n case 'SET_QUERY_STRING': {\n return {\n // Изменение queryString подразумевает сброс текущих опций.\n ...lazyLoadingInitialState,\n opened: state.opened,\n loading: true,\n queryString: action.payload,\n };\n }\n case 'RESET': {\n return {\n ...lazyLoadingInitialState,\n };\n }\n default: {\n return state;\n }\n }\n };\n\n const [{ opened, offset, options, loading, allOptionsLoaded, queryString }, dispatch] =\n useReducer(lazyLoadingReducer, lazyLoadingInitialState);\n\n const abortFetchingOptionsRef = useRef<() => void>();\n\n const fetchNextOffsetOptions = useCallback(() => {\n dispatch(actions.fetchOptionsStart());\n\n new Promise<OptionsFetcherResponse>((resolve, reject) => {\n // eslint-disable-next-line no-unused-expressions\n abortFetchingOptionsRef.current?.();\n abortFetchingOptionsRef.current = reject;\n optionsFetcher(offset, limit, queryString).then((res) => {\n resolve(res);\n });\n })\n .then((res) => {\n dispatch(actions.fetchOptionsSuccess(res));\n abortFetchingOptionsRef.current = undefined;\n })\n .catch(\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n () => {},\n );\n }, [optionsFetcher, offset, limit, queryString]);\n\n const listRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n let observer: IntersectionObserver;\n\n if (opened && !loading && !allOptionsLoaded) {\n observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n if (observer) {\n observer.disconnect();\n }\n fetchNextOffsetOptions();\n }\n },\n {\n root: listRef.current,\n },\n );\n\n /*\n * Обсервим пересечение последней опции с контейнером.\n * Таким образом, загрузка следующей \"страницы\" начнется когда юзер доскроллит список\n * до верхнего края последней опции, что обеспечивает плавность\n */\n const optionList = listRef.current?.querySelectorAll('[role=\"option\"]');\n const lastOption = optionList?.[optionList.length - 1];\n\n if (lastOption) {\n observer.observe(lastOption);\n }\n }\n\n return () => {\n if (observer) {\n observer.disconnect();\n }\n };\n }, [offset, fetchNextOffsetOptions, opened, allOptionsLoaded, initialOffset, loading]);\n\n const onOpen = useCallback(\n (payload: { open?: boolean }) => {\n if (payload.open) {\n if (options.length === initialOptions.length) {\n fetchNextOffsetOptions();\n }\n } else {\n // eslint-disable-next-line no-unused-expressions\n abortFetchingOptionsRef.current?.();\n dispatch(actions.fetchOptionsBreak());\n }\n\n dispatch(actions.setIsOpened(payload.open ?? false));\n },\n [initialOptions.length, fetchNextOffsetOptions, options.length],\n );\n\n const fetchNextOptionsRef = useRef<() => void>();\n const fetchNextOptionsTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n useEffect(() => {\n fetchNextOptionsRef.current = fetchNextOffsetOptions;\n }, [fetchNextOffsetOptions]);\n\n const onQueryStringChange = useCallback<Exclude<InputProps['onChange'], undefined>>(\n (_, payload) => {\n dispatch(actions.setQueryString(payload.value));\n /* eslint-disable no-unused-expressions */\n\n /*\n * Если во время загрузки опций юзер ввел новый текст в инпут,\n * нужно прервать текущую загрузку, чтобы неактуальные опции не попали в выдачу\n */\n abortFetchingOptionsRef.current?.();\n\n listRef.current?.scrollTo({ top: 0 });\n\n /* Дебаунсим ввод текста, чтобы не отправлять запрос к новым опциям на каждый чих */\n if (fetchNextOptionsTimerRef.current) {\n clearTimeout(fetchNextOptionsTimerRef.current);\n }\n fetchNextOptionsTimerRef.current = setTimeout(() => {\n /*\n * После дебаунса необходимо вызвать функцию-загрузчик,\n * содержащую актуальные на данный момент данные оффсета и queryString.\n * Поэтому мы не можем обратиться напрямую к функции fetchNextOptions,\n * так как она будет замкнута на старые значения, актуальные на момент вызова хэндлера,\n * так что берем ее из обновляемого рефа\n */\n fetchNextOptionsRef.current?.();\n }, DEBOUNCE_TIMEOUT);\n /* eslint-enable */\n },\n [],\n );\n\n const renderOption = (props: OptionProps) => (\n <Option {...props} highlighted={loading ? false : props.highlighted} />\n );\n\n const skeletonOptions: OptionShape[] = useMemo(\n () =>\n Array(loading ? limit : 0)\n .fill(0)\n .map((_, key) => ({\n key: `loading-${key}`,\n disabled: true,\n content: skeleton,\n })),\n [loading, limit, skeleton],\n );\n\n const reset = useCallback(() => {\n dispatch(actions.reset());\n }, []);\n\n return {\n optionsProps: {\n Option: renderOption,\n options: [...options, ...skeletonOptions],\n optionsListProps: {\n ref: listRef,\n inputProps: {\n onChange: onQueryStringChange,\n value: queryString,\n },\n },\n onOpen,\n },\n reset,\n };\n}\n"],"names":["React","Skeleton","DefaultOption","__assign","__spreadArray","useReducer","useRef","useCallback","useEffect","useMemo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hook.js","sources":["../../src/presets/useLazyLoading/hook.tsx"],"sourcesContent":["import React, { type Reducer, useCallback, useEffect, useMemo, useReducer, useRef } from 'react';\n\nimport { type InputProps } from '@alfalab/core-components-input';\nimport { Skeleton } from '@alfalab/core-components-skeleton';\n\nimport { Option as DefaultOption } from '../../components/option';\nimport { type OptionProps, type OptionShape } from '../../typings';\n\nimport 'intersection-observer';\n\nconst DEBOUNCE_TIMEOUT = 300;\n\ntype OptionsFetcherResponse = {\n options: OptionShape[];\n hasMore: boolean;\n};\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ntype useLazyLoadingProps = {\n /** Количество элементов на \"странице\" */\n limit?: number;\n\n /** Начальный номер \"страницы\" */\n initialOffset?: number;\n\n /** Скелетон загружаемых элементов */\n skeleton?: React.ReactNode;\n\n /** Компонент пункта меню */\n Option?: React.FC<OptionProps>;\n\n /**\n * Функция-загрузчик опций.\n * @param offset - текущая страница\n * @param limit - количество элементов на странице\n * @param queryString - строчные данные, пробрасываемые для поиска из кастомного инпута, расположенного в заголовке OptionsList\n * @returns Promise<{\n * options - список опций следующей \"страницы\". Они аппендятся к предыдущим\n * hasMore - указывает, есть ли еще незагруженные элементы (в случае false перестает загружать \"следующую страницу\")\n * }>\n */\n optionsFetcher(\n offset: number,\n limit: number,\n queryString?: string,\n ): Promise<OptionsFetcherResponse>;\n};\n\nconst actions = {\n fetchOptionsStart() {\n return { type: 'FETCH_OPTIONS_START' } as const;\n },\n fetchOptionsBreak() {\n return { type: 'FETCH_OPTIONS_BREAK' } as const;\n },\n fetchOptionsSuccess(payload: { options: OptionShape[]; hasMore: boolean }) {\n return { type: 'FETCH_OPTIONS_SUCCESS', payload } as const;\n },\n setIsOpened(opened: boolean) {\n return { type: 'SET_IS_OPENED', payload: opened } as const;\n },\n setQueryString(qs: string) {\n return { type: 'SET_QUERY_STRING', payload: qs } as const;\n },\n reset() {\n return { type: 'RESET' } as const;\n },\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Actions = typeof actions extends { [key: string]: (...args: any) => infer U } ? U : never;\n\nconst skeletonStyle: React.CSSProperties = {\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n height: '16px',\n width: '50%',\n};\n\nexport function useLazyLoading({\n limit = 10,\n initialOffset = 0,\n optionsFetcher,\n skeleton = <Skeleton style={skeletonStyle} visible={true} />,\n Option = DefaultOption,\n}: useLazyLoadingProps) {\n const initialOptions: OptionShape[] = [];\n const initialLoading = false;\n\n const lazyLoadingInitialState = {\n opened: false,\n offset: initialOffset,\n options: initialOptions,\n loading: initialLoading,\n allOptionsLoaded: false,\n queryString: '',\n };\n\n const lazyLoadingReducer: Reducer<typeof lazyLoadingInitialState, Actions> = (\n state,\n action,\n ) => {\n switch (action.type) {\n case 'FETCH_OPTIONS_START': {\n return {\n ...state,\n loading: true,\n };\n }\n case 'FETCH_OPTIONS_BREAK': {\n return {\n ...state,\n loading: false,\n };\n }\n case 'FETCH_OPTIONS_SUCCESS': {\n return {\n ...state,\n options: [...state.options, ...action.payload.options],\n offset: state.offset + (action.payload.options.length ? 1 : 0),\n allOptionsLoaded: !action.payload.hasMore,\n loading: false,\n };\n }\n case 'SET_IS_OPENED': {\n return {\n ...state,\n opened: action.payload,\n };\n }\n case 'SET_QUERY_STRING': {\n return {\n // Изменение queryString подразумевает сброс текущих опций.\n ...lazyLoadingInitialState,\n opened: state.opened,\n loading: true,\n queryString: action.payload,\n };\n }\n case 'RESET': {\n return {\n ...lazyLoadingInitialState,\n };\n }\n default: {\n return state;\n }\n }\n };\n\n const [{ opened, offset, options, loading, allOptionsLoaded, queryString }, dispatch] =\n useReducer(lazyLoadingReducer, lazyLoadingInitialState);\n\n const abortFetchingOptionsRef = useRef<() => void>();\n\n const fetchNextOffsetOptions = useCallback(() => {\n dispatch(actions.fetchOptionsStart());\n\n new Promise<OptionsFetcherResponse>((resolve, reject) => {\n // eslint-disable-next-line no-unused-expressions\n abortFetchingOptionsRef.current?.();\n abortFetchingOptionsRef.current = reject;\n optionsFetcher(offset, limit, queryString).then((res) => {\n resolve(res);\n });\n })\n .then((res) => {\n dispatch(actions.fetchOptionsSuccess(res));\n abortFetchingOptionsRef.current = undefined;\n })\n .catch(\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n () => {},\n );\n }, [optionsFetcher, offset, limit, queryString]);\n\n const listRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n let observer: IntersectionObserver;\n\n if (opened && !loading && !allOptionsLoaded) {\n observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n if (observer) {\n observer.disconnect();\n }\n fetchNextOffsetOptions();\n }\n },\n {\n root: listRef.current,\n },\n );\n\n /*\n * Обсервим пересечение последней опции с контейнером.\n * Таким образом, загрузка следующей \"страницы\" начнется когда юзер доскроллит список\n * до верхнего края последней опции, что обеспечивает плавность\n */\n const optionList = listRef.current?.querySelectorAll('[role=\"option\"]');\n const lastOption = optionList?.[optionList.length - 1];\n\n if (lastOption) {\n observer.observe(lastOption);\n }\n }\n\n return () => {\n if (observer) {\n observer.disconnect();\n }\n };\n }, [offset, fetchNextOffsetOptions, opened, allOptionsLoaded, initialOffset, loading]);\n\n const onOpen = useCallback(\n (payload: { open?: boolean }) => {\n if (payload.open) {\n if (options.length === initialOptions.length) {\n fetchNextOffsetOptions();\n }\n } else {\n // eslint-disable-next-line no-unused-expressions\n abortFetchingOptionsRef.current?.();\n dispatch(actions.fetchOptionsBreak());\n }\n\n dispatch(actions.setIsOpened(payload.open ?? false));\n },\n [initialOptions.length, fetchNextOffsetOptions, options.length],\n );\n\n const fetchNextOptionsRef = useRef<() => void>();\n const fetchNextOptionsTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n useEffect(() => {\n fetchNextOptionsRef.current = fetchNextOffsetOptions;\n }, [fetchNextOffsetOptions]);\n\n const onQueryStringChange = useCallback<Exclude<InputProps['onChange'], undefined>>(\n (_, payload) => {\n dispatch(actions.setQueryString(payload.value));\n /* eslint-disable no-unused-expressions */\n\n /*\n * Если во время загрузки опций юзер ввел новый текст в инпут,\n * нужно прервать текущую загрузку, чтобы неактуальные опции не попали в выдачу\n */\n abortFetchingOptionsRef.current?.();\n\n listRef.current?.scrollTo({ top: 0 });\n\n /* Дебаунсим ввод текста, чтобы не отправлять запрос к новым опциям на каждый чих */\n if (fetchNextOptionsTimerRef.current) {\n clearTimeout(fetchNextOptionsTimerRef.current);\n }\n fetchNextOptionsTimerRef.current = setTimeout(() => {\n /*\n * После дебаунса необходимо вызвать функцию-загрузчик,\n * содержащую актуальные на данный момент данные оффсета и queryString.\n * Поэтому мы не можем обратиться напрямую к функции fetchNextOptions,\n * так как она будет замкнута на старые значения, актуальные на момент вызова хэндлера,\n * так что берем ее из обновляемого рефа\n */\n fetchNextOptionsRef.current?.();\n }, DEBOUNCE_TIMEOUT);\n /* eslint-enable */\n },\n [],\n );\n\n const renderOption = (props: OptionProps) => (\n <Option {...props} highlighted={loading ? false : props.highlighted} />\n );\n\n const skeletonOptions: OptionShape[] = useMemo(\n () =>\n Array(loading ? limit : 0)\n .fill(0)\n .map((_, key) => ({\n key: `loading-${key}`,\n disabled: true,\n content: skeleton,\n })),\n [loading, limit, skeleton],\n );\n\n const reset = useCallback(() => {\n dispatch(actions.reset());\n }, []);\n\n return {\n optionsProps: {\n Option: renderOption,\n options: [...options, ...skeletonOptions],\n optionsListProps: {\n ref: listRef,\n inputProps: {\n onChange: onQueryStringChange,\n value: queryString,\n },\n },\n onOpen,\n },\n reset,\n };\n}\n"],"names":["React","Skeleton","DefaultOption","__assign","__spreadArray","useReducer","useRef","useCallback","useEffect","useMemo"],"mappings":"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"}
|