@decisiv/ui-components 2.0.1-alpha.222 → 2.0.1-alpha.223

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/atoms/OptionsList/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KASN,MAAM,OAAO,CAAC;AAoBf,OAAO,EAGL,gBAAgB,EAGjB,MAAM,SAAS,CAAC;AAajB,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAqZrC,QAAA,MAAM,2BAA2B,2FAA0B,CAAC;AAmC5D,eAAe,2BAA2B,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 _styles.Container;
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 _styles = require("./styles");
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 (_ref) {
165
- var disabled = _ref.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 (_ref2) {
264
- var source = _ref2.source,
265
- destination = _ref2.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
- var isDragEnabled = !!onDragEndProp;
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(_reactBeautifulDnd.Droppable, {
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(_styles.Container, _extends({
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 _render = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
159
+ var _render4 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
107
160
  size: size
108
161
  }))),
109
- queryByText = _render.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 _render2 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
182
+ var _render5 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
130
183
  renderOptionLabel: renderOptionLabel,
131
184
  size: size
132
185
  }))),
133
- queryByText = _render2.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 _render3 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
202
+ var _render6 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
150
203
  size: size
151
204
  }))),
152
- getByText = _render3.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 _render4 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
210
+ var _render7 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
158
211
  size: size
159
212
  }))),
160
- getByText = _render4.getByText,
161
- container = _render4.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 _render5 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
243
+ var _render8 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
191
244
  onChange: onChange,
192
245
  size: size
193
246
  }))),
194
- getByLabelText = _render5.getByLabelText,
195
- container = _render5.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 _render6 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
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 = _render6.getByLabelText,
238
- container = _render6.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 _render7 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
318
+ var _render10 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
266
319
  onChange: onChange,
267
320
  size: size
268
321
  }))),
269
- getByText = _render7.getByText,
270
- getByLabelText = _render7.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 _render8 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
342
+ var _render11 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
290
343
  onChange: onChange,
291
344
  size: size
292
345
  }))),
293
- getByText = _render8.getByText,
294
- getByLabelText = _render8.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 _render9 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
361
+ var _render12 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
309
362
  selected: selected.id,
310
363
  size: size
311
364
  }))),
312
- getByText = _render9.getByText,
313
- getByLabelText = _render9.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 _render10 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
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 = _render10.getByText,
334
- getByLabelText = _render10.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 _render11 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
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 = _render11.baseElement,
379
- getByText = _render11.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 _render12 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
445
+ var _render15 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
393
446
  size: size,
394
447
  onDragEnd: mockedFn
395
448
  }))),
396
- getByText = _render12.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 _render13 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
459
+ var _render16 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
407
460
  size: size
408
461
  }))),
409
- getByText = _render13.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 _render14 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
475
+ var _render17 = render(_react.default.createElement(_.default, _extends({}, defaultProps, {
423
476
  size: size,
424
477
  onDragEnd: mockedFn
425
478
  }))),
426
- getByText = _render14.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
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/atoms/OptionsList/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/atoms/OptionsList/types.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Item, Category, Option, LinkOption } from './types';
1
+ import { Item, Category, Option, LinkOption, FlattenedItem } from './types';
2
2
  export declare const getId: (item: Item) => string;
3
3
  export declare const isCategory: (item: Item) => item is Category;
4
4
  export declare const sanitizeIds: (ids: string | string[] | undefined, multiple: boolean) => string[];
@@ -6,4 +6,6 @@ export declare const ensureItemIsVisible: (container: HTMLUListElement | null, i
6
6
  focus?: boolean | undefined;
7
7
  } | undefined) => void;
8
8
  export declare const isLink: (item: Option) => item is LinkOption;
