@svgrid/grid 1.0.2 → 1.1.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 (216) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +137 -39
  3. package/dist/GridFooter.svelte +164 -0
  4. package/dist/GridFooter.svelte.d.ts +29 -0
  5. package/dist/GridMenus.svelte +648 -0
  6. package/dist/GridMenus.svelte.d.ts +31 -0
  7. package/dist/SvGrid.controller.svelte.d.ts +472 -0
  8. package/dist/SvGrid.controller.svelte.js +1917 -0
  9. package/dist/SvGrid.css +2012 -0
  10. package/dist/SvGrid.helpers.d.ts +35 -0
  11. package/dist/SvGrid.helpers.js +160 -0
  12. package/dist/SvGrid.helpers.test.d.ts +1 -0
  13. package/dist/SvGrid.helpers.test.js +298 -0
  14. package/dist/SvGrid.svelte +2346 -8742
  15. package/dist/SvGrid.svelte.d.ts +4 -357
  16. package/dist/SvGrid.types.d.ts +523 -0
  17. package/dist/SvGrid.types.js +1 -0
  18. package/dist/SvGridChart.svelte +1060 -23
  19. package/dist/SvGridChart.svelte.d.ts +17 -0
  20. package/dist/aligned-grids.d.ts +6 -0
  21. package/dist/aligned-grids.js +84 -0
  22. package/dist/aligned-grids.test.d.ts +1 -0
  23. package/dist/aligned-grids.test.js +75 -0
  24. package/dist/build-api.coverage.test.d.ts +20 -0
  25. package/dist/build-api.coverage.test.js +505 -0
  26. package/dist/build-api.d.ts +5 -0
  27. package/dist/build-api.js +557 -0
  28. package/dist/cell-render.d.ts +15 -0
  29. package/dist/cell-render.js +246 -0
  30. package/dist/cell-render.test.d.ts +1 -0
  31. package/dist/cell-render.test.js +338 -0
  32. package/dist/cell-values.d.ts +28 -0
  33. package/dist/cell-values.js +89 -0
  34. package/dist/chart-export.test.d.ts +1 -0
  35. package/dist/chart-export.test.js +302 -0
  36. package/dist/chart.coverage.test.d.ts +1 -0
  37. package/dist/chart.coverage.test.js +748 -0
  38. package/dist/chart.d.ts +370 -3
  39. package/dist/chart.js +1135 -42
  40. package/dist/clipboard.d.ts +15 -0
  41. package/dist/clipboard.js +420 -0
  42. package/dist/clipboard.test.d.ts +1 -0
  43. package/dist/clipboard.test.js +700 -0
  44. package/dist/collaboration.coverage.test.d.ts +1 -0
  45. package/dist/collaboration.coverage.test.js +200 -0
  46. package/dist/column-groups.d.ts +19 -0
  47. package/dist/column-groups.js +62 -0
  48. package/dist/column-groups.test.d.ts +1 -0
  49. package/dist/column-groups.test.js +56 -0
  50. package/dist/column-types.d.ts +10 -0
  51. package/dist/column-types.js +63 -0
  52. package/dist/column-types.test.d.ts +1 -0
  53. package/dist/column-types.test.js +62 -0
  54. package/dist/columns.d.ts +30 -0
  55. package/dist/columns.js +277 -0
  56. package/dist/columns.test.d.ts +1 -0
  57. package/dist/columns.test.js +625 -0
  58. package/dist/core.d.ts +86 -1
  59. package/dist/css.d.ts +3 -0
  60. package/dist/editing.d.ts +31 -0
  61. package/dist/editing.js +529 -0
  62. package/dist/editing.test.d.ts +1 -0
  63. package/dist/editing.test.js +732 -0
  64. package/dist/editors/cell-editors.coverage.test.d.ts +1 -0
  65. package/dist/editors/cell-editors.coverage.test.js +139 -0
  66. package/dist/editors/cell-editors.d.ts +1 -1
  67. package/dist/facet-buckets.d.ts +13 -0
  68. package/dist/facet-buckets.js +54 -0
  69. package/dist/facet-buckets.test.d.ts +1 -0
  70. package/dist/facet-buckets.test.js +296 -0
  71. package/dist/features.d.ts +5 -0
  72. package/dist/features.js +30 -0
  73. package/dist/filter-operators.d.ts +16 -0
  74. package/dist/filter-operators.js +69 -0
  75. package/dist/filter-operators.test.d.ts +1 -0
  76. package/dist/filter-operators.test.js +135 -0
  77. package/dist/hyperformula-adapter.d.ts +82 -0
  78. package/dist/hyperformula-adapter.js +73 -0
  79. package/dist/hyperformula-adapter.test.d.ts +1 -0
  80. package/dist/hyperformula-adapter.test.js +205 -0
  81. package/dist/index.d.ts +9 -3
  82. package/dist/index.js +8 -2
  83. package/dist/keyboard-handlers.coverage.test.d.ts +1 -0
  84. package/dist/keyboard-handlers.coverage.test.js +495 -0
  85. package/dist/keyboard-handlers.d.ts +7 -0
  86. package/dist/keyboard-handlers.js +202 -0
  87. package/dist/menus.d.ts +40 -0
  88. package/dist/menus.js +390 -0
  89. package/dist/menus.test.d.ts +1 -0
  90. package/dist/menus.test.js +560 -0
  91. package/dist/named-views.coverage.test.d.ts +1 -0
  92. package/dist/named-views.coverage.test.js +180 -0
  93. package/dist/named-views.d.ts +27 -0
  94. package/dist/named-views.js +39 -0
  95. package/dist/row-drag.d.ts +49 -0
  96. package/dist/row-drag.js +221 -0
  97. package/dist/row-drag.test.d.ts +1 -0
  98. package/dist/row-drag.test.js +142 -0
  99. package/dist/row-resize.d.ts +43 -0
  100. package/dist/row-resize.js +158 -0
  101. package/dist/row-resize.test.d.ts +1 -0
  102. package/dist/row-resize.test.js +329 -0
  103. package/dist/scroll-sync.d.ts +9 -0
  104. package/dist/scroll-sync.js +89 -0
  105. package/dist/scroll-sync.test.d.ts +1 -0
  106. package/dist/scroll-sync.test.js +290 -0
  107. package/dist/selection.d.ts +32 -0
  108. package/dist/selection.js +427 -0
  109. package/dist/selection.multi-range.test.d.ts +1 -0
  110. package/dist/selection.multi-range.test.js +55 -0
  111. package/dist/selection.test.d.ts +1 -0
  112. package/dist/selection.test.js +647 -0
  113. package/dist/server-data-source.coverage.test.d.ts +1 -0
  114. package/dist/server-data-source.coverage.test.js +154 -0
  115. package/dist/spreadsheet.d.ts +110 -0
  116. package/dist/spreadsheet.js +242 -0
  117. package/dist/spreadsheet.test.d.ts +1 -0
  118. package/dist/spreadsheet.test.js +446 -0
  119. package/dist/summaries.d.ts +12 -0
  120. package/dist/summaries.js +65 -0
  121. package/dist/sv-grid-scrollbar.js +13 -1
  122. package/dist/svgrid-wrapper.types.d.ts +31 -1
  123. package/dist/svgrid.behavior.test.js +20 -0
  124. package/dist/svgrid.comments-autocomplete.test.d.ts +1 -0
  125. package/dist/svgrid.comments-autocomplete.test.js +96 -0
  126. package/dist/svgrid.context-menu.test.d.ts +1 -0
  127. package/dist/svgrid.context-menu.test.js +102 -0
  128. package/dist/svgrid.interaction.test.js +31 -0
  129. package/dist/svgrid.new-features.wrapper.test.js +64 -6
  130. package/dist/svgrid.wrapper.test.js +27 -1
  131. package/dist/test-setup.js +9 -3
  132. package/dist/virtualization/column-virtualizer.d.ts +2 -0
  133. package/dist/virtualization/scroll-scaling.d.ts +45 -0
  134. package/dist/virtualization/scroll-scaling.js +99 -0
  135. package/dist/virtualization/scroll-scaling.test.d.ts +1 -0
  136. package/dist/virtualization/scroll-scaling.test.js +127 -0
  137. package/dist/virtualization/svelte-virtualizer.svelte.d.ts +2 -0
  138. package/dist/virtualization/svelte-virtualizer.svelte.js +2 -0
  139. package/dist/virtualization/virtualizer.d.ts +7 -0
  140. package/dist/virtualization/virtualizer.js +30 -0
  141. package/package.json +2 -1
  142. package/src/GridFooter.svelte +164 -0
  143. package/src/GridMenus.svelte +648 -0
  144. package/src/SvGrid.controller.svelte.ts +2352 -0
  145. package/src/SvGrid.css +2012 -0
  146. package/src/SvGrid.helpers.test.ts +415 -0
  147. package/src/SvGrid.helpers.ts +185 -0
  148. package/src/SvGrid.svelte +2346 -8742
  149. package/src/SvGrid.types.ts +537 -0
  150. package/src/SvGridChart.svelte +1060 -23
  151. package/src/aligned-grids.test.ts +80 -0
  152. package/src/aligned-grids.ts +87 -0
  153. package/src/build-api.coverage.test.ts +532 -0
  154. package/src/build-api.ts +683 -0
  155. package/src/cell-render.test.ts +451 -0
  156. package/src/cell-render.ts +426 -0
  157. package/src/cell-values.ts +114 -0
  158. package/src/chart-export.test.ts +370 -0
  159. package/src/chart.coverage.test.ts +814 -0
  160. package/src/chart.ts +1352 -47
  161. package/src/clipboard.test.ts +780 -0
  162. package/src/clipboard.ts +552 -0
  163. package/src/collaboration.coverage.test.ts +220 -0
  164. package/src/column-groups.test.ts +59 -0
  165. package/src/column-groups.ts +80 -0
  166. package/src/column-types.test.ts +68 -0
  167. package/src/column-types.ts +82 -0
  168. package/src/columns.test.ts +702 -0
  169. package/src/columns.ts +419 -0
  170. package/src/core.ts +86 -0
  171. package/src/css.d.ts +3 -0
  172. package/src/editing.test.ts +837 -0
  173. package/src/editing.ts +669 -0
  174. package/src/editors/cell-editors.coverage.test.ts +156 -0
  175. package/src/editors/cell-editors.ts +1 -0
  176. package/src/facet-buckets.test.ts +353 -0
  177. package/src/facet-buckets.ts +67 -0
  178. package/src/features.ts +128 -0
  179. package/src/filter-operators.test.ts +174 -0
  180. package/src/filter-operators.ts +87 -0
  181. package/src/hyperformula-adapter.test.ts +256 -0
  182. package/src/hyperformula-adapter.ts +124 -0
  183. package/src/index.ts +49 -0
  184. package/src/keyboard-handlers.coverage.test.ts +560 -0
  185. package/src/keyboard-handlers.ts +353 -0
  186. package/src/keyboard.ts +97 -97
  187. package/src/menus.test.ts +620 -0
  188. package/src/menus.ts +555 -0
  189. package/src/named-views.coverage.test.ts +210 -0
  190. package/src/named-views.ts +48 -0
  191. package/src/row-drag.test.ts +168 -0
  192. package/src/row-drag.ts +255 -0
  193. package/src/row-resize.test.ts +369 -0
  194. package/src/row-resize.ts +171 -0
  195. package/src/scroll-sync.test.ts +330 -0
  196. package/src/scroll-sync.ts +218 -0
  197. package/src/selection.multi-range.test.ts +61 -0
  198. package/src/selection.test.ts +722 -0
  199. package/src/selection.ts +579 -0
  200. package/src/server-data-source.coverage.test.ts +180 -0
  201. package/src/spreadsheet.test.ts +489 -0
  202. package/src/spreadsheet.ts +304 -0
  203. package/src/summaries.ts +204 -0
  204. package/src/sv-grid-scrollbar.ts +13 -1
  205. package/src/svgrid-wrapper.types.ts +31 -1
  206. package/src/svgrid.behavior.test.ts +22 -0
  207. package/src/svgrid.comments-autocomplete.test.ts +112 -0
  208. package/src/svgrid.context-menu.test.ts +126 -0
  209. package/src/svgrid.interaction.test.ts +30 -0
  210. package/src/svgrid.new-features.wrapper.test.ts +67 -6
  211. package/src/svgrid.wrapper.test.ts +27 -1
  212. package/src/test-setup.ts +9 -6
  213. package/src/virtualization/scroll-scaling.test.ts +148 -0
  214. package/src/virtualization/scroll-scaling.ts +121 -0
  215. package/src/virtualization/svelte-virtualizer.svelte.ts +2 -0
  216. package/src/virtualization/virtualizer.ts +26 -0
