@pingux/astro 1.27.0-alpha.14 → 1.27.0-alpha.16

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 (55) hide show
  1. package/lib/cjs/components/DataTable/DataTable.js +477 -0
  2. package/lib/cjs/components/DataTable/DataTable.stories.js +310 -0
  3. package/lib/cjs/components/DataTable/DataTable.styles.js +156 -0
  4. package/lib/cjs/components/DataTable/DataTable.test.js +1307 -0
  5. package/lib/cjs/components/DataTable/DataTableChip.js +63 -0
  6. package/lib/cjs/components/DataTable/DataTableChip.test.js +38 -0
  7. package/lib/cjs/components/DataTable/DataTableMenu.js +51 -0
  8. package/lib/cjs/components/DataTable/DataTableMenu.test.js +20 -0
  9. package/lib/cjs/components/DataTable/DataTableMultiLine.js +75 -0
  10. package/lib/cjs/components/DataTable/DataTableMultiLine.test.js +30 -0
  11. package/lib/cjs/components/DataTable/DataTableVirtualizer.js +188 -0
  12. package/lib/cjs/components/DataTable/index.js +54 -0
  13. package/lib/cjs/components/EnvironmentBreadcrumb/EnvironmentBreadcrumb.js +8 -2
  14. package/lib/cjs/components/EnvironmentBreadcrumb/EnvironmentBreadcrumb.test.js +35 -0
  15. package/lib/cjs/components/PageHeader/PageHeader.js +7 -1
  16. package/lib/cjs/context/DataTableContext/index.js +31 -0
  17. package/lib/cjs/index.js +67 -2
  18. package/lib/cjs/recipes/FlippableCaretMenuButton.stories.js +38 -30
  19. package/lib/cjs/recipes/ListAndPanel.stories.js +102 -87
  20. package/lib/cjs/recipes/MaskedValue.stories.js +8 -5
  21. package/lib/cjs/recipes/NeutralInput.stories.js +6 -3
  22. package/lib/cjs/recipes/OneWayToBidirectionalArrow.stories.js +38 -33
  23. package/lib/cjs/recipes/PageHeader.stories.js +73 -0
  24. package/lib/cjs/recipes/RowLineChart.stories.js +58 -70
  25. package/lib/cjs/recipes/SelectedFieldOverlay.story.js +25 -21
  26. package/lib/cjs/recipes/TrialExperienceStatusBar.stories.js +81 -72
  27. package/lib/cjs/styles/variants/variants.js +4 -1
  28. package/lib/components/DataTable/DataTable.js +431 -0
  29. package/lib/components/DataTable/DataTable.stories.js +273 -0
  30. package/lib/components/DataTable/DataTable.styles.js +137 -0
  31. package/lib/components/DataTable/DataTable.test.js +1256 -0
  32. package/lib/components/DataTable/DataTableChip.js +33 -0
  33. package/lib/components/DataTable/DataTableChip.test.js +31 -0
  34. package/lib/components/DataTable/DataTableMenu.js +24 -0
  35. package/lib/components/DataTable/DataTableMenu.test.js +13 -0
  36. package/lib/components/DataTable/DataTableMultiLine.js +46 -0
  37. package/lib/components/DataTable/DataTableMultiLine.test.js +22 -0
  38. package/lib/components/DataTable/DataTableVirtualizer.js +157 -0
  39. package/lib/components/DataTable/index.js +5 -0
  40. package/lib/components/EnvironmentBreadcrumb/EnvironmentBreadcrumb.js +7 -2
  41. package/lib/components/EnvironmentBreadcrumb/EnvironmentBreadcrumb.test.js +25 -0
  42. package/lib/components/PageHeader/PageHeader.js +8 -1
  43. package/lib/context/DataTableContext/index.js +5 -0
  44. package/lib/index.js +4 -1
  45. package/lib/recipes/FlippableCaretMenuButton.stories.js +38 -30
  46. package/lib/recipes/ListAndPanel.stories.js +102 -87
  47. package/lib/recipes/MaskedValue.stories.js +8 -5
  48. package/lib/recipes/NeutralInput.stories.js +6 -3
  49. package/lib/recipes/OneWayToBidirectionalArrow.stories.js +38 -33
  50. package/lib/recipes/PageHeader.stories.js +53 -0
  51. package/lib/recipes/RowLineChart.stories.js +58 -70
  52. package/lib/recipes/SelectedFieldOverlay.story.js +25 -21
  53. package/lib/recipes/TrialExperienceStatusBar.stories.js +81 -72
  54. package/lib/styles/variants/variants.js +3 -1
  55. package/package.json +55 -50
