From 8e4c3b9b325920b06e207c343ea77d88b7bb765f Mon Sep 17 00:00:00 2001 From: Nuri Lacka Date: Tue, 6 Jan 2026 11:31:14 +0100 Subject: [PATCH 01/21] fix(ui): prevent text overflow for long paths in DataLake components - Added `wordBreak: 'break-all'` and `overflowWrap: 'anywhere'` to Typography components displaying file paths and connection strings. - Fixed layout issues caused by long text in: - DataLakeInstanceDetails (Data Path, Metadata Path, Host, Temp Directory) - DataLakeTableDetails (Table Path, Data File Paths) - DataLakeInstances (Data Path column in the list view) - DataLakeConnectionWizard (Location in the review step) --- .../dataLake/DataLakeConnectionWizard.tsx | 6 +++ .../dataLake/DataLakeInstanceDetails.tsx | 40 ++++++++++++++++--- .../components/dataLake/DataLakeInstances.tsx | 4 +- .../dataLake/DataLakeTableDetails.tsx | 29 ++++++++++++-- 4 files changed, 69 insertions(+), 10 deletions(-) diff --git a/src/renderer/components/dataLake/DataLakeConnectionWizard.tsx b/src/renderer/components/dataLake/DataLakeConnectionWizard.tsx index 267152b..d685f6d 100644 --- a/src/renderer/components/dataLake/DataLakeConnectionWizard.tsx +++ b/src/renderer/components/dataLake/DataLakeConnectionWizard.tsx @@ -1811,6 +1811,12 @@ export const DataLakeConnectionWizard: React.FC< {wizardData.basics?.description && ( diff --git a/src/renderer/components/dataLake/DataLakeInstanceDetails.tsx b/src/renderer/components/dataLake/DataLakeInstanceDetails.tsx index c90e5d3..4c0bb9e 100644 --- a/src/renderer/components/dataLake/DataLakeInstanceDetails.tsx +++ b/src/renderer/components/dataLake/DataLakeInstanceDetails.tsx @@ -409,7 +409,11 @@ export const DataLakeInstanceDetails: React.FC< primary="Storage Path" secondary={healthQuery.data.storageLocation} secondaryTypographyProps={{ - sx: { fontFamily: 'monospace' }, + sx: { + fontFamily: 'monospace', + wordBreak: 'break-all', + overflowWrap: 'anywhere', + }, }} /> @@ -525,7 +529,12 @@ export const DataLakeInstanceDetails: React.FC< primary="Data Path" secondary={instance.dataPath} secondaryTypographyProps={{ - sx: { fontFamily: 'monospace', fontSize: '0.875rem' }, + sx: { + fontFamily: 'monospace', + fontSize: '0.875rem', + wordBreak: 'break-all', + overflowWrap: 'anywhere', + }, }} /> @@ -582,7 +591,12 @@ export const DataLakeInstanceDetails: React.FC< primary="Metadata Path" secondary={instance.catalog.duckdb.metadataPath} secondaryTypographyProps={{ - sx: { fontFamily: 'monospace', fontSize: '0.875rem' }, + sx: { + fontFamily: 'monospace', + fontSize: '0.875rem', + wordBreak: 'break-all', + overflowWrap: 'anywhere', + }, }} /> @@ -593,7 +607,12 @@ export const DataLakeInstanceDetails: React.FC< primary="Metadata Path" secondary={instance.catalog.sqlite.metadataPath} secondaryTypographyProps={{ - sx: { fontFamily: 'monospace', fontSize: '0.875rem' }, + sx: { + fontFamily: 'monospace', + fontSize: '0.875rem', + wordBreak: 'break-all', + overflowWrap: 'anywhere', + }, }} /> @@ -605,6 +624,12 @@ export const DataLakeInstanceDetails: React.FC< @@ -698,7 +723,12 @@ export const DataLakeInstanceDetails: React.FC< {instance.runtime.tempDirectory || 'Default'} diff --git a/src/renderer/components/dataLake/DataLakeInstances.tsx b/src/renderer/components/dataLake/DataLakeInstances.tsx index 8da5f5b..4536cd5 100644 --- a/src/renderer/components/dataLake/DataLakeInstances.tsx +++ b/src/renderer/components/dataLake/DataLakeInstances.tsx @@ -212,7 +212,9 @@ export const DataLakeInstances: React.FC = ({ variant="outlined" /> - + { Path - - {tableDetails.path} - {tableDetails.pathIsRelative && ' (relative)'} + + + {tableDetails.path} + + {tableDetails.pathIsRelative && ( + + (relative) + + )} )} @@ -458,7 +475,11 @@ export const DataLakeTableDetails: React.FC = () => { {file.path} From 16d7136bade259132d6ec583791487fa29318e02 Mon Sep 17 00:00:00 2001 From: Nuri Lacka Date: Tue, 6 Jan 2026 12:10:23 +0100 Subject: [PATCH 02/21] refactor(datalake): implement "Refresh" functionality in DataLake and consolidate instance types - Implement "Refresh" functionality in DataLake details to manually invalidate cache for tables and health status. - Centralize [DuckLakeInstance] interface in [src/types/duckLake.ts] and merge hydrated UI properties (health, stats). - Refactor [DataLakeInstanceDetails] and [DataLakeSidebar] to use the shared central interface. - Standardize runtime configuration access to handle both `runtime` and `runtimeOptions` properties. --- .../dataLake/DataLakeInstanceDetails.tsx | 82 ++++++++----------- .../components/dataLake/DataLakeSidebar.tsx | 8 +- .../components/dataLake/DataLakeTables.tsx | 2 +- src/types/duckLake.ts | 14 +++- 4 files changed, 48 insertions(+), 58 deletions(-) diff --git a/src/renderer/components/dataLake/DataLakeInstanceDetails.tsx b/src/renderer/components/dataLake/DataLakeInstanceDetails.tsx index 4c0bb9e..9aa3492 100644 --- a/src/renderer/components/dataLake/DataLakeInstanceDetails.tsx +++ b/src/renderer/components/dataLake/DataLakeInstanceDetails.tsx @@ -1,4 +1,5 @@ import React, { useState } from 'react'; +import { useQueryClient } from 'react-query'; import { Box, Typography, @@ -36,6 +37,7 @@ import { Security, Speed, Memory, + Refresh, } from '@mui/icons-material'; import { useNavigate } from 'react-router-dom'; import moment from 'moment'; @@ -47,50 +49,9 @@ import { import { useRefreshDuckLakeInstanceHealth, useDuckLakeInstanceHealth, + duckLakeKeys, } from '../../controllers/duckLake.controller'; -import { DuckLakeStorageConfig } from '../../../types/duckLake'; - -interface DuckLakeInstance { - id: string; - name: string; - status: 'active' | 'inactive' | 'error'; - dataPath: string; - storage?: DuckLakeStorageConfig; - catalog: { - type: 'duckdb' | 'sqlite' | 'postgresql'; - duckdb?: { metadataPath: string }; - sqlite?: { metadataPath: string }; - postgresql?: { - host: string; - port: number; - database: string; - username: string; - ssl: boolean; - }; - }; - runtime?: { - maxMemory?: string; - threads?: number; - enableOptimizer?: boolean; - tempDirectory?: string; - }; - createdAt: string; - updatedAt: string; - description?: string; - health?: { - catalogConnected: boolean; - dataPathAccessible: boolean; - extensionLoaded: boolean; - lastChecked: string; - error?: string; - }; - stats?: { - tableCount: number; - totalSize: number; - lastQuery: string; - queryCount: number; - }; -} +import { DuckLakeInstance } from '../../../types/duckLake'; interface DuckLakeInstanceDetailsProps { instance: DuckLakeInstance; @@ -103,6 +64,7 @@ export const DataLakeInstanceDetails: React.FC< DuckLakeInstanceDetailsProps > = ({ instance, onEdit, onDelete, isLoading = false }) => { const navigate = useNavigate(); + const queryClient = useQueryClient(); const [currentTab, setCurrentTab] = useState(0); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); @@ -155,6 +117,13 @@ export const DataLakeInstanceDetails: React.FC< testConnectionMutation.mutate(instance.id); }; + const handleRefresh = () => { + // Invalidate tables and health status for this instance + queryClient.invalidateQueries(duckLakeKeys.tables(instance.id)); + queryClient.invalidateQueries(duckLakeKeys.instanceHealth(instance.id)); + queryClient.invalidateQueries(duckLakeKeys.instance(instance.id)); + }; + const isStorageHealthy = (value?: boolean) => typeof value !== 'boolean' || value; @@ -661,7 +630,7 @@ export const DataLakeInstanceDetails: React.FC< {/* Runtime Configuration */} - {instance.runtime && ( + {(instance.runtime || instance.runtimeOptions) && ( - {instance.runtime.maxMemory || 'Default'} + {instance.runtime?.maxMemory || + instance.runtimeOptions?.maxMemory || + 'Default'} @@ -694,7 +665,9 @@ export const DataLakeInstanceDetails: React.FC< Threads - {instance.runtime.threads || 'Auto'} + {instance.runtime?.threads || + instance.runtimeOptions?.threads || + 'Auto'} @@ -707,7 +680,8 @@ export const DataLakeInstanceDetails: React.FC< Optimizer - {instance.runtime.enableOptimizer + {instance.runtime?.enableOptimizer || + instance.runtimeOptions?.enableOptimizer ? 'Enabled' : 'Disabled'} @@ -730,7 +704,9 @@ export const DataLakeInstanceDetails: React.FC< overflowWrap: 'anywhere', }} > - {instance.runtime.tempDirectory || 'Default'} + {instance.runtime?.tempDirectory || + instance.runtimeOptions?.tempDirectory || + 'Default'} @@ -769,11 +745,19 @@ export const DataLakeInstanceDetails: React.FC< {instance.name} - DuckLake Instance • {instance.catalog.type.toUpperCase()} Catalog + DataLake Instance • {instance.catalog.type.toUpperCase()} Catalog +