@pingux/astro 2.206.2-alpha.0 → 2.207.0-alpha.0

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.
Files changed (27) hide show
  1. package/lib/cjs/components/Button/Buttons.styles.d.ts +14 -0
  2. package/lib/cjs/components/Button/Buttons.styles.js +11 -1
  3. package/lib/cjs/components/TableBase/TableBase.js +138 -32
  4. package/lib/cjs/components/TableBase/TableBase.mdx +46 -13
  5. package/lib/cjs/components/TableBase/TableBase.stories.js +52 -2
  6. package/lib/cjs/components/TableBase/TableBase.styles.d.ts +84 -9
  7. package/lib/cjs/components/TableBase/TableBase.styles.js +61 -10
  8. package/lib/cjs/components/TableBase/TableBase.test.js +585 -105
  9. package/lib/cjs/styles/themeOverrides/nextGenDarkMode/variants/variants.d.ts +14 -0
  10. package/lib/cjs/styles/themeOverrides/nextGenDarkMode/variants/variants.js +16 -2
  11. package/lib/cjs/styles/themes/next-gen/next-gen.d.ts +10 -0
  12. package/lib/cjs/styles/themes/next-gen/variants/button.d.ts +7 -0
  13. package/lib/cjs/styles/themes/next-gen/variants/button.js +4 -1
  14. package/lib/cjs/styles/themes/next-gen/variants/tableBase.d.ts +3 -0
  15. package/lib/cjs/styles/themes/next-gen/variants/tableBase.js +6 -1
  16. package/lib/cjs/styles/themes/next-gen/variants/variants.d.ts +3 -0
  17. package/lib/cjs/types/tableBase.d.ts +21 -5
  18. package/lib/components/Button/Buttons.styles.js +11 -1
  19. package/lib/components/TableBase/TableBase.js +139 -33
  20. package/lib/components/TableBase/TableBase.mdx +46 -13
  21. package/lib/components/TableBase/TableBase.stories.js +51 -1
  22. package/lib/components/TableBase/TableBase.styles.js +61 -10
  23. package/lib/components/TableBase/TableBase.test.js +585 -105
  24. package/lib/styles/themeOverrides/nextGenDarkMode/variants/variants.js +16 -2
  25. package/lib/styles/themes/next-gen/variants/button.js +4 -1
  26. package/lib/styles/themes/next-gen/variants/tableBase.js +6 -1
  27. package/package.json +1 -1
@@ -13,6 +13,7 @@ var _Symbol$iterator = require("@babel/runtime-corejs3/core-js-stable/symbol/ite
13
13
  var _reverseInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/reverse");
14
14
  var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
15
15
  var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
16
+ var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));
16
17
  var _sort2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/sort"));
17
18
  var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int"));
18
19
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));
@@ -21,6 +22,7 @@ var _react = _interopRequireDefault(require("react"));
21
22
  var _reactStately = require("react-stately");
22
23
  var _react2 = require("@testing-library/react");
23
24
  var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
25
+ var _jestAxe = require("jest-axe");
24
26
  var _index = require("../../index");
25
27
  var _universalComponentTest = require("../../utils/testUtils/universalComponentTest");
26
28
  var _TableBase = _interopRequireDefault(require("./TableBase"));
@@ -89,8 +91,6 @@ var getComponent = function getComponent() {
89
91
  });
90
92
  })));
91
93
  };
