@apia/table2-controller 4.0.102 → 5.0.1

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 (91) hide show
  1. package/dist/data/TableController.d.ts +174 -0
  2. package/dist/data/TableController.d.ts.map +1 -0
  3. package/dist/data/TableController.js +348 -0
  4. package/dist/data/TableController.js.map +1 -0
  5. package/dist/data/body/TableBody.d.ts +16 -0
  6. package/dist/data/body/TableBody.d.ts.map +1 -0
  7. package/dist/data/body/TableBody.js +35 -0
  8. package/dist/data/body/TableBody.js.map +1 -0
  9. package/dist/data/filter/ComboFilter.d.ts +18 -0
  10. package/dist/data/filter/ComboFilter.d.ts.map +1 -0
  11. package/dist/data/filter/ComboFilter.js +32 -0
  12. package/dist/data/filter/ComboFilter.js.map +1 -0
  13. package/dist/data/filter/DateFilter.d.ts +7 -0
  14. package/dist/data/filter/DateFilter.d.ts.map +1 -0
  15. package/dist/data/filter/DateFilter.js +7 -0
  16. package/dist/data/filter/DateFilter.js.map +1 -0
  17. package/dist/data/filter/DateRangeFilter.d.ts +52 -0
  18. package/dist/data/filter/DateRangeFilter.d.ts.map +1 -0
  19. package/dist/data/filter/DateRangeFilter.js +208 -0
  20. package/dist/data/filter/DateRangeFilter.js.map +1 -0
  21. package/dist/data/filter/DateTimeRangeFilter.d.ts +23 -0
  22. package/dist/data/filter/DateTimeRangeFilter.d.ts.map +1 -0
  23. package/dist/data/filter/DateTimeRangeFilter.js +87 -0
  24. package/dist/data/filter/DateTimeRangeFilter.js.map +1 -0
  25. package/dist/data/filter/Filter.d.ts +49 -0
  26. package/dist/data/filter/Filter.d.ts.map +1 -0
  27. package/dist/data/filter/Filter.js +63 -0
  28. package/dist/data/filter/Filter.js.map +1 -0
  29. package/dist/data/head/Column.d.ts +23 -0
  30. package/dist/data/head/Column.d.ts.map +1 -0
  31. package/dist/data/head/Column.js +26 -0
  32. package/dist/data/head/Column.js.map +1 -0
  33. package/dist/data/head/Columns.d.ts +16 -0
  34. package/dist/data/head/Columns.d.ts.map +1 -0
  35. package/dist/data/head/Columns.js +57 -0
  36. package/dist/data/head/Columns.js.map +1 -0
  37. package/dist/data/head/Filters.d.ts +20 -0
  38. package/dist/data/head/Filters.d.ts.map +1 -0
  39. package/dist/data/head/Filters.js +132 -0
  40. package/dist/data/head/Filters.js.map +1 -0
  41. package/dist/data/head/NullFilter.js +25 -0
  42. package/dist/data/head/NullFilter.js.map +1 -0
  43. package/dist/data/head/TableHead.d.ts +26 -0
  44. package/dist/data/head/TableHead.d.ts.map +1 -0
  45. package/dist/data/head/TableHead.js +59 -0
  46. package/dist/data/head/TableHead.js.map +1 -0
  47. package/dist/data/plugins/FocusControllerPlugin/index.d.ts +26 -0
  48. package/dist/data/plugins/FocusControllerPlugin/index.d.ts.map +1 -0
  49. package/dist/data/plugins/FocusControllerPlugin/index.js +130 -0
  50. package/dist/data/plugins/FocusControllerPlugin/index.js.map +1 -0
  51. package/dist/data/plugins/FocusControllerPlugin/useFocusByClick.js +80 -0
  52. package/dist/data/plugins/FocusControllerPlugin/useFocusByClick.js.map +1 -0
  53. package/dist/data/plugins/FocusControllerPlugin/useFocusByKey.js +156 -0
  54. package/dist/data/plugins/FocusControllerPlugin/useFocusByKey.js.map +1 -0
  55. package/dist/data/plugins/TablePlugin.d.ts +30 -0
  56. package/dist/data/plugins/TablePlugin.d.ts.map +1 -0
  57. package/dist/data/plugins/TablePlugin.js +10 -0
  58. package/dist/data/plugins/TablePlugin.js.map +1 -0
  59. package/dist/data/plugins/WaiAriaPlugin.d.ts +42 -0
  60. package/dist/data/plugins/WaiAriaPlugin.d.ts.map +1 -0
  61. package/dist/data/plugins/WaiAriaPlugin.js +29 -0
  62. package/dist/data/plugins/WaiAriaPlugin.js.map +1 -0
  63. package/dist/data/primitive/AdditionalCell.d.ts +11 -0
  64. package/dist/data/primitive/AdditionalCell.d.ts.map +1 -0
  65. package/dist/data/primitive/AdditionalCell.js +38 -0
  66. package/dist/data/primitive/AdditionalCell.js.map +1 -0
  67. package/dist/data/primitive/AdditionalRow.d.ts +12 -0
  68. package/dist/data/primitive/AdditionalRow.d.ts.map +1 -0
  69. package/dist/data/primitive/AdditionalRow.js +16 -0
  70. package/dist/data/primitive/AdditionalRow.js.map +1 -0
  71. package/dist/data/primitive/Cell.d.ts +39 -0
  72. package/dist/data/primitive/Cell.d.ts.map +1 -0
  73. package/dist/data/primitive/Cell.js +41 -0
  74. package/dist/data/primitive/Cell.js.map +1 -0
  75. package/dist/data/primitive/Element.d.ts +18 -0
  76. package/dist/data/primitive/Element.d.ts.map +1 -0
  77. package/dist/data/primitive/Element.js +40 -0
  78. package/dist/data/primitive/Element.js.map +1 -0
  79. package/dist/data/primitive/Row.d.ts +58 -0
  80. package/dist/data/primitive/Row.d.ts.map +1 -0
  81. package/dist/data/primitive/Row.js +193 -0
  82. package/dist/data/primitive/Row.js.map +1 -0
  83. package/dist/data/primitive/RowsGroup.d.ts +29 -0
  84. package/dist/data/primitive/RowsGroup.d.ts.map +1 -0
  85. package/dist/data/primitive/RowsGroup.js +86 -0
  86. package/dist/data/primitive/RowsGroup.js.map +1 -0
  87. package/dist/index.d.ts +20 -425
  88. package/dist/index.js +20 -1255
  89. package/dist/index.js.map +1 -1
  90. package/package.json +3 -4
  91. package/LICENSE.md +0 -6
