From 9b0060ea553694d6e5af7b82b3a5098d9c58a26e Mon Sep 17 00:00:00 2001 From: Sam Gusick Date: Wed, 24 Sep 2025 09:50:31 -0400 Subject: [PATCH 1/2] Features Implemented and Working --- .../pages/QueryResult/resultGrid.tsx | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/src/reactviews/pages/QueryResult/resultGrid.tsx b/src/reactviews/pages/QueryResult/resultGrid.tsx index bfcb779b55..b57169740b 100644 --- a/src/reactviews/pages/QueryResult/resultGrid.tsx +++ b/src/reactviews/pages/QueryResult/resultGrid.tsx @@ -53,11 +53,63 @@ export interface ResultGridHandle { const ResultGrid = forwardRef((props: ResultGridProps, ref) => { const tableRef = useRef | null>(null); + const gridContainerRef = useRef(null); const context = useContext(QueryResultCommandsContext); if (!context) { return undefined; } + // Helper to get selected columns from the grid selection + const getSelectedColumns = () => { + if (!tableRef.current) return []; + const ranges = tableRef.current.getSelectedRanges(); + const columns: Set = new Set(); + ranges.forEach((range) => { + for (let c = range.fromCell; c <= range.toCell; c++) { + columns.add(c); + } + }); + // Skip row selector column (usually index 0) + return Array.from(columns).filter((idx) => idx > 0); + }; + + // Resize selected columns by delta px + const resizeSelectedColumns = (delta: number) => { + if (!tableRef.current) return; + const grid = tableRef.current.grid; + const columns = grid.getColumns(); + const selectedCols = getSelectedColumns(); + let changed = false; + selectedCols.forEach((colIdx) => { + const col = columns[colIdx]; + if (col && col.width) { + col.width = Math.max(40, Math.min(col.width + delta, 800)); + changed = true; + } + }); + if (changed) { + grid.setColumns(columns); + grid.render(); + } + }; + + // Wheel event handler for CTRL + scroll + useEffect(() => { + const gridDiv = gridContainerRef.current; + if (!gridDiv) return; + const wheelHandler = (event: WheelEvent) => { + if (event.ctrlKey && getSelectedColumns().length > 0) { + event.preventDefault(); + if (event.deltaY < 0) { + resizeSelectedColumns(20); // Expand + } else if (event.deltaY > 0) { + resizeSelectedColumns(-20); // Contract + } + } + }; + gridDiv.addEventListener("wheel", wheelHandler, { passive: false }); + return () => gridDiv.removeEventListener("wheel", wheelHandler); + }, [tableRef.current]); const inMemoryDataProcessingThreshold = useQueryResultSelector( (state) => state.inMemoryDataProcessingThreshold, @@ -66,7 +118,6 @@ const ResultGrid = forwardRef((props: ResultG const autoSizeColumns = useQueryResultSelector((state) => state.autoSizeColumns); const { themeKind } = useVscodeWebview2(); - const gridContainerRef = useRef(null); const isTableCreated = useRef(false); if (!props.gridParentRef) { return undefined; From 12e88d88a5a9c8fdb4ea682cbbfc20bd40733732 Mon Sep 17 00:00:00 2001 From: Sam Gusick Date: Wed, 24 Sep 2025 10:26:44 -0400 Subject: [PATCH 2/2] removed max column size when resizing --- src/reactviews/pages/QueryResult/resultGrid.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/reactviews/pages/QueryResult/resultGrid.tsx b/src/reactviews/pages/QueryResult/resultGrid.tsx index b57169740b..fddd41c2e1 100644 --- a/src/reactviews/pages/QueryResult/resultGrid.tsx +++ b/src/reactviews/pages/QueryResult/resultGrid.tsx @@ -83,7 +83,7 @@ const ResultGrid = forwardRef((props: ResultG selectedCols.forEach((colIdx) => { const col = columns[colIdx]; if (col && col.width) { - col.width = Math.max(40, Math.min(col.width + delta, 800)); + col.width = Math.max(40, col.width + delta); changed = true; } });