@decisiv/ui-components 2.0.1-alpha.8 → 2.0.1-alpha.82

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 (240) hide show
  1. package/lib/atoms/BaseButton/index.d.ts.map +1 -1
  2. package/lib/atoms/BaseButton/index.js +1 -1
  3. package/lib/atoms/BooleanInput/index.d.ts.map +1 -1
  4. package/lib/atoms/BooleanInput/index.js +19 -2
  5. package/lib/atoms/BooleanInput/index.test.js +17 -6
  6. package/lib/atoms/BooleanInput/types.d.ts +2 -0
  7. package/lib/atoms/BooleanInput/types.d.ts.map +1 -1
  8. package/lib/atoms/Calendar/hooks/useCalendar/index.d.ts.map +1 -1
  9. package/lib/atoms/Calendar/hooks/useCalendar/index.js +2 -1
  10. package/lib/atoms/Calendar/hooks/useCalendar/index.test.js +5 -6
  11. package/lib/atoms/Calendar/index.d.ts.map +1 -1
  12. package/lib/atoms/Calendar/index.js +8 -1
  13. package/lib/atoms/Calendar/index.test.js +70 -40
  14. package/lib/atoms/InputField/Containers.d.ts +10 -6
  15. package/lib/atoms/InputField/Containers.d.ts.map +1 -1
  16. package/lib/atoms/InputField/Containers.js +6 -6
  17. package/lib/atoms/InputField/InputLabel.d.ts +1 -0
  18. package/lib/atoms/InputField/InputLabel.d.ts.map +1 -1
  19. package/lib/atoms/InputField/InputLabel.js +2 -1
  20. package/lib/atoms/InputField/index.d.ts +4 -0
  21. package/lib/atoms/InputField/index.d.ts.map +1 -1
  22. package/lib/atoms/InputField/index.js +18 -7
  23. package/lib/atoms/InputField/index.test.js +91 -0
  24. package/lib/atoms/InputField/schema.d.ts.map +1 -1
  25. package/lib/atoms/InputField/schema.js +1 -0
  26. package/lib/atoms/OptionsList/Category.d.ts +1 -1
  27. package/lib/atoms/OptionsList/Category.d.ts.map +1 -1
  28. package/lib/atoms/OptionsList/Category.js +4 -2
  29. package/lib/atoms/OptionsList/Footer.d.ts +8 -0
  30. package/lib/atoms/OptionsList/Footer.d.ts.map +1 -0
  31. package/lib/atoms/OptionsList/Footer.js +72 -0
  32. package/lib/atoms/OptionsList/Option.d.ts.map +1 -1
  33. package/lib/atoms/OptionsList/Option.js +8 -5
  34. package/lib/atoms/OptionsList/index.d.ts.map +1 -1
  35. package/lib/atoms/OptionsList/index.js +43 -16
  36. package/lib/atoms/OptionsList/index.test.js +107 -11
  37. package/lib/atoms/OptionsList/schema.d.ts.map +1 -1
  38. package/lib/atoms/OptionsList/schema.js +4 -0
  39. package/lib/atoms/OptionsList/types.d.ts +14 -0
  40. package/lib/atoms/OptionsList/types.d.ts.map +1 -1
  41. package/lib/atoms/RequiredIcon.d.ts +9 -0
  42. package/lib/atoms/RequiredIcon.d.ts.map +1 -0
  43. package/lib/atoms/{InputField/RequiredIcon.js → RequiredIcon.js} +7 -3
  44. package/lib/components/Button/schema.d.ts +6 -1
  45. package/lib/components/Button/schema.d.ts.map +1 -1
  46. package/lib/components/Button/schema.js +9 -4
  47. package/lib/components/Checkbox/index.d.ts.map +1 -1
  48. package/lib/components/Checkbox/index.js +3 -1
  49. package/lib/components/Checkbox/schema.d.ts.map +1 -1
  50. package/lib/components/Checkbox/schema.js +2 -0
  51. package/lib/components/Combobox/Target.d.ts.map +1 -1
  52. package/lib/components/Combobox/Target.js +45 -14
  53. package/lib/components/Combobox/index.d.ts.map +1 -1
  54. package/lib/components/Combobox/index.js +182 -64
  55. package/lib/components/Combobox/index.test.js +358 -135
  56. package/lib/components/Combobox/schema.d.ts.map +1 -1
  57. package/lib/components/Combobox/schema.js +9 -2
  58. package/lib/components/Combobox/types.d.ts +12 -3
  59. package/lib/components/Combobox/types.d.ts.map +1 -1
  60. package/lib/components/DropdownList/index.d.ts +4 -0
  61. package/lib/components/DropdownList/index.d.ts.map +1 -1
  62. package/lib/components/DropdownList/index.js +76 -11
  63. package/lib/components/DropdownList/propTypes.d.ts +4 -0
  64. package/lib/components/DropdownList/propTypes.d.ts.map +1 -0
  65. package/lib/components/DropdownList/propTypes.js +42 -0
  66. package/lib/components/DropdownList/schema.d.ts.map +1 -1
  67. package/lib/components/DropdownList/schema.js +5 -0
  68. package/lib/components/DropdownList/types.d.ts +4 -1
  69. package/lib/components/DropdownList/types.d.ts.map +1 -1
  70. package/lib/components/Filter/IconWrapper/index.d.ts +197 -0
  71. package/lib/components/Filter/IconWrapper/index.d.ts.map +1 -0
  72. package/lib/components/Filter/IconWrapper/index.js +35 -0
  73. package/lib/components/Filter/SimplePrimary/index.d.ts +31 -0
  74. package/lib/components/Filter/SimplePrimary/index.d.ts.map +1 -0
  75. package/lib/components/Filter/SimplePrimary/index.js +58 -0
  76. package/lib/components/Filter/SimplePrimary/index.test.js +34 -0
  77. package/lib/components/Filter/StyledFilter.d.ts +4 -0
  78. package/lib/components/Filter/StyledFilter.d.ts.map +1 -0
  79. package/lib/components/Filter/StyledFilter.js +39 -0
  80. package/lib/components/Filter/StyledLabel/index.d.ts +8 -0
  81. package/lib/components/Filter/StyledLabel/index.d.ts.map +1 -0
  82. package/lib/components/Filter/StyledLabel/index.js +30 -0
  83. package/lib/components/Filter/index.d.ts +27 -0
  84. package/lib/components/Filter/index.d.ts.map +1 -0
  85. package/lib/components/Filter/index.js +95 -0
  86. package/lib/components/Filter/index.test.js +41 -0
  87. package/lib/components/Filter/kind.d.ts +6 -0
  88. package/lib/components/Filter/kind.d.ts.map +1 -0
  89. package/lib/components/Filter/kind.js +45 -0
  90. package/lib/components/Filter/schema.d.ts +9 -0
  91. package/lib/components/Filter/schema.d.ts.map +1 -0
  92. package/lib/components/Filter/schema.js +32 -0
  93. package/lib/components/Filter/types.d.ts +17 -0
  94. package/lib/components/Filter/types.d.ts.map +1 -0
  95. package/lib/components/Filter/types.js +1 -0
  96. package/lib/components/LeftNav/Item/ClickArea.d.ts.map +1 -1
  97. package/lib/components/LeftNav/Item/ClickArea.js +2 -2
  98. package/lib/components/LeftNav/Item/ItemWrapper.d.ts.map +1 -1
  99. package/lib/components/LeftNav/Item/ItemWrapper.js +3 -3
  100. package/lib/components/LeftNav/Item/MenuItemWrapper.d.ts +7 -0
  101. package/lib/components/LeftNav/Item/MenuItemWrapper.d.ts.map +1 -0
  102. package/lib/components/LeftNav/Item/MenuItemWrapper.js +20 -0
  103. package/lib/components/LeftNav/Item/NavCollapsedXItem/index.d.ts.map +1 -1
  104. package/lib/components/LeftNav/Item/NavCollapsedXItem/index.js +7 -5
  105. package/lib/components/LeftNav/Item/NavExpandedItem/index.d.ts.map +1 -1
  106. package/lib/components/LeftNav/Item/NavExpandedItem/index.js +24 -13
  107. package/lib/components/LeftNav/Item/types.d.ts +1 -1
  108. package/lib/components/LeftNav/Item/types.d.ts.map +1 -1
  109. package/lib/components/LeftNav/index.test.js +13 -3
  110. package/lib/components/LeftNav/schema.d.ts.map +1 -1
  111. package/lib/components/LeftNav/schema.js +2 -0
  112. package/lib/components/LeftNav/types.d.ts +1 -0
  113. package/lib/components/LeftNav/types.d.ts.map +1 -1
  114. package/lib/components/Menu/index.d.ts.map +1 -1
  115. package/lib/components/Menu/index.js +3 -1
  116. package/lib/components/Menu/types.d.ts +2 -0
  117. package/lib/components/Menu/types.d.ts.map +1 -1
  118. package/lib/components/Modal/components.d.ts +2 -2
  119. package/lib/components/Modal/index.d.ts.map +1 -1
  120. package/lib/components/Modal/index.js +5 -5
  121. package/lib/components/Modal/index.test.js +32 -0
  122. package/lib/components/Modal/schema.d.ts.map +1 -1
  123. package/lib/components/Modal/schema.js +2 -2
  124. package/lib/components/Modal/types.d.ts +2 -2
  125. package/lib/components/Modal/types.d.ts.map +1 -1
  126. package/lib/components/Notifications/Notification/components.d.ts +3 -3
  127. package/lib/components/Notifications/Notification/components.d.ts.map +1 -1
  128. package/lib/components/Notifications/Notification/components.js +12 -6
  129. package/lib/components/Notifications/Notification/index.d.ts +3 -6
  130. package/lib/components/Notifications/Notification/index.d.ts.map +1 -1
  131. package/lib/components/Notifications/Notification/index.js +19 -12
  132. package/lib/components/Notifications/Notification/index.test.js +38 -19
  133. package/lib/components/Notifications/NotificationsPanel/index.d.ts +2 -1
  134. package/lib/components/Notifications/NotificationsPanel/index.d.ts.map +1 -1
  135. package/lib/components/Notifications/NotificationsPanel/index.js +44 -21
  136. package/lib/components/Notifications/NotificationsPanel/schema.js +1 -1
  137. package/lib/components/Notifications/Notifier.test.js +79 -10
  138. package/lib/components/Notifications/constants.d.ts +2 -0
  139. package/lib/components/Notifications/constants.d.ts.map +1 -0
  140. package/lib/components/Notifications/constants.js +16 -0
  141. package/lib/components/Notifications/schema.d.ts.map +1 -1
  142. package/lib/components/Notifications/schema.js +2 -1
  143. package/lib/components/Notifications/useNotifications.d.ts +1 -0
  144. package/lib/components/Notifications/useNotifications.d.ts.map +1 -1
  145. package/lib/components/Notifications/useNotifications.js +3 -3
  146. package/lib/components/Notifications/useNotifications.test.js +7 -4
  147. package/lib/components/Pagination/Pagination.d.ts +1 -1
  148. package/lib/components/Pagination/Pagination.d.ts.map +1 -1
  149. package/lib/components/Pagination/Pagination.js +1 -0
  150. package/lib/components/Pagination/Pagination.test.js +9 -0
  151. package/lib/components/Popover/utils.d.ts +1 -1
  152. package/lib/components/Select/Target.js +1 -1
  153. package/lib/components/Select/index.d.ts.map +1 -1
  154. package/lib/components/Select/index.js +20 -1
  155. package/lib/components/Select/index.test.js +31 -9
  156. package/lib/components/Select/schema.d.ts.map +1 -1
  157. package/lib/components/Select/schema.js +5 -0
  158. package/lib/components/Select/types.d.ts +2 -1
  159. package/lib/components/Select/types.d.ts.map +1 -1
  160. package/lib/components/SelectDate/Target.js +1 -1
  161. package/lib/components/SelectDate/index.test.js +71 -51
  162. package/lib/components/SelectDateRange/index.test.js +78 -58
  163. package/lib/components/SelectMenu/index.d.ts +5 -0
  164. package/lib/components/SelectMenu/index.d.ts.map +1 -1
  165. package/lib/components/SelectMenu/index.js +27 -3
  166. package/lib/components/SelectMenu/schema.d.ts.map +1 -1
  167. package/lib/components/SelectMenu/schema.js +4 -0
  168. package/lib/components/Table/Body.d.ts.map +1 -1
  169. package/lib/components/Table/Body.js +182 -38
  170. package/lib/components/Table/Container.d.ts.map +1 -1
  171. package/lib/components/Table/Container.js +2 -2
  172. package/lib/components/Table/DataRow.d.ts.map +1 -1
  173. package/lib/components/Table/DataRow.js +43 -16
  174. package/lib/components/Table/DraggableWrapper.d.ts +5 -0
  175. package/lib/components/Table/DraggableWrapper.d.ts.map +1 -0
  176. package/lib/components/Table/DraggableWrapper.js +38 -0
  177. package/lib/components/Table/Grip.d.ts +4 -0
  178. package/lib/components/Table/Grip.d.ts.map +1 -0
  179. package/lib/components/Table/Grip.js +30 -0
  180. package/lib/components/Table/Head.d.ts +1 -1
  181. package/lib/components/Table/Head.d.ts.map +1 -1
  182. package/lib/components/Table/Head.js +11 -5
  183. package/lib/components/Table/HeaderCell/index.d.ts.map +1 -1
  184. package/lib/components/Table/HeaderCell/index.js +22 -8
  185. package/lib/components/Table/HeaderCell/types.d.ts +6 -1
  186. package/lib/components/Table/HeaderCell/types.d.ts.map +1 -1
  187. package/lib/components/Table/Provider.d.ts +13 -4
  188. package/lib/components/Table/Provider.d.ts.map +1 -1
  189. package/lib/components/Table/Provider.js +45 -5
  190. package/lib/components/Table/index.d.ts.map +1 -1
  191. package/lib/components/Table/index.js +112 -18
  192. package/lib/components/Table/index.test.js +330 -84
  193. package/lib/components/Table/schema.columns.d.ts.map +1 -1
  194. package/lib/components/Table/schema.columns.js +6 -4
  195. package/lib/components/Table/schema.d.ts.map +1 -1
  196. package/lib/components/Table/schema.js +8 -6
  197. package/lib/components/Table/types.d.ts +34 -4
  198. package/lib/components/Table/types.d.ts.map +1 -1
  199. package/lib/components/Table/utils.d.ts +2 -8
  200. package/lib/components/Table/utils.d.ts.map +1 -1
  201. package/lib/components/Table/utils.js +21 -20
  202. package/lib/components/Tag/types.d.ts +1 -1
  203. package/lib/components/Tag/types.d.ts.map +1 -1
  204. package/lib/components/TextArea/TextArea.d.ts.map +1 -1
  205. package/lib/components/TextArea/TextArea.js +1 -1
  206. package/lib/components/TextArea/index.js +1 -0
  207. package/lib/components/TextArea/index.test.js +5 -0
  208. package/lib/components/TextField/Input.js +1 -1
  209. package/lib/components/TextField/index.test.js +5 -0
  210. package/lib/components/Toggle/index.d.ts.map +1 -1
  211. package/lib/components/Toggle/index.js +4 -0
  212. package/lib/components/Toggle/index.test.js +39 -10
  213. package/lib/components/TopNav/BrandInfo/index.d.ts +2 -1
  214. package/lib/components/TopNav/BrandInfo/index.d.ts.map +1 -1
  215. package/lib/components/TopNav/BrandInfo/index.js +9 -1
  216. package/lib/components/TopNav/BrandInfo/schema.d.ts.map +1 -1
  217. package/lib/components/TopNav/BrandInfo/schema.js +4 -1
  218. package/lib/components/TopNav/index.test.js +28 -0
  219. package/lib/components/index.d.ts +1 -0
  220. package/lib/components/index.d.ts.map +1 -1
  221. package/lib/components/index.js +9 -0
  222. package/lib/providers/ConfigProvider/index.d.ts.map +1 -1
  223. package/lib/providers/ConfigProvider/index.js +5 -1
  224. package/lib/providers/ConfigProvider/utils/context.d.ts +1 -1
  225. package/lib/providers/ConfigProvider/utils/context.d.ts.map +1 -1
  226. package/lib/providers/ConfigProvider/utils/normalizer.d.ts.map +1 -1
  227. package/lib/providers/ConfigProvider/utils/normalizer.js +1 -1
  228. package/lib/providers/ConfigProvider/utils/translations.d.ts +1 -1
  229. package/lib/providers/ConfigProvider/utils/translations.js +1 -1
  230. package/lib/providers/NotificationsProvider/index.d.ts +6 -5
  231. package/lib/providers/NotificationsProvider/index.d.ts.map +1 -1
  232. package/lib/providers/NotificationsProvider/index.js +47 -28
  233. package/lib/providers/NotificationsProvider/types.d.ts +4 -1
  234. package/lib/providers/NotificationsProvider/types.d.ts.map +1 -1
  235. package/lib/utils/joinClassnames.d.ts +3 -0
  236. package/lib/utils/joinClassnames.d.ts.map +1 -0
  237. package/lib/utils/joinClassnames.js +26 -0
  238. package/package.json +4 -2
  239. package/lib/atoms/InputField/RequiredIcon.d.ts +0 -4
  240. package/lib/atoms/InputField/RequiredIcon.d.ts.map +0 -1
