vastgrid 0.1.0 → 0.2.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 (312) hide show
  1. package/README.md +175 -13
  2. package/dist/canvas/geometry.d.ts +92 -0
  3. package/dist/canvas/geometry.d.ts.map +1 -0
  4. package/dist/canvas/geometry.js +197 -0
  5. package/dist/canvas/geometry.js.map +1 -0
  6. package/dist/canvas/grid-canvas.d.ts +161 -0
  7. package/dist/canvas/grid-canvas.d.ts.map +1 -0
  8. package/dist/canvas/grid-canvas.js +1146 -0
  9. package/dist/canvas/grid-canvas.js.map +1 -0
  10. package/dist/canvas/hooks.d.ts +61 -0
  11. package/dist/canvas/hooks.d.ts.map +1 -0
  12. package/dist/canvas/hooks.js +2 -0
  13. package/dist/canvas/hooks.js.map +1 -0
  14. package/dist/canvas/keys.d.ts +26 -0
  15. package/dist/canvas/keys.d.ts.map +1 -0
  16. package/dist/canvas/keys.js +133 -0
  17. package/dist/canvas/keys.js.map +1 -0
  18. package/dist/canvas/layout.d.ts +26 -0
  19. package/dist/canvas/layout.d.ts.map +1 -0
  20. package/dist/canvas/layout.js +73 -0
  21. package/dist/canvas/layout.js.map +1 -0
  22. package/dist/canvas/scroll.d.ts +31 -0
  23. package/dist/canvas/scroll.d.ts.map +1 -0
  24. package/dist/canvas/scroll.js +111 -0
  25. package/dist/canvas/scroll.js.map +1 -0
  26. package/dist/canvas/text.d.ts +23 -0
  27. package/dist/canvas/text.d.ts.map +1 -0
  28. package/dist/canvas/text.js +142 -0
  29. package/dist/canvas/text.js.map +1 -0
  30. package/dist/{theme.d.ts → canvas/theme.d.ts} +8 -0
  31. package/dist/canvas/theme.d.ts.map +1 -0
  32. package/dist/canvas/theme.js +62 -0
  33. package/dist/canvas/theme.js.map +1 -0
  34. package/dist/core/cache.d.ts +48 -0
  35. package/dist/core/cache.d.ts.map +1 -0
  36. package/dist/core/cache.js +222 -0
  37. package/dist/core/cache.js.map +1 -0
  38. package/dist/core/checked.d.ts +20 -0
  39. package/dist/core/checked.d.ts.map +1 -0
  40. package/dist/core/checked.js +61 -0
  41. package/dist/core/checked.js.map +1 -0
  42. package/dist/core/client.d.ts +33 -0
  43. package/dist/core/client.d.ts.map +1 -0
  44. package/dist/core/client.js +103 -0
  45. package/dist/core/client.js.map +1 -0
  46. package/dist/core/conditions.d.ts +48 -0
  47. package/dist/core/conditions.d.ts.map +1 -0
  48. package/dist/core/conditions.js +105 -0
  49. package/dist/core/conditions.js.map +1 -0
  50. package/dist/core/evaluate.d.ts +20 -0
  51. package/dist/core/evaluate.d.ts.map +1 -0
  52. package/dist/core/evaluate.js +210 -0
  53. package/dist/core/evaluate.js.map +1 -0
  54. package/dist/core/filters.d.ts +51 -0
  55. package/dist/core/filters.d.ts.map +1 -0
  56. package/dist/core/filters.js +303 -0
  57. package/dist/core/filters.js.map +1 -0
  58. package/dist/core/format.d.ts +14 -0
  59. package/dist/core/format.d.ts.map +1 -0
  60. package/dist/core/format.js +303 -0
  61. package/dist/core/format.js.map +1 -0
  62. package/dist/core/measures.d.ts +26 -0
  63. package/dist/core/measures.d.ts.map +1 -0
  64. package/dist/core/measures.js +105 -0
  65. package/dist/core/measures.js.map +1 -0
  66. package/dist/core/request-ids.d.ts +20 -0
  67. package/dist/core/request-ids.d.ts.map +1 -0
  68. package/dist/core/request-ids.js +55 -0
  69. package/dist/core/request-ids.js.map +1 -0
  70. package/dist/core/rows.d.ts +79 -0
  71. package/dist/core/rows.d.ts.map +1 -0
  72. package/dist/core/rows.js +173 -0
  73. package/dist/core/rows.js.map +1 -0
  74. package/dist/core/store.d.ts +233 -0
  75. package/dist/core/store.d.ts.map +1 -0
  76. package/dist/core/store.js +1162 -0
  77. package/dist/core/store.js.map +1 -0
  78. package/dist/core/totals.d.ts +24 -0
  79. package/dist/core/totals.d.ts.map +1 -0
  80. package/dist/core/totals.js +49 -0
  81. package/dist/core/totals.js.map +1 -0
  82. package/dist/core/trace.d.ts +7 -0
  83. package/dist/core/trace.d.ts.map +1 -0
  84. package/dist/core/trace.js +26 -0
  85. package/dist/core/trace.js.map +1 -0
  86. package/dist/core/transports.d.ts +50 -0
  87. package/dist/core/transports.d.ts.map +1 -0
  88. package/dist/core/transports.js +160 -0
  89. package/dist/core/transports.js.map +1 -0
  90. package/dist/core/types.d.ts +150 -0
  91. package/dist/core/types.d.ts.map +1 -0
  92. package/dist/core/types.js +45 -0
  93. package/dist/core/types.js.map +1 -0
  94. package/dist/core.d.ts +12 -0
  95. package/dist/core.d.ts.map +1 -0
  96. package/dist/core.js +11 -0
  97. package/dist/core.js.map +1 -0
  98. package/dist/index.d.ts +15 -6
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +13 -7
  101. package/dist/index.js.map +1 -1
  102. package/dist/react/accessible-rows.d.ts +13 -0
  103. package/dist/react/accessible-rows.d.ts.map +1 -0
  104. package/dist/react/accessible-rows.js +320 -0
  105. package/dist/react/accessible-rows.js.map +1 -0
  106. package/dist/react/cell-editor.d.ts +22 -0
  107. package/dist/react/cell-editor.d.ts.map +1 -0
  108. package/dist/react/cell-editor.js +431 -0
  109. package/dist/react/cell-editor.js.map +1 -0
  110. package/dist/react/cell-menu.d.ts +18 -0
  111. package/dist/react/cell-menu.d.ts.map +1 -0
  112. package/dist/react/cell-menu.js +299 -0
  113. package/dist/react/cell-menu.js.map +1 -0
  114. package/dist/react/column-menu.d.ts +16 -0
  115. package/dist/react/column-menu.d.ts.map +1 -0
  116. package/dist/react/column-menu.js +1311 -0
  117. package/dist/react/column-menu.js.map +1 -0
  118. package/dist/react/columns-menu.d.ts +7 -0
  119. package/dist/react/columns-menu.d.ts.map +1 -0
  120. package/dist/react/columns-menu.js +249 -0
  121. package/dist/react/columns-menu.js.map +1 -0
  122. package/dist/react/conditions-menu.d.ts +10 -0
  123. package/dist/react/conditions-menu.d.ts.map +1 -0
  124. package/dist/react/conditions-menu.js +795 -0
  125. package/dist/react/conditions-menu.js.map +1 -0
  126. package/dist/react/context.d.ts +29 -0
  127. package/dist/react/context.d.ts.map +1 -0
  128. package/dist/react/context.js +18 -0
  129. package/dist/react/context.js.map +1 -0
  130. package/dist/react/data-grid.d.ts +79 -0
  131. package/dist/react/data-grid.d.ts.map +1 -0
  132. package/dist/react/data-grid.js +653 -0
  133. package/dist/react/data-grid.js.map +1 -0
  134. package/dist/react/detail-panel.d.ts +22 -0
  135. package/dist/react/detail-panel.d.ts.map +1 -0
  136. package/dist/react/detail-panel.js +242 -0
  137. package/dist/react/detail-panel.js.map +1 -0
  138. package/dist/react/export-menu.d.ts +11 -0
  139. package/dist/react/export-menu.d.ts.map +1 -0
  140. package/dist/react/export-menu.js +304 -0
  141. package/dist/react/export-menu.js.map +1 -0
  142. package/dist/react/find-bar.d.ts +11 -0
  143. package/dist/react/find-bar.d.ts.map +1 -0
  144. package/dist/react/find-bar.js +303 -0
  145. package/dist/react/find-bar.js.map +1 -0
  146. package/dist/react/format-form.d.ts +12 -0
  147. package/dist/react/format-form.d.ts.map +1 -0
  148. package/dist/react/format-form.js +863 -0
  149. package/dist/react/format-form.js.map +1 -0
  150. package/dist/react/formula-menu.d.ts +6 -0
  151. package/dist/react/formula-menu.d.ts.map +1 -0
  152. package/dist/react/formula-menu.js +343 -0
  153. package/dist/react/formula-menu.js.map +1 -0
  154. package/dist/react/grid-body.d.ts +33 -0
  155. package/dist/react/grid-body.d.ts.map +1 -0
  156. package/dist/react/grid-body.js +1389 -0
  157. package/dist/react/grid-body.js.map +1 -0
  158. package/dist/react/group-menu.d.ts +7 -0
  159. package/dist/react/group-menu.d.ts.map +1 -0
  160. package/dist/react/group-menu.js +508 -0
  161. package/dist/react/group-menu.js.map +1 -0
  162. package/dist/react/hooks.d.ts +33 -0
  163. package/dist/react/hooks.d.ts.map +1 -0
  164. package/dist/react/hooks.js +161 -0
  165. package/dist/react/hooks.js.map +1 -0
  166. package/dist/react/messages.d.ts +180 -0
  167. package/dist/react/messages.d.ts.map +1 -0
  168. package/dist/react/messages.js +414 -0
  169. package/dist/react/messages.js.map +1 -0
  170. package/dist/react/save.d.ts +9 -0
  171. package/dist/react/save.d.ts.map +1 -0
  172. package/dist/react/save.js +102 -0
  173. package/dist/react/save.js.map +1 -0
  174. package/dist/react/static-rows.d.ts +9 -0
  175. package/dist/react/static-rows.d.ts.map +1 -0
  176. package/dist/react/static-rows.js +176 -0
  177. package/dist/react/static-rows.js.map +1 -0
  178. package/dist/react/status-bar.d.ts +12 -0
  179. package/dist/react/status-bar.d.ts.map +1 -0
  180. package/dist/react/status-bar.js +413 -0
  181. package/dist/react/status-bar.js.map +1 -0
  182. package/dist/react/toolbar-popover.d.ts +14 -0
  183. package/dist/react/toolbar-popover.d.ts.map +1 -0
  184. package/dist/react/toolbar-popover.js +143 -0
  185. package/dist/react/toolbar-popover.js.map +1 -0
  186. package/dist/react/toolbar.d.ts +13 -0
  187. package/dist/react/toolbar.d.ts.map +1 -0
  188. package/dist/react/toolbar.js +344 -0
  189. package/dist/react/toolbar.js.map +1 -0
  190. package/dist/server.d.ts +22 -0
  191. package/dist/server.d.ts.map +1 -0
  192. package/dist/server.js +45 -0
  193. package/dist/server.js.map +1 -0
  194. package/dist/styles.css +496 -316
  195. package/package.json +43 -18
  196. package/src/canvas/geometry.ts +197 -0
  197. package/src/canvas/grid-canvas.ts +1222 -0
  198. package/src/canvas/hooks.ts +61 -0
  199. package/src/canvas/keys.ts +96 -0
  200. package/src/canvas/layout.ts +77 -0
  201. package/src/canvas/scroll.ts +120 -0
  202. package/src/canvas/text.ts +155 -0
  203. package/src/{theme.ts → canvas/theme.ts} +14 -1
  204. package/src/core/cache.ts +247 -0
  205. package/src/core/checked.ts +64 -0
  206. package/src/core/client.ts +103 -0
  207. package/src/core/conditions.ts +89 -0
  208. package/src/core/evaluate.ts +221 -0
  209. package/src/core/filters.ts +268 -0
  210. package/src/core/format.ts +309 -0
  211. package/src/core/measures.ts +99 -0
  212. package/src/core/request-ids.ts +54 -0
  213. package/src/core/rows.ts +213 -0
  214. package/src/core/store.ts +1122 -0
  215. package/src/core/totals.ts +59 -0
  216. package/src/core/trace.ts +44 -0
  217. package/src/core/transports.ts +177 -0
  218. package/src/core/types.ts +168 -0
  219. package/src/core.ts +39 -0
  220. package/src/index.ts +24 -12
  221. package/src/react/accessible-rows.tsx +242 -0
  222. package/src/react/cell-editor.tsx +216 -0
  223. package/src/react/cell-menu.tsx +166 -0
  224. package/src/react/column-menu.tsx +619 -0
  225. package/src/react/columns-menu.tsx +116 -0
  226. package/src/react/conditions-menu.tsx +289 -0
  227. package/src/react/context.ts +33 -0
  228. package/src/react/data-grid.tsx +286 -0
  229. package/src/react/detail-panel.tsx +92 -0
  230. package/src/react/export-menu.tsx +112 -0
  231. package/src/react/find-bar.tsx +112 -0
  232. package/src/react/format-form.tsx +421 -0
  233. package/src/react/formula-menu.tsx +163 -0
  234. package/src/react/grid-body.tsx +744 -0
  235. package/src/react/group-menu.tsx +214 -0
  236. package/src/react/hooks.ts +104 -0
  237. package/src/react/messages.ts +556 -0
  238. package/src/react/save.ts +42 -0
  239. package/src/react/static-rows.tsx +59 -0
  240. package/src/react/status-bar.tsx +175 -0
  241. package/src/react/toolbar-popover.tsx +69 -0
  242. package/src/react/toolbar.tsx +152 -0
  243. package/src/server.ts +58 -0
  244. package/src/styles.css +496 -316
  245. package/dist/components/bars.d.ts +0 -14
  246. package/dist/components/bars.d.ts.map +0 -1
  247. package/dist/components/bars.js +0 -67
  248. package/dist/components/bars.js.map +0 -1
  249. package/dist/components/cell-inspector.d.ts +0 -11
  250. package/dist/components/cell-inspector.d.ts.map +0 -1
  251. package/dist/components/cell-inspector.js +0 -37
  252. package/dist/components/cell-inspector.js.map +0 -1
  253. package/dist/components/columns-panel.d.ts +0 -12
  254. package/dist/components/columns-panel.d.ts.map +0 -1
  255. package/dist/components/columns-panel.js +0 -11
  256. package/dist/components/columns-panel.js.map +0 -1
  257. package/dist/components/filter-panel.d.ts +0 -17
  258. package/dist/components/filter-panel.d.ts.map +0 -1
  259. package/dist/components/filter-panel.js +0 -165
  260. package/dist/components/filter-panel.js.map +0 -1
  261. package/dist/components/find-bar.d.ts +0 -9
  262. package/dist/components/find-bar.d.ts.map +0 -1
  263. package/dist/components/find-bar.js +0 -46
  264. package/dist/components/find-bar.js.map +0 -1
  265. package/dist/components/popover.d.ts +0 -38
  266. package/dist/components/popover.d.ts.map +0 -1
  267. package/dist/components/popover.js +0 -104
  268. package/dist/components/popover.js.map +0 -1
  269. package/dist/components/stats-panel.d.ts +0 -12
  270. package/dist/components/stats-panel.d.ts.map +0 -1
  271. package/dist/components/stats-panel.js +0 -40
  272. package/dist/components/stats-panel.js.map +0 -1
  273. package/dist/controller.d.ts +0 -218
  274. package/dist/controller.d.ts.map +0 -1
  275. package/dist/controller.js +0 -788
  276. package/dist/controller.js.map +0 -1
  277. package/dist/data-grid.d.ts +0 -51
  278. package/dist/data-grid.d.ts.map +0 -1
  279. package/dist/data-grid.js +0 -698
  280. package/dist/data-grid.js.map +0 -1
  281. package/dist/labels.d.ts +0 -9
  282. package/dist/labels.d.ts.map +0 -1
  283. package/dist/labels.js +0 -38
  284. package/dist/labels.js.map +0 -1
  285. package/dist/messages.d.ts +0 -99
  286. package/dist/messages.d.ts.map +0 -1
  287. package/dist/messages.js +0 -276
  288. package/dist/messages.js.map +0 -1
  289. package/dist/renderer.d.ts +0 -52
  290. package/dist/renderer.d.ts.map +0 -1
  291. package/dist/renderer.js +0 -522
  292. package/dist/renderer.js.map +0 -1
  293. package/dist/text.d.ts +0 -14
  294. package/dist/text.d.ts.map +0 -1
  295. package/dist/text.js +0 -63
  296. package/dist/text.js.map +0 -1
  297. package/dist/theme.d.ts.map +0 -1
  298. package/dist/theme.js +0 -54
  299. package/dist/theme.js.map +0 -1
  300. package/src/components/bars.tsx +0 -179
  301. package/src/components/cell-inspector.tsx +0 -70
  302. package/src/components/columns-panel.tsx +0 -59
  303. package/src/components/filter-panel.tsx +0 -290
  304. package/src/components/find-bar.tsx +0 -104
  305. package/src/components/popover.tsx +0 -194
  306. package/src/components/stats-panel.tsx +0 -153
  307. package/src/controller.ts +0 -887
  308. package/src/data-grid.tsx +0 -1029
  309. package/src/labels.ts +0 -46
  310. package/src/messages.ts +0 -390
  311. package/src/renderer.ts +0 -535
  312. package/src/text.ts +0 -55
