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