@@ -11,8 +11,14 @@ var _findIndex = _interopRequireDefault(require("lodash/findIndex"));
11
11
 
12
12
  var _get = _interopRequireDefault(require("lodash/get"));
13
13
 
14
+ var _union = _interopRequireDefault(require("lodash/union"));
15
+
16
+ var _isArray = _interopRequireDefault(require("lodash/isArray"));
17
+
14
18
  var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
15
19
 
20
+ var _last = _interopRequireDefault(require("lodash/last"));
21
+
16
22
  var _rem = _interopRequireDefault(require("polished/lib/helpers/rem"));
17
23
 
18
24
  var _react = _interopRequireWildcard(require("react"));
@@ -25,6 +31,8 @@ var _Question = _interopRequireDefault(require("@decisiv/iconix/lib/components/Q
25
31
 
26
32
  var _composeReactRefs = _interopRequireDefault(require("@seznam/compose-react-refs"));
27
33
 
34
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
35
+
28
36
  var _InputField = _interopRequireDefault(require("../../atoms/InputField"));
29
37
 
30
38
  var _useClickOutside = _interopRequireDefault(require("../../utils/useClickOutside"));
@@ -49,12 +57,16 @@ var _schema = _interopRequireDefault(require("./schema"));
49
57
 
50
58
  var _utils = require("./utils");
51
59
 
60
+ var _usePrevious = _interopRequireDefault(require("../../utils/usePrevious"));
61
+
52
62
  function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
53
63
 
54
64
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
55
65
 
56
66
  function _extends() { _extends = Object.assign || 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); }
57
67
 
68
+ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
69
+
58
70
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
59
71
 
60
72
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
@@ -71,6 +83,14 @@ function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d =
71
83
 
72
84
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
73
85
 
86
+ var StyledInputDiv = _styledComponents.default.div.withConfig({
87
+ displayName: "Combobox__StyledInputDiv",
88
+ componentId: "zvfxxj-0"
89
+ })(["position:relative;width:100%;max-width:", ";"], function (_ref) {
90
+ var maxWidth = _ref.maxWidth;
91
+ return maxWidth;
92
+ });
93
+
74
94
  function Combobox(props, ref) {
75
95
  var clearButtonLabel = props.clearButtonLabel,
76
96
  defaultValue = props.defaultValue,
@@ -78,17 +98,22 @@ function Combobox(props, ref) {
78
98
  inputContainerRef = props.inputContainerRef,
79
99
  label = props.label,
80
100
  loading = props.loading,
101
+ _props$maxWidth = props.maxWidth,
102
+ maxWidth = _props$maxWidth === void 0 ? '100%' : _props$maxWidth,
103
+ multiple = props.multiple,
81
104
  name = props.name,
82
105
  onChangeValue = props.onChangeValue,
83
106
  onClick = props.onClick,
84
107
  onFocus = props.onFocus,
108
+ onHide = props.onHide,
85
109
  onKeyDown = props.onKeyDown,
110
+ onShow = props.onShow,
86
111
  _props$options = props.options,
87
112
  options = _props$options === void 0 ? [] : _props$options,
113
+ renderOptionLabel = props.renderOptionLabel,
88
114
  propValue = props.value,
89
115
  _props$variant = props.variant,
90
116
  variant = _props$variant === void 0 ? 'sync' : _props$variant,
91
- renderOptionLabel = props.renderOptionLabel,
92
117
  zIndex = props.zIndex;
93
118
 
94
119
  var _useCombobox = (0, _useCombobox2.default)(props),
@@ -123,24 +148,77 @@ function Combobox(props, ref) {
123
148
  var _useState5 = (0, _react.useState)(false),
124
149
  _useState6 = _slicedToArray(_useState5, 2),
125
150
  isPopoverVisible = _useState6[0],
126
- setIsPopoverVisible = _useState6[1];
151
+ setIsPopoverVisibleState = _useState6[1];
152
+
153
+ var previousIsPopoverVisible = (0, _usePrevious.default)(isPopoverVisible);
154
+ /**
155
+ * Combobox controls the Popover instead of relying on the Popover's internal state.
156
+ * The Popover's onShow/ onHide handlers only function when the Popover is _not_
157
+ * controlled. This effect watches for a toggled visibility state, and calls the appropriate
158
+ * event handler.
159
+ */
127
160
 
128
161
  (0, _react.useEffect)(function () {
129
- // Set the "default" active ID to the first, if it exists.
130
- if (!(0, _isEmpty.default)(options) && !activeId) {
131
- setActiveId((0, _get.default)(options, '0.id'));
162
+ if (previousIsPopoverVisible && !isPopoverVisible && onHide) {
163
+ onHide();
164
+ }
165
+
166
+ if (!previousIsPopoverVisible && isPopoverVisible && onShow) {
167
+ onShow();
168
+ }
169
+ }, [isPopoverVisible, previousIsPopoverVisible, onShow, onHide]);
170
+ /**
171
+ * Update the dropdown list visibility.
172
+ */
173
+
174
+ var updateIsPopoverVisible = (0, _react.useCallback)(function (arg) {
175
+ if (arg === true || arg === false) setIsPopoverVisibleState(arg);
176
+ if (arg === 'toggle') setIsPopoverVisibleState(function (old) {
177
+ return !old;
178
+ });
179
+ }, [setIsPopoverVisibleState]);
180
+ /**
181
+ * This generates a flat list of the options (including those in categories)
182
+ * in the order they are presented in the dropdown list. Filtering disabled elements.
183
+ */
184
+
185
+ var flatOptions = (0, _react.useMemo)(function () {
186
+ return options.reduce(function (acc, curr) {
187
+ if ((0, _utils.isCategory)(curr)) {
188
+ var items = (0, _isArray.default)(curr.items) ? curr.items.filter(function (option) {
189
+ return !option.disabled;
190
+ }) : [];
191
+ return acc.concat(items);
192
+ }
193
+
194
+ if (!curr.disabled) {
195
+ return acc.concat(curr);
196
+ }
197
+
198
+ return acc;
199
+ }, []);
200
+ }, [options]);
201
+ (0, _react.useEffect)(function () {
202
+ // Set the "default" active ID to the first in flatOptions, if it exists.
203
+ if (!(0, _isEmpty.default)(flatOptions) && !activeId) {
204
+ setActiveId((0, _get.default)(flatOptions, '0.id'));
132
205
  } // For async comboboxes, if the input is focused, the dropdown should be open.
133
206
 
134
207
 
135
- if (isFocused && variant === 'async') {
136
- setIsPopoverVisible(true);
208
+ if (isFocused && variant === 'async' || multiple && internalInputValue !== '') {
209
+ updateIsPopoverVisible(true);
137
210
  }
138
- }, [activeId, isFocused, options, variant]); // The selectedValue is the id of the selectedOption, or an empty string if none selected.
211
+ }, [activeId, isFocused, flatOptions, variant, multiple, internalInputValue, updateIsPopoverVisible]); // The selectedValue is the id of the selectedOption, or an empty string if none selected.
139
212
 
140
- var _useState7 = (0, _react.useState)(propValue || defaultValue || undefined),
213
+ var _useState7 = (0, _react.useState)(!Array.isArray(propValue) && propValue || !Array.isArray(defaultValue) && defaultValue || undefined),
141
214
  _useState8 = _slicedToArray(_useState7, 2),
142
215
  selectedValue = _useState8[0],
143
216
  setSelectedValue = _useState8[1];
217
+
218
+ var _useState9 = (0, _react.useState)(Array.isArray(propValue) && propValue || undefined),
219
+ _useState10 = _slicedToArray(_useState9, 2),
220
+ selectedValues = _useState10[0],
221
+ setSelectedValues = _useState10[1];
144
222
  /**
145
223
  * The current selected value and current input value are saved independently,
146
224
  * but must be kept in sync. Using a single callback for this keeps it simple(r).
@@ -149,13 +227,51 @@ function Combobox(props, ref) {
149
227
 
150
228
  var updateSelected = (0, _react.useCallback)(function (selectedId) {
151
229
  setSelectedValue(selectedId);
152
- var newSelected = (0, _utils.getOptionFromOptions)(options, selectedId) || {};
153
- setInternalInputValue((0, _get.default)(newSelected, 'label', ''));
230
+ var newSelected = (0, _utils.getOptionFromOptions)(options, selectedId) || null;
231
+
232
+ if (multiple) {
233
+ var index = selectedValues && selectedValues.findIndex(function (_ref2) {
234
+ var itemId = _ref2.id;
235
+ return itemId === selectedId;
236
+ });
237
+
238
+ if (newSelected && (index === undefined || index === -1)) {
239
+ setSelectedValues((0, _union.default)(selectedValues, [newSelected]));
240
+ }
241
+
242
+ setInternalInputValue('');
243
+ setActiveId(undefined);
244
+ } else {
245
+ setInternalInputValue((0, _get.default)(newSelected, 'label', ''));
246
+ }
154
247
 
155
248
  if (onChangeValue) {
156
- onChangeValue(selectedId);
249
+ if (selectedId) {
250
+ onChangeValue(selectedId, {
251
+ removed: false
252
+ });
253
+ } else {
254
+ onChangeValue(null, {
255
+ removed: true
256
+ });
257
+ }
258
+ }
259
+ }, [multiple, onChangeValue, options, selectedValues, setInternalInputValue, setSelectedValue, setSelectedValues, setActiveId]);
260
+ var removeSelected = (0, _react.useCallback)(function (selectedId) {
261
+ var newSelectedValues = selectedValues && selectedValues.filter(function (_ref3) {
262
+ var optionId = _ref3.id;
263
+ return selectedId !== optionId;
264
+ });
265
+ setSelectedValues(newSelectedValues);
266
+
267
+ if (onChangeValue) {
268
+ onChangeValue(selectedId, {
269
+ removed: true
270
+ });
157
271
  }
158
- }, [onChangeValue, options, setInternalInputValue, setSelectedValue]);
272
+
273
+ return undefined;
274
+ }, [onChangeValue, selectedValues, setSelectedValues]);
159
275
  /**
160
276
  * If the value prop changes, it should always override any locally maintained current values.
161
277
  * This allows the component to be controlled.
@@ -166,15 +282,10 @@ function Combobox(props, ref) {
166
282
  setSelectedValue(propValue);
167
283
  var newSelected = (0, _utils.getOptionFromOptions)(options, propValue) || {};
168
284
  setInternalInputValue((0, _get.default)(newSelected, 'label', ''));
285
+ } else if (_typeof(propValue) === 'object' && propValue !== selectedValues) {
286
+ setSelectedValues(propValue);
169
287
  }
170
- }, [options, propValue, selectedValue, setInternalInputValue, updateSelected]);
171
- /**
172
- * Toggle the dropdown list.
173
- */
174
-
175
- var toggleIsPopoverVisible = (0, _react.useCallback)(function () {
176
- setIsPopoverVisible(!isPopoverVisible);
177
- }, [isPopoverVisible]);
288
+ }, [options, propValue, selectedValue, selectedValues, setInternalInputValue, updateSelected]);
178
289
  /**
179
290
  * This handler is called when the "active" item is changed in the DropdownList. That could be
180
291
  * when the user hovers over a new item with the mouse, or when the user navigates through
@@ -190,8 +301,13 @@ function Combobox(props, ref) {
190
301
  */
191
302
 
192
303
  var handleChangeDropdownListValue = (0, _react.useCallback)(function (selectedIds) {
304
+ if (multiple) {
305
+ updateSelected((0, _last.default)(selectedIds));
306
+ return;
307
+ }
308
+
193
309
  updateSelected(selectedIds[0]);
194
- }, [updateSelected]);
310
+ }, [updateSelected, multiple]);
195
311
  /**
196
312
  * Clicking anywhere within the Combobox component (except the clear button) should open
197
313
  * the dropdown list. There is some complex logic here because of the <input> rendered inside
@@ -211,7 +327,7 @@ function Combobox(props, ref) {
211
327
  * tree. Clicking an item in the list will call this click handler on the container.
212
328
  * Usually that's fine. In this case, we don't want that behavior.
213
329
  */
