@svgrid/grid 2.0.0 → 2.0.2

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 (61) hide show
  1. package/dist/FlexRender.svelte +96 -96
  2. package/dist/GridFooter.svelte +178 -178
  3. package/dist/SvGrid.css +2376 -2376
  4. package/dist/SvGrid.svelte +2764 -2764
  5. package/dist/SvGridDropdown.svelte +666 -666
  6. package/dist/cdn/svgrid.js +1 -1
  7. package/dist/cdn/svgrid.svelte-external.js +1 -1
  8. package/package.json +85 -85
  9. package/src/FlexRender.svelte +96 -96
  10. package/src/GridFooter.svelte +178 -178
  11. package/src/SvGrid.controller.svelte.ts +2553 -2553
  12. package/src/SvGrid.css +2376 -2376
  13. package/src/SvGrid.svelte +2764 -2764
  14. package/src/SvGrid.types.ts +944 -944
  15. package/src/SvGridDropdown.svelte +666 -666
  16. package/src/a11y.contract.test.ts +49 -49
  17. package/src/a11y.test.ts +59 -59
  18. package/src/a11y.ts +61 -61
  19. package/src/build-api.ts +798 -798
  20. package/src/cell-formatting.ts +169 -169
  21. package/src/cell-render.ts +469 -469
  22. package/src/collaboration.test.ts +104 -104
  23. package/src/collaboration.ts +167 -167
  24. package/src/core.performance.test.ts +30 -30
  25. package/src/core.ts +1111 -1111
  26. package/src/createGrid.svelte.ts +42 -42
  27. package/src/createGrid.test.ts +10 -10
  28. package/src/createGridState.svelte.ts +17 -17
  29. package/src/editing.test.ts +859 -859
  30. package/src/editing.ts +675 -675
  31. package/src/export-data-api.test.ts +126 -126
  32. package/src/export-format.test.ts +107 -107
  33. package/src/export-format.ts +598 -598
  34. package/src/flex-render.ts +3 -3
  35. package/src/index.ts +463 -463
  36. package/src/keyboard.test.ts +59 -59
  37. package/src/keyboard.ts +97 -97
  38. package/src/menus.ts +582 -582
  39. package/src/merge-objects.ts +48 -48
  40. package/src/render-component.ts +28 -28
  41. package/src/selection.test.ts +754 -754
  42. package/src/selection.ts +600 -600
  43. package/src/server-data-source.test.ts +289 -289
  44. package/src/server-data-source.ts +413 -413
  45. package/src/sparkline.test.ts +68 -68
  46. package/src/sparkline.ts +169 -169
  47. package/src/spreadsheet.test.ts +489 -489
  48. package/src/spreadsheet.ts +304 -304
  49. package/src/static-functions.ts +11 -11
  50. package/src/subscribe.ts +38 -38
  51. package/src/svgrid-wrapper.types.ts +439 -439
  52. package/src/svgrid.behavior.test.ts +706 -706
  53. package/src/svgrid.features.test.ts +157 -157
  54. package/src/svgrid.new-features.wrapper.test.ts +251 -251
  55. package/src/svgrid.wrapper.test.ts +40 -40
  56. package/src/virtualization/column-virtualizer.test.ts +27 -27
  57. package/src/virtualization/column-virtualizer.ts +30 -30
  58. package/src/virtualization/svelte-virtualizer.svelte.ts +26 -26
  59. package/src/virtualization/types.ts +30 -30
  60. package/src/virtualization/virtualizer.test.ts +47 -47
  61. package/src/virtualization/virtualizer.ts +296 -296
