@fluentui/react-table 9.0.0-alpha.6 → 9.0.0-alpha.7

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 (54) hide show
  1. package/CHANGELOG.json +103 -2
  2. package/CHANGELOG.md +24 -3
  3. package/dist/index.d.ts +19 -4
  4. package/lib/components/Table/useTableStyles.js +2 -2
  5. package/lib/components/Table/useTableStyles.js.map +1 -1
  6. package/lib/components/TableHeader/renderTableHeader.js +5 -2
  7. package/lib/components/TableHeader/renderTableHeader.js.map +1 -1
  8. package/lib/components/TableHeaderCell/useTableHeaderCellStyles.js +8 -2
  9. package/lib/components/TableHeaderCell/useTableHeaderCellStyles.js.map +1 -1
  10. package/lib/components/TableRow/TableRow.types.js.map +1 -1
  11. package/lib/components/TableRow/useTableRow.js +7 -4
  12. package/lib/components/TableRow/useTableRow.js.map +1 -1
  13. package/lib/components/TableRow/useTableRowStyles.js +158 -6
  14. package/lib/components/TableRow/useTableRowStyles.js.map +1 -1
  15. package/lib/components/TableSelectionCell/TableSelectionCell.types.js.map +1 -1
  16. package/lib/components/TableSelectionCell/useTableSelectionCell.js +13 -9
  17. package/lib/components/TableSelectionCell/useTableSelectionCell.js.map +1 -1
  18. package/lib/components/TableSelectionCell/useTableSelectionCellStyles.js +12 -3
  19. package/lib/components/TableSelectionCell/useTableSelectionCellStyles.js.map +1 -1
  20. package/lib/contexts/tableHeaderContext.js +6 -0
  21. package/lib/contexts/tableHeaderContext.js.map +1 -0
  22. package/lib-commonjs/components/Table/useTableStyles.js +2 -2
  23. package/lib-commonjs/components/Table/useTableStyles.js.map +1 -1
  24. package/lib-commonjs/components/TableHeader/renderTableHeader.js +6 -2
  25. package/lib-commonjs/components/TableHeader/renderTableHeader.js.map +1 -1
  26. package/lib-commonjs/components/TableHeaderCell/useTableHeaderCellStyles.js +8 -2
  27. package/lib-commonjs/components/TableHeaderCell/useTableHeaderCellStyles.js.map +1 -1
  28. package/lib-commonjs/components/TableRow/useTableRow.js +7 -3
  29. package/lib-commonjs/components/TableRow/useTableRow.js.map +1 -1
  30. package/lib-commonjs/components/TableRow/useTableRowStyles.js +161 -6
  31. package/lib-commonjs/components/TableRow/useTableRowStyles.js.map +1 -1
  32. package/lib-commonjs/components/TableSelectionCell/useTableSelectionCell.js +13 -10
  33. package/lib-commonjs/components/TableSelectionCell/useTableSelectionCell.js.map +1 -1
  34. package/lib-commonjs/components/TableSelectionCell/useTableSelectionCellStyles.js +13 -3
  35. package/lib-commonjs/components/TableSelectionCell/useTableSelectionCellStyles.js.map +1 -1
  36. package/lib-commonjs/contexts/tableHeaderContext.js +17 -0
  37. package/lib-commonjs/contexts/tableHeaderContext.js.map +1 -0
  38. package/package.json +14 -13
  39. package/lib/navigationModes/cell.js +0 -250
  40. package/lib/navigationModes/cell.js.map +0 -1
  41. package/lib/navigationModes/composite.js +0 -208
  42. package/lib/navigationModes/composite.js.map +0 -1
  43. package/lib/navigationModes/index.js +0 -3
  44. package/lib/navigationModes/index.js.map +0 -1
  45. package/lib/navigationModes/useNavigationMode.js +0 -42
  46. package/lib/navigationModes/useNavigationMode.js.map +0 -1
  47. package/lib-commonjs/navigationModes/cell.js +0 -259
  48. package/lib-commonjs/navigationModes/cell.js.map +0 -1
  49. package/lib-commonjs/navigationModes/composite.js +0 -217
  50. package/lib-commonjs/navigationModes/composite.js.map +0 -1
  51. package/lib-commonjs/navigationModes/index.js +0 -16
  52. package/lib-commonjs/navigationModes/index.js.map +0 -1
  53. package/lib-commonjs/navigationModes/useNavigationMode.js +0 -55
  54. package/lib-commonjs/navigationModes/useNavigationMode.js.map +0 -1