214
- setIsPopoverVisible(false);
330
+ updateIsPopoverVisible(false);
215
331
  } else if (isFocused) {
216
332
  if (variant === 'sync' && finalComboboxRef && // @ts-ignore
217
333
  finalComboboxRef.current === event.target) {
@@ -227,16 +343,16 @@ function Combobox(props, ref) {
227
343
  * This re-opens the popover if you first open it,
228
344
  * then make a selection, then click the <input> again.
229
345
  */
230
- setIsPopoverVisible(true);
346
+ updateIsPopoverVisible(true);
231
347
  }
232
348
  } else {
233
- toggleIsPopoverVisible();
349
+ updateIsPopoverVisible('toggle');
234
350
  }
235
351
  }
236
352
 
237
353
  onClick && onClick(event);
238
354
  }, // eslint-disable-next-line react-hooks/exhaustive-deps
239
- [isFocused, isPopoverVisible, variant, onClick, toggleIsPopoverVisible]);
355
+ [isFocused, isPopoverVisible, variant, onClick, updateIsPopoverVisible]);
240
356
  /**
241
357
  * This focus handler is responsible for opening the dropdown list and tracking focus state.
242
358
  * It's important to do this in the focus handler because the dropdown should open when the
@@ -245,26 +361,12 @@ function Combobox(props, ref) {
245
361
 
246
362
  var handleContainerFocus = (0, _react.useCallback)(function (event) {
247
363
  if (variant === 'sync') {
248
- setIsPopoverVisible(true);
364
+ updateIsPopoverVisible(true);
249
365
  }
250
366
 
251
367
  setIsFocused(true);
252
368
  onFocus && onFocus(event);
253
- }, [onFocus, setIsPopoverVisible, variant]);
254
- /**
255
- * This generates a flat list of the options (including those in categories)
256
- * in the order they are presented in the dropdown list.
257
- */
258
-
259
- var flatOptions = (0, _react.useMemo)(function () {
260
- return options.reduce(function (acc, curr) {
261
- if ((0, _utils.isCategory)(curr)) {
262
- return acc.concat(curr.items);
263
- }
264
-
265
- return acc.concat(curr);
266
- }, []);
267
- }, [options]);
369
+ }, [onFocus, updateIsPopoverVisible, variant]);
268
370
  /**
269
371
  * Pressing certain keys when focused on the Combobox component should trigger some actions.
270
372
  */
