@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.
- package/LICENSE +1 -1
- package/README.md +137 -39
- package/dist/GridFooter.svelte +164 -0
- package/dist/GridFooter.svelte.d.ts +29 -0
- package/dist/GridMenus.svelte +648 -0
- package/dist/GridMenus.svelte.d.ts +31 -0
- package/dist/SvGrid.controller.svelte.d.ts +472 -0
- package/dist/SvGrid.controller.svelte.js +1917 -0
- package/dist/SvGrid.css +2012 -0
- package/dist/SvGrid.helpers.d.ts +35 -0
- package/dist/SvGrid.helpers.js +160 -0
- package/dist/SvGrid.helpers.test.d.ts +1 -0
- package/dist/SvGrid.helpers.test.js +298 -0
- package/dist/SvGrid.svelte +2346 -8742
- package/dist/SvGrid.svelte.d.ts +4 -357
- package/dist/SvGrid.types.d.ts +523 -0
- package/dist/SvGrid.types.js +1 -0
- package/dist/SvGridChart.svelte +1060 -23
- package/dist/SvGridChart.svelte.d.ts +17 -0
- package/dist/aligned-grids.d.ts +6 -0
- package/dist/aligned-grids.js +84 -0
- package/dist/aligned-grids.test.d.ts +1 -0
- package/dist/aligned-grids.test.js +75 -0
- package/dist/build-api.coverage.test.d.ts +20 -0
- package/dist/build-api.coverage.test.js +505 -0
- package/dist/build-api.d.ts +5 -0
- package/dist/build-api.js +557 -0
- package/dist/cell-render.d.ts +15 -0
- package/dist/cell-render.js +246 -0
- package/dist/cell-render.test.d.ts +1 -0
- package/dist/cell-render.test.js +338 -0
- package/dist/cell-values.d.ts +28 -0
- package/dist/cell-values.js +89 -0
- package/dist/chart-export.test.d.ts +1 -0
- package/dist/chart-export.test.js +302 -0
- package/dist/chart.coverage.test.d.ts +1 -0
- package/dist/chart.coverage.test.js +748 -0
- package/dist/chart.d.ts +370 -3
- package/dist/chart.js +1135 -42
- package/dist/clipboard.d.ts +15 -0
- package/dist/clipboard.js +420 -0
- package/dist/clipboard.test.d.ts +1 -0
- package/dist/clipboard.test.js +700 -0
- package/dist/collaboration.coverage.test.d.ts +1 -0
- package/dist/collaboration.coverage.test.js +200 -0
- package/dist/column-groups.d.ts +19 -0
- package/dist/column-groups.js +62 -0
- package/dist/column-groups.test.d.ts +1 -0
- package/dist/column-groups.test.js +56 -0
- package/dist/column-types.d.ts +10 -0
- package/dist/column-types.js +63 -0
- package/dist/column-types.test.d.ts +1 -0
- package/dist/column-types.test.js +62 -0
- package/dist/columns.d.ts +30 -0
- package/dist/columns.js +277 -0
- package/dist/columns.test.d.ts +1 -0
- package/dist/columns.test.js +625 -0
- package/dist/core.d.ts +86 -1
- package/dist/css.d.ts +3 -0
- package/dist/editing.d.ts +31 -0
- package/dist/editing.js +529 -0
- package/dist/editing.test.d.ts +1 -0
- package/dist/editing.test.js +732 -0
- package/dist/editors/cell-editors.coverage.test.d.ts +1 -0
- package/dist/editors/cell-editors.coverage.test.js +139 -0
- package/dist/editors/cell-editors.d.ts +1 -1
- package/dist/facet-buckets.d.ts +13 -0
- package/dist/facet-buckets.js +54 -0
- package/dist/facet-buckets.test.d.ts +1 -0
- package/dist/facet-buckets.test.js +296 -0
- package/dist/features.d.ts +5 -0
- package/dist/features.js +30 -0
- package/dist/filter-operators.d.ts +16 -0
- package/dist/filter-operators.js +69 -0
- package/dist/filter-operators.test.d.ts +1 -0
- package/dist/filter-operators.test.js +135 -0
- package/dist/hyperformula-adapter.d.ts +82 -0
- package/dist/hyperformula-adapter.js +73 -0
- package/dist/hyperformula-adapter.test.d.ts +1 -0
- package/dist/hyperformula-adapter.test.js +205 -0
- package/dist/index.d.ts +9 -3
- package/dist/index.js +8 -2
- package/dist/keyboard-handlers.coverage.test.d.ts +1 -0
- package/dist/keyboard-handlers.coverage.test.js +495 -0
- package/dist/keyboard-handlers.d.ts +7 -0
- package/dist/keyboard-handlers.js +202 -0
- package/dist/menus.d.ts +40 -0
- package/dist/menus.js +390 -0
- package/dist/menus.test.d.ts +1 -0
- package/dist/menus.test.js +560 -0
- package/dist/named-views.coverage.test.d.ts +1 -0
- package/dist/named-views.coverage.test.js +180 -0
- package/dist/named-views.d.ts +27 -0
- package/dist/named-views.js +39 -0
- package/dist/row-drag.d.ts +49 -0
- package/dist/row-drag.js +221 -0
- package/dist/row-drag.test.d.ts +1 -0
- package/dist/row-drag.test.js +142 -0
- package/dist/row-resize.d.ts +43 -0
- package/dist/row-resize.js +158 -0
- package/dist/row-resize.test.d.ts +1 -0
- package/dist/row-resize.test.js +329 -0
- package/dist/scroll-sync.d.ts +9 -0
- package/dist/scroll-sync.js +89 -0
- package/dist/scroll-sync.test.d.ts +1 -0
- package/dist/scroll-sync.test.js +290 -0
- package/dist/selection.d.ts +32 -0
- package/dist/selection.js +427 -0
- package/dist/selection.multi-range.test.d.ts +1 -0
- package/dist/selection.multi-range.test.js +55 -0
- package/dist/selection.test.d.ts +1 -0
- package/dist/selection.test.js +647 -0
- package/dist/server-data-source.coverage.test.d.ts +1 -0
- package/dist/server-data-source.coverage.test.js +154 -0
- package/dist/spreadsheet.d.ts +110 -0
- package/dist/spreadsheet.js +242 -0
- package/dist/spreadsheet.test.d.ts +1 -0
- package/dist/spreadsheet.test.js +446 -0
- package/dist/summaries.d.ts +12 -0
- package/dist/summaries.js +65 -0
- package/dist/sv-grid-scrollbar.js +13 -1
- package/dist/svgrid-wrapper.types.d.ts +31 -1
- package/dist/svgrid.behavior.test.js +20 -0
- package/dist/svgrid.comments-autocomplete.test.d.ts +1 -0
- package/dist/svgrid.comments-autocomplete.test.js +96 -0
- package/dist/svgrid.context-menu.test.d.ts +1 -0
- package/dist/svgrid.context-menu.test.js +102 -0
- package/dist/svgrid.interaction.test.js +31 -0
- package/dist/svgrid.new-features.wrapper.test.js +64 -6
- package/dist/svgrid.wrapper.test.js +27 -1
- package/dist/test-setup.js +9 -3
- package/dist/virtualization/column-virtualizer.d.ts +2 -0
- package/dist/virtualization/scroll-scaling.d.ts +45 -0
- package/dist/virtualization/scroll-scaling.js +99 -0
- package/dist/virtualization/scroll-scaling.test.d.ts +1 -0
- package/dist/virtualization/scroll-scaling.test.js +127 -0
- package/dist/virtualization/svelte-virtualizer.svelte.d.ts +2 -0
- package/dist/virtualization/svelte-virtualizer.svelte.js +2 -0
- package/dist/virtualization/virtualizer.d.ts +7 -0
- package/dist/virtualization/virtualizer.js +30 -0
- package/package.json +2 -1
- package/src/GridFooter.svelte +164 -0
- package/src/GridMenus.svelte +648 -0
- package/src/SvGrid.controller.svelte.ts +2352 -0
- package/src/SvGrid.css +2012 -0
- package/src/SvGrid.helpers.test.ts +415 -0
- package/src/SvGrid.helpers.ts +185 -0
- package/src/SvGrid.svelte +2346 -8742
- package/src/SvGrid.types.ts +537 -0
- package/src/SvGridChart.svelte +1060 -23
- package/src/aligned-grids.test.ts +80 -0
- package/src/aligned-grids.ts +87 -0
- package/src/build-api.coverage.test.ts +532 -0
- package/src/build-api.ts +683 -0
- package/src/cell-render.test.ts +451 -0
- package/src/cell-render.ts +426 -0
- package/src/cell-values.ts +114 -0
- package/src/chart-export.test.ts +370 -0
- package/src/chart.coverage.test.ts +814 -0
- package/src/chart.ts +1352 -47
- package/src/clipboard.test.ts +780 -0
- package/src/clipboard.ts +552 -0
- package/src/collaboration.coverage.test.ts +220 -0
- package/src/column-groups.test.ts +59 -0
- package/src/column-groups.ts +80 -0
- package/src/column-types.test.ts +68 -0
- package/src/column-types.ts +82 -0
- package/src/columns.test.ts +702 -0
- package/src/columns.ts +419 -0
- package/src/core.ts +86 -0
- package/src/css.d.ts +3 -0
- package/src/editing.test.ts +837 -0
- package/src/editing.ts +669 -0
- package/src/editors/cell-editors.coverage.test.ts +156 -0
- package/src/editors/cell-editors.ts +1 -0
- package/src/facet-buckets.test.ts +353 -0
- package/src/facet-buckets.ts +67 -0
- package/src/features.ts +128 -0
- package/src/filter-operators.test.ts +174 -0
- package/src/filter-operators.ts +87 -0
- package/src/hyperformula-adapter.test.ts +256 -0
- package/src/hyperformula-adapter.ts +124 -0
- package/src/index.ts +49 -0
- package/src/keyboard-handlers.coverage.test.ts +560 -0
- package/src/keyboard-handlers.ts +353 -0
- package/src/keyboard.ts +97 -97
- package/src/menus.test.ts +620 -0
- package/src/menus.ts +555 -0
- package/src/named-views.coverage.test.ts +210 -0
- package/src/named-views.ts +48 -0
- package/src/row-drag.test.ts +168 -0
- package/src/row-drag.ts +255 -0
- package/src/row-resize.test.ts +369 -0
- package/src/row-resize.ts +171 -0
- package/src/scroll-sync.test.ts +330 -0
- package/src/scroll-sync.ts +218 -0
- package/src/selection.multi-range.test.ts +61 -0
- package/src/selection.test.ts +722 -0
- package/src/selection.ts +579 -0
- package/src/server-data-source.coverage.test.ts +180 -0
- package/src/spreadsheet.test.ts +489 -0
- package/src/spreadsheet.ts +304 -0
- package/src/summaries.ts +204 -0
- package/src/sv-grid-scrollbar.ts +13 -1
- package/src/svgrid-wrapper.types.ts +31 -1
- package/src/svgrid.behavior.test.ts +22 -0
- package/src/svgrid.comments-autocomplete.test.ts +112 -0
- package/src/svgrid.context-menu.test.ts +126 -0
- package/src/svgrid.interaction.test.ts +30 -0
- package/src/svgrid.new-features.wrapper.test.ts +67 -6
- package/src/svgrid.wrapper.test.ts +27 -1
- package/src/test-setup.ts +9 -6
- package/src/virtualization/scroll-scaling.test.ts +148 -0
- package/src/virtualization/scroll-scaling.ts +121 -0
- package/src/virtualization/svelte-virtualizer.svelte.ts +2 -0
- package/src/virtualization/virtualizer.ts +26 -0
package/dist/columns.js
ADDED
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import "./sv-grid-scrollbar";
|
|
2
|
+
export function createColumns(ctx) {
|
|
3
|
+
function cellPinStyle(columnId) {
|
|
4
|
+
// z-index 30 - higher than the active-cell / selection-range stacking
|
|
5
|
+
// context (z=20) so a selected cell in the scrollable middle never
|
|
6
|
+
// bleeds over the pinned columns during horizontal scroll. Still
|
|
7
|
+
// sits below dropdowns (z=900+) and the column menu.
|
|
8
|
+
const leftOffset = ctx.pinnedOffsets.left[columnId];
|
|
9
|
+
if (leftOffset !== undefined) {
|
|
10
|
+
return `position: sticky; left: ${leftOffset}px; z-index: 30;`;
|
|
11
|
+
}
|
|
12
|
+
const rightOffset = ctx.pinnedOffsets.right[columnId];
|
|
13
|
+
if (rightOffset !== undefined) {
|
|
14
|
+
return `position: sticky; right: ${rightOffset}px; z-index: 30;`;
|
|
15
|
+
}
|
|
16
|
+
return "";
|
|
17
|
+
}
|
|
18
|
+
function isColumnPinned(columnId) {
|
|
19
|
+
if (ctx.columnPinning.left.includes(columnId))
|
|
20
|
+
return "left";
|
|
21
|
+
if (ctx.columnPinning.right.includes(columnId))
|
|
22
|
+
return "right";
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
/** Compute the current full column order as displayed (pinned-left
|
|
26
|
+
* first, unpinned in the middle, pinned-right last). The order
|
|
27
|
+
* emitted via `onColumnOrderChange` matches what the user sees. */
|
|
28
|
+
function getCurrentColumnOrder() {
|
|
29
|
+
return ctx.allColumns.map((c) => c.id);
|
|
30
|
+
}
|
|
31
|
+
function emitColumnOrder() {
|
|
32
|
+
ctx.props.onColumnOrderChange?.(getCurrentColumnOrder());
|
|
33
|
+
}
|
|
34
|
+
function setColumnOrderInternal(ids) {
|
|
35
|
+
ctx.userColumnOrder = [...ids];
|
|
36
|
+
emitColumnOrder();
|
|
37
|
+
}
|
|
38
|
+
/** Drop `dragId` before / after `targetId` in the user order. We
|
|
39
|
+
* rebuild a clean order out of the currently-displayed columns so
|
|
40
|
+
* hidden columns are unaffected and pin groups stay logically
|
|
41
|
+
* separate (you can reorder freely within left-pinned / unpinned /
|
|
42
|
+
* right-pinned, but a drop across pin zones is allowed - the cell
|
|
43
|
+
* just lands in whichever zone the target belongs to). */
|
|
44
|
+
function applyColumnDrop(dragId, targetId, side) {
|
|
45
|
+
if (dragId === targetId)
|
|
46
|
+
return;
|
|
47
|
+
const current = getCurrentColumnOrder();
|
|
48
|
+
const without = current.filter((id) => id !== dragId);
|
|
49
|
+
let idx = without.indexOf(targetId);
|
|
50
|
+
if (idx < 0)
|
|
51
|
+
return;
|
|
52
|
+
if (side === "after")
|
|
53
|
+
idx++;
|
|
54
|
+
without.splice(idx, 0, dragId);
|
|
55
|
+
setColumnOrderInternal(without);
|
|
56
|
+
}
|
|
57
|
+
function onColumnHeaderDragStart(e, columnId) {
|
|
58
|
+
if (!(ctx.props.enableColumnReorder ?? false))
|
|
59
|
+
return;
|
|
60
|
+
ctx.colDragId = columnId;
|
|
61
|
+
e.dataTransfer?.setData("text/plain", columnId);
|
|
62
|
+
e.dataTransfer.effectAllowed = "move";
|
|
63
|
+
}
|
|
64
|
+
function onColumnHeaderDragOver(e, columnId) {
|
|
65
|
+
if (!ctx.colDragId || ctx.colDragId === columnId)
|
|
66
|
+
return;
|
|
67
|
+
e.preventDefault();
|
|
68
|
+
e.dataTransfer.dropEffect = "move";
|
|
69
|
+
const rect = e.currentTarget.getBoundingClientRect();
|
|
70
|
+
ctx.colDropSide = e.clientX < rect.left + rect.width / 2 ? "before" : "after";
|
|
71
|
+
ctx.colDropOnId = columnId;
|
|
72
|
+
}
|
|
73
|
+
function onColumnHeaderDragLeave(columnId) {
|
|
74
|
+
if (ctx.colDropOnId === columnId) {
|
|
75
|
+
ctx.colDropOnId = null;
|
|
76
|
+
ctx.colDropSide = null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function onColumnHeaderDrop(e, columnId) {
|
|
80
|
+
e.preventDefault();
|
|
81
|
+
if (ctx.colDragId && ctx.colDropSide)
|
|
82
|
+
applyColumnDrop(ctx.colDragId, columnId, ctx.colDropSide);
|
|
83
|
+
ctx.colDragId = null;
|
|
84
|
+
ctx.colDropOnId = null;
|
|
85
|
+
ctx.colDropSide = null;
|
|
86
|
+
}
|
|
87
|
+
function onColumnHeaderDragEnd() {
|
|
88
|
+
ctx.colDragId = null;
|
|
89
|
+
ctx.colDropOnId = null;
|
|
90
|
+
ctx.colDropSide = null;
|
|
91
|
+
}
|
|
92
|
+
function pinColumnLeft(columnId) {
|
|
93
|
+
const left = ctx.columnPinning.left.filter((id) => id !== columnId);
|
|
94
|
+
const right = ctx.columnPinning.right.filter((id) => id !== columnId);
|
|
95
|
+
ctx.columnPinning = { left: [...left, columnId], right };
|
|
96
|
+
ctx.closeMenus();
|
|
97
|
+
}
|
|
98
|
+
function pinColumnRight(columnId) {
|
|
99
|
+
const left = ctx.columnPinning.left.filter((id) => id !== columnId);
|
|
100
|
+
const right = ctx.columnPinning.right.filter((id) => id !== columnId);
|
|
101
|
+
ctx.columnPinning = { left, right: [columnId, ...right] };
|
|
102
|
+
ctx.closeMenus();
|
|
103
|
+
}
|
|
104
|
+
function unpinColumn(columnId) {
|
|
105
|
+
ctx.columnPinning = {
|
|
106
|
+
left: ctx.columnPinning.left.filter((id) => id !== columnId),
|
|
107
|
+
right: ctx.columnPinning.right.filter((id) => id !== columnId),
|
|
108
|
+
};
|
|
109
|
+
ctx.closeMenus();
|
|
110
|
+
}
|
|
111
|
+
function toggleColumnVisibleInPanel(columnId) {
|
|
112
|
+
if (ctx.hiddenColumns[columnId]) {
|
|
113
|
+
const next = { ...ctx.hiddenColumns };
|
|
114
|
+
delete next[columnId];
|
|
115
|
+
ctx.hiddenColumns = next;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
ctx.hiddenColumns = { ...ctx.hiddenColumns, [columnId]: true };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function moveColumnInPanel(columnId, dir) {
|
|
122
|
+
const current = ctx.toolPanelColumns.map((c) => c.id);
|
|
123
|
+
const i = current.indexOf(columnId);
|
|
124
|
+
const j = i + dir;
|
|
125
|
+
if (i < 0 || j < 0 || j >= current.length)
|
|
126
|
+
return;
|
|
127
|
+
[current[i], current[j]] = [current[j], current[i]];
|
|
128
|
+
ctx.userColumnOrder = current;
|
|
129
|
+
}
|
|
130
|
+
function toggleGroupInPanel(columnId) {
|
|
131
|
+
const g = (ctx.grid.getState().grouping ?? []);
|
|
132
|
+
ctx.grid.setGrouping(g.includes(columnId)
|
|
133
|
+
? g.filter((x) => x !== columnId)
|
|
134
|
+
: [...g, columnId]);
|
|
135
|
+
}
|
|
136
|
+
/** Width before fitColumns scaling - what the columnDef/user actually set. */
|
|
137
|
+
function getColumnBaseWidth(columnId) {
|
|
138
|
+
if (ctx.columnWidths[columnId] !== undefined)
|
|
139
|
+
return ctx.columnWidths[columnId];
|
|
140
|
+
const column = ctx.grid.getAllColumns().find((c) => c.id === columnId);
|
|
141
|
+
if (column?.columnDef.width !== undefined)
|
|
142
|
+
return column.columnDef.width;
|
|
143
|
+
return ctx.props.columnWidth ?? 140;
|
|
144
|
+
}
|
|
145
|
+
function getColumnWidth(columnId) {
|
|
146
|
+
const fitted = ctx.fittedColumnWidths?.[columnId];
|
|
147
|
+
if (fitted !== undefined && ctx.columnWidths[columnId] === undefined)
|
|
148
|
+
return fitted;
|
|
149
|
+
return getColumnBaseWidth(columnId);
|
|
150
|
+
}
|
|
151
|
+
function startColumnResize(event, columnId) {
|
|
152
|
+
event.stopPropagation();
|
|
153
|
+
event.preventDefault();
|
|
154
|
+
ctx.resizingColumnId = columnId;
|
|
155
|
+
ctx.resizeStartX = event.clientX;
|
|
156
|
+
ctx.resizeStartWidth = getColumnWidth(columnId);
|
|
157
|
+
document.addEventListener("pointermove", onColumnResizeMove);
|
|
158
|
+
document.addEventListener("pointerup", endColumnResize);
|
|
159
|
+
document.addEventListener("pointercancel", endColumnResize);
|
|
160
|
+
}
|
|
161
|
+
function onColumnResizeMove(event) {
|
|
162
|
+
if (!ctx.resizingColumnId)
|
|
163
|
+
return;
|
|
164
|
+
// Coalesce updates onto the animation frame: pointermove can fire many
|
|
165
|
+
// times per frame, and each $state mutation triggers a full reactive
|
|
166
|
+
// recompute of the column-layout pipeline. Without rAF coalescing the
|
|
167
|
+
// grid stutters during the drag.
|
|
168
|
+
ctx.resizePendingWidth = Math.max(ctx.MIN_COLUMN_WIDTH, ctx.resizeStartWidth + (event.clientX - ctx.resizeStartX));
|
|
169
|
+
if (ctx.resizeRaf !== null)
|
|
170
|
+
return;
|
|
171
|
+
ctx.resizeRaf = requestAnimationFrame(() => {
|
|
172
|
+
ctx.resizeRaf = null;
|
|
173
|
+
if (!ctx.resizingColumnId)
|
|
174
|
+
return;
|
|
175
|
+
ctx.columnWidths = {
|
|
176
|
+
...ctx.columnWidths,
|
|
177
|
+
[ctx.resizingColumnId]: ctx.resizePendingWidth,
|
|
178
|
+
};
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
function endColumnResize() {
|
|
182
|
+
if (ctx.resizeRaf !== null) {
|
|
183
|
+
cancelAnimationFrame(ctx.resizeRaf);
|
|
184
|
+
ctx.resizeRaf = null;
|
|
185
|
+
}
|
|
186
|
+
if (ctx.resizingColumnId && ctx.resizePendingWidth) {
|
|
187
|
+
// Make sure the final width is committed even if the last rAF was
|
|
188
|
+
// canceled mid-flight.
|
|
189
|
+
ctx.columnWidths = {
|
|
190
|
+
...ctx.columnWidths,
|
|
191
|
+
[ctx.resizingColumnId]: ctx.resizePendingWidth,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
ctx.resizingColumnId = null;
|
|
195
|
+
document.removeEventListener("pointermove", onColumnResizeMove);
|
|
196
|
+
document.removeEventListener("pointerup", endColumnResize);
|
|
197
|
+
document.removeEventListener("pointercancel", endColumnResize);
|
|
198
|
+
}
|
|
199
|
+
function measureText(text, font) {
|
|
200
|
+
if (!text)
|
|
201
|
+
return 0;
|
|
202
|
+
if (!ctx.measureCanvas)
|
|
203
|
+
ctx.measureCanvas = document.createElement("canvas");
|
|
204
|
+
const c2d = ctx.measureCanvas.getContext("2d");
|
|
205
|
+
if (!c2d)
|
|
206
|
+
return 0;
|
|
207
|
+
c2d.font = font;
|
|
208
|
+
return c2d.measureText(text).width;
|
|
209
|
+
}
|
|
210
|
+
/** Snap a column to the width of its widest visible cell (header + body). */
|
|
211
|
+
function autosizeColumn(columnId) {
|
|
212
|
+
if (!ctx.gridRootEl)
|
|
213
|
+
return;
|
|
214
|
+
const sampleCell = ctx.gridRootEl.querySelector(`[data-col-id="${CSS.escape(columnId)}"]`);
|
|
215
|
+
if (!sampleCell)
|
|
216
|
+
return;
|
|
217
|
+
const cellFont = getComputedStyle(sampleCell).font;
|
|
218
|
+
let max = ctx.MIN_COLUMN_WIDTH;
|
|
219
|
+
const header = ctx.gridRootEl.querySelector(`[data-svgrid-header-col="${CSS.escape(columnId)}"]`);
|
|
220
|
+
if (header) {
|
|
221
|
+
const labelEl = header.querySelector(".sv-grid-header-label");
|
|
222
|
+
const target = labelEl ?? header;
|
|
223
|
+
const text = target.textContent ?? "";
|
|
224
|
+
// +70 reserves room for sort indicator + funnel + 3-dot menu button
|
|
225
|
+
max = Math.max(max, measureText(text, getComputedStyle(target).font) + 70);
|
|
226
|
+
}
|
|
227
|
+
const cells = ctx.gridRootEl.querySelectorAll(`[data-col-id="${CSS.escape(columnId)}"]`);
|
|
228
|
+
cells.forEach((cell) => {
|
|
229
|
+
const text = cell.textContent ?? "";
|
|
230
|
+
const w = measureText(text, cellFont);
|
|
231
|
+
if (w > max)
|
|
232
|
+
max = w;
|
|
233
|
+
});
|
|
234
|
+
// cell horizontal padding (~16px) + 8px breathing room
|
|
235
|
+
ctx.columnWidths = {
|
|
236
|
+
...ctx.columnWidths,
|
|
237
|
+
[columnId]: Math.max(ctx.MIN_COLUMN_WIDTH, Math.ceil(max) + 24),
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
function autosizeAllColumns() {
|
|
241
|
+
for (const column of ctx.allColumns)
|
|
242
|
+
autosizeColumn(column.id);
|
|
243
|
+
}
|
|
244
|
+
function resetColumns() {
|
|
245
|
+
ctx.columnWidths = {};
|
|
246
|
+
ctx.hiddenColumns = {};
|
|
247
|
+
ctx.columnPinning = { left: [], right: [] };
|
|
248
|
+
}
|
|
249
|
+
return {
|
|
250
|
+
cellPinStyle,
|
|
251
|
+
isColumnPinned,
|
|
252
|
+
getCurrentColumnOrder,
|
|
253
|
+
emitColumnOrder,
|
|
254
|
+
setColumnOrderInternal,
|
|
255
|
+
applyColumnDrop,
|
|
256
|
+
onColumnHeaderDragStart,
|
|
257
|
+
onColumnHeaderDragOver,
|
|
258
|
+
onColumnHeaderDragLeave,
|
|
259
|
+
onColumnHeaderDrop,
|
|
260
|
+
onColumnHeaderDragEnd,
|
|
261
|
+
pinColumnLeft,
|
|
262
|
+
pinColumnRight,
|
|
263
|
+
unpinColumn,
|
|
264
|
+
toggleColumnVisibleInPanel,
|
|
265
|
+
moveColumnInPanel,
|
|
266
|
+
toggleGroupInPanel,
|
|
267
|
+
getColumnBaseWidth,
|
|
268
|
+
getColumnWidth,
|
|
269
|
+
startColumnResize,
|
|
270
|
+
onColumnResizeMove,
|
|
271
|
+
endColumnResize,
|
|
272
|
+
measureText,
|
|
273
|
+
autosizeColumn,
|
|
274
|
+
autosizeAllColumns,
|
|
275
|
+
resetColumns,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|