From cf36dfb20b8d6e46687145965c95ffccdbf0546d Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Fri, 12 Jun 2026 19:32:03 +0200 Subject: [PATCH] DataGrid fix for column resizing --- .env | 3 +- .env.example | 3 +- .gitignore | 4 +- src/components/table/DataGrid.tsx | 78 +- src/components/table/DataGrid.tsx.old | 730 ------------------ src/features/files/FilesPage.tsx | 64 +- .../components/FileManagerComponents.tsx | 22 +- src/main.tsx | 1 + src/styles/campaign-workspace.css | 713 ----------------- src/styles/file-manager.css | 711 +++++++++++++++++ 10 files changed, 849 insertions(+), 1480 deletions(-) delete mode 100644 src/components/table/DataGrid.tsx.old create mode 100644 src/styles/file-manager.css diff --git a/.env b/.env index 49f4964..f25c0b3 100644 --- a/.env +++ b/.env @@ -2,7 +2,8 @@ VITE_API_BASE_URL=http://127.0.0.1:8000 # Web UI WEBUI_PUBLISHED_PORT=5173 -VITE_API_BASE_URL=/api/v1 +# API base url without /api/v1 or similar parts +VITE_API_BASE_URL= # For local Vite development outside Docker: VITE_DEV_API_PROXY_TARGET=http://127.0.0.1:8000 CORS_ORIGINS=http://localhost:5173,http://127.0.0.1:5173,http://localhost:8080 diff --git a/.env.example b/.env.example index d4554eb..d8d6202 100644 --- a/.env.example +++ b/.env.example @@ -2,7 +2,8 @@ VITE_API_BASE_URL=http://127.0.0.1:8000 # Web UI WEBUI_PUBLISHED_PORT=5173 -VITE_API_BASE_URL=/api/v1 +# API base url without /api/v1 or similar parts +VITE_API_BASE_URL= # For local Vite development outside Docker: # VITE_DEV_API_PROXY_TARGET=http://127.0.0.1:8000 CORS_ORIGINS=http://localhost:5173,http://127.0.0.1:5173,http://localhost:8080 diff --git a/.gitignore b/.gitignore index 1739f90..8e26f1f 100644 --- a/.gitignore +++ b/.gitignore @@ -424,4 +424,6 @@ bin-release/ multisealmail-*.zip multi-seal-mail-*.zip -multi-seal-mail-webui*.tar.gz \ No newline at end of file +multi-seal-mail-webui*.tar.gz + +.env diff --git a/src/components/table/DataGrid.tsx b/src/components/table/DataGrid.tsx index a0d5e3e..95509cc 100644 --- a/src/components/table/DataGrid.tsx +++ b/src/components/table/DataGrid.tsx @@ -75,6 +75,7 @@ export default function DataGrid({ startWidth: number; baseWidths: Record; fillColumnId?: string; + fillStartWidth?: number; } | null>(null); const [openFilterColumnId, setOpenFilterColumnId] = useState(null); const [filterPosition, setFilterPosition] = useState(null); @@ -144,10 +145,30 @@ export default function DataGrid({ const column = columns.find((item) => item.id === activeResize.columnId); const minWidth = column?.minWidth ?? 80; const maxWidth = column?.maxWidth ?? 2000; - const nextWidth = Math.min(maxWidth, Math.max(minWidth, activeResize.startWidth + event.clientX - activeResize.startX)); + const rawDelta = event.clientX - activeResize.startX; + const fillColumn = activeResize.fillColumnId + ? columns.find((item) => item.id === activeResize.fillColumnId) + : undefined; + const nextWidths = { ...activeResize.baseWidths }; + + if (fillColumn && fillColumn.id !== activeResize.columnId) { + const fillMinWidth = fillColumn.minWidth ?? 80; + const fillMaxWidth = fillColumn.maxWidth ?? 2000; + const fillStartWidth = activeResize.fillStartWidth + ?? activeResize.baseWidths[fillColumn.id] + ?? columnPixelWidth(fillColumn, activeResize.baseWidths[fillColumn.id], measuredWidths[fillColumn.id]); + const minDelta = Math.max(minWidth - activeResize.startWidth, fillStartWidth - fillMaxWidth); + const maxDelta = Math.min(maxWidth - activeResize.startWidth, fillStartWidth - fillMinWidth); + const boundedDelta = Math.min(maxDelta, Math.max(minDelta, rawDelta)); + nextWidths[activeResize.columnId] = activeResize.startWidth + boundedDelta; + nextWidths[fillColumn.id] = fillStartWidth - boundedDelta; + } else { + nextWidths[activeResize.columnId] = Math.min(maxWidth, Math.max(minWidth, activeResize.startWidth + rawDelta)); + } + setState((current) => ({ ...current, - widths: { ...activeResize.baseWidths, [activeResize.columnId]: nextWidth }, + widths: nextWidths, fillColumnId: activeResize.fillColumnId })); } @@ -315,8 +336,19 @@ export default function DataGrid({ const baseWidths = measuredColumnWidths(columns, headerCellRefs.current, state.widths, measuredWidths); const currentWidth = baseWidths[column.id] ?? columnPixelWidth(column, state.widths?.[column.id], measuredWidths[column.id]); const fillColumnId = chooseResizeFillColumn(columns, column.id); + const fillColumn = fillColumnId ? columns.find((item) => item.id === fillColumnId) : undefined; + const fillStartWidth = fillColumn + ? baseWidths[fillColumn.id] ?? columnPixelWidth(fillColumn, state.widths?.[fillColumn.id], measuredWidths[fillColumn.id]) + : undefined; setState((current) => ({ ...current, widths: { ...baseWidths }, fillColumnId })); - setResizeState({ columnId: column.id, startX: event.clientX, startWidth: currentWidth, baseWidths, fillColumnId }); + setResizeState({ + columnId: column.id, + startX: event.clientX, + startWidth: currentWidth, + baseWidths, + fillColumnId, + fillStartWidth + }); }} >