diff --git a/flowsint-app/src/components/graphs/index.tsx b/flowsint-app/src/components/graphs/index.tsx
index 82ce788..4c3ba0f 100644
--- a/flowsint-app/src/components/graphs/index.tsx
+++ b/flowsint-app/src/components/graphs/index.tsx
@@ -133,7 +133,7 @@ const GraphPanel = ({ graphData, isLoading }: GraphPanelProps) => {
}
>
<>
- {view === 'graph' && }
+ {['force', 'hierarchy'].includes(view) && }
{view === 'table' && }
{view === 'map' && }
{view === 'relationships' && }
diff --git a/flowsint-app/src/components/graphs/toolbar.tsx b/flowsint-app/src/components/graphs/toolbar.tsx
index 82ed78a..d545c43 100644
--- a/flowsint-app/src/components/graphs/toolbar.tsx
+++ b/flowsint-app/src/components/graphs/toolbar.tsx
@@ -48,7 +48,7 @@ export const ToolbarButton = memo(function ToolbarButton({
variant="outline"
size="icon"
className={cn(
- 'h-8 w-8 relative shadow-none bg-card',
+ 'h-8 w-8 relative shadow-none',
toggled &&
'bg-primary/30 border-primary text-primary hover:bg-primary/40 hover:text-primary'
)}
@@ -69,8 +69,6 @@ export const ToolbarButton = memo(function ToolbarButton({
export const Toolbar = memo(function Toolbar({ isLoading }: { isLoading: boolean }) {
const view = useGraphControls((s) => s.view)
const setView = useGraphControls((s) => s.setView)
- const layoutMode = useGraphControls((s) => s.layoutMode)
- const setLayoutMode = useGraphControls((s) => s.setLayoutMode)
const zoomToFit = useGraphControls((s) => s.zoomToFit)
const zoomIn = useGraphControls((s) => s.zoomIn)
const zoomOut = useGraphControls((s) => s.zoomOut)
@@ -89,36 +87,30 @@ export const Toolbar = memo(function Toolbar({ isLoading }: { isLoading: boolean
} catch (error) {
toast.error('Failed to refresh graph data')
}
- }, [refetchGraph])
+ }, [refetchGraph, onLayout])
- // View handlers
- const handleGraphView = useCallback(() => {
- setView('graph')
- }, [setView])
+ const handleForceLayout = useCallback(() => {
+ setView('force')
+ setTimeout(() => zoomToFit(), 500)
+ }, [setView, zoomToFit])
- const handleTableView = useCallback(() => {
+ const handleTableLayout = useCallback(() => {
setView('table')
}, [setView])
- const handleMapView = useCallback(() => {
+ const handleMapLayout = useCallback(() => {
setView('map')
}, [setView])
- const handleRelationshipsView = useCallback(() => {
+ const handleRelationshipsLayout = useCallback(() => {
setView('relationships')
}, [setView])
- // Layout handlers (only active when in graph view)
- const handleForceLayout = useCallback(() => {
- setLayoutMode('force')
- setTimeout(() => zoomToFit(), 500)
- }, [setLayoutMode, zoomToFit])
-
- const handleDagreLayout = useCallback(() => {
- setLayoutMode('dagre')
+ const handleDagreLayoutTB = useCallback(() => {
+ setView('hierarchy')
onLayout && onLayout('dagre-tb')
setTimeout(() => zoomToFit(), 200)
- }, [onLayout, setLayoutMode, zoomToFit])
+ }, [onLayout, setView, zoomToFit])
const handleOpenAddRelationDialog = useCallback(() => {
setOpenAddRelationDialog(true)
@@ -141,8 +133,8 @@ export const Toolbar = memo(function Toolbar({ isLoading }: { isLoading: boolean
)
return (
- <>
-
+
+
}
@@ -162,26 +154,26 @@ export const Toolbar = memo(function Toolbar({ isLoading }: { isLoading: boolean
icon={}
tooltip="Zoom In"
onClick={zoomIn}
- disabled={view !== 'graph' || isLassoActive}
+ disabled={!['force', 'hierarchy'].includes(view) || isLassoActive}
/>
}
tooltip="Zoom Out"
onClick={zoomOut}
- disabled={view !== 'graph' || isLassoActive}
+ disabled={!['force', 'hierarchy'].includes(view) || isLassoActive}
/>
}
tooltip="Fit to View"
onClick={zoomToFit}
- disabled={view !== 'graph' || isLassoActive}
+ disabled={!['force', 'hierarchy'].includes(view) || isLassoActive}
/>
}
tooltip={'Lasso select'}
onClick={handleLassoSelect}
toggled={isLassoActive}
- disabled={view !== 'graph'}
+ disabled={!['force', 'hierarchy'].includes(view)}
/>
-
+
- {/* Layout buttons - only visible when in graph view */}
- {view === 'graph' && (
- <>
- }
- tooltip="Dagre Layout"
- toggled={layoutMode === 'dagre'}
- onClick={handleDagreLayout}
- />
- }
- tooltip="Force Layout"
- toggled={layoutMode === 'force'}
- onClick={handleForceLayout}
- />
- >
- )}
-
- {/* View buttons */}
+ }
+ tooltip={`Hierarchy`}
+ toggled={['hierarchy'].includes(view)}
+ onClick={handleDagreLayoutTB}
+ />
}
- tooltip="Graph view"
- toggled={view === 'graph'}
- onClick={handleGraphView}
+ tooltip={'Graph view'}
+ toggled={['force'].includes(view)}
+ onClick={handleForceLayout}
/>
}
- tooltip="Table view"
- toggled={view === 'table'}
- onClick={handleTableView}
+ tooltip={'Table view'}
+ toggled={['table'].includes(view)}
+ onClick={handleTableLayout}
/>
}
- tooltip="Relationships view"
- toggled={view === 'relationships'}
- onClick={handleRelationshipsView}
+ tooltip={'Relationships view'}
+ toggled={['relationships'].includes(view)}
+ onClick={handleRelationshipsLayout}
/>
}
- tooltip="Map view"
- toggled={view === 'map'}
- onClick={handleMapView}
+ tooltip={'Map view'}
+ toggled={['map'].includes(view)}
+ onClick={handleMapLayout}
/>
- >
+
)
-})
+})
\ No newline at end of file
diff --git a/flowsint-app/src/stores/graph-controls-store.ts b/flowsint-app/src/stores/graph-controls-store.ts
index ab7f5b9..e6d956d 100644
--- a/flowsint-app/src/stores/graph-controls-store.ts
+++ b/flowsint-app/src/stores/graph-controls-store.ts
@@ -1,7 +1,7 @@
import { create } from 'zustand'
import { persist } from 'zustand/middleware'
-type ViewType = 'graph' | 'table' | 'map' | 'relationships'
+type ViewType = 'hierarchy' | 'force' | 'table' | 'map' | 'relationships'
type LayoutMode = 'none' | 'force' | 'dagre'
type GraphControlsStore = {
@@ -22,15 +22,15 @@ type GraphControlsStore = {
export const useGraphControls = create
()(
persist(
(set) => ({
- view: 'graph',
+ view: 'force',
layoutMode: 'none',
isLassoActive: false,
- zoomToFit: () => {},
- zoomIn: () => {},
- zoomOut: () => {},
- onLayout: () => {},
+ zoomToFit: () => { },
+ zoomIn: () => { },
+ zoomOut: () => { },
+ onLayout: () => { },
setActions: (actions) => set(actions),
- refetchGraph: () => {},
+ refetchGraph: () => { },
setView: (view) => set({ view }),
setLayoutMode: (mode) => set({ layoutMode: mode }),
setIsLassoActive: (active) => set({ isLassoActive: active })