@decisiv/ui-components 2.0.1-alpha.222 → 2.0.1-alpha.224
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/atoms/InputField/index.d.ts +3 -0
- package/lib/atoms/InputField/index.d.ts.map +1 -1
- package/lib/atoms/InputField/index.js +9 -2
- package/lib/atoms/InputField/styles.d.ts +7 -0
- package/lib/atoms/InputField/styles.d.ts.map +1 -0
- package/lib/atoms/InputField/styles.js +31 -0
- package/lib/atoms/OptionsList/index.d.ts.map +1 -1
- package/lib/atoms/OptionsList/index.js +141 -15
- package/lib/atoms/OptionsList/index.test.js +89 -36
- package/lib/atoms/OptionsList/types.d.ts +16 -0
- package/lib/atoms/OptionsList/types.d.ts.map +1 -1
- package/lib/atoms/OptionsList/utils.d.ts +3 -1
- package/lib/atoms/OptionsList/utils.d.ts.map +1 -1
- package/lib/atoms/OptionsList/utils.js +79 -2
- package/lib/components/Combobox/index.d.ts.map +1 -1
- package/lib/components/Combobox/index.js +4 -2
- package/lib/components/Combobox/types.d.ts +1 -0
- package/lib/components/Combobox/types.d.ts.map +1 -1
- package/lib/components/TagInput/index.d.ts +3 -12
- package/lib/components/TagInput/index.d.ts.map +1 -1
- package/lib/components/TagInput/index.js +56 -13
- package/lib/components/TagInput/index.test.js +66 -0
- package/lib/components/TagInput/schema.d.ts.map +1 -1
- package/lib/components/TagInput/schema.js +8 -2
- package/lib/components/TagInput/types.d.ts +21 -0
- package/lib/components/TagInput/types.d.ts.map +1 -0
- package/lib/components/TagInput/types.js +5 -0
- package/lib/components/Wizard/index.d.ts +9 -1
- package/lib/components/Wizard/index.d.ts.map +1 -1
- package/lib/components/Wizard/index.js +34 -21
- package/lib/components/Wizard/index.test.js +157 -28
- package/lib/components/Wizard/schema.d.ts.map +1 -1
- package/lib/components/Wizard/schema.js +6 -4
- package/package.json +3 -1
|
@@ -47,6 +47,9 @@ export interface BaseInputFieldProps {
|
|
|
47
47
|
withWarningIntent?: boolean;
|
|
48
48
|
isTextArea?: boolean;
|
|
49
49
|
multiple?: boolean;
|
|
50
|
+
showContainerCount?: boolean;
|
|
51
|
+
containerMaxCount?: number;
|
|
52
|
+
containerCount?: number;
|
|
50
53
|
}
|
|
51
54
|
declare const InputFieldWithRef: RefForwardingComponent<Ref<any>, BaseInputFieldProps>;
|
|
52
55
|
export default InputFieldWithRef;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atoms/InputField/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EACZ,aAAa,EAEb,GAAG,EACH,sBAAsB,EAIvB,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atoms/InputField/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,8 @@ var _RequiredIcon = _interopRequireDefault(require("../RequiredIcon"));
|
|
|
33
33
|
|
|
34
34
|
var _HelpMessage = _interopRequireDefault(require("./HelpMessage"));
|
|
35
35
|
|
|
36
|
+
var _styles = require("./styles");
|
|
37
|
+
|
|
36
38
|
var _schema = _interopRequireDefault(require("./schema"));
|
|
37
39
|
|
|
38
40
|
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
|
|
@@ -90,7 +92,10 @@ function InputField(props, targetRef) {
|
|
|
90
92
|
isTextArea = _props$isTextArea === void 0 ? false : _props$isTextArea,
|
|
91
93
|
_props$multiple = props.multiple,
|
|
92
94
|
multiple = _props$multiple === void 0 ? false : _props$multiple,
|
|
93
|
-
|
|
95
|
+
showContainerCount = props.showContainerCount,
|
|
96
|
+
containerCount = props.containerCount,
|
|
97
|
+
containerMaxCount = props.containerMaxCount,
|
|
98
|
+
rest = _objectWithoutProperties(props, ["children", "cursor", "disabled", "hideLabel", "helpMessage", "icon", "secondaryElement", "id", "inputContainerRef", "label", "labelId", "maxLength", "onBlur", "onChange", "onClick", "onFocus", "onKeyDown", "overflow", "readOnly", "required", "requiredMessage", "showCharacterCount", "style", "value", "warningMessage", "withWarningIntent", "isTextArea", "multiple", "showContainerCount", "containerCount", "containerMaxCount"]);
|
|
94
99
|
|
|
95
100
|
var fallbackTargetRef = (0, _react.useRef)(null);
|
|
96
101
|
var finalTargetRef = targetRef || fallbackTargetRef;
|
|
@@ -194,7 +199,9 @@ function InputField(props, targetRef) {
|
|
|
194
199
|
target: _react.default.createElement(_RequiredIcon.default, {
|
|
195
200
|
"aria-label": requiredMessage
|
|
196
201
|
})
|
|
197
|
-
}, requiredMessage)
|
|
202
|
+
}, requiredMessage), showContainerCount && containerMaxCount !== undefined && _react.default.createElement(_styles.ContentCounter, {
|
|
203
|
+
surpassed: (containerCount || 0) > containerMaxCount
|
|
204
|
+
}, "".concat(containerCount || 0, "/").concat(containerMaxCount)))), children(_objectSpread({}, rest, {
|
|
198
205
|
'aria-labelledby': labelId,
|
|
199
206
|
disabled: disabled,
|
|
200
207
|
id: targetId,
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { HTMLAttributes } from 'react';
|
|
2
|
+
interface SpanProps extends HTMLAttributes<HTMLSpanElement> {
|
|
3
|
+
surpassed?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare const ContentCounter: import("styled-components").StyledComponent<"span", any, SpanProps, never>;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/atoms/InputField/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AASvC,UAAU,SAAU,SAAQ,cAAc,CAAC,eAAe,CAAC;IACzD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAGD,eAAO,MAAM,cAAc,4EAS1B,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ContentCounter = void 0;
|
|
7
|
+
|
|
8
|
+
var _styledComponents = _interopRequireWildcard(require("styled-components"));
|
|
9
|
+
|
|
10
|
+
var _toColorString = _interopRequireDefault(require("polished/lib/color/toColorString"));
|
|
11
|
+
|
|
12
|
+
var _rem = _interopRequireDefault(require("polished/lib/helpers/rem"));
|
|
13
|
+
|
|
14
|
+
var _color = _interopRequireDefault(require("@decisiv/design-tokens/lib/color"));
|
|
15
|
+
|
|
16
|
+
var _spacing = _interopRequireDefault(require("@decisiv/design-tokens/lib/spacing"));
|
|
17
|
+
|
|
18
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
+
|
|
20
|
+
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
|
|
21
|
+
|
|
22
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
23
|
+
var ContentCounter = _styledComponents.default.span.withConfig({
|
|
24
|
+
displayName: "styles__ContentCounter",
|
|
25
|
+
componentId: "sc-1mkcosa-0"
|
|
26
|
+
})(["position:absolute;right:", ";", ""], (0, _rem.default)(_spacing.default.base), function (_ref) {
|
|
27
|
+
var surpassed = _ref.surpassed;
|
|
28
|
+
return surpassed && (0, _styledComponents.css)(["color:", ";"], (0, _toColorString.default)(_color.default.status.danger.medium));
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
exports.ContentCounter = ContentCounter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atoms/OptionsList/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KASN,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atoms/OptionsList/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KASN,MAAM,OAAO,CAAC;AAqBf,OAAO,EAEL,gBAAgB,EAMjB,MAAM,SAAS,CAAC;AAqBjB,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AA8iBrC,QAAA,MAAM,2BAA2B,2FAA0B,CAAC;AAmC5D,eAAe,2BAA2B,CAAC"}
|
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
Object.defineProperty(exports, "Container", {
|
|
7
7
|
enumerable: true,
|
|
8
8
|
get: function get() {
|
|
9
|
-
return
|
|
9
|
+
return _styles2.Container;
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
12
|
exports.default = void 0;
|
|
@@ -19,6 +19,8 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
|
19
19
|
|
|
20
20
|
var _isArray = _interopRequireDefault(require("lodash/isArray"));
|
|
21
21
|
|
|
22
|
+
var _reactWindow = require("react-window");
|
|
23
|
+
|
|
22
24
|
var _Button = require("../../components/Button");
|
|
23
25
|
|
|
24
26
|
var _Grid = _interopRequireDefault(require("../../components/Grid"));
|
|
@@ -37,9 +39,11 @@ var _Option = _interopRequireDefault(require("./Option"));
|
|
|
37
39
|
|
|
38
40
|
var _Category = _interopRequireDefault(require("./Category"));
|
|
39
41
|
|
|
42
|
+
var _styles = require("./Category/styles");
|
|
43
|
+
|
|
40
44
|
var _Footer = _interopRequireDefault(require("./Footer"));
|
|
41
45
|
|
|
42
|
-
var
|
|
46
|
+
var _styles2 = require("./styles");
|
|
43
47
|
|
|
44
48
|
var _context = require("./context");
|
|
45
49
|
|
|
@@ -59,8 +63,6 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
|
|
|
59
63
|
|
|
60
64
|
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; }
|
|
61
65
|
|
|
62
|
-
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); }
|
|
63
|
-
|
|
64
66
|
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
|
|
65
67
|
|
|
66
68
|
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
|
|
@@ -77,6 +79,8 @@ function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d =
|
|
|
77
79
|
|
|
78
80
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
79
81
|
|
|
82
|
+
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); }
|
|
83
|
+
|
|
80
84
|
var Row = _Grid.default.Row;
|
|
81
85
|
var isUsingKeyboard = false;
|
|
82
86
|
|
|
@@ -88,6 +92,41 @@ if (_canUseDOM.default) {
|
|
|
88
92
|
isUsingKeyboard = false;
|
|
89
93
|
});
|
|
90
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* VirtualRow component for VariableSizeList (react-window)
|
|
97
|
+
* Renders a single item (either a Category header or an Option)
|
|
98
|
+
*/
|
|
99
|
+
|
|
100
|
+
/* eslint-disable react/prop-types */
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
var VirtualRow = _react.default.memo(function (_ref) {
|
|
104
|
+
var index = _ref.index,
|
|
105
|
+
style = _ref.style,
|
|
106
|
+
data = _ref.data;
|
|
107
|
+
var flattenedItems = data.flattenedItems,
|
|
108
|
+
borderRadius = data.borderRadius,
|
|
109
|
+
showCheckbox = data.showCheckbox,
|
|
110
|
+
size = data.size;
|
|
111
|
+
var flattenedItem = flattenedItems[index];
|
|
112
|
+
var item = flattenedItem.item,
|
|
113
|
+
type = flattenedItem.type;
|
|
114
|
+
var id = (0, _utils.getId)(item);
|
|
115
|
+
return _react.default.createElement("div", {
|
|
116
|
+
style: style
|
|
117
|
+
}, type === 'category-header' ? _react.default.createElement(_styles.StyledCategory, {
|
|
118
|
+
size: size
|
|
119
|
+
}, item.label) : _react.default.createElement(_Option.default, _extends({}, item, {
|
|
120
|
+
key: id,
|
|
121
|
+
borderRadius: borderRadius,
|
|
122
|
+
showCheckbox: showCheckbox,
|
|
123
|
+
size: size
|
|
124
|
+
})));
|
|
125
|
+
});
|
|
126
|
+
/* eslint-enable react/prop-types */
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
VirtualRow.displayName = 'VirtualRow';
|
|
91
130
|
|
|
92
131
|
function OptionsList(props, forwardedRef) {
|
|
93
132
|
var actions = props.actions,
|
|
@@ -114,7 +153,8 @@ function OptionsList(props, forwardedRef) {
|
|
|
114
153
|
minWidth = props.minWidth,
|
|
115
154
|
maxWidth = props.maxWidth,
|
|
116
155
|
maxHeight = props.maxHeight,
|
|
117
|
-
pointerEvents = props.pointerEvents
|
|
156
|
+
pointerEvents = props.pointerEvents,
|
|
157
|
+
enableVirtualization = props.enableVirtualization;
|
|
118
158
|
var initialIds = selectedIdsProp || defaultSelected;
|
|
119
159
|
|
|
120
160
|
var _useState = (0, _react.useState)(null),
|
|
@@ -127,6 +167,40 @@ function OptionsList(props, forwardedRef) {
|
|
|
127
167
|
selectedIds = _useState4[0],
|
|
128
168
|
setSelectedIds = _useState4[1];
|
|
129
169
|
|
|
170
|
+
var isDragEnabled = !!onDragEndProp;
|
|
171
|
+
var useVirtualization = enableVirtualization && !isDragEnabled; // Flatten items for virtualization
|
|
172
|
+
|
|
173
|
+
var flattenedItems = (0, _react.useMemo)(function () {
|
|
174
|
+
if (!useVirtualization) return [];
|
|
175
|
+
return (0, _utils.flattenItems)(items);
|
|
176
|
+
}, [items, useVirtualization]); // Get item size for VariableSizeList
|
|
177
|
+
|
|
178
|
+
var getItemSize = (0, _react.useCallback)(function (index) {
|
|
179
|
+
return (0, _utils.getItemHeight)(flattenedItems[index], size);
|
|
180
|
+
}, [flattenedItems, size]); // Calculate total height for the list
|
|
181
|
+
|
|
182
|
+
var totalHeight = (0, _react.useMemo)(function () {
|
|
183
|
+
if (!useVirtualization) return 0;
|
|
184
|
+
var calculated = flattenedItems.reduce(function (acc, item) {
|
|
185
|
+
return acc + (0, _utils.getItemHeight)(item, size);
|
|
186
|
+
}, 0); // If maxHeight is explicitly provided, use it
|
|
187
|
+
|
|
188
|
+
if (maxHeight && typeof maxHeight === 'string') {
|
|
189
|
+
var max = parseInt(maxHeight, 10);
|
|
190
|
+
return Math.min(calculated, max);
|
|
191
|
+
} // Default behavior: use 310px max, but if calculated is less, use calculated
|
|
192
|
+
// This ensures small lists render all items (important for tests)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
var defaultMax = 310; // If the list is small enough to fit all items, use calculated height
|
|
196
|
+
// This is important for tests and small lists
|
|
197
|
+
|
|
198
|
+
if (calculated <= defaultMax) {
|
|
199
|
+
return calculated;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return defaultMax;
|
|
203
|
+
}, [flattenedItems, size, maxHeight, useVirtualization]);
|
|
130
204
|
var updateSelectionAndTriggerChange = (0, _react.useCallback)(function (ids) {
|
|
131
205
|
// Only toggle if we are "uncontrolled"
|
|
132
206
|
selectedIdsProp === undefined && selectable && setSelectedIds(ids);
|
|
@@ -161,8 +235,8 @@ function OptionsList(props, forwardedRef) {
|
|
|
161
235
|
|
|
162
236
|
var selectableIds = (0, _react.useMemo)(function () {
|
|
163
237
|
return items.reduce(function (acc, item) {
|
|
164
|
-
return [].concat(_toConsumableArray(acc), _toConsumableArray(((0, _utils.isCategory)(item) ? item.items.filter(function (
|
|
165
|
-
var disabled =
|
|
238
|
+
return [].concat(_toConsumableArray(acc), _toConsumableArray(((0, _utils.isCategory)(item) ? item.items.filter(function (_ref2) {
|
|
239
|
+
var disabled = _ref2.disabled;
|
|
166
240
|
return !disabled;
|
|
167
241
|
}) : [item.disabled ? undefined : item]).filter(Boolean)));
|
|
168
242
|
}, []).map(_utils.getId);
|
|
@@ -260,9 +334,9 @@ function OptionsList(props, forwardedRef) {
|
|
|
260
334
|
handleFocusToggle(event);
|
|
261
335
|
}, [handleFocusToggle, updateActiveId]);
|
|
262
336
|
var positions = [];
|
|
263
|
-
var onDragEnd = (0, _react.useCallback)(function (
|
|
264
|
-
var source =
|
|
265
|
-
destination =
|
|
337
|
+
var onDragEnd = (0, _react.useCallback)(function (_ref3) {
|
|
338
|
+
var source = _ref3.source,
|
|
339
|
+
destination = _ref3.destination;
|
|
266
340
|
if (!onDragEndProp || !destination) return;
|
|
267
341
|
|
|
268
342
|
var _positions$source$ind = _slicedToArray(positions[source.index], 2),
|
|
@@ -303,9 +377,17 @@ function OptionsList(props, forwardedRef) {
|
|
|
303
377
|
}, [onDragEndProp, positions]);
|
|
304
378
|
|
|
305
379
|
var _useConfig = (0, _ConfigProvider.useConfig)(),
|
|
306
|
-
createPortal = _useConfig.createPortal;
|
|
380
|
+
createPortal = _useConfig.createPortal; // Warn developers if they try to use both features
|
|
307
381
|
|
|
308
|
-
|
|
382
|
+
|
|
383
|
+
(0, _react.useEffect)(function () {
|
|
384
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
385
|
+
if (enableVirtualization && isDragEnabled) {
|
|
386
|
+
// eslint-disable-next-line no-console
|
|
387
|
+
console.warn('OptionsList: enableVirtualization is ignored when onDragEnd is provided. ' + 'Virtualization and drag-and-drop are incompatible.');
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}, [enableVirtualization, isDragEnabled]);
|
|
309
391
|
|
|
310
392
|
var renderDraggable = function renderDraggable(item, index) {
|
|
311
393
|
var id = (0, _utils.getId)(item);
|
|
@@ -352,10 +434,36 @@ function OptionsList(props, forwardedRef) {
|
|
|
352
434
|
}
|
|
353
435
|
}, _react.default.createElement(_Grid.default.Container, null, _react.default.createElement(Row, null, _react.default.createElement(_reactBeautifulDnd.DragDropContext, {
|
|
354
436
|
onDragEnd: onDragEnd
|
|
355
|
-
}, _react.default.createElement(
|
|
437
|
+
}, useVirtualization ? _react.default.createElement(_styles2.Container, {
|
|
438
|
+
"aria-activedescendant": activeId,
|
|
439
|
+
"aria-multiselectable": !!multiple,
|
|
440
|
+
ref: setContainerRefFunc,
|
|
441
|
+
onKeyDown: onKeyDown,
|
|
442
|
+
onFocus: onFocus,
|
|
443
|
+
onBlur: onBlur,
|
|
444
|
+
onMouseLeave: function onMouseLeave() {
|
|
445
|
+
return updateActiveId('');
|
|
446
|
+
},
|
|
447
|
+
role: role,
|
|
448
|
+
tabIndex: tabIndex,
|
|
449
|
+
minWidth: minWidth,
|
|
450
|
+
maxWidth: maxWidth,
|
|
451
|
+
maxHeight: maxHeight
|
|
452
|
+
}, _react.default.createElement(_reactWindow.VariableSizeList, {
|
|
453
|
+
height: totalHeight,
|
|
454
|
+
itemCount: flattenedItems.length,
|
|
455
|
+
itemSize: getItemSize,
|
|
456
|
+
width: "100%",
|
|
457
|
+
itemData: {
|
|
458
|
+
flattenedItems: flattenedItems,
|
|
459
|
+
borderRadius: borderRadius,
|
|
460
|
+
showCheckbox: showCheckbox || false,
|
|
461
|
+
size: size
|
|
462
|
+
}
|
|
463
|
+
}, VirtualRow)) : _react.default.createElement(_reactBeautifulDnd.Droppable, {
|
|
356
464
|
droppableId: "droppable-options-list"
|
|
357
465
|
}, function (droppableProvided) {
|
|
358
|
-
return _react.default.createElement(
|
|
466
|
+
return _react.default.createElement(_styles2.Container, _extends({
|
|
359
467
|
"aria-activedescendant": activeId,
|
|
360
468
|
"aria-multiselectable": !!multiple,
|
|
361
469
|
ref: function ref(el) {
|
|
@@ -373,7 +481,7 @@ function OptionsList(props, forwardedRef) {
|
|
|
373
481
|
minWidth: minWidth,
|
|
374
482
|
maxWidth: maxWidth,
|
|
375
483
|
maxHeight: maxHeight
|
|
376
|
-
}, droppableProvided.droppableProps), items.map(function (item, index) {
|
|
484
|
+
}, droppableProvided.droppableProps), isDragEnabled ? items.map(function (item, index) {
|
|
377
485
|
var id = (0, _utils.getId)(item);
|
|
378
486
|
var indexOffset = positions.length;
|
|
379
487
|
positions[dndIndex] = [index];
|
|
@@ -395,6 +503,24 @@ function OptionsList(props, forwardedRef) {
|
|
|
395
503
|
}
|
|
396
504
|
|
|
397
505
|
return renderDraggable(item, dndIndex - 1);
|
|
506
|
+
}) : items.map(function (item) {
|
|
507
|
+
var id = (0, _utils.getId)(item);
|
|
508
|
+
|
|
509
|
+
if ((0, _utils.isCategory)(item)) {
|
|
510
|
+
return _react.default.createElement(_Category.default, _extends({}, item, {
|
|
511
|
+
key: id,
|
|
512
|
+
borderRadius: borderRadius,
|
|
513
|
+
showCheckbox: showCheckbox,
|
|
514
|
+
size: size
|
|
515
|
+
}));
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
return _react.default.createElement(_Option.default, _extends({}, item, {
|
|
519
|
+
key: id,
|
|
520
|
+
borderRadius: borderRadius,
|
|
521
|
+
showCheckbox: showCheckbox,
|
|
522
|
+
size: size
|
|
523
|
+
}));
|
|
398
524
|
}), droppableProvided.placeholder);
|
|
399
525
|
}))), actions && _react.default.createElement(Row, null, _react.default.createElement(_Footer.default, {
|
|
400
526
|
actions: actions
|
|
@@ -101,12 +101,65 @@ var defaultProps = {
|
|
|
101
101
|
onChange: jest.fn()
|
|
102
102
|
};
|
|
103
103
|
describe('OptionsList', function () {
|
|
104
|
+
describe('virtualization', function () {
|
|
105
|
+
it('renders with virtualization enabled', function () {
|
|
106
|
+
var _render = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
|
|
107
|
+
enableVirtualization: true
|
|
108
|
+
})), {
|
|
109
|
+
wrapper: wrapper
|
|
110
|
+
}),
|
|
111
|
+
container = _render.container; // Verify that react-window's List container is rendered
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
var listContainer = container.querySelector('[style*="overflow"]');
|
|
115
|
+
expect(listContainer).toBeTruthy();
|
|
116
|
+
});
|
|
117
|
+
it('renders without virtualization by default', function () {
|
|
118
|
+
var _render2 = render(_react.default.createElement(_.default, defaultProps), {
|
|
119
|
+
wrapper: wrapper
|
|
120
|
+
}),
|
|
121
|
+
queryByText = _render2.queryByText; // Verify all items are rendered directly (not virtualized)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
expect(queryByText(item0Label)).toBeTruthy();
|
|
125
|
+
expect(queryByText('Option 1')).toBeTruthy();
|
|
126
|
+
expect(queryByText(item2Label)).toBeTruthy();
|
|
127
|
+
});
|
|
128
|
+
it('warns when enableVirtualization is used with drag-drop', function () {
|
|
129
|
+
var consoleSpy = jest.spyOn(console, 'warn').mockImplementation();
|
|
130
|
+
var onDragEnd = jest.fn();
|
|
131
|
+
render(_react.default.createElement(_.default, _extends({}, defaultProps, {
|
|
132
|
+
enableVirtualization: true,
|
|
133
|
+
onDragEnd: onDragEnd
|
|
134
|
+
})), {
|
|
135
|
+
wrapper: wrapper
|
|
136
|
+
});
|
|
137
|
+
expect(consoleSpy).toHaveBeenCalledWith('OptionsList: enableVirtualization is ignored when onDragEnd is provided. Virtualization and drag-and-drop are incompatible.');
|
|
138
|
+
consoleSpy.mockRestore();
|
|
139
|
+
});
|
|
140
|
+
it('disables virtualization when drag-drop is enabled', function () {
|
|
141
|
+
var onDragEnd = jest.fn();
|
|
142
|
+
|
|
143
|
+
var _render3 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
|
|
144
|
+
enableVirtualization: true,
|
|
145
|
+
onDragEnd: onDragEnd
|
|
146
|
+
})), {
|
|
147
|
+
wrapper: wrapper
|
|
148
|
+
}),
|
|
149
|
+
queryByText = _render3.queryByText; // All items should be rendered directly (not virtualized) when drag-drop is enabled
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
expect(queryByText(item0Label)).toBeTruthy();
|
|
153
|
+
expect(queryByText('Option 1')).toBeTruthy();
|
|
154
|
+
expect(queryByText(item2Label)).toBeTruthy();
|
|
155
|
+
});
|
|
156
|
+
});
|
|
104
157
|
['small', 'medium'].forEach(function (size) {
|
|
105
158
|
it('renders items and categories sub items', function () {
|
|
106
|
-
var
|
|
159
|
+
var _render4 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
|
|
107
160
|
size: size
|
|
108
161
|
}))),
|
|
109
|
-
queryByText =
|
|
162
|
+
queryByText = _render4.queryByText;
|
|
110
163
|
|
|
111
164
|
items.forEach(function (item) {
|
|
112
165
|
var label = item.label;
|
|
@@ -126,11 +179,11 @@ describe('OptionsList', function () {
|
|
|
126
179
|
return _react.default.createElement("span", null, "".concat(label, " foo"));
|
|
127
180
|
};
|
|
128
181
|
|
|
129
|
-
var
|
|
182
|
+
var _render5 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
|
|
130
183
|
renderOptionLabel: renderOptionLabel,
|
|
131
184
|
size: size
|
|
132
185
|
}))),
|
|
133
|
-
queryByText =
|
|
186
|
+
queryByText = _render5.queryByText;
|
|
134
187
|
|
|
135
188
|
items.forEach(function (item) {
|
|
136
189
|
var label = item.label;
|
|
@@ -146,19 +199,19 @@ describe('OptionsList', function () {
|
|
|
146
199
|
});
|
|
147
200
|
});
|
|
148
201
|
it('checks that labelDetails when provided ', function () {
|
|
149
|
-
var
|
|
202
|
+
var _render6 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
|
|
150
203
|
size: size
|
|
151
204
|
}))),
|
|
152
|
-
getByText =
|
|
205
|
+
getByText = _render6.getByText;
|
|
153
206
|
|
|
154
207
|
expect(getByText('test detail label')).toBeInTheDocument();
|
|
155
208
|
});
|
|
156
209
|
it('navigates through the options with arrow keys', function () {
|
|
157
|
-
var
|
|
210
|
+
var _render7 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
|
|
158
211
|
size: size
|
|
159
212
|
}))),
|
|
160
|
-
getByText =
|
|
161
|
-
container =
|
|
213
|
+
getByText = _render7.getByText,
|
|
214
|
+
container = _render7.container;
|
|
162
215
|
|
|
163
216
|
var optionsList = container.querySelector('ul'); // simulate it is focused while tabbing
|
|
164
217
|
|
|
@@ -187,12 +240,12 @@ describe('OptionsList', function () {
|
|
|
187
240
|
it('selects an item with Enter or Space key', function () {
|
|
188
241
|
var onChange = jest.fn();
|
|
189
242
|
|
|
190
|
-
var
|
|
243
|
+
var _render8 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
|
|
191
244
|
onChange: onChange,
|
|
192
245
|
size: size
|
|
193
246
|
}))),
|
|
194
|
-
getByLabelText =
|
|
195
|
-
container =
|
|
247
|
+
getByLabelText = _render8.getByLabelText,
|
|
248
|
+
container = _render8.container;
|
|
196
249
|
|
|
197
250
|
var selectedItem = defaultProps.items[1];
|
|
198
251
|
var optionsList = container.querySelector('ul'); // simulate it is focused while tabbing
|
|
@@ -229,13 +282,13 @@ describe('OptionsList', function () {
|
|
|
229
282
|
disabled: true
|
|
230
283
|
}];
|
|
231
284
|
|
|
232
|
-
var
|
|
285
|
+
var _render9 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
|
|
233
286
|
items: onlyDisabledItems,
|
|
234
287
|
onChange: onChange,
|
|
235
288
|
size: size
|
|
236
289
|
}))),
|
|
237
|
-
getByLabelText =
|
|
238
|
-
container =
|
|
290
|
+
getByLabelText = _render9.getByLabelText,
|
|
291
|
+
container = _render9.container;
|
|
239
292
|
|
|
240
293
|
var optionsList = container.querySelector('ul'); // simulate it is focused while tabbing
|
|
241
294
|
|
|
@@ -262,12 +315,12 @@ describe('OptionsList', function () {
|
|
|
262
315
|
it('calls onChange with id when item is clicked', function () {
|
|
263
316
|
var onChange = jest.fn();
|
|
264
317
|
|
|
265
|
-
var
|
|
318
|
+
var _render10 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
|
|
266
319
|
onChange: onChange,
|
|
267
320
|
size: size
|
|
268
321
|
}))),
|
|
269
|
-
getByText =
|
|
270
|
-
getByLabelText =
|
|
322
|
+
getByText = _render10.getByText,
|
|
323
|
+
getByLabelText = _render10.getByLabelText;
|
|
271
324
|
|
|
272
325
|
var item = items[0];
|
|
273
326
|
|
|
@@ -286,12 +339,12 @@ describe('OptionsList', function () {
|
|
|
286
339
|
it('does not calls onChange when item is clicked', function () {
|
|
287
340
|
var onChange = jest.fn();
|
|
288
341
|
|
|
289
|
-
var
|
|
342
|
+
var _render11 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
|
|
290
343
|
onChange: onChange,
|
|
291
344
|
size: size
|
|
292
345
|
}))),
|
|
293
|
-
getByText =
|
|
294
|
-
getByLabelText =
|
|
346
|
+
getByText = _render11.getByText,
|
|
347
|
+
getByLabelText = _render11.getByLabelText;
|
|
295
348
|
|
|
296
349
|
_react2.fireEvent.click(getByText(disabledItemLabel));
|
|
297
350
|
|
|
@@ -305,12 +358,12 @@ describe('OptionsList', function () {
|
|
|
305
358
|
it('prefers value over internal', function () {
|
|
306
359
|
var selected = items[1];
|
|
307
360
|
|
|
308
|
-
var
|
|
361
|
+
var _render12 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
|
|
309
362
|
selected: selected.id,
|
|
310
363
|
size: size
|
|
311
364
|
}))),
|
|
312
|
-
getByText =
|
|
313
|
-
getByLabelText =
|
|
365
|
+
getByText = _render12.getByText,
|
|
366
|
+
getByLabelText = _render12.getByLabelText;
|
|
314
367
|
|
|
315
368
|
var item = items[0];
|
|
316
369
|
|
|
@@ -325,13 +378,13 @@ describe('OptionsList', function () {
|
|
|
325
378
|
it('calls onChange with array of selected ids when item is clicked', function () {
|
|
326
379
|
var onChange = jest.fn();
|
|
327
380
|
|
|
328
|
-
var
|
|
381
|
+
var _render13 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
|
|
329
382
|
onChange: onChange,
|
|
330
383
|
multiple: true,
|
|
331
384
|
size: size
|
|
332
385
|
}))),
|
|
333
|
-
getByText =
|
|
334
|
-
getByLabelText =
|
|
386
|
+
getByText = _render13.getByText,
|
|
387
|
+
getByLabelText = _render13.getByLabelText;
|
|
335
388
|
|
|
336
389
|
var item = items[0];
|
|
337
390
|
|
|
@@ -370,13 +423,13 @@ describe('OptionsList', function () {
|
|
|
370
423
|
onClick: onClick
|
|
371
424
|
}];
|
|
372
425
|
|
|
373
|
-
var
|
|
426
|
+
var _render14 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
|
|
374
427
|
actions: actions,
|
|
375
428
|
multiple: true,
|
|
376
429
|
size: size
|
|
377
430
|
}))),
|
|
378
|
-
baseElement =
|
|
379
|
-
getByText =
|
|
431
|
+
baseElement = _render14.baseElement,
|
|
432
|
+
getByText = _render14.getByText;
|
|
380
433
|
|
|
381
434
|
actions.forEach(function (_ref5) {
|
|
382
435
|
var label = _ref5.text;
|
|
@@ -389,11 +442,11 @@ describe('OptionsList', function () {
|
|
|
389
442
|
it('has draggable attributes', function () {
|
|
390
443
|
var mockedFn = jest.fn();
|
|
391
444
|
|
|
392
|
-
var
|
|
445
|
+
var _render15 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
|
|
393
446
|
size: size,
|
|
394
447
|
onDragEnd: mockedFn
|
|
395
448
|
}))),
|
|
396
|
-
getByText =
|
|
449
|
+
getByText = _render15.getByText;
|
|
397
450
|
|
|
398
451
|
var item = items[0];
|
|
399
452
|
expect(getByText(item.label).closest('li')).toHaveAttribute('draggable');
|
|
@@ -403,10 +456,10 @@ describe('OptionsList', function () {
|
|
|
403
456
|
});
|
|
404
457
|
});
|
|
405
458
|
it('does not have draggable attributes when onDragEnd is not provided', function () {
|
|
406
|
-
var
|
|
459
|
+
var _render16 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
|
|
407
460
|
size: size
|
|
408
461
|
}))),
|
|
409
|
-
getByText =
|
|
462
|
+
getByText = _render16.getByText;
|
|
410
463
|
|
|
411
464
|
var item = items[0];
|
|
412
465
|
expect(getByText(item.label).closest('li')).not.toHaveAttribute('draggable');
|
|
@@ -419,11 +472,11 @@ describe('OptionsList', function () {
|
|
|
419
472
|
it.skip('calls onDragEnd when drag ends', function () {
|
|
420
473
|
var mockedFn = jest.fn();
|
|
421
474
|
|
|
422
|
-
var
|
|
475
|
+
var _render17 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
|
|
423
476
|
size: size,
|
|
424
477
|
onDragEnd: mockedFn
|
|
425
478
|
}))),
|
|
426
|
-
getByText =
|
|
479
|
+
getByText = _render17.getByText;
|
|
427
480
|
|
|
428
481
|
var draggableElement = getByText(items[0].label).closest('li');
|
|
429
482
|
var dropTarget = getByText('Option 2').closest('li');
|
|
@@ -93,6 +93,7 @@ export interface OptionsListProps extends OptionsListDimensions {
|
|
|
93
93
|
itemRole?: string;
|
|
94
94
|
pointerEvents?: string;
|
|
95
95
|
onDragEnd?: (from: number | number[], to: number | number[]) => void;
|
|
96
|
+
enableVirtualization?: boolean;
|
|
96
97
|
}
|
|
97
98
|
export declare type OptionsListContainerRef = HTMLUListElement;
|
|
98
99
|
export interface StyledCategoryProps {
|
|
@@ -112,5 +113,20 @@ export interface ContainerProps {
|
|
|
112
113
|
export interface StyledLinkProps extends LinkProps {
|
|
113
114
|
disabled: boolean;
|
|
114
115
|
}
|
|
116
|
+
export interface FlattenedItem {
|
|
117
|
+
item: Item;
|
|
118
|
+
type: 'option' | 'category-header';
|
|
119
|
+
originalItem: Item;
|
|
120
|
+
}
|
|
121
|
+
export interface VirtualRowProps {
|
|
122
|
+
index: number;
|
|
123
|
+
style: React.CSSProperties;
|
|
124
|
+
data: {
|
|
125
|
+
flattenedItems: FlattenedItem[];
|
|
126
|
+
borderRadius?: string;
|
|
127
|
+
showCheckbox: boolean;
|
|
128
|
+
size: 'small' | 'medium';
|
|
129
|
+
};
|
|
130
|
+
}
|
|
115
131
|
export {};
|
|
116
132
|
//# sourceMappingURL=types.d.ts.map
|