From 04080fd88bbb3d6f1663a96f6289b1e4a729b8ae Mon Sep 17 00:00:00 2001 From: 2427021 <s.a.vink@students.uu.nl> Date: Tue, 26 Mar 2024 13:36:53 +0100 Subject: [PATCH] feat(visManager): folder structure --- apps/web/src/app/app.tsx | 2 +- libs/shared/lib/data-viewer/settings.tsx | 38 ------------------- libs/shared/lib/vis/bar.tsx | 7 ++-- libs/shared/lib/vis/configuration/index.tsx | 5 ++- libs/shared/lib/vis/manager/index.ts | 2 + libs/shared/lib/vis/{ => manager}/manager.tsx | 35 ++++++++--------- libs/shared/lib/vis/manager/manager.types.tsx | 12 ++++++ libs/shared/lib/vis/types.ts | 2 +- libs/shared/lib/vis/visualizationPanel.tsx | 5 ++- 9 files changed, 42 insertions(+), 66 deletions(-) delete mode 100644 libs/shared/lib/data-viewer/settings.tsx create mode 100644 libs/shared/lib/vis/manager/index.ts rename libs/shared/lib/vis/{ => manager}/manager.tsx (79%) create mode 100644 libs/shared/lib/vis/manager/manager.types.tsx diff --git a/apps/web/src/app/app.tsx b/apps/web/src/app/app.tsx index ad0430f42..658460021 100644 --- a/apps/web/src/app/app.tsx +++ b/apps/web/src/app/app.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useRef, useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { useAppDispatch, useAuthorizationCache, diff --git a/libs/shared/lib/data-viewer/settings.tsx b/libs/shared/lib/data-viewer/settings.tsx deleted file mode 100644 index 999092997..000000000 --- a/libs/shared/lib/data-viewer/settings.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import React from 'react'; -import { Button } from '../components'; -import { Delete } from '@mui/icons-material'; -import Input from '../components/inputs'; - -type Props = {}; - -export default function Settings({ manager }: { manager: any }) { - return ( - <div className=""> - <div className="border-b border-secondary-200 py-2"> - <div className="flex justify-between items-center px-4 py-2"> - <span className="text-xs font-bold">Visualisation</span> - <Button - type="secondary" - variant="ghost" - size="xs" - iconComponent={<Delete />} - onClick={() => { - manager.deleteVisualization(manager.active); - }} - /> - </div> - <div className="flex justify-between items-center px-4 py-1"> - <span className="text-xs font-normal">Type</span> - <div className="w-36"> - <Input type="dropdown" size="xs" options={[]} value={manager.activeType} onChange={() => {}} /> - </div> - </div> - <div className="flex justify-between items-center px-4 py-1"> - <span className="text-xs font-normal">Name</span> - <input type="text" className="border rouded w-36" value={manager.active} onChange={() => {}} /> - </div> - </div> - {manager.renderSettings()} - </div> - ); -} diff --git a/libs/shared/lib/vis/bar.tsx b/libs/shared/lib/vis/bar.tsx index 6b3db8716..717bdc158 100644 --- a/libs/shared/lib/vis/bar.tsx +++ b/libs/shared/lib/vis/bar.tsx @@ -2,17 +2,16 @@ import React, { useState } from 'react'; import { Button } from '../components'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../components/tooltip'; import * as DropdownMenu from '@radix-ui/react-dropdown-menu'; -import { Add, Close, Fullscreen, SettingsInputComponent } from '@mui/icons-material'; +import { Add, Close, Fullscreen } from '@mui/icons-material'; import ControlContainer from '../components/controls'; -import { Visualizations } from './manager'; +import { Visualizations, VisualizationManager } from './manager'; type Props = { - manager: any; + manager: VisualizationManager; }; export default function VisualizationBar({ manager }: Props) { const [visDropdownOpen, setVisDropdownOpen] = useState<boolean>(false); - const [showVisSettings, setShowVisSettings] = useState<boolean>(false); const handleDragStart = (e: React.DragEvent<HTMLDivElement>, visId: string) => { e.dataTransfer.setData('text/plain', visId); diff --git a/libs/shared/lib/vis/configuration/index.tsx b/libs/shared/lib/vis/configuration/index.tsx index 8ec320447..f2012382b 100644 --- a/libs/shared/lib/vis/configuration/index.tsx +++ b/libs/shared/lib/vis/configuration/index.tsx @@ -2,9 +2,10 @@ import React from 'react'; import { Button } from '../../components'; import { Delete } from '@mui/icons-material'; import Input from '../../components/inputs'; +import { VisualizationManager } from '../manager'; type Props = { - manager: any; + manager: VisualizationManager; }; export default function ConfigPanel({ manager }: Props) { @@ -19,7 +20,7 @@ export default function ConfigPanel({ manager }: Props) { size="xs" iconComponent={<Delete />} onClick={() => { - manager.deleteVisualization(manager.active); + if (manager.active) manager.deleteVisualization(manager.active); }} /> </div> diff --git a/libs/shared/lib/vis/manager/index.ts b/libs/shared/lib/vis/manager/index.ts new file mode 100644 index 000000000..4f183c187 --- /dev/null +++ b/libs/shared/lib/vis/manager/index.ts @@ -0,0 +1,2 @@ +export type { VisualizationManager } from './manager.types'; +export { useVisualizationManager, Visualizations } from './manager'; diff --git a/libs/shared/lib/vis/manager.tsx b/libs/shared/lib/vis/manager/manager.tsx similarity index 79% rename from libs/shared/lib/vis/manager.tsx rename to libs/shared/lib/vis/manager/manager.tsx index 73bc6bedd..67f4a08fe 100644 --- a/libs/shared/lib/vis/manager.tsx +++ b/libs/shared/lib/vis/manager/manager.tsx @@ -1,6 +1,11 @@ import React, { useState, useEffect } from 'react'; -import { VISComponentType, VisualizationConfiguration } from './types'; -import { removeVisualization, reorderVisState, setActiveVisualization, updateVisualization } from '../data-access/store/visualizationSlice'; +import { VISComponentType, VisualizationConfiguration } from '../types'; +import { + removeVisualization, + reorderVisState, + setActiveVisualization, + updateVisualization, +} from '../../data-access/store/visualizationSlice'; import { useAppDispatch, useGraphQueryResult, @@ -9,20 +14,19 @@ import { useSchemaGraph, useSessionCache, useVisualization, -} from '../data-access'; +} from '../../data-access'; +import { VisualizationManager } from './manager.types'; export const Visualizations: Record<string, Function> = { - TableVis: () => import('./visualizations/tablevis/tablevis'), - PaohVis: () => import('./visualizations/paohvis/paohvis'), - RawJSONVis: () => import('./visualizations/rawjsonvis/rawjsonvis'), - NodeLinkVis: () => import('./visualizations/nodelinkvis/nodelinkvis'), + TableVis: () => import('../visualizations/tablevis/tablevis'), + PaohVis: () => import('../visualizations/paohvis/paohvis'), + RawJSONVis: () => import('../visualizations/rawjsonvis/rawjsonvis'), + NodeLinkVis: () => import('../visualizations/nodelinkvis/nodelinkvis'), // MapVis: () => import('./visualizations/mapvis/mapvis'), - MatrixVis: () => import('./visualizations/matrixvis/matrixvis'), + MatrixVis: () => import('../visualizations/matrixvis/matrixvis'), }; -const INITIAL_VISUALIZATIONS = ['NodeLinkVis', 'PaohVis']; - -export const useVisualizationManager = () => { +export const useVisualizationManager = (): VisualizationManager => { const dispatch = useAppDispatch(); const session = useSessionCache(); const ml = useML(); @@ -37,8 +41,7 @@ export const useVisualizationManager = () => { const [selected, setSelected] = useState<any>(); const activeType = visualizations[active]?.displayName; - const firstRender = !active && !session.currentSaveState; - const tabs = Object.keys(visualizations).length ? Object.keys(visualizations) : INITIAL_VISUALIZATIONS; + const tabs = Object.keys(visualizations).length ? Object.keys(visualizations) : []; useEffect(() => { loadVisualization(); @@ -60,12 +63,6 @@ export const useVisualizationManager = () => { } }; - useEffect(() => { - if (firstRender) { - dispatch(setActiveVisualization(INITIAL_VISUALIZATIONS[0])); - } - }, [active, dispatch]); - const changeActive = (id: string) => { dispatch(setActiveVisualization(id)); }; diff --git a/libs/shared/lib/vis/manager/manager.types.tsx b/libs/shared/lib/vis/manager/manager.types.tsx new file mode 100644 index 000000000..f53318a09 --- /dev/null +++ b/libs/shared/lib/vis/manager/manager.types.tsx @@ -0,0 +1,12 @@ +import React from 'react'; + +export interface VisualizationManager { + renderComponent: () => React.ReactNode; + renderSettings: () => React.ReactNode; + active: string | undefined; + activeType: string | undefined; + tabs: string[]; + changeActive: (id: string) => void; + reorderVisualizations: (args: { draggedVisId: string; dropVisId: string }) => void; + deleteVisualization: (id: string) => void; +} diff --git a/libs/shared/lib/vis/types.ts b/libs/shared/lib/vis/types.ts index 6f174b786..1f91885dd 100644 --- a/libs/shared/lib/vis/types.ts +++ b/libs/shared/lib/vis/types.ts @@ -3,7 +3,7 @@ import { ML } from '../data-access/store/mlSlice'; import { SchemaGraph } from '../schema'; import type { AppDispatch } from '../data-access'; import { FC } from 'react'; -import { Visualizations } from './manager'; +import { Visualizations } from './manager/manager'; export type VisualizationConfiguration = { [id: string]: any }; diff --git a/libs/shared/lib/vis/visualizationPanel.tsx b/libs/shared/lib/vis/visualizationPanel.tsx index 70d6086dc..47e507b6c 100644 --- a/libs/shared/lib/vis/visualizationPanel.tsx +++ b/libs/shared/lib/vis/visualizationPanel.tsx @@ -2,8 +2,9 @@ import React, { useState, useRef, useEffect } from 'react'; import { useAppDispatch, useGraphQueryResult, useQuerybuilderGraph, useVisualization } from '@graphpolaris/shared/lib/data-access'; import { LoadingSpinner } from '@graphpolaris/shared/lib/components/LoadingSpinner'; import VisualizationBar from './bar'; +import { VisualizationManager } from './manager'; -export const VisualizationPanel = ({ manager }: { manager: any }) => { +export const VisualizationPanel = ({ manager }: { manager: VisualizationManager }) => { const query = useQuerybuilderGraph(); const graphQueryResult = useGraphQueryResult(); const visDropdownRef = useRef<HTMLDivElement>(null); @@ -31,6 +32,8 @@ export const VisualizationPanel = ({ manager }: { manager: any }) => { <p>No data available to be shown</p> {query.nodes.length > 0 ? <p>Query resulted in empty dataset</p> : <p>Query for data to visualize</p>} </div> + ) : manager.tabs.length === 0 ? ( + <div>Choose vis</div> ) : ( <div className="w-full h-full">{manager.renderComponent()}</div> )} -- GitLab