@@ -1,208 +0,0 @@
1
- export function applyCompositeNavigation(element) {
2
- const container = element;
3
- let mode = 'row';
4
- let movingOut = false;
5
- const pre = document.createElement('div');
6
- const post = document.createElement('div');
7
-
8
- if (!pre || !post) {
9
- return;
10
- }
11
-
12
- pre.tabIndex = 0;
13
- post.tabIndex = 0;
14
- pre.addEventListener('focus', () => {
15
- if (movingOut) {
16
- movingOut = false;
17
- return;
18
- } else {
19
- treeWalker.currentNode = container;
20
- mode = 'row';
21
- const candidate = treeWalker.nextNode();
22
-
23
- if (isHTMLElement(candidate)) {
24
- candidate.focus();
25
- }
26
- }
27
- });
28
- post.addEventListener('focus', () => {
29
- if (movingOut) {
30
- movingOut = false;
31
- return;
32
- } else {
33
- treeWalker.currentNode = post;
34
- mode = 'row';
35
- const candidate = treeWalker.previousNode();
36
-
37
- if (isHTMLElement(candidate)) {
38
- candidate.focus();
39
- }
40
- }
41
- });
42
- container.before(pre);
43
- container.after(post);
44
-
45
- const acceptNode = node => {
46
- if (!isHTMLElement(node)) {
47
- return NodeFilter.FILTER_SKIP;
48
- }
49
-
50
- if (!isCell(node) && !isRow(node)) {
51
- return NodeFilter.FILTER_SKIP;
52
- }
53
-
54
- if (mode === 'column' && isRow(node)) {
55
- return NodeFilter.FILTER_REJECT;
56
- }
57
-
58
- if (mode === 'row' && isCell(node)) {
59
- return NodeFilter.FILTER_REJECT;
60
- }
61
-
62
- if (node.tabIndex < 0) {
63
- return NodeFilter.FILTER_SKIP;
64
- }
65
-
66
- return NodeFilter.FILTER_ACCEPT;
67
- };
68
-
69
- const treeWalker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT, {
70
- acceptNode
71
- });
72
-
73
- const up = current => {
74
- const prevMode = mode;
75
- mode = 'row';
76
- treeWalker.currentNode = current;
77
-
78
- if (prevMode === 'column') {
79
- treeWalker.previousNode();
80
- }
81
-
82
- const node = treeWalker.previousNode();
83
-
84
- if (isHTMLElement(node)) {
85
- return node;
86
- }
87
-
88
- return null;
89
- };
90
-
91
- const down = current => {
92
- mode = 'row';
93
- treeWalker.currentNode = current;
94
- const node = treeWalker.nextNode();
95
-
96
- if (isHTMLElement(node)) {
97
- return node;
98
- }
99
-
100
- return null;
101
- };
102
-
103
- const left = current => {
104
- treeWalker.currentNode = current;
105
- const prevMode = mode;
106
- mode = 'column';
107
- let node = null;
108
-
109
- if (prevMode === 'row') {
110
- let tmp = null;
111
-
112
- while (tmp = treeWalker.nextNode()) {
113
- node = tmp;
114
- }
115
- } else {
116
- node = treeWalker.previousNode();
117
- }
118
-
119
- if (isHTMLElement(node)) {
120
- return node;
121
- }
122
-
123
- return null;
124
- };
125
-
126
- const right = current => {
127
- mode = 'column';
128
- treeWalker.currentNode = current;
129
- const node = treeWalker.nextNode();
130
-
131
- if (isHTMLElement(node)) {
132
- return node;
133
- }
134
-
135
- return null;
136
- };
137
-
138
- const onKeyDown = e => {
139
- const target = e.target;
140
-
141
- if (!target || !isHTMLElement(target)) {
142
- return;
143
- }
144
-
145
- let next = null;
146
-
147
- switch (e.key) {
148
- case 'ArrowDown':
149
- next = down(target);
150
- break;
151
-
152
- case 'ArrowUp':
153
- next = up(target);
154
- break;
155
-
156
- case 'ArrowLeft':
157
- next = left(target);
158
- break;
159
-
160
- case 'ArrowRight':
161
- next = right(target);
162
- break;
163
-
164
- case 'Tab':
165
- movingOut = true;
166
-
167
- if (e.shiftKey) {
168
- pre.focus();
169
- } else {
170
- post.focus();
171
- }
172
-
173
- break;
174
-
175
- default:
176
- break;
177
- }
178
-
179
- if (next) {
180
- e.preventDefault();
181
- next.focus();
182
- }
183
- };
184
-
185
- container.addEventListener('keydown', onKeyDown);
186
- return () => container.removeEventListener('keydown', onKeyDown);
187
- }
188
-
189
- function isHTMLElement(node) {
190
- return node instanceof HTMLElement;
191
- }
192
-
193
- function isRow(element) {
194
- if (element.getAttribute('role') === 'row' || element.tagName === 'TR') {
195
- return true;
196
- }
197
-
198
- return false;
199
- }
200
-
201
- function isCell(element) {
202
- if (element.getAttribute('role') === 'cell' || element.getAttribute('role') === 'gridcell' || element.tagName === 'TD') {
203
- return true;
204
- }
205
-
206
- return false;
207
- }
208
- //# sourceMappingURL=composite.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["packages/react-components/react-table/src/navigationModes/composite.ts"],"names":[],"mappings":"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","sourcesContent":["export function applyCompositeNavigation(element: HTMLElement) {\n const container = element;\n let mode: 'row' | 'column' = 'row';\n let movingOut = false;\n\n const pre = document.createElement('div');\n const post = document.createElement('div');\n\n if (!pre || !post) {\n return;\n }\n\n pre.tabIndex = 0;\n post.tabIndex = 0;\n\n pre.addEventListener('focus', () => {\n if (movingOut) {\n movingOut = false;\n return;\n } else {\n treeWalker.currentNode = container;\n mode = 'row';\n const candidate = treeWalker.nextNode();\n if (isHTMLElement(candidate)) {\n candidate.focus();\n }\n }\n });\n\n post.addEventListener('focus', () => {\n if (movingOut) {\n movingOut = false;\n return;\n } else {\n treeWalker.currentNode = post;\n mode = 'row';\n const candidate = treeWalker.previousNode();\n if (isHTMLElement(candidate)) {\n candidate.focus();\n }\n }\n });\n\n container.before(pre);\n container.after(post);\n\n const acceptNode = (node: Node) => {\n if (!isHTMLElement(node)) {\n return NodeFilter.FILTER_SKIP;\n }\n\n if (!isCell(node) && !isRow(node)) {\n return NodeFilter.FILTER_SKIP;\n }\n\n if (mode === 'column' && isRow(node)) {\n return NodeFilter.FILTER_REJECT;\n }\n\n if (mode === 'row' && isCell(node)) {\n return NodeFilter.FILTER_REJECT;\n }\n\n if (node.tabIndex < 0) {\n return NodeFilter.FILTER_SKIP;\n }\n\n return NodeFilter.FILTER_ACCEPT;\n };\n\n const treeWalker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT, { acceptNode });\n\n const up = (current: HTMLElement) => {\n const prevMode = mode;\n mode = 'row';\n treeWalker.currentNode = current;\n\n if (prevMode === 'column') {\n treeWalker.previousNode();\n }\n\n const node = treeWalker.previousNode();\n if (isHTMLElement(node)) {\n return node;\n }\n return null;\n };\n\n const down = (current: HTMLElement) => {\n mode = 'row';\n treeWalker.currentNode = current;\n const node = treeWalker.nextNode();\n if (isHTMLElement(node)) {\n return node;\n }\n return null;\n };\n\n const left = (current: HTMLElement) => {\n treeWalker.currentNode = current;\n const prevMode = mode;\n mode = 'column';\n let node: Node | null = null;\n\n if (prevMode === 'row') {\n let tmp: Node | null = null;\n while ((tmp = treeWalker.nextNode())) {\n node = tmp;\n }\n } else {\n node = treeWalker.previousNode();\n }\n\n if (isHTMLElement(node)) {\n return node;\n }\n return null;\n };\n\n const right = (current: HTMLElement) => {\n mode = 'column';\n treeWalker.currentNode = current;\n const node = treeWalker.nextNode();\n if (isHTMLElement(node)) {\n return node;\n }\n return null;\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n const target = e.target;\n if (!target || !isHTMLElement(target)) {\n return;\n }\n\n let next: HTMLElement | null = null;\n\n switch (e.key) {\n case 'ArrowDown':\n next = down(target);\n break;\n case 'ArrowUp':\n next = up(target);\n break;\n case 'ArrowLeft':\n next = left(target);\n break;\n case 'ArrowRight':\n next = right(target);\n break;\n case 'Tab':\n movingOut = true;\n if (e.shiftKey) {\n pre.focus();\n } else {\n post.focus();\n }\n\n break;\n default:\n break;\n }\n\n if (next) {\n e.preventDefault();\n next.focus();\n }\n };\n\n container.addEventListener('keydown', onKeyDown);\n return () => container.removeEventListener('keydown', onKeyDown);\n}\n\nfunction isHTMLElement(node: unknown): node is HTMLElement {\n return node instanceof HTMLElement;\n}\n\nfunction isRow(element: HTMLElement) {\n if (element.getAttribute('role') === 'row' || element.tagName === 'TR') {\n return true;\n }\n\n return false;\n}\n\nfunction isCell(element: HTMLElement) {\n if (\n element.getAttribute('role') === 'cell' ||\n element.getAttribute('role') === 'gridcell' ||\n element.tagName === 'TD'\n ) {\n return true;\n }\n\n return false;\n}\n"],"sourceRoot":"../src/"}
@@ -1,3 +0,0 @@
1
- // eslint-disable-next-line deprecation/deprecation
2
- export { useNavigationMode } from './useNavigationMode';
3
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../src/","sources":["packages/react-components/react-table/src/navigationModes/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC","sourcesContent":["// eslint-disable-next-line deprecation/deprecation\nexport { useNavigationMode } from './useNavigationMode';\n"]}
@@ -1,42 +0,0 @@
1
- import * as React from 'react';
2
- import { useArrowNavigationGroup } from '@fluentui/react-tabster';
3
- import { applyCompositeNavigation } from './composite';
4
- import { applyCellNavigation } from './cell';
5
- /**
6
- * THIS HOOK WILL NOT EXIST IN STABLE RELEASE
7
- * Just a quick workaround before tabster fully supports these navigation modes with grid mode
8
- * https://github.com/microsoft/fluentui/issues/24382
9
- * @internal
10
- * @deprecated
11
- */
12
-
13
- export function useNavigationMode(mode) {
14
- const rowNavigationAttr = useArrowNavigationGroup({
15
- axis: 'vertical'
16
- });
17
- const ref = React.useRef(null);
18
- React.useEffect(() => {
19
- if (!ref.current) {
20
- return;
21
- }
22
-
23
- switch (mode) {
24
- case 'cell':
25
- applyCellNavigation(ref.current);
26
- break;
27
-
28
- case 'composite':
29
- applyCompositeNavigation(ref.current);
30
- break;
31
-
32
- case 'row':
33
- if (rowNavigationAttr['data-tabster']) {
34
- ref.current.setAttribute('data-tabster', rowNavigationAttr['data-tabster']);
35
- }
36
-
37
- break;
38
- }
39
- }, [rowNavigationAttr, mode]);
40
- return ref;
41
- }
42
- //# sourceMappingURL=useNavigationMode.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["packages/react-components/react-table/src/navigationModes/useNavigationMode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAZ,MAAuB,OAAvB;AACA,SAAS,uBAAT,QAAwC,yBAAxC;AACA,SAAS,wBAAT,QAAyC,aAAzC;AACA,SAAS,mBAAT,QAAoC,QAApC;AAIA;;;;;;AAMG;;AACH,OAAM,SAAU,iBAAV,CAA0D,IAA1D,EAA8E;EAClF,MAAM,iBAAiB,GAAG,uBAAuB,CAAC;IAAE,IAAI,EAAE;EAAR,CAAD,CAAjD;EACA,MAAM,GAAG,GAAG,KAAK,CAAC,MAAN,CAAuB,IAAvB,CAAZ;EAEA,KAAK,CAAC,SAAN,CAAgB,MAAK;IACnB,IAAI,CAAC,GAAG,CAAC,OAAT,EAAkB;MAChB;IACD;;IAED,QAAQ,IAAR;MACE,KAAK,MAAL;QACE,mBAAmB,CAAC,GAAG,CAAC,OAAL,CAAnB;QACA;;MACF,KAAK,WAAL;QACE,wBAAwB,CAAC,GAAG,CAAC,OAAL,CAAxB;QACA;;MACF,KAAK,KAAL;QACE,IAAI,iBAAiB,CAAC,cAAD,CAArB,EAAuC;UACrC,GAAG,CAAC,OAAJ,CAAY,YAAZ,CAAyB,cAAzB,EAAyC,iBAAiB,CAAC,cAAD,CAA1D;QACD;;QACD;IAXJ;EAaD,CAlBD,EAkBG,CAAC,iBAAD,EAAoB,IAApB,CAlBH;EAoBA,OAAO,GAAP;AACD","sourcesContent":["import * as React from 'react';\nimport { useArrowNavigationGroup } from '@fluentui/react-tabster';\nimport { applyCompositeNavigation } from './composite';\nimport { applyCellNavigation } from './cell';\n\nexport type NavigationMode = 'row' | 'cell' | 'composite';\n\n/**\n * THIS HOOK WILL NOT EXIST IN STABLE RELEASE\n * Just a quick workaround before tabster fully supports these navigation modes with grid mode\n * https://github.com/microsoft/fluentui/issues/24382\n * @internal\n * @deprecated\n */\nexport function useNavigationMode<TElement extends HTMLElement>(mode: NavigationMode) {\n const rowNavigationAttr = useArrowNavigationGroup({ axis: 'vertical' });\n const ref = React.useRef<TElement>(null);\n\n React.useEffect(() => {\n if (!ref.current) {\n return;\n }\n\n switch (mode) {\n case 'cell':\n applyCellNavigation(ref.current);\n break;\n case 'composite':\n applyCompositeNavigation(ref.current);\n break;\n case 'row':\n if (rowNavigationAttr['data-tabster']) {\n ref.current.setAttribute('data-tabster', rowNavigationAttr['data-tabster']);\n }\n break;\n }\n }, [rowNavigationAttr, mode]);\n\n return ref;\n}\n"],"sourceRoot":"../src/"}
@@ -1,259 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.applyCellNavigation = void 0;
7
-
8
- function applyCellNavigation(element) {
9
- const container = element;
10
- let column = 0;
11
- let mode = undefined;
12
- let movingOut = false;
13
- const pre = document.createElement('div');
14
- const post = document.createElement('div');
15
-
16
- if (!pre || !post) {
17
- return;
18
- }
19
-
20
- pre.tabIndex = 0;
21
- post.tabIndex = 0;
22
- pre.addEventListener('focus', () => {
23
- if (movingOut) {
24
- movingOut = false;
25
- return;
26
- } else {
27
- treeWalker.currentNode = container;
28
- const candidate = treeWalker.nextNode();
29
-
30
- if (isHTMLElement(candidate)) {
31
- column = 0;
32
- candidate.focus();
33
- }
34
- }
35
- });
36
- post.addEventListener('focus', () => {
37
- if (movingOut) {
38
- movingOut = false;
39
- return;
40
- } else {
41
- treeWalker.currentNode = post;
42
- const candidate = treeWalker.previousNode();
43
-
44
- if (isHTMLElement(candidate)) {
45
- column = findColumnCount(candidate);
46
- candidate.focus();
47
- }
48
- }
49
- });
50
- container.before(pre);
51
- container.after(post);
52
-
53
- const acceptNode = node => {
54
- if (!isHTMLElement(node)) {
55
- return NodeFilter.FILTER_SKIP;
56
- }
57
-
58
- if (mode === 'column') {
59
- return acceptCell(node);
60
- }
61
-
62
- if (mode === 'row') {
63
- return acceptRow(node);
64
- }
65
-
66
- if (node.tabIndex >= 0) {
67
- return NodeFilter.FILTER_ACCEPT;
68
- }
69
-
70
- return NodeFilter.FILTER_SKIP;
71
- };
72
-
73
- const acceptCell = node => {
74
- if (isRow(node)) {
75
- return NodeFilter.FILTER_REJECT;
76
- }
77
-
78
- if (node.tabIndex < 0) {
79
- return NodeFilter.FILTER_SKIP;
80
- }
81
-
82
- return NodeFilter.FILTER_ACCEPT;
83
- };
84
-
85
- const acceptRow = node => {
86
- if (isRow(node)) {
87
- return NodeFilter.FILTER_ACCEPT;
88
- }
89
-
90
- return NodeFilter.FILTER_SKIP;
91
- };
92
-
93
- const treeWalker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT, {
94
- acceptNode
95
- });
96
-
97
- const up = current => {
98
- mode = 'row';
99
- treeWalker.currentNode = current;
100
- treeWalker.previousNode(); // current row
101
-
102
- const row = treeWalker.previousNode();
103
-
104
- if (!row) {
105
- return null;
106
- }
107
-
108
- mode = 'column';
109
- treeWalker.currentNode = row;
110
- let curCol = 0;
111
- let node = null;
112
-
113
- while (curCol <= column) {
114
- node = treeWalker.nextNode();
115
- curCol++;
116
- }
117
-
118
- if (isHTMLElement(node)) {
119
- return node;
120
- }
121
-
122
- return null;
123
- };
124
-
125
- const down = current => {
126
- mode = 'row';
127
- treeWalker.currentNode = current;
128
- const row = treeWalker.nextNode();
129
-
130
- if (!row) {
131
- return null;
132
- }
133
-
134
- mode = 'column';
135
- treeWalker.currentNode = row;
136
- let curCol = 0;
137
- let node = null;
138
-
139
- while (curCol <= column) {
140
- node = treeWalker.nextNode();
141
- curCol++;
142
- }
143
-
144
- if (isHTMLElement(node)) {
145
- return node;
146
- }
147
-
148
- return null;
149
- };
150
-
151
- const left = current => {
152
- treeWalker.currentNode = current;
153
- mode = 'column';
154
- const node = treeWalker.previousNode();
155
-
156
- if (isHTMLElement(node)) {
157
- column--;
158
- return node;
159
- }
160
-
161
- return null;
162
- };
163
-
164
- const right = current => {
165
- mode = 'column';
166
- treeWalker.currentNode = current;
167
- const node = treeWalker.nextNode();
168
-
169
- if (isHTMLElement(node)) {
170
- column++;
171
- return node;
172
- }
173
-
174
- return null;
175
- };
176
-
177
- const onKeyDown = e => {
178
- const target = e.target;
179
-
180
- if (!target || !isHTMLElement(target)) {
181
- return;
182
- }
183
-
184
- let next = null;
185
-
186
- switch (e.key) {
187
- case 'ArrowDown':
188
- next = down(target);
189
- break;
190
-
191
- case 'ArrowUp':
192
- next = up(target);
193
- break;
194
-
195
- case 'ArrowLeft':
196
- next = left(target);
197
- break;
198
-
199
- case 'ArrowRight':
200
- next = right(target);
201
- break;
202
-
203
- case 'Tab':
204
- movingOut = true;
205
-
206
- if (e.shiftKey) {
207
- pre.focus();
208
- } else {
209
- post.focus();
210
- }
211
-
212
- break;
213
-
214
- default:
215
- return;
216
- }
217
-
218
- if (next) {
219
- e.preventDefault();
220
- next.focus();
221
- }
222
- };
223
-
224
- const onFocusOut = () => {
225
- mode = undefined;
226
- };
227
-
228
- container.addEventListener('keydown', onKeyDown);
229
- container.addEventListener('focusout', onFocusOut);
230
- return () => {
231
- container.removeEventListener('focusout', onFocusOut);
232
- container.removeEventListener('keydown', onKeyDown);
233
- };
234
- }
235
-
236
- exports.applyCellNavigation = applyCellNavigation;
237
-
238
- function isHTMLElement(node) {
239
- return node instanceof HTMLElement;
240
- }
241
-
242
- function isRow(element) {
243
- if (element.getAttribute('role') === 'row' || element.tagName === 'TR') {
244
- return true;
245
- }
246
-
247
- return false;
248
- }
249
-
250
- function findColumnCount(node) {
251
- let cur = node;
252
-
253
- while (cur.parentElement && !isRow(cur)) {
254
- cur = cur.parentElement;
255
- }
256
-
257
- return cur.querySelectorAll('[role="cell"], [role="gridcell"], td').length - 1;
258
- }
259
- //# sourceMappingURL=cell.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["packages/react-components/react-table/src/navigationModes/cell.ts"],"names":[],"mappings":"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","sourcesContent":["export function applyCellNavigation(element: HTMLElement) {\n const container = element;\n let column = 0;\n let mode: 'row' | 'column' | undefined = undefined;\n let movingOut = false;\n\n const pre = document.createElement('div');\n const post = document.createElement('div');\n\n if (!pre || !post) {\n return;\n }\n\n pre.tabIndex = 0;\n post.tabIndex = 0;\n\n pre.addEventListener('focus', () => {\n if (movingOut) {\n movingOut = false;\n return;\n } else {\n treeWalker.currentNode = container;\n const candidate = treeWalker.nextNode();\n if (isHTMLElement(candidate)) {\n column = 0;\n candidate.focus();\n }\n }\n });\n\n post.addEventListener('focus', () => {\n if (movingOut) {\n movingOut = false;\n return;\n } else {\n treeWalker.currentNode = post;\n const candidate = treeWalker.previousNode();\n if (isHTMLElement(candidate)) {\n column = findColumnCount(candidate);\n candidate.focus();\n }\n }\n });\n\n container.before(pre);\n container.after(post);\n\n const acceptNode = (node: Node) => {\n if (!isHTMLElement(node)) {\n return NodeFilter.FILTER_SKIP;\n }\n\n if (mode === 'column') {\n return acceptCell(node);\n }\n\n if (mode === 'row') {\n return acceptRow(node);\n }\n\n if (node.tabIndex >= 0) {\n return NodeFilter.FILTER_ACCEPT;\n }\n\n return NodeFilter.FILTER_SKIP;\n };\n\n const acceptCell = (node: HTMLElement) => {\n if (isRow(node)) {\n return NodeFilter.FILTER_REJECT;\n }\n\n if (node.tabIndex < 0) {\n return NodeFilter.FILTER_SKIP;\n }\n\n return NodeFilter.FILTER_ACCEPT;\n };\n\n const acceptRow = (node: HTMLElement) => {\n if (isRow(node)) {\n return NodeFilter.FILTER_ACCEPT;\n }\n\n return NodeFilter.FILTER_SKIP;\n };\n\n const treeWalker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT, { acceptNode });\n\n const up = (current: HTMLElement) => {\n mode = 'row';\n treeWalker.currentNode = current;\n treeWalker.previousNode(); // current row\n const row = treeWalker.previousNode();\n if (!row) {\n return null;\n }\n\n mode = 'column';\n treeWalker.currentNode = row;\n let curCol = 0;\n let node: Node | null = null;\n while (curCol <= column) {\n node = treeWalker.nextNode();\n curCol++;\n }\n if (isHTMLElement(node)) {\n return node;\n }\n return null;\n };\n\n const down = (current: HTMLElement) => {\n mode = 'row';\n treeWalker.currentNode = current;\n const row = treeWalker.nextNode();\n if (!row) {\n return null;\n }\n\n mode = 'column';\n treeWalker.currentNode = row;\n let curCol = 0;\n let node: Node | null = null;\n while (curCol <= column) {\n node = treeWalker.nextNode();\n curCol++;\n }\n if (isHTMLElement(node)) {\n return node;\n }\n return null;\n };\n\n const left = (current: HTMLElement) => {\n treeWalker.currentNode = current;\n mode = 'column';\n const node = treeWalker.previousNode();\n\n if (isHTMLElement(node)) {\n column--;\n return node;\n }\n return null;\n };\n\n const right = (current: HTMLElement) => {\n mode = 'column';\n treeWalker.currentNode = current;\n const node = treeWalker.nextNode();\n if (isHTMLElement(node)) {\n column++;\n return node;\n }\n return null;\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n const target = e.target;\n if (!target || !isHTMLElement(target)) {\n return;\n }\n\n let next: HTMLElement | null = null;\n\n switch (e.key) {\n case 'ArrowDown':\n next = down(target);\n break;\n case 'ArrowUp':\n next = up(target);\n break;\n case 'ArrowLeft':\n next = left(target);\n break;\n case 'ArrowRight':\n next = right(target);\n break;\n case 'Tab':\n movingOut = true;\n if (e.shiftKey) {\n pre.focus();\n } else {\n post.focus();\n }\n\n break;\n default:\n return;\n }\n\n if (next) {\n e.preventDefault();\n next.focus();\n }\n };\n\n const onFocusOut = () => {\n mode = undefined;\n };\n\n container.addEventListener('keydown', onKeyDown);\n container.addEventListener('focusout', onFocusOut);\n return () => {\n container.removeEventListener('focusout', onFocusOut);\n container.removeEventListener('keydown', onKeyDown);\n };\n}\n\nfunction isHTMLElement(node: unknown): node is HTMLElement {\n return node instanceof HTMLElement;\n}\n\nfunction isRow(element: HTMLElement) {\n if (element.getAttribute('role') === 'row' || element.tagName === 'TR') {\n return true;\n }\n\n return false;\n}\n\nfunction findColumnCount(node: HTMLElement) {\n let cur = node;\n while (cur.parentElement && !isRow(cur)) {\n cur = cur.parentElement;\n }\n\n return cur.querySelectorAll('[role=\"cell\"], [role=\"gridcell\"], td').length - 1;\n}\n"],"sourceRoot":"../src/"}