vastgrid 0.1.1 → 0.2.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 (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 +151 -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 +42 -17
  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 +169 -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 -68
  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 -22
  258. package/dist/components/filter-panel.d.ts.map +0 -1
  259. package/dist/components/filter-panel.js +0 -169
  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 -227
  274. package/dist/controller.d.ts.map +0 -1
  275. package/dist/controller.js +0 -845
  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 -704
  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 -180
  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 -293
  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 -945
  308. package/src/data-grid.tsx +0 -1035
  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,14 @@
1
+ import { type ReactNode } from "react";
2
+ /**
3
+ * A button of the toolbar and its popover, whose content is rendered only while it is open, so that a content loaded
4
+ * with `lazy` is downloaded when it is first opened (§10 of react.md) and starts from the state as it is then. The
5
+ * popover opens under the button, its right edge at the button's, and follows its content's size.
6
+ */
7
+ export declare function ToolbarPopover({ label, title, className, pressed, children, }: {
8
+ label: ReactNode;
9
+ title: string;
10
+ className: string;
11
+ pressed?: boolean;
12
+ children: (close: () => void) => ReactNode;
13
+ }): import("react").JSX.Element;
14
+ //# sourceMappingURL=toolbar-popover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar-popover.d.ts","sourceRoot":"","sources":["../../src/react/toolbar-popover.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAuE,MAAM,OAAO,CAAC;AAG5G;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,KAAK,EACL,SAAS,EACT,OAAO,EACP,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,IAAI,KAAK,SAAS,CAAC;CAC5C,+BAgDA"}
@@ -0,0 +1,143 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { Suspense, use, useEffect, useId, useRef, useState } from "react";
3
+ import { LocaleContext } from "./context.js";
4
+
5
+ /**
6
+ * A button of the toolbar and its popover, whose content is rendered only while it is open, so that a content loaded
7
+ * with `lazy` is downloaded when it is first opened (§10 of react.md) and starts from the state as it is then. The
8
+ * popover opens under the button, its right edge at the button's, and follows its content's size.
9
+ */
10
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
11
+ export function ToolbarPopover(t0) {
12
+ const $ = _c(23);
13
+ const {
14
+ label,
15
+ title,
16
+ className,
17
+ pressed,
18
+ children
19
+ } = t0;
20
+ const {
21
+ messages
22
+ } = use(LocaleContext);
23
+ const [open, setOpen] = useState(false);
24
+ const id = useId();
25
+ const buttonRef = useRef(null);
26
+ const menuRef = useRef(null);
27
+ let t1;
28
+ let t2;
29
+ if ($[0] !== open) {
30
+ t1 = () => {
31
+ const menu = menuRef.current;
32
+ if (!open || !menu) {
33
+ return;
34
+ }
35
+ const place = () => {
36
+ const button = buttonRef.current;
37
+ if (!button) {
38
+ return;
39
+ }
40
+ const rect = button.getBoundingClientRect();
41
+ menu.style.top = `${rect.bottom + 4}px`;
42
+ menu.style.left = `${Math.max(8, rect.right - menu.offsetWidth)}px`;
43
+ };
44
+ place();
45
+ const observer = new ResizeObserver(place);
46
+ observer.observe(menu);
47
+ return () => observer.disconnect();
48
+ };
49
+ t2 = [open];
50
+ $[0] = open;
51
+ $[1] = t1;
52
+ $[2] = t2;
53
+ } else {
54
+ t1 = $[1];
55
+ t2 = $[2];
56
+ }
57
+ useEffect(t1, t2);
58
+ let t3;
59
+ if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
60
+ t3 = event => setOpen(event.newState === "open");
61
+ $[3] = t3;
62
+ } else {
63
+ t3 = $[3];
64
+ }
65
+ const onToggle = t3;
66
+ let t4;
67
+ if ($[4] !== id) {
68
+ t4 = () => document.getElementById(id)?.hidePopover();
69
+ $[4] = id;
70
+ $[5] = t4;
71
+ } else {
72
+ t4 = $[5];
73
+ }
74
+ const close = t4;
75
+ let t5;
76
+ if ($[6] !== id || $[7] !== label || $[8] !== pressed) {
77
+ t5 = /*#__PURE__*/_jsx("button", {
78
+ ref: buttonRef,
79
+ type: "button",
80
+ className: "vg-button",
81
+ popoverTarget: id,
82
+ "aria-pressed": pressed,
83
+ children: label
84
+ });
85
+ $[6] = id;
86
+ $[7] = label;
87
+ $[8] = pressed;
88
+ $[9] = t5;
89
+ } else {
90
+ t5 = $[9];
91
+ }
92
+ const t6 = `vg-menu ${className}`;
93
+ let t7;
94
+ if ($[10] !== children || $[11] !== close || $[12] !== messages || $[13] !== open) {
95
+ t7 = open && /*#__PURE__*/_jsx(Suspense, {
96
+ fallback: /*#__PURE__*/_jsx("p", {
97
+ className: "vg-filter__note",
98
+ children: messages.loading
99
+ }),
100
+ children: children(close)
101
+ });
102
+ $[10] = children;
103
+ $[11] = close;
104
+ $[12] = messages;
105
+ $[13] = open;
106
+ $[14] = t7;
107
+ } else {
108
+ t7 = $[14];
109
+ }
110
+ let t8;
111
+ if ($[15] !== id || $[16] !== t6 || $[17] !== t7 || $[18] !== title) {
112
+ t8 = /*#__PURE__*/_jsx("div", {
113
+ ref: menuRef,
114
+ id: id,
115
+ popover: "auto",
116
+ role: "dialog",
117
+ className: t6,
118
+ "aria-label": title,
119
+ onToggle: onToggle,
120
+ children: t7
121
+ });
122
+ $[15] = id;
123
+ $[16] = t6;
124
+ $[17] = t7;
125
+ $[18] = title;
126
+ $[19] = t8;
127
+ } else {
128
+ t8 = $[19];
129
+ }
130
+ let t9;
131
+ if ($[20] !== t5 || $[21] !== t8) {
132
+ t9 = /*#__PURE__*/_jsxs(_Fragment, {
133
+ children: [t5, t8]
134
+ });
135
+ $[20] = t5;
136
+ $[21] = t8;
137
+ $[22] = t9;
138
+ } else {
139
+ t9 = $[22];
140
+ }
141
+ return t9;
142
+ }
143
+ //# sourceMappingURL=toolbar-popover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Suspense","use","useEffect","useId","useRef","useState","LocaleContext","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","ToolbarPopover","t0","$","_c","label","title","className","pressed","children","messages","open","setOpen","id","buttonRef","menuRef","t1","t2","menu","current","place","button","rect","getBoundingClientRect","style","top","bottom","left","Math","max","right","offsetWidth","observer","ResizeObserver","observe","disconnect","t3","Symbol","for","event","newState","onToggle","t4","document","getElementById","hidePopover","close","t5","type","t6","t7","fallback","loading","t8","popover","role","t9"],"sources":["toolbar-popover.tsx"],"sourcesContent":["import { type ReactNode, Suspense, type ToggleEvent, use, useEffect, useId, useRef, useState } from \"react\";\nimport { LocaleContext } from \"./context.js\";\n\n/**\n * A button of the toolbar and its popover, whose content is rendered only while it is open, so that a content loaded\n * with `lazy` is downloaded when it is first opened (§10 of react.md) and starts from the state as it is then. The\n * popover opens under the button, its right edge at the button's, and follows its content's size.\n */\nexport function ToolbarPopover({\n label,\n title,\n className,\n pressed,\n children,\n}: {\n label: ReactNode;\n title: string;\n className: string;\n pressed?: boolean;\n children: (close: () => void) => ReactNode;\n}) {\n const { messages } = use(LocaleContext);\n const [open, setOpen] = useState(false);\n const id = useId();\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const menu = menuRef.current;\n if (!open || !menu) return;\n const place = () => {\n const button = buttonRef.current;\n if (!button) return;\n const rect = button.getBoundingClientRect();\n menu.style.top = `${rect.bottom + 4}px`;\n menu.style.left = `${Math.max(8, rect.right - menu.offsetWidth)}px`;\n };\n place();\n // The content may arrive after the popover opened.\n const observer = new ResizeObserver(place);\n observer.observe(menu);\n return () => observer.disconnect();\n }, [open]);\n\n const onToggle = (event: ToggleEvent<HTMLDivElement>) => setOpen(event.newState === \"open\");\n // By id, not by the ref: the content gets it during render.\n const close = () => document.getElementById(id)?.hidePopover();\n\n return (\n <>\n <button ref={buttonRef} type=\"button\" className=\"vg-button\" popoverTarget={id} aria-pressed={pressed}>\n {label}\n </button>\n <div\n ref={menuRef}\n id={id}\n popover=\"auto\"\n role=\"dialog\"\n className={`vg-menu ${className}`}\n aria-label={title}\n onToggle={onToggle}\n >\n {open && (\n <Suspense fallback={<p className=\"vg-filter__note\">{messages.loading}</p>}>{children(close)}</Suspense>\n )}\n </div>\n </>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * The toolbar: a search box when the engine searches (§3.5), the conditions menu when it filters (§6.2.1), the
3
+ * columns menu (§6.3), the group menu when it groups rows (§4.5), the formula
4
+ * menu when it derives columns (§4.11), a
5
+ * button that saves the written cells when the engine saves (§7.5), and one that reads the file again when it
6
+ * changed on disk while cells were written (§7.6). The
7
+ * search's text is React state, which updates as the person types; `search.set` follows through
8
+ * `useDeferredValue` once typing pauses.
9
+ */
10
+ export declare function Toolbar({ announce }: {
11
+ announce: (text: string) => void;
12
+ }): import("react").JSX.Element | null;
13
+ //# sourceMappingURL=toolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar.d.ts","sourceRoot":"","sources":["../../src/react/toolbar.tsx"],"names":[],"mappings":"AAwBA;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,sCAsHzE"}
@@ -0,0 +1,344 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { lazy, use, useDeferredValue, useEffect, useState, useTransition } from "react";
3
+ import { partsOf } from "vastgrid-spec";
4
+ import { isApple } from "../canvas/keys.js";
5
+ import { offers } from "../core/measures.js";
6
+ import { LocaleContext, SaveContext } from "./context.js";
7
+ import { ExportMenu } from "./export-menu.js";
8
+ import { useGridSelector, useGridStore } from "./hooks.js";
9
+ import { ToolbarPopover } from "./toolbar-popover.js";
10
+
11
+ // The menus load when they first open (§10 of react.md).
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ const ConditionsPanel = /*#__PURE__*/lazy(() => import("./conditions-menu.js"));
14
+ const ColumnsPanel = /*#__PURE__*/lazy(() => import("./columns-menu.js"));
15
+ const GroupPanel = /*#__PURE__*/lazy(() => import("./group-menu.js"));
16
+ const FormulaPanel = /*#__PURE__*/lazy(() => import("./formula-menu.js"));
17
+
18
+ /** How long typing must pause before the search is set. */
19
+ const SEARCH_DELAY = 200;
20
+
21
+ /** The text of the search part of a plan's `where` (§6.2.1). */
22
+ function searchOf(where) {
23
+ for (const part of partsOf(where)) if ("search" in part) return part.search;
24
+ return "";
25
+ }
26
+
27
+ /**
28
+ * The toolbar: a search box when the engine searches (§3.5), the conditions menu when it filters (§6.2.1), the
29
+ * columns menu (§6.3), the group menu when it groups rows (§4.5), the formula
30
+ * menu when it derives columns (§4.11), a
31
+ * button that saves the written cells when the engine saves (§7.5), and one that reads the file again when it
32
+ * changed on disk while cells were written (§7.6). The
33
+ * search's text is React state, which updates as the person types; `search.set` follows through
34
+ * `useDeferredValue` once typing pauses.
35
+ */
36
+ export function Toolbar(t0) {
37
+ const $ = _c(56);
38
+ const {
39
+ announce
40
+ } = t0;
41
+ const store = useGridStore();
42
+ const {
43
+ messages
44
+ } = use(LocaleContext);
45
+ const fileChanged = useGridSelector(_temp);
46
+ const [reloading, startReload] = useTransition();
47
+ let t1;
48
+ if ($[0] !== announce || $[1] !== messages || $[2] !== store) {
49
+ t1 = () => startReload(async () => {
50
+ ;
51
+ try {
52
+ await store.reload();
53
+ } catch (t2) {
54
+ const error = t2;
55
+ announce(messages.failed(error instanceof Error ? error.message : String(error)));
56
+ }
57
+ });
58
+ $[0] = announce;
59
+ $[1] = messages;
60
+ $[2] = store;
61
+ $[3] = t1;
62
+ } else {
63
+ t1 = $[3];
64
+ }
65
+ const reload = t1;
66
+ const searches = useGridSelector(_temp2);
67
+ const saving = use(SaveContext);
68
+ const saves = useGridSelector(_temp3);
69
+ const unsaved = useGridSelector(_temp4);
70
+ const current = useGridSelector(_temp5);
71
+ const [text, setText] = useState(current);
72
+ const [shown, setShown] = useState(current);
73
+ if (shown !== current) {
74
+ setShown(current);
75
+ setText(current);
76
+ }
77
+ const deferred = useDeferredValue(text);
78
+ let t2;
79
+ let t3;
80
+ if ($[4] !== current || $[5] !== deferred || $[6] !== store) {
81
+ t2 = () => {
82
+ if (deferred === current) {
83
+ return;
84
+ }
85
+ const timer = setTimeout(() => {
86
+ store.dispatch({
87
+ command: "search.set",
88
+ text: deferred
89
+ });
90
+ }, SEARCH_DELAY);
91
+ return () => clearTimeout(timer);
92
+ };
93
+ t3 = [store, deferred, current];
94
+ $[4] = current;
95
+ $[5] = deferred;
96
+ $[6] = store;
97
+ $[7] = t2;
98
+ $[8] = t3;
99
+ } else {
100
+ t2 = $[7];
101
+ t3 = $[8];
102
+ }
103
+ useEffect(t2, t3);
104
+ const showsSave = saves && saving !== null;
105
+ const exports = useGridSelector(_temp6);
106
+ const derives = useGridSelector(_temp7);
107
+ const groups = useGridSelector(_temp8);
108
+ const grouped = useGridSelector(_temp9);
109
+ const filters = useGridSelector(_temp0);
110
+ const conditions = useGridSelector(_temp10);
111
+ const opened = useGridSelector(_temp11);
112
+ const detail = useGridSelector(_temp12);
113
+ if (!searches && !showsSave && !fileChanged && !exports && !derives && !groups && !opened) {
114
+ return null;
115
+ }
116
+ let t4;
117
+ if ($[9] !== messages || $[10] !== searches || $[11] !== text) {
118
+ t4 = searches && /*#__PURE__*/_jsx("input", {
119
+ type: "search",
120
+ className: "vg-input vg-toolbar__search",
121
+ "aria-label": messages.search,
122
+ placeholder: messages.search,
123
+ value: text,
124
+ onChange: event => setText(event.target.value)
125
+ });
126
+ $[9] = messages;
127
+ $[10] = searches;
128
+ $[11] = text;
129
+ $[12] = t4;
130
+ } else {
131
+ t4 = $[12];
132
+ }
133
+ let t5;
134
+ if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
135
+ t5 = /*#__PURE__*/_jsx("span", {
136
+ className: "vg-toolbar__spacer"
137
+ });
138
+ $[13] = t5;
139
+ } else {
140
+ t5 = $[13];
141
+ }
142
+ let t6;
143
+ if ($[14] !== fileChanged || $[15] !== messages || $[16] !== reload || $[17] !== reloading || $[18] !== unsaved) {
144
+ t6 = fileChanged && /*#__PURE__*/_jsx("button", {
145
+ type: "button",
146
+ className: "vg-button",
147
+ disabled: reloading,
148
+ onClick: reload,
149
+ children: unsaved > 0 ? messages.discardAndReload : messages.reload
150
+ });
151
+ $[14] = fileChanged;
152
+ $[15] = messages;
153
+ $[16] = reload;
154
+ $[17] = reloading;
155
+ $[18] = unsaved;
156
+ $[19] = t6;
157
+ } else {
158
+ t6 = $[19];
159
+ }
160
+ let t7;
161
+ if ($[20] !== detail || $[21] !== messages || $[22] !== opened || $[23] !== store) {
162
+ t7 = opened && /*#__PURE__*/_jsx("button", {
163
+ type: "button",
164
+ className: "vg-button",
165
+ "aria-pressed": detail,
166
+ onClick: () => void store.dispatch({
167
+ command: detail ? "detail.close" : "detail.open"
168
+ }),
169
+ children: messages.details
170
+ });
171
+ $[20] = detail;
172
+ $[21] = messages;
173
+ $[22] = opened;
174
+ $[23] = store;
175
+ $[24] = t7;
176
+ } else {
177
+ t7 = $[24];
178
+ }
179
+ let t8;
180
+ if ($[25] !== conditions || $[26] !== filters || $[27] !== messages) {
181
+ t8 = filters && /*#__PURE__*/_jsx(ToolbarPopover, {
182
+ label: conditions > 0 ? messages.conditionsCount(String(conditions)) : messages.conditions,
183
+ title: messages.conditionsTitle,
184
+ className: "vg-conditions",
185
+ pressed: conditions > 0,
186
+ children: _temp13
187
+ });
188
+ $[25] = conditions;
189
+ $[26] = filters;
190
+ $[27] = messages;
191
+ $[28] = t8;
192
+ } else {
193
+ t8 = $[28];
194
+ }
195
+ let t9;
196
+ if ($[29] !== messages || $[30] !== opened) {
197
+ t9 = opened && /*#__PURE__*/_jsx(ToolbarPopover, {
198
+ label: messages.columns,
199
+ title: messages.columns,
200
+ className: "vg-columns",
201
+ children: _temp14
202
+ });
203
+ $[29] = messages;
204
+ $[30] = opened;
205
+ $[31] = t9;
206
+ } else {
207
+ t9 = $[31];
208
+ }
209
+ let t10;
210
+ if ($[32] !== grouped || $[33] !== groups || $[34] !== messages) {
211
+ t10 = groups && /*#__PURE__*/_jsx(ToolbarPopover, {
212
+ label: messages.groups,
213
+ title: messages.groups,
214
+ className: "vg-groups",
215
+ pressed: grouped,
216
+ children: _temp15
217
+ });
218
+ $[32] = grouped;
219
+ $[33] = groups;
220
+ $[34] = messages;
221
+ $[35] = t10;
222
+ } else {
223
+ t10 = $[35];
224
+ }
225
+ let t11;
226
+ if ($[36] !== derives || $[37] !== messages) {
227
+ t11 = derives && /*#__PURE__*/_jsx(ToolbarPopover, {
228
+ label: messages.formulas,
229
+ title: messages.formulas,
230
+ className: "vg-formulas",
231
+ children: _temp16
232
+ });
233
+ $[36] = derives;
234
+ $[37] = messages;
235
+ $[38] = t11;
236
+ } else {
237
+ t11 = $[38];
238
+ }
239
+ let t12;
240
+ if ($[39] !== announce) {
241
+ t12 = /*#__PURE__*/_jsx(ExportMenu, {
242
+ announce: announce
243
+ });
244
+ $[39] = announce;
245
+ $[40] = t12;
246
+ } else {
247
+ t12 = $[40];
248
+ }
249
+ let t13;
250
+ if ($[41] !== messages || $[42] !== saving || $[43] !== showsSave || $[44] !== unsaved) {
251
+ t13 = showsSave && /*#__PURE__*/_jsx("button", {
252
+ type: "button",
253
+ className: "vg-button",
254
+ "aria-keyshortcuts": isApple() ? "Meta+S" : "Control+S",
255
+ disabled: unsaved === 0 || saving.pending,
256
+ onClick: saving.save,
257
+ children: messages.save
258
+ });
259
+ $[41] = messages;
260
+ $[42] = saving;
261
+ $[43] = showsSave;
262
+ $[44] = unsaved;
263
+ $[45] = t13;
264
+ } else {
265
+ t13 = $[45];
266
+ }
267
+ let t14;
268
+ if ($[46] !== t10 || $[47] !== t11 || $[48] !== t12 || $[49] !== t13 || $[50] !== t4 || $[51] !== t6 || $[52] !== t7 || $[53] !== t8 || $[54] !== t9) {
269
+ t14 = /*#__PURE__*/_jsxs("div", {
270
+ className: "vg-toolbar",
271
+ children: [t4, t5, t6, t7, t8, t9, t10, t11, t12, t13]
272
+ });
273
+ $[46] = t10;
274
+ $[47] = t11;
275
+ $[48] = t12;
276
+ $[49] = t13;
277
+ $[50] = t4;
278
+ $[51] = t6;
279
+ $[52] = t7;
280
+ $[53] = t8;
281
+ $[54] = t9;
282
+ $[55] = t14;
283
+ } else {
284
+ t14 = $[55];
285
+ }
286
+ return t14;
287
+ }
288
+ function _temp16() {
289
+ return /*#__PURE__*/_jsx(FormulaPanel, {});
290
+ }
291
+ function _temp15() {
292
+ return /*#__PURE__*/_jsx(GroupPanel, {});
293
+ }
294
+ function _temp14() {
295
+ return /*#__PURE__*/_jsx(ColumnsPanel, {});
296
+ }
297
+ function _temp13(close) {
298
+ return /*#__PURE__*/_jsx(ConditionsPanel, {
299
+ close: close
300
+ });
301
+ }
302
+ function _temp12(snapshot_11) {
303
+ return snapshot_11.session.detail?.open === true;
304
+ }
305
+ function _temp11(snapshot_10) {
306
+ return snapshot_10.view !== null;
307
+ }
308
+ function _temp10(snapshot_9) {
309
+ return partsOf(snapshot_9.document.plan?.where).filter(_temp1).length;
310
+ }
311
+ function _temp1(part) {
312
+ return !("search" in part);
313
+ }
314
+ function _temp0(snapshot_8) {
315
+ return snapshot_8.table !== null && snapshot_8.table.capabilities.plan?.where !== false;
316
+ }
317
+ function _temp9(snapshot_7) {
318
+ return snapshot_7.document.plan?.aggregate !== undefined;
319
+ }
320
+ function _temp8(snapshot_6) {
321
+ return snapshot_6.table !== null && offers(snapshot_6.table.capabilities, "count");
322
+ }
323
+ function _temp7(snapshot_5) {
324
+ return snapshot_5.table !== null && snapshot_5.table.capabilities.plan?.derive !== false;
325
+ }
326
+ function _temp6(snapshot_4) {
327
+ return (snapshot_4.table?.capabilities.export?.formats.length ?? 0) > 0;
328
+ }
329
+ function _temp5(snapshot_3) {
330
+ return searchOf(snapshot_3.document.plan?.where);
331
+ }
332
+ function _temp4(snapshot_2) {
333
+ return snapshot_2.table?.edits.cells ?? 0;
334
+ }
335
+ function _temp3(snapshot_1) {
336
+ return snapshot_1.table?.capabilities.save === true;
337
+ }
338
+ function _temp2(snapshot_0) {
339
+ return snapshot_0.table !== null && snapshot_0.table.capabilities.plan?.search !== false;
340
+ }
341
+ function _temp(snapshot) {
342
+ return snapshot.table?.fileChanged === true;
343
+ }
344
+ //# sourceMappingURL=toolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["lazy","use","useDeferredValue","useEffect","useState","useTransition","partsOf","isApple","offers","LocaleContext","SaveContext","ExportMenu","useGridSelector","useGridStore","ToolbarPopover","jsx","_jsx","jsxs","_jsxs","ConditionsPanel","ColumnsPanel","GroupPanel","FormulaPanel","SEARCH_DELAY","searchOf","where","part","search","Toolbar","t0","$","_c","announce","store","messages","fileChanged","_temp","reloading","startReload","t1","reload","t2","error","failed","Error","message","String","searches","_temp2","saving","saves","_temp3","unsaved","_temp4","current","_temp5","text","setText","shown","setShown","deferred","t3","timer","setTimeout","dispatch","command","clearTimeout","showsSave","exports","_temp6","derives","_temp7","groups","_temp8","grouped","_temp9","filters","_temp0","conditions","_temp10","opened","_temp11","detail","_temp12","t4","type","className","placeholder","onChange","event","target","value","t5","Symbol","for","t6","children","discardAndReload","t7","onClick","details","t8","label","conditionsCount","title","conditionsTitle","pressed","_temp13","t9","columns","_temp14","t10","_temp15","t11","formulas","_temp16","t12","t13","disabled","pending","save","t14","close","snapshot_11","snapshot","session","open","snapshot_10","view","snapshot_9","document","plan","filter","_temp1","length","snapshot_8","table","capabilities","snapshot_7","aggregate","undefined","snapshot_6","snapshot_5","derive","snapshot_4","export","formats","snapshot_3","snapshot_2","edits","cells","snapshot_1","snapshot_0"],"sources":["toolbar.tsx"],"sourcesContent":["import { lazy, use, useDeferredValue, useEffect, useState, useTransition } from \"react\";\nimport { type Expr, partsOf } from \"vastgrid-spec\";\nimport { isApple } from \"../canvas/keys.js\";\nimport { offers } from \"../core/measures.js\";\nimport { LocaleContext, SaveContext } from \"./context.js\";\nimport { ExportMenu } from \"./export-menu.js\";\nimport { useGridSelector, useGridStore } from \"./hooks.js\";\nimport { ToolbarPopover } from \"./toolbar-popover.js\";\n\n// The menus load when they first open (§10 of react.md).\nconst ConditionsPanel = lazy(() => import(\"./conditions-menu.js\"));\nconst ColumnsPanel = lazy(() => import(\"./columns-menu.js\"));\nconst GroupPanel = lazy(() => import(\"./group-menu.js\"));\nconst FormulaPanel = lazy(() => import(\"./formula-menu.js\"));\n\n/** How long typing must pause before the search is set. */\nconst SEARCH_DELAY = 200;\n\n/** The text of the search part of a plan's `where` (§6.2.1). */\nfunction searchOf(where: Expr | undefined): string {\n for (const part of partsOf(where)) if (\"search\" in part) return part.search;\n return \"\";\n}\n\n/**\n * The toolbar: a search box when the engine searches (§3.5), the conditions menu when it filters (§6.2.1), the\n * columns menu (§6.3), the group menu when it groups rows (§4.5), the formula\n * menu when it derives columns (§4.11), a\n * button that saves the written cells when the engine saves (§7.5), and one that reads the file again when it\n * changed on disk while cells were written (§7.6). The\n * search's text is React state, which updates as the person types; `search.set` follows through\n * `useDeferredValue` once typing pauses.\n */\nexport function Toolbar({ announce }: { announce: (text: string) => void }) {\n const store = useGridStore();\n const { messages } = use(LocaleContext);\n const fileChanged = useGridSelector((snapshot) => snapshot.table?.fileChanged === true);\n const [reloading, startReload] = useTransition();\n const reload = () =>\n startReload(async () => {\n try {\n await store.reload();\n } catch (error) {\n announce(messages.failed(error instanceof Error ? error.message : String(error)));\n }\n });\n const searches = useGridSelector(\n (snapshot) => snapshot.table !== null && snapshot.table.capabilities.plan?.search !== false,\n );\n const saving = use(SaveContext);\n const saves = useGridSelector((snapshot) => snapshot.table?.capabilities.save === true);\n const unsaved = useGridSelector((snapshot) => snapshot.table?.edits.cells ?? 0);\n const current = useGridSelector((snapshot) => searchOf(snapshot.document.plan?.where));\n const [text, setText] = useState(current);\n const [shown, setShown] = useState(current);\n // A search set elsewhere (an agent, a saved view) replaces the text.\n if (shown !== current) {\n setShown(current);\n setText(current);\n }\n const deferred = useDeferredValue(text);\n useEffect(() => {\n if (deferred === current) return;\n const timer = setTimeout(() => {\n void store.dispatch({ command: \"search.set\", text: deferred });\n }, SEARCH_DELAY);\n return () => clearTimeout(timer);\n }, [store, deferred, current]);\n const showsSave = saves && saving !== null;\n const exports = useGridSelector((snapshot) => (snapshot.table?.capabilities.export?.formats.length ?? 0) > 0);\n const derives = useGridSelector(\n (snapshot) => snapshot.table !== null && snapshot.table.capabilities.plan?.derive !== false,\n );\n const groups = useGridSelector((snapshot) => snapshot.table !== null && offers(snapshot.table.capabilities, \"count\"));\n const grouped = useGridSelector((snapshot) => snapshot.document.plan?.aggregate !== undefined);\n const filters = useGridSelector(\n (snapshot) => snapshot.table !== null && snapshot.table.capabilities.plan?.where !== false,\n );\n const conditions = useGridSelector(\n (snapshot) => partsOf(snapshot.document.plan?.where).filter((part) => !(\"search\" in part)).length,\n );\n const opened = useGridSelector((snapshot) => snapshot.view !== null);\n const detail = useGridSelector((snapshot) => snapshot.session.detail?.open === true);\n if (!searches && !showsSave && !fileChanged && !exports && !derives && !groups && !opened) return null;\n return (\n <div className=\"vg-toolbar\">\n {searches && (\n <input\n type=\"search\"\n className=\"vg-input vg-toolbar__search\"\n aria-label={messages.search}\n placeholder={messages.search}\n value={text}\n onChange={(event) => setText(event.target.value)}\n />\n )}\n <span className=\"vg-toolbar__spacer\" />\n {fileChanged && (\n <button type=\"button\" className=\"vg-button\" disabled={reloading} onClick={reload}>\n {unsaved > 0 ? messages.discardAndReload : messages.reload}\n </button>\n )}\n {opened && (\n <button\n type=\"button\"\n className=\"vg-button\"\n aria-pressed={detail}\n onClick={() => void store.dispatch({ command: detail ? \"detail.close\" : \"detail.open\" })}\n >\n {messages.details}\n </button>\n )}\n {filters && (\n <ToolbarPopover\n label={conditions > 0 ? messages.conditionsCount(String(conditions)) : messages.conditions}\n title={messages.conditionsTitle}\n className=\"vg-conditions\"\n pressed={conditions > 0}\n >\n {(close) => <ConditionsPanel close={close} />}\n </ToolbarPopover>\n )}\n {opened && (\n <ToolbarPopover label={messages.columns} title={messages.columns} className=\"vg-columns\">\n {() => <ColumnsPanel />}\n </ToolbarPopover>\n )}\n {groups && (\n <ToolbarPopover label={messages.groups} title={messages.groups} className=\"vg-groups\" pressed={grouped}>\n {() => <GroupPanel />}\n </ToolbarPopover>\n )}\n {derives && (\n <ToolbarPopover label={messages.formulas} title={messages.formulas} className=\"vg-formulas\">\n {() => <FormulaPanel />}\n </ToolbarPopover>\n )}\n <ExportMenu announce={announce} />\n {showsSave && (\n <button\n type=\"button\"\n className=\"vg-button\"\n aria-keyshortcuts={isApple() ? \"Meta+S\" : \"Control+S\"}\n disabled={unsaved === 0 || saving.pending}\n onClick={saving.save}\n >\n {messages.save}\n </button>\n )}\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * What a Server Component or a server render calls (§7 of react.md). Imports no React.
3
+ */
4
+ import { type GridDocument } from "vastgrid-spec";
5
+ import { type Transport } from "./core/client.js";
6
+ import type { InitialView, OpenOptions } from "./core/types.js";
7
+ export interface ReadInitialOptions {
8
+ /** The `ref` of the table to open (§8.2). */
9
+ table: string;
10
+ open?: OpenOptions;
11
+ /** The document the grid starts with; its plan is the view read. */
12
+ document?: GridDocument;
13
+ /** Rows to read from the start of the view; 100 by default. */
14
+ rows?: number;
15
+ signal?: AbortSignal;
16
+ }
17
+ /**
18
+ * Reads the table, the view of a document and its first rows, for `initial` (§7 of react.md): give the result,
19
+ * or the promise of it, to `DataGrid`. Opens the table and closes it again.
20
+ */
21
+ export declare function readInitialView(transport: Transport, options: ReadInitialOptions): Promise<InitialView>;
22
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAIL,KAAK,YAAY,EAGlB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAyB,MAAM,iBAAiB,CAAC;AAEvF,MAAM,WAAW,kBAAkB;IACjC,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CA4B7G"}
package/dist/server.js ADDED
@@ -0,0 +1,45 @@
1
+ /**
2
+ * What a Server Component or a server render calls (§7 of react.md). Imports no React.
3
+ */
4
+ import { checkPlan, displayedColumns, emptyDocument, planOptions, repairDocument } from "vastgrid-spec";
5
+ import { GridClient } from "./core/client.js";
6
+ /**
7
+ * Reads the table, the view of a document and its first rows, for `initial` (§7 of react.md): give the result,
8
+ * or the promise of it, to `DataGrid`. Opens the table and closes it again.
9
+ */
10
+ export async function readInitialView(transport, options) {
11
+ const client = new GridClient(transport);
12
+ const info = await client.request("open", {
13
+ ref: options.table,
14
+ ...(options.open ? {
15
+ read: options.open
16
+ } : {})
17
+ }, options.signal);
18
+ try {
19
+ const document = repairDocument(options.document ?? emptyDocument(), info.columns, planOptions(info.capabilities)).document;
20
+ const plan = document.plan ?? {};
21
+ const view = checkPlan(plan, info.columns, planOptions(info.capabilities));
22
+ const columns = displayedColumns(document, view.columns).map(item => item.column.name);
23
+ if (document.rowKey !== undefined && !columns.includes(document.rowKey)) columns.push(document.rowKey);
24
+ const wanted = options.rows ?? 100;
25
+ const end = info.rowCount === null ? wanted : Math.min(wanted, info.rowCount);
26
+ const rows = await client.request("rows", {
27
+ table: info.table,
28
+ revision: info.revision,
29
+ plan,
30
+ start: 0,
31
+ end: Math.max(end, 1),
32
+ columns
33
+ }, options.signal);
34
+ return {
35
+ table: info,
36
+ plan,
37
+ rows
38
+ };
39
+ } finally {
40
+ await client.request("close", {
41
+ table: info.table
42
+ }).catch(() => {});
43
+ }
44
+ }
45
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["checkPlan","displayedColumns","emptyDocument","planOptions","repairDocument","GridClient","readInitialView","transport","options","client","info","request","ref","table","open","read","signal","document","columns","capabilities","plan","view","map","item","column","name","rowKey","undefined","includes","push","wanted","rows","end","rowCount","Math","min","revision","start","max","catch"],"sources":["server.ts"],"sourcesContent":["/**\n * What a Server Component or a server render calls (§7 of react.md). Imports no React.\n */\nimport {\n checkPlan,\n displayedColumns,\n emptyDocument,\n type GridDocument,\n planOptions,\n repairDocument,\n} from \"vastgrid-spec\";\nimport { GridClient, type Transport } from \"./core/client.js\";\nimport type { InitialView, OpenOptions, RowsResult, TableInfo } from \"./core/types.js\";\n\nexport interface ReadInitialOptions {\n /** The `ref` of the table to open (§8.2). */\n table: string;\n open?: OpenOptions;\n /** The document the grid starts with; its plan is the view read. */\n document?: GridDocument;\n /** Rows to read from the start of the view; 100 by default. */\n rows?: number;\n signal?: AbortSignal;\n}\n\n/**\n * Reads the table, the view of a document and its first rows, for `initial` (§7 of react.md): give the result,\n * or the promise of it, to `DataGrid`. Opens the table and closes it again.\n */\nexport async function readInitialView(transport: Transport, options: ReadInitialOptions): Promise<InitialView> {\n const client = new GridClient(transport);\n const info = await client.request<TableInfo>(\n \"open\",\n { ref: options.table, ...(options.open ? { read: options.open } : {}) },\n options.signal,\n );\n try {\n const document = repairDocument(\n options.document ?? emptyDocument(),\n info.columns,\n planOptions(info.capabilities),\n ).document;\n const plan = document.plan ?? {};\n const view = checkPlan(plan, info.columns, planOptions(info.capabilities));\n const columns = displayedColumns(document, view.columns).map((item) => item.column.name);\n if (document.rowKey !== undefined && !columns.includes(document.rowKey)) columns.push(document.rowKey);\n const wanted = options.rows ?? 100;\n const end = info.rowCount === null ? wanted : Math.min(wanted, info.rowCount);\n const rows = await client.request<RowsResult>(\n \"rows\",\n { table: info.table, revision: info.revision, plan, start: 0, end: Math.max(end, 1), columns },\n options.signal,\n );\n return { table: info, plan, rows };\n } finally {\n await client.request(\"close\", { table: info.table }).catch(() => {});\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA,SACEA,SAAS,EACTC,gBAAgB,EAChBC,aAAa,EAEbC,WAAW,EACXC,cAAc,QACT,eAAe;AACtB,SAASC,UAAU,QAAwB,kBAAkB;AAc7D;AACA;AACA;AACA;AACA,OAAO,eAAeC,eAAeA,CAACC,SAAoB,EAAEC,OAA2B,EAAwB;EAC7G,MAAMC,MAAM,GAAG,IAAIJ,UAAU,CAACE,SAAS,CAAC;EACxC,MAAMG,IAAI,GAAG,MAAMD,MAAM,CAACE,OAAO,CAC/B,MAAM,EACN;IAAEC,GAAG,EAAEJ,OAAO,CAACK,KAAK;IAAE,IAAIL,OAAO,CAACM,IAAI,GAAG;MAAEC,IAAI,EAAEP,OAAO,CAACM;IAAK,CAAC,GAAG,CAAC,CAAC;EAAE,CAAC,EACvEN,OAAO,CAACQ,MACV,CAAC;EACD,IAAI;IACF,MAAMC,QAAQ,GAAGb,cAAc,CAC7BI,OAAO,CAACS,QAAQ,IAAIf,aAAa,CAAC,CAAC,EACnCQ,IAAI,CAACQ,OAAO,EACZf,WAAW,CAACO,IAAI,CAACS,YAAY,CAC/B,CAAC,CAACF,QAAQ;IACV,MAAMG,IAAI,GAAGH,QAAQ,CAACG,IAAI,IAAI,CAAC,CAAC;IAChC,MAAMC,IAAI,GAAGrB,SAAS,CAACoB,IAAI,EAAEV,IAAI,CAACQ,OAAO,EAAEf,WAAW,CAACO,IAAI,CAACS,YAAY,CAAC,CAAC;IAC1E,MAAMD,OAAO,GAAGjB,gBAAgB,CAACgB,QAAQ,EAAEI,IAAI,CAACH,OAAO,CAAC,CAACI,GAAG,CAAEC,IAAI,IAAKA,IAAI,CAACC,MAAM,CAACC,IAAI,CAAC;IACxF,IAAIR,QAAQ,CAACS,MAAM,KAAKC,SAAS,IAAI,CAACT,OAAO,CAACU,QAAQ,CAACX,QAAQ,CAACS,MAAM,CAAC,EAAER,OAAO,CAACW,IAAI,CAACZ,QAAQ,CAACS,MAAM,CAAC;IACtG,MAAMI,MAAM,GAAGtB,OAAO,CAACuB,IAAI,IAAI,GAAG;IAClC,MAAMC,GAAG,GAAGtB,IAAI,CAACuB,QAAQ,KAAK,IAAI,GAAGH,MAAM,GAAGI,IAAI,CAACC,GAAG,CAACL,MAAM,EAAEpB,IAAI,CAACuB,QAAQ,CAAC;IAC7E,MAAMF,IAAI,GAAG,MAAMtB,MAAM,CAACE,OAAO,CAC/B,MAAM,EACN;MAAEE,KAAK,EAAEH,IAAI,CAACG,KAAK;MAAEuB,QAAQ,EAAE1B,IAAI,CAAC0B,QAAQ;MAAEhB,IAAI;MAAEiB,KAAK,EAAE,CAAC;MAAEL,GAAG,EAAEE,IAAI,CAACI,GAAG,CAACN,GAAG,EAAE,CAAC,CAAC;MAAEd;IAAQ,CAAC,EAC9FV,OAAO,CAACQ,MACV,CAAC;IACD,OAAO;MAAEH,KAAK,EAAEH,IAAI;MAAEU,IAAI;MAAEW;IAAK,CAAC;EACpC,CAAC,SAAS;IACR,MAAMtB,MAAM,CAACE,OAAO,CAAC,OAAO,EAAE;MAAEE,KAAK,EAAEH,IAAI,CAACG;IAAM,CAAC,CAAC,CAAC0B,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EACtE;AACF","ignoreList":[]}