@rowsncolumns/grid 9.0.3 → 13.2.32

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 (208) hide show
  1. package/LICENSE.md +100 -0
  2. package/Readme.md +53 -59
  3. package/dist/cjs/Cell.d.ts +35 -0
  4. package/dist/cjs/Cell.d.ts.map +1 -0
  5. package/dist/cjs/Cell.js +29 -0
  6. package/dist/{CellOverlay.d.ts → cjs/CellOverlay.d.ts} +5 -5
  7. package/dist/cjs/CellOverlay.d.ts.map +1 -0
  8. package/dist/cjs/CellOverlay.js +126 -0
  9. package/dist/cjs/Context.d.ts +8 -0
  10. package/dist/cjs/Context.d.ts.map +1 -0
  11. package/dist/cjs/Context.js +13 -0
  12. package/dist/{FillHandle.d.ts → cjs/FillHandle.d.ts} +2 -1
  13. package/dist/cjs/FillHandle.d.ts.map +1 -0
  14. package/dist/cjs/FillHandle.js +26 -0
  15. package/dist/cjs/Grid.d.ts +558 -0
  16. package/dist/cjs/Grid.d.ts.map +1 -0
  17. package/dist/cjs/Grid.js +2446 -0
  18. package/dist/{GridLine.d.ts → cjs/GridLine.d.ts} +2 -1
  19. package/dist/cjs/GridLine.d.ts.map +1 -0
  20. package/dist/cjs/GridLine.js +10 -0
  21. package/dist/cjs/Image.d.ts +11 -0
  22. package/dist/cjs/Image.d.ts.map +1 -0
  23. package/dist/cjs/Image.js +57 -0
  24. package/dist/cjs/MemoizedGrid.d.ts +49 -0
  25. package/dist/cjs/MemoizedGrid.d.ts.map +1 -0
  26. package/dist/cjs/MemoizedGrid.js +105 -0
  27. package/dist/cjs/Selection.d.ts +5 -0
  28. package/dist/cjs/Selection.d.ts.map +1 -0
  29. package/dist/cjs/Selection.js +10 -0
  30. package/dist/{helpers.d.ts → cjs/helpers.d.ts} +59 -39
  31. package/dist/cjs/helpers.d.ts.map +1 -0
  32. package/dist/cjs/helpers.js +1409 -0
  33. package/dist/{hooks → cjs/hooks}/useCopyPaste.d.ts +3 -2
  34. package/dist/cjs/hooks/useCopyPaste.d.ts.map +1 -0
  35. package/dist/cjs/hooks/useCopyPaste.js +230 -0
  36. package/dist/{hooks → cjs/hooks}/useEditable.d.ts +21 -8
  37. package/dist/cjs/hooks/useEditable.d.ts.map +1 -0
  38. package/dist/cjs/hooks/useEditable.js +491 -0
  39. package/dist/{hooks → cjs/hooks}/useFilter.d.ts +3 -2
  40. package/dist/cjs/hooks/useFilter.d.ts.map +1 -0
  41. package/dist/cjs/hooks/useFilter.js +97 -0
  42. package/dist/{hooks → cjs/hooks}/useImage.d.ts +1 -0
  43. package/dist/cjs/hooks/useImage.d.ts.map +1 -0
  44. package/dist/cjs/hooks/useImage.js +80 -0
  45. package/dist/{hooks → cjs/hooks}/usePagination.d.ts +3 -2
  46. package/dist/cjs/hooks/usePagination.d.ts.map +1 -0
  47. package/dist/cjs/hooks/usePagination.js +53 -0
  48. package/dist/{hooks → cjs/hooks}/useSizer.d.ts +28 -29
  49. package/dist/cjs/hooks/useSizer.d.ts.map +1 -0
  50. package/dist/cjs/hooks/useSizer.js +176 -0
  51. package/dist/{hooks → cjs/hooks}/useTooltip.d.ts +2 -1
  52. package/dist/cjs/hooks/useTooltip.d.ts.map +1 -0
  53. package/dist/cjs/hooks/useTooltip.js +82 -0
  54. package/dist/{hooks → cjs/hooks}/useUndo.d.ts +2 -1
  55. package/dist/cjs/hooks/useUndo.d.ts.map +1 -0
  56. package/dist/cjs/hooks/useUndo.js +87 -0
  57. package/dist/cjs/index.d.ts +19 -0
  58. package/dist/cjs/index.d.ts.map +1 -0
  59. package/dist/cjs/index.js +29 -0
  60. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  61. package/dist/{types.d.ts → cjs/types.d.ts} +8 -3
  62. package/dist/cjs/types.d.ts.map +1 -0
  63. package/dist/{types.js → cjs/types.js} +7 -8
  64. package/dist/cjs/utils.d.ts +9 -0
  65. package/dist/cjs/utils.d.ts.map +1 -0
  66. package/dist/cjs/utils.js +58 -0
  67. package/dist/cjs/vitest.config.d.ts +3 -0
  68. package/dist/cjs/vitest.config.d.ts.map +1 -0
  69. package/dist/cjs/vitest.config.js +24 -0
  70. package/dist/esm/Cell.d.ts +35 -0
  71. package/dist/esm/Cell.d.ts.map +1 -0
  72. package/dist/esm/Cell.js +24 -0
  73. package/dist/esm/CellOverlay.d.ts +21 -0
  74. package/dist/esm/CellOverlay.d.ts.map +1 -0
  75. package/dist/esm/CellOverlay.js +120 -0
  76. package/dist/esm/Context.d.ts +8 -0
  77. package/dist/esm/Context.d.ts.map +1 -0
  78. package/dist/esm/Context.js +9 -0
  79. package/dist/esm/FillHandle.d.ts +8 -0
  80. package/dist/esm/FillHandle.d.ts.map +1 -0
  81. package/dist/{FillHandle.js → esm/FillHandle.js} +5 -11
  82. package/dist/esm/Grid.d.ts +558 -0
  83. package/dist/esm/Grid.d.ts.map +1 -0
  84. package/dist/esm/Grid.js +2451 -0
  85. package/dist/esm/GridLine.d.ts +5 -0
  86. package/dist/esm/GridLine.d.ts.map +1 -0
  87. package/dist/esm/GridLine.js +7 -0
  88. package/dist/esm/Image.d.ts +11 -0
  89. package/dist/esm/Image.d.ts.map +1 -0
  90. package/dist/esm/Image.js +53 -0
  91. package/dist/esm/MemoizedGrid.d.ts +49 -0
  92. package/dist/esm/MemoizedGrid.d.ts.map +1 -0
  93. package/dist/esm/MemoizedGrid.js +98 -0
  94. package/dist/esm/Selection.d.ts +5 -0
  95. package/dist/esm/Selection.d.ts.map +1 -0
  96. package/dist/esm/Selection.js +7 -0
  97. package/dist/esm/helpers.d.ts +281 -0
  98. package/dist/esm/helpers.d.ts.map +1 -0
  99. package/dist/esm/helpers.js +1260 -0
  100. package/dist/esm/hooks/useCopyPaste.d.ts +53 -0
  101. package/dist/esm/hooks/useCopyPaste.d.ts.map +1 -0
  102. package/dist/{hooks → esm/hooks}/useCopyPaste.js +40 -46
  103. package/dist/esm/hooks/useEditable.d.ts +253 -0
  104. package/dist/esm/hooks/useEditable.d.ts.map +1 -0
  105. package/dist/esm/hooks/useEditable.js +482 -0
  106. package/dist/esm/hooks/useFilter.d.ts +69 -0
  107. package/dist/esm/hooks/useFilter.d.ts.map +1 -0
  108. package/dist/{hooks → esm/hooks}/useFilter.js +22 -42
  109. package/dist/esm/hooks/useImage.d.ts +13 -0
  110. package/dist/esm/hooks/useImage.d.ts.map +1 -0
  111. package/dist/esm/hooks/useImage.js +76 -0
  112. package/dist/esm/hooks/usePagination.d.ts +69 -0
  113. package/dist/esm/hooks/usePagination.d.ts.map +1 -0
  114. package/dist/esm/hooks/usePagination.js +47 -0
  115. package/dist/esm/hooks/useSizer.d.ts +114 -0
  116. package/dist/esm/hooks/useSizer.d.ts.map +1 -0
  117. package/dist/esm/hooks/useSizer.js +176 -0
  118. package/dist/esm/hooks/useTooltip.d.ts +43 -0
  119. package/dist/esm/hooks/useTooltip.d.ts.map +1 -0
  120. package/dist/esm/hooks/useTooltip.js +80 -0
  121. package/dist/esm/hooks/useUndo.d.ts +36 -0
  122. package/dist/esm/hooks/useUndo.d.ts.map +1 -0
  123. package/dist/{hooks → esm/hooks}/useUndo.js +16 -25
  124. package/dist/esm/index.d.ts +19 -0
  125. package/dist/esm/index.d.ts.map +1 -0
  126. package/dist/esm/index.js +17 -0
  127. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  128. package/dist/esm/types.d.ts +70 -0
  129. package/dist/esm/types.d.ts.map +1 -0
  130. package/dist/esm/types.js +68 -0
  131. package/dist/esm/utils.d.ts +9 -0
  132. package/dist/esm/utils.d.ts.map +1 -0
  133. package/dist/esm/utils.js +104 -0
  134. package/dist/esm/vitest.config.d.ts +3 -0
  135. package/dist/esm/vitest.config.d.ts.map +1 -0
  136. package/dist/esm/vitest.config.js +22 -0
  137. package/package.json +28 -29
  138. package/dist/Cell.d.ts +0 -23
  139. package/dist/Cell.js +0 -55
  140. package/dist/Cell.js.map +0 -1
  141. package/dist/CellOverlay.js +0 -116
  142. package/dist/CellOverlay.js.map +0 -1
  143. package/dist/FillHandle.js.map +0 -1
  144. package/dist/Grid.d.ts +0 -385
  145. package/dist/Grid.js +0 -1684
  146. package/dist/Grid.js.map +0 -1
  147. package/dist/GridLine.js +0 -13
  148. package/dist/GridLine.js.map +0 -1
  149. package/dist/Image.d.ts +0 -8
  150. package/dist/Image.js +0 -50
  151. package/dist/Image.js.map +0 -1
  152. package/dist/Selection.d.ts +0 -4
  153. package/dist/Selection.js +0 -9
  154. package/dist/Selection.js.map +0 -1
  155. package/dist/helpers.js +0 -1033
  156. package/dist/helpers.js.map +0 -1
  157. package/dist/hooks/useCopyPaste.js.map +0 -1
  158. package/dist/hooks/useEditable.js +0 -477
  159. package/dist/hooks/useEditable.js.map +0 -1
  160. package/dist/hooks/useFilter.js.map +0 -1
  161. package/dist/hooks/useImage.js +0 -42
  162. package/dist/hooks/useImage.js.map +0 -1
  163. package/dist/hooks/usePagination.js +0 -73
  164. package/dist/hooks/usePagination.js.map +0 -1
  165. package/dist/hooks/useSelection.d.ts +0 -175
  166. package/dist/hooks/useSelection.js +0 -980
  167. package/dist/hooks/useSelection.js.map +0 -1
  168. package/dist/hooks/useSizer.js +0 -150
  169. package/dist/hooks/useSizer.js.map +0 -1
  170. package/dist/hooks/useTooltip.js +0 -106
  171. package/dist/hooks/useTooltip.js.map +0 -1
  172. package/dist/hooks/useTouch.d.ts +0 -21
  173. package/dist/hooks/useTouch.js +0 -73
  174. package/dist/hooks/useTouch.js.map +0 -1
  175. package/dist/hooks/useUndo.js.map +0 -1
  176. package/dist/index.d.ts +0 -25
  177. package/dist/index.js +0 -61
  178. package/dist/index.js.map +0 -1
  179. package/dist/types.js.map +0 -1
  180. package/dist/utils.d.ts +0 -8
  181. package/dist/utils.js +0 -153
  182. package/dist/utils.js.map +0 -1
  183. package/src/Cell.tsx +0 -100
  184. package/src/CellOverlay.tsx +0 -191
  185. package/src/FillHandle.tsx +0 -37
  186. package/src/Grid.tsx +0 -2677
  187. package/src/GridLine.tsx +0 -23
  188. package/src/Image.tsx +0 -43
  189. package/src/Selection.tsx +0 -9
  190. package/src/helpers.ts +0 -1455
  191. package/src/hooks/useCopyPaste.ts +0 -265
  192. package/src/hooks/useEditable.tsx +0 -945
  193. package/src/hooks/useFilter.tsx +0 -233
  194. package/src/hooks/useImage.ts +0 -57
  195. package/src/hooks/usePagination.tsx +0 -153
  196. package/src/hooks/useSelection.ts +0 -1437
  197. package/src/hooks/useSizer.ts +0 -312
  198. package/src/hooks/useTooltip.tsx +0 -172
  199. package/src/hooks/useTouch.ts +0 -116
  200. package/src/hooks/useUndo.ts +0 -134
  201. package/src/index.tsx +0 -46
  202. package/src/tests/Grid.spec.tsx +0 -47
  203. package/src/tests/helpers.test.ts +0 -292
  204. package/src/tests/usePagination.test.ts +0 -28
  205. package/src/tests/useSelection.test.ts +0 -27
  206. package/src/tests/useUndo.test.ts +0 -73
  207. package/src/types.ts +0 -69
  208. package/src/utils.tsx +0 -287
