@homecode/ui 4.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +29 -0
- package/dist/esm/index.js +78 -0
- package/dist/esm/node_modules/style-inject/dist/style-inject.es.js +28 -0
- package/dist/esm/src/components/AssistiveText/AssistiveText.js +10 -0
- package/dist/esm/src/components/AssistiveText/AssistiveText.styl.js +7 -0
- package/dist/esm/src/components/Button/Button.helpers.js +12 -0
- package/dist/esm/src/components/Button/Button.js +38 -0
- package/dist/esm/src/components/Button/Button.styl.js +7 -0
- package/dist/esm/src/components/ButtonGroup/ButtonGroup.js +10 -0
- package/dist/esm/src/components/ButtonGroup/ButtonGroup.styl.js +7 -0
- package/dist/esm/src/components/Checkbox/Checkbox.js +48 -0
- package/dist/esm/src/components/Checkbox/Checkbox.styl.js +7 -0
- package/dist/esm/src/components/Container/Container.js +12 -0
- package/dist/esm/src/components/Container/Container.styl.js +7 -0
- package/dist/esm/src/components/DateTime/DateTime.js +17 -0
- package/dist/esm/src/components/Draggable/Draggable.js +136 -0
- package/dist/esm/src/components/Draggable/Draggable.styl.js +7 -0
- package/dist/esm/src/components/Expand/Expand.js +24 -0
- package/dist/esm/src/components/Expand/Expand.styl.js +7 -0
- package/dist/esm/src/components/Form/Form.helpers.js +42 -0
- package/dist/esm/src/components/Form/Form.js +286 -0
- package/dist/esm/src/components/Form/Form.styl.js +7 -0
- package/dist/esm/src/components/Form/Form.types.js +1 -0
- package/dist/esm/src/components/Form/SubmitButtons/SubmitButtons.js +8 -0
- package/dist/esm/src/components/Form/SubmitButtons/SubmitButtons.styl.js +7 -0
- package/dist/esm/src/components/Form/Validator.js +36 -0
- package/dist/esm/src/components/Gallery/Dots/Dots.js +9 -0
- package/dist/esm/src/components/Gallery/Dots/Dots.styl.js +7 -0
- package/dist/esm/src/components/Gallery/Gallery.js +180 -0
- package/dist/esm/src/components/Gallery/Gallery.styl.js +7 -0
- package/dist/esm/src/components/Heading/Heading.js +37 -0
- package/dist/esm/src/components/Heading/Heading.styl.js +7 -0
- package/dist/esm/src/components/Icon/Icon.js +27 -0
- package/dist/esm/src/components/Icon/Icon.styl.js +7 -0
- package/dist/esm/src/components/Icon/icons/avatar.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/brokenImage.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/check.svg.js +19 -0
- package/dist/esm/src/components/Icon/icons/chevronDown.svg.js +20 -0
- package/dist/esm/src/components/Icon/icons/chevronLeft.svg.js +20 -0
- package/dist/esm/src/components/Icon/icons/chevronRight.svg.js +20 -0
- package/dist/esm/src/components/Icon/icons/chevronUp.svg.js +20 -0
- package/dist/esm/src/components/Icon/icons/close.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/colors.svg.js +60 -0
- package/dist/esm/src/components/Icon/icons/copy.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/delete.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/draft.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/edit.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/externalLink.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/fullscreen.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/fullscreenExit.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/gear.svg.js +20 -0
- package/dist/esm/src/components/Icon/icons/history.svg.js +17 -0
- package/dist/esm/src/components/Icon/icons/home.svg.js +19 -0
- package/dist/esm/src/components/Icon/icons/index.js +41 -0
- package/dist/esm/src/components/Icon/icons/loader.svg.js +45 -0
- package/dist/esm/src/components/Icon/icons/menu.svg.js +18 -0
- package/dist/esm/src/components/Icon/icons/mic.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/minus.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/moreHorizontal.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/moreVertical.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/plus.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/redo.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/requiredStar.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/save.svg.js +17 -0
- package/dist/esm/src/components/Icon/icons/send.svg.js +16 -0
- package/dist/esm/src/components/Icon/icons/settings.svg.js +52 -0
- package/dist/esm/src/components/Icon/icons/shoppingBag.svg.js +17 -0
- package/dist/esm/src/components/Icon/icons/social_email.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/social_instagram.svg.js +15 -0
- package/dist/esm/src/components/Icon/icons/social_telegram.svg.js +19 -0
- package/dist/esm/src/components/Icon/icons/undo.svg.js +15 -0
- package/dist/esm/src/components/Input/Input.js +331 -0
- package/dist/esm/src/components/Input/Input.styl.js +7 -0
- package/dist/esm/src/components/InputFile/InputFile.js +292 -0
- package/dist/esm/src/components/InputFile/InputFile.styl.js +7 -0
- package/dist/esm/src/components/InputFile/InputFile.types.js +1 -0
- package/dist/esm/src/components/InputFile/Item/Item.js +18 -0
- package/dist/esm/src/components/InputFile/Item/Item.styl.js +7 -0
- package/dist/esm/src/components/Label/Label.constants.json.js +8 -0
- package/dist/esm/src/components/Label/Label.helpers.js +35 -0
- package/dist/esm/src/components/Label/Label.js +58 -0
- package/dist/esm/src/components/Label/Label.styl.js +7 -0
- package/dist/esm/src/components/Lazy/Lazy.js +65 -0
- package/dist/esm/src/components/LightBox/LightBox.js +28 -0
- package/dist/esm/src/components/LightBox/LightBox.styl.js +7 -0
- package/dist/esm/src/components/Notifications/Notifications.constants.json.js +6 -0
- package/dist/esm/src/components/Notifications/Notifications.js +67 -0
- package/dist/esm/src/components/Notifications/Notifications.styl.js +7 -0
- package/dist/esm/src/components/Notifications/store.js +62 -0
- package/dist/esm/src/components/Paranja/Paranja.js +14 -0
- package/dist/esm/src/components/Paranja/Paranja.styl.js +7 -0
- package/dist/esm/src/components/Popup/Popup.helpers.js +31 -0
- package/dist/esm/src/components/Popup/Popup.js +396 -0
- package/dist/esm/src/components/Popup/Popup.styl.js +7 -0
- package/dist/esm/src/components/PopupMenu/PopupMenu.js +15 -0
- package/dist/esm/src/components/PopupMenu/PopupMenu.styl.js +7 -0
- package/dist/esm/src/components/Portal/Portal.js +19 -0
- package/dist/esm/src/components/RequiredStar/RequiredStar.js +12 -0
- package/dist/esm/src/components/RequiredStar/RequiredStar.styl.js +7 -0
- package/dist/esm/src/components/Router/Link/Link.js +61 -0
- package/dist/esm/src/components/Router/Link/Link.styl.js +7 -0
- package/dist/esm/src/components/Router/Redirect.js +12 -0
- package/dist/esm/src/components/Router/Route.js +4 -0
- package/dist/esm/src/components/Router/Router.helpers.js +33 -0
- package/dist/esm/src/components/Router/Router.js +68 -0
- package/dist/esm/src/components/Router/context.js +5 -0
- package/dist/esm/src/components/Router/store.js +55 -0
- package/dist/esm/src/components/Scroll/Scroll.js +274 -0
- package/dist/esm/src/components/Scroll/Scroll.styl.js +7 -0
- package/dist/esm/src/components/Select/Select.helpers.js +37 -0
- package/dist/esm/src/components/Select/Select.js +583 -0
- package/dist/esm/src/components/Select/Select.styl.js +7 -0
- package/dist/esm/src/components/Spinner/Spinner.js +11 -0
- package/dist/esm/src/components/Spinner/Spinner.styl.js +7 -0
- package/dist/esm/src/components/Spinner/spinner.svg.js +24 -0
- package/dist/esm/src/components/Table/Table.js +24 -0
- package/dist/esm/src/components/Table/Table.styl.js +7 -0
- package/dist/esm/src/components/Tabs/Tabs.js +43 -0
- package/dist/esm/src/components/Tabs/Tabs.styl.js +7 -0
- package/dist/esm/src/components/Text/Text.js +44 -0
- package/dist/esm/src/components/Text/Text.styl.js +7 -0
- package/dist/esm/src/components/Theme/Theme.defaults.js +50 -0
- package/dist/esm/src/components/Theme/Theme.helpers.js +67 -0
- package/dist/esm/src/components/Theme/Theme.js +13 -0
- package/dist/esm/src/components/VH/VH.js +33 -0
- package/dist/esm/src/components/Virtualized/List/List.js +124 -0
- package/dist/esm/src/components/Virtualized/List/List.styl.js +7 -0
- package/dist/esm/src/components/Virtualized/List/ListScroll.js +21 -0
- package/dist/esm/src/components/Virtualized/List/ListScroll.styl.js +7 -0
- package/dist/esm/src/components/Virtualized/Virtualized.helpers.js +14 -0
- package/dist/esm/src/components/Virtualized/Virtualized.js +200 -0
- package/dist/esm/src/components/Virtualized/Virtualized.styl.js +7 -0
- package/dist/esm/src/components/Virtualized/Virtualized.types.js +1 -0
- package/dist/esm/src/services/i18n.js +68 -0
- package/dist/esm/src/tools/array.js +60 -0
- package/dist/esm/src/tools/config.js +9 -0
- package/dist/esm/src/tools/debounce.js +11 -0
- package/dist/esm/src/tools/dom.js +46 -0
- package/dist/esm/src/tools/env.js +3 -0
- package/dist/esm/src/tools/file.js +11 -0
- package/dist/esm/src/tools/localStorage.js +31 -0
- package/dist/esm/src/tools/number.js +27 -0
- package/dist/esm/src/tools/object.js +5 -0
- package/dist/esm/src/tools/queryParams.js +20 -0
- package/dist/esm/src/tools/rangeMap.js +3 -0
- package/dist/esm/src/tools/resizeObserver.js +64 -0
- package/dist/esm/src/tools/scroll.js +41 -0
- package/dist/esm/src/tools/string.js +7 -0
- package/dist/esm/src/tools/throttle.js +30 -0
- package/dist/esm/src/tools/uid.js +7 -0
- package/dist/esm/types/index.d.ts +1 -0
- package/dist/esm/types/src/components/AssistiveText/AssistiveText.d.ts +3 -0
- package/dist/esm/types/src/components/AssistiveText/AssistiveText.types.d.ts +7 -0
- package/dist/esm/types/src/components/Button/Button.d.ts +4 -0
- package/dist/esm/types/src/components/Button/Button.helpers.d.ts +1 -0
- package/dist/esm/types/src/components/Button/Button.types.d.ts +14 -0
- package/dist/esm/types/src/components/ButtonGroup/ButtonGroup.d.ts +3 -0
- package/dist/esm/types/src/components/ButtonGroup/ButtonGroup.types.d.ts +5 -0
- package/dist/esm/types/src/components/Checkbox/Checkbox.d.ts +18 -0
- package/dist/esm/types/src/components/Checkbox/Checkbox.types.d.ts +10 -0
- package/dist/esm/types/src/components/Container/Container.d.ts +3 -0
- package/dist/esm/types/src/components/Container/Container.types.d.ts +13 -0
- package/dist/esm/types/src/components/DateTime/DateTime.d.ts +8 -0
- package/dist/esm/types/src/components/DateTime/DateTime.types.d.ts +6 -0
- package/dist/esm/types/src/components/Draggable/Draggable.d.ts +24 -0
- package/dist/esm/types/src/components/Draggable/Draggable.types.d.ts +11 -0
- package/dist/esm/types/src/components/Expand/Expand.d.ts +3 -0
- package/dist/esm/types/src/components/Expand/Expand.types.d.ts +16 -0
- package/dist/esm/types/src/components/Form/Form.d.ts +32 -0
- package/dist/esm/types/src/components/Form/Form.helpers.d.ts +6 -0
- package/dist/esm/types/src/components/Form/Form.types.d.ts +71 -0
- package/dist/esm/types/src/components/Form/SubmitButtons/SubmitButtons.d.ts +13 -0
- package/dist/esm/types/src/components/Form/Validator.d.ts +2 -0
- package/dist/esm/types/src/components/Form/index.d.ts +2 -0
- package/dist/esm/types/src/components/Gallery/Dots/Dots.d.ts +5 -0
- package/dist/esm/types/src/components/Gallery/Gallery.d.ts +36 -0
- package/dist/esm/types/src/components/Gallery/Gallery.types.d.ts +12 -0
- package/dist/esm/types/src/components/Heading/Heading.d.ts +3 -0
- package/dist/esm/types/src/components/Heading/Heading.types.d.ts +5 -0
- package/dist/esm/types/src/components/Icon/Icon.d.ts +45 -0
- package/dist/esm/types/src/components/Icon/Icon.example.d.ts +3 -0
- package/dist/esm/types/src/components/Icon/Icon.helpers.d.ts +1 -0
- package/dist/esm/types/src/components/Icon/Icon.types.d.ts +8 -0
- package/dist/esm/types/src/components/Icon/icons/index.d.ts +39 -0
- package/dist/esm/types/src/components/Input/Input.d.ts +42 -0
- package/dist/esm/types/src/components/Input/Input.types.d.ts +21 -0
- package/dist/esm/types/src/components/InputFile/InputFile.d.ts +48 -0
- package/dist/esm/types/src/components/InputFile/InputFile.types.d.ts +22 -0
- package/dist/esm/types/src/components/InputFile/Item/Item.d.ts +16 -0
- package/dist/esm/types/src/components/Label/Label.d.ts +19 -0
- package/dist/esm/types/src/components/Label/Label.helpers.d.ts +1 -0
- package/dist/esm/types/src/components/Label/Label.types.d.ts +8 -0
- package/dist/esm/types/src/components/Lazy/Lazy.d.ts +18 -0
- package/dist/esm/types/src/components/Lazy/Lazy.types.d.ts +15 -0
- package/dist/esm/types/src/components/LightBox/LightBox.d.ts +3 -0
- package/dist/esm/types/src/components/LightBox/LightBox.types.d.ts +7 -0
- package/dist/esm/types/src/components/Notifications/Notifications.d.ts +2 -0
- package/dist/esm/types/src/components/Notifications/Notifications.types.d.ts +19 -0
- package/dist/esm/types/src/components/Notifications/store.d.ts +2 -0
- package/dist/esm/types/src/components/Paranja/Paranja.d.ts +3 -0
- package/dist/esm/types/src/components/Paranja/Paranja.types.d.ts +8 -0
- package/dist/esm/types/src/components/Popup/Popup.d.ts +73 -0
- package/dist/esm/types/src/components/Popup/Popup.helpers.d.ts +8 -0
- package/dist/esm/types/src/components/Popup/Popup.types.d.ts +34 -0
- package/dist/esm/types/src/components/PopupMenu/PopupMenu.d.ts +3 -0
- package/dist/esm/types/src/components/PopupMenu/PopupMenu.types.d.ts +13 -0
- package/dist/esm/types/src/components/Portal/Portal.d.ts +7 -0
- package/dist/esm/types/src/components/RequiredStar/RequiredStar.d.ts +3 -0
- package/dist/esm/types/src/components/RequiredStar/RequiredStar.types.d.ts +6 -0
- package/dist/esm/types/src/components/Router/Link/Link.d.ts +1 -0
- package/dist/esm/types/src/components/Router/Link/Link.types.d.ts +12 -0
- package/dist/esm/types/src/components/Router/Redirect.d.ts +5 -0
- package/dist/esm/types/src/components/Router/Route.d.ts +5 -0
- package/dist/esm/types/src/components/Router/Router.d.ts +7 -0
- package/dist/esm/types/src/components/Router/Router.helpers.d.ts +2 -0
- package/dist/esm/types/src/components/Router/Router.types.d.ts +18 -0
- package/dist/esm/types/src/components/Router/context.d.ts +6 -0
- package/dist/esm/types/src/components/Router/store.d.ts +2 -0
- package/dist/esm/types/src/components/Scroll/Scroll.d.ts +67 -0
- package/dist/esm/types/src/components/Scroll/Scroll.types.d.ts +27 -0
- package/dist/esm/types/src/components/Select/Select.d.ts +94 -0
- package/dist/esm/types/src/components/Select/Select.helpers.d.ts +14 -0
- package/dist/esm/types/src/components/Select/Select.types.d.ts +74 -0
- package/dist/esm/types/src/components/Spinner/Spinner.d.ts +3 -0
- package/dist/esm/types/src/components/Spinner/Spinner.types.d.ts +4 -0
- package/dist/esm/types/src/components/Table/Table.d.ts +8 -0
- package/dist/esm/types/src/components/Table/Table.types.d.ts +19 -0
- package/dist/esm/types/src/components/Tabs/Tabs.d.ts +3 -0
- package/dist/esm/types/src/components/Tabs/Tabs.types.d.ts +27 -0
- package/dist/esm/types/src/components/Text/Text.d.ts +7 -0
- package/dist/esm/types/src/components/Theme/Theme.d.ts +5 -0
- package/dist/esm/types/src/components/Theme/Theme.defaults.d.ts +32 -0
- package/dist/esm/types/src/components/Theme/Theme.helpers.d.ts +15 -0
- package/dist/esm/types/src/components/Theme/Theme.types.d.ts +6 -0
- package/dist/esm/types/src/components/VH/VH.d.ts +12 -0
- package/dist/esm/types/src/components/Virtualized/Cards/Cards.d.ts +26 -0
- package/dist/esm/types/src/components/Virtualized/List/List.d.ts +44 -0
- package/dist/esm/types/src/components/Virtualized/List/ListScroll.d.ts +8 -0
- package/dist/esm/types/src/components/Virtualized/Table/Table.d.ts +26 -0
- package/dist/esm/types/src/components/Virtualized/Virtualized.d.ts +34 -0
- package/dist/esm/types/src/components/Virtualized/Virtualized.helpers.d.ts +18 -0
- package/dist/esm/types/src/components/Virtualized/Virtualized.types.d.ts +53 -0
- package/dist/esm/types/src/components/Virtualized/index.d.ts +4 -0
- package/dist/esm/types/src/components/index.d.ts +33 -0
- package/dist/esm/types/src/index.d.ts +3 -0
- package/dist/esm/types/src/services/i18n.d.ts +16 -0
- package/dist/esm/types/src/services/index.d.ts +1 -0
- package/dist/esm/types/src/tools/array.d.ts +8 -0
- package/dist/esm/types/src/tools/config.d.ts +10 -0
- package/dist/esm/types/src/tools/debounce.d.ts +1 -0
- package/dist/esm/types/src/tools/dom.d.ts +12 -0
- package/dist/esm/types/src/tools/env.d.ts +1 -0
- package/dist/esm/types/src/tools/file.d.ts +1 -0
- package/dist/esm/types/src/tools/index.d.ts +16 -0
- package/dist/esm/types/src/tools/localStorage.d.ts +12 -0
- package/dist/esm/types/src/tools/number.d.ts +5 -0
- package/dist/esm/types/src/tools/object.d.ts +1 -0
- package/dist/esm/types/src/tools/queryParams.d.ts +3 -0
- package/dist/esm/types/src/tools/rangeMap.d.ts +2 -0
- package/dist/esm/types/src/tools/resizeObserver.d.ts +2 -0
- package/dist/esm/types/src/tools/scroll.d.ts +5 -0
- package/dist/esm/types/src/tools/string.d.ts +1 -0
- package/dist/esm/types/src/tools/throttle.d.ts +6 -0
- package/dist/esm/types/src/tools/uid.d.ts +1 -0
- package/dist/esm/types/src/types.d.ts +15 -0
- package/package.json +117 -0
|
@@ -0,0 +1,583 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { Component, createRef } from 'react';
|
|
3
|
+
import cn from 'classnames';
|
|
4
|
+
import compare from 'compareq';
|
|
5
|
+
import pick from 'lodash.pick';
|
|
6
|
+
import omit from 'lodash.omit';
|
|
7
|
+
import { createStore } from 'justorm/react';
|
|
8
|
+
import Time from 'timen';
|
|
9
|
+
import { Icon } from '../Icon/Icon.js';
|
|
10
|
+
import { Button } from '../Button/Button.js';
|
|
11
|
+
import { Input } from '../Input/Input.js';
|
|
12
|
+
import { Label } from '../Label/Label.js';
|
|
13
|
+
import { Popup } from '../Popup/Popup.js';
|
|
14
|
+
import { Scroll } from '../Scroll/Scroll.js';
|
|
15
|
+
import { RequiredStar } from '../RequiredStar/RequiredStar.js';
|
|
16
|
+
import { AssistiveText } from '../AssistiveText/AssistiveText.js';
|
|
17
|
+
import { INTERACTION_MODE, getInteractionMode } from '../../tools/dom.js';
|
|
18
|
+
import throttle from '../../tools/throttle.js';
|
|
19
|
+
import * as Select_helpers from './Select.helpers.js';
|
|
20
|
+
import { mapById, buildOptionsTree, isMultiple, renderLabel } from './Select.helpers.js';
|
|
21
|
+
import S from './Select.styl.js';
|
|
22
|
+
|
|
23
|
+
const SelectHelpers = Select_helpers;
|
|
24
|
+
class Select extends Component {
|
|
25
|
+
store;
|
|
26
|
+
inputRef = createRef();
|
|
27
|
+
triggerInputRef = createRef();
|
|
28
|
+
contentRef = createRef();
|
|
29
|
+
scrollInnerElem;
|
|
30
|
+
onScrollInnerRef = elem => (this.scrollInnerElem = elem);
|
|
31
|
+
focusedElem;
|
|
32
|
+
timers = Time.create();
|
|
33
|
+
items = [];
|
|
34
|
+
maxIndex = -1;
|
|
35
|
+
isFirstSelectedMeet = false;
|
|
36
|
+
isTree = false;
|
|
37
|
+
focusedItemId = '';
|
|
38
|
+
preventClose = false;
|
|
39
|
+
searchValLower = '';
|
|
40
|
+
optionsTree = [];
|
|
41
|
+
ids = {
|
|
42
|
+
items: {},
|
|
43
|
+
childIds: {},
|
|
44
|
+
};
|
|
45
|
+
static defaultProps = {
|
|
46
|
+
size: 'm',
|
|
47
|
+
additionalOptions: [],
|
|
48
|
+
};
|
|
49
|
+
constructor(props) {
|
|
50
|
+
super(props);
|
|
51
|
+
this.onOptionsChange();
|
|
52
|
+
this.store = createStore(this, {
|
|
53
|
+
searchVal: '',
|
|
54
|
+
isOpen: false,
|
|
55
|
+
isFocused: false,
|
|
56
|
+
focusedItemIndex: 0,
|
|
57
|
+
selected: this.getDefaultSelected(),
|
|
58
|
+
expanded: this.getDefaultExpanded(props.value),
|
|
59
|
+
labelClipPath: '',
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
componentDidUpdate(prevProps) {
|
|
63
|
+
const { options, value } = this.props;
|
|
64
|
+
if (!compare(value, prevProps.value)) {
|
|
65
|
+
this.store.selected = this.getDefaultSelected();
|
|
66
|
+
}
|
|
67
|
+
if (!compare(options, prevProps.options)) {
|
|
68
|
+
this.onOptionsChange();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
componentWillUnmount() {
|
|
72
|
+
this.timers.clear();
|
|
73
|
+
this.unDocumetnKeyDown();
|
|
74
|
+
this.unDocumentClick();
|
|
75
|
+
}
|
|
76
|
+
onOptionsChange() {
|
|
77
|
+
const { options } = this.props;
|
|
78
|
+
this.ids = mapById(options);
|
|
79
|
+
this.optionsTree = buildOptionsTree(options, this.ids);
|
|
80
|
+
this.items = this.getItems();
|
|
81
|
+
this.maxIndex = Math.max(0, this.items.length - 1);
|
|
82
|
+
if (this.store?.focusedItemIndex > this.maxIndex) {
|
|
83
|
+
this.store.focusedItemIndex = this.maxIndex;
|
|
84
|
+
this.focusedItemId = this.items[this.maxIndex].id;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
coerceType(id) {
|
|
88
|
+
const isNumber = typeof this.ids.items[id].id === 'number';
|
|
89
|
+
if (isNumber)
|
|
90
|
+
return parseFloat(id);
|
|
91
|
+
return id;
|
|
92
|
+
}
|
|
93
|
+
getDefaultExpanded(value) {
|
|
94
|
+
const { expandSelected } = this.props;
|
|
95
|
+
const { items } = this.ids;
|
|
96
|
+
if (!expandSelected)
|
|
97
|
+
return {};
|
|
98
|
+
if (!value)
|
|
99
|
+
return {};
|
|
100
|
+
const result = {};
|
|
101
|
+
const stack = [...(this.isMultiple() ? value : [value])];
|
|
102
|
+
// go through all selected items and mark their parents as expanded
|
|
103
|
+
while (stack.length) {
|
|
104
|
+
const pointerId = stack.shift();
|
|
105
|
+
const item = items[pointerId];
|
|
106
|
+
if (item.parentId) {
|
|
107
|
+
result[item.parentId] = true;
|
|
108
|
+
stack.push(item.parentId);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
113
|
+
getDefaultSelected() {
|
|
114
|
+
const { value } = this.props;
|
|
115
|
+
if (!value)
|
|
116
|
+
return {};
|
|
117
|
+
if (this.isMultiple()) {
|
|
118
|
+
// @ts-ignore
|
|
119
|
+
return value.reduce((acc, id) => {
|
|
120
|
+
const parentId = this.getParentId(id);
|
|
121
|
+
if (parentId) {
|
|
122
|
+
if (!acc[parentId]) {
|
|
123
|
+
acc[parentId] = [id];
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
acc[parentId].push(id);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
acc[id] = this.ids.childIds[id] ? [] : true;
|
|
131
|
+
}
|
|
132
|
+
return acc;
|
|
133
|
+
}, {});
|
|
134
|
+
}
|
|
135
|
+
// @ts-ignore
|
|
136
|
+
return { [value]: true };
|
|
137
|
+
}
|
|
138
|
+
isDisabled() {
|
|
139
|
+
return this.props.disabled || this.items.length === 0;
|
|
140
|
+
}
|
|
141
|
+
isClickedInside = elem => elem.closest(`.${S.root}`) || elem.closest(`.${S.options}`);
|
|
142
|
+
onFocusedElemRef = elem => {
|
|
143
|
+
this.focusedElem = elem;
|
|
144
|
+
if (elem) {
|
|
145
|
+
const content = this.contentRef.current;
|
|
146
|
+
if (!content)
|
|
147
|
+
return;
|
|
148
|
+
const { top, bottom } = elem.getBoundingClientRect();
|
|
149
|
+
const rect = this.contentRef.current.getBoundingClientRect();
|
|
150
|
+
const list = this.scrollInnerElem;
|
|
151
|
+
if (top < rect.top) {
|
|
152
|
+
list.scrollTop -= rect.top - top;
|
|
153
|
+
}
|
|
154
|
+
else if (bottom > rect.bottom) {
|
|
155
|
+
list.scrollTop += bottom - rect.bottom;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
onDocumentClick = e => {
|
|
160
|
+
if (!this.isClickedInside(e.target)) {
|
|
161
|
+
this.store.isOpen = false;
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
onDocumentKeyDown = e => {
|
|
165
|
+
const currIndex = this.store.focusedItemIndex;
|
|
166
|
+
switch (e.key) {
|
|
167
|
+
case 'ArrowDown':
|
|
168
|
+
if (currIndex < this.maxIndex)
|
|
169
|
+
this.setItemFocus(currIndex + 1);
|
|
170
|
+
break;
|
|
171
|
+
case 'ArrowUp':
|
|
172
|
+
if (currIndex > 0)
|
|
173
|
+
this.setItemFocus(currIndex - 1);
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
onDocumentKeyUp = e => {
|
|
178
|
+
const currIndex = this.store.focusedItemIndex;
|
|
179
|
+
if (currIndex === -1)
|
|
180
|
+
return;
|
|
181
|
+
switch (e.key) {
|
|
182
|
+
case 'Enter':
|
|
183
|
+
case 'Space':
|
|
184
|
+
if (this.store.isOpen) {
|
|
185
|
+
e.preventDefault();
|
|
186
|
+
e.stopPropagation();
|
|
187
|
+
this.onItemToggle(this.items[currIndex].id);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
unDocumetnKeyDown = () => document.removeEventListener('keyup', this.onDocumentKeyUp, true);
|
|
192
|
+
unDocumentClick = () => document.removeEventListener('click', this.onDocumentClick);
|
|
193
|
+
onFocus = e => {
|
|
194
|
+
const { onFocus } = this.props;
|
|
195
|
+
this.setSearchVal('');
|
|
196
|
+
this.store.isFocused = true;
|
|
197
|
+
onFocus?.(e);
|
|
198
|
+
};
|
|
199
|
+
onBlur = e => {
|
|
200
|
+
const { onBlur } = this.props;
|
|
201
|
+
this.store.isFocused = false;
|
|
202
|
+
onBlur?.(e);
|
|
203
|
+
};
|
|
204
|
+
onSearchChange = (e, value) => {
|
|
205
|
+
this.setSearchVal(value);
|
|
206
|
+
};
|
|
207
|
+
onExpandClick(e, id) {
|
|
208
|
+
const { expanded } = this.store;
|
|
209
|
+
e.preventDefault();
|
|
210
|
+
e.stopPropagation();
|
|
211
|
+
this.store.expanded[id] = !expanded[id];
|
|
212
|
+
}
|
|
213
|
+
onItemToggle(id) {
|
|
214
|
+
this.onChange(this.getNewSelected(id));
|
|
215
|
+
if (!this.isMultiple())
|
|
216
|
+
this.store.isOpen = false;
|
|
217
|
+
}
|
|
218
|
+
onChange(selected) {
|
|
219
|
+
const { onChange } = this.props;
|
|
220
|
+
this.store.selected = selected;
|
|
221
|
+
onChange(this.getValue());
|
|
222
|
+
}
|
|
223
|
+
onLabelClipPathChange = clipPath => (this.store.labelClipPath = clipPath);
|
|
224
|
+
onPopupOpen = () => {
|
|
225
|
+
this.store.isOpen = true;
|
|
226
|
+
if (this.isMultiple()) {
|
|
227
|
+
document.addEventListener('click', this.onDocumentClick);
|
|
228
|
+
}
|
|
229
|
+
document.addEventListener('keydown', this.onDocumentKeyDown);
|
|
230
|
+
document.addEventListener('keyup', this.onDocumentKeyUp, true);
|
|
231
|
+
};
|
|
232
|
+
onPopupClose = () => {
|
|
233
|
+
this.setItemFocus(-1);
|
|
234
|
+
this.store.isOpen = false;
|
|
235
|
+
this.unDocumentClick();
|
|
236
|
+
this.unDocumetnKeyDown();
|
|
237
|
+
};
|
|
238
|
+
onOptionHover = throttle(id => {
|
|
239
|
+
const mode = getInteractionMode();
|
|
240
|
+
if (mode !== INTERACTION_MODE.POINTER)
|
|
241
|
+
return;
|
|
242
|
+
const index = this.items.findIndex(item => item.id === id);
|
|
243
|
+
this.setItemFocus(index);
|
|
244
|
+
}, 100, { trailing: true });
|
|
245
|
+
setItemFocus = index => {
|
|
246
|
+
this.focusedItemId = this.items[index]?.id;
|
|
247
|
+
this.store.focusedItemIndex = index;
|
|
248
|
+
};
|
|
249
|
+
toggle = () => {
|
|
250
|
+
this.store.isOpen = !this.store.isOpen;
|
|
251
|
+
};
|
|
252
|
+
setSearchVal(searchVal) {
|
|
253
|
+
this.searchValLower = searchVal.toLowerCase();
|
|
254
|
+
this.store.searchVal = searchVal;
|
|
255
|
+
}
|
|
256
|
+
getItems = () => [...this.props.additionalOptions, ...this.optionsTree];
|
|
257
|
+
getParentId = id => this.ids.items[id]?.parentId;
|
|
258
|
+
getChildIds = id => this.ids.childIds[id];
|
|
259
|
+
isMultiple = () => isMultiple(this.props.value);
|
|
260
|
+
isErrorVisible = () => !this.store.isOpen && Boolean(this.props.error);
|
|
261
|
+
isSelected(id) {
|
|
262
|
+
const { selected } = this.store;
|
|
263
|
+
const parentId = this.getParentId(id);
|
|
264
|
+
const hasParent = parentId !== undefined;
|
|
265
|
+
if (hasParent) {
|
|
266
|
+
// @ts-ignore
|
|
267
|
+
return selected[parentId]?.indexOf(id) > -1;
|
|
268
|
+
}
|
|
269
|
+
const selectedVal = selected[id];
|
|
270
|
+
if (Array.isArray(selectedVal)) {
|
|
271
|
+
const childCount = this.getChildIds(id).length;
|
|
272
|
+
if (selectedVal.length !== childCount)
|
|
273
|
+
return 'indeterminate';
|
|
274
|
+
return selectedVal.length > 0;
|
|
275
|
+
}
|
|
276
|
+
return selectedVal;
|
|
277
|
+
}
|
|
278
|
+
addSelected(id, selected) {
|
|
279
|
+
if (!this.isMultiple())
|
|
280
|
+
return { [id]: true };
|
|
281
|
+
const parentId = this.getParentId(id);
|
|
282
|
+
const childIds = this.getChildIds(id);
|
|
283
|
+
const hasParent = parentId !== undefined;
|
|
284
|
+
const hasChilds = childIds?.length > 0;
|
|
285
|
+
if (!hasParent && !hasChilds) {
|
|
286
|
+
// top level without childs
|
|
287
|
+
return { ...selected, [id]: true };
|
|
288
|
+
}
|
|
289
|
+
this.addSelectedToParent(id, selected);
|
|
290
|
+
childIds?.forEach(childId => this.addSelected(childId, selected));
|
|
291
|
+
return selected;
|
|
292
|
+
}
|
|
293
|
+
addSelectedToParent(id, selected) {
|
|
294
|
+
const parentId = this.getParentId(id);
|
|
295
|
+
if (parentId === undefined)
|
|
296
|
+
return;
|
|
297
|
+
if (!selected[parentId])
|
|
298
|
+
selected[parentId] = [];
|
|
299
|
+
const arr = selected[parentId];
|
|
300
|
+
const index = arr.indexOf(id);
|
|
301
|
+
if (index > -1)
|
|
302
|
+
return;
|
|
303
|
+
arr.push(id);
|
|
304
|
+
this.addSelectedToParent(parentId, selected);
|
|
305
|
+
}
|
|
306
|
+
removeSelected(id, selected) {
|
|
307
|
+
if (!this.isMultiple())
|
|
308
|
+
return {};
|
|
309
|
+
this.removeSelectedChilds(id, selected);
|
|
310
|
+
this.removeSelectedFromParent(id, selected);
|
|
311
|
+
return selected;
|
|
312
|
+
}
|
|
313
|
+
removeSelectedChilds(id, selected) {
|
|
314
|
+
if (Array.isArray(selected[id])) {
|
|
315
|
+
selected[id].forEach(childId => this.removeSelectedChilds(childId, selected));
|
|
316
|
+
}
|
|
317
|
+
delete selected[id];
|
|
318
|
+
}
|
|
319
|
+
removeSelectedFromParent(id, selected) {
|
|
320
|
+
const parentId = this.getParentId(id);
|
|
321
|
+
const parentSelected = selected[parentId];
|
|
322
|
+
if (parentId === undefined || !parentSelected)
|
|
323
|
+
return;
|
|
324
|
+
const index = parentSelected.indexOf(id);
|
|
325
|
+
if (index > -1)
|
|
326
|
+
parentSelected.splice(index, 1);
|
|
327
|
+
if (parentSelected.length === 0) {
|
|
328
|
+
delete selected[parentId];
|
|
329
|
+
this.removeSelectedFromParent(parentId, selected);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
selectAll = () => {
|
|
333
|
+
let selected = {};
|
|
334
|
+
this.optionsTree.forEach(({ id }) => (selected = this.addSelected(id, selected)));
|
|
335
|
+
this.onChange(selected);
|
|
336
|
+
};
|
|
337
|
+
setSelected(ids) {
|
|
338
|
+
let selected = {};
|
|
339
|
+
ids.forEach(id => (selected = this.addSelected(id, selected)));
|
|
340
|
+
this.onChange(selected);
|
|
341
|
+
}
|
|
342
|
+
dropSelected = () => {
|
|
343
|
+
this.setSelected([]);
|
|
344
|
+
};
|
|
345
|
+
getNewSelected(id) {
|
|
346
|
+
const { required } = this.props;
|
|
347
|
+
const selected = JSON.parse(JSON.stringify(this.store.selected));
|
|
348
|
+
if (this.isSelected(id)) {
|
|
349
|
+
if (required &&
|
|
350
|
+
(!this.isMultiple() || Object.keys(selected).length === 1)) {
|
|
351
|
+
return selected;
|
|
352
|
+
}
|
|
353
|
+
return this.removeSelected(id, selected);
|
|
354
|
+
}
|
|
355
|
+
return this.addSelected(id, selected);
|
|
356
|
+
}
|
|
357
|
+
getValue() {
|
|
358
|
+
const { selected } = this.store;
|
|
359
|
+
const entries = Object.entries(selected);
|
|
360
|
+
if (this.isMultiple()) {
|
|
361
|
+
// @ts-ignore
|
|
362
|
+
return entries.reduce((acc, [id, val]) => {
|
|
363
|
+
if (Array.isArray(val))
|
|
364
|
+
return [...acc, ...val];
|
|
365
|
+
return [...acc, this.coerceType(id)];
|
|
366
|
+
}, []);
|
|
367
|
+
}
|
|
368
|
+
const entry = entries[0];
|
|
369
|
+
if (entry)
|
|
370
|
+
return this.coerceType(entry[0]);
|
|
371
|
+
return null;
|
|
372
|
+
}
|
|
373
|
+
getInputVal() {
|
|
374
|
+
const { isFocused, searchVal, selected } = this.store;
|
|
375
|
+
if (isFocused)
|
|
376
|
+
return searchVal;
|
|
377
|
+
const selectedPlain = Object.entries(selected).reduce((acc, entry) => {
|
|
378
|
+
const parentId = this.coerceType(entry[0]);
|
|
379
|
+
const val = entry[1];
|
|
380
|
+
if (acc.indexOf(parentId) === -1)
|
|
381
|
+
acc.push(parentId);
|
|
382
|
+
if (Array.isArray(val)) {
|
|
383
|
+
val.forEach(id => {
|
|
384
|
+
if (acc.indexOf(id) === -1)
|
|
385
|
+
acc.push(id);
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
return acc;
|
|
389
|
+
}, []);
|
|
390
|
+
return selectedPlain.map(id => this.ids.items[id].label).join(', ');
|
|
391
|
+
}
|
|
392
|
+
getLabel(id) {
|
|
393
|
+
const { label, render } = Object(this.ids.items[id]);
|
|
394
|
+
if (render)
|
|
395
|
+
return render(label);
|
|
396
|
+
return label;
|
|
397
|
+
}
|
|
398
|
+
getFieldLabel(label) {
|
|
399
|
+
// @ts-ignore
|
|
400
|
+
const length = this.props.value?.length;
|
|
401
|
+
if (this.isMultiple() && length)
|
|
402
|
+
return `${label} (${length})`;
|
|
403
|
+
return label;
|
|
404
|
+
}
|
|
405
|
+
getSelectedLabel() {
|
|
406
|
+
const { value } = this.props;
|
|
407
|
+
if (!this.isMultiple())
|
|
408
|
+
return this.getLabel(value);
|
|
409
|
+
if (!value)
|
|
410
|
+
return '';
|
|
411
|
+
return (value
|
|
412
|
+
// @ts-ignore
|
|
413
|
+
.reduce((acc, id) => {
|
|
414
|
+
const label = this.getLabel(id);
|
|
415
|
+
return label ? [...acc, label] : acc;
|
|
416
|
+
}, [])
|
|
417
|
+
.join(', '));
|
|
418
|
+
}
|
|
419
|
+
filterOption({ label }) {
|
|
420
|
+
return label.toLowerCase().includes(this.searchValLower);
|
|
421
|
+
}
|
|
422
|
+
getTriggerProps() {
|
|
423
|
+
const { triggerProps } = this.props;
|
|
424
|
+
const props = {
|
|
425
|
+
...pick(this.props, [
|
|
426
|
+
'name',
|
|
427
|
+
'label',
|
|
428
|
+
'size',
|
|
429
|
+
'variant',
|
|
430
|
+
// 'inputProps',
|
|
431
|
+
// 'required',
|
|
432
|
+
'autocomplete',
|
|
433
|
+
// 'hideRequiredStar',
|
|
434
|
+
]),
|
|
435
|
+
...triggerProps,
|
|
436
|
+
};
|
|
437
|
+
return props;
|
|
438
|
+
}
|
|
439
|
+
renderAdditionalLabel() {
|
|
440
|
+
const { additionalLabel } = this.props;
|
|
441
|
+
if (!additionalLabel)
|
|
442
|
+
return null;
|
|
443
|
+
return jsx("div", { className: S.additionalLabel, children: additionalLabel });
|
|
444
|
+
}
|
|
445
|
+
renderTriggerInput() {
|
|
446
|
+
const { inputProps, label } = this.props;
|
|
447
|
+
const value = this.getInputVal();
|
|
448
|
+
const props = {
|
|
449
|
+
...this.getTriggerProps(),
|
|
450
|
+
...inputProps,
|
|
451
|
+
error: this.isErrorVisible(),
|
|
452
|
+
// addonLeft: this.renderSelectedItems(),
|
|
453
|
+
addonRight: this.renderTriggerArrow(),
|
|
454
|
+
value,
|
|
455
|
+
onChange: this.onSearchChange,
|
|
456
|
+
ref: this.triggerInputRef,
|
|
457
|
+
label: this.getFieldLabel(label),
|
|
458
|
+
};
|
|
459
|
+
return jsx(Input, { ...props });
|
|
460
|
+
}
|
|
461
|
+
renderTriggerButton() {
|
|
462
|
+
const { size } = this.props;
|
|
463
|
+
const { labelClipPath } = this.store;
|
|
464
|
+
const { label, className, ...rest } = this.getTriggerProps();
|
|
465
|
+
const props = omit(rest, ['name', 'inputProps']);
|
|
466
|
+
const selectedLabel = [
|
|
467
|
+
this.getSelectedLabel(),
|
|
468
|
+
this.renderAdditionalLabel(),
|
|
469
|
+
].filter(Boolean);
|
|
470
|
+
const hasSelected = selectedLabel.length > 0;
|
|
471
|
+
const displayLabel = hasSelected ? selectedLabel : label;
|
|
472
|
+
const title = hasSelected ? selectedLabel : null;
|
|
473
|
+
const triggerArrow = this.renderTriggerArrow();
|
|
474
|
+
const isError = this.isErrorVisible();
|
|
475
|
+
const classes = cn(S.triggerButton, isError && S.isError, triggerArrow && S.hasTriggerArrow, className);
|
|
476
|
+
return (jsxs("div", { children: [jsxs(Button, { className: classes, variant: "default", ...props, style: { clipPath: labelClipPath }, title: title?.join?.(', '), children: [jsx("div", { className: cn(S.triggerButtonLabel, hasSelected && S.hasSelected), children: displayLabel }), triggerArrow] }), jsx(Label, { size: size, isOnTop: hasSelected, isError: isError, onClipPathChange: this.onLabelClipPathChange, children: this.getFieldLabel(label) })] }));
|
|
477
|
+
}
|
|
478
|
+
renderTriggerArrow() {
|
|
479
|
+
const { size, inputProps } = this.props;
|
|
480
|
+
const { isOpen, searchVal } = this.store;
|
|
481
|
+
if (inputProps?.hasClear && searchVal)
|
|
482
|
+
return null;
|
|
483
|
+
return (jsx(Icon, { type: "chevronDown", className: cn(S.triggerArrow, isOpen && S.isOpen), size: size }));
|
|
484
|
+
}
|
|
485
|
+
renderTrigger() {
|
|
486
|
+
const { trigger, isSearchable, required, hideRequiredStar, size } = this.props;
|
|
487
|
+
if (trigger)
|
|
488
|
+
return trigger;
|
|
489
|
+
const triggerElem = isSearchable
|
|
490
|
+
? this.renderTriggerInput()
|
|
491
|
+
: this.renderTriggerButton();
|
|
492
|
+
return (jsxs("div", { className: S.trigger, children: [triggerElem, required && !hideRequiredStar && jsx(RequiredStar, { size: size })] }));
|
|
493
|
+
}
|
|
494
|
+
renderFoldButton(id) {
|
|
495
|
+
const { size } = this.props;
|
|
496
|
+
return (jsx(Button, { variant: "clear", size: size, className: S.expandButton, onPointerUpCapture: e => this.onExpandClick(e, id), children: jsx(Icon, { type: "chevronRight", size: size, className: S.expandIcon }) }));
|
|
497
|
+
}
|
|
498
|
+
renderOption = (item, level = 0) => {
|
|
499
|
+
const { expanded } = this.store;
|
|
500
|
+
const { id, children, isGroup } = item;
|
|
501
|
+
const selectedState = this.isSelected(id);
|
|
502
|
+
const isFocused = id === this.focusedItemId;
|
|
503
|
+
const isExpanded = expanded[id];
|
|
504
|
+
const isSelected = selectedState === true;
|
|
505
|
+
const isIndeterminate = selectedState === 'indeterminate';
|
|
506
|
+
const items = [];
|
|
507
|
+
const className = cn(S.option, isGroup && S.isGroup, isFocused && S.isFocused, isSelected && S.isSelected, isIndeterminate && S.isIndeterminate, isExpanded && S.isExpanded, S[`level-${level}`]);
|
|
508
|
+
const props = {
|
|
509
|
+
className,
|
|
510
|
+
key: id,
|
|
511
|
+
onPointerUp: () => this.onItemToggle(id),
|
|
512
|
+
onPointerEnter: () => this.onOptionHover(id),
|
|
513
|
+
};
|
|
514
|
+
// @ts-ignore
|
|
515
|
+
if (isFocused)
|
|
516
|
+
props.ref = this.onFocusedElemRef;
|
|
517
|
+
if (isIndeterminate || (isSelected && !this.isFirstSelectedMeet)) {
|
|
518
|
+
this.isFirstSelectedMeet = true;
|
|
519
|
+
}
|
|
520
|
+
if (children) {
|
|
521
|
+
this.isTree = true;
|
|
522
|
+
if (isExpanded) {
|
|
523
|
+
children.forEach(child => items.push(...this.renderOption(child, level + 1)));
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
if (this.filterOption(item) || items.length > 0) {
|
|
527
|
+
items.unshift(jsxs("div", { ...props, children: [children?.length && this.renderFoldButton(item.id), renderLabel(item)] }));
|
|
528
|
+
}
|
|
529
|
+
return items;
|
|
530
|
+
};
|
|
531
|
+
renderOptions() {
|
|
532
|
+
const { additionalOptions = [] } = this.props;
|
|
533
|
+
const items = additionalOptions.concat(this.optionsTree);
|
|
534
|
+
const itemsList = [];
|
|
535
|
+
this.isFirstSelectedMeet = false;
|
|
536
|
+
items.forEach(item => {
|
|
537
|
+
itemsList.push(...this.renderOption(item));
|
|
538
|
+
});
|
|
539
|
+
return itemsList;
|
|
540
|
+
}
|
|
541
|
+
renderPresets() {
|
|
542
|
+
const { presets = [], clearButton, selectAllButton } = this.props;
|
|
543
|
+
const items = presets.map(({ label, ids }) => ({
|
|
544
|
+
children: label,
|
|
545
|
+
onClick: () => this.setSelected(ids),
|
|
546
|
+
key: label,
|
|
547
|
+
}));
|
|
548
|
+
if (selectAllButton) {
|
|
549
|
+
items.push({
|
|
550
|
+
children: 'Select all',
|
|
551
|
+
onClick: this.selectAll,
|
|
552
|
+
key: 'select-all-button',
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
if (clearButton) {
|
|
556
|
+
items.push({
|
|
557
|
+
children: 'Clear',
|
|
558
|
+
onClick: this.dropSelected,
|
|
559
|
+
key: 'clear-button',
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
if (items.length === 0)
|
|
563
|
+
return null;
|
|
564
|
+
return (jsx("div", { className: S.presetPanel, children: items.map(props => (jsx(Button, { className: S.presetButton, variant: "clear", ...props }))) }, "preset-panel"));
|
|
565
|
+
}
|
|
566
|
+
renderOptionsList() {
|
|
567
|
+
const { size } = this.props;
|
|
568
|
+
this.isTree = false;
|
|
569
|
+
const classes = cn(S.options, S[`size-${size}`], this.isTree && S.isTree);
|
|
570
|
+
return (jsxs("div", { ref: this.contentRef, children: [this.renderPresets(), jsx(Scroll, { y: true, offset: { y: { before: 10, after: 10 } }, className: classes, onInnerRef: this.onScrollInnerRef, children: this.renderOptions() }, "items-scroll")] }));
|
|
571
|
+
}
|
|
572
|
+
render() {
|
|
573
|
+
const { className, popupProps, size, error, blur } = this.props;
|
|
574
|
+
const { isOpen, isFocused } = this.store;
|
|
575
|
+
const classes = cn(S.root, className, S[`size-${size}`]);
|
|
576
|
+
return (jsxs(Fragment, { children: [jsx(Popup, { className: classes, direction: "bottom", size: size, focusControl: true, hoverControl: isFocused, blur: blur, ...popupProps, isOpen: isOpen, onOpen: this.onPopupOpen, onClose: this.onPopupClose, disabled: this.isDisabled(), trigger: this.renderTrigger(), triggerProps: {
|
|
577
|
+
onFocus: this.onFocus,
|
|
578
|
+
onBlur: this.onBlur,
|
|
579
|
+
}, content: this.renderOptionsList() }), this.isErrorVisible() && (jsx(AssistiveText, { variant: "danger", size: size, children: error }))] }));
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
export { Select, SelectHelpers };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import styleInject from '../../../node_modules/style-inject/dist/style-inject.es.js';
|
|
2
|
+
|
|
3
|
+
var css_248z = ".Select_root__mjOjv{max-height:200px;max-width:100%;position:relative}.Select_root__mjOjv.Select_disabled__AlOQi{opacity:.4;pointer-events:none}.Select_additionalLabel__K0--Z{flex-grow:1;overflow:hidden;text-align:left;text-overflow:ellipsis}.Select_trigger__OH48f{position:relative;z-index:1}.Select_triggerArrow__1LEop{flex-shrink:0;margin-left:var(--indent-s);margin-right:0!important;transition:transform .2s ease-out;width:14px!important}.Select_triggerArrow__1LEop.Select_isOpen__WlMUH{transform:rotateX(-180deg)}.Select_disabled__AlOQi .Select_triggerArrow__1LEop{color:var(--text3-color)}.Select_triggerButton__lErtt{justify-content:space-between;text-align:left;width:100%}.Select_size-s__qBK9t .Select_triggerButton__lErtt{padding-bottom:10px;padding-top:10px}.Select_size-m__jp7n- .Select_triggerButton__lErtt{padding-bottom:12px;padding-top:12px}.Select_size-l__b4EEy .Select_triggerButton__lErtt{padding-bottom:14px;padding-top:14px}.Select_triggerButton__lErtt.Select_hasTriggerArrow__vPLad>span{max-width:calc(100% - 22px)}.Select_triggerButton__lErtt.Select_isError__WJJLq{box-shadow:inset 0 0 0 2px var(--danger-color)}.Select_triggerButton__lErtt .Select_triggerButtonLabel__XXLzh{opacity:0;overflow:hidden;text-overflow:ellipsis}.Select_triggerButton__lErtt .Select_triggerButtonLabel__XXLzh.Select_hasSelected__zQhBV{opacity:1}.Select_presetPanel__Yu94r{box-shadow:inset 0 -1px 0 var(--decent-color-alpha-100);display:flex;padding:5px}.Select_presetButton__BAl0q{flex-grow:1;justify-content:center}.Select_presetButton__BAl0q+.Select_presetButton__BAl0q{margin-left:8px}.Select_options__3C0-v{max-height:200px;overflow-y:auto}.keyboard .Select_options__3C0-v{pointer-events:none}.Select_option__iJkfJ{align-items:center;animation:Select_fadeIn__QpAwZ .3s ease-out;cursor:pointer;display:flex;padding-bottom:0!important;padding-top:0!important;position:relative;text-align:left;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.Select_isTree__SiTaD .Select_option__iJkfJ{min-height:36px}.Select_size-s__qBK9t .Select_option__iJkfJ{font-size:12px;height:26px;padding:0 10px}.Select_size-m__jp7n- .Select_option__iJkfJ{font-size:16px;height:34px;padding:0 12px}.Select_size-l__b4EEy .Select_option__iJkfJ{font-size:20px;height:42px;padding:0 14px}.Select_size-xl__0OerX .Select_option__iJkfJ{height:50px}.Select_option__iJkfJ:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.Select_option__iJkfJ:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.Select_isTree__SiTaD .Select_option__iJkfJ{padding-left:30px}.Select_option__iJkfJ.Select_isGroup__aP1lY{color:var(--accent-color);font-weight:500;pointer-events:none}.Select_isExpanded__rG8R1>.Select_option__iJkfJ{display:flex}.Select_option__iJkfJ>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.Select_option__iJkfJ:before{content:\"\";display:inline-block}.Select_option__iJkfJ.Select_level-0__vu03A:before{content:none}.Select_option__iJkfJ.Select_level-1__ozH2U:before{min-width:24px;width:24px}.Select_option__iJkfJ.Select_level-2__XDqeh:before{min-width:48px;width:48px}.Select_option__iJkfJ.Select_level-3__Bc9XS:before{min-width:72px;width:72px}.Select_option__iJkfJ.Select_level-4__KfQcQ:before{min-width:96px;width:96px}.Select_option__iJkfJ.Select_level-5__DGSDM:before{min-width:120px;width:120px}.Select_option__iJkfJ.Select_level-6__p688A:before{min-width:144px;width:144px}.Select_option__iJkfJ.Select_isIndeterminate__dy-xV,.Select_option__iJkfJ.Select_isSelected__n3ZeN{background-color:var(--active-color-alpha-500)}.keyboard .Select_option__iJkfJ.Select_isFocused__oZSgY,.pointer .Select_option__iJkfJ:hover{box-shadow:inset 100vw 0 0 0 var(--accent-color-alpha-200)}.Select_expandButton__UTwlR{background-color:transparent!important;display:flex;height:100%;justify-content:flex-end;overflow:visible;padding:0;position:relative;width:30px}.Select_expandButton__UTwlR:before{content:\"\";display:block;height:calc(100% + 20px);position:absolute;right:0;top:-10;width:100px}.Select_size-m__jp7n- .Select_expandButton__UTwlR{margin-left:-40px}.Select_size-l__b4EEy .Select_expandButton__UTwlR{margin-left:-46px}.Select_expandIcon__gWAIB{-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .1s ease-out}.Select_isExpanded__rG8R1 .Select_expandIcon__gWAIB{transform:rotate(90deg) translateZ(0)}.Select_expandButton__UTwlR:hover .Select_expandIcon__gWAIB{color:var(--primary-color)}@keyframes Select_fadeIn__QpAwZ{0%{opacity:0}10%{opacity:0}to{opacity:1}}";
|
|
4
|
+
var S = {"root":"Select_root__mjOjv","disabled":"Select_disabled__AlOQi","additionalLabel":"Select_additionalLabel__K0--Z","trigger":"Select_trigger__OH48f","triggerArrow":"Select_triggerArrow__1LEop","isOpen":"Select_isOpen__WlMUH","triggerButton":"Select_triggerButton__lErtt","size-s":"Select_size-s__qBK9t","size-m":"Select_size-m__jp7n-","size-l":"Select_size-l__b4EEy","hasTriggerArrow":"Select_hasTriggerArrow__vPLad","isError":"Select_isError__WJJLq","triggerButtonLabel":"Select_triggerButtonLabel__XXLzh","hasSelected":"Select_hasSelected__zQhBV","presetPanel":"Select_presetPanel__Yu94r","presetButton":"Select_presetButton__BAl0q","options":"Select_options__3C0-v","option":"Select_option__iJkfJ","fadeIn":"Select_fadeIn__QpAwZ","isTree":"Select_isTree__SiTaD","size-xl":"Select_size-xl__0OerX","isGroup":"Select_isGroup__aP1lY","isExpanded":"Select_isExpanded__rG8R1","level-0":"Select_level-0__vu03A","level-1":"Select_level-1__ozH2U","level-2":"Select_level-2__XDqeh","level-3":"Select_level-3__Bc9XS","level-4":"Select_level-4__KfQcQ","level-5":"Select_level-5__DGSDM","level-6":"Select_level-6__p688A","isSelected":"Select_isSelected__n3ZeN","isIndeterminate":"Select_isIndeterminate__dy-xV","isFocused":"Select_isFocused__oZSgY","expandButton":"Select_expandButton__UTwlR","expandIcon":"Select_expandIcon__gWAIB"};
|
|
5
|
+
styleInject(css_248z);
|
|
6
|
+
|
|
7
|
+
export { S as default };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import cn from 'classnames';
|
|
3
|
+
import SvgSpinner from './spinner.svg.js';
|
|
4
|
+
import S from './Spinner.styl.js';
|
|
5
|
+
|
|
6
|
+
const Spinner = ({ size = 'm', className = '', ...props }) => {
|
|
7
|
+
const classes = cn(S.root, S[`size-${size}`], className);
|
|
8
|
+
return jsx(SvgSpinner, { className: classes, ...props });
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export { Spinner };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import styleInject from '../../../node_modules/style-inject/dist/style-inject.es.js';
|
|
2
|
+
|
|
3
|
+
var css_248z = ".Spinner_root__DsSOz{animation:Spinner_spin__7XKOR .5s linear infinite;color:inherit;display:inline-block}.Spinner_size-s__sc9kC{height:16px;width:16px}.Spinner_size-m__MY4q0{height:20px;width:20px}.Spinner_size-l__p16ZU{height:30px;width:30px}@keyframes Spinner_spin__7XKOR{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}";
|
|
4
|
+
var S = {"root":"Spinner_root__DsSOz","spin":"Spinner_spin__7XKOR","size-s":"Spinner_size-s__sc9kC","size-m":"Spinner_size-m__MY4q0","size-l":"Spinner_size-l__p16ZU"};
|
|
5
|
+
styleInject(css_248z);
|
|
6
|
+
|
|
7
|
+
export { S as default };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
var _circle;
|
|
4
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
5
|
+
var SvgSpinner = function SvgSpinner(props) {
|
|
6
|
+
return /*#__PURE__*/React.createElement("svg", _extends({
|
|
7
|
+
width: 50,
|
|
8
|
+
height: 50,
|
|
9
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
10
|
+
viewBox: "0 0 100 100",
|
|
11
|
+
preserveAspectRatio: "xMidYMid"
|
|
12
|
+
}, props), _circle || (_circle = /*#__PURE__*/React.createElement("circle", {
|
|
13
|
+
cx: 50,
|
|
14
|
+
cy: 50,
|
|
15
|
+
fill: "none",
|
|
16
|
+
stroke: "currentColor",
|
|
17
|
+
strokeWidth: 8,
|
|
18
|
+
r: 45,
|
|
19
|
+
strokeDasharray: "212.05750411731105 72.68583470577035",
|
|
20
|
+
transform: "rotate(270 50 50)"
|
|
21
|
+
})));
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export { SvgSpinner as default };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { Component } from 'react';
|
|
3
|
+
import cn from 'classnames';
|
|
4
|
+
import { Paranja } from '../Paranja/Paranja.js';
|
|
5
|
+
import { Scroll } from '../Scroll/Scroll.js';
|
|
6
|
+
import { Spinner } from '../Spinner/Spinner.js';
|
|
7
|
+
import S from './Table.styl.js';
|
|
8
|
+
|
|
9
|
+
class Table extends Component {
|
|
10
|
+
renderHeaderColumn = ({ id, label, sticky }) => (jsx("th", { className: cn(sticky && S.sticky), children: label }, id));
|
|
11
|
+
renderRow = data => {
|
|
12
|
+
const { columns } = this.props;
|
|
13
|
+
return (jsx("tr", { children: columns.map(param => this.renderDataCol(param, data)) }, data.id));
|
|
14
|
+
};
|
|
15
|
+
renderDataCol({ id, dataField, render, sticky }, data) {
|
|
16
|
+
return (jsx("td", { className: cn(sticky && S.sticky), children: render ? render(data) : data[dataField || id] }, id));
|
|
17
|
+
}
|
|
18
|
+
render() {
|
|
19
|
+
const { className, columns, isLoading = false, loadingText, blur, data, } = this.props;
|
|
20
|
+
return (jsxs("div", { className: cn(S.root, blur && S.blur, className), children: [jsx(Scroll, { x: true, y: true, offset: { x: { before: 10, after: 10 } }, children: jsxs("table", { children: [jsx("thead", { children: jsx("tr", { children: columns.map(this.renderHeaderColumn) }) }), jsx("tbody", { children: data.map(this.renderRow) })] }) }), jsx(Paranja, { inline: true, visible: isLoading, blur: blur, children: isLoading && (loadingText ?? jsx(Spinner, {})) })] }));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { Table };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import styleInject from '../../../node_modules/style-inject/dist/style-inject.es.js';
|
|
2
|
+
|
|
3
|
+
var css_248z = ".Table_root__PxLR-{border-radius:var(--border-radius-l);box-shadow:0 0 0 2px var(--accent-color-alpha-100);overflow:hidden;position:relative}.Table_root__PxLR- table{min-width:100%}.Table_root__PxLR- tbody{overflow-scrolling:touch;overflow:auto}.Table_root__PxLR- thead{position:sticky;top:0;z-index:1}.Table_root__PxLR- td{box-shadow:inset 0 1px 0 0 var(--accent-color-alpha-100)}.Table_root__PxLR- td,.Table_root__PxLR- th{min-width:5em;padding:var(--indent-s);text-align:left}.Table_root__PxLR- th{background-color:var(--accent-color-alpha-100);padding-bottom:16px}.Table_root__PxLR- td{vertical-align:top}.Table_root__PxLR- tr:last-child td{padding-bottom:var(--indent-l)}.Table_sticky__99lks{background-color:var(--decent-color);left:0;position:sticky;z-index:1}th.Table_sticky__99lks{background-color:var(--accent-color);color:var(--decent-color)}.Table_blur__UwMAo .Table_sticky__99lks{-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);background-color:var(--decent-color-alpha-500)}.Table_blur__UwMAo th.Table_sticky__99lks{background-color:var(--accent-color-alpha-500);color:var(--decent-color-alpha-800)}";
|
|
4
|
+
var S = {"root":"Table_root__PxLR-","sticky":"Table_sticky__99lks","blur":"Table_blur__UwMAo"};
|
|
5
|
+
styleInject(css_248z);
|
|
6
|
+
|
|
7
|
+
export { S as default };
|