@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.
- package/lib/components/CheckboxGroup/index.d.ts +1 -1
- package/lib/components/Combobox/index.d.ts.map +1 -1
- package/lib/components/Combobox/index.js +62 -28
- package/lib/components/Combobox/index.test.js +35 -9
- package/lib/components/Combobox/schema.d.ts.map +1 -1
- package/lib/components/Combobox/schema.js +3 -0
- package/lib/components/Combobox/types.d.ts +2 -1
- package/lib/components/Combobox/types.d.ts.map +1 -1
- package/lib/components/TagInput/index.d.ts +5 -1
- package/lib/components/TagInput/index.d.ts.map +1 -1
- package/lib/components/TagInput/index.js +125 -22
- package/lib/components/TagInput/index.test.js +110 -34
- package/package.json +2 -2
|
@@ -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" | "
|
|
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;
|
|
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
|
|
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 (
|
|
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 (
|
|
250
|
-
var itemId =
|
|
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 (
|
|
278
|
-
var optionId =
|
|
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
|
-
|
|
321
|
-
|
|
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 (
|
|
396
|
-
var optionId =
|
|
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 (
|
|
509
|
-
var ariaLabelledBy =
|
|
510
|
-
disabled =
|
|
511
|
-
targetId =
|
|
512
|
-
onBlurTarget =
|
|
513
|
-
onChangeTargetValue =
|
|
514
|
-
onFocusTarget =
|
|
515
|
-
readOnly =
|
|
516
|
-
targetRef =
|
|
517
|
-
value =
|
|
518
|
-
autoComplete =
|
|
519
|
-
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('
|
|
1035
|
-
it('calls the onChangeValue prop with
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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;
|
|
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":"AAAA,OAAO,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;
|
|
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":";
|
|
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
|
-
|
|
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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
129
|
-
|
|
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
|
-
|
|
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 :
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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.
|
|
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": "
|
|
74
|
+
"gitHead": "efaad97908f3df65c4b151668dd96147235f946f"
|
|
75
75
|
}
|