@@ -0,0 +1,304 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { use, useId, useRef, useState, useTransition } from "react";
3
+ import { CommandError } from "vastgrid-spec";
4
+ import { LocaleContext } from "./context.js";
5
+ import { useGridSelector, useGridStore } from "./hooks.js";
6
+
7
+ /** The media types of the formats of §8.2, for files that an engine answers as data. */
8
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
9
+ const MEDIA_TYPES = {
10
+ csv: "text/csv;charset=utf-8",
11
+ tsv: "text/tab-separated-values;charset=utf-8",
12
+ json: "application/json;charset=utf-8",
13
+ parquet: "application/vnd.apache.parquet",
14
+ xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
15
+ };
16
+
17
+ /** Downloads a file at a URL, as a link with `download` does: under `name`, or the name the server gives. */
18
+ function download(url, name = "") {
19
+ const link = document.createElement("a");
20
+ link.href = url;
21
+ link.download = name;
22
+ link.rel = "noopener";
23
+ document.body.append(link);
24
+ link.click();
25
+ link.remove();
26
+ }
27
+
28
+ /**
29
+ * The toolbar's export menu (§6.6 of the specification): the rows of the view or the whole table, with the hidden
30
+ * columns or not, in one of the formats the engine exports. It runs as an Action: the button shows that it runs, and
31
+ * the outcome is announced. An export without a target is downloaded from where the transport gives it
32
+ * (`Transport.exportUrl`), or, from an engine that answers the file's bytes (`delivery` `data`), as a file made of
33
+ * them.
34
+ */
35
+ export function ExportMenu(t0) {
36
+ const $ = _c(52);
37
+ const {
38
+ announce
39
+ } = t0;
40
+ const store = useGridStore();
41
+ const {
42
+ messages,
43
+ number
44
+ } = use(LocaleContext);
45
+ const formats = useGridSelector(_temp);
46
+ const [rows, setRows] = useState("view");
47
+ const [allColumns, setAllColumns] = useState(false);
48
+ const [pending, startExport] = useTransition();
49
+ const id = useId();
50
+ const buttonRef = useRef(null);
51
+ if (!formats || formats.length === 0) {
52
+ return null;
53
+ }
54
+ let t1;
55
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
56
+ t1 = event => {
57
+ const button = buttonRef.current;
58
+ if (event.newState !== "open" || !button) {
59
+ return;
60
+ }
61
+ const rect = button.getBoundingClientRect();
62
+ const menu = event.currentTarget;
63
+ menu.style.top = `${rect.bottom + 4}px`;
64
+ menu.style.left = `${Math.max(8, rect.right - menu.offsetWidth)}px`;
65
+ };
66
+ $[0] = t1;
67
+ } else {
68
+ t1 = $[0];
69
+ }
70
+ const place = t1;
71
+ let t2;
72
+ if ($[1] !== allColumns || $[2] !== announce || $[3] !== id || $[4] !== messages || $[5] !== number || $[6] !== rows || $[7] !== store) {
73
+ t2 = format => {
74
+ document.getElementById(id)?.hidePopover?.();
75
+ startExport(async () => {
76
+ const outcome = await store.dispatch({
77
+ command: "export",
78
+ format,
79
+ rows,
80
+ columns: allColumns ? "all" : "displayed"
81
+ });
82
+ if (!outcome.ok) {
83
+ const reason = outcome.error instanceof CommandError ? outcome.error.reason : null;
84
+ announce(messages.failed(reason === "not_loaded" ? messages.loading : outcome.error.message));
85
+ return;
86
+ }
87
+ const result = outcome.output;
88
+ if (result.data) {
89
+ const url = URL.createObjectURL(new Blob([result.data.bytes], {
90
+ type: MEDIA_TYPES[format] ?? ""
91
+ }));
92
+ download(url, store.exportName(format));
93
+ setTimeout(() => URL.revokeObjectURL(url), 60000);
94
+ } else {
95
+ const url_0 = result.target === null ? null : store.exportUrl(result.target);
96
+ if (url_0) {
97
+ download(url_0);
98
+ }
99
+ }
100
+ announce(messages.exported(number.format(result.rows)));
101
+ });
102
+ };
103
+ $[1] = allColumns;
104
+ $[2] = announce;
105
+ $[3] = id;
106
+ $[4] = messages;
107
+ $[5] = number;
108
+ $[6] = rows;
109
+ $[7] = store;
110
+ $[8] = t2;
111
+ } else {
112
+ t2 = $[8];
113
+ }
114
+ const run = t2;
115
+ const t3 = pending ? messages.exporting : messages.export;
116
+ let t4;
117
+ if ($[9] !== id || $[10] !== pending || $[11] !== t3) {
118
+ t4 = /*#__PURE__*/_jsx("button", {
119
+ ref: buttonRef,
120
+ type: "button",
121
+ className: "vg-button",
122
+ popoverTarget: id,
123
+ disabled: pending,
124
+ children: t3
125
+ });
126
+ $[9] = id;
127
+ $[10] = pending;
128
+ $[11] = t3;
129
+ $[12] = t4;
130
+ } else {
131
+ t4 = $[12];
132
+ }
133
+ const t5 = messages.export;
134
+ const t6 = `${id}-rows`;
135
+ const t7 = rows === "view";
136
+ let t8;
137
+ if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
138
+ t8 = () => setRows("view");
139
+ $[13] = t8;
140
+ } else {
141
+ t8 = $[13];
142
+ }
143
+ let t9;
144
+ if ($[14] !== t6 || $[15] !== t7) {
145
+ t9 = /*#__PURE__*/_jsx("input", {
146
+ type: "radio",
147
+ name: t6,
148
+ checked: t7,
149
+ onChange: t8
150
+ });
151
+ $[14] = t6;
152
+ $[15] = t7;
153
+ $[16] = t9;
154
+ } else {
155
+ t9 = $[16];
156
+ }
157
+ let t10;
158
+ if ($[17] !== messages.exportView || $[18] !== t9) {
159
+ t10 = /*#__PURE__*/_jsxs("label", {
160
+ children: [t9, messages.exportView]
161
+ });
162
+ $[17] = messages.exportView;
163
+ $[18] = t9;
164
+ $[19] = t10;
165
+ } else {
166
+ t10 = $[19];
167
+ }
168
+ const t11 = `${id}-rows`;
169
+ const t12 = rows === "table";
170
+ let t13;
171
+ if ($[20] === Symbol.for("react.memo_cache_sentinel")) {
172
+ t13 = () => setRows("table");
173
+ $[20] = t13;
174
+ } else {
175
+ t13 = $[20];
176
+ }
177
+ let t14;
178
+ if ($[21] !== t11 || $[22] !== t12) {
179
+ t14 = /*#__PURE__*/_jsx("input", {
180
+ type: "radio",
181
+ name: t11,
182
+ checked: t12,
183
+ onChange: t13
184
+ });
185
+ $[21] = t11;
186
+ $[22] = t12;
187
+ $[23] = t14;
188
+ } else {
189
+ t14 = $[23];
190
+ }
191
+ let t15;
192
+ if ($[24] !== messages.exportTable || $[25] !== t14) {
193
+ t15 = /*#__PURE__*/_jsxs("label", {
194
+ children: [t14, messages.exportTable]
195
+ });
196
+ $[24] = messages.exportTable;
197
+ $[25] = t14;
198
+ $[26] = t15;
199
+ } else {
200
+ t15 = $[26];
201
+ }
202
+ let t16;
203
+ if ($[27] === Symbol.for("react.memo_cache_sentinel")) {
204
+ t16 = event_0 => setAllColumns(event_0.target.checked);
205
+ $[27] = t16;
206
+ } else {
207
+ t16 = $[27];
208
+ }
209
+ let t17;
210
+ if ($[28] !== allColumns) {
211
+ t17 = /*#__PURE__*/_jsx("input", {
212
+ type: "checkbox",
213
+ checked: allColumns,
214
+ onChange: t16
215
+ });
216
+ $[28] = allColumns;
217
+ $[29] = t17;
218
+ } else {
219
+ t17 = $[29];
220
+ }
221
+ let t18;
222
+ if ($[30] !== messages.exportAllColumns || $[31] !== t17) {
223
+ t18 = /*#__PURE__*/_jsxs("label", {
224
+ children: [t17, messages.exportAllColumns]
225
+ });
226
+ $[30] = messages.exportAllColumns;
227
+ $[31] = t17;
228
+ $[32] = t18;
229
+ } else {
230
+ t18 = $[32];
231
+ }
232
+ let t19;
233
+ if ($[33] !== t10 || $[34] !== t15 || $[35] !== t18) {
234
+ t19 = /*#__PURE__*/_jsxs("fieldset", {
235
+ className: "vg-menu__group",
236
+ children: [t10, t15, t18]
237
+ });
238
+ $[33] = t10;
239
+ $[34] = t15;
240
+ $[35] = t18;
241
+ $[36] = t19;
242
+ } else {
243
+ t19 = $[36];
244
+ }
245
+ let t20;
246
+ if ($[37] !== formats || $[38] !== messages.exportFormats || $[39] !== run) {
247
+ let t21;
248
+ if ($[41] !== messages.exportFormats || $[42] !== run) {
249
+ t21 = format_0 => /*#__PURE__*/_jsx("button", {
250
+ type: "button",
251
+ className: "vg-menu__item",
252
+ onClick: () => run(format_0),
253
+ children: messages.exportFormats[format_0] ?? format_0
254
+ }, format_0);
255
+ $[41] = messages.exportFormats;
256
+ $[42] = run;
257
+ $[43] = t21;
258
+ } else {
259
+ t21 = $[43];
260
+ }
261
+ t20 = formats.map(t21);
262
+ $[37] = formats;
263
+ $[38] = messages.exportFormats;
264
+ $[39] = run;
265
+ $[40] = t20;
266
+ } else {
267
+ t20 = $[40];
268
+ }
269
+ let t21;
270
+ if ($[44] !== id || $[45] !== messages.export || $[46] !== t19 || $[47] !== t20) {
271
+ t21 = /*#__PURE__*/_jsxs("div", {
272
+ id: id,
273
+ popover: "auto",
274
+ role: "dialog",
275
+ className: "vg-menu",
276
+ "aria-label": t5,
277
+ onToggle: place,
278
+ children: [t19, t20]
279
+ });
280
+ $[44] = id;
281
+ $[45] = messages.export;
282
+ $[46] = t19;
283
+ $[47] = t20;
284
+ $[48] = t21;
285
+ } else {
286
+ t21 = $[48];
287
+ }
288
+ let t22;
289
+ if ($[49] !== t21 || $[50] !== t4) {
290
+ t22 = /*#__PURE__*/_jsxs(_Fragment, {
291
+ children: [t4, t21]
292
+ });
293
+ $[49] = t21;
294
+ $[50] = t4;
295
+ $[51] = t22;
296
+ } else {
297
+ t22 = $[51];
298
+ }
299
+ return t22;
300
+ }
301
+ function _temp(snapshot) {
302
+ return snapshot.table?.capabilities.export?.formats;
303
+ }
304
+ //# sourceMappingURL=export-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["use","useId","useRef","useState","useTransition","CommandError","LocaleContext","useGridSelector","useGridStore","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","MEDIA_TYPES","csv","tsv","json","parquet","xlsx","download","url","name","link","document","createElement","href","rel","body","append","click","remove","ExportMenu","t0","$","_c","announce","store","messages","number","formats","_temp","rows","setRows","allColumns","setAllColumns","pending","startExport","id","buttonRef","length","t1","Symbol","for","event","button","current","newState","rect","getBoundingClientRect","menu","currentTarget","style","top","bottom","left","Math","max","right","offsetWidth","place","t2","format","getElementById","hidePopover","outcome","dispatch","command","columns","ok","reason","error","failed","loading","message","result","output","data","URL","createObjectURL","Blob","bytes","type","exportName","setTimeout","revokeObjectURL","url_0","target","exportUrl","exported","run","t3","exporting","export","t4","className","children","t5","t6","t7","t8","t9","checked","onChange","t10","exportView","t11","t12","t13","t14","t15","exportTable","t16","event_0","t17","t18","exportAllColumns","t19","t20","exportFormats","t21","format_0","onClick","map","popover","role","t22","snapshot","table","capabilities"],"sources":["export-menu.tsx"],"sourcesContent":["import { type ToggleEvent, use, useId, useRef, useState, useTransition } from \"react\";\nimport { CommandError } from \"vastgrid-spec\";\nimport { LocaleContext } from \"./context.js\";\nimport { useGridSelector, useGridStore } from \"./hooks.js\";\n\n/** The media types of the formats of §8.2, for files that an engine answers as data. */\nconst MEDIA_TYPES: Record<string, string> = {\n csv: \"text/csv;charset=utf-8\",\n tsv: \"text/tab-separated-values;charset=utf-8\",\n json: \"application/json;charset=utf-8\",\n parquet: \"application/vnd.apache.parquet\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n};\n\n/** Downloads a file at a URL, as a link with `download` does: under `name`, or the name the server gives. */\nfunction download(url: string, name = \"\") {\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = name;\n link.rel = \"noopener\";\n document.body.append(link);\n link.click();\n link.remove();\n}\n\n/**\n * The toolbar's export menu (§6.6 of the specification): the rows of the view or the whole table, with the hidden\n * columns or not, in one of the formats the engine exports. It runs as an Action: the button shows that it runs, and\n * the outcome is announced. An export without a target is downloaded from where the transport gives it\n * (`Transport.exportUrl`), or, from an engine that answers the file's bytes (`delivery` `data`), as a file made of\n * them.\n */\nexport function ExportMenu({ announce }: { announce: (text: string) => void }) {\n const store = useGridStore();\n const { messages, number } = use(LocaleContext);\n const formats = useGridSelector((snapshot) => snapshot.table?.capabilities.export?.formats);\n const [rows, setRows] = useState<\"view\" | \"table\">(\"view\");\n const [allColumns, setAllColumns] = useState(false);\n const [pending, startExport] = useTransition();\n const id = useId();\n const buttonRef = useRef<HTMLButtonElement>(null);\n if (!formats || formats.length === 0) return null;\n\n // The menu opens under its button, its right edge at the button's (popovers open in the middle otherwise).\n const place = (event: ToggleEvent<HTMLDivElement>) => {\n const button = buttonRef.current;\n if (event.newState !== \"open\" || !button) return;\n const rect = button.getBoundingClientRect();\n const menu = event.currentTarget;\n menu.style.top = `${rect.bottom + 4}px`;\n menu.style.left = `${Math.max(8, rect.right - menu.offsetWidth)}px`;\n };\n\n const run = (format: string) => {\n document.getElementById(id)?.hidePopover?.();\n startExport(async () => {\n const outcome = await store.dispatch({\n command: \"export\",\n format,\n rows,\n columns: allColumns ? \"all\" : \"displayed\",\n });\n if (!outcome.ok) {\n const reason = outcome.error instanceof CommandError ? outcome.error.reason : null;\n announce(messages.failed(reason === \"not_loaded\" ? messages.loading : outcome.error.message));\n return;\n }\n const result = outcome.output as { target: string | null; rows: number; data?: { bytes: Uint8Array } };\n if (result.data) {\n const url = URL.createObjectURL(\n new Blob([result.data.bytes as Uint8Array<ArrayBuffer>], { type: MEDIA_TYPES[format] ?? \"\" }),\n );\n download(url, store.exportName(format));\n // The link has started the download; the browser keeps the file's bytes until it is done.\n setTimeout(() => URL.revokeObjectURL(url), 60_000);\n } else {\n const url = result.target === null ? null : store.exportUrl(result.target);\n if (url) download(url);\n }\n announce(messages.exported(number.format(result.rows)));\n });\n };\n\n return (\n <>\n <button ref={buttonRef} type=\"button\" className=\"vg-button\" popoverTarget={id} disabled={pending}>\n {pending ? messages.exporting : messages.export}\n </button>\n <div id={id} popover=\"auto\" role=\"dialog\" className=\"vg-menu\" aria-label={messages.export} onToggle={place}>\n <fieldset className=\"vg-menu__group\">\n <label>\n <input type=\"radio\" name={`${id}-rows`} checked={rows === \"view\"} onChange={() => setRows(\"view\")} />\n {messages.exportView}\n </label>\n <label>\n <input type=\"radio\" name={`${id}-rows`} checked={rows === \"table\"} onChange={() => setRows(\"table\")} />\n {messages.exportTable}\n </label>\n <label>\n <input type=\"checkbox\" checked={allColumns} onChange={(event) => setAllColumns(event.target.checked)} />\n {messages.exportAllColumns}\n </label>\n </fieldset>\n {formats.map((format) => (\n <button key={format} type=\"button\" className=\"vg-menu__item\" onClick={() => run(format)}>\n {messages.exportFormats[format] ?? format}\n </button>\n ))}\n </div>\n </>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,11 @@
1
+ import { type RefObject } from "react";
2
+ /**
3
+ * The find bar (⌘F or Ctrl+F on the grid): finds the next cell of the view whose text contains what is typed, from
4
+ * the active cell, in the displayed columns (`GridStore.find`, `find` of §8.2), and makes it the active cell. Enter
5
+ * finds the next one, Shift+Enter the one before, and Esc closes the bar and gives the focus back to the grid.
6
+ */
7
+ export declare function FindBar({ onClose, scrollerRef, }: {
8
+ onClose: () => void;
9
+ scrollerRef: RefObject<HTMLDivElement | null>;
10
+ }): import("react").JSX.Element | null;
11
+ //# sourceMappingURL=find-bar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-bar.d.ts","sourceRoot":"","sources":["../../src/react/find-bar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,SAAS,EAAyD,MAAM,OAAO,CAAC;AAIlH;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EACtB,OAAO,EACP,WAAW,GACZ,EAAE;IACD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,WAAW,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;CAC/C,sCAgGA"}
@@ -0,0 +1,303 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { use, useLayoutEffect, useRef, useState, useTransition } from "react";
3
+ import { LocaleContext } from "./context.js";
4
+ import { useGridSelector, useGridStore } from "./hooks.js";
5
+
6
+ /**
7
+ * The find bar (⌘F or Ctrl+F on the grid): finds the next cell of the view whose text contains what is typed, from
8
+ * the active cell, in the displayed columns (`GridStore.find`, `find` of §8.2), and makes it the active cell. Enter
9
+ * finds the next one, Shift+Enter the one before, and Esc closes the bar and gives the focus back to the grid.
10
+ */
11
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
+ export function FindBar(t0) {
13
+ const $ = _c(51);
14
+ const {
15
+ onClose,
16
+ scrollerRef
17
+ } = t0;
18
+ const store = useGridStore();
19
+ const {
20
+ messages
21
+ } = use(LocaleContext);
22
+ const finds = useGridSelector(_temp);
23
+ const [text, setText] = useState("");
24
+ const [caseSensitive, setCaseSensitive] = useState(false);
25
+ const [status, setStatus] = useState("");
26
+ const [pending, startFind] = useTransition();
27
+ const inputRef = useRef(null);
28
+ let t1;
29
+ let t2;
30
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
31
+ t1 = () => {
32
+ inputRef.current?.focus();
33
+ inputRef.current?.select();
34
+ };
35
+ t2 = [];
36
+ $[0] = t1;
37
+ $[1] = t2;
38
+ } else {
39
+ t1 = $[0];
40
+ t2 = $[1];
41
+ }
42
+ useLayoutEffect(t1, t2);
43
+ let t3;
44
+ if ($[2] !== onClose || $[3] !== scrollerRef) {
45
+ t3 = () => {
46
+ onClose();
47
+ scrollerRef.current?.focus({
48
+ preventScroll: true
49
+ });
50
+ };
51
+ $[2] = onClose;
52
+ $[3] = scrollerRef;
53
+ $[4] = t3;
54
+ } else {
55
+ t3 = $[4];
56
+ }
57
+ const close = t3;
58
+ let t4;
59
+ if ($[5] !== caseSensitive || $[6] !== messages || $[7] !== store || $[8] !== text) {
60
+ t4 = direction => {
61
+ if (text === "") {
62
+ return;
63
+ }
64
+ startFind(async () => {
65
+ const {
66
+ session,
67
+ displayed
68
+ } = store.getSnapshot();
69
+ const from = session.active ?? {
70
+ row: 0,
71
+ column: displayed[0]?.column.name ?? ""
72
+ };
73
+ ;
74
+ try {
75
+ const found = await store.find(text, {
76
+ from,
77
+ direction,
78
+ caseSensitive
79
+ });
80
+ if (!found) {
81
+ setStatus(messages.noMatches);
82
+ return;
83
+ }
84
+ setStatus("");
85
+ await store.dispatch({
86
+ command: "select",
87
+ row: found.row,
88
+ column: found.column
89
+ });
90
+ } catch (t5) {
91
+ const error = t5;
92
+ setStatus(messages.failed(error instanceof Error ? error.message : String(error)));
93
+ }
94
+ });
95
+ };
96
+ $[5] = caseSensitive;
97
+ $[6] = messages;
98
+ $[7] = store;
99
+ $[8] = text;
100
+ $[9] = t4;
101
+ } else {
102
+ t4 = $[9];
103
+ }
104
+ const find = t4;
105
+ let t5;
106
+ if ($[10] !== close || $[11] !== find) {
107
+ t5 = event => {
108
+ if (event.nativeEvent.isComposing || event.keyCode === 229) {
109
+ return;
110
+ }
111
+ if (event.key === "Escape") {
112
+ event.preventDefault();
113
+ close();
114
+ } else {
115
+ if (event.key === "Enter" && event.target === inputRef.current) {
116
+ event.preventDefault();
117
+ find(event.shiftKey ? -1 : 1);
118
+ }
119
+ }
120
+ };
121
+ $[10] = close;
122
+ $[11] = find;
123
+ $[12] = t5;
124
+ } else {
125
+ t5 = $[12];
126
+ }
127
+ const onKeyDown = t5;
128
+ if (!finds) {
129
+ return null;
130
+ }
131
+ let t6;
132
+ if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
133
+ t6 = event_0 => {
134
+ setText(event_0.target.value);
135
+ setStatus("");
136
+ };
137
+ $[13] = t6;
138
+ } else {
139
+ t6 = $[13];
140
+ }
141
+ let t7;
142
+ if ($[14] !== messages.find || $[15] !== text) {
143
+ t7 = /*#__PURE__*/_jsx("input", {
144
+ ref: inputRef,
145
+ type: "search",
146
+ className: "vg-input vg-find__input",
147
+ "aria-label": messages.find,
148
+ placeholder: messages.find,
149
+ value: text,
150
+ onChange: t6
151
+ });
152
+ $[14] = messages.find;
153
+ $[15] = text;
154
+ $[16] = t7;
155
+ } else {
156
+ t7 = $[16];
157
+ }
158
+ let t8;
159
+ if ($[17] === Symbol.for("react.memo_cache_sentinel")) {
160
+ t8 = event_1 => setCaseSensitive(event_1.target.checked);
161
+ $[17] = t8;
162
+ } else {
163
+ t8 = $[17];
164
+ }
165
+ let t9;
166
+ if ($[18] !== caseSensitive) {
167
+ t9 = /*#__PURE__*/_jsx("input", {
168
+ type: "checkbox",
169
+ checked: caseSensitive,
170
+ onChange: t8
171
+ });
172
+ $[18] = caseSensitive;
173
+ $[19] = t9;
174
+ } else {
175
+ t9 = $[19];
176
+ }
177
+ let t10;
178
+ if ($[20] !== messages.matchCase) {
179
+ t10 = /*#__PURE__*/_jsx("span", {
180
+ children: messages.matchCase
181
+ });
182
+ $[20] = messages.matchCase;
183
+ $[21] = t10;
184
+ } else {
185
+ t10 = $[21];
186
+ }
187
+ let t11;
188
+ if ($[22] !== t10 || $[23] !== t9) {
189
+ t11 = /*#__PURE__*/_jsxs("label", {
190
+ className: "vg-filter__value",
191
+ children: [t9, t10]
192
+ });
193
+ $[22] = t10;
194
+ $[23] = t9;
195
+ $[24] = t11;
196
+ } else {
197
+ t11 = $[24];
198
+ }
199
+ const t12 = pending || text === "";
200
+ let t13;
201
+ if ($[25] !== find) {
202
+ t13 = () => find(-1);
203
+ $[25] = find;
204
+ $[26] = t13;
205
+ } else {
206
+ t13 = $[26];
207
+ }
208
+ let t14;
209
+ if ($[27] !== messages.findPrevious || $[28] !== t12 || $[29] !== t13) {
210
+ t14 = /*#__PURE__*/_jsx("button", {
211
+ type: "button",
212
+ className: "vg-button vg-button--small",
213
+ "aria-label": messages.findPrevious,
214
+ disabled: t12,
215
+ onClick: t13,
216
+ children: "\u2191"
217
+ });
218
+ $[27] = messages.findPrevious;
219
+ $[28] = t12;
220
+ $[29] = t13;
221
+ $[30] = t14;
222
+ } else {
223
+ t14 = $[30];
224
+ }
225
+ const t15 = pending || text === "";
226
+ let t16;
227
+ if ($[31] !== find) {
228
+ t16 = () => find(1);
229
+ $[31] = find;
230
+ $[32] = t16;
231
+ } else {
232
+ t16 = $[32];
233
+ }
234
+ let t17;
235
+ if ($[33] !== messages.findNext || $[34] !== t15 || $[35] !== t16) {
236
+ t17 = /*#__PURE__*/_jsx("button", {
237
+ type: "button",
238
+ className: "vg-button vg-button--small",
239
+ "aria-label": messages.findNext,
240
+ disabled: t15,
241
+ onClick: t16,
242
+ children: "\u2193"
243
+ });
244
+ $[33] = messages.findNext;
245
+ $[34] = t15;
246
+ $[35] = t16;
247
+ $[36] = t17;
248
+ } else {
249
+ t17 = $[36];
250
+ }
251
+ let t18;
252
+ if ($[37] !== status) {
253
+ t18 = /*#__PURE__*/_jsx("span", {
254
+ className: "vg-find__status",
255
+ role: "status",
256
+ children: status
257
+ });
258
+ $[37] = status;
259
+ $[38] = t18;
260
+ } else {
261
+ t18 = $[38];
262
+ }
263
+ let t19;
264
+ if ($[39] !== close || $[40] !== messages.closeFind) {
265
+ t19 = /*#__PURE__*/_jsx("button", {
266
+ type: "button",
267
+ className: "vg-button vg-button--small",
268
+ "aria-label": messages.closeFind,
269
+ onClick: close,
270
+ children: "\xD7"
271
+ });
272
+ $[39] = close;
273
+ $[40] = messages.closeFind;
274
+ $[41] = t19;
275
+ } else {
276
+ t19 = $[41];
277
+ }
278
+ let t20;
279
+ if ($[42] !== messages.find || $[43] !== onKeyDown || $[44] !== t11 || $[45] !== t14 || $[46] !== t17 || $[47] !== t18 || $[48] !== t19 || $[49] !== t7) {
280
+ t20 = /*#__PURE__*/_jsxs("search", {
281
+ className: "vg-find",
282
+ "aria-label": messages.find,
283
+ onKeyDown: onKeyDown,
284
+ children: [t7, t11, t14, t17, t18, t19]
285
+ });
286
+ $[42] = messages.find;
287
+ $[43] = onKeyDown;
288
+ $[44] = t11;
289
+ $[45] = t14;
290
+ $[46] = t17;
291
+ $[47] = t18;
292
+ $[48] = t19;
293
+ $[49] = t7;
294
+ $[50] = t20;
295
+ } else {
296
+ t20 = $[50];
297
+ }
298
+ return t20;
299
+ }
300
+ function _temp(snapshot) {
301
+ return snapshot.table?.capabilities.find === true;
302
+ }
303
+ //# sourceMappingURL=find-bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["use","useLayoutEffect","useRef","useState","useTransition","LocaleContext","useGridSelector","useGridStore","jsx","_jsx","jsxs","_jsxs","FindBar","t0","$","_c","onClose","scrollerRef","store","messages","finds","_temp","text","setText","caseSensitive","setCaseSensitive","status","setStatus","pending","startFind","inputRef","t1","t2","Symbol","for","current","focus","select","t3","preventScroll","close","t4","direction","session","displayed","getSnapshot","from","active","row","column","name","found","find","noMatches","dispatch","command","t5","error","failed","Error","message","String","event","nativeEvent","isComposing","keyCode","key","preventDefault","target","shiftKey","onKeyDown","t6","event_0","value","t7","type","className","placeholder","onChange","t8","event_1","checked","t9","t10","matchCase","children","t11","t12","t13","t14","findPrevious","disabled","onClick","t15","t16","t17","findNext","t18","role","t19","closeFind","t20","snapshot","table","capabilities"],"sources":["find-bar.tsx"],"sourcesContent":["import { type KeyboardEvent, type RefObject, use, useLayoutEffect, useRef, useState, useTransition } from \"react\";\nimport { LocaleContext } from \"./context.js\";\nimport { useGridSelector, useGridStore } from \"./hooks.js\";\n\n/**\n * The find bar (⌘F or Ctrl+F on the grid): finds the next cell of the view whose text contains what is typed, from\n * the active cell, in the displayed columns (`GridStore.find`, `find` of §8.2), and makes it the active cell. Enter\n * finds the next one, Shift+Enter the one before, and Esc closes the bar and gives the focus back to the grid.\n */\nexport function FindBar({\n onClose,\n scrollerRef,\n}: {\n onClose: () => void;\n scrollerRef: RefObject<HTMLDivElement | null>;\n}) {\n const store = useGridStore();\n const { messages } = use(LocaleContext);\n const finds = useGridSelector((snapshot) => snapshot.table?.capabilities.find === true);\n const [text, setText] = useState(\"\");\n const [caseSensitive, setCaseSensitive] = useState(false);\n const [status, setStatus] = useState(\"\");\n const [pending, startFind] = useTransition();\n const inputRef = useRef<HTMLInputElement>(null);\n\n useLayoutEffect(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n }, []);\n\n const close = () => {\n onClose();\n scrollerRef.current?.focus({ preventScroll: true });\n };\n\n const find = (direction: 1 | -1) => {\n if (text === \"\") return;\n startFind(async () => {\n const { session, displayed } = store.getSnapshot();\n const from = session.active ?? { row: 0, column: displayed[0]?.column.name ?? \"\" };\n try {\n const found = await store.find(text, { from, direction, caseSensitive });\n if (!found) {\n setStatus(messages.noMatches);\n return;\n }\n setStatus(\"\");\n await store.dispatch({ command: \"select\", row: found.row, column: found.column });\n } catch (error) {\n setStatus(messages.failed(error instanceof Error ? error.message : String(error)));\n }\n });\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n // Keys that end an IME's composition are the IME's.\n if (event.nativeEvent.isComposing || event.keyCode === 229) return;\n if (event.key === \"Escape\") {\n event.preventDefault();\n close();\n } else if (event.key === \"Enter\" && event.target === inputRef.current) {\n event.preventDefault();\n find(event.shiftKey ? -1 : 1);\n }\n };\n\n if (!finds) return null;\n return (\n <search className=\"vg-find\" aria-label={messages.find} onKeyDown={onKeyDown}>\n <input\n ref={inputRef}\n type=\"search\"\n className=\"vg-input vg-find__input\"\n aria-label={messages.find}\n placeholder={messages.find}\n value={text}\n onChange={(event) => {\n setText(event.target.value);\n setStatus(\"\");\n }}\n />\n <label className=\"vg-filter__value\">\n <input type=\"checkbox\" checked={caseSensitive} onChange={(event) => setCaseSensitive(event.target.checked)} />\n <span>{messages.matchCase}</span>\n </label>\n <button\n type=\"button\"\n className=\"vg-button vg-button--small\"\n aria-label={messages.findPrevious}\n disabled={pending || text === \"\"}\n onClick={() => find(-1)}\n >\n ↑\n </button>\n <button\n type=\"button\"\n className=\"vg-button vg-button--small\"\n aria-label={messages.findNext}\n disabled={pending || text === \"\"}\n onClick={() => find(1)}\n >\n ↓\n </button>\n <span className=\"vg-find__status\" role=\"status\">\n {status}\n </span>\n <button type=\"button\" className=\"vg-button vg-button--small\" aria-label={messages.closeFind} onClick={close}>\n ×\n </button>\n </search>\n );\n}\n"],"mappings":"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","ignoreList":[]}