@atlaskit/table 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE.md +13 -0
  3. package/README.md +83 -0
  4. package/constellation/index/examples.mdx +19 -0
  5. package/constellation/index/props.mdx +32 -0
  6. package/dist/cjs/body.js +105 -0
  7. package/dist/cjs/head-cell.js +42 -0
  8. package/dist/cjs/hooks/selection-provider.js +52 -0
  9. package/dist/cjs/hooks/use-row-id.js +26 -0
  10. package/dist/cjs/hooks/use-selectable.js +183 -0
  11. package/dist/cjs/hooks/use-sorting.js +59 -0
  12. package/dist/cjs/hooks/use-table-body.js +28 -0
  13. package/dist/cjs/hooks/use-table.js +56 -0
  14. package/dist/cjs/index.js +63 -0
  15. package/dist/cjs/row.js +70 -0
  16. package/dist/cjs/selectable-cell.js +53 -0
  17. package/dist/cjs/sortable-column.js +129 -0
  18. package/dist/cjs/table.js +60 -0
  19. package/dist/cjs/thead.js +73 -0
  20. package/dist/cjs/ui/base-cell.js +72 -0
  21. package/dist/cjs/ui/bulk-action-overlay.js +39 -0
  22. package/dist/cjs/ui/index.js +69 -0
  23. package/dist/cjs/ui/selectable-cell.js +39 -0
  24. package/dist/cjs/ui/table.js +31 -0
  25. package/dist/cjs/ui/tbody.js +38 -0
  26. package/dist/cjs/ui/td.js +38 -0
  27. package/dist/cjs/ui/th.js +40 -0
  28. package/dist/cjs/ui/thead.js +40 -0
  29. package/dist/cjs/ui/tr.js +68 -0
  30. package/dist/cjs/version.json +5 -0
  31. package/dist/es2019/body.js +66 -0
  32. package/dist/es2019/head-cell.js +31 -0
  33. package/dist/es2019/hooks/selection-provider.js +33 -0
  34. package/dist/es2019/hooks/use-row-id.js +13 -0
  35. package/dist/es2019/hooks/use-selectable.js +158 -0
  36. package/dist/es2019/hooks/use-sorting.js +37 -0
  37. package/dist/es2019/hooks/use-table-body.js +13 -0
  38. package/dist/es2019/hooks/use-table.js +34 -0
  39. package/dist/es2019/index.js +7 -0
  40. package/dist/es2019/row.js +41 -0
  41. package/dist/es2019/selectable-cell.js +25 -0
  42. package/dist/es2019/sortable-column.js +109 -0
  43. package/dist/es2019/table.js +38 -0
  44. package/dist/es2019/thead.js +46 -0
  45. package/dist/es2019/ui/base-cell.js +54 -0
  46. package/dist/es2019/ui/bulk-action-overlay.js +27 -0
  47. package/dist/es2019/ui/index.js +11 -0
  48. package/dist/es2019/ui/selectable-cell.js +28 -0
  49. package/dist/es2019/ui/table.js +22 -0
  50. package/dist/es2019/ui/tbody.js +26 -0
  51. package/dist/es2019/ui/td.js +21 -0
  52. package/dist/es2019/ui/th.js +26 -0
  53. package/dist/es2019/ui/thead.js +31 -0
  54. package/dist/es2019/ui/tr.js +55 -0
  55. package/dist/es2019/version.json +5 -0
  56. package/dist/esm/body.js +84 -0
  57. package/dist/esm/head-cell.js +31 -0
  58. package/dist/esm/hooks/selection-provider.js +32 -0
  59. package/dist/esm/hooks/use-row-id.js +15 -0
  60. package/dist/esm/hooks/use-selectable.js +171 -0
  61. package/dist/esm/hooks/use-sorting.js +46 -0
  62. package/dist/esm/hooks/use-table-body.js +13 -0
  63. package/dist/esm/hooks/use-table.js +36 -0
  64. package/dist/esm/index.js +7 -0
  65. package/dist/esm/row.js +46 -0
  66. package/dist/esm/selectable-cell.js +31 -0
  67. package/dist/esm/sortable-column.js +114 -0
  68. package/dist/esm/table.js +39 -0
  69. package/dist/esm/thead.js +51 -0
  70. package/dist/esm/ui/base-cell.js +58 -0
  71. package/dist/esm/ui/bulk-action-overlay.js +28 -0
  72. package/dist/esm/ui/index.js +11 -0
  73. package/dist/esm/ui/selectable-cell.js +28 -0
  74. package/dist/esm/ui/table.js +21 -0
  75. package/dist/esm/ui/tbody.js +27 -0
  76. package/dist/esm/ui/td.js +26 -0
  77. package/dist/esm/ui/th.js +28 -0
  78. package/dist/esm/ui/thead.js +30 -0
  79. package/dist/esm/ui/tr.js +55 -0
  80. package/dist/esm/version.json +5 -0
  81. package/dist/types/body.d.ts +15 -0
  82. package/dist/types/head-cell.d.ts +10 -0
  83. package/dist/types/hooks/selection-provider.d.ts +25 -0
  84. package/dist/types/hooks/use-row-id.d.ts +10 -0
  85. package/dist/types/hooks/use-selectable.d.ts +14 -0
  86. package/dist/types/hooks/use-sorting.d.ts +6 -0
  87. package/dist/types/hooks/use-table-body.d.ts +7 -0
  88. package/dist/types/hooks/use-table.d.ts +21 -0
  89. package/dist/types/index.d.ts +7 -0
  90. package/dist/types/row.d.ts +14 -0
  91. package/dist/types/selectable-cell.d.ts +3 -0
  92. package/dist/types/sortable-column.d.ts +17 -0
  93. package/dist/types/table.d.ts +26 -0
  94. package/dist/types/thead.d.ts +7 -0
  95. package/dist/types/ui/base-cell.d.ts +30 -0
  96. package/dist/types/ui/bulk-action-overlay.d.ts +8 -0
  97. package/dist/types/ui/index.d.ts +11 -0
  98. package/dist/types/ui/selectable-cell.d.ts +10 -0
  99. package/dist/types/ui/table.d.ts +23 -0
  100. package/dist/types/ui/tbody.d.ts +8 -0
  101. package/dist/types/ui/td.d.ts +11 -0
  102. package/dist/types/ui/th.d.ts +11 -0
  103. package/dist/types/ui/thead.d.ts +10 -0
  104. package/dist/types/ui/tr.d.ts +16 -0
  105. package/package.json +101 -0
  106. package/primitives/package.json +15 -0
  107. package/report.api.md +139 -0
  108. package/tmp/api-report-tmp.d.ts +99 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # @atlaskit/table