@@ -1,178 +1,178 @@
1
- <script lang="ts" generics="TFeatures extends TableFeatures = TableFeatures, TData extends RowData = RowData">
2
- import {
3
- getGridCellA11yProps,
4
- getGridCellDomId,
5
- getGridHeaderA11yProps,
6
- getGridRootA11yProps,
7
- getGridRowA11yProps,
8
- type EditorContext,
9
- type CellEditorOption,
10
- type Column,
11
- type Row,
12
- type RowData,
13
- type TableFeatures,
14
- } from "./index";
15
- import "./sv-grid-scrollbar";
16
- import type { Snippet } from "svelte";
17
- import {
18
- RenderSnippetConfig,
19
- RenderComponentConfig,
20
- } from "./render-component";
21
- import {
22
- buildSparkline,
23
- toSparklineValues,
24
- } from "./sparkline";
25
- import SvGridDropdown from "./SvGridDropdown.svelte";
26
- import type {
27
- Props,
28
- SelectionPoint,
29
- SelectionRange,
30
- CellEditState,
31
- FilterOperator,
32
- FilterOption,
33
- MenuPosition,
34
- } from "./SvGrid.types";
35
- import {
36
- cfTextStyle,
37
- fmtStat,
38
- getEditableInputValue,
39
- getEditorInputType,
40
- toValueArray,
41
- getOptionLabel,
42
- getOptionColor,
43
- colorfulChipStyle,
44
- getEditorClass,
45
- } from "./SvGrid.helpers";
46
- import {
47
- } from "./SvGrid.controller.svelte";
48
- import type { SvGridController } from "./SvGrid.controller.svelte";
49
-
50
- let {
51
- ctrl,
52
- pager = true,
53
- showStatus = true,
54
- top = false,
55
- pageSizeOptions,
56
- }: {
57
- ctrl: SvGridController<TFeatures, TData>;
58
- /** Render the pagination controls in this instance. */
59
- pager?: boolean;
60
- /** Render the status bar in this instance. */
61
- showStatus?: boolean;
62
- /** This is a top-positioned footer (styling only). */
63
- top?: boolean;
64
- /** Page-size choices for the selector. Defaults to `[10, 25, 50, 100]`. */
65
- pageSizeOptions?: number[];
66
- } = $props();
67
-
68
- // View facade: re-bind the controller's reactive members so the markup
69
- // (moved verbatim from SvGrid.svelte) stays identical.
70
- const paginationEnabled = $derived(ctrl.paginationEnabled);
71
- const grid = $derived(ctrl.grid);
72
- const paginationState = $derived(ctrl.paginationState);
73
- const allRowsBeforePagination = $derived(ctrl.allRowsBeforePagination);
74
- const statusBarEnabled = $derived(ctrl.statusBarEnabled);
75
- const statusBarAggregates = $derived(ctrl.statusBarAggregates);
76
- const statusBarStats = $derived(ctrl.statusBarStats);
77
- const changePage = $derived(ctrl.changePage);
78
- const goToPage = $derived(ctrl.goToPage);
79
- const setPageSize = $derived(ctrl.setPageSize);
80
- </script>
81
-
82
- {#if showStatus && statusBarEnabled && statusBarStats}
83
- {@const s = statusBarStats}
84
- <div class="sv-grid-status-bar" role="status" aria-live="polite">
85
- {#each statusBarAggregates as agg (agg)}
86
- {#if agg === "count"}
87
- <span class="sv-grid-status-item"
88
- ><span class="sv-grid-status-label">Count</span>{fmtStat(s.count)}</span
89
- >
90
- {:else if agg === "numericCount"}
91
- <span class="sv-grid-status-item"
92
- ><span class="sv-grid-status-label">Numeric</span>{fmtStat(s.numericCount)}</span
93
- >
94
- {:else if s.numericCount > 0 && agg === "sum"}
95
- <span class="sv-grid-status-item"
96
- ><span class="sv-grid-status-label">Sum</span>{fmtStat(s.sum)}</span
97
- >
98
- {:else if s.numericCount > 0 && agg === "avg"}
99
- <span class="sv-grid-status-item"
100
- ><span class="sv-grid-status-label">Avg</span>{fmtStat(s.avg)}</span
101
- >
102
- {:else if s.numericCount > 0 && agg === "min"}
103
- <span class="sv-grid-status-item"
104
- ><span class="sv-grid-status-label">Min</span>{fmtStat(s.min)}</span
105
- >
106
- {:else if s.numericCount > 0 && agg === "max"}
107
- <span class="sv-grid-status-item"
108
- ><span class="sv-grid-status-label">Max</span>{fmtStat(s.max)}</span
109
- >
110
- {/if}
111
- {/each}
112
- </div>
113
- {/if}
114
-
115
- {#if pager && paginationEnabled}
116
- {@const totalRows = ctrl.paginationTotalRows}
117
- {@const pageSize = ctrl.paginationPageSize}
118
- {@const pageCount = Math.max(1, Math.ceil(totalRows / pageSize))}
119
- {@const currentPage = Math.min(ctrl.paginationPageIndex + 1, pageCount)}
120
- {@const rangeStart =
121
- totalRows === 0 ? 0 : (currentPage - 1) * pageSize + 1}
122
- {@const rangeEnd = Math.min(totalRows, currentPage * pageSize)}
123
- {@const onFirst = currentPage <= 1}
124
- {@const onLast = currentPage >= pageCount}
125
- {@const sizes = pageSizeOptions && pageSizeOptions.length ? pageSizeOptions : [10, 25, 50, 100]}
126
- <div class="sv-grid-pagination" class:sv-grid-pagination-top={top} role="navigation" aria-label="Pagination">
127
- <div class="sv-grid-pagination-pagesize">
128
- <span>Page Size:</span>
129
- <div class="sv-grid-pagination-pagesize-dd">
130
- <SvGridDropdown
131
- options={sizes.map((n) => ({ value: n, label: String(n) }))}
132
- value={pageSize}
133
- autoOpen={false}
134
- onChange={(v) => setPageSize(Number(v))}
135
- />
136
- </div>
137
- </div>
138
- <span class="sv-grid-pagination-range">
139
- <strong>{rangeStart.toLocaleString()}</strong> to
140
- <strong>{rangeEnd.toLocaleString()}</strong> of
141
- <strong>{totalRows.toLocaleString()}</strong>
142
- </span>
143
- <div class="sv-grid-pagination-nav">
144
- <button
145
- type="button"
146
- class="sv-grid-pagination-btn"
147
- disabled={onFirst}
148
- onclick={() => goToPage(0)}
149
- aria-label="First page">⇤</button
150
- >
151
- <button
152
- type="button"
153
- class="sv-grid-pagination-btn"
154
- disabled={onFirst}
155
- onclick={() => changePage(-1)}
156
- aria-label="Previous page">‹</button
157
- >
158
- <span class="sv-grid-pagination-label">
159
- Page <strong>{currentPage.toLocaleString()}</strong> of
160
- <strong>{pageCount.toLocaleString()}</strong>
161
- </span>
162
- <button
163
- type="button"
164
- class="sv-grid-pagination-btn"
165
- disabled={onLast}
166
- onclick={() => changePage(1)}
167
- aria-label="Next page">›</button
168
- >
169
- <button
170
- type="button"
171
- class="sv-grid-pagination-btn"
172
- disabled={onLast}
173
- onclick={() => goToPage(pageCount - 1)}
174
- aria-label="Last page">⇥</button
175
- >
176
- </div>
177
- </div>
178
- {/if}
1
+ <script lang="ts" generics="TFeatures extends TableFeatures = TableFeatures, TData extends RowData = RowData">
2
+ import {
3
+ getGridCellA11yProps,
4
+ getGridCellDomId,
5
+ getGridHeaderA11yProps,
6
+ getGridRootA11yProps,
7
+ getGridRowA11yProps,
8
+ type EditorContext,
9
+ type CellEditorOption,
10
+ type Column,
11
+ type Row,
12
+ type RowData,
13
+ type TableFeatures,
14
+ } from "./index";
15
+ import "./sv-grid-scrollbar";
16
+ import type { Snippet } from "svelte";
17
+ import {
18
+ RenderSnippetConfig,
19
+ RenderComponentConfig,
20
+ } from "./render-component";
21
+ import {
22
+ buildSparkline,
23
+ toSparklineValues,
24
+ } from "./sparkline";
25
+ import SvGridDropdown from "./SvGridDropdown.svelte";
26
+ import type {
27
+ Props,
28
+ SelectionPoint,
29
+ SelectionRange,
30
+ CellEditState,
31
+ FilterOperator,
32
+ FilterOption,
33
+ MenuPosition,
34
+ } from "./SvGrid.types";
35
+ import {
36
+ cfTextStyle,
37
+ fmtStat,
38
+ getEditableInputValue,
39
+ getEditorInputType,
40
+ toValueArray,
41
+ getOptionLabel,
42
+ getOptionColor,
43
+ colorfulChipStyle,
44
+ getEditorClass,
45
+ } from "./SvGrid.helpers";
46
+ import {
47
+ } from "./SvGrid.controller.svelte";
48
+ import type { SvGridController } from "./SvGrid.controller.svelte";
49
+
50
+ let {
51
+ ctrl,
52
+ pager = true,
53
+ showStatus = true,
54
+ top = false,
55
+ pageSizeOptions,
56
+ }: {
57
+ ctrl: SvGridController<TFeatures, TData>;
58
+ /** Render the pagination controls in this instance. */
59
+ pager?: boolean;
60
+ /** Render the status bar in this instance. */
61
+ showStatus?: boolean;
62
+ /** This is a top-positioned footer (styling only). */
63
+ top?: boolean;
64
+ /** Page-size choices for the selector. Defaults to `[10, 25, 50, 100]`. */
65
+ pageSizeOptions?: number[];
66
+ } = $props();
67
+
68
+ // View facade: re-bind the controller's reactive members so the markup
69
+ // (moved verbatim from SvGrid.svelte) stays identical.
70
+ const paginationEnabled = $derived(ctrl.paginationEnabled);
71
+ const grid = $derived(ctrl.grid);
72
+ const paginationState = $derived(ctrl.paginationState);
73
+ const allRowsBeforePagination = $derived(ctrl.allRowsBeforePagination);
74
+ const statusBarEnabled = $derived(ctrl.statusBarEnabled);
75
+ const statusBarAggregates = $derived(ctrl.statusBarAggregates);
76
+ const statusBarStats = $derived(ctrl.statusBarStats);
77
+ const changePage = $derived(ctrl.changePage);
78
+ const goToPage = $derived(ctrl.goToPage);
79
+ const setPageSize = $derived(ctrl.setPageSize);
80
+ </script>
81
+
82
+ {#if showStatus && statusBarEnabled && statusBarStats}
83
+ {@const s = statusBarStats}
84
+ <div class="sv-grid-status-bar" role="status" aria-live="polite">
85
+ {#each statusBarAggregates as agg (agg)}
86
+ {#if agg === "count"}
87
+ <span class="sv-grid-status-item"
88
+ ><span class="sv-grid-status-label">Count</span>{fmtStat(s.count)}</span
89
+ >
90
+ {:else if agg === "numericCount"}
91
+ <span class="sv-grid-status-item"
92
+ ><span class="sv-grid-status-label">Numeric</span>{fmtStat(s.numericCount)}</span
93
+ >
94
+ {:else if s.numericCount > 0 && agg === "sum"}
95
+ <span class="sv-grid-status-item"
96
+ ><span class="sv-grid-status-label">Sum</span>{fmtStat(s.sum)}</span
97
+ >
98
+ {:else if s.numericCount > 0 && agg === "avg"}
99
+ <span class="sv-grid-status-item"
100
+ ><span class="sv-grid-status-label">Avg</span>{fmtStat(s.avg)}</span
101
+ >
102
+ {:else if s.numericCount > 0 && agg === "min"}
103
+ <span class="sv-grid-status-item"
104
+ ><span class="sv-grid-status-label">Min</span>{fmtStat(s.min)}</span
105
+ >
106
+ {:else if s.numericCount > 0 && agg === "max"}
107
+ <span class="sv-grid-status-item"
108
+ ><span class="sv-grid-status-label">Max</span>{fmtStat(s.max)}</span
109
+ >
110
+ {/if}
111
+ {/each}
112
+ </div>
113
+ {/if}
114
+
115
+ {#if pager && paginationEnabled}
116
+ {@const totalRows = ctrl.paginationTotalRows}
117
+ {@const pageSize = ctrl.paginationPageSize}
118
+ {@const pageCount = Math.max(1, Math.ceil(totalRows / pageSize))}
119
+ {@const currentPage = Math.min(ctrl.paginationPageIndex + 1, pageCount)}
120
+ {@const rangeStart =
121
+ totalRows === 0 ? 0 : (currentPage - 1) * pageSize + 1}
122
+ {@const rangeEnd = Math.min(totalRows, currentPage * pageSize)}
123
+ {@const onFirst = currentPage <= 1}
124
+ {@const onLast = currentPage >= pageCount}
125
+ {@const sizes = pageSizeOptions && pageSizeOptions.length ? pageSizeOptions : [10, 25, 50, 100]}
126
+ <div class="sv-grid-pagination" class:sv-grid-pagination-top={top} role="navigation" aria-label="Pagination">
127
+ <div class="sv-grid-pagination-pagesize">
128
+ <span>Page Size:</span>
129
+ <div class="sv-grid-pagination-pagesize-dd">
130
+ <SvGridDropdown
131
+ options={sizes.map((n) => ({ value: n, label: String(n) }))}
132
+ value={pageSize}
133
+ autoOpen={false}
134
+ onChange={(v) => setPageSize(Number(v))}
135
+ />
136
+ </div>
137
+ </div>
138
+ <span class="sv-grid-pagination-range">
139
+ <strong>{rangeStart.toLocaleString()}</strong> to
140
+ <strong>{rangeEnd.toLocaleString()}</strong> of
141
+ <strong>{totalRows.toLocaleString()}</strong>
142
+ </span>
143
+ <div class="sv-grid-pagination-nav">
144
+ <button
145
+ type="button"
146
+ class="sv-grid-pagination-btn"
147
+ disabled={onFirst}
148
+ onclick={() => goToPage(0)}
149
+ aria-label="First page">⇤</button
150
+ >
151
+ <button
152
+ type="button"
153
+ class="sv-grid-pagination-btn"
154
+ disabled={onFirst}
155
+ onclick={() => changePage(-1)}
156
+ aria-label="Previous page">‹</button
157
+ >
158
+ <span class="sv-grid-pagination-label">
159
+ Page <strong>{currentPage.toLocaleString()}</strong> of
160
+ <strong>{pageCount.toLocaleString()}</strong>
161
+ </span>
162
+ <button
163
+ type="button"
164
+ class="sv-grid-pagination-btn"
165
+ disabled={onLast}
166
+ onclick={() => changePage(1)}
167
+ aria-label="Next page">›</button
168
+ >
169
+ <button
170
+ type="button"
171
+ class="sv-grid-pagination-btn"
172
+ disabled={onLast}
173
+ onclick={() => goToPage(pageCount - 1)}
174
+ aria-label="Last page">⇥</button
175
+ >
176
+ </div>
177
+ </div>
178
+ {/if}