@@ -276,10 +378,10 @@ function Combobox(props, ref) {
276
378
  event.preventDefault();
277
379
 
278
380
  if (!isPopoverVisible) {
279
- setIsPopoverVisible(true);
381
+ updateIsPopoverVisible(true);
280
382
  } else {
281
- var currentIndex = (0, _findIndex.default)(flatOptions, function (_ref) {
282
- var optionId = _ref.id;
383
+ var currentIndex = (0, _findIndex.default)(flatOptions, function (_ref4) {
384
+ var optionId = _ref4.id;
283
385
  return optionId === activeId;
284
386
  });
285
387
 
@@ -300,28 +402,28 @@ function Combobox(props, ref) {
300
402
  }
301
403
 
302
404
  if (event.key === 'Enter' && isPopoverVisible) {
303
- setIsPopoverVisible(false);
304
405
  updateSelected(activeId || '');
406
+ updateIsPopoverVisible(false);
305
407
  }
306
408
 
307
409
  if (event.key === 'Escape') {
308
- setIsPopoverVisible(false);
410
+ updateIsPopoverVisible(false);
309
411
  }
310
412
 
311
413
  if (event.key === 'Tab' && isPopoverVisible) {
312
- setIsPopoverVisible(false);
414
+ updateIsPopoverVisible(false);
313
415
  }
314
416
 
315
417
  if (onKeyDown) {
316
418
  onKeyDown(event);
317
419
  }
318
- }, [activeId, flatOptions, isPopoverVisible, onKeyDown, setActiveId, updateSelected]); // When the dropdown is visible, clicking anywhere outside of the dropdown should close it.
420
+ }, [activeId, flatOptions, isPopoverVisible, onKeyDown, updateIsPopoverVisible, updateSelected]); // When the dropdown is visible, clicking anywhere outside of the dropdown should close it.
319
421
 