@@ -19,6 +19,23 @@ type Props = {
19
19
  formatValue?: (value: number) => string;
20
20
  /** Fired when a category / slice is clicked (drill into the grid). */
21
21
  onSelect?: (selection: ChartSelection) => void;
22
+ /** Like `onSelect`, but only fires when the spec carries `rowIds` and
23
+ * includes them in the payload. Use this to filter / highlight the
24
+ * source grid when the user clicks a chart element. */
25
+ onDrill?: (selection: ChartSelection) => void;
26
+ /** Allow drag-to-zoom on the plot area. Double-click resets.
27
+ * Only meaningful for cartesian charts (not pie). Default false. */
28
+ zoomable?: boolean;
29
+ /** Show a compact brush / mini-map under the main chart. A draggable
30
+ * window selects what the main chart shows. Pairs naturally with
31
+ * `zoomable`. Default false. */
32
+ brush?: boolean;
33
+ /** Height of the brush strip in pixels. Default 88. */
34
+ brushHeight?: number;
35
+ /** Show a small toolbar above the chart: reset-zoom (when zoomed) and
36
+ * export (PNG / SVG / copy). Default true when zoomable or onDrill is
37
+ * set, otherwise false. Set to `false` to hide explicitly. */
38
+ toolbar?: boolean;
22
39
  };
