From bf98e4e4baaea1b920a505e39768b8c91022b38a Mon Sep 17 00:00:00 2001 From: Christian Vidal Wolf Date: Wed, 22 Apr 2026 17:09:46 +0200 Subject: [PATCH] UI: Add resizable columns to Matrix View. Users can now adjust column widths by dragging, improving data visibility in the All Data view. --- src/components/MatrixView.tsx | 37 +++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/src/components/MatrixView.tsx b/src/components/MatrixView.tsx index 661f21d..3f47ade 100644 --- a/src/components/MatrixView.tsx +++ b/src/components/MatrixView.tsx @@ -66,6 +66,8 @@ export function MatrixView({ data, headers, rowStatuses }: MatrixViewProps) { return filteredData.slice(start, start + pageSize); }, [filteredData, page, pageSize]); + const [columnWidths, setColumnWidths] = useState>({}); + const handleSort = (col: number) => { if (sortCol === col) { setSortDesc(!sortDesc); @@ -75,6 +77,25 @@ export function MatrixView({ data, headers, rowStatuses }: MatrixViewProps) { } }; + const handleResize = (colIndex: number, e: React.MouseEvent) => { + e.preventDefault(); + const startX = e.pageX; + const startWidth = columnWidths[colIndex] || 150; + + const onMouseMove = (moveEvent: MouseEvent) => { + const newWidth = Math.max(60, startWidth + (moveEvent.pageX - startX)); + setColumnWidths(prev => ({ ...prev, [colIndex]: newWidth })); + }; + + const onMouseUp = () => { + window.removeEventListener('mousemove', onMouseMove); + window.removeEventListener('mouseup', onMouseUp); + }; + + window.addEventListener('mousemove', onMouseMove); + window.addEventListener('mouseup', onMouseUp); + }; + const getUniqueValues = (col: number) => { const values = data.map(r => String(r[col] || '')); return Array.from(new Set(values)).sort(); @@ -197,17 +218,18 @@ export function MatrixView({ data, headers, rowStatuses }: MatrixViewProps) {
- +
{headers.map((header, index) => (
handleSort(index)} > {header} @@ -229,6 +251,12 @@ export function MatrixView({ data, headers, rowStatuses }: MatrixViewProps) {
+ {/* Resizer handle */} +
handleResize(index, e)} + className="absolute right-0 top-0 bottom-0 w-1 cursor-col-resize hover:bg-blue-500/50 group-hover:bg-slate-700/50 transition-colors z-20" + /> + {openFilterCol === index && ( {formattedValue}