9
+ export declare const flattenItems: (items: Item[]) => FlattenedItem[];
10
+ export declare const getItemHeight: (flattenedItem: FlattenedItem, size?: "small" | "medium") => number;
9
11
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/atoms/OptionsList/utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE7D,eAAO,MAAM,KAAK,wBAAgD,CAAC;AAEnE,eAAO,MAAM,UAAU,kCACuB,CAAC;AAE/C,eAAO,MAAM,WAAW,qEAWvB,CAAC;AAEF,eAAO,MAAM,mBAAmB;;sBA+B/B,CAAC;AAEF,eAAO,MAAM,MAAM,sCACgB,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/atoms/OptionsList/utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE5E,eAAO,MAAM,KAAK,wBAAgD,CAAC;AAEnE,eAAO,MAAM,UAAU,kCACuB,CAAC;AAE/C,eAAO,MAAM,WAAW,qEAWvB,CAAC;AAEF,eAAO,MAAM,mBAAmB;;sBA+B/B,CAAC;AAEF,eAAO,MAAM,MAAM,sCACgB,CAAC;AAepC,eAAO,MAAM,YAAY,oCA+BxB,CAAC;AAYF,eAAO,MAAM,aAAa,qEAkBzB,CAAC"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.isLink = exports.ensureItemIsVisible = exports.sanitizeIds = exports.isCategory = exports.getId = void 0;
6
+ exports.getItemHeight = exports.flattenItems = exports.isLink = exports.ensureItemIsVisible = exports.sanitizeIds = exports.isCategory = exports.getId = void 0;
7
7
 
8
8
  var _castArray = _interopRequireDefault(require("lodash/castArray"));
9
9
 
@@ -73,5 +73,82 @@ exports.ensureItemIsVisible = ensureItemIsVisible;
73
73
  var isLink = function isLink(item) {
74
74
  return 'linkTo' in item && !!item.linkTo;
75
75
  };
76
+ /**
77
+ * Flatten items array to include category items inline for virtualization
78
+ *
79
+ * Categories are rendered as:
80
+ * - Category header (with special styling)
81
+ * - Followed by its items
82
+ *
83
+ * This function transforms:
84
+ * [Option1, Category{items: [Option2, Option3]}, Option4]
85
+ *
86
+ * Into:
87
+ * [Option1, CategoryHeader, Option2, Option3, Option4]
88
+ */
89
+
90
+
91
+ exports.isLink = isLink;
92
+
93
+ var flattenItems = function flattenItems(items) {
94
+ var flattened = [];
95
+ items.forEach(function (item) {
96
+ if (isCategory(item)) {
97
+ // Add the category header
98
+ flattened.push({
99
+ item: item,
100
+ type: 'category-header',
101
+ originalItem: item
102
+ }); // Add all items within the category
103
+
104
+ item.items.forEach(function (subItem) {
105
+ flattened.push({
106
+ item: subItem,
107
+ type: 'option',
108
+ originalItem: item // Keep reference to parent category
109
+
110
+ });
111
+ });
112
+ } else {
113
+ // Regular option
114
+ flattened.push({
115
+ item: item,
116
+ type: 'option',
117
+ originalItem: item
118
+ });
119
+ }
120
+ });
121
+ return flattened;
122
+ };
123
+ /**
124
+ * Calculate item height based on type and size for virtualization
125
+ *
126
+ * Heights are based on the styled-components padding values:
127
+ * - Options (small): 5px top + 5px bottom padding + ~25px content = ~35px
128
+ * - Options (medium): 10px top + 10px bottom padding + ~25px content = ~45px
129
+ * - Categories (small): 15px top + 7px bottom padding + ~20px content = ~42px
130
+ * - Categories (medium): 15px top + 10px bottom padding + ~25px content = ~50px
131
+ * - Options with labelDetails: Add ~20px extra height
132
+ */
133
+
134
+
135
+ exports.flattenItems = flattenItems;
136
+
137
+ var getItemHeight = function getItemHeight(flattenedItem) {
138
+ var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'small';
139
+ var type = flattenedItem.type,
140
+ item = flattenedItem.item;
141
+
142
+ if (type === 'category-header') {
143
+ // Category headers are taller
144
+ return size === 'medium' ? 50 : 42;
145
+ } // Regular option
146
+
147
+
148
+ var baseHeight = size === 'medium' ? 45 : 35; // Check if option has labelDetails (secondary text) which adds height
149
+
150
+ var hasLabelDetails = 'labelDetails' in item && item.labelDetails;
151
+ return hasLabelDetails ? baseHeight + 20 : baseHeight;
152
+ };
76
153
 
