@invoicebox/ui 0.1.0-alpha.313 → 0.1.0-alpha.315

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.
Files changed (57) hide show
  1. package/dist/components/common/Tooltip/index.d.ts +9 -0
  2. package/dist/components/common/Tooltip/index.js +60 -0
  3. package/dist/components/common/Tooltip/index.stories.d.ts +6 -0
  4. package/dist/components/common/Tooltip/index.stories.js +43 -0
  5. package/dist/components/common/Tooltip/palette.d.ts +7 -0
  6. package/dist/components/common/Tooltip/palette.js +13 -0
  7. package/dist/components/common/Tooltip/styles.d.ts +9 -0
  8. package/dist/components/common/Tooltip/styles.js +34 -0
  9. package/dist/components/form/Checkbox/CheckIcon.d.ts +2 -0
  10. package/dist/components/form/Checkbox/CheckIcon.js +23 -0
  11. package/dist/components/form/Checkbox/index.d.ts +11 -0
  12. package/dist/components/form/Checkbox/index.js +47 -0
  13. package/dist/components/form/Checkbox/index.stories.d.ts +8 -0
  14. package/dist/components/form/Checkbox/index.stories.js +69 -0
  15. package/dist/components/form/Checkbox/palette.d.ts +12 -0
  16. package/dist/components/form/Checkbox/palette.js +20 -0
  17. package/dist/components/form/Checkbox/styles.d.ts +13 -0
  18. package/dist/components/form/Checkbox/styles.js +71 -0
  19. package/dist/components/form/CurrencyInput/CoreCurrencyInput/index.js +1 -1
  20. package/dist/components/form/Select/components/MultipleValue/index.d.ts +9 -0
  21. package/dist/components/form/Select/components/MultipleValue/index.js +129 -0
  22. package/dist/components/form/Select/components/MultipleValue/styles.d.ts +8 -0
  23. package/dist/components/form/Select/components/MultipleValue/styles.js +31 -0
  24. package/dist/components/form/Select/index.d.ts +17 -4
  25. package/dist/components/form/Select/index.js +98 -44
  26. package/dist/components/form/Select/index.stories.d.ts +3 -1
  27. package/dist/components/form/Select/index.stories.js +32 -1
  28. package/dist/components/form/Select/palette.d.ts +2 -0
  29. package/dist/components/form/Select/palette.js +3 -1
  30. package/dist/components/form/Select/styles.d.ts +4 -0
  31. package/dist/components/form/Select/styles.js +26 -10
  32. package/dist/esm/components/common/Tooltip/index.js +51 -0
  33. package/dist/esm/components/common/Tooltip/index.stories.js +36 -0
  34. package/dist/esm/components/common/Tooltip/palette.js +7 -0
  35. package/dist/esm/components/common/Tooltip/styles.js +27 -0
  36. package/dist/esm/components/form/Checkbox/CheckIcon.js +16 -0
  37. package/dist/esm/components/form/Checkbox/index.js +38 -0
  38. package/dist/esm/components/form/Checkbox/index.stories.js +60 -0
  39. package/dist/esm/components/form/Checkbox/palette.js +13 -0
  40. package/dist/esm/components/form/Checkbox/styles.js +64 -0
  41. package/dist/esm/components/form/CurrencyInput/CoreCurrencyInput/index.js +1 -1
  42. package/dist/esm/components/form/Select/components/MultipleValue/index.js +120 -0
  43. package/dist/esm/components/form/Select/components/MultipleValue/styles.js +22 -0
  44. package/dist/esm/components/form/Select/index.js +98 -44
  45. package/dist/esm/components/form/Select/index.stories.js +31 -0
  46. package/dist/esm/components/form/Select/palette.js +3 -1
  47. package/dist/esm/components/form/Select/styles.js +25 -9
  48. package/dist/esm/index.js +2 -0
  49. package/dist/esm/palette/context.js +5 -1
  50. package/dist/esm/palette/provider.js +5 -1
  51. package/dist/index.d.ts +5 -1
  52. package/dist/index.js +14 -0
  53. package/dist/palette/context.d.ts +4 -0
  54. package/dist/palette/context.js +5 -1
  55. package/dist/palette/provider.js +5 -1
  56. package/dist/palette/usePalette.d.ts +2 -0
  57. package/package.json +1 -1