@@ -1,265 +0,0 @@
1
- import React, { useCallback, useEffect, useRef } from "react";
2
- import { CellInterface, GridRef, SelectionArea } from "../Grid";
3
- import { selectionFromActiveCell, prepareClipboardData } from "./../helpers";
4
- import { MimeType } from "../types";
5
-
6
- export interface CopyProps {
7
- /**
8
- * Selection bounds
9
- */
10
- selections: SelectionArea[];
11
- /**
12
- * Active cell
13
- */
14
- activeCell?: CellInterface | null;
15
- /**
16
- * Value getter of a cell
17
- */
18
- getValue: (cell: CellInterface) => any;
19
- /**
20
- * Get text value
21
- */
22
- getText: (config: any) => string | undefined;
23
- /**
24
- * Grid reference to access grid methods
25
- */
26
- gridRef: React.MutableRefObject<GridRef | null>;
27
- /**
28
- * Callback when a paste is executed
29
- */
30
- onPaste?: (
31
- rows: (string | null)[][],
32
- activeCell: CellInterface | null,
33
- selectionArea: SelectionArea[],
34
- /* Selection to remove */
35
- selection?: SelectionArea
36
- ) => void;
37
- /**
38
- * When user tries to cut a selection
39
- */
40
- onCut?: (selection: SelectionArea) => void;
41
- /**
42
- * Callback on copy event
43
- */
44
- onCopy?: (selection: SelectionArea[]) => void;
45
- }
46
-
47
- export interface CopyResults {
48
- copy: () => void;
49
- paste: () => void;
50
- cut: () => void;
51
- }
52
-
53
- type SupportedType =
54
- | "application/xhtml+xml"
55
- | "application/xml"
56
- | "image/svg+xml"
57
- | "text/html"
58
- | "text/xml";
59
-
60
- const defaultGetText = (config: { text: string }) => config.text;
61
-
62
- /**
63
- * Copy paste hook
64
- * Usage
65
- *
66
- * useCopyPaste ({
67
- * onPaste: (text) => {
68
- * }
69
- * })
70
- */
71
- const useCopyPaste = ({
72
- selections = [],
73
- activeCell = null,
74
- getValue,
75
- gridRef,
76
- onPaste,
77
- onCut,
78
- onCopy,
79
- getText = defaultGetText,
80
- }: CopyProps): CopyResults => {
81
- const selectionRef = useRef({ selections, activeCell, getValue });
82
- const cutSelections = useRef<SelectionArea>();
83
-
84
- /* Keep selections and activeCell upto date */
85
- useEffect(() => {
86
- selectionRef.current = { selections, activeCell, getValue };
87
- }, [selections, activeCell, getValue]);
88
-
89
- const currentSelections = () => {
90
- const sel = selectionRef.current.selections.length
91
- ? selectionRef.current.selections
92
- : selectionFromActiveCell(selectionRef.current.activeCell);
93
- return sel[sel.length - 1];
94
- };
95
-
96
- useEffect(() => {
97
- if (!gridRef.current) return;
98
- document.addEventListener("copy", handleCopy);
99
- document.addEventListener("paste", handlePaste);
100
- document.addEventListener("cut", handleCut);
101
-
102
- return () => {
103
- document.removeEventListener("copy", handleCopy);
104
- document.removeEventListener("paste", handlePaste);
105
- document.removeEventListener("cut", handleCut);
106
- };
107
- }, []);
108
-
109
- const handleCut = useCallback(() => {
110
- if (document.activeElement !== gridRef.current?.container) {
111
- return;
112
- }
113
- cutSelections.current = currentSelections();
114
- handleProgramaticCopy();
115
- }, []);
116
-
117
- const handleCopy = useCallback(
118
- (e: ClipboardEvent) => {
119
- if (document.activeElement !== gridRef.current?.container) {
120
- return;
121
- }
122
- /* Only copy the last selection */
123
- const selection = currentSelections();
124
- const { bounds } = selection;
125
- const { top, left, right, bottom } = bounds;
126
- const rows = [];
127
- const cells = [];
128
- for (let i = top; i <= bottom; i++) {
129
- const row = [];
130
- const cell = [];
131
- for (let j = left; j <= right; j++) {
132
- const coords = {
133
- rowIndex: i,
134
- columnIndex: j,
135
- };
136
- const config = {
137
- text: selectionRef.current.getValue(coords),
138
- sourceCell: coords,
139
- };
140
- const value = getText(config);
141
- cell.push(config);
142
- row.push(value);
143
- }
144
- rows.push(row);
145
- cells.push(cell);
146
- }
147
- const [html, csv] = prepareClipboardData(rows);
148
- e.clipboardData?.setData(MimeType.html, html);
149
- e.clipboardData?.setData(MimeType.plain, csv);
150
- e.clipboardData?.setData(MimeType.csv, csv);
151
- e.clipboardData?.setData(MimeType.json, JSON.stringify(cells));
152
- e.preventDefault();
153
-
154
- onCopy?.([selection]);
155
- },
156
- [currentSelections]
157
- );
158
-
159
- const handlePaste = (e: ClipboardEvent) => {
160
- if (document.activeElement !== gridRef.current?.container) {
161
- return;
162
- }
163
- const items = e.clipboardData?.items;
164
- if (!items) return;
165
- const mimeTypes = [
166
- MimeType.json,
167
- MimeType.html,
168
- MimeType.csv,
169
- MimeType.plain,
170
- ];
171
- let type;
172
- let value;
173
- let plainTextValue = e.clipboardData?.getData(MimeType.plain);
174
- for (type of mimeTypes) {
175
- value = e.clipboardData?.getData(type);
176
- if (value) break;
177
- }
178
- if (!type || !value) {
179
- console.warn("No clipboard data to paste");
180
- return;
181
- }
182
- let rows: any[] = [];
183
- if (/^text\/html/.test(type)) {
184
- const domparser = new DOMParser();
185
- const doc = domparser.parseFromString(value, type as SupportedType);
186
- const supportedNodes = "table, p, h1, h2, h3, h4, h5, h6";
187
- let nodes = doc.querySelectorAll(supportedNodes);
188
- if (nodes.length === 0) {
189
- rows.push([plainTextValue]);
190
- }
191
- for (let i = 0; i < nodes.length; i++) {
192
- const node = nodes[i];
193
- if (node.nodeName === "TABLE") {
194
- const tableRows = node.querySelectorAll("tr");
195
- for (let i = 0; i < tableRows.length; i++) {
196
- const tableRow = tableRows[i];
197
- const row = [];
198
- const cells = tableRow.querySelectorAll("td");
199
- for (let j = 0; j < cells.length; j++) {
200
- const cell = cells[j];
201
- row.push(cell.textContent);
202
- }
203
- rows.push(row);
204
- }
205
- } else {
206
- // Single nodes
207
- rows.push([node.textContent]);
208
- }
209
- }
210
- } else if (type === MimeType.json) {
211
- rows = JSON.parse(value);
212
- } else if (type === MimeType.plain) {
213
- rows = [[value]];
214
- } else {
215
- const values = value.split("\n");
216
- for (const val of values) {
217
- const row = [];
218
- for (const cell of val.split(",")) {
219
- row.push(cell.replace(/^\"|\"$/gi, ""));
220
- }
221
- rows.push(row);
222
- }
223
- }
224
-
225
- onPaste &&
226
- onPaste(
227
- rows,
228
- selectionRef.current.activeCell,
229
- selectionRef.current.selections,
230
- cutSelections.current
231
- );
232
-
233
- cutSelections.current = undefined;
234
- };
235
-
236
- /**
237
- * User is trying to copy from outisde the app
238
- */
239
- const handleProgramaticCopy = useCallback(() => {
240
- if (!gridRef.current) return;
241
- gridRef.current.focus();
242
- document.execCommand("copy");
243
- }, []);
244
-
245
- /**
246
- * User is trying to paste from outisde the app
247
- */
248
- const handleProgramaticPaste = useCallback(async () => {
249
- if (!gridRef.current) return;
250
- gridRef.current.focus();
251
- const text = await navigator.clipboard.readText();
252
- const clipboardData = new DataTransfer();
253
- clipboardData.setData(MimeType.plain, text);
254
- const event = new ClipboardEvent("paste", { clipboardData });
255
- handlePaste(event);
256
- }, []);
257
-
258
- return {
259
- copy: handleProgramaticCopy,
260
- paste: handleProgramaticPaste,
261
- cut: handleCut,
262
- };
263
- };
264
-
265
- export default useCopyPaste;