77
- exports.isLink = isLink;
154
+ exports.getItemHeight = getItemHeight;
@@ -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;AA4mBhE,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;AA8mBhE,QAAA,MAAM,eAAe,EAAE,sBAAsB,CAC3C,gBAAgB,EAChB,aAAa,CACS,CAAC;AAOzB,eAAe,eAAe,CAAC"}
@@ -126,7 +126,8 @@ function Combobox(props, ref) {
126
126
  containerSelector = props.containerSelector,
127
127
  pointerEvents = props.pointerEvents,
128
128
  externalIsPopoverVisible = props.isPopoverVisible,
129
- externalListRef = props.listRef;
129
+ externalListRef = props.listRef,
130
+ enableVirtualization = props.enableVirtualization;
130
131
 
131
132
  var _useCombobox = (0, _useCombobox2.default)(props),
132
133
  getInputFieldProps = _useCombobox.getInputFieldProps,
@@ -605,7 +606,8 @@ function Combobox(props, ref) {
605
606
  visible: Boolean(popoverVisibleStateToUse || loading),
606
607
  renderOptionLabel: renderOptionLabel,
607
608
  zIndex: zIndex,
608
- pointerEvents: pointerEvents
609
+ pointerEvents: pointerEvents,
610
+ enableVirtualization: enableVirtualization
609
611
  }));
610
612
  }));
611
613
  }
@@ -12,6 +12,7 @@ export interface ComboboxProps extends Omit<React.InputHTMLAttributes<ComboboxIn
12
12
  clearButtonLabel?: string;
13
13
  defaultInputValue?: string;
14
14
  defaultValue?: string;
15
+ enableVirtualization?: boolean;
15
16
  inputValue?: string;
16
17
  isPopoverVisible?: boolean;
17
18
  multiple?: boolean;
@@ -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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"}
@@ -12,8 +12,15 @@ export interface WizardProps extends Pick<ModalProps, 'id' | 'visible' | 'zIndex
12
12
  size?: 'normal' | 'extraLarge';
13
13
  steps: Step[];
14
14
  activeStep: number;
15
- submitButtonProps: ButtonProps;
15
+ submitButtonProps?: ButtonProps;
16
16
  onCancel: NonNullable<ModalProps['onClose']>;
17
+ renderActions?: (context: {
18
+ step: Step;
19
+ stepIndex: number;
20
+ isFirstStep: boolean;
21
+ isLastStep: boolean;
22
+ defaultActions: React.ReactNode;
23
+ }) => React.ReactNode;
17
24
  }
18
25
  declare function WizardManger(props: PropsWithChildren<WizardProps>): JSX.Element;
19
26
  declare namespace WizardManger {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Wizard/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAOjD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGxC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAa5C,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,mBAAmB,CAAC,EAAE,WAAW,CAAC;CACnC;AAED,MAAM,WAAW,WACf,SAAQ,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,SAAS,GAAG,QAAQ,CAAC;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAC;IAC/B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,WAAW,CAAC;IAC/B,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;CAC9C;AAmGD,iBAAS,YAAY,CAAC,KAAK,EAAE,iBAAiB,CAAC,WAAW,CAAC,eAQ1D;kBARQ,YAAY;;;;AAiBrB,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Wizard/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,iBAAiB,EAAW,MAAM,OAAO,CAAC;AAO1D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGxC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAa5C,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,mBAAmB,CAAC,EAAE,WAAW,CAAC;CACnC;AAED,MAAM,WAAW,WACf,SAAQ,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,SAAS,GAAG,QAAQ,CAAC;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAC;IAC/B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAChC,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7C,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE;QACxB,IAAI,EAAE,IAAI,CAAC;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,OAAO,CAAC;QACrB,UAAU,EAAE,OAAO,CAAC;QACpB,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC;KACjC,KAAK,KAAK,CAAC,SAAS,CAAC;CACvB;AA8HD,iBAAS,YAAY,CAAC,KAAK,EAAE,iBAAiB,CAAC,WAAW,CAAC,eAQ1D;kBARQ,YAAY;;;;AAiBrB,eAAe,YAAY,CAAC"}
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _react = _interopRequireDefault(require("react"));
8
+ var _react = _interopRequireWildcard(require("react"));
9
9
 
10
10
  var _breakpointObserver = require("@decisiv/breakpoint-observer");
11
11
 
@@ -31,6 +31,8 @@ var _schema = _interopRequireDefault(require("./schema"));
31
31
 
32
32
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
33
33
 
34
+ 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; } }
35
+
34
36
  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; }