@@ -0,0 +1,1307 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
4
+
5
+ var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array");
6
+
7
+ var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method");
8
+
9
+ var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");
10
+
11
+ var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from");
12
+
13
+ var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");
14
+
15
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
16
+
17
+ var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");
18
+
19
+ var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");
20
+
21
+ var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");
22
+
23
+ var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");
24
+
25
+ var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");
26
+
27
+ var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");
28
+
29
+ var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");
30
+
31
+ var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
32
+
33
+ var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int"));
34
+
35
+ var _sort2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/sort"));
36
+
37
+ var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));
38
+
39
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));
40
+
41
+ var _setTimeout2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set-timeout"));
42
+
43
+ var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise"));
44
+
45
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
46
+
47
+ var _react = _interopRequireDefault(require("react"));
48
+
49
+ var _react2 = require("@testing-library/react");
50
+
51
+ var _data = require("@react-stately/data");
52
+
53
+ var _reactHooks = require("@testing-library/react-hooks");
54
+
55
+ var _DataTable = _interopRequireDefault(require("./DataTable"));
56
+
57
+ var _index = require("../../index");
58
+
59
+ var _react3 = require("@emotion/react");
60
+
61
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"]; if (!it) { if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
62
+
63
+ function _unsupportedIterableToArray(o, minLen) { var _context37; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty(_context37 = Object.prototype.toString.call(o)).call(_context37, 8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
64
+
65
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
66
+
67
+ function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
68
+
69
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context35, _context36; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context35 = ownKeys(Object(source), !0)).call(_context35, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context36 = ownKeys(Object(source))).call(_context36, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
70
+
71
+ var offsetWidth;
72
+ var offsetHeight;
73
+ beforeAll(function () {
74
+ offsetWidth = jest.spyOn(window.HTMLElement.prototype, 'clientWidth', 'get').mockImplementation(function () {
75
+ return 1000;
76
+ });
77
+ offsetHeight = jest.spyOn(window.HTMLElement.prototype, 'clientHeight', 'get').mockImplementation(function () {
78
+ return 1000;
79
+ });
80
+ jest.useFakeTimers();
81
+ });
82
+ afterAll(function () {
83
+ offsetWidth.mockReset();
84
+ offsetHeight.mockReset();
85
+ });
86
+ var columns = [{
87
+ name: 'Country',
88
+ key: 'country'
89
+ }, {
90
+ name: 'Population',
91
+ key: 'population'
92
+ }, {
93
+ name: 'Continent',
94
+ key: 'continent'
95
+ }];
96
+ var rows = [{
97
+ id: 1,
98
+ country: 'USA',
99
+ population: 320000000,
100
+ continent: 'North America'
101
+ }, {
102
+ id: 2,
103
+ country: 'Canada',
104
+ population: 37000000,
105
+ continent: 'North America'
106
+ }, {
107
+ id: 3,
108
+ country: 'China',
109
+ population: 1398000000,
110
+ continent: 'Asia'
111
+ }, {
112
+ id: 4,
113
+ country: 'France',
114
+ population: 67000000,
115
+ continent: 'Europe'
116
+ }];
117
+
118
+ var getCell = function getCell(view, text) {
119
+ // Find by text, then go up to the element with the cell role.
120
+ // eslint-disable-next-line testing-library/prefer-screen-queries
121
+ var el = view.getByText(text);
122
+
123
+ while (el && !/gridcell|rowheader|columnheader/.test(el.getAttribute('role'))) {
124
+ el = el.parentElement;
125
+ }
126
+
127
+ return el;
128
+ };
129
+
130
+ var focusCell = function focusCell(tree, text) {
131
+ return (0, _react2.act)(function () {
132
+ return getCell(tree, text).focus();
133
+ });
134
+ };
135
+
136
+ var moveFocus = function moveFocus(key) {
137
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
138
+
139
+ _react2.fireEvent.keyDown(document.activeElement, _objectSpread({
140
+ key: key
141
+ }, opts));
142
+ };
143
+
144
+ describe('Static DataTable', function () {
145
+ var testId = 'staticTable';
146
+ var defaultProps = {
147
+ 'aria-label': 'Default table with static content',
148
+ width: '100%',
149
+ height: '100%',
150
+ density: 'spacious',
151
+ 'data-testid': testId
152
+ };
153
+
154
+ var staticDataTable = function staticDataTable() {
155
+ return (0, _react2.render)((0, _react3.jsx)(_DataTable["default"], defaultProps, (0, _react3.jsx)(_index.DataTableHeader, {
156
+ columns: columns
157
+ }, function (column) {
158
+ return (0, _react3.jsx)(_index.DataTableColumn, {
159
+ align: "center"
160
+ }, column.name);
161
+ }), (0, _react3.jsx)(_index.DataTableBody, {
162
+ items: rows
163
+ }, function (item) {
164
+ return (0, _react3.jsx)(_index.DataTableRow, null, function (columnKey) {
165
+ return (0, _react3.jsx)(_index.DataTableCell, null, item[columnKey]);
166
+ });
167
+ })));
168
+ };
169
+
170
+ test('renders DataTable component with static content', function () {
171
+ staticDataTable();
172
+
173
+ var staticTable = _react2.screen.getByTestId(testId);
174
+
175
+ expect(staticTable).toBeInTheDocument();
176
+ expect(staticTable).toBeVisible();
177
+ expect(staticTable).toHaveAttribute('aria-label', 'Default table with static content');
178
+ expect(staticTable).toHaveAttribute('data-testid', testId);
179
+ expect(staticTable).toHaveAttribute('aria-rowcount', '5');
180
+ expect(staticTable).toHaveAttribute('aria-colcount', '3');
181
+ var rowgroups = (0, _react2.within)(staticTable).getAllByRole('rowgroup');
182
+ expect(rowgroups).toHaveLength(2);
183
+ var headers = (0, _react2.within)(staticTable).getAllByRole('columnheader');
184
+ expect(headers).toHaveLength(3);
185
+ expect(headers[0]).toHaveAttribute('aria-colindex', '1');
186
+ expect(headers[1]).toHaveAttribute('aria-colindex', '2');
187
+ expect(headers[2]).toHaveAttribute('aria-colindex', '3'); // eslint-disable-next-line no-unused-vars, no-restricted-syntax
188
+
189
+ var _iterator = _createForOfIteratorHelper(headers),
190
+ _step;
191
+
192
+ try {
193
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
194
+ var header = _step.value;
195
+ expect(header).not.toHaveAttribute('aria-sort');
196
+ expect(header).not.toHaveAttribute('aria-describedby');
197
+ }
198
+ } catch (err) {
199
+ _iterator.e(err);
200
+ } finally {
201
+ _iterator.f();
202
+ }
203
+
204
+ expect(headers[0]).toHaveTextContent(columns[0].name);
205
+ expect(headers[1]).toHaveTextContent(columns[1].name);
206
+ expect(headers[2]).toHaveTextContent(columns[2].name);
207
+ var tRows = (0, _react2.within)(rowgroups[1]).getAllByRole('row');
208
+ expect(tRows).toHaveLength(4);
209
+ expect(tRows[0]).toHaveAttribute('aria-rowindex', '2');
210
+ expect(tRows[1]).toHaveAttribute('aria-rowindex', '3');
211
+ expect(tRows[2]).toHaveAttribute('aria-rowindex', '4');
212
+ expect(tRows[3]).toHaveAttribute('aria-rowindex', '5');
213
+ var rowheader = (0, _react2.within)(tRows[0]).getByRole('rowheader');
214
+ expect(rowheader).toHaveTextContent(rows[0].country);
215
+ expect(rowheader).toHaveAttribute('aria-colindex', '1');
216
+ rowheader = (0, _react2.within)(tRows[1]).getByRole('rowheader');
217
+ expect(rowheader).toHaveTextContent(rows[1].country);
218
+ expect(rowheader).toHaveAttribute('aria-colindex', '1');
219
+ rowheader = (0, _react2.within)(tRows[2]).getByRole('rowheader');
220
+ expect(rowheader).toHaveTextContent(rows[2].country);
221
+ expect(rowheader).toHaveAttribute('aria-colindex', '1');
222
+ rowheader = (0, _react2.within)(tRows[3]).getByRole('rowheader');
223
+ expect(rowheader).toHaveTextContent(rows[3].country);
224
+ expect(rowheader).toHaveAttribute('aria-colindex', '1');
225
+ var cells = (0, _react2.within)(rowgroups[1]).getAllByRole('gridcell');
226
+ expect(cells).toHaveLength(8);
227
+ expect(cells[0]).toHaveAttribute('aria-colindex', '2');
228
+ expect(cells[1]).toHaveAttribute('aria-colindex', '3');
229
+ expect(cells[2]).toHaveAttribute('aria-colindex', '2');
230
+ expect(cells[3]).toHaveAttribute('aria-colindex', '3');
231
+ expect(cells[4]).toHaveAttribute('aria-colindex', '2');
232
+ expect(cells[5]).toHaveAttribute('aria-colindex', '3');
233
+ expect(cells[6]).toHaveAttribute('aria-colindex', '2');
234
+ expect(cells[7]).toHaveAttribute('aria-colindex', '3');
235
+ });
236
+ test('should move focus to the next cell in a row with ArrowRight', function () {
237
+ var view = staticDataTable();
238
+ focusCell(view, 'USA');
239
+ moveFocus('ArrowRight'); // eslint-disable-next-line jest-dom/prefer-focus
240
+
241
+ expect(document.activeElement).toBe(getCell(view, 320000000));
242
+ });
243
+ test('should move focus to the previous cell in a row with ArrowLeft', function () {
244
+ var view = staticDataTable();
245
+ focusCell(view, 'Asia');
246
+ moveFocus('ArrowLeft');
247
+ expect(getCell(view, 1398000000)).toHaveFocus();
248
+ });
249
+ test('should move focus to the next cell in a row with ArrowUp', function () {
250
+ var view = staticDataTable();
251
+ focusCell(view, 'China');
252
+ moveFocus('ArrowUp'); // eslint-disable-next-line jest-dom/prefer-focus
253
+
254
+ expect(document.activeElement).toBe(getCell(view, 'Canada'));
255
+ });
256
+ test('should move focus to the previous cell in a row with ArrowDown', function () {
257
+ var view = staticDataTable();
258
+ focusCell(view, 'Asia');
259
+ moveFocus('ArrowDown');
260
+ expect(getCell(view, 'Europe')).toHaveFocus();
261
+ });
262
+ });
263
+ describe('Async DataTable', function () {
264
+ test('renders a spinner when loading', function () {
265
+ var testId = 'loadingTable';
266
+ var defaultProps = {
267
+ 'aria-label': 'Custom table with loading content',
268
+ width: '100%',
269
+ height: 565,
270
+ density: 'spacious',
271
+ 'data-testid': testId
272
+ };
273
+ (0, _react2.render)((0, _react3.jsx)(_DataTable["default"], defaultProps, (0, _react3.jsx)(_index.DataTableHeader, {
274
+ columns: columns
275
+ }, function (column) {
276
+ return (0, _react3.jsx)(_index.DataTableColumn, {
277
+ align: "center"
278
+ }, column.name);
279
+ }), (0, _react3.jsx)(_index.DataTableBody, {
280
+ loadingState: "loading"
281
+ }, [])));
282
+
283
+ var asyncTable = _react2.screen.getByTestId(testId);
284
+
285
+ expect(asyncTable).toBeInTheDocument();
286
+ expect(asyncTable).toBeVisible();
287
+ expect(asyncTable).toHaveAttribute('aria-label', 'Custom table with loading content');
288
+ expect(asyncTable).toHaveAttribute('data-testid', testId);
289
+ var tRows = (0, _react2.within)(asyncTable).getAllByRole('row');
290
+ expect(tRows).toHaveLength(2);
291
+ expect(tRows[1]).toHaveAttribute('aria-rowindex', '2');
292
+ var cell = (0, _react2.within)(tRows[1]).getByRole('rowheader');
293
+ expect(cell).toHaveAttribute('aria-colspan', '3');
294
+ var spinner = (0, _react2.within)(cell).getByRole('alert');
295
+ expect(spinner).toBeInTheDocument();
296
+ expect(spinner).toBeVisible();
297
+ expect(spinner).toHaveAttribute('aria-label', 'loading');
298
+ expect(spinner).toHaveAttribute('aria-live', 'assertive');
299
+ expect(spinner).not.toHaveAttribute('aria-valuenow');
300
+ });
301
+ test('calls onLoadMore when scrolling near the bottom', function () {
302
+ var testId = 'onLoadMoreTable';
303
+ var defaultProps = {
304
+ 'aria-label': 'Custom table with onLoadMore',
305
+ width: '100%',
306
+ height: 565,
307
+ density: 'spacious',
308
+ 'data-testid': testId
309
+ };
310
+ var items = [];
311
+
312
+ for (var i = 1; i <= 100; i += 1) {
313
+ items.push({
314
+ id: i,
315
+ country: "Country ".concat(i),
316
+ population: "".concat(i),
317
+ continent: "Continent ".concat(i)
318
+ });
319
+ }
320
+
321
+ var onLoadMore = jest.fn();
322
+ (0, _react2.render)((0, _react3.jsx)(_DataTable["default"], defaultProps, (0, _react3.jsx)(_index.DataTableHeader, {
323
+ columns: columns
324
+ }, function (column) {
325
+ return (0, _react3.jsx)(_index.DataTableColumn, {
326
+ align: "center"
327
+ }, column.name);
328
+ }), (0, _react3.jsx)(_index.DataTableBody, {
329
+ items: items,
330
+ onLoadMore: onLoadMore
331
+ }, function (item) {
332
+ return (0, _react3.jsx)(_index.DataTableRow, null, function (columnKey) {
333
+ return (0, _react3.jsx)(_index.DataTableCell, null, item[columnKey]);
334
+ });
335
+ })));
336
+
337
+ var asyncTable = _react2.screen.getByTestId(testId);
338
+
339
+ expect(asyncTable).toBeInTheDocument();
340
+ expect(asyncTable).toBeVisible();
341
+ expect(asyncTable).toHaveAttribute('aria-label', 'Custom table with onLoadMore');
342
+
343
+ var body = _react2.screen.getAllByRole('rowgroup')[1];
344
+
345
+ var scrollView = body.parentNode.parentNode;
346
+ scrollView.scrollTop = 250;
347
+
348
+ _react2.fireEvent.scroll(scrollView);
349
+
350
+ (0, _react2.act)(function () {
351
+ jest.runAllTimers();
352
+ });
353
+ scrollView.scrollTop = 1500;
354
+
355
+ _react2.fireEvent.scroll(scrollView);
356
+
357
+ (0, _react2.act)(function () {
358
+ jest.runAllTimers();
359
+ });
360
+ scrollView.scrollTop = 2800;
361
+
362
+ _react2.fireEvent.scroll(scrollView);
363
+
364
+ (0, _react2.act)(function () {
365
+ jest.runAllTimers();
366
+ });
367
+ expect(onLoadMore).toHaveBeenCalledTimes(2);
368
+ });
369
+ test('renders a spinner at the bottom when loading more', function () {
370
+ var testId = 'loadingMoreTable';
371
+ var defaultProps = {
372
+ 'aria-label': 'Custom table with loadingMore',
373
+ width: '100%',
374
+ height: '100%',
375
+ density: 'spacious',
376
+ 'data-testid': testId
377
+ };
378
+ (0, _react2.render)((0, _react3.jsx)(_DataTable["default"], defaultProps, (0, _react3.jsx)(_index.DataTableHeader, {
379
+ columns: columns
380
+ }, function (column) {
381
+ return (0, _react3.jsx)(_index.DataTableColumn, {
382
+ align: "center"
383
+ }, column.name);
384
+ }), (0, _react3.jsx)(_index.DataTableBody, {
385
+ items: rows,
386
+ loadingState: "loadingMore"
387
+ }, function (item) {
388
+ return (0, _react3.jsx)(_index.DataTableRow, null, function (columnKey) {
389
+ return (0, _react3.jsx)(_index.DataTableCell, null, item[columnKey]);
390
+ });
391
+ })));
392
+
393
+ var asyncTable = _react2.screen.getByTestId(testId);
394
+
395
+ expect(asyncTable).toBeInTheDocument();
396
+ expect(asyncTable).toBeVisible();
397
+ expect(asyncTable).toHaveAttribute('aria-label', 'Custom table with loadingMore');
398
+ expect(asyncTable).toHaveAttribute('data-testid', testId);
399
+ expect(asyncTable).toHaveAttribute('aria-rowcount', '5');
400
+ expect(asyncTable).toHaveAttribute('aria-colcount', '3');
401
+ var rowgroups = (0, _react2.within)(asyncTable).getAllByRole('rowgroup');
402
+ expect(rowgroups).toHaveLength(2);
403
+ var tRows = (0, _react2.within)(asyncTable).getAllByRole('row');
404
+ expect(tRows).toHaveLength(6);
405
+ expect(tRows[5]).toHaveAttribute('aria-rowindex', '6');
406
+ var cell = (0, _react2.within)(tRows[5]).getByRole('rowheader');
407
+ expect(cell).toHaveAttribute('aria-colspan', '3');
408
+ var spinner = (0, _react2.within)(cell).getByRole('alert');
409
+ expect(spinner).toBeInTheDocument();
410
+ expect(spinner).toBeVisible();
411
+ expect(spinner).toHaveAttribute('aria-label', 'loadingMore');
412
+ expect(spinner).toHaveAttribute('aria-live', 'assertive');
413
+ expect(spinner).not.toHaveAttribute('aria-valuenow');
414
+ });
415
+ });
416
+ describe('Sortable DataTable', function () {
417
+ var testId = 'sortableTable';
418
+ var defaultProps = {
419
+ 'aria-label': 'Custom table with sortable content',
420
+ width: '100%',
421
+ height: '100%',
422
+ density: 'spacious',
423
+ 'data-testid': testId
424
+ };
425
+ test('sorting', function () {
426
+ (0, _react2.render)((0, _react3.jsx)(_DataTable["default"], defaultProps, (0, _react3.jsx)(_index.DataTableHeader, {
427
+ columns: columns
428
+ }, function (column) {
429
+ return (0, _react3.jsx)(_index.DataTableColumn, {
430
+ align: "center",
431
+ allowsSorting: true
432
+ }, column.name);
433
+ }), (0, _react3.jsx)(_index.DataTableBody, {
434
+ items: rows
435
+ }, function (item) {
436
+ return (0, _react3.jsx)(_index.DataTableRow, null, function (columnKey) {
437
+ return (0, _react3.jsx)(_index.DataTableCell, null, item[columnKey]);
438
+ });
439
+ })));
440
+
441
+ var sortableTable = _react2.screen.getByTestId(testId);
442
+
443
+ expect(sortableTable).toBeInTheDocument();
444
+ expect(sortableTable).toBeVisible();
445
+ expect(sortableTable).toHaveAttribute('aria-label', 'Custom table with sortable content');
446
+ expect(sortableTable).toHaveAttribute('data-testid', testId);
447
+ expect(sortableTable).toHaveAttribute('aria-rowcount', '5');
448
+ expect(sortableTable).toHaveAttribute('aria-colcount', '3');
449
+
450
+ var sortableGrid = _react2.screen.getByRole('grid');
451
+
452
+ var columnheaders = (0, _react2.within)(sortableGrid).getAllByRole('columnheader');
453
+ expect(columnheaders).toHaveLength(3);
454
+ expect(columnheaders[0]).toHaveAttribute('aria-sort', 'none');
455
+ expect(columnheaders[1]).toHaveAttribute('aria-sort', 'none');
456
+ expect(columnheaders[2]).toHaveAttribute('aria-sort', 'none');
457
+ expect(columnheaders[0]).toHaveAttribute('aria-describedby');
458
+ expect(document.getElementById(columnheaders[0].getAttribute('aria-describedby'))).toHaveTextContent('sortable column');
459
+ expect(columnheaders[1]).toHaveAttribute('aria-describedby');
460
+ expect(document.getElementById(columnheaders[1].getAttribute('aria-describedby'))).toHaveTextContent('sortable column');
461
+ expect(columnheaders[1]).toHaveAttribute('aria-describedby');
462
+ expect(document.getElementById(columnheaders[1].getAttribute('aria-describedby'))).toHaveTextContent('sortable column');
463
+ });
464
+ });
465
+ describe('Sortable with useAsyncList', function () {
466
+ var ITEMS = [{
467
+ id: 1,
468
+ name: '1'
469
+ }, {
470
+ id: 2,
471
+ name: '2'
472
+ }];
473
+ var ITEMS2 = [{
474
+ id: 2,
475
+ name: '1'
476
+ }, {
477
+ id: 1,
478
+ name: '2'
479
+ }];
480
+
481
+ function getItems() {
482
+ return new _promise["default"](function (resolve) {
483
+ (0, _setTimeout2["default"])(function () {
484
+ return resolve({
485
+ items: ITEMS
486
+ });
487
+ });
488
+ });
489
+ }
490
+
491
+ function getItems2() {
492
+ return new _promise["default"](function (resolve) {
493
+ (0, _setTimeout2["default"])(function () {
494
+ return resolve({
495
+ items: ITEMS2
496
+ });
497
+ });
498
+ });
499
+ }
500
+
501
+ test('should call load function', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
502
+ var load, _renderHook, result;
503
+
504
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
505
+ while (1) {
506
+ switch (_context2.prev = _context2.next) {
507
+ case 0:
508
+ load = jest.fn().mockImplementation(getItems);
509
+ _renderHook = (0, _reactHooks.renderHook)(function () {
510
+ return (0, _data.useAsyncList)({
511
+ load: load
512
+ });
513
+ }), result = _renderHook.result;
514
+ expect(load).toHaveBeenCalledTimes(1);
515
+ expect(result.current.items).toEqual([]);
516
+ _context2.next = 6;
517
+ return (0, _reactHooks.act)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
518
+ return _regenerator["default"].wrap(function _callee$(_context) {
519
+ while (1) {
520
+ switch (_context.prev = _context.next) {
521
+ case 0:
522
+ jest.runAllTimers();
523
+
524
+ case 1:
525
+ case "end":
526
+ return _context.stop();
527
+ }
528
+ }
529
+ }, _callee);
530
+ })));
531
+
532
+ case 6:
533
+ expect(result.current.items).toEqual(ITEMS);
534
+
535
+ case 7:
536
+ case "end":
537
+ return _context2.stop();
538
+ }
539
+ }
540
+ }, _callee2);
541
+ })));
542
+ test('should call sort function', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
543
+ var load, sort, _renderHook2, result, args;
544
+
545
+ return _regenerator["default"].wrap(function _callee6$(_context7) {
546
+ while (1) {
547
+ switch (_context7.prev = _context7.next) {
548
+ case 0:
549
+ load = jest.fn().mockImplementation(getItems);
550
+ sort = jest.fn().mockImplementation(getItems2);
551
+ _renderHook2 = (0, _reactHooks.renderHook)(function () {
552
+ return (0, _data.useAsyncList)({
553
+ load: load,
554
+ sort: sort,
555
+ initialSortDescriptor: {
556
+ direction: 'ASC'
557
+ }
558
+ });
559
+ }), result = _renderHook2.result;
560
+ expect(load).toHaveBeenCalledTimes(1);
561
+ args = load.mock.calls[0][0];
562
+ expect(args.sortDescriptor).toEqual({
563
+ direction: 'ASC'
564
+ });
565
+ expect(result.current.items).toEqual([]);
566
+ _context7.next = 9;
567
+ return (0, _reactHooks.act)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
568
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
569
+ while (1) {
570
+ switch (_context3.prev = _context3.next) {
571
+ case 0:
572
+ jest.runOnlyPendingTimers();
573
+
574
+ case 1:
575
+ case "end":
576
+ return _context3.stop();
577
+ }
578
+ }
579
+ }, _callee3);
580
+ })));
581
+
582
+ case 9:
583
+ expect(result.current.items).toEqual(ITEMS);
584
+ _context7.next = 12;
585
+ return (0, _reactHooks.act)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
586
+ var _context4;
587
+
588
+ return _regenerator["default"].wrap(function _callee4$(_context5) {
589
+ while (1) {
590
+ switch (_context5.prev = _context5.next) {
591
+ case 0:
592
+ (0, _sort2["default"])(_context4 = result.current).call(_context4, {
593
+ column: 'name'
594
+ });
595
+
596
+ case 1:
597
+ case "end":
598
+ return _context5.stop();
599
+ }
600
+ }
601
+ }, _callee4);
602
+ })));
603
+
604
+ case 12:
605
+ expect(result.current.items).toEqual(ITEMS);
606
+ expect(sort).toHaveBeenCalledTimes(1);
607
+ args = sort.mock.calls[0][0];
608
+ expect(args.items).toStrictEqual(ITEMS);
609
+ _context7.next = 18;
610
+ return (0, _reactHooks.act)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
611
+ return _regenerator["default"].wrap(function _callee5$(_context6) {
612
+ while (1) {
613
+ switch (_context6.prev = _context6.next) {
614
+ case 0:
615
+ jest.runOnlyPendingTimers();
616
+
617
+ case 1:
618
+ case "end":
619
+ return _context6.stop();
620
+ }
621
+ }
622
+ }, _callee5);
623
+ })));
624
+
625
+ case 18:
626
+ expect(result.current.items).toEqual(ITEMS2);
627
+
628
+ case 19:
629
+ case "end":
630
+ return _context7.stop();
631
+ }
632
+ }
633
+ }, _callee6);
634
+ })));
635
+ });
636
+ describe('Sortable DataTable with useAsyncList', function () {
637
+ var testId = 'sortableTable';
638
+ var defaultProps = {
639
+ 'aria-label': 'Custom table with sortable content',
640
+ width: '100%',
641
+ height: '100%',
642
+ density: 'spacious',
643
+ 'data-testid': testId
644
+ };
645
+
646
+ function load() {
647
+ return _load.apply(this, arguments);
648
+ }
649
+
650
+ function _load() {
651
+ _load = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15() {
652
+ return _regenerator["default"].wrap(function _callee15$(_context18) {
653
+ while (1) {
654
+ switch (_context18.prev = _context18.next) {
655
+ case 0:
656
+ return _context18.abrupt("return", {
657
+ items: rows
658
+ });
659
+
660
+ case 1:
661
+ case "end":
662
+ return _context18.stop();
663
+ }
664
+ }
665
+ }, _callee15);
666
+ }));
667
+ return _load.apply(this, arguments);
668
+ }
669
+
670
+ function sort(_x) {
671
+ return _sort.apply(this, arguments);
672
+ }
673
+
674
+ function _sort() {
675
+ _sort = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16(list) {
676
+ var _context19;
677
+
678
+ return _regenerator["default"].wrap(function _callee16$(_context20) {
679
+ while (1) {
680
+ switch (_context20.prev = _context20.next) {
681
+ case 0:
682
+ // eslint-disable-next-line no-param-reassign
683
+ list.items = (0, _sort2["default"])(_context19 = list.items).call(_context19, function (a, b) {
684
+ var first = a[list.sortDescriptor.column];
685
+ var second = b[list.sortDescriptor.column];
686
+ var cmp = // eslint-disable-next-line radix
687
+ ((0, _parseInt2["default"])(first) || first) < ((0, _parseInt2["default"])(second) || second) ? -1 : 1;
688
+
689
+ if (list.sortDescriptor.direction === 'descending') {
690
+ cmp *= -1;
691
+ }
692
+
693
+ return cmp;
694
+ });
695
+ return _context20.abrupt("return", list);
696
+
697
+ case 2:
698
+ case "end":
699
+ return _context20.stop();
700
+ }
701
+ }
702
+ }, _callee16);
703
+ }));
704
+ return _sort.apply(this, arguments);
705
+ }
706
+
707
+ var sortableDataTable = function sortableDataTable(_ref7) {
708
+ var result = _ref7.result;
709
+ return (0, _react2.render)((0, _react3.jsx)(_DataTable["default"], defaultProps, (0, _react3.jsx)(_index.DataTableHeader, {
710
+ columns: columns
711
+ }, function (column) {
712
+ return (0, _react3.jsx)(_index.DataTableColumn, {
713
+ align: "center",
714
+ allowsSorting: true
715
+ }, column.name);
716
+ }), (0, _react3.jsx)(_index.DataTableBody, {
717
+ items: result.current.items
718
+ }, function (item) {
719
+ return (0, _react3.jsx)(_index.DataTableRow, null, function (columnKey) {
720
+ return (0, _react3.jsx)(_index.DataTableCell, null, item[columnKey]);
721
+ });
722
+ })));
723
+ };
724
+
725
+ test('sort by country column A => Z', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
726
+ var _renderHook3, result, sortableTable, rowgroups, tRows;
727
+
728
+ return _regenerator["default"].wrap(function _callee10$(_context12) {
729
+ while (1) {
730
+ switch (_context12.prev = _context12.next) {
731
+ case 0:
732
+ _renderHook3 = (0, _reactHooks.renderHook)(function () {
733
+ return (0, _data.useAsyncList)({
734
+ load: load,
735
+ sort: sort,
736
+ initialSortDescriptor: {
737
+ column: 'country',
738
+ direction: 'ascending'
739
+ }
740
+ });
741
+ }), result = _renderHook3.result;
742
+ _context12.next = 3;
743
+ return (0, _reactHooks.act)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
744
+ return _regenerator["default"].wrap(function _callee7$(_context8) {
745
+ while (1) {
746
+ switch (_context8.prev = _context8.next) {
747
+ case 0:
748
+ jest.runOnlyPendingTimers();
749
+
750
+ case 1:
751
+ case "end":
752
+ return _context8.stop();
753
+ }
754
+ }
755
+ }, _callee7);
756
+ })));
757
+
758
+ case 3:
759
+ _context12.next = 5;
760
+ return (0, _reactHooks.act)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
761
+ var _context9;
762
+
763
+ return _regenerator["default"].wrap(function _callee8$(_context10) {
764
+ while (1) {
765
+ switch (_context10.prev = _context10.next) {
766
+ case 0:
767
+ (0, _sort2["default"])(_context9 = result.current).call(_context9);
768
+
769
+ case 1:
770
+ case "end":
771
+ return _context10.stop();
772
+ }
773
+ }
774
+ }, _callee8);
775
+ })));
776
+
777
+ case 5:
778
+ _context12.next = 7;
779
+ return (0, _reactHooks.act)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
780
+ return _regenerator["default"].wrap(function _callee9$(_context11) {
781
+ while (1) {
782
+ switch (_context11.prev = _context11.next) {
783
+ case 0:
784
+ jest.runOnlyPendingTimers();
785
+
786
+ case 1:
787
+ case "end":
788
+ return _context11.stop();
789
+ }
790
+ }
791
+ }, _callee9);
792
+ })));
793
+
794
+ case 7:
795
+ sortableDataTable({
796
+ result: result
797
+ });
798
+ sortableTable = _react2.screen.getByTestId(testId);
799
+ expect(sortableTable).toBeInTheDocument();
800
+ expect(sortableTable).toBeVisible();
801
+ expect(sortableTable).toHaveAttribute('aria-label', 'Custom table with sortable content');
802
+ expect(sortableTable).toHaveAttribute('data-testid', testId);
803
+ expect(sortableTable).toHaveAttribute('aria-rowcount', '5');
804
+ expect(sortableTable).toHaveAttribute('aria-colcount', '3');
805
+ rowgroups = (0, _react2.within)(sortableTable).getAllByRole('rowgroup');
806
+ tRows = (0, _react2.within)(rowgroups[1]).getAllByRole('row'); // verify country column is sorted a -> z
807
+
808
+ expect(tRows).toHaveLength(4);
809
+ expect(tRows[0]).toHaveAttribute('aria-rowindex', '2');
810
+ expect(tRows[0]).toHaveTextContent('Canada');
811
+ expect(tRows[1]).toHaveAttribute('aria-rowindex', '3');
812
+ expect(tRows[1]).toHaveTextContent('China');
813
+ expect(tRows[2]).toHaveAttribute('aria-rowindex', '4');
814
+ expect(tRows[2]).toHaveTextContent('France');
815
+ expect(tRows[3]).toHaveAttribute('aria-rowindex', '5');
816
+ expect(tRows[3]).toHaveTextContent('USA');
817
+
818
+ case 26:
819
+ case "end":
820
+ return _context12.stop();
821
+ }
822
+ }
823
+ }, _callee10);
824
+ })));
825
+ test('sort by country column Z => A', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14() {
826
+ var _renderHook4, result, sortableTable, rowgroups, tRows;
827
+
828
+ return _regenerator["default"].wrap(function _callee14$(_context17) {
829
+ while (1) {
830
+ switch (_context17.prev = _context17.next) {
831
+ case 0:
832
+ _renderHook4 = (0, _reactHooks.renderHook)(function () {
833
+ return (0, _data.useAsyncList)({
834
+ load: load,
835
+ sort: sort,
836
+ initialSortDescriptor: {
837
+ column: 'country',
838
+ direction: 'descending'
839
+ }
840
+ });
841
+ }), result = _renderHook4.result;
842
+ _context17.next = 3;
843
+ return (0, _reactHooks.act)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
844
+ return _regenerator["default"].wrap(function _callee11$(_context13) {
845
+ while (1) {
846
+ switch (_context13.prev = _context13.next) {
847
+ case 0:
848
+ jest.runOnlyPendingTimers();
849
+
850
+ case 1:
851
+ case "end":
852
+ return _context13.stop();
853
+ }
854
+ }
855
+ }, _callee11);
856
+ })));
857
+
858
+ case 3:
859
+ _context17.next = 5;
860
+ return (0, _reactHooks.act)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12() {
861
+ var _context14;
862
+
863
+ return _regenerator["default"].wrap(function _callee12$(_context15) {
864
+ while (1) {
865
+ switch (_context15.prev = _context15.next) {
866
+ case 0:
867
+ (0, _sort2["default"])(_context14 = result.current).call(_context14);
868
+
869
+ case 1:
870
+ case "end":
871
+ return _context15.stop();
872
+ }
873
+ }
874
+ }, _callee12);
875
+ })));
876
+
877
+ case 5:
878
+ _context17.next = 7;
879
+ return (0, _reactHooks.act)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13() {
880
+ return _regenerator["default"].wrap(function _callee13$(_context16) {
881
+ while (1) {
882
+ switch (_context16.prev = _context16.next) {
883
+ case 0:
884
+ jest.runOnlyPendingTimers();
885
+
886
+ case 1:
887
+ case "end":
888
+ return _context16.stop();
889
+ }
890
+ }
891
+ }, _callee13);
892
+ })));
893
+
894
+ case 7:
895
+ sortableDataTable({
896
+ result: result
897
+ });
898
+ sortableTable = _react2.screen.getByTestId(testId);
899
+ expect(sortableTable).toBeInTheDocument();
900
+ expect(sortableTable).toBeVisible();
901
+ expect(sortableTable).toHaveAttribute('aria-label', 'Custom table with sortable content');
902
+ expect(sortableTable).toHaveAttribute('data-testid', testId);
903
+ expect(sortableTable).toHaveAttribute('aria-rowcount', '5');
904
+ expect(sortableTable).toHaveAttribute('aria-colcount', '3');
905
+ rowgroups = (0, _react2.within)(sortableTable).getAllByRole('rowgroup');
906
+ tRows = (0, _react2.within)(rowgroups[1]).getAllByRole('row'); // verify country column is sorted z -> a
907
+
908
+ expect(tRows).toHaveLength(4);
909
+ expect(tRows[0]).toHaveAttribute('aria-rowindex', '2');
910
+ expect(tRows[0]).toHaveTextContent('USA');
911
+ expect(tRows[1]).toHaveAttribute('aria-rowindex', '3');
912
+ expect(tRows[1]).toHaveTextContent('France');
913
+ expect(tRows[2]).toHaveAttribute('aria-rowindex', '4');
914
+ expect(tRows[2]).toHaveTextContent('China');
915
+ expect(tRows[3]).toHaveAttribute('aria-rowindex', '5');
916
+ expect(tRows[3]).toHaveTextContent('Canada');
917
+
918
+ case 26:
919
+ case "end":
920
+ return _context17.stop();
921
+ }
922
+ }
923
+ }, _callee14);
924
+ })));
925
+ });
926
+ describe('Sortable DataTable with useAsyncList', function () {
927
+ var testId = 'sortableTable';
928
+ var defaultProps = {
929
+ 'aria-label': 'Custom table with sortable content',
930
+ width: '100%',
931
+ height: '100%',
932
+ density: 'spacious',
933
+ 'data-testid': testId
934
+ };
935
+
936
+ var sortableDataTable = function sortableDataTable(_ref16) {
937
+ var result = _ref16.result;
938
+ return (0, _react2.render)((0, _react3.jsx)(_DataTable["default"], (0, _extends2["default"])({}, defaultProps, {
939
+ sortDescriptor: result.current.sortDescriptor,
940
+ onSortChange: (0, _sort2["default"])(result.current)
941
+ }), (0, _react3.jsx)(_index.DataTableHeader, {
942
+ columns: columns
943
+ }, function (column) {
944
+ return (0, _react3.jsx)(_index.DataTableColumn, {
945
+ align: "center",
946
+ allowsSorting: true
947
+ }, column.name);
948
+ }), (0, _react3.jsx)(_index.DataTableBody, {
949
+ items: result.current.items
950
+ }, function (item) {
951
+ return (0, _react3.jsx)(_index.DataTableRow, null, function (columnKey) {
952
+ return (0, _react3.jsx)(_index.DataTableCell, null, item[columnKey]);
953
+ });
954
+ })));
955
+ };
956
+
957
+ test('click on column header should sort column A => Z', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee24() {
958
+ var _renderHook5, result, sortableTable, headers;
959
+
960
+ return _regenerator["default"].wrap(function _callee24$(_context28) {
961
+ while (1) {
962
+ switch (_context28.prev = _context28.next) {
963
+ case 0:
964
+ _renderHook5 = (0, _reactHooks.renderHook)(function () {
965
+ return (0, _data.useAsyncList)({
966
+ load: function load() {
967
+ return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17() {
968
+ return _regenerator["default"].wrap(function _callee17$(_context21) {
969
+ while (1) {
970
+ switch (_context21.prev = _context21.next) {
971
+ case 0:
972
+ return _context21.abrupt("return", {
973
+ items: rows
974
+ });
975
+
976
+ case 1:
977
+ case "end":
978
+ return _context21.stop();
979
+ }
980
+ }
981
+ }, _callee17);
982
+ }))();
983
+ },
984
+ sort: function sort(_ref18) {
985
+ return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18() {
986
+ var items, sortDescriptor;
987
+ return _regenerator["default"].wrap(function _callee18$(_context22) {
988
+ while (1) {
989
+ switch (_context22.prev = _context22.next) {
990
+ case 0:
991
+ items = _ref18.items, sortDescriptor = _ref18.sortDescriptor;
992
+ return _context22.abrupt("return", {
993
+ items: (0, _sort2["default"])(items).call(items, function (a, b) {
994
+ var first = a[sortDescriptor.column];
995
+ var second = b[sortDescriptor.column]; // eslint-disable-next-line radix
996
+
997
+ // eslint-disable-next-line radix
998
+ var cmp = ((0, _parseInt2["default"])(first) || first) < ((0, _parseInt2["default"])(second) || second) ? -1 : 1;
999
+
1000
+ if (sortDescriptor.direction === 'descending') {
1001
+ cmp *= -1;
1002
+ }
1003
+
1004
+ return cmp;
1005
+ })
1006
+ });
1007
+
1008
+ case 2:
1009
+ case "end":
1010
+ return _context22.stop();
1011
+ }
1012
+ }
1013
+ }, _callee18);
1014
+ }))();
1015
+ },
1016
+ initialSortDescriptor: {
1017
+ column: 'country',
1018
+ direction: 'descending'
1019
+ }
1020
+ });
1021
+ }), result = _renderHook5.result;
1022
+ _context28.next = 3;
1023
+ return (0, _reactHooks.act)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee19() {
1024
+ return _regenerator["default"].wrap(function _callee19$(_context23) {
1025
+ while (1) {
1026
+ switch (_context23.prev = _context23.next) {
1027
+ case 0:
1028
+ jest.runOnlyPendingTimers();
1029
+
1030
+ case 1:
1031
+ case "end":
1032
+ return _context23.stop();
1033
+ }
1034
+ }
1035
+ }, _callee19);
1036
+ })));
1037
+
1038
+ case 3:
1039
+ sortableDataTable({
1040
+ result: result
1041
+ });
1042
+ _context28.next = 6;
1043
+ return (0, _reactHooks.act)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee20() {
1044
+ return _regenerator["default"].wrap(function _callee20$(_context24) {
1045
+ while (1) {
1046
+ switch (_context24.prev = _context24.next) {
1047
+ case 0:
1048
+ jest.runOnlyPendingTimers();
1049
+
1050
+ case 1:
1051
+ case "end":
1052
+ return _context24.stop();
1053
+ }
1054
+ }
1055
+ }, _callee20);
1056
+ })));
1057
+
1058
+ case 6:
1059
+ sortableTable = _react2.screen.getByTestId(testId);
1060
+ expect(sortableTable).toBeInTheDocument();
1061
+ expect(sortableTable).toBeVisible();
1062
+ headers = (0, _react2.within)(sortableTable).getAllByRole('columnheader');
1063
+ expect(headers).toHaveLength(3);
1064
+ expect(headers[0]).toHaveAttribute('aria-colindex', '1');
1065
+ expect(headers[1]).toHaveAttribute('aria-colindex', '2');
1066
+ expect(headers[2]).toHaveAttribute('aria-colindex', '3');
1067
+ expect(headers[0]).toHaveTextContent(columns[0].name);
1068
+ expect(headers[1]).toHaveTextContent(columns[1].name);
1069
+ expect(headers[2]).toHaveTextContent(columns[2].name);
1070
+ expect(result.current.items[0].country).toBe('USA');
1071
+ expect(result.current.items[1].country).toBe('Canada');
1072
+ expect(result.current.items[2].country).toBe('China');
1073
+ expect(result.current.items[3].country).toBe('France');
1074
+ expect(result.current.items[0].population).toBe(320000000);
1075
+ expect(result.current.items[1].population).toBe(37000000);
1076
+ expect(result.current.items[2].population).toBe(1398000000);
1077
+ expect(result.current.items[3].population).toBe(67000000);
1078
+ expect(result.current.items[0].continent).toBe('North America');
1079
+ expect(result.current.items[1].continent).toBe('North America');
1080
+ expect(result.current.items[2].continent).toBe('Asia');
1081
+ expect(result.current.items[3].continent).toBe('Europe');
1082
+ _context28.next = 31;
1083
+ return (0, _reactHooks.act)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee21() {
1084
+ return _regenerator["default"].wrap(function _callee21$(_context25) {
1085
+ while (1) {
1086
+ switch (_context25.prev = _context25.next) {
1087
+ case 0:
1088
+ _react2.fireEvent.click(headers[0]);
1089
+
1090
+ case 1:
1091
+ case "end":
1092
+ return _context25.stop();
1093
+ }
1094
+ }
1095
+ }, _callee21);
1096
+ })));
1097
+
1098
+ case 31:
1099
+ expect(result.current.items[0].country).toBe('Canada');
1100
+ expect(result.current.items[1].country).toBe('China');
1101
+ expect(result.current.items[2].country).toBe('France');
1102
+ expect(result.current.items[3].country).toBe('USA');
1103
+ _context28.next = 37;
1104
+ return (0, _reactHooks.act)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee22() {
1105
+ return _regenerator["default"].wrap(function _callee22$(_context26) {
1106
+ while (1) {
1107
+ switch (_context26.prev = _context26.next) {
1108
+ case 0:
1109
+ _react2.fireEvent.click(headers[1]);
1110
+
1111
+ case 1:
1112
+ case "end":
1113
+ return _context26.stop();
1114
+ }
1115
+ }
1116
+ }, _callee22);
1117
+ })));
1118
+
1119
+ case 37:
1120
+ expect(result.current.items[0].population).toBe(37000000);
1121
+ expect(result.current.items[1].population).toBe(67000000);
1122
+ expect(result.current.items[2].population).toBe(320000000);
1123
+ expect(result.current.items[3].population).toBe(1398000000);
1124
+ _context28.next = 43;
1125
+ return (0, _reactHooks.act)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee23() {
1126
+ return _regenerator["default"].wrap(function _callee23$(_context27) {
1127
+ while (1) {
1128
+ switch (_context27.prev = _context27.next) {
1129
+ case 0:
1130
+ _react2.fireEvent.click(headers[2]);
1131
+
1132
+ case 1:
1133
+ case "end":
1134
+ return _context27.stop();
1135
+ }
1136
+ }
1137
+ }, _callee23);
1138
+ })));
1139
+
1140
+ case 43:
1141
+ expect(result.current.items[0].continent).toBe('Asia');
1142
+ expect(result.current.items[1].continent).toBe('Europe');
1143
+ expect(result.current.items[2].continent).toBe('North America');
1144
+ expect(result.current.items[3].continent).toBe('North America');
1145
+
1146
+ case 47:
1147
+ case "end":
1148
+ return _context28.stop();
1149
+ }
1150
+ }
1151
+ }, _callee24);
1152
+ })));
1153
+ test('click on column header should sort column Z => A', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee30() {
1154
+ var _renderHook6, result, sortableTable, headers;
1155
+
1156
+ return _regenerator["default"].wrap(function _callee30$(_context34) {
1157
+ while (1) {
1158
+ switch (_context34.prev = _context34.next) {
1159
+ case 0:
1160
+ _renderHook6 = (0, _reactHooks.renderHook)(function () {
1161
+ return (0, _data.useAsyncList)({
1162
+ load: function load() {
1163
+ return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee25() {
1164
+ return _regenerator["default"].wrap(function _callee25$(_context29) {
1165
+ while (1) {
1166
+ switch (_context29.prev = _context29.next) {
1167
+ case 0:
1168
+ return _context29.abrupt("return", {
1169
+ items: rows
1170
+ });
1171
+
1172
+ case 1:
1173
+ case "end":
1174
+ return _context29.stop();
1175
+ }
1176
+ }
1177
+ }, _callee25);
1178
+ }))();
1179
+ },
1180
+ sort: function sort(_ref25) {
1181
+ return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee26() {
1182
+ var items, sortDescriptor;
1183
+ return _regenerator["default"].wrap(function _callee26$(_context30) {
1184
+ while (1) {
1185
+ switch (_context30.prev = _context30.next) {
1186
+ case 0:
1187
+ items = _ref25.items, sortDescriptor = _ref25.sortDescriptor;
1188
+ return _context30.abrupt("return", {
1189
+ items: (0, _sort2["default"])(items).call(items, function (a, b) {
1190
+ var first = a[sortDescriptor.column];
1191
+ var second = b[sortDescriptor.column]; // eslint-disable-next-line radix
1192
+
1193
+ // eslint-disable-next-line radix
1194
+ var cmp = ((0, _parseInt2["default"])(first) || first) < ((0, _parseInt2["default"])(second) || second) ? -1 : 1;
1195
+
1196
+ if (sortDescriptor.direction === 'descending') {
1197
+ cmp *= -1;
1198
+ }
1199
+
1200
+ return cmp;
1201
+ })
1202
+ });
1203
+
1204
+ case 2:
1205
+ case "end":
1206
+ return _context30.stop();
1207
+ }
1208
+ }
1209
+ }, _callee26);
1210
+ }))();
1211
+ },
1212
+ initialSortDescriptor: {
1213
+ column: 'country',
1214
+ direction: 'ascending'
1215
+ }
1216
+ });
1217
+ }), result = _renderHook6.result;
1218
+ _context34.next = 3;
1219
+ return (0, _reactHooks.act)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee27() {
1220
+ return _regenerator["default"].wrap(function _callee27$(_context31) {
1221
+ while (1) {
1222
+ switch (_context31.prev = _context31.next) {
1223
+ case 0:
1224
+ jest.runOnlyPendingTimers();
1225
+
1226
+ case 1:
1227
+ case "end":
1228
+ return _context31.stop();
1229
+ }
1230
+ }
1231
+ }, _callee27);
1232
+ })));
1233
+
1234
+ case 3:
1235
+ sortableDataTable({
1236
+ result: result
1237
+ });
1238
+ _context34.next = 6;
1239
+ return (0, _reactHooks.act)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee28() {
1240
+ return _regenerator["default"].wrap(function _callee28$(_context32) {
1241
+ while (1) {
1242
+ switch (_context32.prev = _context32.next) {
1243
+ case 0:
1244
+ jest.runOnlyPendingTimers();
1245
+
1246
+ case 1:
1247
+ case "end":
1248
+ return _context32.stop();
1249
+ }
1250
+ }
1251
+ }, _callee28);
1252
+ })));
1253
+
1254
+ case 6:
1255
+ sortableTable = _react2.screen.getByTestId(testId);
1256
+ expect(sortableTable).toBeInTheDocument();
1257
+ expect(sortableTable).toBeVisible();
1258
+ headers = (0, _react2.within)(sortableTable).getAllByRole('columnheader');
1259
+ expect(headers).toHaveLength(3);
1260
+ expect(headers[0]).toHaveAttribute('aria-colindex', '1');
1261
+ expect(headers[1]).toHaveAttribute('aria-colindex', '2');
1262
+ expect(headers[2]).toHaveAttribute('aria-colindex', '3');
1263
+ expect(headers[0]).toHaveTextContent(columns[0].name);
1264
+ expect(headers[1]).toHaveTextContent(columns[1].name);
1265
+ expect(headers[2]).toHaveTextContent(columns[2].name);
1266
+ expect(result.current.items[0].country).toBe('USA');
1267
+ expect(result.current.items[1].country).toBe('Canada');
1268
+ expect(result.current.items[2].country).toBe('China');
1269
+ expect(result.current.items[3].country).toBe('France');
1270
+ expect(result.current.items[0].population).toBe(320000000);
1271
+ expect(result.current.items[1].population).toBe(37000000);
1272
+ expect(result.current.items[2].population).toBe(1398000000);
1273
+ expect(result.current.items[3].population).toBe(67000000);
1274
+ expect(result.current.items[0].continent).toBe('North America');
1275
+ expect(result.current.items[1].continent).toBe('North America');
1276
+ expect(result.current.items[2].continent).toBe('Asia');
1277
+ expect(result.current.items[3].continent).toBe('Europe');
1278
+ _context34.next = 31;
1279
+ return (0, _reactHooks.act)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee29() {
1280
+ return _regenerator["default"].wrap(function _callee29$(_context33) {
1281
+ while (1) {
1282
+ switch (_context33.prev = _context33.next) {
1283
+ case 0:
1284
+ _react2.fireEvent.click(headers[0]);
1285
+
1286
+ case 1:
1287
+ case "end":
1288
+ return _context33.stop();
1289
+ }
1290
+ }
1291
+ }, _callee29);
1292
+ })));
1293
+
1294
+ case 31:
1295
+ expect(result.current.items[0].country).toBe('USA');
1296
+ expect(result.current.items[1].country).toBe('France');
1297
+ expect(result.current.items[2].country).toBe('China');
1298
+ expect(result.current.items[3].country).toBe('Canada');
1299
+
1300
+ case 35:
1301
+ case "end":
1302
+ return _context34.stop();
1303
+ }
1304
+ }
1305
+ }, _callee30);
1306
+ })));
1307
+ });