@@ -0,0 +1,38 @@
1
+ var _excluded = ["disabled", "className", "checked", "disabledText", "label"];
2
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
3
+ function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var s = Object.getOwnPropertySymbols(e); for (r = 0; r < s.length; r++) o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
4
+ function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; }
5
+ import React, { useMemo } from 'react';
6
+ import { Typography } from '../../common/Typography';
7
+ import { Tooltip } from '../../common/Tooltip';
8
+ import { useComponentPalette } from '../../../palette';
9
+ import * as S from './styles';
10
+ export var Checkbox = function Checkbox(_ref) {
11
+ var _ref$disabled = _ref.disabled,
12
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
13
+ className = _ref.className,
14
+ _ref$checked = _ref.checked,
15
+ checked = _ref$checked === void 0 ? false : _ref$checked,
16
+ disabledText = _ref.disabledText,
17
+ label = _ref.label,
18
+ props = _objectWithoutProperties(_ref, _excluded);
19
+ var palette = useComponentPalette('checkbox');
20
+ var content = useMemo(function () {
21
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(S.HiddenCheckbox, _extends({
22
+ type: "checkbox",
23
+ disabled: disabled,
24
+ checked: checked
25
+ }, props)), /*#__PURE__*/React.createElement(S.StyledCheckbox, null, /*#__PURE__*/React.createElement(S.CheckboxIcon, null)));
26
+ }, [checked, disabled, props]);
27
+ return /*#__PURE__*/React.createElement(S.CheckboxLabel, {
28
+ $checked: checked,
29
+ $disabled: disabled,
30
+ $palette: palette,
31
+ className: className
32
+ }, /*#__PURE__*/React.createElement(S.CheckboxContainer, null, disabled && disabledText ? /*#__PURE__*/React.createElement(Tooltip, {
33
+ overlay: disabledText
34
+ }, content) : content), label && /*#__PURE__*/React.createElement(Typography, {
35
+ variant: "bodyMRegular"
36
+ }, label));
37
+ };
38
+ export default /*#__PURE__*/React.memo(Checkbox);
@@ -0,0 +1,60 @@
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
3
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
5
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
6
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
7
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
8
+ import React, { useState } from 'react';
9
+ import { Checkbox } from '.';
10
+ var meta = {
11
+ title: 'form/Checkbox',
12
+ component: Checkbox,
13
+ tags: ['autodocs']
14
+ };
15
+ export default meta;
16
+ var Component = function Component(props) {
17
+ var _useState = useState(props.checked),
18
+ _useState2 = _slicedToArray(_useState, 2),
19
+ checked = _useState2[0],
20
+ setChecked = _useState2[1];
21
+ return /*#__PURE__*/React.createElement(Checkbox, _extends({}, props, {
22
+ checked: checked,
23
+ onChange: function onChange() {
24
+ return setChecked(function (prev) {
25
+ return !prev;
26
+ });
27
+ }
28
+ }));
29
+ };
30
+ export var Default = {
31
+ args: {
32
+ checked: false,
33
+ label: 'Label'
34
+ },
35
+ render: Component
36
+ };
37
+ export var Checked = {
38
+ args: {
39
+ checked: true,
40
+ label: 'Label'
41
+ },
42
+ render: Component
43
+ };
44
+ export var Disabled = {
45
+ args: {
46
+ checked: false,
47
+ disabled: true,
48
+ label: 'Label',
49
+ disabledText: 'Недоступно'
50
+ },
51
+ render: Component
52
+ };
53
+ export var DisabledChecked = {
54
+ args: {
55
+ checked: true,
56
+ disabled: true,
57
+ label: 'Label'
58
+ },
59
+ render: Component
60
+ };
@@ -0,0 +1,13 @@
1
+ import hexToRgba from '../../../utils/hexToRgba';
2
+ export var generateCheckboxPalette = function generateCheckboxPalette(abstractPalette) {
3
+ return {
4
+ labelColor: abstractPalette.primary,
5
+ mark: abstractPalette.base,
6
+ borderDefault: hexToRgba(abstractPalette.primary, 0.3),
7
+ borderHover: hexToRgba(abstractPalette.primary, 0.5),
8
+ checkedBg: abstractPalette.secondary,
9
+ checkedHoverBg: '#EDC743',
10
+ disabledBg: hexToRgba(abstractPalette.neutralBrutal, 0.3),
11
+ disabledBorder: hexToRgba(abstractPalette.neutralBrutal, 0.3)
12
+ };
13
+ };
@@ -0,0 +1,64 @@
1
+ import styled from 'styled-components';
2
+ import { CheckIcon } from './CheckIcon';
3
+ var TRANSITION = 'all .2s ease-in-out';
4
+ var BORDER_RADIUS_MIN = 4;
5
+ export var CheckboxContainer = styled.div.withConfig({
6
+ displayName: "styles__CheckboxContainer",
7
+ componentId: "sc-11prdl0-0"
8
+ })(["display:inline-block;vertical-align:middle;"]);
9
+ export var HiddenCheckbox = styled.input.withConfig({
10
+ displayName: "styles__HiddenCheckbox",
11
+ componentId: "sc-11prdl0-1"
12
+ })(["display:none;"]);
13
+ export var CheckboxIcon = styled(CheckIcon).withConfig({
14
+ displayName: "styles__CheckboxIcon",
15
+ componentId: "sc-11prdl0-2"
16
+ })(["transition:", ";"], TRANSITION);
17
+ export var StyledCheckbox = styled.div.withConfig({
18
+ displayName: "styles__StyledCheckbox",
19
+ componentId: "sc-11prdl0-3"
20
+ })(["display:flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:", "px;transition:", ";"], BORDER_RADIUS_MIN, TRANSITION);
21
+ var getStylesCheckbox = function getStylesCheckbox(palette, disabled, checked) {
22
+ if (disabled) {
23
+ if (checked) {
24
+ return "background-color: ".concat(palette.disabledBg, "; border: none");
25
+ }
26
+ return "border: 1px solid ".concat(palette.disabledBorder);
27
+ }
28
+ if (checked) {
29
+ return "background-color: ".concat(palette.checkedBg, "; border: none");
30
+ }
31
+ return "border: 1px solid ".concat(palette.borderDefault);
32
+ };
33
+ var getHoverStylesCheckbox = function getHoverStylesCheckbox(palette, disabled, checked) {
34
+ if (disabled) {
35
+ if (checked) {
36
+ return "background-color: ".concat(palette.disabledBg, "; border: none");
37
+ }
38
+ return "border: 1px solid ".concat(palette.disabledBg);
39
+ }
40
+ if (checked) {
41
+ return "background-color: ".concat(palette.checkedHoverBg, "; border: none");
42
+ }
43
+ return "border: 1px solid ".concat(palette.borderHover);
44
+ };
45
+ export var CheckboxLabel = styled.label.withConfig({
46
+ displayName: "styles__CheckboxLabel",
47
+ componentId: "sc-11prdl0-4"
48
+ })(["display:flex;align-items:center;grid-column-gap:10px;user-select:none;width:fit-content;cursor:pointer;color:", ";", "{", ";", "{opacity:", ";}}&:hover{", "{", ";}}"], function (_ref) {
49
+ var $palette = _ref.$palette;
50
+ return $palette.labelColor;
51
+ }, StyledCheckbox, function (_ref2) {
52
+ var $checked = _ref2.$checked,
53
+ $disabled = _ref2.$disabled,
54
+ $palette = _ref2.$palette;
55
+ return getStylesCheckbox($palette, $disabled, $checked);
56
+ }, CheckboxIcon, function (_ref3) {
57
+ var $checked = _ref3.$checked;
58
+ return $checked ? 1 : 0;
59
+ }, StyledCheckbox, function (_ref4) {
60
+ var $checked = _ref4.$checked,
61
+ $disabled = _ref4.$disabled,
62
+ $palette = _ref4.$palette;
63
+ return getHoverStylesCheckbox($palette, $disabled, $checked);
64
+ });
@@ -51,7 +51,7 @@ export var CoreCurrencyInput = function CoreCurrencyInput(_ref) {
51
51
  size: fieldSize
52
52
  }, /*#__PURE__*/React.createElement(InputWrapper, null, modernPlaceholder, /*#__PURE__*/React.createElement(StyledCurrencyInputFromLibrary, {
53
53
  $palette: palette,
54
- $hasBorder: !useModernStyles,
54
+ $hasBorder: !useModernStyles || hasError,
55
55
  $paddingLeft: 18,
56
56
  $paddingRight: 18,
57
57
  $borderRadius: 10,
@@ -0,0 +1,120 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
7
+ import React, { useCallback, useLayoutEffect, useRef, useState } from 'react';
8
+ import * as S from './styles';
9
+ import { useComponentPalette } from '../../../../../palette';
10
+ import { Chip } from '../../../../common/Chip';
11
+ var CHIP_SIZE = 'xs';
12
+ export var MultipleValue = function MultipleValue(_ref) {
13
+ var _chipProps$color, _chipProps$bgColor, _chipProps$size;
14
+ var selectedOptions = _ref.selectedOptions,
15
+ onRemove = _ref.onRemove,
16
+ _ref$collapse = _ref.collapse,
17
+ collapse = _ref$collapse === void 0 ? false : _ref$collapse,
18
+ chipProps = _ref.chipProps;
19
+ var palette = useComponentPalette('select');
20
+ var chipColor = (_chipProps$color = chipProps === null || chipProps === void 0 ? void 0 : chipProps.color) !== null && _chipProps$color !== void 0 ? _chipProps$color : palette.tagColor;
21
+ var chipBgColor = (_chipProps$bgColor = chipProps === null || chipProps === void 0 ? void 0 : chipProps.bgColor) !== null && _chipProps$bgColor !== void 0 ? _chipProps$bgColor : palette.tagBg;
22
+ var chipSize = (_chipProps$size = chipProps === null || chipProps === void 0 ? void 0 : chipProps.size) !== null && _chipProps$size !== void 0 ? _chipProps$size : CHIP_SIZE;
23
+ var wrapperRef = useRef(null);
24
+ var tagRefs = useRef([]);
25
+ var counterRef = useRef(null);
26
+ var _useState = useState(selectedOptions.length),
27
+ _useState2 = _slicedToArray(_useState, 2),
28
+ visibleCount = _useState2[0],
29
+ setVisibleCount = _useState2[1];
30
+ var handleRemove = useCallback(function (event, value) {
31
+ event.preventDefault();
32
+ event.stopPropagation();
33
+ onRemove(value);
34
+ }, [onRemove]);
35
+ useLayoutEffect(function () {
36
+ if (!collapse) {
37
+ setVisibleCount(selectedOptions.length);
38
+ return undefined;
39
+ }
40
+ var wrapper = wrapperRef.current;
41
+ if (!wrapper) return undefined;
42
+ var recalculate = function recalculate() {
43
+ var _counterRef$current;
44
+ var total = selectedOptions.length;
45
+ var containerWidth = wrapper.clientWidth;
46
+ var widths = tagRefs.current.slice(0, total).map(function (el) {
47
+ return (el === null || el === void 0 ? void 0 : el.offsetWidth) || 0;
48
+ });
49
+ var counterWidth = ((_counterRef$current = counterRef.current) === null || _counterRef$current === void 0 ? void 0 : _counterRef$current.offsetWidth) || 0;
50
+ var countFitting = function countFitting(reserve) {
51
+ var used = 0;
52
+ var count = 0;
53
+ for (var i = 0; i < total; i += 1) {
54
+ var width = widths[i] + (count > 0 ? S.TAGS_GAP : 0);
55
+ if (used + width <= containerWidth - reserve) {
56
+ used += width;
57
+ count += 1;
58
+ } else {
59
+ break;
60
+ }
61
+ }
62
+ return count;
63
+ };
64
+ var count = countFitting(0);
65
+ // если влезли не все теги, оставляем место под счётчик "+N"
66
+ if (count < total) {
67
+ count = Math.max(countFitting(counterWidth + S.TAGS_GAP), 1);
68
+ }
69
+ setVisibleCount(count);
70
+ };
71
+ recalculate();
72
+ var observer = new ResizeObserver(recalculate);
73
+ observer.observe(wrapper);
74
+ return function () {
75
+ return observer.disconnect();
76
+ };
77
+ }, [collapse, selectedOptions]);
78
+ var safeVisibleCount = collapse ? visibleCount : selectedOptions.length;
79
+ var hiddenCount = selectedOptions.length - safeVisibleCount;
80
+ var hiddenStyle = {
81
+ position: 'absolute',
82
+ visibility: 'hidden',
83
+ pointerEvents: 'none'
84
+ };
85
+ return /*#__PURE__*/React.createElement(S.Wrapper, {
86
+ ref: wrapperRef,
87
+ $collapse: collapse
88
+ }, selectedOptions.map(function (option, index) {
89
+ return /*#__PURE__*/React.createElement(S.ItemWrapper, {
90
+ key: option.value,
91
+ ref: function ref(el) {
92
+ tagRefs.current[index] = el;
93
+ },
94
+ style: collapse && index >= safeVisibleCount ? hiddenStyle : undefined
95
+ }, /*#__PURE__*/React.createElement(Chip, {
96
+ size: chipSize,
97
+ color: chipColor,
98
+ bgColor: chipBgColor,
99
+ label: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(S.TagLabel, {
100
+ variant: "smallMedium"
101
+ }, option.label), /*#__PURE__*/React.createElement(S.TagRemove, {
102
+ type: "button",
103
+ onMouseDown: function onMouseDown(event) {
104
+ return event.preventDefault();
105
+ },
106
+ onClick: function onClick(event) {
107
+ return handleRemove(event, option.value);
108
+ }
109
+ }, "\xD7"))
110
+ }));
111
+ }), collapse && /*#__PURE__*/React.createElement(S.ItemWrapper, {
112
+ ref: counterRef,
113
+ style: hiddenCount > 0 ? undefined : hiddenStyle
114
+ }, /*#__PURE__*/React.createElement(Chip, {
115
+ size: chipSize,
116
+ color: chipColor,
117
+ bgColor: chipBgColor,
118
+ label: "+".concat(hiddenCount)
119
+ })));
120
+ };
@@ -0,0 +1,22 @@
1
+ import styled, { css } from 'styled-components';
2
+ import { Typography } from '../../../../common/Typography';
3
+ export var TAGS_GAP = 6;
4
+ export var Wrapper = styled.div.withConfig({
5
+ displayName: "styles__Wrapper",
6
+ componentId: "sc-gzjw07-0"
7
+ })(["display:flex;align-items:center;gap:", "px;width:100%;min-width:0;", ""], TAGS_GAP, function (_ref) {
8
+ var $collapse = _ref.$collapse;
9
+ return $collapse ? css(["flex-wrap:nowrap;overflow:hidden;"]) : css(["flex-wrap:wrap;"]);
10
+ });
11
+ export var ItemWrapper = styled.div.withConfig({
12
+ displayName: "styles__ItemWrapper",
13
+ componentId: "sc-gzjw07-1"
14
+ })(["display:inline-flex;flex:0 0 auto;max-width:100%;"]);
15
+ export var TagLabel = styled(Typography).withConfig({
16
+ displayName: "styles__TagLabel",
17
+ componentId: "sc-gzjw07-2"
18
+ })(["overflow:hidden;text-overflow:ellipsis;white-space:nowrap;"]);
19
+ export var TagRemove = styled.button.withConfig({
20
+ displayName: "styles__TagRemove",
21
+ componentId: "sc-gzjw07-3"
22
+ })(["display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:14px;height:14px;padding:0;border:none;background:none;color:inherit;font-size:16px;line-height:1;cursor:pointer;"]);
@@ -1,3 +1,7 @@
1
+ function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
2
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
4
+ function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
1
5
  function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
6
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
7
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
@@ -15,39 +19,47 @@ import { useComponentPalette } from '../../../palette';
15
19
  import { useOptionGroups } from './hooks/useOptionGroups';
16
20
  import { Drawer } from '../../common/Drawer';
17
21
  import Loader from './components/Loader';
22
+ import { MultipleValue } from './components/MultipleValue';
23
+ import { Checkbox } from '../Checkbox';
18
24
  var MAX_LIST_HEIGHT = 294;
19
25
  var OPTION_IDENTIFIER = 'option-identifier';
20
- export var Select = function Select(_ref) {
21
- var label = _ref.label,
22
- hasError = _ref.hasError,
23
- placeholder = _ref.placeholder,
24
- name = _ref.name,
25
- value = _ref.value,
26
- renderValue = _ref.renderValue,
27
- onChange = _ref.onChange,
28
- options = _ref.options,
29
- _ref$groups = _ref.groups,
30
- groups = _ref$groups === void 0 ? [] : _ref$groups,
31
- _ref$isResetButtonEna = _ref.isResetButtonEnabled,
32
- isResetButtonEnabled = _ref$isResetButtonEna === void 0 ? false : _ref$isResetButtonEna,
33
- size = _ref.size,
34
- renderOption = _ref.renderOption,
35
- dropdownHeader = _ref.dropdownHeader,
36
- _ref$isDrawerOptions = _ref.isDrawerOptions,
37
- isDrawerOptions = _ref$isDrawerOptions === void 0 ? false : _ref$isDrawerOptions,
38
- renderGroup = _ref.renderGroup,
39
- _ref$scrollbarMaxHeig = _ref.scrollbarMaxHeight,
40
- scrollbarMaxHeight = _ref$scrollbarMaxHeig === void 0 ? MAX_LIST_HEIGHT : _ref$scrollbarMaxHeig,
41
- scrollbarHeader = _ref.scrollbarHeader,
42
- emptyOptionsLabel = _ref.emptyOptionsLabel,
43
- isLoading = _ref.isLoading,
44
- onBlur = _ref.onBlur,
45
- required = _ref.required,
46
- _ref$usePadding = _ref.usePadding,
47
- usePadding = _ref$usePadding === void 0 ? false : _ref$usePadding,
48
- dropdownWidth = _ref.dropdownWidth,
49
- _ref$useModernStyles = _ref.useModernStyles,
50
- useModernStyles = _ref$useModernStyles === void 0 ? false : _ref$useModernStyles;
26
+ export var Select = function Select(props) {
27
+ var _collapseTags;
28
+ var label = props.label,
29
+ hasError = props.hasError,
30
+ placeholder = props.placeholder,
31
+ name = props.name,
32
+ value = props.value,
33
+ renderValue = props.renderValue,
34
+ onChange = props.onChange,
35
+ options = props.options,
36
+ _props$groups = props.groups,
37
+ groups = _props$groups === void 0 ? [] : _props$groups,
38
+ _props$isResetButtonE = props.isResetButtonEnabled,
39
+ isResetButtonEnabled = _props$isResetButtonE === void 0 ? false : _props$isResetButtonE,
40
+ size = props.size,
41
+ renderOption = props.renderOption,
42
+ dropdownHeader = props.dropdownHeader,
43
+ _props$isDrawerOption = props.isDrawerOptions,
44
+ isDrawerOptions = _props$isDrawerOption === void 0 ? false : _props$isDrawerOption,
45
+ renderGroup = props.renderGroup,
46
+ _props$scrollbarMaxHe = props.scrollbarMaxHeight,
47
+ scrollbarMaxHeight = _props$scrollbarMaxHe === void 0 ? MAX_LIST_HEIGHT : _props$scrollbarMaxHe,
48
+ scrollbarHeader = props.scrollbarHeader,
49
+ emptyOptionsLabel = props.emptyOptionsLabel,
50
+ isLoading = props.isLoading,
51
+ onBlur = props.onBlur,
52
+ required = props.required,
53
+ _props$usePadding = props.usePadding,
54
+ usePadding = _props$usePadding === void 0 ? false : _props$usePadding,
55
+ dropdownWidth = props.dropdownWidth,
56
+ _props$useModernStyle = props.useModernStyles,
57
+ useModernStyles = _props$useModernStyle === void 0 ? false : _props$useModernStyle;
58
+ var isMultiple = props.isMultiple === true;
59
+ var collapseTags = isMultiple ? (_collapseTags = props.collapseTags) !== null && _collapseTags !== void 0 ? _collapseTags : false : false;
60
+ var chipProps = isMultiple ? props.chipProps : undefined;
61
+ var onChangeSingle = onChange;
62
+ var onChangeMultiple = onChange;
51
63
  var palette = useComponentPalette('select');
52
64
  var _useInputFocus = useInputFocus({
53
65
  onBlur: onBlur
@@ -74,11 +86,23 @@ export var Select = function Select(_ref) {
74
86
  */
75
87
  var delayBlur = useRef(null);
76
88
  var inputRef = useRef(null);
89
+ var multipleValue = useMemo(function () {
90
+ var _ref;
91
+ return isMultiple ? (_ref = value) !== null && _ref !== void 0 ? _ref : [] : [];
92
+ }, [isMultiple, value]);
77
93
  var selectedOption = useMemo(function () {
78
- return options.find(function (option) {
94
+ return isMultiple ? undefined : options.find(function (option) {
79
95
  return option.value === value;
80
96
  });
81
- }, [options, value]);
97
+ }, [isMultiple, options, value]);
98
+ var selectedOptions = useMemo(function () {
99
+ return isMultiple ? options.filter(function (option) {
100
+ return multipleValue.includes(option.value);
101
+ }) : [];
102
+ }, [isMultiple, options, multipleValue]);
103
+ var selectedValuesSet = useMemo(function () {
104
+ return new Set(multipleValue);
105
+ }, [multipleValue]);
82
106
  var optionGroups = useOptionGroups(options, groups);
83
107
  var handleShow = useCallback(function () {
84
108
  return setIsOpen(true);
@@ -105,16 +129,29 @@ export var Select = function Select(_ref) {
105
129
  }, [blurHandler]);
106
130
  var handleSelect = useCallback(function (event) {
107
131
  var newValue = JSON.parse(event.currentTarget.dataset.value);
108
- onChange(newValue);
132
+ if (isMultiple) {
133
+ var next = multipleValue.includes(newValue) ? multipleValue.filter(function (item) {
134
+ return item !== newValue;
135
+ }) : [].concat(_toConsumableArray(multipleValue), [newValue]);
136
+ onChangeMultiple(next);
137
+ // при множественном выборе дропдаун остаётся открытым
138
+ return;
139
+ }
140
+ onChangeSingle(newValue);
109
141
  handleHide();
110
142
  if (delayBlur.current) {
111
143
  delayBlur.current();
112
144
  delayBlur.current = null;
113
145
  }
114
- }, [handleHide, onChange]);
146
+ }, [handleHide, isMultiple, multipleValue, onChangeMultiple, onChangeSingle]);
147
+ var handleRemoveTag = useCallback(function (removedValue) {
148
+ return onChangeMultiple(multipleValue.filter(function (item) {
149
+ return item !== removedValue;
150
+ }));
151
+ }, [multipleValue, onChangeMultiple]);
115
152
  var handleReset = useCallback(function () {
116
- return onChange(null);
117
- }, [onChange]);
153
+ return isMultiple ? onChangeMultiple([]) : onChangeSingle(null);
154
+ }, [isMultiple, onChangeMultiple, onChangeSingle]);
118
155
  var handleInputClick = function handleInputClick() {
119
156
  var _inputRef$current;
120
157
  (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 || _inputRef$current.blur();
@@ -130,8 +167,9 @@ export var Select = function Select(_ref) {
130
167
  return renderOption(option.entity);
131
168
  }
132
169
  return /*#__PURE__*/React.createElement(S.DefaultOptionWrapper, {
133
- $usePadding: usePadding
134
- }, " ", option.label);
170
+ $usePadding: usePadding,
171
+ $isMultiple: isMultiple
172
+ }, option.label);
135
173
  };
136
174
  var handleGroupRender = function handleGroupRender(group) {
137
175
  if (group) {
@@ -166,8 +204,12 @@ export var Select = function Select(_ref) {
166
204
  "data-value": JSON.stringify(option.value),
167
205
  "data-option-identifier": OPTION_IDENTIFIER,
168
206
  $isGrouped: !!group && !renderOption,
169
- $usePadding: usePadding
170
- }, handleOptionRender(option)));
207
+ $usePadding: usePadding,
208
+ $isSelected: !isMultiple && option.value === value
209
+ }, isMultiple ? /*#__PURE__*/React.createElement(S.OptionContent, null, /*#__PURE__*/React.createElement(S.CheckboxWrapper, null, /*#__PURE__*/React.createElement(Checkbox, {
210
+ checked: selectedValuesSet.has(option.value),
211
+ readOnly: true
212
+ })), handleOptionRender(option)) : handleOptionRender(option)));
171
213
  }));