23
40
  declare const SvGridChart: import("svelte").Component<Props, {}, "">;
24
41
  type SvGridChart = ReturnType<typeof SvGridChart>;
@@ -0,0 +1,6 @@
1
+ export declare function createAlignedGrids<TFeatures, TData>(ctx: any): {
2
+ register: () => () => void;
3
+ broadcastScroll: (left: number) => void;
4
+ broadcastWidths: () => void;
5
+ alignedGridId: number;
6
+ };
@@ -0,0 +1,84 @@
1
+ // Aligned grids - keep two or more independent grids in lockstep on horizontal
2
+ // scroll and column widths. Grids that share the same `alignedGridGroup` string
3
+ // register with a module-level registry (same pattern as managed row dragging);
4
+ // when one scrolls horizontally or a column is resized, the others follow.
5
+ //
6
+ // Loop-safety without flags: scroll sync no-ops when the target already has the
7
+ // value (so the echo scroll event never fires); width sync compares a serialized
8
+ // snapshot and pre-seeds it on apply, so the reactive effect that fires after
9
+ // applying a peer's widths sees "no change" and doesn't echo.
10
+ // Shared across every grid in the bundle.
11
+ const groups = new Map();
12
+ let seq = 0;
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
+ export function createAlignedGrids(ctx) {
15
+ const id = ++seq;
16
+ let lastWidthsSerial = "";
17
+ const group = () => ctx.props.alignedGridGroup ?? null;
18
+ function peers() {
19
+ const g = group();
20
+ if (!g)
21
+ return [];
22
+ const m = groups.get(g);
23
+ if (!m)
24
+ return [];
25
+ const out = [];
26
+ for (const member of m.values())
27
+ if (member.id !== id)
28
+ out.push(member);
29
+ return out;
30
+ }
31
+ const self = {
32
+ id,
33
+ applyScroll(left) {
34
+ const el = ctx.scrollContainer;
35
+ // Only set when it differs, so no echo scroll event fires -> no loop.
36
+ if (el && el.scrollLeft !== left)
37
+ el.scrollLeft = left;
38
+ },
39
+ applyWidths(widths) {
40
+ const merged = { ...ctx.columnWidths, ...widths };
41
+ // Pre-seed the serial so the columnWidths effect that fires after this
42
+ // set sees an unchanged snapshot and skips its own broadcast.
43
+ lastWidthsSerial = JSON.stringify(merged);
44
+ ctx.columnWidths = merged;
45
+ },
46
+ };
47
+ // Register on mount; returns the unregister for the effect's cleanup.
48
+ function register() {
49
+ const g = group();
50
+ if (!g)
51
+ return () => { };
52
+ let m = groups.get(g);
53
+ if (!m) {
54
+ m = new Map();
55
+ groups.set(g, m);
56
+ }
57
+ m.set(id, self);
58
+ return () => {
59
+ const mm = groups.get(g);
60
+ if (!mm)
61
+ return;
62
+ mm.delete(id);
63
+ if (!mm.size)
64
+ groups.delete(g);
65
+ };
66
+ }
67
+ function broadcastScroll(left) {
68
+ const p = peers();
69
+ for (const member of p)
70
+ member.applyScroll(left);
71
+ }
72
+ function broadcastWidths() {
73
+ if (!group())
74
+ return;
75
+ const serial = JSON.stringify(ctx.columnWidths ?? {});
76
+ if (serial === lastWidthsSerial)
77
+ return; // nothing new (or echo of an apply)
78
+ lastWidthsSerial = serial;
79
+ const w = ctx.columnWidths;
80
+ for (const member of peers())
81
+ member.applyWidths(w);
82
+ }
83
+ return { register, broadcastScroll, broadcastWidths, alignedGridId: id };
84
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Unit tests for aligned grids: two members sharing a group mirror horizontal
3
+ * scroll and column-resize widths to each other. Driven with minimal fake ctxs.
4
+ */
5
+ import { describe, expect, it } from 'vitest';
6
+ import { createAlignedGrids } from './aligned-grids';
7
+ function makeCtx(group) {
8
+ return {
9
+ props: { alignedGridGroup: group },
10
+ scrollContainer: { scrollLeft: 0 },
11
+ columnWidths: {},
12
+ };
13
+ }
14
+ describe('aligned grids', () => {
15
+ it('mirrors horizontal scroll to peers in the same group', () => {
16
+ const a = makeCtx('g');
17
+ const b = makeCtx('g');
18
+ const ha = createAlignedGrids(a);
19
+ const hb = createAlignedGrids(b);
20
+ const un1 = ha.register();
21
+ const un2 = hb.register();
22
+ ha.broadcastScroll(240);
23
+ expect(b.scrollContainer.scrollLeft).toBe(240);
24
+ // and the other way
25
+ hb.broadcastScroll(80);
26
+ expect(a.scrollContainer.scrollLeft).toBe(80);
27
+ un1();
28
+ un2();
29
+ });
30
+ it('mirrors column-resize widths to peers (matched by column id)', () => {
31
+ const a = makeCtx('g');
32
+ const b = makeCtx('g');
33
+ const ha = createAlignedGrids(a);
34
+ const hb = createAlignedGrids(b);
35
+ ha.register();
36
+ hb.register();
37
+ a.columnWidths = { Feb: 180 };
38
+ ha.broadcastWidths();
39
+ expect(b.columnWidths.Feb).toBe(180);
40
+ });
41
+ it('does NOT mirror across different groups', () => {
42
+ const a = makeCtx('one');
43
+ const b = makeCtx('two');
44
+ const ha = createAlignedGrids(a);
45
+ const hb = createAlignedGrids(b);
46
+ ha.register();
47
+ hb.register();
48
+ ha.broadcastScroll(200);
49
+ expect(b.scrollContainer.scrollLeft).toBe(0);
50
+ a.columnWidths = { Feb: 999 };
51
+ ha.broadcastWidths();
52
+ expect(b.columnWidths.Feb).toBeUndefined();
53
+ });
54
+ it('is inert with no group set, and after unregister', () => {
55
+ const a = makeCtx(undefined);
56
+ const b = makeCtx(undefined);
57
+ const ha = createAlignedGrids(a);
58
+ const hb = createAlignedGrids(b);
59
+ ha.register();
60
+ hb.register();
61
+ ha.broadcastScroll(120);
62
+ expect(b.scrollContainer.scrollLeft).toBe(0);
63
+ // Grouped, then unregistered -> no longer receives updates.
64
+ const c = makeCtx('gg');
65
+ const d = makeCtx('gg');
66
+ const hc = createAlignedGrids(c);
67
+ const hd = createAlignedGrids(d);
68
+ const unc = hc.register();
69
+ const und = hd.register();
70
+ und(); // d leaves the group
71
+ hc.broadcastScroll(55);
72
+ expect(d.scrollContainer.scrollLeft).toBe(0);
73
+ unc();
74
+ });
75
+ });
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Coverage-focused behavioral tests for the SvGridApi assembled in
3
+ * `build-api.ts`. The existing `svgrid.api.test.ts` / `svgrid.api-extensions
4
+ * .test.ts` cover filters, row selection, pagination, navigation, and
5
+ * getState/setState. This file exercises the remaining surface:
6
+ * - getCellValue / setCellValue
7
+ * - selectCells / getSelected
8
+ * - addRow(s) / removeRow(s) / applyTransaction
9
+ * - addColumn(s) / removeColumn / setColumnVisible / getColumns
10
+ * - setColumnWidth / setColumnPinning / setColumnOrder
11
+ * - setFacetFilter
12
+ * - undo / redo / canUndo / canRedo / clearHistory
13
+ * - find (open/close/query/hits)
14
+ * - grouping (setGroupBy / expandAllGroups / collapseAllGroups)
15
+ * - autosizeColumn / refresh
16
+ *
17
+ * All tests mount the real <SvGrid /> in jsdom and drive the api handed back
18
+ * from onApiReady.
19
+ */
20
+ export {};