92
-
93
- // Needs to be added to each components test file
94
94
  (0, _universalComponentTest.universalComponentTests)({
95
95
  renderComponent: function renderComponent(props) {
96
96
  return (0, _react3.jsx)(_TableBase["default"], (0, _extends2["default"])({}, defaultProps, props), (0, _react3.jsx)(_index.THead, {
@@ -172,26 +172,205 @@ test('should change selection on mouse press', /*#__PURE__*/(0, _asyncToGenerato
172
172
  }
173
173
  }, _callee);
174
174
  })));
175
+ test('should NOT change selection on row body click when hasSelectionCheckboxes is true', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
176
+ var rows, firstBodyRowCells;
177
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
178
+ while (1) switch (_context2.prev = _context2.next) {
179
+ case 0:
180
+ getComponent({
181
+ selectionMode: 'multiple',
182
+ hasSelectionCheckboxes: true
183
+ });
184
+ rows = _react2.screen.getAllByRole('row'); // Click on a cell (the actual user target) — cell-level stopPropagation prevents
185
+ // the row's press handler from firing, so no selection is triggered.
186
+ firstBodyRowCells = rows[1].querySelectorAll('td');
187
+ expect(rows[1]).not.toHaveClass('is-selected');
188
+ _context2.next = 6;
189
+ return _userEvent["default"].click(firstBodyRowCells[1]);
190
+ case 6:
191
+ expect(rows[1]).not.toHaveClass('is-selected');
192
+ case 7:
193
+ case "end":
194
+ return _context2.stop();
195
+ }
196
+ }, _callee2);
197
+ })));
198
+ test('should change selection via checkbox when hasSelectionCheckboxes is true', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
199
+ var rows, firstRowCheckbox;
200
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
201
+ while (1) switch (_context3.prev = _context3.next) {
202
+ case 0:
203
+ getComponent({
204
+ selectionMode: 'multiple',
205
+ hasSelectionCheckboxes: true
206
+ });
207
+ rows = _react2.screen.getAllByRole('row');
208
+ firstRowCheckbox = (0, _react2.within)(rows[1]).getByRole('checkbox');
209
+ expect(rows[1]).not.toHaveClass('is-selected');
210
+ _context3.next = 6;
211
+ return _userEvent["default"].click(firstRowCheckbox);
212
+ case 6:
213
+ expect(rows[1]).toHaveClass('is-selected');
214
+ case 7:
215
+ case "end":
216
+ return _context3.stop();
217
+ }
218
+ }, _callee3);
219
+ })));
220
+ test('mousedown on a cell does not bubble to row via React synthetic event', function () {
221
+ // Verify that the cell-level stopPropagation approach prevents the row's React
222
+ // onMouseDown handler from firing. We test this with a simple isolated component
223
+ // that matches the structure used in TableCell (mergeProps with stopPropagation).
224
+ // The full integration is covered by the hasSelectionCheckboxes test above.
225
+ var rowSpy = jest.fn();
226
+ (0, _react2.render)((0, _react3.jsx)("table", null, (0, _react3.jsx)("tbody", null, (0, _react3.jsx)("tr", {
227
+ "data-testid": "test-row",
228
+ onMouseDown: rowSpy
229
+ }, (0, _react3.jsx)("td", {
230
+ "data-testid": "test-cell",
231
+ onMouseDown: function onMouseDown(e) {
232
+ return e.stopPropagation();
233
+ }
234
+ }, "cell content")))));
235
+ _react2.fireEvent.mouseDown(_react2.screen.getByTestId('test-cell'));
236
+ // The row's React onMouseDown should not have fired because stopPropagation
237
+ // was called on the td's synthetic onMouseDown handler.
238
+ expect(rowSpy).not.toHaveBeenCalled();
239
+ });
240
+ test('should toggle selection on Enter key when row is focused', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
241
+ var rows;
242
+ return _regeneratorRuntime().wrap(function _callee4$(_context4) {
243
+ while (1) switch (_context4.prev = _context4.next) {
244
+ case 0:
245
+ getComponent({
246
+ selectionMode: 'multiple'
247
+ });
248
+ rows = _react2.screen.getAllByRole('row');
249
+ _context4.next = 4;
250
+ return _userEvent["default"].tab();
251
+ case 4:
252
+ expect(rows[1]).toHaveFocus();
253
+ expect(rows[1]).not.toHaveClass('is-selected');
254
+ _react2.fireEvent.keyDown(rows[1], {
255
+ key: 'Enter'
256
+ });
257
+ expect(rows[1]).toHaveClass('is-selected');
258
+ _react2.fireEvent.keyDown(rows[1], {
259
+ key: 'Enter'
260
+ });
261
+ expect(rows[1]).not.toHaveClass('is-selected');
262
+ case 10:
263
+ case "end":
264
+ return _context4.stop();
265
+ }
266
+ }, _callee4);
267
+ })));
268
+ test('Enter key should toggle selection on focused row with checkboxes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
269
+ var rows;
270
+ return _regeneratorRuntime().wrap(function _callee5$(_context5) {
271
+ while (1) switch (_context5.prev = _context5.next) {
272
+ case 0:
273
+ getComponent({
274
+ selectionMode: 'multiple'
275
+ });
276
+ rows = _react2.screen.getAllByRole('row');
277
+ _context5.next = 4;
278
+ return _userEvent["default"].tab();
279
+ case 4:
280
+ expect(rows[1]).toHaveFocus();
281
+ expect(rows[1]).not.toHaveClass('is-selected');
282
+ _react2.fireEvent.keyDown(rows[1], {
283
+ key: 'Enter'
284
+ });
285
+ expect(rows[1]).toHaveClass('is-selected');
286
+ case 8:
287
+ case "end":
288
+ return _context5.stop();
289
+ }
290
+ }, _callee5);
291
+ })));
292
+ test('Enter key should not change selection when selectionMode is none', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
293
+ var rows;
294
+ return _regeneratorRuntime().wrap(function _callee6$(_context6) {
295
+ while (1) switch (_context6.prev = _context6.next) {
296
+ case 0:
297
+ getComponent();
298
+ rows = _react2.screen.getAllByRole('row');
299
+ _context6.next = 4;
300
+ return _userEvent["default"].tab();
301
+ case 4:
302
+ expect(rows[1]).toHaveFocus();
303
+ expect(rows[1]).not.toHaveClass('is-selected');
304
+ _react2.fireEvent.keyDown(rows[1], {
305
+ key: 'Enter'
306
+ });
307
+ expect(rows[1]).not.toHaveClass('is-selected');
308
+ case 8:
309
+ case "end":
310
+ return _context6.stop();
311
+ }
312
+ }, _callee6);
313
+ })));
314
+ test('Enter key should toggle a row checkbox when the checkbox input is focused', function () {
315
+ getComponent({
316
+ selectionMode: 'multiple'
317
+ });
318
+ var rows = _react2.screen.getAllByRole('row');
319
+ var checkboxes = _react2.screen.getAllByRole('checkbox');
320
+ expect(rows[1]).not.toHaveClass('is-selected');
321
+ // focus() triggers React Aria focus state updates and must be wrapped in act
322
+ (0, _react2.act)(function () {
323
+ checkboxes[1].focus();
324
+ });
325
+ _react2.fireEvent.keyDown(checkboxes[1], {
326
+ key: 'Enter'
327
+ });
328
+ expect(rows[1]).toHaveClass('is-selected');
329
+ _react2.fireEvent.keyDown(checkboxes[1], {
330
+ key: 'Enter'
331
+ });
332
+ expect(rows[1]).not.toHaveClass('is-selected');
333
+ });
334
+ test('Enter key should toggle select-all checkbox when it is focused', function () {
335
+ var _context7, _context8;
336
+ getComponent({
337
+ selectionMode: 'multiple'
338
+ });
339
+ var rows = _react2.screen.getAllByRole('row');
340
+ var selectAllCheckbox = _react2.screen.getByTestId('select-all-checkbox');
341
+ (0, _forEach["default"])(_context7 = (0, _slice["default"])(rows).call(rows, 1)).call(_context7, function (row) {
342
+ return expect(row).not.toHaveClass('is-selected');
343
+ });
344
+ (0, _react2.act)(function () {
345
+ selectAllCheckbox.focus();
346
+ });
347
+ _react2.fireEvent.keyDown(selectAllCheckbox, {
348
+ key: 'Enter'
349
+ });
350
+ (0, _forEach["default"])(_context8 = (0, _slice["default"])(rows).call(rows, 1)).call(_context8, function (row) {
351
+ return expect(row).toHaveClass('is-selected');
352
+ });
353
+ });
175
354
  test('should change select all checkbox on mouse press', function () {
176
355
  getComponent({
177
356
  selectionMode: 'multiple'
178
357
  });
179
358
  var rows = _react2.screen.getAllByRole('row');
180
359
  (0, _forEach["default"])(rows).call(rows, /*#__PURE__*/function () {
181
- var _ref2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(element) {
182
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
183
- while (1) switch (_context2.prev = _context2.next) {
360
+ var _ref7 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee7(element) {
361
+ return _regeneratorRuntime().wrap(function _callee7$(_context9) {
362
+ while (1) switch (_context9.prev = _context9.next) {
184
363
  case 0:
185
- _context2.next = 2;
364
+ _context9.next = 2;
186
365
  return _userEvent["default"].click(element);
187
366
  case 2:
188
367
  case "end":
189
- return _context2.stop();
368
+ return _context9.stop();
190
369
  }
191
- }, _callee2);
370
+ }, _callee7);
192
371
  }));
193
372
  return function (_x) {
194
- return _ref2.apply(this, arguments);
373
+ return _ref7.apply(this, arguments);
195
374
  };
196
375
  }());