172
214
  }));
173
215
  var emptyLabel = /*#__PURE__*/React.createElement(S.DefaultOptionWrapper, null, /*#__PURE__*/React.createElement(S.EmptyLabel, {
@@ -198,20 +240,32 @@ export var Select = function Select(_ref) {
198
240
  return /*#__PURE__*/React.createElement(React.Fragment, null, dropdownHeader, " ", emptyLabel);
199
241
  };
200
242
  var renderedValue = useMemo(function () {
243
+ if (isMultiple) {
244
+ if (!selectedOptions.length) return;
245
+ return /*#__PURE__*/React.createElement(MultipleValue, {
246
+ selectedOptions: selectedOptions,
247
+ onRemove: handleRemoveTag,
248
+ collapse: collapseTags,
249
+ chipProps: chipProps
250
+ });
251
+ }
201
252
  if (!renderValue || !(selectedOption !== null && selectedOption !== void 0 && selectedOption.entity)) return;
202
253
  return renderValue(selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.entity);
203
- }, [renderValue, selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.entity]);
254
+ }, [isMultiple, selectedOptions, handleRemoveTag, collapseTags, chipProps, renderValue, selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.entity]);
255
+ var inputValue = isMultiple ? selectedOptions.map(function (option) {
256
+ return option.label;
257
+ }).join(', ') : (selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.label) || '';
204
258
  return /*#__PURE__*/React.createElement(S.Wrapper, {
205
259
  ref: isDrawerOptions ? undefined : wrapperRef
206
260
  }, /*#__PURE__*/React.createElement(S.InputWrapper, null, /*#__PURE__*/React.createElement(Input, {
207
261
  ref: inputRef,
208
262
  label: label,
209
263
  hasError: hasError,
210
- inFocus: inFocus,
264
+ inFocus: isMultiple ? isOpen : inFocus,
211
265
  placeholder: placeholder,
212
266
  onFocus: isDrawerOptions ? undefined : handleFocus,
213
267
  onBlur: isDrawerOptions ? undefined : handleBlur,
214
- value: (selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.label) || '',
268
+ value: inputValue,
215
269
  renderedValue: renderedValue,
216
270
  name: name,
217
271
  isOpen: isOpen,
@@ -239,4 +239,35 @@ export var WithRenderedValue = {
239
239
  renderValue: renderValue
240
240
  }),
241
241
  render: Component
242
+ };
243
+ var MultipleComponent = function MultipleComponent(props) {
244
+ var _useState3 = useState([]),
245
+ _useState4 = _slicedToArray(_useState3, 2),
246
+ value = _useState4[0],
247
+ setValue = _useState4[1];
248
+ var handleChange = useCallback(function (newValue) {
249
+ setValue(newValue);
250
+ action('onChange')(newValue);
251
+ }, []);
252
+ return /*#__PURE__*/React.createElement("div", {
253
+ style: {
254
+ maxWidth: 360
255
+ }
256
+ }, /*#__PURE__*/React.createElement(Select, _extends({}, props, {
257
+ value: value,
258
+ onChange: handleChange
259
+ })));
260
+ };
261
+ export var Multiple = {
262
+ args: _objectSpread(_objectSpread({}, COMMON_ARGS), {}, {
263
+ isMultiple: true
264
+ }),
265
+ render: MultipleComponent
266
+ };
267
+ export var MultipleCollapsed = {
268
+ args: _objectSpread(_objectSpread({}, COMMON_ARGS), {}, {
269
+ isMultiple: true,
270
+ collapseTags: true
271
+ }),
272
+ render: MultipleComponent
242
273
  };
@@ -2,6 +2,8 @@ import hexToRgba from '../../../utils/hexToRgba';
2
2
  export var generateSelectPalette = function generateSelectPalette(abstractPalette) {
3
3
  return {
4
4
  bgHover: hexToRgba(abstractPalette.neutralUsual, 0.5),
5
- empty: abstractPalette.neutralFoggy
5
+ empty: abstractPalette.neutralFoggy,
6
+ tagColor: '#6590FD',
7
+ tagBg: hexToRgba('#6590FD', 0.16)
6
8
  };
7
9
  };
@@ -18,14 +18,18 @@ export var OptionWrapper = styled.div.withConfig({
18
18
  export var Option = styled(Typography).withConfig({
19
19
  displayName: "styles__Option",
20
20
  componentId: "sc-1x9n0z5-3"
21
- })(["overflow:hidden;width:100%;text-align:left;transition:all 0.2s ease-in-out 0s;box-sizing:border-box;cursor:pointer;border-radius:", ";&:hover{background-color:", ";}", ""], function (_ref2) {
21
+ })(["overflow:hidden;width:100%;text-align:left;transition:all 0.2s ease-in-out 0s;box-sizing:border-box;cursor:pointer;border-radius:", ";", " &:hover{background-color:", ";}", ""], function (_ref2) {
22
22
  var $usePadding = _ref2.$usePadding;
23
23
  return $usePadding ? '12px' : 'none';
24
24
  }, function (_ref3) {
25
- var $palette = _ref3.$palette;
26
- return $palette.bgHover;
25
+ var $isSelected = _ref3.$isSelected,
26
+ $palette = _ref3.$palette;
27
+ return $isSelected && css(["background-color:", ";border-radius:8px;"], $palette.bgHover);
27
28
  }, function (_ref4) {
28
- var $isGrouped = _ref4.$isGrouped;
29
+ var $palette = _ref4.$palette;
30
+ return $palette.bgHover;
31
+ }, function (_ref5) {
32
+ var $isGrouped = _ref5.$isGrouped;
29
33
  return $isGrouped && css(["padding-left:30px;"]);
30
34
  });
31
35
  export var Group = styled(Typography).withConfig({
@@ -35,9 +39,13 @@ export var Group = styled(Typography).withConfig({
35
39
  export var DefaultOptionWrapper = styled.div.withConfig({
36
40
  displayName: "styles__DefaultOptionWrapper",
37
41
  componentId: "sc-1x9n0z5-5"
38
- })(["padding:", ";"], function (_ref5) {
39
- var $usePadding = _ref5.$usePadding;
42
+ })(["padding:", ";padding-left:", ";"], function (_ref6) {
43
+ var $usePadding = _ref6.$usePadding;
40
44
  return $usePadding ? '12px' : '12px 20px';
45
+ }, function (_ref7) {
46
+ var $isMultiple = _ref7.$isMultiple,
47
+ $usePadding = _ref7.$usePadding;
48
+ return $isMultiple && !$usePadding ? '6px' : undefined;
41
49
  });
42
50
  export var DrawerContent = styled.div.withConfig({
43
51
  displayName: "styles__DrawerContent",
@@ -50,11 +58,19 @@ export var DrawerBottom = styled.div.withConfig({
50
58
  export var EmptyLabel = styled(Typography).withConfig({
51
59
  displayName: "styles__EmptyLabel",
52
60
  componentId: "sc-1x9n0z5-8"
53
- })(["color:", ";"], function (_ref6) {
54
- var $color = _ref6.$color;
61
+ })(["color:", ";"], function (_ref8) {
62
+ var $color = _ref8.$color;
55
63
  return $color;
56
64
  });
57
65
  export var ScrollbarContent = styled.div.withConfig({
58
66
  displayName: "styles__ScrollbarContent",
59
67
  componentId: "sc-1x9n0z5-9"
60
- })([""]);
68
+ })([""]);
69
+ export var OptionContent = styled.div.withConfig({
70
+ displayName: "styles__OptionContent",
71
+ componentId: "sc-1x9n0z5-10"
72
+ })(["display:flex;align-items:center;gap:8px;padding-left:16px;"]);
73
+ export var CheckboxWrapper = styled.div.withConfig({
74
+ displayName: "styles__CheckboxWrapper",
75
+ componentId: "sc-1x9n0z5-11"
76
+ })(["flex:0 0 auto;pointer-events:none;"]);