@dspworkplace/ui 2.1.4 → 2.1.5

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/dist/index.js CHANGED
@@ -4868,7 +4868,7 @@ function _templateObject11() {
4868
4868
  }
4869
4869
 
4870
4870
  function _templateObject10() {
4871
- var data = taggedTemplateLiteral(["\n height: 24px;\n width: 24px;\n box-sizing: border-box;\n margin-right: 5px;\n border-radius: 100%;\n border: 2px solid white;\n background: ", "\n z-index: ", ";\n margin-left: ", "\n margin-top: 8px;\n margin-bottom: 8px;\n display: inline-block;\n"]);
4871
+ var data = taggedTemplateLiteral(["\n height: 16px;\n width: 16px;\n box-sizing: border-box;\n border-radius: 100%;\n border: 2px solid white;\n background: ", ";\n z-index: ", ";\n margin-left: ", "\n margin-right: 8px;\n margin-top: 8px;\n margin-bottom: 8px;\n display: inline-block;\n"]);
4872
4872
 
4873
4873
  _templateObject10 = function _templateObject10() {
4874
4874
  return data;
@@ -5054,6 +5054,12 @@ var isOption = function isOption(item) {
5054
5054
  return item.value !== undefined && item.value !== null;
5055
5055
  };
5056
5056
 
5057
+ var scrollIntoView = function scrollIntoView(element) {
5058
+ return element && element.scrollIntoView({
5059
+ block: 'nearest'
5060
+ });
5061
+ };
5062
+
5057
5063
  var flattenOptions = function flattenOptions(options) {
5058
5064
  var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
5059
5065
  return (options || []).reduce(function (rows, item) {
@@ -5070,6 +5076,23 @@ var optionText = function optionText(node) {
5070
5076
  if (typeof node === 'string' || typeof node === 'number') return node.toString();
5071
5077
  if (Array.isArray(node)) return node.map(optionText).join('');
5072
5078
  return node.props ? optionText(node.props.children) : '';
5079
+ };
5080
+
5081
+ var matchOptions = function matchOptions(items, text) {
5082
+ if (!text) return items;
5083
+ var query = text.toLowerCase();
5084
+ return items.map(function (item) {
5085
+ return {
5086
+ item: item,
5087
+ at: optionText(item.name).toLowerCase().indexOf(query)
5088
+ };
5089
+ }).filter(function (match) {
5090
+ return match.at >= 0;
5091
+ }).sort(function (a, b) {
5092
+ return (a.at > 0) - (b.at > 0);
5093
+ }).map(function (match) {
5094
+ return match.item;
5095
+ });
5073
5096
  }; // rendered in document.body so overflow on any ancestor cannot clip it; popper flips and shifts it to stay in the viewport
5074
5097
  // eslint-disable-next-line react/prop-types
5075
5098
 
@@ -5154,20 +5177,12 @@ var AutocompleteSelect = function AutocompleteSelect(_ref5) {
5154
5177
  }).map(function (row) {
5155
5178
  return row.item;
5156
5179
  });
5157
-
5158
- var filterItems = function filterItems(text) {
5159
- return text ? selectable.filter(function (item) {
5160
- return optionText(item.name).toLowerCase().startsWith(text.toLowerCase());
5161
- }) : selectable;
5162
- };
5163
-
5164
- var items = filterItems(search);
5180
+ var items = matchOptions(selectable, search);
5165
5181
  var hasSelection = selectedOpt.value.length > 0;
5166
5182
  var selectedText = optionText(selectedOpt.desc);
5167
5183
  var selectedItem = selectable.find(function (item) {
5168
5184
  return item.value.toString() === selectedOpt.value;
5169
5185
  });
5170
- var selectedColors = !search && selectedItem && selectedItem.color ? [selectedItem.color] : [];
5171
5186
 
5172
5187
  var _useCombobox = reactAutocomplete.useCombobox({
5173
5188
  items: items,
@@ -5193,10 +5208,14 @@ var AutocompleteSelect = function AutocompleteSelect(_ref5) {
5193
5208
  feature: reactAutocomplete.supercomplete({
5194
5209
  onRequestItem: function onRequestItem(_ref6, res) {
5195
5210
  var value = _ref6.value;
5196
- var matches = filterItems(value);
5197
- if (matches.length > 0) res({
5211
+
5212
+ var _matchOptions = matchOptions(selectable, value),
5213
+ _matchOptions2 = slicedToArray(_matchOptions, 1),
5214
+ first = _matchOptions2[0];
5215
+
5216
+ if (first && optionText(first.name).toLowerCase().startsWith(value.toLowerCase())) res({
5198
5217
  index: 0,
5199
- item: matches[0]
5218
+ item: first
5200
5219
  });
5201
5220
  },
5202
5221
  select: true,
@@ -5214,17 +5233,23 @@ var AutocompleteSelect = function AutocompleteSelect(_ref5) {
5214
5233
  React.useEffect(function () {
5215
5234
  if (startOpen) setOpen(true);
5216
5235
  }, []);
5236
+ var inputProps = getInputProps();
5237
+ var shownText = inputProps.value.toLowerCase();
5238
+ var shownItem = shownText ? [items[focusIndex]].concat(toConsumableArray(selectable)).find(function (item) {
5239
+ return item && optionText(item.name).toLowerCase() === shownText;
5240
+ }) : selectedItem;
5241
+ var swatchColors = shownItem && shownItem.color ? [shownItem.color] : [];
5217
5242
  var index = -1;
5218
5243
  return /*#__PURE__*/React__default.createElement(SelectUi$1, _extends_1({
5219
5244
  ref: setAnchor,
5220
5245
  className: [open && 'open', error && 'error', valid && 'valid'].filter(Boolean).join(' ')
5221
5246
  }, props, {
5222
5247
  title: selectedText
5223
- }), renderSwatches(selectedColors), /*#__PURE__*/React__default.createElement(SearchInput, _extends_1({
5248
+ }), renderSwatches(swatchColors), /*#__PURE__*/React__default.createElement(SearchInput, _extends_1({
5224
5249
  placeholder: hasSelection ? selectedText : placeholder,
5225
5250
  hasSelection: hasSelection,
5226
- hasSwatch: selectedColors.length > 0
5227
- }, getInputProps())), /*#__PURE__*/React__default.createElement(ToggleButton, getToggleProps(), open ? /*#__PURE__*/React__default.createElement(Icons.ArrowUp, {
5251
+ hasSwatch: swatchColors.length > 0
5252
+ }, inputProps)), /*#__PURE__*/React__default.createElement(ToggleButton, getToggleProps(), open ? /*#__PURE__*/React__default.createElement(Icons.ArrowUp, {
5228
5253
  size: "15px",
5229
5254
  color: theme.colors.info.border
5230
5255
  }) : /*#__PURE__*/React__default.createElement(Icons.ArrowDown, {
@@ -5262,7 +5287,8 @@ var AutocompleteSelect = function AutocompleteSelect(_ref5) {
5262
5287
  className: item.divider ? 'alone' : '',
5263
5288
  style: {
5264
5289
  paddingLeft: 8 + depth * 16,
5265
- background: focusIndex === index ? theme.colors.info.bg : undefined
5290
+ // overrides li:hover, so a resting mouse does not keep a second row lit
5291
+ background: focusIndex === index ? theme.colors.info.bg : 'transparent'
5266
5292
  }
5267
5293
  }, getItemProps({
5268
5294
  item: item,
@@ -5308,22 +5334,30 @@ var MultiAutocompleteSelect = function MultiAutocompleteSelect(_ref8) {
5308
5334
  open = _useState10[0],
5309
5335
  setOpen = _useState10[1];
5310
5336
 
5311
- var _useState11 = React.useState(null),
5337
+ var _useState11 = React.useState(-1),
5312
5338
  _useState12 = slicedToArray(_useState11, 2),
5313
- anchor = _useState12[0],
5314
- setAnchor = _useState12[1];
5339
+ focusIndex = _useState12[0],
5340
+ setFocusIndex = _useState12[1];
5341
+
5342
+ var _useState13 = React.useState(null),
5343
+ _useState14 = slicedToArray(_useState13, 2),
5344
+ anchor = _useState14[0],
5345
+ setAnchor = _useState14[1];
5315
5346
 
5316
5347
  var nodeRef = React.useRef();
5317
5348
  var listRef = React.useRef();
5318
5349
  var setNode = React.useCallback(mergeRefs([nodeRef, setAnchor]), []);
5350
+
5351
+ var close = function close() {
5352
+ setOpen(false);
5353
+ setSearch('');
5354
+ setFocusIndex(-1);
5355
+ };
5356
+
5319
5357
  React.useEffect(function () {
5320
5358
  var closeOnOutsideClick = function closeOnOutsideClick(e) {
5321
5359
  var inList = listRef.current && listRef.current.contains(e.target);
5322
-
5323
- if (nodeRef.current && !nodeRef.current.contains(e.target) && !inList) {
5324
- setOpen(false);
5325
- setSearch('');
5326
- }
5360
+ if (nodeRef.current && !nodeRef.current.contains(e.target) && !inList) close();
5327
5361
  };
5328
5362
 
5329
5363
  document.addEventListener('mousedown', closeOnOutsideClick);
@@ -5337,9 +5371,7 @@ var MultiAutocompleteSelect = function MultiAutocompleteSelect(_ref8) {
5337
5371
  }).map(function (row) {
5338
5372
  return row.item;
5339
5373
  });
5340
- var items = search ? selectable.filter(function (item) {
5341
- return optionText(item.name).toLowerCase().startsWith(search.toLowerCase());
5342
- }) : selectable;
5374
+ var items = matchOptions(selectable, search);
5343
5375
  var selectedItems = selectable.filter(function (item) {
5344
5376
  return selectedValues.includes(item.value.toString());
5345
5377
  });
@@ -5351,6 +5383,7 @@ var MultiAutocompleteSelect = function MultiAutocompleteSelect(_ref8) {
5351
5383
  }).map(function (item) {
5352
5384
  return item.color;
5353
5385
  });
5386
+ var index = -1;
5354
5387
  return /*#__PURE__*/React__default.createElement(SelectUi$1, _extends_1({
5355
5388
  ref: setNode,
5356
5389
  className: [open && 'open', error && 'error', valid && 'valid'].filter(Boolean).join(' ')
@@ -5368,11 +5401,29 @@ var MultiAutocompleteSelect = function MultiAutocompleteSelect(_ref8) {
5368
5401
  onChange: function onChange(e) {
5369
5402
  setSearch(e.target.value);
5370
5403
  setOpen(true);
5404
+ setFocusIndex(-1);
5371
5405
  },
5372
5406
  onKeyDown: function onKeyDown(e) {
5373
- if (e.key === 'Escape') {
5374
- setOpen(false);
5375
- setSearch('');
5407
+ switch (e.key) {
5408
+ case 'ArrowDown':
5409
+ case 'ArrowUp':
5410
+ {
5411
+ e.preventDefault();
5412
+ var last = items.length - 1;
5413
+ if (!open) setOpen(true);else if (e.key === 'ArrowDown') setFocusIndex(focusIndex >= last ? 0 : focusIndex + 1);else setFocusIndex(focusIndex <= 0 ? last : focusIndex - 1);
5414
+ break;
5415
+ }
5416
+
5417
+ case 'Enter':
5418
+ if (open && items[focusIndex]) {
5419
+ e.preventDefault();
5420
+ onToggle(items[focusIndex]);
5421
+ }
5422
+
5423
+ break;
5424
+
5425
+ case 'Escape':
5426
+ close();
5376
5427
  }
5377
5428
  }
5378
5429
  }), /*#__PURE__*/React__default.createElement(ToggleButton, {
@@ -5380,7 +5431,9 @@ var MultiAutocompleteSelect = function MultiAutocompleteSelect(_ref8) {
5380
5431
  tabIndex: -1,
5381
5432
  onClick: function onClick(e) {
5382
5433
  e.stopPropagation();
5383
- if (!props.disabled) setOpen(!open);
5434
+ if (props.disabled) return;
5435
+ setOpen(!open);
5436
+ setFocusIndex(-1);
5384
5437
  }
5385
5438
  }, open ? /*#__PURE__*/React__default.createElement(Icons.ArrowUp, {
5386
5439
  size: "15px",
@@ -5415,11 +5468,18 @@ var MultiAutocompleteSelect = function MultiAutocompleteSelect(_ref8) {
5415
5468
  }, item.name);
5416
5469
  }
5417
5470
 
5471
+ var itemIndex = ++index;
5418
5472
  return /*#__PURE__*/React__default.createElement("li", {
5419
5473
  key: key,
5474
+ ref: itemIndex === focusIndex ? scrollIntoView : undefined,
5420
5475
  style: {
5421
5476
  paddingLeft: 8 + depth * 16,
5422
- justifyContent: 'flex-start'
5477
+ justifyContent: 'flex-start',
5478
+ // overrides li:hover, so a resting mouse does not keep a second row lit
5479
+ background: itemIndex === focusIndex ? theme.colors.info.bg : 'transparent'
5480
+ },
5481
+ onPointerMove: function onPointerMove() {
5482
+ return setFocusIndex(itemIndex);
5423
5483
  },
5424
5484
  onMouseDown: function onMouseDown(e) {
5425
5485
  return e.preventDefault();
@@ -5458,10 +5518,10 @@ var MultiDropdown = /*#__PURE__*/React.forwardRef(function (_ref10, ref) {
5458
5518
  resetCallback = _ref10.resetCallback,
5459
5519
  props = objectWithoutProperties(_ref10, ["name", "label", "help", "error", "valid", "options", "placeholder", "onChange", "defaultValue", "visibleOptionsQty", "openTo", "startOpen", "resetCallback"]);
5460
5520
 
5461
- var _useState13 = React.useState([]),
5462
- _useState14 = slicedToArray(_useState13, 2),
5463
- selectedValues = _useState14[0],
5464
- setSelectedValues = _useState14[1];
5521
+ var _useState15 = React.useState([]),
5522
+ _useState16 = slicedToArray(_useState15, 2),
5523
+ selectedValues = _useState16[0],
5524
+ setSelectedValues = _useState16[1];
5465
5525
 
5466
5526
  var valueRef = React.useRef();
5467
5527
  var selectable = flattenOptions(options).filter(function (row) {
@@ -5569,10 +5629,10 @@ var SingleDropdown = /*#__PURE__*/React.forwardRef(function (_ref11, ref) {
5569
5629
  desc: ''
5570
5630
  };
5571
5631
 
5572
- var _useState15 = React.useState(defaultSelected),
5573
- _useState16 = slicedToArray(_useState15, 2),
5574
- selectedOpt = _useState16[0],
5575
- setSelected = _useState16[1];
5632
+ var _useState17 = React.useState(defaultSelected),
5633
+ _useState18 = slicedToArray(_useState17, 2),
5634
+ selectedOpt = _useState18[0],
5635
+ setSelected = _useState18[1];
5576
5636
 
5577
5637
  var valueRef = React.useRef();
5578
5638
 
@@ -5764,15 +5824,15 @@ var CustomDropdown = /*#__PURE__*/React.forwardRef(function (_ref14, ref) {
5764
5824
  openTo = _ref14.openTo,
5765
5825
  props = objectWithoutProperties(_ref14, ["name", "label", "help", "error", "valid", "options", "placeholder", "defaultValue", "multiple", "type", "tooltip", "onChange", "visibleOptionsQty", "openTo"]);
5766
5826
 
5767
- var _useState17 = React.useState(false),
5768
- _useState18 = slicedToArray(_useState17, 2),
5769
- open = _useState18[0],
5770
- setOpen = _useState18[1];
5771
-
5772
- var _useState19 = React.useState([]),
5827
+ var _useState19 = React.useState(false),
5773
5828
  _useState20 = slicedToArray(_useState19, 2),
5774
- selectedOpt = _useState20[0],
5775
- setSelected = _useState20[1];
5829
+ open = _useState20[0],
5830
+ setOpen = _useState20[1];
5831
+
5832
+ var _useState21 = React.useState([]),
5833
+ _useState22 = slicedToArray(_useState21, 2),
5834
+ selectedOpt = _useState22[0],
5835
+ setSelected = _useState22[1];
5776
5836
 
5777
5837
  var nodeSelect = React.useRef();
5778
5838
  var valueRef = React.useRef();