@decisiv/ui-components 2.0.1-alpha.211 → 2.0.1-alpha.213

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.
@@ -4,7 +4,7 @@ import { Props as GroupProps, ItemProps as BaseItemProps } from '../../atoms/Boo
4
4
  export declare type Props = Omit<GroupProps, 'itemRenderer'>;
5
5
  export declare type ItemProps = BaseItemProps;
6
6
  declare const CheckboxGroup: {
7
- (props: Pick<GroupProps, "size" | "onChange" | "vertical" | "disabled" | "readOnly" | "status" | "items" | "warningMessage">): JSX.Element;
7
+ (props: Pick<GroupProps, "size" | "onChange" | "vertical" | "disabled" | "readOnly" | "status" | "warningMessage" | "items">): JSX.Element;
8
8
  propTypes: {
9
9
  disabled: PropTypes.Requireable<boolean>;
10
10
  items: PropTypes.Requireable<(PropTypes.InferProps<{}> | null | undefined)[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Combobox/index.tsx"],"names":[],"mappings":"AASA,OAAc,EAGZ,sBAAsB,EAQvB,MAAM,OAAO,CAAC;AA2Bf,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAQ,MAAM,SAAS,CAAC;AAskBhE,QAAA,MAAM,eAAe,EAAE,sBAAsB,CAC3C,gBAAgB,EAChB,aAAa,CACS,CAAC;AAOzB,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Combobox/index.tsx"],"names":[],"mappings":"AASA,OAAc,EAGZ,sBAAsB,EAQvB,MAAM,OAAO,CAAC;AA2Bf,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAQ,MAAM,SAAS,CAAC;AA4mBhE,QAAA,MAAM,eAAe,EAAE,sBAAsB,CAC3C,gBAAgB,EAChB,aAAa,CACS,CAAC;AAOzB,eAAe,eAAe,CAAC"}
@@ -125,7 +125,8 @@ function Combobox(props, ref) {
125
125
  zIndex = props.zIndex,
126
126
  containerSelector = props.containerSelector,
127
127
  pointerEvents = props.pointerEvents,
128
- externalIsPopoverVisible = props.isPopoverVisible;
128
+ externalIsPopoverVisible = props.isPopoverVisible,
129
+ externalListRef = props.listRef;
129
130
 
130
131
  var _useCombobox = (0, _useCombobox2.default)(props),
131
132
  getInputFieldProps = _useCombobox.getInputFieldProps,
@@ -136,7 +137,8 @@ function Combobox(props, ref) {
136
137
  var fallbackComboboxRef = (0, _react.useRef)(null);
137
138
  var finalComboboxRef = ref || fallbackComboboxRef;
138
139
  var inputId = (0, _useUniqueId.default)(id, 'combobox-');
139
- var listRef = (0, _react.useRef)(null);
140
+ var fallbackListRef = (0, _react.useRef)(null);
141
+ var listRef = externalListRef || fallbackListRef;
140
142
 
141
143
  var _useBreakpointObserve = (0, _breakpointObserver.useBreakpointObserver)(),
142
144
  _useBreakpointObserve2 = _slicedToArray(_useBreakpointObserve, 2),
@@ -241,13 +243,49 @@ function Combobox(props, ref) {
241
243
  */
242
244
 
243
245
 
244
- var updateSelected = (0, _react.useCallback)(function (selectedId) {
246
+ var updateSelected = (0, _react.useCallback)(function (selectedIds) {
247
+ // When using a controlled multiple variation, we want to also have access to the
248
+ // removed id values.
249
+ if (multiple && onChangeValue && Array.isArray(selectedIds) && selectedValues) {
250
+ var isRemoving = selectedIds.length < selectedValues.length;
251
+
252
+ if (isRemoving && selectedValues.length > 0) {
253
+ var removedValue = selectedValues.find(function (_ref2) {
254
+ var optionId = _ref2.id;
255
+ return !selectedIds.includes(optionId);
256
+ });
257
+
258
+ if (removedValue && removedValue.id !== undefined) {
259
+ var filteredValues = selectedValues.filter(function (_ref3) {
260
+ var optionId = _ref3.id;
261
+ return optionId !== removedValue.id;
262
+ });
263
+ setSelectedValues(filteredValues);
264
+ onChangeValue(removedValue.id, {
265
+ removed: true
266
+ });
267
+ return;
268
+ }
269
+ }
270
+ }
271
+
272
+ var getSelectedId = function getSelectedId(ids) {
273
+ var isMultiple = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
274
+
275
+ if (Array.isArray(ids)) {
276
+ return isMultiple ? (0, _last.default)(ids) : ids[0];
277
+ }
278
+
279
+ return ids;
280
+ };
281
+
282
+ var selectedId = getSelectedId(selectedIds, multiple);
245
283
  setSelectedValue(selectedId);
246
284
  var newSelected = (0, _utils.getOptionFromOptions)(options, selectedId) || null;
247
285
 
248
286
  if (multiple) {
249
- var index = selectedValues && selectedValues.findIndex(function (_ref2) {
250
- var itemId = _ref2.id;
287
+ var index = selectedValues && selectedValues.findIndex(function (_ref4) {
288
+ var itemId = _ref4.id;
251
289
  return itemId === selectedId;
252
290
  });
253
291
 
@@ -274,8 +312,8 @@ function Combobox(props, ref) {
274
312
  }
275
313
  }, [multiple, onChangeValue, options, selectedValues, setInternalInputValue, setSelectedValue, setSelectedValues, setActiveId]);
276
314
  var removeSelected = (0, _react.useCallback)(function (selectedId) {
277
- var newSelectedValues = selectedValues && selectedValues.filter(function (_ref3) {
278
- var optionId = _ref3.id;
315
+ var newSelectedValues = selectedValues && selectedValues.filter(function (_ref5) {
316
+ var optionId = _ref5.id;
279
317
  return selectedId !== optionId;
280
318
  });
281
319
  setSelectedValues(newSelectedValues);
@@ -314,16 +352,12 @@ function Combobox(props, ref) {
314
352
  /**
315
353
  * This handler is called by the dropdown's "onChange" event. That handler is called with
316
354
  * an array of values, but we only allow single select in the Combobox.
355
+ * This is being managed in the `updatedSelected` function.
317
356
  */
318
357
 
319
358
  var handleChangeDropdownListValue = (0, _react.useCallback)(function (selectedIds) {
320
- if (multiple) {
321
- updateSelected((0, _last.default)(selectedIds));
322
- return;
323
- }
324
-
325
- updateSelected(selectedIds[0]);
326
- }, [updateSelected, multiple]);
359
+ updateSelected(selectedIds);
360
+ }, [updateSelected]);
327
361
  /**
328
362
  * Clicking anywhere within the Combobox component (except the clear button) should open
329
363
  * the dropdown list. There is some complex logic here because of the <input> rendered inside
@@ -392,8 +426,8 @@ function Combobox(props, ref) {
392
426
  if (!isPopoverVisible) {
393
427
  updateIsPopoverVisible(true);
394
428
  } else {
395
- var currentIndex = (0, _findIndex.default)(flatOptions, function (_ref4) {
396
- var optionId = _ref4.id;
429
+ var currentIndex = (0, _findIndex.default)(flatOptions, function (_ref6) {
430
+ var optionId = _ref6.id;
397
431
  return optionId === activeId;
398
432
  });
399
433
 
@@ -505,18 +539,18 @@ function Combobox(props, ref) {
505
539
  onClick: handleContainerClick,
506
540
  onKeyDown: handleContainerKeyDown,
507
541
  ref: finalComboboxRef
508
- }), function (_ref5) {
509
- var ariaLabelledBy = _ref5['aria-labelledby'],
510
- disabled = _ref5.disabled,
511
- targetId = _ref5.id,
512
- onBlurTarget = _ref5.onBlur,
513
- onChangeTargetValue = _ref5.onChange,
514
- onFocusTarget = _ref5.onFocus,
515
- readOnly = _ref5.readOnly,
516
- targetRef = _ref5.ref,
517
- value = _ref5.value,
518
- autoComplete = _ref5.autoComplete,
519
- type = _ref5.type;
542
+ }), function (_ref7) {
543
+ var ariaLabelledBy = _ref7['aria-labelledby'],
544
+ disabled = _ref7.disabled,
545
+ targetId = _ref7.id,
546
+ onBlurTarget = _ref7.onBlur,
547
+ onChangeTargetValue = _ref7.onChange,
548
+ onFocusTarget = _ref7.onFocus,
549
+ readOnly = _ref7.readOnly,
550
+ targetRef = _ref7.ref,
551
+ value = _ref7.value,
552
+ autoComplete = _ref7.autoComplete,
553
+ type = _ref7.type;
520
554
  var dropdownListId = "".concat(targetId, "-dropdown-list");
521
555
  return _react.default.createElement(_react.default.Fragment, null, _react.default.createElement(_Target.default, {
522
556
  "aria-haspopup": "listbox",
@@ -1031,12 +1031,12 @@ describe('Combobox', function () {
1031
1031
  })));
1032
1032
  describe('when in multiple select mode', function () {
1033
1033
  describe('when a value is selected', function () {
1034
- describe('when the "X" button is clicked to deselect a value', function () {
1035
- it('calls the onChangeValue prop with removed: true', function () {
1034
+ describe('clicking the same value again', function () {
1035
+ it('calls the onChangeValue prop with the expected values', function () {
1036
1036
  var onChangeValue = jest.fn();
1037
1037
 
1038
1038
  var _render33 = render(_react.default.createElement(_.default, {
1039
- label: "test",
1039
+ label: "test label",
1040
1040
  options: defaultOptions,
1041
1041
  inputValue: "",
1042
1042
  value: [defaultOptions[1]],
@@ -1048,6 +1048,32 @@ describe('Combobox', function () {
1048
1048
 
1049
1049
  expect(queryByText(defaultOptions[1].label)).toBeInTheDocument();
1050
1050
 
1051
+ _react2.fireEvent.click(queryByText('test label'));
1052
+
1053
+ _react2.fireEvent.click(queryByLabelText(defaultOptions[1].label));
1054
+
1055
+ expect(onChangeValue).toHaveBeenCalledWith(defaultOptions[1].id, expect.objectContaining({
1056
+ removed: true
1057
+ }));
1058
+ });
1059
+ });
1060
+ describe('when the "X" button is clicked to deselect a value', function () {
1061
+ it('calls the onChangeValue prop with removed: true', function () {
1062
+ var onChangeValue = jest.fn();
1063
+
1064
+ var _render34 = render(_react.default.createElement(_.default, {
1065
+ label: "test",
1066
+ options: defaultOptions,
1067
+ inputValue: "",
1068
+ value: [defaultOptions[1]],
1069
+ onChangeValue: onChangeValue,
1070
+ multiple: true
1071
+ })),
1072
+ queryByText = _render34.queryByText,
1073
+ queryByLabelText = _render34.queryByLabelText;
1074
+
1075
+ expect(queryByText(defaultOptions[1].label)).toBeInTheDocument();
1076
+
1051
1077
  _react2.fireEvent.click(queryByLabelText('Delete'));
1052
1078
 
1053
1079
  expect(onChangeValue).toHaveBeenCalledWith(defaultOptions[1].id, expect.objectContaining({
@@ -1060,18 +1086,18 @@ describe('Combobox', function () {
1060
1086
  });
1061
1087
  describe('when the isPopoverVisible is true', function () {
1062
1088
  it('opens the popover', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
1063
- var _render34, baseElement;
1089
+ var _render35, baseElement;
1064
1090
 
1065
1091
  return regeneratorRuntime.wrap(function _callee2$(_context2) {
1066
1092
  while (1) {
1067
1093
  switch (_context2.prev = _context2.next) {
1068
1094
  case 0:
1069
- _render34 = render(_react.default.createElement(_.default, {
1095
+ _render35 = render(_react.default.createElement(_.default, {
1070
1096
  label: "test",
1071
1097
  options: defaultOptions,
1072
1098
  hideLabel: true,
1073
1099
  isPopoverVisible: true
1074
- })), baseElement = _render34.baseElement;
1100
+ })), baseElement = _render35.baseElement;
1075
1101
  defaultOptions.forEach(function (_ref6) {
1076
1102
  var label = _ref6.label;
1077
1103
  expect((0, _react2.queryByText)(baseElement, label)).toBeInTheDocument();
@@ -1085,18 +1111,18 @@ describe('Combobox', function () {
1085
1111
  }, _callee2);
1086
1112
  })));
1087
1113
  it('does not automatically close the popover', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
1088
- var _render35, baseElement, queryByLabelText;
1114
+ var _render36, baseElement, queryByLabelText;
1089
1115
 
1090
1116
  return regeneratorRuntime.wrap(function _callee3$(_context3) {
1091
1117
  while (1) {
1092
1118
  switch (_context3.prev = _context3.next) {
1093
1119
  case 0:
1094
- _render35 = render(_react.default.createElement(_.default, {
1120
+ _render36 = render(_react.default.createElement(_.default, {
1095
1121
  label: "test",
1096
1122
  options: defaultOptions,
1097
1123
  hideLabel: true,
1098
1124
  isPopoverVisible: true
1099
- })), baseElement = _render35.baseElement, queryByLabelText = _render35.queryByLabelText;
1125
+ })), baseElement = _render36.baseElement, queryByLabelText = _render36.queryByLabelText;
1100
1126
 
1101
1127
  _react2.fireEvent.click(queryByLabelText(defaultOptions[0].label));
1102
1128
 
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/components/Combobox/schema.ts"],"names":[],"mappings":"AAOA,QAAA,MAAM,MAAM,KAAwC,CAAC;AAkGrD,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/components/Combobox/schema.ts"],"names":[],"mappings":"AAOA,QAAA,MAAM,MAAM,KAAwC,CAAC;AAsGrD,eAAe,MAAM,CAAC"}
@@ -49,6 +49,9 @@ schema.propTypes = _objectSpread({}, (0, _omit.default)(_InputField.schema.makeP
49
49
  label: _reactDesc.PropTypes.string,
50
50
  value: _reactDesc.PropTypes.string
51
51
  }))]).description('The ID of the option that is selected. If provided, controlling the Select must be handled externally. Overrides `defaultValue`.'),
52
+ listRef: _reactDesc.PropTypes.oneOfType([_reactDesc.PropTypes.func, _reactDesc.PropTypes.shape({
53
+ current: _reactDesc.PropTypes.any
54
+ })]).description('A ref for the list container.'),
52
55
  multiple: _reactDesc.PropTypes.bool.description('Used when multiple selections can be made in the Combobox').defaultValue(false),
53
56
  variant: _reactDesc.PropTypes.oneOf(['async', 'sync']).description('Enables different logic for rendering the dropdown list.').defaultValue('sync'),
54
57
  renderOptionLabel: _reactDesc.PropTypes.func.description('Function to customize render of option labels, called with the item value'),
@@ -1,4 +1,4 @@
1
- import { InputHTMLAttributes, Ref } from 'react';
1
+ import { InputHTMLAttributes, Ref, RefObject } from 'react';
2
2
  import { BaseInputFieldProps } from '../../atoms/InputField';
3
3
  import { ActionHandler } from '../Tag/types';
4
4
  import { PopoverProps } from '../Popover/types';
@@ -16,6 +16,7 @@ export interface ComboboxProps extends Omit<React.InputHTMLAttributes<ComboboxIn
16
16
  isPopoverVisible?: boolean;
17
17
  multiple?: boolean;
18
18
  maxWidth?: string;
19
+ listRef?: RefObject<HTMLUListElement>;
19
20
  loading?: boolean;
20
21
  onBlur?: React.FocusEventHandler;
21
22
  onChangeInputValue?: (event?: React.ChangeEvent) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/Combobox/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/Combobox/types.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,14 @@
1
1
  /// <reference types="react" />
2
2
  import { BaseInputFieldProps } from '../../atoms/InputField';
3
+ import { DropdownListItem } from '../DropdownList/types';
3
4
  export interface TagInputProps extends Omit<BaseInputFieldProps, 'onChange' | 'children' | 'value' | 'hideLabel'> {
4
5
  hiddenLabel?: boolean;
5
6
  defaultTags?: string[];
6
7
  tags?: string[];
8
+ options: DropdownListItem[];
7
9
  onChange?: (value: string[]) => void;
10
+ onSelect?: (item: string[]) => void;
11
+ zIndex?: number;
8
12
  }
9
- export default function TagInput({ defaultTags, tags, onChange, disabled, readOnly, label, hiddenLabel, ...props }: TagInputProps): JSX.Element;
13
+ export default function TagInput({ defaultTags, tags, onChange, disabled, readOnly, label, hiddenLabel, options, onSelect, zIndex, ...props }: TagInputProps): JSX.Element;
10
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/TagInput/index.tsx"],"names":[],"mappings":";AAeA,OAAmB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAMzE,MAAM,WAAW,aACf,SAAQ,IAAI,CACV,mBAAmB,EACnB,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,WAAW,CAChD;IACD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAC/B,WAAgB,EAChB,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,WAAW,EACX,GAAG,KAAK,EACT,EAAE,aAAa,eAqMf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/TagInput/index.tsx"],"names":[],"mappings":";AAoBA,OAAmB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAIzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAKzD,MAAM,WAAW,aACf,SAAQ,IAAI,CACV,mBAAmB,EACnB,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,WAAW,CAChD;IACD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAC/B,WAAgB,EAChB,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,WAAW,EACX,OAAO,EACP,QAAQ,EACR,MAAM,EACN,GAAG,KAAK,EACT,EAAE,aAAa,eA2Sf"}
@@ -9,18 +9,26 @@ var _react = _interopRequireWildcard(require("react"));
9
9
 
10
10
  var _rem = _interopRequireDefault(require("polished/lib/helpers/rem"));
11
11
 
12
+ var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
13
+
14
+ var _breakpointObserver = require("@decisiv/breakpoint-observer");
15
+
12
16
  var _spacing = _interopRequireDefault(require("@decisiv/design-tokens/lib/spacing"));
13
17
 
14
18
  var _Times = _interopRequireDefault(require("@decisiv/iconix/lib/components/Times"));
15
19
 
16
20
  var _useTranslations = _interopRequireDefault(require("../../utils/useTranslations"));
17
21
 
22
+ var _useClickOutside = _interopRequireDefault(require("../../utils/useClickOutside"));
23
+
18
24
  var _InputField = _interopRequireDefault(require("../../atoms/InputField"));
19
25
 
20
26
  var _Tag = _interopRequireDefault(require("../Tag"));
21
27
 
22
28
  var _Button = _interopRequireDefault(require("../Button"));
23
29
 
30
+ var _DropdownList = _interopRequireDefault(require("../DropdownList"));
31
+
24
32
  var _styles = require("./styles");
25
33
 
26
34
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -58,9 +66,13 @@ function TagInput(_ref) {
58
66
  readOnly = _ref.readOnly,
59
67
  label = _ref.label,
60
68
  hiddenLabel = _ref.hiddenLabel,
61
- props = _objectWithoutProperties(_ref, ["defaultTags", "tags", "onChange", "disabled", "readOnly", "label", "hiddenLabel"]);
69
+ options = _ref.options,
70
+ onSelect = _ref.onSelect,
71
+ zIndex = _ref.zIndex,
72
+ props = _objectWithoutProperties(_ref, ["defaultTags", "tags", "onChange", "disabled", "readOnly", "label", "hiddenLabel", "options", "onSelect", "zIndex"]);
62
73
 
63
74
  var clearButtonRef = (0, _react.useRef)(null);
75
+ var listRef = (0, _react.useRef)(null);
64
76
  var inputRef = (0, _react.useRef)(null);
65
77
 
66
78
  var _useState = (0, _react.useState)(false),
@@ -73,6 +85,16 @@ function TagInput(_ref) {
73
85
  innerTags = _useState4[0],
74
86
  setInnerTags = _useState4[1];
75
87
 
88
+ var _useBreakpointObserve = (0, _breakpointObserver.useBreakpointObserver)(),
89
+ _useBreakpointObserve2 = _slicedToArray(_useBreakpointObserve, 2),
90
+ inputContainerRef = _useBreakpointObserve2[0],
91
+ dimensions = _useBreakpointObserve2[1].dimensions;
92
+
93
+ var _useState5 = (0, _react.useState)(false),
94
+ _useState6 = _slicedToArray(_useState5, 2),
95
+ isPopoverVisible = _useState6[0],
96
+ setIsPopoverVisible = _useState6[1];
97
+
76
98
  var translate = (0, _useTranslations.default)();
77
99
  var isControlled = (0, _react.useMemo)(function () {
78
100
  return !!tags;
@@ -85,6 +107,9 @@ function TagInput(_ref) {
85
107
  if (!onChange) return;
86
108
  onChange(value);
87
109
  }, [onChange]);
110
+ var hasOptions = (0, _react.useMemo)(function () {
111
+ return !(0, _isEmpty.default)(options);
112
+ }, [options]);
88
113
  var handleAddTag = (0, _react.useCallback)(function (rawString) {
89
114
  var text = rawString.replace(/\s+/g, ' ').trim();
90
115
  if (!text || tagsToRender.includes(text)) return;
@@ -114,21 +139,26 @@ function TagInput(_ref) {
114
139
  });
115
140
  }, [isControlled, handleNotifyChange, tags]);
116
141
  var handleRemoveTag = (0, _react.useCallback)(function (text) {
117
- if (isControlled) {
118
- handleNotifyChange(tags.filter(function (tag) {
119
- return tag !== text;
120
- }));
121
- return;
122
- }
123
-
124
- setInnerTags(function (oldState) {
125
- var newState = oldState.filter(function (tag) {
126
- return tag !== text;
142
+ return function (e) {
143
+ if (hasOptions) e.stopPropagation();
144
+
145
+ if (isControlled) {
146
+ handleNotifyChange(_toConsumableArray(tags).filter(function (tag) {
147
+ return tag !== text;
148
+ }));
149
+ return;
150
+ }
151
+
152
+ setInnerTags(function (oldState) {
153
+ var newState = _toConsumableArray(oldState).filter(function (tag) {
154
+ return tag !== text;
155
+ });
156
+
157
+ handleNotifyChange(newState);
158
+ return newState;
127
159
  });
128
- handleNotifyChange(newState);
129
- return newState;
130
- });
131
- }, [isControlled, handleNotifyChange, tags]);
160
+ };
161
+ }, [isControlled, handleNotifyChange, tags, hasOptions]);
132
162
  var handleOnKeyUp = (0, _react.useCallback)(function (e) {
133
163
  e.stopPropagation();
134
164
  var text = e.target.value;
@@ -157,19 +187,94 @@ function TagInput(_ref) {
157
187
  e.target.value = '';
158
188
  setInputVisible(false);
159
189
  }, [handleAddTag]);
160
- var handleOnClearButtonClick = (0, _react.useCallback)(function () {
190
+ var handleOnClearButtonClick = (0, _react.useCallback)(function (e) {
191
+ if (hasOptions) e.stopPropagation();
192
+
161
193
  if (inputRef.current) {
162
194
  inputRef.current.value = '';
163
195
  }
164
- }, []);
165
- return _react.default.createElement(_styles.Wrapper, null, _react.default.createElement(_InputField.default, _extends({
196
+ }, [hasOptions]);
197
+ var handleOnSelect = (0, _react.useCallback)(function (selection) {
198
+ var allSelection = Array.isArray(selection) ? selection : [selection];
199
+
200
+ if (onSelect) {
201
+ onSelect(allSelection);
202
+ }
203
+
204
+ if (isControlled) {
205
+ handleNotifyChange([].concat(_toConsumableArray(tags), _toConsumableArray(allSelection)));
206
+ setIsPopoverVisible(false);
207
+ return;
208
+ }
209
+
210
+ setInnerTags(function (oldState) {
211
+ var newState = [].concat(_toConsumableArray(oldState), _toConsumableArray(allSelection));
212
+ handleNotifyChange(newState);
213
+ return newState;
214
+ });
215
+ setIsPopoverVisible(false);
216
+ }, [handleNotifyChange, tags, isControlled, options]);
217
+ /**
218
+ * Toggle the dropdown list.
219
+ */
220
+
221
+ var toggleIsPopoverVisible = (0, _react.useCallback)(function () {
222
+ setIsPopoverVisible(!isPopoverVisible);
223
+ }, [isPopoverVisible]);
224
+ /**
225
+ * Clicking anywhere within the InputField component (except the clear button) should toggle
226
+ * the dropdown list.
227
+ */
228
+
229
+ var handleContainerClick = (0, _react.useCallback)(function () {
230
+ toggleIsPopoverVisible();
231
+ }, [toggleIsPopoverVisible]); // When the dropdown is visible, clicking anywhere outside of the dropdown should close it.
232
+
233
+ var handleClickOutsideList = (0, _react.useCallback)(function () {
234
+ if (isPopoverVisible) {
235
+ setIsPopoverVisible(false);
236
+ }
237
+ }, [isPopoverVisible]);
238
+ (0, _react.useEffect)(function () {
239
+ if (isPopoverVisible) {
240
+ // Delay to ensure DOM updates are complete
241
+ var timer = setTimeout(function () {
242
+ if (inputRef.current) {
243
+ inputRef.current.focus();
244
+ }
245
+ }, 0);
246
+ return function () {
247
+ return clearTimeout(timer);
248
+ }; // Cleanup the timer on unmount or state change
249
+ }
250
+
251
+ return function () {};
252
+ }, [isPopoverVisible, inputRef]);
253
+ (0, _useClickOutside.default)([listRef], handleClickOutsideList, {
254
+ capture: true
255
+ });
256
+ return _react.default.createElement(_styles.Wrapper, null, hasOptions && _react.default.createElement(_DropdownList.default, {
257
+ name: "".concat(label, "-dropdown-list"),
258
+ items: options,
259
+ borderRadius: "0",
260
+ minWidth: "".concat((dimensions.width || 0) + 1, "px"),
261
+ maxWidth: "unset",
262
+ showArrow: false,
263
+ target: inputContainerRef,
264
+ onChange: handleOnSelect,
265
+ listRef: listRef,
266
+ visible: isPopoverVisible,
267
+ zIndex: zIndex
268
+ }), _react.default.createElement(_InputField.default, _extends({
166
269
  ref: inputRef,
167
270
  onFocus: handleFocus,
168
271
  onBlur: handleBlur,
169
272
  disabled: disabled,
170
273
  readOnly: readOnly,
171
274
  label: label,
172
- hideLabel: hiddenLabel
275
+ hideLabel: hiddenLabel,
276
+ inputContainerRef: inputContainerRef,
277
+ onClick: handleContainerClick
173
278
  }, props), function (innerProps) {
174
279
  return _react.default.createElement(_styles.Container, null, tagsToRender.map(function (tag) {
175
280
  return _react.default.createElement(_Tag.default, {
@@ -178,9 +283,7 @@ function TagInput(_ref) {
178
283
  text: tag,
179
284
  palette: "pastel",
180
285
  color: isDisabled ? 'licoriceMousse' : 'information',
181
- action: isDisabled ? undefined : function () {
182
- return handleRemoveTag(tag);
183
- },
286
+ action: isDisabled ? undefined : handleRemoveTag(tag),
184
287
  actionIntent: "danger",
185
288
  actionAttributes: {
186
289
  'aria-label': translate(undefined, 'tagInput.tagAriaLabel', {
@@ -4,15 +4,53 @@ var _react = _interopRequireDefault(require("react"));
4
4
 
5
5
  var _react2 = require("@testing-library/react");
6
6
 
7
+ var _ConfigProvider = require("../../providers/ConfigProvider");
8
+
7
9
  var _ = _interopRequireDefault(require("."));
8
10
 
9
11
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
12
 
13
+ 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); }
14
+
11
15
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
12
16
 
13
17
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
14
18
 
15
- var onChange = jest.fn();
19
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { keys.push.apply(keys, Object.getOwnPropertySymbols(object)); } if (enumerableOnly) keys = keys.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); return keys; }
20
+
21
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
22
+
23
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
24
+
25
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
26
+
27
+ var onChange = jest.fn(); // Prevent warnings about missing document methods (createRange, etc.)
28
+
29
+ jest.mock('popper.js', function () {
30
+ var _class, _temp;
31
+
32
+ var PopperJS = jest.requireActual('popper.js');
33
+ return _temp = _class = function _class() {
34
+ _classCallCheck(this, _class);
35
+
36
+ return {
37
+ destroy: function destroy() {},
38
+ scheduleUpdate: function scheduleUpdate() {}
39
+ };
40
+ }, _defineProperty(_class, "placements", PopperJS.placements), _temp;
41
+ });
42
+
43
+ var wrapper = function wrapper(_ref) {
44
+ var children = _ref.children;
45
+ return _react.default.createElement(_ConfigProvider.ConfigProvider, null, children);
46
+ };
47
+
48
+ var render = function render(ui, options) {
49
+ return (0, _react2.render)(ui, _objectSpread({}, options, {
50
+ wrapper: wrapper
51
+ }));
52
+ };
53
+
16
54
  afterEach(function () {
17
55
  onChange.mockClear();
18
56
  });
@@ -24,7 +62,7 @@ describe('TagInput', function () {
24
62
  while (1) {
25
63
  switch (_context.prev = _context.next) {
26
64
  case 0:
27
- _render = (0, _react2.render)(_react.default.createElement(_.default, {
65
+ _render = render(_react.default.createElement(_.default, {
28
66
  tags: [],
29
67
  hideLabel: false,
30
68
  label: "My Tag Input",
@@ -46,7 +84,7 @@ describe('TagInput', function () {
46
84
  while (1) {
47
85
  switch (_context2.prev = _context2.next) {
48
86
  case 0:
49
- _render2 = (0, _react2.render)(_react.default.createElement(_.default, {
87
+ _render2 = render(_react.default.createElement(_.default, {
50
88
  tags: [],
51
89
  hideLabel: false,
52
90
  label: "My Tag Input",
@@ -69,7 +107,7 @@ describe('TagInput', function () {
69
107
  while (1) {
70
108
  switch (_context3.prev = _context3.next) {
71
109
  case 0:
72
- _render3 = (0, _react2.render)(_react.default.createElement(_.default, {
110
+ _render3 = render(_react.default.createElement(_.default, {
73
111
  tags: [],
74
112
  hideLabel: false,
75
113
  label: "My Tag Input",
@@ -93,7 +131,7 @@ describe('TagInput', function () {
93
131
  while (1) {
94
132
  switch (_context4.prev = _context4.next) {
95
133
  case 0:
96
- _render4 = (0, _react2.render)(_react.default.createElement(_.default, {
134
+ _render4 = render(_react.default.createElement(_.default, {
97
135
  defaultTags: ['Foo tag'],
98
136
  label: "My Tag Input"
99
137
  })), getByText = _render4.getByText;
@@ -113,7 +151,7 @@ describe('TagInput', function () {
113
151
  while (1) {
114
152
  switch (_context5.prev = _context5.next) {
115
153
  case 0:
116
- _render5 = (0, _react2.render)(_react.default.createElement(_.default, {
154
+ _render5 = render(_react.default.createElement(_.default, {
117
155
  defaultTags: ['My tag'],
118
156
  label: "My Tag Input"
119
157
  })), getByLabelText = _render5.getByLabelText;
@@ -137,7 +175,7 @@ describe('TagInput', function () {
137
175
  while (1) {
138
176
  switch (_context6.prev = _context6.next) {
139
177
  case 0:
140
- _render6 = (0, _react2.render)(_react.default.createElement(_.default, {
178
+ _render6 = render(_react.default.createElement(_.default, {
141
179
  defaultTags: ['Foo tag'],
142
180
  label: "My Tag Input",
143
181
  "aria-label": "My Tag Input"
@@ -169,7 +207,7 @@ describe('TagInput', function () {
169
207
  while (1) {
170
208
  switch (_context7.prev = _context7.next) {
171
209
  case 0:
172
- _render7 = (0, _react2.render)(_react.default.createElement(_.default, {
210
+ _render7 = render(_react.default.createElement(_.default, {
173
211
  defaultTags: ['Foo tag'],
174
212
  label: "My Tag Input",
175
213
  "aria-label": "My Tag Input",
@@ -204,7 +242,7 @@ describe('TagInput', function () {
204
242
  while (1) {
205
243
  switch (_context8.prev = _context8.next) {
206
244
  case 0:
207
- _render8 = (0, _react2.render)(_react.default.createElement(_.default, {
245
+ _render8 = render(_react.default.createElement(_.default, {
208
246
  defaultTags: ['Foo tag'],
209
247
  label: "My Tag Input",
210
248
  "aria-label": "My Tag Input",
@@ -237,7 +275,7 @@ describe('TagInput', function () {
237
275
  while (1) {
238
276
  switch (_context9.prev = _context9.next) {
239
277
  case 0:
240
- _render9 = (0, _react2.render)(_react.default.createElement(_.default, {
278
+ _render9 = render(_react.default.createElement(_.default, {
241
279
  defaultTags: ['Foo tag'],
242
280
  label: "My Tag Input",
243
281
  "aria-label": "My Tag Input",
@@ -273,7 +311,7 @@ describe('TagInput', function () {
273
311
  while (1) {
274
312
  switch (_context10.prev = _context10.next) {
275
313
  case 0:
276
- _render10 = (0, _react2.render)(_react.default.createElement(_.default, {
314
+ _render10 = render(_react.default.createElement(_.default, {
277
315
  defaultTags: ['Foo tag'],
278
316
  label: "My Tag Input",
279
317
  "aria-label": "My Tag Input"
@@ -305,7 +343,7 @@ describe('TagInput', function () {
305
343
  while (1) {
306
344
  switch (_context11.prev = _context11.next) {
307
345
  case 0:
308
- _render11 = (0, _react2.render)(_react.default.createElement(_.default, {
346
+ _render11 = render(_react.default.createElement(_.default, {
309
347
  defaultTags: ['Foo tag'],
310
348
  label: "My Tag Input",
311
349
  "aria-label": "My Tag Input",
@@ -343,7 +381,7 @@ describe('TagInput', function () {
343
381
  while (1) {
344
382
  switch (_context12.prev = _context12.next) {
345
383
  case 0:
346
- _render12 = (0, _react2.render)(_react.default.createElement(_.default, {
384
+ _render12 = render(_react.default.createElement(_.default, {
347
385
  defaultTags: ['Foo tag'],
348
386
  label: "My Tag Input",
349
387
  "aria-label": "My Tag Input",
@@ -374,7 +412,7 @@ describe('TagInput', function () {
374
412
  while (1) {
375
413
  switch (_context13.prev = _context13.next) {
376
414
  case 0:
377
- _render13 = (0, _react2.render)(_react.default.createElement(_.default, {
415
+ _render13 = render(_react.default.createElement(_.default, {
378
416
  defaultTags: ['Foo tag'],
379
417
  label: "My Tag Input",
380
418
  "aria-label": "My Tag Input",
@@ -407,7 +445,7 @@ describe('TagInput', function () {
407
445
  while (1) {
408
446
  switch (_context14.prev = _context14.next) {
409
447
  case 0:
410
- _render14 = (0, _react2.render)(_react.default.createElement(_.default, {
448
+ _render14 = render(_react.default.createElement(_.default, {
411
449
  defaultTags: ['Foo tag'],
412
450
  label: "My Tag Input",
413
451
  "aria-label": "My Tag Input",
@@ -438,7 +476,7 @@ describe('TagInput', function () {
438
476
  while (1) {
439
477
  switch (_context15.prev = _context15.next) {
440
478
  case 0:
441
- _render15 = (0, _react2.render)(_react.default.createElement(_.default, {
479
+ _render15 = render(_react.default.createElement(_.default, {
442
480
  defaultTags: ['Foo tag'],
443
481
  label: "My Tag Input",
444
482
  "aria-label": "My Tag Input",
@@ -472,7 +510,7 @@ describe('TagInput', function () {
472
510
  while (1) {
473
511
  switch (_context16.prev = _context16.next) {
474
512
  case 0:
475
- _render16 = (0, _react2.render)(_react.default.createElement(_.default, {
513
+ _render16 = render(_react.default.createElement(_.default, {
476
514
  defaultTags: ['Foo tag'],
477
515
  label: "My Tag Input",
478
516
  "aria-label": "My Tag Input"
@@ -502,7 +540,7 @@ describe('TagInput', function () {
502
540
  while (1) {
503
541
  switch (_context17.prev = _context17.next) {
504
542
  case 0:
505
- _render17 = (0, _react2.render)(_react.default.createElement(_.default, {
543
+ _render17 = render(_react.default.createElement(_.default, {
506
544
  defaultTags: ['Foo tag'],
507
545
  label: "My Tag Input",
508
546
  "aria-label": "My Tag Input",
@@ -537,7 +575,7 @@ describe('TagInput', function () {
537
575
  while (1) {
538
576
  switch (_context18.prev = _context18.next) {
539
577
  case 0:
540
- _render18 = (0, _react2.render)(_react.default.createElement(_.default, {
578
+ _render18 = render(_react.default.createElement(_.default, {
541
579
  defaultTags: ['Foo tag'],
542
580
  label: "My Tag Input",
543
581
  "aria-label": "My Tag Input",
@@ -572,7 +610,7 @@ describe('TagInput', function () {
572
610
  while (1) {
573
611
  switch (_context19.prev = _context19.next) {
574
612
  case 0:
575
- _render19 = (0, _react2.render)(_react.default.createElement(_.default, {
613
+ _render19 = render(_react.default.createElement(_.default, {
576
614
  defaultTags: ['Foo tag'],
577
615
  label: "My Tag Input",
578
616
  "aria-label": "My Tag Input",
@@ -599,7 +637,7 @@ describe('TagInput', function () {
599
637
  while (1) {
600
638
  switch (_context20.prev = _context20.next) {
601
639
  case 0:
602
- _render20 = (0, _react2.render)(_react.default.createElement(_.default, {
640
+ _render20 = render(_react.default.createElement(_.default, {
603
641
  defaultTags: ['Foo tag'],
604
642
  label: "My Tag Input",
605
643
  "aria-label": "My Tag Input",
@@ -630,7 +668,7 @@ describe('TagInput', function () {
630
668
  while (1) {
631
669
  switch (_context21.prev = _context21.next) {
632
670
  case 0:
633
- _render21 = (0, _react2.render)(_react.default.createElement(_.default, {
671
+ _render21 = render(_react.default.createElement(_.default, {
634
672
  defaultTags: ['Foo tag'],
635
673
  label: "My Tag Input",
636
674
  "aria-label": "My Tag Input",
@@ -649,18 +687,18 @@ describe('TagInput', function () {
649
687
  }, _callee21);
650
688
  })));
651
689
  it('call onChange callback', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee22() {
652
- var _render22, getByLabelText, queryByLabelText;
690
+ var _render22, getByLabelText;
653
691
 
654
692
  return regeneratorRuntime.wrap(function _callee22$(_context22) {
655
693
  while (1) {
656
694
  switch (_context22.prev = _context22.next) {
657
695
  case 0:
658
- _render22 = (0, _react2.render)(_react.default.createElement(_.default, {
696
+ _render22 = render(_react.default.createElement(_.default, {
659
697
  defaultTags: ['Foo tag'],
660
698
  label: "My Tag Input",
661
699
  "aria-label": "My Tag Input",
662
700
  onChange: onChange
663
- })), getByLabelText = _render22.getByLabelText, queryByLabelText = _render22.queryByLabelText;
701
+ })), getByLabelText = _render22.getByLabelText;
664
702
 
665
703
  _react2.fireEvent.click(getByLabelText('Remove Foo tag'));
666
704
 
@@ -687,7 +725,7 @@ describe('TagInput', function () {
687
725
  while (1) {
688
726
  switch (_context23.prev = _context23.next) {
689
727
  case 0:
690
- _render23 = (0, _react2.render)(_react.default.createElement(_.default, {
728
+ _render23 = render(_react.default.createElement(_.default, {
691
729
  tags: ['Foo tag'],
692
730
  label: "My Tag Input",
693
731
  "aria-label": "My Tag Input",
@@ -722,7 +760,7 @@ describe('TagInput', function () {
722
760
  while (1) {
723
761
  switch (_context24.prev = _context24.next) {
724
762
  case 0:
725
- _render24 = (0, _react2.render)(_react.default.createElement(_.default, {
763
+ _render24 = render(_react.default.createElement(_.default, {
726
764
  tags: ['Foo tag'],
727
765
  label: "My Tag Input",
728
766
  "aria-label": "My Tag Input",
@@ -758,7 +796,7 @@ describe('TagInput', function () {
758
796
  while (1) {
759
797
  switch (_context25.prev = _context25.next) {
760
798
  case 0:
761
- _render25 = (0, _react2.render)(_react.default.createElement(_.default, {
799
+ _render25 = render(_react.default.createElement(_.default, {
762
800
  tags: ['Foo tag'],
763
801
  label: "My Tag Input",
764
802
  "aria-label": "My Tag Input",
@@ -796,7 +834,7 @@ describe('TagInput', function () {
796
834
  while (1) {
797
835
  switch (_context26.prev = _context26.next) {
798
836
  case 0:
799
- _render26 = (0, _react2.render)(_react.default.createElement(_.default, {
837
+ _render26 = render(_react.default.createElement(_.default, {
800
838
  tags: ['Foo tag'],
801
839
  label: "My Tag Input",
802
840
  "aria-label": "My Tag Input",
@@ -829,7 +867,7 @@ describe('TagInput', function () {
829
867
  while (1) {
830
868
  switch (_context27.prev = _context27.next) {
831
869
  case 0:
832
- _render27 = (0, _react2.render)(_react.default.createElement(_.default, {
870
+ _render27 = render(_react.default.createElement(_.default, {
833
871
  tags: ['Foo tag'],
834
872
  label: "My Tag Input",
835
873
  "aria-label": "My Tag Input",
@@ -863,7 +901,7 @@ describe('TagInput', function () {
863
901
  while (1) {
864
902
  switch (_context28.prev = _context28.next) {
865
903
  case 0:
866
- _render28 = (0, _react2.render)(_react.default.createElement(_.default, {
904
+ _render28 = render(_react.default.createElement(_.default, {
867
905
  tags: ['Foo tag'],
868
906
  label: "My Tag Input",
869
907
  "aria-label": "My Tag Input",
@@ -898,7 +936,7 @@ describe('TagInput', function () {
898
936
  while (1) {
899
937
  switch (_context29.prev = _context29.next) {
900
938
  case 0:
901
- _render29 = (0, _react2.render)(_react.default.createElement(_.default, {
939
+ _render29 = render(_react.default.createElement(_.default, {
902
940
  defaultTags: ['Foo tag'],
903
941
  label: "My Tag Input",
904
942
  "aria-label": "My Tag Input",
@@ -948,7 +986,7 @@ describe('TagInput', function () {
948
986
  while (1) {
949
987
  switch (_context31.prev = _context31.next) {
950
988
  case 0:
951
- _render30 = (0, _react2.render)(_react.default.createElement(_.default, {
989
+ _render30 = render(_react.default.createElement(_.default, {
952
990
  tags: ['Foo tag'],
953
991
  label: "My Tag Input",
954
992
  "aria-label": "My Tag Input",
@@ -978,7 +1016,7 @@ describe('TagInput', function () {
978
1016
  while (1) {
979
1017
  switch (_context32.prev = _context32.next) {
980
1018
  case 0:
981
- _render31 = (0, _react2.render)(_react.default.createElement(_.default, {
1019
+ _render31 = render(_react.default.createElement(_.default, {
982
1020
  tags: ['Foo tag'],
983
1021
  label: "My Tag Input",
984
1022
  "aria-label": "My Tag Input",
@@ -998,4 +1036,42 @@ describe('TagInput', function () {
998
1036
  }, _callee32);
999
1037
  })));
1000
1038
  });
1039
+ describe('dropdown', function () {
1040
+ var defaultProps = {
1041
+ label: 'My Tag Input',
1042
+ options: [{
1043
+ label: 'Option1',
1044
+ value: 'Option1',
1045
+ id: 'Option1'
1046
+ }],
1047
+ onChange: jest.fn(),
1048
+ onSelect: jest.fn()
1049
+ };
1050
+ it('toggles the dropdown visibility when the container is clicked', function () {
1051
+ var _render32 = render(_react.default.createElement(_.default, defaultProps)),
1052
+ getByLabelText = _render32.getByLabelText,
1053
+ getByText = _render32.getByText;
1054
+
1055
+ _react2.fireEvent.click(getByLabelText('My Tag Input'));
1056
+
1057
+ expect(getByText('Option1')).toBeInTheDocument();
1058
+ });
1059
+ it('calls onSelect when an option is selected from the dropdown', function () {
1060
+ var onSelectMock = jest.fn();
1061
+
1062
+ var _render33 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
1063
+ onSelect: onSelectMock
1064
+ }))),
1065
+ getByLabelText = _render33.getByLabelText,
1066
+ getByText = _render33.getByText;
1067
+
1068
+ _react2.fireEvent.click(getByLabelText('My Tag Input'));
1069
+
1070
+ expect(getByText('Option1')).toBeInTheDocument();
1071
+
1072
+ _react2.fireEvent.click(getByText('Option1'));
1073
+
1074
+ expect(onSelectMock).toHaveBeenCalledWith(['Option1']);
1075
+ });
1076
+ });
1001
1077
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decisiv/ui-components",
3
- "version": "2.0.1-alpha.211+22cfa85",
3
+ "version": "2.0.1-alpha.213+efaad97",
4
4
  "description": "Decisiv's design system React components",
5
5
  "author": "Decisiv UI Development Team",
6
6
  "license": "MIT",
@@ -71,5 +71,5 @@
71
71
  "access": "public"
72
72
  },
73
73
  "private": false,
74
- "gitHead": "22cfa85a7348f88285a256628a844a654e36c7e9"
74
+ "gitHead": "efaad97908f3df65c4b151668dd96147235f946f"
75
75
  }