197
376
  var headerCheckbox = _react2.screen.getByTestId('select-all-checkbox');
@@ -213,31 +392,31 @@ test('should checked checkboxes if selected keys are provided', function () {
213
392
  var headerCheckbox = _react2.screen.getByTestId('select-all-checkbox');
214
393
  expect(headerCheckbox).toBePartiallyChecked();
215
394
  });
216
- test('tab key should focus on the first cell of the first row', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
395
+ test('tab key should focus on the first cell of the first row', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {
217
396
  var rows;
218
- return _regeneratorRuntime().wrap(function _callee3$(_context3) {
219
- while (1) switch (_context3.prev = _context3.next) {
397
+ return _regeneratorRuntime().wrap(function _callee8$(_context0) {
398
+ while (1) switch (_context0.prev = _context0.next) {
220
399
  case 0:
221
400
  getComponent();
222
401
  rows = _react2.screen.getAllByRole('row');
223
- _context3.next = 4;
402
+ _context0.next = 4;
224
403
  return _userEvent["default"].tab();
225
404
  case 4:
226
405
  expect(rows[1]).toHaveFocus();
227
406
  case 5:
228
407
  case "end":
229
- return _context3.stop();
408
+ return _context0.stop();
230
409
  }
231
- }, _callee3);
410
+ }, _callee8);
232
411
  })));