@@ -0,0 +1,80 @@
1
+ import { useRef } from 'react';
2
+
3
+ function getRow(controller, rowElement) {
4
+ const rowId = rowElement.dataset.rowid;
5
+ const row = controller.getRowById(rowId);
6
+ return row;
7
+ }
8
+ function selectBetweenRows(controller, rowA, rowB) {
9
+ const relativePosition = rowA.compareDocumentPosition(rowB);
10
+ let finished = false;
11
+ if (relativePosition & Node.DOCUMENT_POSITION_FOLLOWING) {
12
+ let current = rowA;
13
+ if (rowA.closest("thead") && !rowB.closest("thead")) {
14
+ current = rowA.closest("table")?.querySelector("tbody")?.firstElementChild;
15
+ }
16
+ while (!finished) {
17
+ if (current) {
18
+ getRow(controller, current)?.toggleSelection(true, false);
19
+ finished = current === rowB;
20
+ current = current.nextElementSibling;
21
+ } else {
22
+ finished = true;
23
+ }
24
+ }
25
+ } else if (relativePosition & Node.DOCUMENT_POSITION_PRECEDING) {
26
+ let current = rowA;
27
+ while (!finished) {
28
+ if (current) {
29
+ getRow(controller, current)?.toggleSelection(true, false);
30
+ finished = current === rowB;
31
+ current = current.previousElementSibling;
32
+ } else {
33
+ finished = true;
34
+ }
35
+ }
36
+ }
37
+ controller.shoutSelection();
38
+ }
39
+ function useFocusByClick(controller) {
40
+ const lastRow = useRef(null);
41
+ return (ev) => {
42
+ if (controller.isEditionMode) {
43
+ return;
44
+ }
45
+ const { target } = ev;
46
+ if (target instanceof HTMLElement) {
47
+ const cellElement = target.closest("td[data-colname],th[data-colname]");
48
+ const rowElement = target.closest("tr[data-rowid]");
49
+ if (rowElement instanceof HTMLTableRowElement) {
50
+ const row = getRow(controller, rowElement);
51
+ if (row?.getState("isSelectable")) {
52
+ if (ev.shiftKey) {
53
+ if (lastRow.current) {
54
+ selectBetweenRows(controller, lastRow.current, rowElement);
55
+ }
56
+ } else if (ev.ctrlKey) {
57
+ row?.toggleSelection();
58
+ } else {
59
+ controller.clearSelection();
60
+ row?.toggleSelection(true);
61
+ }
62
+ lastRow.current = rowElement;
63
+ if (cellElement instanceof HTMLTableCellElement) {
64
+ const colName = cellElement.dataset.colname;
65
+ const cell = row?.getCellByColumnName(colName);
66
+ if (cell) {
67
+ if (target.closest("thead")) {
68
+ controller.emit("columnSort", cell);
69
+ }
70
+ cell?.focus(true);
71
+ }
72
+ }
73
+ }
74
+ }
75
+ }
76
+ };
77
+ }
78
+
79
+ export { getRow, selectBetweenRows, useFocusByClick };
80
+ //# sourceMappingURL=useFocusByClick.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFocusByClick.js","sources":["../../../../src/data/plugins/FocusControllerPlugin/useFocusByClick.ts"],"sourcesContent":["import type { MouseEvent } from 'react';\r\nimport { useRef } from 'react';\r\nimport type { Column, TableController } from '../..';\r\n\r\nexport function getRow(\r\n controller: TableController,\r\n rowElement: HTMLTableRowElement,\r\n) {\r\n const rowId = rowElement.dataset.rowid!;\r\n const row = controller.getRowById(rowId);\r\n return row;\r\n}\r\n\r\nexport function selectBetweenRows(\r\n controller: TableController,\r\n rowA: HTMLTableRowElement,\r\n rowB: HTMLTableRowElement,\r\n) {\r\n const relativePosition = rowA.compareDocumentPosition(rowB);\r\n let finished = false;\r\n if (relativePosition & Node.DOCUMENT_POSITION_FOLLOWING) {\r\n let current = rowA;\r\n if (rowA.closest('thead') && !rowB.closest('thead')) {\r\n current = rowA.closest('table')?.querySelector('tbody')\r\n ?.firstElementChild as HTMLTableRowElement;\r\n }\r\n while (!finished) {\r\n if (current) {\r\n getRow(controller, current)?.toggleSelection(true, false);\r\n finished = current === rowB;\r\n current = current.nextElementSibling as HTMLTableRowElement;\r\n } else {\r\n finished = true;\r\n }\r\n }\r\n } else if (relativePosition & Node.DOCUMENT_POSITION_PRECEDING) {\r\n let current = rowA;\r\n while (!finished) {\r\n if (current) {\r\n getRow(controller, current)?.toggleSelection(true, false);\r\n finished = current === rowB;\r\n current = current.previousElementSibling as HTMLTableRowElement;\r\n } else {\r\n finished = true;\r\n }\r\n }\r\n }\r\n\r\n controller.shoutSelection();\r\n}\r\n\r\nexport function useFocusByClick(controller: TableController) {\r\n const lastRow = useRef<HTMLTableRowElement | null>(null);\r\n\r\n return (ev: MouseEvent) => {\r\n if (controller.isEditionMode) {\r\n return;\r\n }\r\n\r\n const { target } = ev;\r\n if (target instanceof HTMLElement) {\r\n const cellElement = target.closest('td[data-colname],th[data-colname]');\r\n const rowElement = target.closest('tr[data-rowid]');\r\n\r\n if (rowElement instanceof HTMLTableRowElement) {\r\n const row = getRow(controller, rowElement);\r\n\r\n if (row?.getState('isSelectable')) {\r\n if (ev.shiftKey) {\r\n if (lastRow.current) {\r\n selectBetweenRows(controller, lastRow.current, rowElement);\r\n }\r\n } else if (ev.ctrlKey) {\r\n row?.toggleSelection();\r\n } else {\r\n controller.clearSelection();\r\n row?.toggleSelection(true);\r\n }\r\n\r\n lastRow.current = rowElement;\r\n\r\n if (cellElement instanceof HTMLTableCellElement) {\r\n const colName = cellElement.dataset.colname!;\r\n const cell = row?.getCellByColumnName(colName);\r\n\r\n if (cell) {\r\n if (target.closest('thead')) {\r\n controller.emit('columnSort', cell as Column);\r\n }\r\n\r\n cell?.focus(true);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ import { getRow, selectBetweenRows } from './useFocusByClick.js';
2
+
3
+ const pageSize = 6;
4
+ function handleArrowKey(controller, ev) {
5
+ const { target } = ev;
6
+ if (target instanceof HTMLElement) {
7
+ const cellElement = target.closest("td[data-colname],th[data-colname]");
8
+ const rowElement = target.closest("tr[data-rowid]");
9
+ if (rowElement instanceof HTMLTableRowElement) {
10
+ if (cellElement instanceof HTMLTableCellElement) {
11
+ const colName = cellElement.dataset.colname;
12
+ let nextFocusedRow = rowElement;
13
+ let nextFocusedCell = cellElement;
14
+ switch (ev.code) {
15
+ case "ArrowUp": {
16
+ const test = rowElement?.previousElementSibling;
17
+ if (test) {
18
+ nextFocusedRow = test;
19
+ } else if (nextFocusedRow.closest("tbody")) {
20
+ const thead = nextFocusedRow.closest("table").querySelector("thead");
21
+ nextFocusedRow = thead.lastElementChild;
22
+ }
23
+ break;
24
+ }
25
+ case "ArrowDown": {
26
+ const test = rowElement?.nextElementSibling;
27
+ if (test) {
28
+ nextFocusedRow = test;
29
+ } else if (nextFocusedRow.closest("thead")) {
30
+ const tbody = nextFocusedRow.closest("table").querySelector("tbody");
31
+ nextFocusedRow = tbody.firstElementChild;
32
+ }
33
+ break;
34
+ }
35
+ case "ArrowLeft":
36
+ nextFocusedCell = cellElement.previousElementSibling;
37
+ break;
38
+ case "ArrowRight":
39
+ nextFocusedCell = cellElement.nextElementSibling;
40
+ break;
41
+ case "PageUp": {
42
+ let i = 0;
43
+ do {
44
+ const test = nextFocusedRow.previousElementSibling;
45
+ if (!test && nextFocusedRow.closest("tbody")) {
46
+ const thead = nextFocusedRow.closest("table").querySelector("thead");
47
+ nextFocusedRow = thead.lastElementChild;
48
+ } else if (test) {
49
+ nextFocusedRow = test;
50
+ }
51
+ } while (nextFocusedRow instanceof HTMLTableRowElement && ++i < pageSize);
52
+ break;
53
+ }
54
+ case "PageDown": {
55
+ let i = 0;
56
+ do {
57
+ const test = nextFocusedRow.nextElementSibling;
58
+ if (!test && nextFocusedRow.closest("thead")) {
59
+ const tbody = nextFocusedRow.closest("table").querySelector("tbody");
60
+ nextFocusedRow = tbody.firstElementChild;
61
+ } else if (test) {
62
+ nextFocusedRow = test;
63
+ }
64
+ } while (nextFocusedRow instanceof HTMLTableRowElement && ++i < pageSize);
65
+ break;
66
+ }
67
+ case "Home": {
68
+ if (ev.ctrlKey) {
69
+ nextFocusedRow = rowElement.closest("table")?.querySelector("thead tr");
70
+ } else {
71
+ nextFocusedCell = rowElement.firstElementChild;
72
+ }
73
+ break;
74
+ }
75
+ case "End":
76
+ if (ev.ctrlKey) {
77
+ nextFocusedRow = rowElement.closest("table").querySelector("tbody").lastElementChild;
78
+ } else {
79
+ nextFocusedCell = rowElement.lastChild;
80
+ }
81
+ }
82
+ if (nextFocusedCell !== cellElement && nextFocusedCell) {
83
+ getRow(controller, rowElement).getCellByColumnName(nextFocusedCell.dataset.colname).focus();
84
+ } else if (nextFocusedRow !== rowElement && nextFocusedRow) {
85
+ if (ev.shiftKey) {
86
+ selectBetweenRows(controller, rowElement, nextFocusedRow);
87
+ } else {
88
+ controller.clearSelection();
89
+ getRow(controller, nextFocusedRow)?.toggleSelection(true);
90
+ }
91
+ const cell = getRow(controller, nextFocusedRow).getCellByColumnName(colName) || getRow(controller, nextFocusedRow).getCellByIndex(0);
92
+ cell?.focus();
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+ function useFocusByKey(controller) {
99
+ return (ev) => {
100
+ if (controller.isEditionMode) {
101
+ if (!ev.ctrlKey && ["Enter", "Escape"].includes(ev.code)) {
102
+ ev.preventDefault();
103
+ switch (ev.code) {
104
+ case "Enter":
105
+ controller.emit("keyEnter", null);
106
+ break;
107
+ case "Escape":
108
+ controller.toggleEditionMode(false);
109
+ }
110
+ }
111
+ } else {
112
+ if ([
113
+ "Escape",
114
+ "ArrowUp",
115
+ "ArrowDown",
116
+ "ArrowLeft",
117
+ "ArrowRight",
118
+ "PageUp",
119
+ "PageDown",
120
+ "Home",
121
+ "End"
122
+ ].includes(ev.code) || ev.code === "Enter" && controller.getState("allowEdition") || ev.code === "Space" && ev.ctrlKey) {
123
+ ev.preventDefault();
124
+ }
125
+ switch (ev.code) {
126
+ case "Enter":
127
+ controller.emit("keyEnter", null);
128
+ controller.toggleEditionMode();
129
+ break;
130
+ case "Space":
131
+ {
132
+ if (ev.ctrlKey) {
133
+ const row = ev.target?.closest("tr");
134
+ if (row instanceof HTMLElement) {
135
+ getRow(controller, row).toggleSelection();
136
+ }
137
+ }
138
+ }
139
+ break;
140
+ case "ArrowUp":
141
+ case "ArrowDown":
142
+ case "ArrowLeft":
143
+ case "ArrowRight":
144
+ case "Home":
145
+ case "End":
146
+ case "PageUp":
147
+ case "PageDown":
148
+ handleArrowKey(controller, ev);
149
+ break;
150
+ }
151
+ }
152
+ };
153
+ }
154
+
155
+ export { useFocusByKey };
156
+ //# sourceMappingURL=useFocusByKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFocusByKey.js","sources":["../../../../src/data/plugins/FocusControllerPlugin/useFocusByKey.ts"],"sourcesContent":["import type { KeyboardEvent } from 'react';\r\nimport type { TableController } from '../..';\r\nimport { getRow, selectBetweenRows } from './useFocusByClick';\r\n\r\nconst pageSize = 6;\r\n\r\nfunction handleArrowKey(controller: TableController, ev: KeyboardEvent) {\r\n const { target } = ev;\r\n if (target instanceof HTMLElement) {\r\n const cellElement = target.closest('td[data-colname],th[data-colname]');\r\n const rowElement = target.closest('tr[data-rowid]');\r\n\r\n if (rowElement instanceof HTMLTableRowElement) {\r\n if (cellElement instanceof HTMLTableCellElement) {\r\n const colName = cellElement.dataset.colname!;\r\n\r\n let nextFocusedRow: HTMLTableRowElement = rowElement;\r\n let nextFocusedCell: HTMLTableCellElement = cellElement;\r\n switch (ev.code) {\r\n case 'ArrowUp': {\r\n const test =\r\n rowElement?.previousElementSibling as HTMLTableRowElement;\r\n if (test) {\r\n nextFocusedRow = test;\r\n } else if (nextFocusedRow.closest('tbody')) {\r\n const thead = nextFocusedRow\r\n .closest<HTMLElement>('table')!\r\n .querySelector('thead');\r\n nextFocusedRow = thead!.lastElementChild! as HTMLTableRowElement;\r\n }\r\n break;\r\n }\r\n case 'ArrowDown': {\r\n const test = rowElement?.nextElementSibling as HTMLTableRowElement;\r\n if (test) {\r\n nextFocusedRow = test;\r\n } else if (nextFocusedRow.closest('thead')) {\r\n const tbody = nextFocusedRow\r\n .closest<HTMLElement>('table')!\r\n .querySelector('tbody');\r\n nextFocusedRow = tbody!.firstElementChild! as HTMLTableRowElement;\r\n }\r\n break;\r\n }\r\n case 'ArrowLeft':\r\n nextFocusedCell =\r\n cellElement.previousElementSibling as HTMLTableCellElement;\r\n break;\r\n case 'ArrowRight':\r\n nextFocusedCell =\r\n cellElement.nextElementSibling as HTMLTableCellElement;\r\n break;\r\n case 'PageUp': {\r\n let i = 0;\r\n do {\r\n const test = nextFocusedRow.previousElementSibling as HTMLElement;\r\n if (!test && nextFocusedRow.closest('tbody')) {\r\n const thead = nextFocusedRow\r\n .closest<HTMLElement>('table')!\r\n .querySelector('thead');\r\n nextFocusedRow = thead!\r\n .lastElementChild! as HTMLTableRowElement;\r\n } else if (test) {\r\n nextFocusedRow = test as HTMLTableRowElement;\r\n }\r\n } while (\r\n nextFocusedRow instanceof HTMLTableRowElement &&\r\n ++i < pageSize\r\n );\r\n break;\r\n }\r\n case 'PageDown': {\r\n let i = 0;\r\n\r\n do {\r\n const test = nextFocusedRow.nextElementSibling as HTMLElement;\r\n if (!test && nextFocusedRow.closest('thead')) {\r\n const tbody = nextFocusedRow\r\n .closest<HTMLElement>('table')!\r\n .querySelector('tbody');\r\n nextFocusedRow = tbody!\r\n .firstElementChild! as HTMLTableRowElement;\r\n } else if (test) {\r\n nextFocusedRow = test as HTMLTableRowElement;\r\n }\r\n } while (\r\n nextFocusedRow instanceof HTMLTableRowElement &&\r\n ++i < pageSize\r\n );\r\n break;\r\n }\r\n case 'Home': {\r\n if (ev.ctrlKey) {\r\n nextFocusedRow = rowElement\r\n .closest<HTMLElement>('table')\r\n ?.querySelector('thead tr') as HTMLTableRowElement;\r\n } else {\r\n nextFocusedCell =\r\n rowElement.firstElementChild as HTMLTableCellElement;\r\n }\r\n break;\r\n }\r\n case 'End':\r\n if (ev.ctrlKey) {\r\n nextFocusedRow = (\r\n rowElement\r\n .closest<HTMLElement>('table')!\r\n .querySelector('tbody') as HTMLElement\r\n ).lastElementChild as HTMLTableRowElement;\r\n } else {\r\n nextFocusedCell = rowElement.lastChild! as HTMLTableCellElement;\r\n }\r\n }\r\n\r\n if (nextFocusedCell !== cellElement && nextFocusedCell) {\r\n getRow(controller, rowElement)!\r\n .getCellByColumnName(nextFocusedCell.dataset.colname!)!\r\n .focus();\r\n } else if (nextFocusedRow !== rowElement && nextFocusedRow) {\r\n if (ev.shiftKey) {\r\n selectBetweenRows(controller, rowElement, nextFocusedRow);\r\n } else {\r\n controller.clearSelection();\r\n getRow(controller, nextFocusedRow)?.toggleSelection(true);\r\n }\r\n\r\n const cell =\r\n getRow(controller, nextFocusedRow)!.getCellByColumnName(colName) ||\r\n getRow(controller, nextFocusedRow)!.getCellByIndex(0);\r\n cell?.focus();\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function useFocusByKey(controller: TableController) {\r\n return (ev: KeyboardEvent) => {\r\n if (controller.isEditionMode) {\r\n if (!ev.ctrlKey && ['Enter', 'Escape'].includes(ev.code)) {\r\n ev.preventDefault();\r\n\r\n switch (ev.code) {\r\n case 'Enter':\r\n controller.emit('keyEnter', null);\r\n break;\r\n // eslint-disable-next-line no-fallthrough\r\n case 'Escape':\r\n controller.toggleEditionMode(false);\r\n }\r\n }\r\n } else {\r\n if (\r\n [\r\n 'Escape',\r\n 'ArrowUp',\r\n 'ArrowDown',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'PageUp',\r\n 'PageDown',\r\n 'Home',\r\n 'End',\r\n ].includes(ev.code) ||\r\n (ev.code === 'Enter' && controller.getState('allowEdition')) ||\r\n (ev.code === 'Space' && ev.ctrlKey)\r\n ) {\r\n ev.preventDefault();\r\n }\r\n switch (ev.code) {\r\n case 'Enter':\r\n controller.emit('keyEnter', null);\r\n controller.toggleEditionMode();\r\n break;\r\n case 'Space':\r\n {\r\n if (ev.ctrlKey) {\r\n const row = (ev.target as HTMLElement)?.closest('tr');\r\n if (row instanceof HTMLElement) {\r\n getRow(controller, row)!.toggleSelection();\r\n }\r\n }\r\n }\r\n break;\r\n case 'ArrowUp':\r\n case 'ArrowDown':\r\n case 'ArrowLeft':\r\n case 'ArrowRight':\r\n case 'Home':\r\n case 'End':\r\n case 'PageUp':\r\n case 'PageDown':\r\n handleArrowKey(controller, ev);\r\n break;\r\n }\r\n }\r\n };\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { HTMLAttributes } from 'react';
2
+ import { Cell } from '../primitive/Cell.js';
3
+ import { Row } from '../primitive/Row.js';
4
+ import { TableController } from '../TableController.js';
5
+ import { Element } from '../primitive/Element.js';
6
+ import { RowsGroup } from '../primitive/RowsGroup.js';
7
+ import { FocusControllerPlugin } from './FocusControllerPlugin/index.js';
8
+ import { WaiAriaPlugin } from './WaiAriaPlugin.js';
9
+
10
+ /**
11
+ * This class is the default way to customize the table behavior.
12
+ */
13
+ interface TablePlugin {
14
+ getRenderers?: () => {
15
+ cell?: React.FC<{
16
+ cell: Cell;
17
+ }>;
18
+ };
19
+ onAddRow?: (controller: TableController, target: RowsGroup<any>, newRow: Row) => void;
20
+ onResize?: (controller: TableController, colName: string, newSize: number) => void;
21
+ /**
22
+ * This hook is called when the table is renderized.
23
+ * The elements returned by this hook will be added to the dom of the element.
24
+ */
25
+ useElementDomProps?: (controller: TableController, _element: TableController | Element<any>, _context: any) => HTMLAttributes<HTMLElement>;
26
+ }
27
+ declare const defaultPlugins: () => (FocusControllerPlugin | WaiAriaPlugin)[];
28
+
29
+ export { type TablePlugin, defaultPlugins };
30
+ //# sourceMappingURL=TablePlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TablePlugin.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import { FocusControllerPlugin } from './FocusControllerPlugin/index.js';
2
+ import { WaiAriaPlugin } from './WaiAriaPlugin.js';
3
+
4
+ const defaultPlugins = () => [
5
+ new WaiAriaPlugin(),
6
+ new FocusControllerPlugin()
7
+ ];
8
+
9
+ export { defaultPlugins };
10
+ //# sourceMappingURL=TablePlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TablePlugin.js","sources":["../../../src/data/plugins/TablePlugin.tsx"],"sourcesContent":["import type { HTMLAttributes } from 'react';\r\nimport type { TableController, Row, Cell } from '..';\r\nimport type { Element } from '../primitive/Element';\r\nimport type { RowsGroup } from '../primitive/RowsGroup';\r\nimport { FocusControllerPlugin } from './FocusControllerPlugin';\r\nimport { WaiAriaPlugin } from './WaiAriaPlugin';\r\n\r\nexport type TDistinctorProperties = HTMLAttributes<HTMLElement>;\r\n\r\n/**\r\n * This class is the default way to customize the table behavior.\r\n */\r\nexport interface TablePlugin {\r\n getRenderers?: () => {\r\n cell?: React.FC<{\r\n cell: Cell;\r\n }>;\r\n };\r\n\r\n onAddRow?: (\r\n controller: TableController,\r\n target: RowsGroup<any>,\r\n newRow: Row,\r\n ) => void;\r\n\r\n onResize?: (\r\n controller: TableController,\r\n colName: string,\r\n newSize: number,\r\n ) => void;\r\n\r\n /**\r\n * This hook is called when the table is renderized.\r\n * The elements returned by this hook will be added to the dom of the element.\r\n */\r\n useElementDomProps?: (\r\n controller: TableController,\r\n _element: TableController | Element<any>,\r\n _context: any,\r\n ) => HTMLAttributes<HTMLElement>;\r\n}\r\n\r\nexport const defaultPlugins = () => [\r\n new WaiAriaPlugin(),\r\n new FocusControllerPlugin(),\r\n];\r\n"],"names":[],"mappings":";;;AA0CO,MAAM,iBAAiB,MAAM;AAAA,EAClC,IAAI,aAAA,EAAc;AAAA,EAClB,IAAI,qBAAA;AACN;;;;"}
@@ -0,0 +1,42 @@
1
+ import { Element } from '../primitive/Element.js';
2
+ import { TableController } from '../TableController.js';
3
+ import { TablePlugin } from './TablePlugin.js';
4
+
5
+ declare class WaiAriaPlugin implements TablePlugin {
6
+ useElementDomProps(controller: TableController, element: TableController | Element<any>, context: any): {
7
+ 'aria-selected': boolean;
8
+ 'aria-rowindex': any;
9
+ 'aria-colindex'?: undefined;
10
+ role?: undefined;
11
+ 'aria-multiselectable'?: undefined;
12
+ 'aria-colcount'?: undefined;
13
+ 'aria-rowcount'?: undefined;
14
+ } | {
15
+ 'aria-colindex': any;
16
+ 'aria-selected'?: undefined;
17
+ 'aria-rowindex'?: undefined;
18
+ role?: undefined;
19
+ 'aria-multiselectable'?: undefined;
20
+ 'aria-colcount'?: undefined;
21
+ 'aria-rowcount'?: undefined;
22
+ } | {
23
+ role: string;
24
+ 'aria-multiselectable': boolean | undefined;
25
+ 'aria-colcount': number;
26
+ 'aria-rowcount': number;
27
+ 'aria-selected'?: undefined;
28
+ 'aria-rowindex'?: undefined;
29
+ 'aria-colindex'?: undefined;
30
+ } | {
31
+ 'aria-selected'?: undefined;
32
+ 'aria-rowindex'?: undefined;
33
+ 'aria-colindex'?: undefined;
34
+ role?: undefined;
35
+ 'aria-multiselectable'?: undefined;
36
+ 'aria-colcount'?: undefined;
37
+ 'aria-rowcount'?: undefined;
38
+ };
39
+ }
40
+
41
+ export { WaiAriaPlugin };
42
+ //# sourceMappingURL=WaiAriaPlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WaiAriaPlugin.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import { Cell } from '../primitive/Cell.js';
2
+ import { Row } from '../primitive/Row.js';
3
+
4
+ class WaiAriaPlugin {
5
+ useElementDomProps(controller, element, context) {
6
+ if (element instanceof Row) {
7
+ const base = element.getContainer() === controller.head ? 0 : controller.head.rows.length;
8
+ return {
9
+ "aria-selected": element.isSelected,
10
+ "aria-rowindex": context + base + 1
11
+ };
12
+ } else if (element instanceof Cell) {
13
+ return {
14
+ "aria-colindex": context + 1
15
+ };
16
+ } else if (element === controller) {
17
+ return {
18
+ role: "treegrid",
19
+ "aria-multiselectable": controller.getState("allowSelection") && controller.getState("isSelectionMultiple") ? true : void 0,
20
+ "aria-colcount": controller.head.rows[0]?.cells.length || 0,
21
+ "aria-rowcount": controller.head.rows.length + controller.body.rows.length
22
+ };
23
+ }
24
+ return {};
25
+ }
26
+ }
27
+
28
+ export { WaiAriaPlugin };
29
+ //# sourceMappingURL=WaiAriaPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WaiAriaPlugin.js","sources":["../../../src/data/plugins/WaiAriaPlugin.ts"],"sourcesContent":["import { Cell } from '../primitive/Cell';\r\nimport type { Element } from '../primitive/Element';\r\nimport { Row } from '../primitive/Row';\r\nimport type { TableController } from '../TableController';\r\nimport type { TablePlugin } from './TablePlugin';\r\n\r\nexport class WaiAriaPlugin implements TablePlugin {\r\n public useElementDomProps(\r\n controller: TableController,\r\n element: TableController | Element<any>,\r\n context: any,\r\n ) {\r\n if (element instanceof Row) {\r\n const base =\r\n element.getContainer() === controller.head\r\n ? 0\r\n : controller.head.rows.length;\r\n return {\r\n 'aria-selected': element.isSelected,\r\n 'aria-rowindex': context + base + 1,\r\n };\r\n } else if (element instanceof Cell) {\r\n return {\r\n 'aria-colindex': context + 1,\r\n };\r\n } else if (element === controller) {\r\n return {\r\n role: 'treegrid',\r\n 'aria-multiselectable':\r\n controller.getState('allowSelection') &&\r\n controller.getState('isSelectionMultiple')\r\n ? true\r\n : undefined,\r\n 'aria-colcount': controller.head.rows[0]?.cells.length || 0,\r\n 'aria-rowcount':\r\n controller.head.rows.length + controller.body.rows.length,\r\n };\r\n }\r\n\r\n return {};\r\n }\r\n}\r\n"],"names":[],"mappings":";;;AAMO,MAAM,aAAA,CAAqC;AAAA,EACzC,kBAAA,CACL,UAAA,EACA,OAAA,EACA,OAAA,EACA;AACA,IAAA,IAAI,mBAAmB,GAAA,EAAK;AAC1B,MAAA,MAAM,IAAA,GACJ,QAAQ,YAAA,EAAa,KAAM,WAAW,IAAA,GAClC,CAAA,GACA,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,MAAA;AAC3B,MAAA,OAAO;AAAA,QACL,iBAAiB,OAAA,CAAQ,UAAA;AAAA,QACzB,eAAA,EAAiB,UAAU,IAAA,GAAO;AAAA,OACpC;AAAA,KACF,MAAA,IAAW,mBAAmB,IAAA,EAAM;AAClC,MAAA,OAAO;AAAA,QACL,iBAAiB,OAAA,GAAU;AAAA,OAC7B;AAAA,KACF,MAAA,IAAW,YAAY,UAAA,EAAY;AACjC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,UAAA;AAAA,QACN,sBAAA,EACE,WAAW,QAAA,CAAS,gBAAgB,KACpC,UAAA,CAAW,QAAA,CAAS,qBAAqB,CAAA,GACrC,IAAA,GACA,MAAA;AAAA,QACN,iBAAiB,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,MAAM,MAAA,IAAU,CAAA;AAAA,QAC1D,iBACE,UAAA,CAAW,IAAA,CAAK,KAAK,MAAA,GAAS,UAAA,CAAW,KAAK,IAAA,CAAK;AAAA,OACvD;AAAA;AAGF,IAAA,OAAO,EAAC;AAAA;AAEZ;;;;"}
@@ -0,0 +1,11 @@
1
+ import { Cell, CellState } from './Cell.js';
2
+
3
+ declare class AdditionalCell extends Cell<CellState & {
4
+ expanded: boolean;
5
+ }> {
6
+ constructor();
7
+ onToggle(): Promise<void>;
8
+ }
9
+
10
+ export { AdditionalCell };
11
+ //# sourceMappingURL=AdditionalCell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdditionalCell.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import { Cell } from './Cell.js';
2
+
3
+ class AdditionalCell extends Cell {
4
+ constructor() {
5
+ super({
6
+ expanded: false,
7
+ colName: "__additional",
8
+ domProperties: {
9
+ className: "additionalColumn",
10
+ style: {
11
+ width: "50px"
12
+ }
13
+ }
14
+ });
15
+ }
16
+ async onToggle() {
17
+ const { AdditionalRow } = await import('./AdditionalRow.js');
18
+ const currentIndex = this.getRow().getIndex();
19
+ if (!(this.getTable().body.getRowByIndex(currentIndex + 1) instanceof AdditionalRow)) {
20
+ const res = await this.table.onRowExpand(this.getRow());
21
+ if (res !== false) {
22
+ const newRow = new AdditionalRow(
23
+ `${this.getRow()?.getState("id")}__additional`,
24
+ res,
25
+ this.getRow()
26
+ );
27
+ this.getTable().body.insertAfter(this.getRow(), newRow);
28
+ this.state.expanded = true;
29
+ }
30
+ } else {
31
+ this.getTable().body.getRowByIndex(currentIndex + 1).remove();
32
+ this.state.expanded = false;
33
+ }
34
+ }
35
+ }
36
+
37
+ export { AdditionalCell };
38
+ //# sourceMappingURL=AdditionalCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdditionalCell.js","sources":["../../../src/data/primitive/AdditionalCell.ts"],"sourcesContent":["import { Cell, type CellState } from './Cell';\r\n\r\nexport class AdditionalCell extends Cell<CellState & { expanded: boolean }> {\r\n constructor() {\r\n super({\r\n expanded: false,\r\n colName: '__additional',\r\n domProperties: {\r\n className: 'additionalColumn',\r\n style: {\r\n width: '50px',\r\n },\r\n },\r\n });\r\n }\r\n\r\n async onToggle() {\r\n const { AdditionalRow } = await import('./AdditionalRow');\r\n const currentIndex = this.getRow()!.getIndex()!;\r\n if (\r\n !(\r\n this.getTable().body.getRowByIndex(currentIndex + 1) instanceof\r\n AdditionalRow\r\n )\r\n ) {\r\n const res = await this.table.onRowExpand(this.getRow()!);\r\n\r\n if (res !== false) {\r\n const newRow = new AdditionalRow(\r\n `${this.getRow()?.getState('id')}__additional`,\r\n res,\r\n this.getRow()!,\r\n );\r\n\r\n this.getTable().body.insertAfter(this.getRow()!, newRow);\r\n\r\n this.state.expanded = true;\r\n }\r\n } else {\r\n this.getTable()\r\n .body.getRowByIndex(currentIndex + 1)\r\n .remove();\r\n this.state.expanded = false;\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":";;AAEO,MAAM,uBAAuB,IAAA,CAAwC;AAAA,EAC1E,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM;AAAA,MACJ,QAAA,EAAU,KAAA;AAAA,MACV,OAAA,EAAS,cAAA;AAAA,MACT,aAAA,EAAe;AAAA,QACb,SAAA,EAAW,kBAAA;AAAA,QACX,KAAA,EAAO;AAAA,UACL,KAAA,EAAO;AAAA;AACT;AACF,KACD,CAAA;AAAA;AACH,EAEA,MAAM,QAAA,GAAW;AACf,IAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,oBAAiB,CAAA;AACxD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,EAAO,CAAG,QAAA,EAAS;AAC7C,IAAA,IACE,EACE,KAAK,QAAA,EAAS,CAAE,KAAK,aAAA,CAAc,YAAA,GAAe,CAAC,CAAA,YACnD,aAAA,CAAA,EAEF;AACA,MAAA,MAAM,MAAM,MAAM,IAAA,CAAK,MAAM,WAAA,CAAY,IAAA,CAAK,QAAS,CAAA;AAEvD,MAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,QAAA,MAAM,SAAS,IAAI,aAAA;AAAA,UACjB,GAAG,IAAA,CAAK,MAAA,EAAO,EAAG,QAAA,CAAS,IAAI,CAAC,CAAA,YAAA,CAAA;AAAA,UAChC,GAAA;AAAA,UACA,KAAK,MAAA;AAAO,SACd;AAEA,QAAA,IAAA,CAAK,UAAS,CAAE,IAAA,CAAK,YAAY,IAAA,CAAK,MAAA,IAAW,MAAM,CAAA;AAEvD,QAAA,IAAA,CAAK,MAAM,QAAA,GAAW,IAAA;AAAA;AACxB,KACF,MAAO;AACL,MAAA,IAAA,CAAK,UAAS,CACX,IAAA,CAAK,cAAc,YAAA,GAAe,CAAC,EACnC,MAAA,EAAO;AACV,MAAA,IAAA,CAAK,MAAM,QAAA,GAAW,KAAA;AAAA;AACxB;AAEJ;;;;"}
@@ -0,0 +1,12 @@
1
+ import { Cell, CellState } from './Cell.js';
2
+ import { Row } from './Row.js';
3
+
4
+ declare class AdditionalRow extends Row {
5
+ additionalData: unknown;
6
+ parentRow: Row;
7
+ constructor(id: string, additionalData: unknown, parentRow: Row);
8
+ get cells(): Cell<CellState<any>>[];
9
+ }
10
+
11
+ export { AdditionalRow };
12
+ //# sourceMappingURL=AdditionalRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdditionalRow.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { Row } from './Row.js';
2
+
3
+ class AdditionalRow extends Row {
4
+ constructor(id, additionalData, parentRow) {
5
+ super(id);
6
+ this.additionalData = additionalData;
7
+ this.parentRow = parentRow;
8
+ this.setState("isSelectable", false);
9
+ }
10
+ get cells() {
11
+ return this.state.cells;
12
+ }
13
+ }
14
+
15
+ export { AdditionalRow };
16
+ //# sourceMappingURL=AdditionalRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdditionalRow.js","sources":["../../../src/data/primitive/AdditionalRow.ts"],"sourcesContent":["import { Cell, type CellState } from './Cell';\r\nimport { Row } from './Row';\r\n\r\nexport class AdditionalRow extends Row {\r\n constructor(\r\n id: string,\r\n public additionalData: unknown,\r\n public parentRow: Row,\r\n ) {\r\n super(id);\r\n this.setState('isSelectable', false);\r\n }\r\n\r\n get cells(): Cell<CellState<any>>[] {\r\n return this.state.cells;\r\n }\r\n}\r\n"],"names":[],"mappings":";;AAGO,MAAM,sBAAsB,GAAA,CAAI;AAAA,EACrC,WAAA,CACE,EAAA,EACO,cAAA,EACA,SAAA,EACP;AACA,IAAA,KAAA,CAAM,EAAE,CAAA;AAHD,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAGP,IAAA,IAAA,CAAK,QAAA,CAAS,gBAAgB,KAAK,CAAA;AAAA;AACrC,EAEA,IAAI,KAAA,GAAgC;AAClC,IAAA,OAAO,KAAK,KAAA,CAAM,KAAA;AAAA;AAEtB;;;;"}
@@ -0,0 +1,39 @@
1
+ import { ReactNode, FC, ThHTMLAttributes } from 'react';
2
+ import { Element } from './Element.js';
3
+ import { Row } from './Row.js';
4
+
5
+ type CellState<T extends CellState<any> = CellState<any>> = {
6
+ colName: string;
7
+ content?: ReactNode;
8
+ className?: string;
9
+ allowResize?: boolean;
10
+ isFocused?: boolean;
11
+ isHidden?: boolean;
12
+ isHtml?: boolean;
13
+ isBold?: boolean;
14
+ isDocument?: boolean;
15
+ documentUrl?: string;
16
+ tag?: 'td' | 'th;';
17
+ Renderer?: FC<{
18
+ cell: Cell<T>;
19
+ }>;
20
+ domProperties?: ThHTMLAttributes<HTMLTableCellElement>;
21
+ properties?: Record<string, unknown>;
22
+ };
23
+ declare class Cell<State extends CellState<any> = CellState<any>> extends Element<State> {
24
+ protected parentRow: Row | null;
25
+ getColumnName(): State["colName"];
26
+ getIndex(): number;
27
+ getRow(): Row | null;
28
+ setRow(row: Row | null): this;
29
+ /**
30
+ *
31
+ * @param doFocus - If true, the cell will be focused after being set as the focused cell.
32
+ * If false, the cell will contain the tabIndex = 0 but will not be focused.
33
+ */
34
+ focus(doFocus?: boolean): void;
35
+ updateState(state: Partial<State>): void;
36
+ }
37
+
38
+ export { Cell, type CellState };
39
+ //# sourceMappingURL=Cell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cell.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import { Element } from './Element.js';
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
5
+ var __publicField = (obj, key, value) => {
6
+ __defNormalProp(obj, key + "" , value);
7
+ return value;
8
+ };
9
+ class Cell extends Element {
10
+ constructor() {
11
+ super(...arguments);
12
+ __publicField(this, "parentRow", null);
13
+ }
14
+ getColumnName() {
15
+ return this.getState("colName");
16
+ }
17
+ getIndex() {
18
+ return this.getRow().getCellIndex(this);
19
+ }
20
+ getRow() {
21
+ return this.parentRow;
22
+ }
23
+ setRow(row) {
24
+ this.parentRow = row;
25
+ return this;
26
+ }
27
+ /**
28
+ *
29
+ * @param doFocus - If true, the cell will be focused after being set as the focused cell.
30
+ * If false, the cell will contain the tabIndex = 0 but will not be focused.
31
+ */
32
+ focus(doFocus = true) {
33
+ this.table.setFocusedCell(this, doFocus);
34
+ }
35
+ updateState(state) {
36
+ this.state = { ...this.state, ...state };
37
+ }
38
+ }
39
+
40
+ export { Cell };
41
+ //# sourceMappingURL=Cell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cell.js","sources":["../../../src/data/primitive/Cell.ts"],"sourcesContent":["import type { ThHTMLAttributes, ReactNode, FC } from 'react';\r\nimport { Element } from './Element';\r\nimport type { Row } from './Row';\r\n\r\nexport type CellState<T extends CellState<any> = CellState<any>> = {\r\n colName: string;\r\n\r\n content?: ReactNode;\r\n className?: string;\r\n allowResize?: boolean;\r\n isFocused?: boolean;\r\n isHidden?: boolean;\r\n isHtml?: boolean;\r\n isBold?: boolean;\r\n isDocument?: boolean;\r\n documentUrl?: string;\r\n tag?: 'td' | 'th;';\r\n\r\n Renderer?: FC<{ cell: Cell<T> }>;\r\n domProperties?: ThHTMLAttributes<HTMLTableCellElement>;\r\n properties?: Record<string, unknown>;\r\n};\r\n\r\nexport class Cell<\r\n State extends CellState<any> = CellState<any>,\r\n> extends Element<State> {\r\n protected parentRow: Row | null = null;\r\n\r\n getColumnName() {\r\n return this.getState('colName');\r\n }\r\n\r\n getIndex() {\r\n return this.getRow()!.getCellIndex(this);\r\n }\r\n\r\n getRow() {\r\n return this.parentRow;\r\n }\r\n\r\n setRow(row: Row | null) {\r\n this.parentRow = row;\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param doFocus - If true, the cell will be focused after being set as the focused cell.\r\n * If false, the cell will contain the tabIndex = 0 but will not be focused.\r\n */\r\n focus(doFocus: boolean = true) {\r\n this.table.setFocusedCell(this, doFocus);\r\n }\r\n\r\n updateState(state: Partial<State>) {\r\n this.state = { ...this.state, ...state };\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;;;;;AAuBO,MAAM,aAEH,OAAA,CAAe;AAAA,EAFlB,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAGL,IAAA,aAAA,CAAA,IAAA,EAAU,WAAA,EAAwB,IAAA,CAAA;AAAA;AAAA,EAElC,aAAA,GAAgB;AACd,IAAA,OAAO,IAAA,CAAK,SAAS,SAAS,CAAA;AAAA;AAChC,EAEA,QAAA,GAAW;AACT,IAAA,OAAO,IAAA,CAAK,MAAA,EAAO,CAAG,YAAA,CAAa,IAAI,CAAA;AAAA;AACzC,EAEA,MAAA,GAAS;AACP,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA;AACd,EAEA,OAAO,GAAA,EAAiB;AACtB,IAAA,IAAA,CAAK,SAAA,GAAY,GAAA;AACjB,IAAA,OAAO,IAAA;AAAA;AACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,CAAM,UAAmB,IAAA,EAAM;AAC7B,IAAA,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,IAAA,EAAM,OAAO,CAAA;AAAA;AACzC,EAEA,YAAY,KAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,QAAQ,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,GAAG,KAAA,EAAM;AAAA;AAE3C;;;;"}
@@ -0,0 +1,18 @@
1
+ import { TableController } from '../TableController.js';
2
+
3
+ type ElementBaseState = {
4
+ properties?: Record<string, unknown>;
5
+ };
6
+ declare abstract class Element<T extends ElementBaseState> {
7
+ protected state: T;
8
+ protected table: TableController;
9
+ constructor(state: T);
10
+ getTable(): TableController;
11
+ setTable(table: null | TableController): this;
12
+ getState<K extends keyof T>(prop: K): T[K];
13
+ setState(cb: (s: T) => T): this;
14
+ setState<K extends keyof T>(prop: K, value: T[K]): this;
15
+ }
16
+
17
+ export { Element, type ElementBaseState };
18
+ //# sourceMappingURL=Element.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Element.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}