35
37
 
36
38
  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; }
@@ -63,6 +65,7 @@ var Wizard = function Wizard(_ref) {
63
65
  size = _ref$size === void 0 ? 'normal' : _ref$size,
64
66
  steps = _ref.steps,
65
67
  onCancel = _ref.onCancel,
68
+ renderActions = _ref.renderActions,
66
69
  _ref$zIndex = _ref.zIndex,
67
70
  zIndex = _ref$zIndex === void 0 ? 100 : _ref$zIndex;
68
71
  var translate = (0, _useTranslations.default)();
@@ -86,6 +89,26 @@ var Wizard = function Wizard(_ref) {
86
89
  var showPrevious = currentStepNumber > 1 && !!previousButtonProps;
87
90
  var showSubmit = currentStepNumber === steps.length && !!submitButtonProps;
88
91
  var showNext = currentStepNumber < steps.length && !showSubmit && !!nextButtonProps;
92
+ var defaultActions = (0, _react.useMemo)(function () {
93
+ return _react.default.createElement(_react.default.Fragment, null, _react.default.createElement(_styles.ActionButtonsContainer, {
94
+ size: breakpoint
95
+ }, showSubmit && _react.default.createElement(_.Button, _extends({
96
+ text: translate('Submit', 'wizard.actions.submit')
97
+ }, submitButtonProps)), showNext && _react.default.createElement(_.Button, _extends({
98
+ text: translate('Continue', 'wizard.actions.continue'),
99
+ icon: _ArrowRight.default,
100
+ iconPosition: "right"
101
+ }, nextButtonProps)), showPrevious && _react.default.createElement(_.Button, _extends({
102
+ text: translate('Back', 'wizard.actions.back'),
103
+ kind: "secondary",
104
+ icon: _ArrowLeft.default
105
+ }, previousButtonProps))), _react.default.createElement(_.Button, {
106
+ text: translate('Cancel', 'wizard.actions.cancel'),
107
+ kind: "secondary",
108
+ variant: "ghost",
109
+ onClick: onCancel
110
+ }));
111
+ }, [breakpoint, showSubmit, translate, submitButtonProps, showNext, nextButtonProps, showPrevious, previousButtonProps, onCancel]);
89
112
  return _react.default.createElement(_ResponsiveModalWrapper.default, {
90
113
  id: id,
91
114
  size: sizeMapping[size],
@@ -109,24 +132,13 @@ var Wizard = function Wizard(_ref) {
109
132
  size: breakpoint,
110
133
  paddingX: (_ref3 = {}, _defineProperty(_ref3, _breakpointObserver.sizes.LG, 3), _defineProperty(_ref3, _breakpointObserver.sizes.XS, 2), _ref3),
111
134
  paddingY: 1.5
112
- }, _react.default.createElement(_styles.ActionButtonsContainer, {
113
- size: breakpoint
114
- }, showSubmit && _react.default.createElement(_.Button, _extends({
115
- text: translate('Submit', 'wizard.actions.submit')
116
- }, submitButtonProps)), showNext && _react.default.createElement(_.Button, _extends({
117
- text: translate('Continue', 'wizard.actions.continue'),
118
- icon: _ArrowRight.default,
119
- iconPosition: "right"
120
- }, nextButtonProps)), showPrevious && _react.default.createElement(_.Button, _extends({
121
- text: translate('Back', 'wizard.actions.back'),
122
- kind: "secondary",
123
- icon: _ArrowLeft.default
124
- }, previousButtonProps))), _react.default.createElement(_.Button, {
125
- text: translate('Cancel', 'wizard.actions.cancel'),
126
- kind: "secondary",
127
- variant: "ghost",
128
- onClick: onCancel
129
- }))));
135
+ }, renderActions ? renderActions({
136
+ step: currentStep,
137
+ stepIndex: currentStepNumber - 1,
138
+ isFirstStep: currentStepNumber === 1,
139
+ isLastStep: currentStepNumber === steps.length,
140
+ defaultActions: defaultActions
141
+ }) : defaultActions)));
130
142
  };