233
- test('Arrow Down key should focus the next row', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
412
+ test('Arrow Down key should focus the next row', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
234
413
  var rows;
235
- return _regeneratorRuntime().wrap(function _callee4$(_context4) {
236
- while (1) switch (_context4.prev = _context4.next) {
414
+ return _regeneratorRuntime().wrap(function _callee9$(_context1) {
415
+ while (1) switch (_context1.prev = _context1.next) {
237
416
  case 0:
238
417
  getComponent();
239
418
  rows = _react2.screen.getAllByRole('row');
240
- _context4.next = 4;
419
+ _context1.next = 4;
241
420
  return _userEvent["default"].tab();
242
421
  case 4:
243
422
  expect(rows[1]).toHaveFocus();
@@ -257,18 +436,18 @@ test('Arrow Down key should focus the next row', /*#__PURE__*/(0, _asyncToGenera
257
436
  expect(rows[3]).toHaveFocus();
258
437
  case 11:
259
438
  case "end":
260
- return _context4.stop();
439
+ return _context1.stop();
261
440
  }
262
- }, _callee4);
441
+ }, _callee9);
263
442
  })));
264
- test('Arrow Up key should focus the next row', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
443
+ test('Arrow Up key should focus the next row', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee0() {
265
444
  var rows, columnheader;
266
- return _regeneratorRuntime().wrap(function _callee5$(_context5) {
267
- while (1) switch (_context5.prev = _context5.next) {
445
+ return _regeneratorRuntime().wrap(function _callee0$(_context10) {
446
+ while (1) switch (_context10.prev = _context10.next) {
268
447
  case 0:
269
448
  getComponent();
270
449
  rows = _react2.screen.getAllByRole('row');
271
- _context5.next = 4;
450
+ _context10.next = 4;
272
451
  return _userEvent["default"].tab();
273
452
  case 4:
274
453
  expect(rows[1]).toHaveFocus();
@@ -282,20 +461,20 @@ test('Arrow Up key should focus the next row', /*#__PURE__*/(0, _asyncToGenerato
282
461
  expect(columnheader[0]).toHaveFocus();
283
462
  case 9:
284
463
  case "end":
285
- return _context5.stop();
464
+ return _context10.stop();
286
465
  }
287
- }, _callee5);
466
+ }, _callee0);
288
467
  })));
289
- test('Arrow Right move the focus to next cell', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
468
+ test('Arrow Right move the focus to next cell', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee1() {
290
469
  var rows, firstRow, tableCells;
291
- return _regeneratorRuntime().wrap(function _callee6$(_context6) {
292
- while (1) switch (_context6.prev = _context6.next) {
470
+ return _regeneratorRuntime().wrap(function _callee1$(_context11) {
471
+ while (1) switch (_context11.prev = _context11.next) {
293
472
  case 0:
294
473
  getComponent();
295
474
  rows = _react2.screen.getAllByRole('row');
296
475
  firstRow = _react2.screen.getAllByRole('row')[1];
297
476
  tableCells = firstRow.querySelectorAll('td');
298
- _context6.next = 6;
477
+ _context11.next = 6;
299
478
  return _userEvent["default"].tab();
300
479
  case 6:
301
480
  expect(rows[1]).toHaveFocus();
@@ -329,20 +508,20 @@ test('Arrow Right move the focus to next cell', /*#__PURE__*/(0, _asyncToGenerat
329
508
  expect(rows[1]).toHaveFocus();
330
509
  case 19:
331
510
  case "end":
332
- return _context6.stop();
511
+ return _context11.stop();
333
512
  }
334
- }, _callee6);
513
+ }, _callee1);
335
514
  })));
336
- test('Arrow Left move the focus to next cell', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {
515
+ test('Arrow Left move the focus to next cell', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee10() {
337
516
  var rows, firstRow, tableCells;
338
- return _regeneratorRuntime().wrap(function _callee7$(_context7) {
339
- while (1) switch (_context7.prev = _context7.next) {
517
+ return _regeneratorRuntime().wrap(function _callee10$(_context12) {
518
+ while (1) switch (_context12.prev = _context12.next) {
340
519
  case 0:
341
520
  getComponent();
342
521
  rows = _react2.screen.getAllByRole('row');
343
522
  firstRow = _react2.screen.getAllByRole('row')[1];
344
523
  tableCells = firstRow.querySelectorAll('td');
345
- _context7.next = 6;
524
+ _context12.next = 6;
346
525
  return _userEvent["default"].tab();
347
526
  case 6:
348
527
  expect(rows[1]).toHaveFocus();
@@ -376,10 +555,311 @@ test('Arrow Left move the focus to next cell', /*#__PURE__*/(0, _asyncToGenerato
376
555
  expect(rows[1]).toHaveFocus();
377
556
  case 19:
378
557
  case "end":
379
- return _context7.stop();
558
+ return _context12.stop();
380
559
  }
381
- }, _callee7);
560
+ }, _callee10);
382
561
  })));
562
+ describe('Resizable columns', function () {
563
+ var resizableHeaders = [{
564
+ key: 'name',
565
+ name: 'Name'
566
+ }, {
567
+ key: 'value',
568
+ name: 'Value'
569
+ }];
570
+ var resizableObjects = [{
571
+ key: '1',
572
+ name: 'Alpha',
573
+ value: '10'
574
+ }, {
575
+ key: '2',
576
+ name: 'Beta',
577
+ value: '20'
578
+ }];
579
+ test('renders resize slider input for a resizable column', function () {
580
+ (0, _react2.render)((0, _react3.jsx)(_TableBase["default"], {
581
+ "aria-label": "resizable table"
582
+ }, (0, _react3.jsx)(_index.THead, {
583
+ columns: resizableHeaders
584
+ }, function (head) {
585
+ return (0, _react3.jsx)(_index.Column, {
586
+ key: head.key,
587
+ allowsResizing: true
588
+ }, head.name);
589
+ }), (0, _react3.jsx)(_index.TBody, {
590
+ items: resizableObjects
591
+ }, function (row) {
592
+ return (0, _react3.jsx)(_index.Row, {
593
+ key: row.key
594
+ }, function (columnKey) {
595
+ return (0, _react3.jsx)(_index.Cell, null, row[columnKey]);
596
+ });
597
+ })));
598
+
599
+ // Each resizable column renders a visually-hidden <input type="range">
600
+ // accessible as role="slider" with an aria-label containing the column name
601
+ var slider = _react2.screen.getByRole('slider', {
602
+ name: /Name column width/i
603
+ });
604
+ expect(slider).toBeInTheDocument();
605
+ expect(_react2.screen.getByRole('slider', {
606
+ name: /Value column width/i
607
+ })).toBeInTheDocument();
608
+ });
609
+ test('resizable table has no accessibility violations', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee11() {
610
+ var _render, container, results;
611
+ return _regeneratorRuntime().wrap(function _callee11$(_context13) {
612
+ while (1) switch (_context13.prev = _context13.next) {
613
+ case 0:
614
+ jest.useRealTimers();
615
+ _render = (0, _react2.render)((0, _react3.jsx)(_TableBase["default"], {
616
+ "aria-label": "resizable table"
617
+ }, (0, _react3.jsx)(_index.THead, {
618
+ columns: resizableHeaders
619
+ }, function (head) {
620
+ return (0, _react3.jsx)(_index.Column, {
621
+ key: head.key,
622
+ allowsResizing: true
623
+ }, head.name);
624
+ }), (0, _react3.jsx)(_index.TBody, {
625
+ items: resizableObjects
626
+ }, function (row) {
627
+ return (0, _react3.jsx)(_index.Row, {
628
+ key: row.key
629
+ }, function (columnKey) {
630
+ return (0, _react3.jsx)(_index.Cell, null, row[columnKey]);
631
+ });
632
+ }))), container = _render.container;
633
+ _context13.next = 4;
634
+ return (0, _jestAxe.axe)(container);
635
+ case 4:
636
+ results = _context13.sent;
637
+ jest.useFakeTimers();
638
+ expect(results).toHaveNoViolations();
639
+ case 7:
640
+ case "end":
641
+ return _context13.stop();
642
+ }
643
+ }, _callee11);
644
+ })));
645
+ test('does not render resize slider input for a non-resizable column', function () {
646
+ (0, _react2.render)((0, _react3.jsx)(_TableBase["default"], {
647
+ "aria-label": "non-resizable table"
648
+ }, (0, _react3.jsx)(_index.THead, {
649
+ columns: resizableHeaders
650
+ }, function (head) {
651
+ return (0, _react3.jsx)(_index.Column, {
652
+ key: head.key
653
+ }, head.name);
654
+ }), (0, _react3.jsx)(_index.TBody, {
655
+ items: resizableObjects
656
+ }, function (row) {
657
+ return (0, _react3.jsx)(_index.Row, {
658
+ key: row.key
659
+ }, function (columnKey) {
660
+ return (0, _react3.jsx)(_index.Cell, null, row[columnKey]);
661
+ });
662
+ })));
663
+ expect(_react2.screen.queryByRole('slider')).not.toBeInTheDocument();
664
+ });
665
+ describe('keyboard resizing', function () {
666
+ var getResizableWithCallbacks = function getResizableWithCallbacks() {
667
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
668
+ return (0, _react2.render)((0, _react3.jsx)(_TableBase["default"], (0, _extends2["default"])({
669
+ "aria-label": "resizable table"
670
+ }, props), (0, _react3.jsx)(_index.THead, {
671
+ columns: resizableHeaders
672
+ }, function (head) {
673
+ return (0, _react3.jsx)(_index.Column, {
674
+ key: head.key,
675
+ allowsResizing: true
676
+ }, head.name);
677
+ }), (0, _react3.jsx)(_index.TBody, {
678
+ items: resizableObjects
679
+ }, function (row) {
680
+ return (0, _react3.jsx)(_index.Row, {
681
+ key: row.key
682
+ }, function (columnKey) {
683
+ return (0, _react3.jsx)(_index.Cell, null, row[columnKey]);
684
+ });
685
+ })));
686
+ };
687
+ test('Enter on resizer input starts resize and calls onResizeStart', function () {
688
+ var onResizeStart = jest.fn();
689
+ getResizableWithCallbacks({
690
+ onResizeStart: onResizeStart
691
+ });
692
+ var slider = _react2.screen.getByRole('slider', {
693
+ name: /Name column width/i
694
+ });
695
+ (0, _react2.act)(function () {
696
+ slider.focus();
697
+ });
698
+ _react2.fireEvent.keyDown(slider, {
699
+ key: 'Enter'
700
+ });
701
+ expect(onResizeStart).toHaveBeenCalledTimes(1);
702
+ });
703
+ test('ArrowRight during active resize calls onResize', function () {
704
+ var onResize = jest.fn();
705
+ getResizableWithCallbacks({
706
+ onResize: onResize
707
+ });
708
+ var slider = _react2.screen.getByRole('slider', {
709
+ name: /Name column width/i
710
+ });
711
+ (0, _react2.act)(function () {
712
+ slider.focus();
713
+ });
714
+ _react2.fireEvent.keyDown(slider, {
715
+ key: 'Enter'
716
+ });
717
+ _react2.fireEvent.keyDown(slider, {
718
+ key: 'ArrowRight'
719
+ });
720
+ expect(onResize).toHaveBeenCalledTimes(1);
721
+ });
722
+ test('ArrowLeft during active resize calls onResize', function () {
723
+ var onResize = jest.fn();
724
+ getResizableWithCallbacks({
725
+ onResize: onResize
726
+ });
727
+ var slider = _react2.screen.getByRole('slider', {
728
+ name: /Name column width/i
729
+ });
730
+ (0, _react2.act)(function () {
731
+ slider.focus();
732
+ });
733
+ _react2.fireEvent.keyDown(slider, {
734
+ key: 'Enter'
735
+ });
736
+ _react2.fireEvent.keyDown(slider, {
737
+ key: 'ArrowLeft'
738
+ });
739
+ expect(onResize).toHaveBeenCalledTimes(1);
740
+ });
741
+ test('multiple ArrowRight presses each call onResize', function () {
742
+ var onResize = jest.fn();
743
+ getResizableWithCallbacks({
744
+ onResize: onResize
745
+ });
746
+ var slider = _react2.screen.getByRole('slider', {
747
+ name: /Name column width/i
748
+ });
749
+ (0, _react2.act)(function () {
750
+ slider.focus();
751
+ });
752
+ _react2.fireEvent.keyDown(slider, {
753
+ key: 'Enter'
754
+ });
755
+ _react2.fireEvent.keyDown(slider, {
756
+ key: 'ArrowRight'
757
+ });
758
+ _react2.fireEvent.keyDown(slider, {
759
+ key: 'ArrowRight'
760
+ });
761
+ _react2.fireEvent.keyDown(slider, {
762
+ key: 'ArrowRight'
763
+ });
764
+ expect(onResize).toHaveBeenCalledTimes(3);
765
+ });
766
+ test('Escape ends resize and calls onResizeEnd', function () {
767
+ var onResizeEnd = jest.fn();
768
+ getResizableWithCallbacks({
769
+ onResizeEnd: onResizeEnd
770
+ });
771
+ var slider = _react2.screen.getByRole('slider', {
772
+ name: /Name column width/i
773
+ });
774
+ (0, _react2.act)(function () {
775
+ slider.focus();
776
+ });
777
+ _react2.fireEvent.keyDown(slider, {
778
+ key: 'Enter'
779
+ });
780
+ _react2.fireEvent.keyDown(slider, {
781
+ key: 'Escape'
782
+ });
783
+ expect(onResizeEnd).toHaveBeenCalledTimes(1);
784
+ });
785
+ test('Space ends resize and calls onResizeEnd', function () {
786
+ var onResizeEnd = jest.fn();
787
+ getResizableWithCallbacks({
788
+ onResizeEnd: onResizeEnd
789
+ });
790
+ var slider = _react2.screen.getByRole('slider', {
791
+ name: /Name column width/i
792
+ });
793
+ (0, _react2.act)(function () {
794
+ slider.focus();
795
+ });
796
+ _react2.fireEvent.keyDown(slider, {
797
+ key: 'Enter'
798
+ });
799
+ _react2.fireEvent.keyDown(slider, {
800
+ key: ' '
801
+ });
802
+ expect(onResizeEnd).toHaveBeenCalledTimes(1);
803
+ });
804
+ test('second Enter ends resize and calls onResizeEnd', function () {
805
+ var onResizeEnd = jest.fn();
806
+ getResizableWithCallbacks({
807
+ onResizeEnd: onResizeEnd
808
+ });
809
+ var slider = _react2.screen.getByRole('slider', {
810
+ name: /Name column width/i
811
+ });
812
+ (0, _react2.act)(function () {
813
+ slider.focus();
814
+ });
815
+ _react2.fireEvent.keyDown(slider, {
816
+ key: 'Enter'
817
+ });
818
+ _react2.fireEvent.keyDown(slider, {
819
+ key: 'Enter'
820
+ });
821
+ expect(onResizeEnd).toHaveBeenCalledTimes(1);
822
+ });
823
+ test('ArrowRight before resize starts does not call onResize', function () {
824
+ var onResize = jest.fn();
825
+ getResizableWithCallbacks({
826
+ onResize: onResize
827
+ });
828
+ var slider = _react2.screen.getByRole('slider', {
829
+ name: /Name column width/i
830
+ });
831
+ (0, _react2.act)(function () {
832
+ slider.focus();
833
+ });
834
+ _react2.fireEvent.keyDown(slider, {
835
+ key: 'ArrowRight'
836
+ });
837
+ expect(onResize).not.toHaveBeenCalled();
838
+ });
839
+ test('onResize is not called after resize ends', function () {
840
+ var onResize = jest.fn();
841
+ getResizableWithCallbacks({
842
+ onResize: onResize
843
+ });
844
+ var slider = _react2.screen.getByRole('slider', {
845
+ name: /Name column width/i
846
+ });
847
+ (0, _react2.act)(function () {
848
+ slider.focus();
849
+ });
850
+ _react2.fireEvent.keyDown(slider, {
851
+ key: 'Enter'
852
+ });
853
+ _react2.fireEvent.keyDown(slider, {
854
+ key: 'Escape'
855
+ });
856
+ _react2.fireEvent.keyDown(slider, {
857
+ key: 'ArrowRight'
858
+ });
859
+ expect(onResize).not.toHaveBeenCalled();
860
+ });
861
+ });
862
+ });
383
863
  describe('Sortable Table with useAsyncList', function () {
384
864
  var dataTestId = 'sortableTable';
385
865
  var defaultTableProps = {
@@ -392,18 +872,18 @@ describe('Sortable Table with useAsyncList', function () {
392
872
  return _load.apply(this, arguments);
393
873
  }
394
874
  function _load() {
395
- _load = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee14() {
396
- return _regeneratorRuntime().wrap(function _callee14$(_context16) {
397
- while (1) switch (_context16.prev = _context16.next) {
875
+ _load = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee20() {
876
+ return _regeneratorRuntime().wrap(function _callee20$(_context24) {
877
+ while (1) switch (_context24.prev = _context24.next) {
398
878
  case 0:
399
- return _context16.abrupt("return", {
879
+ return _context24.abrupt("return", {
400
880
  items: objects
401
881
  });
402
882
  case 1:
403
883
  case "end":
404
- return _context16.stop();
884
+ return _context24.stop();
405
885
  }
406
- }, _callee14);
886
+ }, _callee20);
407
887
  }));
408
888
  return _load.apply(this, arguments);
409
889
  }
@@ -411,13 +891,13 @@ describe('Sortable Table with useAsyncList', function () {
411
891
  return _sort.apply(this, arguments);
412
892
  }
413
893
  function _sort() {
414
- _sort = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee15(list) {
415
- var _context17;
416
- return _regeneratorRuntime().wrap(function _callee15$(_context18) {
417
- while (1) switch (_context18.prev = _context18.next) {
894
+ _sort = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee21(list) {
895
+ var _context25;
896
+ return _regeneratorRuntime().wrap(function _callee21$(_context26) {
897
+ while (1) switch (_context26.prev = _context26.next) {
418
898
  case 0:
419
899
  // eslint-disable-next-line no-param-reassign
420
- list.items = (0, _sort2["default"])(_context17 = list.items).call(_context17, function (a, b) {
900
+ list.items = (0, _sort2["default"])(_context25 = list.items).call(_context25, function (a, b) {
421
901
  var first = a[list.sortDescriptor.column];
422
902
  var second = b[list.sortDescriptor.column];
423
903
  var cmp = ((0, _parseInt2["default"])(first) || first) < ((0, _parseInt2["default"])(second) || second) // eslint-disable-line
@@ -427,17 +907,17 @@ describe('Sortable Table with useAsyncList', function () {
427
907
  }
428
908
  return cmp;
429
909
  });
430
- return _context18.abrupt("return", list);
910
+ return _context26.abrupt("return", list);
431
911
  case 2:
432
912
  case "end":
433
- return _context18.stop();
913
+ return _context26.stop();
434
914
  }
435
- }, _callee15);
915
+ }, _callee21);
436
916
  }));
437
917
  return _sort.apply(this, arguments);
438
918
  }
439
- var sortableDataTable = function sortableDataTable(_ref8) {
440
- var result = _ref8.result;
919
+ var sortableDataTable = function sortableDataTable(_ref12) {
920
+ var result = _ref12.result;
441
921
  return (0, _react2.render)((0, _react3.jsx)(_TableBase["default"], (0, _extends2["default"])({}, defaultTableProps, {
442
922
  sortDescriptor: result.current.sortDescriptor
443
923
  }), (0, _react3.jsx)(_index.THead, {
@@ -454,10 +934,10 @@ describe('Sortable Table with useAsyncList', function () {
454
934
  });
455
935
  })));
456
936
  };
457
- test('sort by country column A => Z', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee1() {
937
+ test('sort by country column A => Z', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee15() {
458
938
  var _renderHook, result, sortableTable, rowgroups, thead, headerCells, tRows;
459
- return _regeneratorRuntime().wrap(function _callee1$(_context10) {
460
- while (1) switch (_context10.prev = _context10.next) {
939
+ return _regeneratorRuntime().wrap(function _callee15$(_context18) {
940
+ while (1) switch (_context18.prev = _context18.next) {
461
941
  case 0:
462
942
  _renderHook = (0, _react2.renderHook)(function () {
463
943
  return (0, _reactStately.useAsyncList)({
@@ -469,47 +949,47 @@ describe('Sortable Table with useAsyncList', function () {
469
949
  }
470
950
  });
471
951
  }), result = _renderHook.result;
472
- _context10.next = 3;
473
- return (0, _react2.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {
474
- return _regeneratorRuntime().wrap(function _callee8$(_context8) {
475
- while (1) switch (_context8.prev = _context8.next) {
952
+ _context18.next = 3;
953
+ return (0, _react2.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee12() {
954
+ return _regeneratorRuntime().wrap(function _callee12$(_context14) {
955
+ while (1) switch (_context14.prev = _context14.next) {
476
956
  case 0:
477
957
  jest.runOnlyPendingTimers();
478
958
  case 1:
479
959
  case "end":
480
- return _context8.stop();
960
+ return _context14.stop();
481
961
  }
482
- }, _callee8);
962
+ }, _callee12);
483
963
  })));
484
964
  case 3:
485
- _context10.next = 5;
486
- return (0, _react2.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
487
- var _context9;
488
- return _regeneratorRuntime().wrap(function _callee9$(_context0) {
489
- while (1) switch (_context0.prev = _context0.next) {
965
+ _context18.next = 5;
966
+ return (0, _react2.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee13() {
967
+ var _context15;
968
+ return _regeneratorRuntime().wrap(function _callee13$(_context16) {
969
+ while (1) switch (_context16.prev = _context16.next) {
490
970
  case 0:
491
- (0, _sort2["default"])(_context9 = result.current).call(_context9, {
971
+ (0, _sort2["default"])(_context15 = result.current).call(_context15, {
492
972
  column: 'country',
493
973
  direction: 'ascending'
494
974
  });
495
975
  case 1:
496
976
  case "end":
497
- return _context0.stop();
977
+ return _context16.stop();
498
978
  }
499
- }, _callee9);
979
+ }, _callee13);
500
980
  })));
501
981
  case 5:
502
- _context10.next = 7;
503
- return (0, _react2.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee0() {
504
- return _regeneratorRuntime().wrap(function _callee0$(_context1) {
505
- while (1) switch (_context1.prev = _context1.next) {
982
+ _context18.next = 7;
983
+ return (0, _react2.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee14() {
984
+ return _regeneratorRuntime().wrap(function _callee14$(_context17) {
985
+ while (1) switch (_context17.prev = _context17.next) {
506
986
  case 0:
507
987
  jest.runOnlyPendingTimers();
508
988
  case 1:
509
989
  case "end":
510
- return _context1.stop();
990
+ return _context17.stop();
511
991
  }
512
- }, _callee0);
992
+ }, _callee14);
513
993
  })));
514
994
  case 7:
515
995
  sortableDataTable({
@@ -537,14 +1017,14 @@ describe('Sortable Table with useAsyncList', function () {
537
1017
  expect(tRows[3]).toHaveTextContent('USA');
538
1018
  case 28:
539
1019
  case "end":
540
- return _context10.stop();
1020
+ return _context18.stop();
541
1021
  }
542
- }, _callee1);
1022
+ }, _callee15);
543
1023
  })));
544
- test('sort by country column Z => A', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee13() {
1024
+ test('sort by country column Z => A', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee19() {
545
1025
  var _renderHook2, result, sortableTable, rowgroups, tRows;
546
- return _regeneratorRuntime().wrap(function _callee13$(_context15) {
547
- while (1) switch (_context15.prev = _context15.next) {
1026
+ return _regeneratorRuntime().wrap(function _callee19$(_context23) {
1027
+ while (1) switch (_context23.prev = _context23.next) {
548
1028
  case 0:
549
1029
  _renderHook2 = (0, _react2.renderHook)(function () {
550
1030
  return (0, _reactStately.useAsyncList)({
@@ -556,47 +1036,47 @@ describe('Sortable Table with useAsyncList', function () {
556
1036
  }
557
1037
  });
558
1038
  }), result = _renderHook2.result;
559
- _context15.next = 3;
560
- return (0, _react2.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee10() {
561
- return _regeneratorRuntime().wrap(function _callee10$(_context11) {
562
- while (1) switch (_context11.prev = _context11.next) {
1039
+ _context23.next = 3;
1040
+ return (0, _react2.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee16() {
1041
+ return _regeneratorRuntime().wrap(function _callee16$(_context19) {
1042
+ while (1) switch (_context19.prev = _context19.next) {
563
1043
  case 0:
564
1044
  jest.runOnlyPendingTimers();
565
1045
  case 1:
566
1046
  case "end":
567
- return _context11.stop();
1047
+ return _context19.stop();
568
1048
  }
569
- }, _callee10);
1049
+ }, _callee16);
570
1050
  })));
571
1051
  case 3:
572
- _context15.next = 5;
573
- return (0, _react2.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee11() {
574
- var _context12;
575
- return _regeneratorRuntime().wrap(function _callee11$(_context13) {
576
- while (1) switch (_context13.prev = _context13.next) {
1052
+ _context23.next = 5;
1053
+ return (0, _react2.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee17() {
1054
+ var _context20;
1055
+ return _regeneratorRuntime().wrap(function _callee17$(_context21) {
1056
+ while (1) switch (_context21.prev = _context21.next) {
577
1057
  case 0:
578
- (0, _sort2["default"])(_context12 = result.current).call(_context12, {
1058
+ (0, _sort2["default"])(_context20 = result.current).call(_context20, {
579
1059
  column: 'country',
580
1060
  direction: 'descending'
581
1061
  });
582
1062
  case 1:
583
1063
  case "end":
584
- return _context13.stop();
1064
+ return _context21.stop();
585
1065
  }
586
- }, _callee11);
1066
+ }, _callee17);
587
1067
  })));
588
1068
  case 5:
589
- _context15.next = 7;
590
- return (0, _react2.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee12() {
591
- return _regeneratorRuntime().wrap(function _callee12$(_context14) {
592
- while (1) switch (_context14.prev = _context14.next) {
1069
+ _context23.next = 7;
1070
+ return (0, _react2.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee18() {
1071
+ return _regeneratorRuntime().wrap(function _callee18$(_context22) {
1072
+ while (1) switch (_context22.prev = _context22.next) {
593
1073
  case 0:
594
1074
  jest.runOnlyPendingTimers();
595
1075
  case 1:
596
1076
  case "end":
597
- return _context14.stop();
1077
+ return _context22.stop();
598
1078
  }
599
- }, _callee12);
1079
+ }, _callee18);
600
1080
  })));
601
1081
  case 7:
602
1082
  sortableDataTable({
@@ -620,8 +1100,8 @@ describe('Sortable Table with useAsyncList', function () {
620
1100
  expect(tRows[3]).toHaveTextContent('Canada');
621
1101
  case 24:
622
1102
  case "end":
623
- return _context15.stop();
1103
+ return _context23.stop();
624
1104
  }
625
- }, _callee13);
1105
+ }, _callee19);
626
1106
  })));
627
1107
  });