2
+
3
+ ## 0.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`e2e5705f5d8`](https://bitbucket.org/atlassian/atlassian-frontend/commits/e2e5705f5d8) - Create initial component from Figma spec. Dev release, not intended for consumption.
package/LICENSE.md ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2022 Atlassian Pty Ltd
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
package/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # Table
2
+
3
+ **WARNING!**
4
+
5
+ This is an experimental package for exploration and validation of the foundations for the Atlassian Design System.
6
+
7
+ ## Description
8
+
9
+ A table is used to display and organise complex data.
10
+
11
+ ## Usage
12
+
13
+ `import Table from '@atlaskit/table';`
14
+
15
+ Detailed docs and example usage can be found [here](https://atlaskit.atlassian.com/packages/design-system/table).
16
+
17
+ ### Render Prop
18
+
19
+ ```tsx
20
+ import '@atlaskit/css-reset';
21
+ import Table, { Row, Cell, TBody, THead, HeadCell } from '@atlaskit/table';
22
+
23
+ import { presidents } from './data';
24
+
25
+ type President = typeof presidents[number];
26
+
27
+ /**
28
+ * Primary UI component for user interaction
29
+ */
30
+ export const RenderProp = ({ isSelectable }) => {
31
+ return (
32
+ <Table isSelectable={isSelectable}>
33
+ <THead>
34
+ <HeadCell>Name</HeadCell>
35
+ <HeadCell>Party</HeadCell>
36
+ <HeadCell>Year</HeadCell>
37
+ </THead>
38
+ <TBody<President> rows={presidents}>
39
+ {row => (
40
+ <Row key={row.id} {...row}>
41
+ <Cell>{row.nm}</Cell>
42
+ <Cell>{row.pp}</Cell>
43
+ <Cell>{row.tm}</Cell>
44
+ </Row>
45
+ )}
46
+ </TBody>
47
+ </Table>
48
+ );
49
+ };
50
+ ```
51
+
52
+ ### Composition
53
+
54
+ ```tsx
55
+ import '@atlaskit/css-reset';
56
+ import Table, { Row, Cell, TBody, THead, HeadCell } from '@atlaskit/table';
57
+
58
+ import { presidents } from './data';
59
+
60
+ /**
61
+ * Primary UI component for user interaction
62
+ */
63
+ export const CompositionExample = ({ isSelectable }) => {
64
+ return (
65
+ <Table isSelectable={isSelectable}>
66
+ <THead>
67
+ <HeadCell>Name</HeadCell>
68
+ <HeadCell>Party</HeadCell>
69
+ <HeadCell>Year</HeadCell>
70
+ </THead>
71
+ <TBody>
72
+ {presidents.map(row => (
73
+ <Row key={row.id}>
74
+ <Cell>{row.nm}</Cell>
75
+ <Cell>{row.pp}</Cell>
76
+ <Cell>{row.tm}</Cell>
77
+ </Row>
78
+ ))}
79
+ </TBody>
80
+ </Table>
81
+ );
82
+ };
83
+ ```
@@ -0,0 +1,19 @@
1
+ ---
2
+ order: 0
3
+ ---
4
+
5
+ import BasicAKTableExample from '../../examples/composed';
6
+ import AKTableExample from '../../examples/basic';
7
+
8
+ ## Basic
9
+
10
+ A table is composed of simple composable elements. In its base form these UI elements are purely presentational.
11
+
12
+ <Example Component={BasicAKTableExample} packageName="@atlaskit/table" />
13
+
14
+ ## Basic
15
+
16
+ A data table is used to display dynamic data.
17
+
18
+ <Example Component={AKTableExample} packageName="@atlaskit/table" />
19
+
@@ -0,0 +1,32 @@
1
+ import TableProps from '!!extract-react-types-loader!../../src/table';
2
+ import TableBodyProps from '!!extract-react-types-loader!../../src/body';
3
+ import TableHeadProps from '!!extract-react-types-loader!../../src/thead';
4
+ import CellProps from '!!extract-react-types-loader!../../src/ui/td';
5
+ import HeadCellProps from '!!extract-react-types-loader!../../src/head-cell';
6
+ import RowProps from '!!extract-react-types-loader!../../src/row';
7
+
8
+ ## Props
9
+
10
+ ### Table Props
11
+
12
+ <PropsTable heading="" props={TableProps} />
13
+
14
+ ### Table body props
15
+
16
+ <PropsTable heading="" props={TableBodyProps} />
17
+
18
+ ### Table head props
19
+
20
+ <PropsTable heading="" props={TableHeadProps} />
21
+
22
+ ### HeadCell props
23
+
24
+ <PropsTable heading="" props={HeadCellProps} />
25
+
26
+ ### Row props
27
+
28
+ <PropsTable heading="" props={RowProps} />
29
+
30
+ ### Cell props
31
+
32
+ <PropsTable heading="" props={CellProps} />
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.default = void 0;
11
+
12
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
13
+
14
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
+
16
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
17
+
18
+ var _react = require("react");
19
+
20
+ var _react2 = require("@emotion/react");
21
+
22
+ var _selectionProvider = require("./hooks/selection-provider");
23
+
24
+ var _useRowId = require("./hooks/use-row-id");
25
+
26
+ var _useTable2 = require("./hooks/use-table");
27
+
28
+ var _useTableBody = require("./hooks/use-table-body");
29
+
30
+ var Primitives = _interopRequireWildcard(require("./ui"));
31
+
32
+ var _excluded = ["idx"];
33
+
34
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
35
+
36
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
37
+
38
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
39
+
40
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
41
+
42
+ /**
43
+ * __Table body__
44
+ */
45
+ function TBody(_ref) {
46
+ var rows = _ref.rows,
47
+ children = _ref.children;
48
+
49
+ var _useTable = (0, _useTable2.useTable)(),
50
+ sortKey = _useTable.sortKey,
51
+ sortDirection = _useTable.sortDirection;
52
+
53
+ var _useSelection = (0, _selectionProvider.useSelection)(),
54
+ _useSelection2 = (0, _slicedToArray2.default)(_useSelection, 2),
55
+ _state = _useSelection2[0],
56
+ _useSelection2$ = _useSelection2[1],
57
+ removeAll = _useSelection2$.removeAll,
58
+ setMax = _useSelection2$.setMax; // TODO this seems like something the user should control
59
+
60
+
61
+ (0, _react.useEffect)(function () {
62
+ if (removeAll) {
63
+ removeAll();
64
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
65
+
66
+ }, [rows]); // Set data length (via setMax) whenever data changes
67
+
68
+ (0, _react.useEffect)(function () {
69
+ var numRows = rows !== undefined ? rows.length : _react.Children.count(children);
70
+ setMax && setMax(numRows); // eslint-disable-next-line react-hooks/exhaustive-deps
71
+ }, [rows === null || rows === void 0 ? void 0 : rows.length, _react.Children.count(children)]);
72
+
73
+ var sortFn = function sortFn(rowA, rowB) {
74
+ if (sortKey === 'unset') {
75
+ return 0;
76
+ }
77
+
78
+ var ascendingComparator = rowA[sortKey] < rowB[sortKey] ? -1 : 1;
79
+ return sortDirection === 'ascending' ? ascendingComparator : -ascendingComparator;
80
+ };
81
+
82
+ return (0, _react2.jsx)(_useTableBody.TableBodyProvider, {
83
+ value: true
84
+ }, (0, _react2.jsx)(Primitives.TBody, null, typeof children === 'function' && rows ? rows.map(function (row, idx) {
85
+ return _objectSpread(_objectSpread({}, row), {}, {
86
+ idx: idx
87
+ });
88
+ }).sort(sortFn).map(function (_ref2) {
89
+ var idx = _ref2.idx,
90
+ row = (0, _objectWithoutProperties2.default)(_ref2, _excluded);
91
+ return (0, _react2.jsx)(_useRowId.RowProvider, {
92
+ key: idx,
93
+ value: idx
94
+ }, // @ts-expect-error
95
+ children(row));
96
+ }) : _react.Children.map(children, function (row, idx) {
97
+ return (0, _react2.jsx)(_useRowId.RowProvider, {
98
+ key: idx,
99
+ value: idx
100
+ }, row);
101
+ })));
102
+ }
103
+
104
+ var _default = TBody;
105
+ exports.default = _default;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = require("@emotion/react");
9
+
10
+ var _dsExplorations = require("@atlaskit/ds-explorations");
11
+
12
+ var _th = require("./ui/th");
13
+
14
+ /* eslint-disable no-unused-vars */
15
+
16
+ /** @jsx jsx */
17
+
18
+ /**
19
+ * __HeadCell__
20
+ *
21
+ * HeadCell element
22
+ */
23
+ var Column = function Column(_ref) {
24
+ var children = _ref.children,
25
+ align = _ref.align,
26
+ testId = _ref.testId,
27
+ backgroundColor = _ref.backgroundColor,
28
+ _ref$scope = _ref.scope,
29
+ scope = _ref$scope === void 0 ? 'col' : _ref$scope;
30
+ return (0, _react.jsx)(_th.TH, {
31
+ scope: scope,
32
+ align: align,
33
+ testId: testId,
34
+ backgroundColor: backgroundColor
35
+ }, (0, _react.jsx)(_dsExplorations.UNSAFE_Text, {
36
+ color: "color.text",
37
+ fontWeight: "500"
38
+ }, children));
39
+ };
40
+
41
+ var _default = Column;
42
+ exports.default = _default;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.useSelection = exports.default = void 0;
11
+
12
+ var _react = _interopRequireWildcard(require("react"));
13
+
14
+ var _useSelectable = _interopRequireDefault(require("./use-selectable"));
15
+
16
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
+
18
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
+
20
+ var SelectionContext = /*#__PURE__*/(0, _react.createContext)([{
21
+ checked: [],
22
+ allChecked: false,
23
+ anyChecked: false,
24
+ maxChecked: 0,
25
+ selectionStart: -1,
26
+ previousSelection: []
27
+ }, {}]);
28
+ /**
29
+ * __Selection provider__
30
+ *
31
+ * A selection provider injects selection specific state into the table.
32
+ *
33
+ * - [Examples](https://atlassian.design/components/{packageName}/examples)
34
+ * - [Code](https://atlassian.design/components/{packageName}/code)
35
+ * - [Usage](https://atlassian.design/components/{packageName}/usage)
36
+ */
37
+
38
+ var SelectionProvider = function SelectionProvider(_ref) {
39
+ var children = _ref.children;
40
+ var reducer = (0, _useSelectable.default)();
41
+ return /*#__PURE__*/_react.default.createElement(SelectionContext.Provider, {
42
+ value: reducer
43
+ }, children);
44
+ };
45
+
46
+ var useSelection = function useSelection() {
47
+ return (0, _react.useContext)(SelectionContext);
48
+ };
49
+
50
+ exports.useSelection = useSelection;
51
+ var _default = SelectionProvider;
52
+ exports.default = _default;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useRowId = exports.RowProvider = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ var RowContext = /*#__PURE__*/(0, _react.createContext)(undefined);
11
+ /**
12
+ * @internal
13
+ */
14
+
15
+ var useRowId = function useRowId() {
16
+ return (0, _react.useContext)(RowContext);
17
+ };
18
+ /**
19
+ * __Row provider__
20
+ * @internal
21
+ */
22
+
23
+
24
+ exports.useRowId = useRowId;
25
+ var RowProvider = RowContext.Provider;
26
+ exports.RowProvider = RowProvider;
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+
12
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
+
14
+ var _react = require("react");
15
+
16
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
17
+
18
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
19
+
20
+ var defaultState = {
21
+ checked: [],
22
+ allChecked: false,
23
+ anyChecked: false,
24
+ maxChecked: 0,
25
+ selectionStart: -1,
26
+ previousSelection: []
27
+ };
28
+
29
+ var arrayFromRange = function arrayFromRange(from, to) {
30
+ var startIdx = from;
31
+ var stopIdx = to;
32
+ var increment = 1;
33
+
34
+ if (from > to) {
35
+ startIdx = to;
36
+ stopIdx = from;
37
+ increment = 0;
38
+ } // Create an array with values between `from` and `to` - either ascending or descending
39
+
40
+
41
+ return Array.from({
42
+ length: stopIdx - startIdx
43
+ }, function (_, i) {
44
+ return startIdx + i + increment;
45
+ });
46
+ };
47
+
48
+ function reducer(_ref, action) {
49
+ var checked = _ref.checked,
50
+ anyChecked = _ref.anyChecked,
51
+ maxChecked = _ref.maxChecked,
52
+ selectionStart = _ref.selectionStart,
53
+ previousSelection = _ref.previousSelection;
54
+
55
+ switch (action.type) {
56
+ case 'toggle_selection':
57
+ {
58
+ var _action$value = action.value,
59
+ id = _action$value.id,
60
+ shiftHeld = _action$value.shiftHeld;
61
+ var updated = checked.slice();
62
+ var newSelectionStart = selectionStart;
63
+ var newPreviousSelection = previousSelection.slice();
64
+
65
+ if (shiftHeld) {
66
+ if (checked.length > 0) {
67
+ var newIds = arrayFromRange(selectionStart, id); // create an array of the new ids
68
+ // Uncheck ids from the previous selection.
69
+ // This is done to maintain consistency with Shift-select behaviour elsewhere (e.g. macOS)
70
+ // TODO: Code could be improved to only remove ids that are not included in the new range, avoiding needing to re-add them below
71
+
72
+ updated = updated.filter(function (id) {
73
+ return !previousSelection.includes(id);
74
+ });
75
+ newIds.forEach(function (id) {
76
+ return updated.indexOf(id) === -1 && updated.push(id);
77
+ } // If the new id is not already checked, check it
78
+ );
79
+ newPreviousSelection = newIds; // Maintain an array of the previous selection to allow for consistent Shift-select behaviour
80
+ }
81
+ } else {
82
+ var checkedIndex = checked.indexOf(id); // is index already checked
83
+
84
+ if (checkedIndex !== -1) {
85
+ updated.splice(checkedIndex, 1); // if index is already checked, uncheck
86
+ } else {
87
+ updated.push(id); // if index is not checked, check
88
+ }
89
+
90
+ newSelectionStart = id; // Reset selection start id to this non-shift-selected id
91
+
92
+ newPreviousSelection = []; // Reset previous selection as it is no longer relevant once a new non-shift-selected id is added
93
+ }
94
+
95
+ var _anyChecked = updated.length > 0;
96
+
97
+ return {
98
+ checked: updated,
99
+ allChecked: updated.length === maxChecked,
100
+ anyChecked: _anyChecked || Boolean(updated[id]),
101
+ maxChecked: maxChecked,
102
+ selectionStart: newSelectionStart,
103
+ previousSelection: newPreviousSelection
104
+ };
105
+ }
106
+
107
+ case 'set_root':
108
+ return {
109
+ checked: action.value ? Array.from(Array(maxChecked).keys()) : [],
110
+ allChecked: action.value,
111
+ anyChecked: Boolean(action.value),
112
+ maxChecked: maxChecked,
113
+ selectionStart: selectionStart,
114
+ previousSelection: previousSelection
115
+ };
116
+
117
+ case 'set_max':
118
+ {
119
+ var max = action.value;
120
+ return {
121
+ maxChecked: max,
122
+ allChecked: checked.length === max,
123
+ anyChecked: anyChecked,
124
+ checked: checked,
125
+ selectionStart: selectionStart,
126
+ previousSelection: previousSelection
127
+ };
128
+ }
129
+
130
+ default:
131
+ throw new Error();
132
+ }
133
+ }
134
+
135
+ var initialiseState = function initialiseState() {
136
+ return _objectSpread(_objectSpread({}, defaultState), {}, {
137
+ checked: []
138
+ });
139
+ };
140
+
141
+ function useSelectable() {
142
+ var _useReducer = (0, _react.useReducer)(reducer, initialiseState()),
143
+ _useReducer2 = (0, _slicedToArray2.default)(_useReducer, 2),
144
+ state = _useReducer2[0],
145
+ dispatch = _useReducer2[1];
146
+
147
+ var toggleSelection = (0, _react.useCallback)(function (id, shiftHeld) {
148
+ dispatch({
149
+ type: 'toggle_selection',
150
+ value: {
151
+ id: id,
152
+ shiftHeld: shiftHeld
153
+ }
154
+ });
155
+ }, []);
156
+ var setAll = (0, _react.useCallback)(function () {
157
+ dispatch({
158
+ type: 'set_root',
159
+ value: true
160
+ });
161
+ }, []);
162
+ var removeAll = (0, _react.useCallback)(function () {
163
+ dispatch({
164
+ type: 'set_root',
165
+ value: false
166
+ });
167
+ }, []);
168
+ var setMax = (0, _react.useCallback)(function (max) {
169
+ dispatch({
170
+ type: 'set_max',
171
+ value: max
172
+ });
173
+ }, []);
174
+ return [state, {
175
+ setAll: setAll,
176
+ removeAll: removeAll,
177
+ toggleSelection: toggleSelection,
178
+ setMax: setMax
179
+ }];
180
+ }
181
+
182
+ var _default = useSelectable;
183
+ exports.default = _default;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.useSorting = void 0;
9
+
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+
12
+ var _react = require("react");
13
+
14
+ var useSorting = function useSorting(sortKey) {
15
+ var _useState = (0, _react.useState)(sortKey),
16
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
17
+ localSortKey = _useState2[0],
18
+ setLocalSortKey = _useState2[1];
19
+
20
+ var _useState3 = (0, _react.useState)(),
21
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
22
+ localSortDirection = _useState4[0],
23
+ setLocalSortDirection = _useState4[1];
24
+
25
+ var toggleSortDirection = (0, _react.useCallback)(function () {
26
+ setLocalSortDirection(function (oldLocalSortDirection) {
27
+ switch (oldLocalSortDirection) {
28
+ case undefined:
29
+ return 'ascending';
30
+
31
+ case 'ascending':
32
+ return 'descending';
33
+
34
+ case 'descending':
35
+ return 'ascending';
36
+ }
37
+ });
38
+ }, []);
39
+ var setSortState = (0, _react.useCallback)(function (key) {
40
+ setLocalSortKey(function (localSortKey) {
41
+ if (key !== localSortKey) {
42
+ // sorting by different column
43
+ setLocalSortDirection('ascending');
44
+ return key;
45
+ } else {
46
+ toggleSortDirection();
47
+ }
48
+
49
+ return localSortKey;
50
+ });
51
+ }, [toggleSortDirection]);
52
+ return {
53
+ sortKey: localSortKey,
54
+ sortDirection: localSortDirection,
55
+ setSortState: setSortState
56
+ };
57
+ };
58
+
59
+ exports.useSorting = useSorting;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.useTableBody = exports.TableBodyProvider = void 0;
9
+
10
+ var _react = require("react");
11
+
12
+ var _tinyInvariant = _interopRequireDefault(require("tiny-invariant"));
13
+
14
+ var TableBodyContext = /*#__PURE__*/(0, _react.createContext)(false);
15
+ /**
16
+ * __Table body provider__
17
+ * Ensures correct nesting of table elements.
18
+ */
19
+
20
+ var TableBodyProvider = TableBodyContext.Provider;
21
+ exports.TableBodyProvider = TableBodyProvider;
22
+
23
+ var useTableBody = function useTableBody() {
24
+ var hasTableBody = (0, _react.useContext)(TableBodyContext);
25
+ (0, _tinyInvariant.default)(hasTableBody, '<Row /> must be nested inside a <TableBody>');
26
+ };
27
+
28
+ exports.useTableBody = useTableBody;