131
143
 
132
144
  function WizardManger(props) {
@@ -30,6 +30,95 @@ var render = function render(ui, options) {
30
30
  };
31
31
 
32
32
  describe('Wizard', function () {
33
+ describe('renderActions', function () {
34
+ describe('when not provided', function () {
35
+ it('renders the default action buttons', function () {
36
+ var steps = [{
37
+ title: 'First Step',
38
+ content: _react.default.createElement(StepContent, {
39
+ text: "Step 1 Content"
40
+ }),
41
+ nextButtonProps: {
42
+ onClick: function onClick() {
43
+ return null;
44
+ }
45
+ }
46
+ }, {
47
+ title: 'Second Step',
48
+ content: _react.default.createElement(StepContent, {
49
+ text: "Step 2 Content"
50
+ })
51
+ }, {
52
+ title: 'Third Step',
53
+ content: _react.default.createElement(StepContent, {
54
+ text: "Step 3 Content"
55
+ })
56
+ }];
57
+
58
+ var _render = render(_react.default.createElement(_.default, {
59
+ title: "Wizard Title",
60
+ visible: true,
61
+ activeStep: 1,
62
+ submitButtonProps: {
63
+ onClick: function onClick() {
64
+ return null;
65
+ }
66
+ },
67
+ steps: steps
68
+ })),
69
+ getByRole = _render.getByRole;
70
+
71
+ var modal = getByRole('dialog');
72
+ expect(modal).toBeInTheDocument();
73
+ expect((0, _react2.within)(modal).getByText(/cancel/i, {
74
+ selector: 'button'
75
+ })).toBeInTheDocument();
76
+ expect((0, _react2.within)(modal).getByText(/continue/i, {
77
+ selector: 'button'
78
+ })).toBeInTheDocument();
79
+ });
80
+ });
81
+ describe('when provided', function () {
82
+ it('renders the custom action buttons', function () {
83
+ var steps = [{
84
+ title: 'First Step',
85
+ content: _react.default.createElement(StepContent, {
86
+ text: "Step 1 Content"
87
+ })
88
+ }, {
89
+ title: 'Second Step',
90
+ content: _react.default.createElement(StepContent, {
91
+ text: "Step 2 Content"
92
+ })
93
+ }, {
94
+ title: 'Third Step',
95
+ content: _react.default.createElement(StepContent, {
96
+ text: "Step 3 Content"
97
+ })
98
+ }];
99
+
100
+ var _render2 = render(_react.default.createElement(_.default, {
101
+ title: "Wizard Title",
102
+ visible: true,
103
+ activeStep: 1,
104
+ submitButtonProps: {
105
+ onClick: function onClick() {
106
+ return null;
107
+ }
108
+ },
109
+ steps: steps,
110
+ renderActions: function renderActions() {
111
+ return _react.default.createElement("div", null, "Custom Actions");
112
+ }
113
+ })),
114
+ getByRole = _render2.getByRole;
115
+
116
+ var modal = getByRole('dialog');
117
+ expect(modal).toBeInTheDocument();
118
+ expect((0, _react2.within)(modal).getByText(/custom actions/i)).toBeInTheDocument();
119
+ });
120
+ });
121
+ });
33
122
  describe('size', function () {
34
123
  describe('normal / default', function () {
35
124
  it('renders the modal with a max-width of 650px', function () {
@@ -50,7 +139,7 @@ describe('Wizard', function () {
50
139
  })
51
140
  }];
52
141
 
53
- var _render = render(_react.default.createElement(_.default, {
142
+ var _render3 = render(_react.default.createElement(_.default, {
54
143
  title: "Wizard Title",
55
144
  visible: true,
56
145
  activeStep: 1,
@@ -61,7 +150,7 @@ describe('Wizard', function () {
61
150
  },
62
151
  steps: steps
63
152
  })),
64
- getByRole = _render.getByRole;
153
+ getByRole = _render3.getByRole;
65
154
 
66
155
  var modal = getByRole('dialog');
67
156
  expect(modal).toHaveStyle('max-width: 650px');
@@ -86,7 +175,7 @@ describe('Wizard', function () {
86
175
  })
87
176
  }];
88
177
 
89
- var _render2 = render(_react.default.createElement(_.default, {
178
+ var _render4 = render(_react.default.createElement(_.default, {
90
179
  title: "Wizard Title",
91
180
  size: "extraLarge",
92
181
  visible: true,
@@ -98,7 +187,7 @@ describe('Wizard', function () {
98
187
  },
99
188
  steps: steps
100
189
  })),
101
- getByRole = _render2.getByRole;
190
+ getByRole = _render4.getByRole;
102
191
 
103
192
  var modal = getByRole('dialog');
104
193
  expect(modal).toHaveStyle("max-width: ".concat((0, _polished.rem)(_designTokens.spacing.base * 90)));
@@ -123,7 +212,7 @@ describe('Wizard', function () {
123
212
  })
124
213
  }];
125
214
 
126
- var _render3 = render(_react.default.createElement(_.default, {
215
+ var _render5 = render(_react.default.createElement(_.default, {
127
216
  title: "Wizard Title",
128
217
  visible: true,
129
218
  activeStep: 1,
@@ -134,7 +223,7 @@ describe('Wizard', function () {
134
223
  },
135
224
  steps: steps
136
225
  })),
137
- getByRole = _render3.getByRole;
226
+ getByRole = _render5.getByRole;
138
227
 
139
228
  var modal = getByRole('dialog');
140
229
  expect(modal).toBeInTheDocument();
@@ -161,7 +250,7 @@ describe('Wizard', function () {
161
250
  })
162
251
  }];
163
252
 
164
- var _render4 = render(_react.default.createElement(_.default, {
253
+ var _render6 = render(_react.default.createElement(_.default, {
165
254
  title: "Wizard Title",
166
255
  visible: true,
167
256
  activeStep: 1,
@@ -172,7 +261,7 @@ describe('Wizard', function () {
172
261
  },
173
262
  steps: steps
174
263
  })),
175
- getByRole = _render4.getByRole;
264
+ getByRole = _render6.getByRole;
176
265
 
177
266
  var modal = getByRole('dialog');
178
267
  expect(modal).toBeInTheDocument();
@@ -202,7 +291,7 @@ describe('Wizard', function () {
202
291
  })
203
292
  }];
204
293
 
205
- var _render5 = render(_react.default.createElement(_.default, {
294
+ var _render7 = render(_react.default.createElement(_.default, {
206
295
  title: "Wizard Title",
207
296
  visible: true,
208
297
  activeStep: activeStep,
@@ -213,7 +302,7 @@ describe('Wizard', function () {
213
302
  },
214
303
  steps: steps
215
304
  })),
216
- getByRole = _render5.getByRole;
305
+ getByRole = _render7.getByRole;
217
306
 
218
307
  var modal = getByRole('dialog');
219
308
  expect(modal).toBeInTheDocument();
@@ -242,7 +331,7 @@ describe('Wizard', function () {
242
331
  })
243
332
  }];
244
333
 
245
- var _render6 = render(_react.default.createElement(_.default, {
334
+ var _render8 = render(_react.default.createElement(_.default, {
246
335
  title: "Wizard Title",
247
336
  visible: true,
248
337
  onCancel: onCancelMock,
@@ -254,7 +343,7 @@ describe('Wizard', function () {
254
343
  },
255
344
  steps: steps
256
345
  })),
257
- getByRole = _render6.getByRole;
346
+ getByRole = _render8.getByRole;
258
347
 
259
348
  var modal = getByRole('dialog');
260
349
  expect(modal).toBeInTheDocument();
@@ -285,7 +374,7 @@ describe('Wizard', function () {
285
374
  })
286
375
  }];
287
376
 
288
- var _render7 = render(_react.default.createElement(_.default, {
377
+ var _render9 = render(_react.default.createElement(_.default, {
289
378
  title: "Wizard Title",
290
379
  visible: true,
291
380
  activeStep: 1,
@@ -296,7 +385,7 @@ describe('Wizard', function () {
296
385
  },
297
386
  steps: steps
298
387
  })),
299
- getByRole = _render7.getByRole;
388
+ getByRole = _render9.getByRole;
300
389
 
301
390
  var modal = getByRole('dialog');
302
391
  expect(modal).toBeInTheDocument();
@@ -327,7 +416,7 @@ describe('Wizard', function () {
327
416
  }
328
417
  }];
329
418
 
330
- var _render8 = render(_react.default.createElement(_.default, {
419
+ var _render10 = render(_react.default.createElement(_.default, {
331
420
  title: "Wizard Title",
332
421
  visible: true,
333
422
  activeStep: steps.length,
@@ -338,7 +427,7 @@ describe('Wizard', function () {
338
427
  },
339
428
  steps: steps
340
429
  })),
341
- getByRole = _render8.getByRole;
430
+ getByRole = _render10.getByRole;
342
431
 
343
432
  var modal = getByRole('dialog');
344
433
  expect(modal).toBeInTheDocument();
@@ -371,7 +460,7 @@ describe('Wizard', function () {
371
460
  })
372
461
  }];
373
462
  it('calls the onClick from the continueProps of the active step', function () {
374
- var _render9 = render(_react.default.createElement(_.default, {
463
+ var _render11 = render(_react.default.createElement(_.default, {
375
464
  title: "Wizard Title",
376
465
  visible: true,
377
466
  activeStep: 1,
@@ -382,7 +471,7 @@ describe('Wizard', function () {
382
471
  },
383
472
  steps: steps
384
473
  })),
385
- getByRole = _render9.getByRole;
474
+ getByRole = _render11.getByRole;
386
475
 
387
476
  var modal = getByRole('dialog');
388
477
  expect(modal).toBeInTheDocument();
@@ -421,7 +510,7 @@ describe('Wizard', function () {
421
510
  })
422
511
  }];
423
512
 
424
- var _render10 = render(_react.default.createElement(_.default, {
513
+ var _render12 = render(_react.default.createElement(_.default, {
425
514
  title: "Wizard Title",
426
515
  visible: true,
427
516
  activeStep: 2,
@@ -432,7 +521,7 @@ describe('Wizard', function () {
432
521
  },
433
522
  steps: steps
434
523
  })),
435
- getByRole = _render10.getByRole;
524
+ getByRole = _render12.getByRole;
436
525
 
437
526
  var modal = getByRole('dialog');
438
527
  expect(modal).toBeInTheDocument();
@@ -463,7 +552,7 @@ describe('Wizard', function () {
463
552
  })
464
553
  }];
465
554
 
466
- var _render11 = render(_react.default.createElement(_.default, {
555
+ var _render13 = render(_react.default.createElement(_.default, {
467
556
  title: "Wizard Title",
468
557
  visible: true,
469
558
  activeStep: 1,
@@ -474,7 +563,7 @@ describe('Wizard', function () {
474
563
  },
475
564
  steps: steps
476
565
  })),
477
- getByRole = _render11.getByRole;
566
+ getByRole = _render13.getByRole;
478
567
 
479
568
  var modal = getByRole('dialog');
480
569
  expect(modal).toBeInTheDocument();
@@ -508,7 +597,7 @@ describe('Wizard', function () {
508
597
  }
509
598
  }];
510
599
  it('calls the onClick from the continueProps of the active step', function () {
511
- var _render12 = render(_react.default.createElement(_.default, {
600
+ var _render14 = render(_react.default.createElement(_.default, {
512
601
  title: "Wizard Title",
513
602
  visible: true,
514
603
  activeStep: 2,
@@ -519,7 +608,7 @@ describe('Wizard', function () {
519
608
  },
520
609
  steps: steps
521
610
  })),
522
- getByRole = _render12.getByRole;
611
+ getByRole = _render14.getByRole;
523
612
 
524
613
  var modal = getByRole('dialog');
525
614
  expect(modal).toBeInTheDocument();
@@ -554,7 +643,7 @@ describe('Wizard', function () {
554
643
  it('doesnt render if im not in the last step', function () {
555
644
  var submitCallbackMock = jest.fn();
556
645
 
557
- var _render13 = render(_react.default.createElement(_.default, {
646
+ var _render15 = render(_react.default.createElement(_.default, {
558
647
  title: "Wizard Title",
559
648
  visible: true,
560
649
  activeStep: 1,
@@ -563,7 +652,7 @@ describe('Wizard', function () {
563
652
  },
564
653
  steps: steps
565
654
  })),
566
- getByRole = _render13.getByRole;
655
+ getByRole = _render15.getByRole;
567
656
 
568
657
  var modal = getByRole('dialog');
569
658
  expect((0, _react2.within)(modal).queryByText(/submit/i)).not.toBeInTheDocument();
@@ -571,7 +660,7 @@ describe('Wizard', function () {
571
660
  it('renders if im in the last step', function () {
572
661
  var submitCallbackMock = jest.fn();
573
662
 
574
- var _render14 = render(_react.default.createElement(_.default, {
663
+ var _render16 = render(_react.default.createElement(_.default, {
575
664
  title: "Wizard Title",
576
665
  visible: true,
577
666
  activeStep: steps.length,
@@ -580,7 +669,7 @@ describe('Wizard', function () {
580
669
  },
581
670
  steps: steps
582
671
  })),
583
- getByRole = _render14.getByRole;
672
+ getByRole = _render16.getByRole;
584
673
 
585
674
  var modal = getByRole('dialog');
586
675
  expect((0, _react2.within)(modal).getByText(/submit/i)).toBeInTheDocument();
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/components/Wizard/schema.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,MAAM,KAAsC,CAAC;AA6CnD,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/components/Wizard/schema.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,MAAM,KAAsC,CAAC;AAgDnD,eAAe,MAAM,CAAC"}
@@ -23,15 +23,16 @@ schema.propTypes = {
23
23
  title: _reactDesc.PropTypes.string.isRequired,
24
24
  content: _reactDesc.PropTypes.node.isRequired,
25
25
  previousButtonProps: _reactDesc.PropTypes.shape({
26
- onClick: _reactDesc.PropTypes.func.isRequired
26
+ onClick: _reactDesc.PropTypes.func
27
27
  }),
28
28
  nextButtonProps: _reactDesc.PropTypes.shape({
29
- onClick: _reactDesc.PropTypes.func.isRequired
29
+ onClick: _reactDesc.PropTypes.func
30
30
  })
31
31
  })).description('Define the steps to render in the wizard. For more info on the usage, see the Step Props table below').isRequired,
32
32
  submitButtonProps: _reactDesc.PropTypes.shape({
33
33
  onClick: _reactDesc.PropTypes.func.isRequired
34
- }).description('the props to pass to the submit button, this button is rendered by default in the last stesp').isRequired
34
+ }).description('the props to pass to the submit button, this button is rendered by default in the last stesp'),
35
+ renderActions: _reactDesc.PropTypes.func.description('Function to render custom action buttons. It receives an object with the current step, step index, isFirstStep, isLastStep and the default actions as parameters')
35
36
  };
36
37
  var _default = schema;
37
38
  exports.default = _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decisiv/ui-components",
3
- "version": "2.0.1-alpha.222",
3
+ "version": "2.0.1-alpha.223",
4
4
  "description": "Decisiv's design system React components",
5
5
  "author": "Decisiv UI Development Team",
6
6
  "license": "MIT",
@@ -39,6 +39,7 @@
39
39
  "react-beautiful-dnd": "^13.0.0",
40
40
  "react-desc": "^4.1.2",
41
41
  "react-popper": "^1.3.3",
42
+ "react-window": "^1.8.10",
42
43
  "styled-components-modifiers": "^1.2.5",
43
44
  "styled-theming": "^2.2.0",
44
45
  "stylis-plugin-extra-scope": "^0.1.1"
@@ -61,6 +62,7 @@
61
62
  "@types/prop-types": "^15.7.1",
62
63
  "@types/react": "^16.8.22",
63
64
  "@types/react-beautiful-dnd": "^13.0.0",
65
+ "@types/react-window": "^1.8.5",
64
66
  "@types/styled-components": "^4.1.15",
65
67
  "@types/styled-theming": "^2.2.2",
66
68
  "babel-plugin-styled-components": "^1.10.6",