320
422
  var handleClickOutsideList = (0, _react.useCallback)(function (event) {
321
423
  if (isPopoverVisible) {
322
- setIsPopoverVisible(false);
424
+ updateIsPopoverVisible(false);
323
425
  }
324
- }, [isPopoverVisible]);
426
+ }, [isPopoverVisible, updateIsPopoverVisible]);
325
427
  (0, _useClickOutside.default)([finalComboboxRef, listRef], handleClickOutsideList);
326
428
  /**
327
429
  * The DropdownList accepts a prop called `PanelComponent` that can be used
@@ -368,7 +470,12 @@ function Combobox(props, ref) {
368
470
 
369
471
  return undefined;
370
472
  }, [internalInputValue, loading, options, translate]);
371
- return _react.default.createElement(_react.default.Fragment, null, _react.default.createElement(_InputField.default, _extends({}, getInputFieldProps(), {
473
+ var selectedValuesIds = selectedValues ? selectedValues.map(function (elem) {
474
+ return elem.id || '';
475
+ }) : undefined;
476
+ return _react.default.createElement(StyledInputDiv, {
477
+ maxWidth: maxWidth
478
+ }, _react.default.createElement(_InputField.default, _extends({}, getInputFieldProps(), {
372
479
  id: inputId,
373
480
  inputContainerRef: finalInputContainerRef,
374
481
  onBlur: function onBlur() {
@@ -378,16 +485,18 @@ function Combobox(props, ref) {
378
485
  onClick: handleContainerClick,
379
486
  onKeyDown: handleContainerKeyDown,
380
487
  ref: finalComboboxRef
381
- }), function (_ref2) {
382
- var ariaLabelledBy = _ref2['aria-labelledby'],
383
- disabled = _ref2.disabled,
384
- targetId = _ref2.id,
385
- onBlurTarget = _ref2.onBlur,
386
- onChangeTargetValue = _ref2.onChange,
387
- onFocusTarget = _ref2.onFocus,
388
- readOnly = _ref2.readOnly,
389
- targetRef = _ref2.ref,
390
- value = _ref2.value;
488
+ }), function (_ref5) {
489
+ var ariaLabelledBy = _ref5['aria-labelledby'],
490
+ disabled = _ref5.disabled,
491
+ targetId = _ref5.id,
492
+ onBlurTarget = _ref5.onBlur,
493
+ onChangeTargetValue = _ref5.onChange,
494
+ onFocusTarget = _ref5.onFocus,
495
+ readOnly = _ref5.readOnly,
496
+ targetRef = _ref5.ref,
497
+ value = _ref5.value,
498
+ autoComplete = _ref5.autoComplete,
499
+ type = _ref5.type;
391
500
  var dropdownListId = "".concat(targetId, "-dropdown-list");
392
501
  return _react.default.createElement(_react.default.Fragment, null, _react.default.createElement(_Target.default, {
393
502
  "aria-haspopup": "listbox",
@@ -400,6 +509,9 @@ function Combobox(props, ref) {
400
509
  inputFieldLabel: label,
401
510
  isPopoverVisible: isPopoverVisible,
402
511
  name: name,
512
+ multiple: multiple,
513
+ selectedValues: selectedValues,
514
+ removeSelected: removeSelected,
403
515
  onBlur: onBlurTarget,
404
516
  onClear: function onClear() {
405
517
  onChangeTargetValue();
@@ -411,7 +523,11 @@ function Combobox(props, ref) {
411
523
  ref: targetRef,
412
524
  value: value,
413
525
  variant: variant,
414
- toggleIsPopoverVisible: toggleIsPopoverVisible
526
+ toggleIsPopoverVisible: function toggleIsPopoverVisible() {
527
+ return updateIsPopoverVisible('toggle');
528
+ },
529
+ autoComplete: autoComplete,
530
+ type: type
415
531
  }), _react.default.createElement(_DropdownList.default, {
416
532
  PanelComponent: getPanelComponent(),
417
533
  activeId: activeId,
@@ -424,10 +540,12 @@ function Combobox(props, ref) {
424
540
  listRef: listRef,
425
541
  minWidth: "".concat((dimensions.width || 0) + 1, "px"),
426
542
  name: "".concat(name, "_dropdown-list"),
543
+ multiple: multiple,
427
544
  onChange: handleChangeDropdownListValue,
428
545
  onChangeActiveItem: handleChangeDropdownListActiveItem,
429
- selectedIds: selectedValue || '',
546
+ selectedIds: !multiple ? selectedValue || '' : selectedValuesIds,
430
547
  showArrow: false,
548
+ showCheckbox: !multiple,
431
549
  target: popoverTargetRef,
432
550
  visible: Boolean(isPopoverVisible || loading),
433
551
  renderOptionLabel: renderOptionLabel,