diff --git a/libs/shared/lib/vis/common/types.ts b/libs/shared/lib/vis/common/types.ts index d3eda36aafd15565fd9d191c0b2ac6d7ec8ab715..988ab9acdfa353db11527ce74ac4cc15556ce8f2 100644 --- a/libs/shared/lib/vis/common/types.ts +++ b/libs/shared/lib/vis/common/types.ts @@ -15,6 +15,7 @@ export type VisualizationSettingsType = { export type VISComponentType<T> = { displayName: keyof typeof Visualizations; + description: string; component: React.FC<VisualizationPropTypes<T>>; settingsComponent: FC<VisualizationSettingsPropTypes<T>>; settings: T; diff --git a/libs/shared/lib/vis/components/VisualizationPanel.tsx b/libs/shared/lib/vis/components/VisualizationPanel.tsx index 881dafbb61a549b4a030e4bd5cb4e624670ef15c..95a10c05b20fb47e5b68f5fd50958816c9bee0c1 100644 --- a/libs/shared/lib/vis/components/VisualizationPanel.tsx +++ b/libs/shared/lib/vis/components/VisualizationPanel.tsx @@ -27,10 +27,8 @@ type PromiseFunc = () => Promise<{ default: VISComponentType<any> }>; export const Visualizations: Record<string, PromiseFunc> = { TableVis: () => import('../visualizations/tablevis/tablevis'), PaohVis: () => import('../visualizations/paohvis/paohvis'), - // PaohVis: () => Promise.resolve({ default: Paohviz }), RawJSONVis: () => import('../visualizations/rawjsonvis/rawjsonvis'), NodeLinkVis: () => import('../visualizations/nodelinkvis/nodelinkvis'), - // NodeLinkVis: () => Promise.resolve({ default: NodeLinkComponent }), MatrixVis: () => import('../visualizations/matrixvis/matrixvis'), SemanticSubstratesVis: () => import('../visualizations/semanticsubstratesvis/semanticsubstratesvis'), MapVis: () => import('../visualizations/mapvis/mapvis'), diff --git a/libs/shared/lib/vis/views/Recommender.tsx b/libs/shared/lib/vis/views/Recommender.tsx index 1082b836ab356afffb14d095dea0c3d2d9b09143..74c7302989d7831e16321d98f71ea8954be4c727 100644 --- a/libs/shared/lib/vis/views/Recommender.tsx +++ b/libs/shared/lib/vis/views/Recommender.tsx @@ -1,17 +1,43 @@ -import React from 'react'; +import React, { useEffect, useState } from 'react'; import Info from '../../components/info'; import { addVisualization } from '../../data-access/store/visualizationSlice'; import { useAppDispatch } from '../../data-access'; import { Visualizations } from '../components/VisualizationPanel'; +type VisualizationDescription = { + name: string; + displayName: string; + description: string; +}; + export function Recommender() { const dispatch = useAppDispatch(); + const [visualizationDescriptions, setVisualizationDescriptions] = useState<VisualizationDescription[]>([]); + + useEffect(() => { + const loadVisualizations = async () => { + const descriptions = await Promise.all( + Object.keys(Visualizations).map(async (key) => { + const visualizationModule = await Visualizations[key](); + const { default: visualizationComponent } = visualizationModule; + return { + name: key, + displayName: visualizationComponent.displayName, + description: visualizationComponent.description, + }; + }), + ); + setVisualizationDescriptions(descriptions); + }; + + loadVisualizations(); + }, []); return ( <div className="p-4"> <span className="text-md">Select a visualization</span> <div className="grid grid-cols-3 gap-4 my-2"> - {Object.keys(Visualizations).map((name) => ( + {visualizationDescriptions.map(({ name, displayName, description }) => ( <div key={name} className="p-4 cursor-pointer border hover:bg-secondary-100" @@ -22,10 +48,12 @@ export function Recommender() { }} > <div className="flex items-center justify-between"> - <span className="text-sm font-semibold truncate">{name}</span> + <span className="text-sm font-semibold truncate">{displayName}</span> <Info tooltip="Here an explanation" placement="top" /> </div> - {/* <image src={image} /> */} + <div className="flex items-center justify-between"> + <span className="text-xs text-secondary-400 truncate">{description}</span> + </div> </div> ))} </div> diff --git a/libs/shared/lib/vis/visualizations/mapvis/mapvis.tsx b/libs/shared/lib/vis/visualizations/mapvis/mapvis.tsx index c4458e284b7c76b3d2ffb73eb693fb9630c89f2f..e6d90b7e23ab64148e85344118dcbbe854ecea6d 100644 --- a/libs/shared/lib/vis/visualizations/mapvis/mapvis.tsx +++ b/libs/shared/lib/vis/visualizations/mapvis/mapvis.tsx @@ -197,6 +197,7 @@ export const MapVis = ({ data, settings, handleSelect, graphMetadata }: Visualiz export const MapComponent: VISComponentType<MapProps> = { displayName: 'MapVis', + description: 'Geographical Features', component: MapVis, settingsComponent: MapSettings, settings: settings, diff --git a/libs/shared/lib/vis/visualizations/matrixvis/matrixvis.tsx b/libs/shared/lib/vis/visualizations/matrixvis/matrixvis.tsx index 3b92230346e7ef38613dd133925ca16e3f2e3fe8..8d9caf3e7c3fa77148b327eabd87c69e563d6d42 100644 --- a/libs/shared/lib/vis/visualizations/matrixvis/matrixvis.tsx +++ b/libs/shared/lib/vis/visualizations/matrixvis/matrixvis.tsx @@ -63,6 +63,7 @@ const MatrixSettings = ({ settings, updateSettings }: VisualizationSettingsPropT export const MatrixVisComponent: VISComponentType<MatrixVisProps> = { displayName: 'MatrixVis', + description: 'Overview & Details', component: MatrixVis, settingsComponent: MatrixSettings, settings: settings, diff --git a/libs/shared/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx b/libs/shared/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx index 4daa884911470b09db5daa4058e226ddb7267d54..928272c33093d29038816e82634a67fa60ea86e6 100644 --- a/libs/shared/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx +++ b/libs/shared/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx @@ -219,6 +219,7 @@ const NodelinkSettings = ({ settings, graphMetadata, updateSettings }: Visualiza export const NodeLinkComponent: VISComponentType<NodelinkVisProps> = { displayName: 'NodeLinkVis', + description: 'General Patterns and Connections', component: NodeLinkVis, settingsComponent: NodelinkSettings, settings: settings, diff --git a/libs/shared/lib/vis/visualizations/paohvis/paohvis.tsx b/libs/shared/lib/vis/visualizations/paohvis/paohvis.tsx index a643ea9d8d8780464de304569c5417b9d55e14d2..af58aef15126907863bef65d3810fe5af093fb66 100644 --- a/libs/shared/lib/vis/visualizations/paohvis/paohvis.tsx +++ b/libs/shared/lib/vis/visualizations/paohvis/paohvis.tsx @@ -859,26 +859,26 @@ export const PaohVis = ({ data, graphMetadata, schema, settings, updateSettings onWheel={onWheel} > <defs> - <pattern id="diagonal-lines" patternUnits="userSpaceOnUse" width="8" height="8"> - <rect width="8" height="8" fill="#eaeaea" /> - <path d="M0,0 L8,8 M-2,2 L2,-2 M6,10 L10,6" stroke="lightgray" strokeWidth="1" /> - </pattern> - </defs> - - <RowLabels - dataRows={informationRow} - rowHeight={settings.rowHeight} - yOffset={computedSizesSvg.colWidth} - rowLabelColumnWidth={widthTotalRowInformation} - classTopTextColumns={classTopTextColumns} - onMouseEnterRowLabels={onMouseEnterRowLabels} - onMouseLeaveRowLabels={onMouseLeaveRowLabels} - marginText={configPaohvis.marginText} - handleClickHeaderSorting={handleClickHeaderSorting} - sortState={sortingOrderRow} - headerState={previousHeaderRow} - configStyle={configStyle} - /> + <pattern id="diagonal-lines" patternUnits="userSpaceOnUse" width="8" height="8"> + <rect width="8" height="8" fill="#eaeaea" /> + <path d="M0,0 L8,8 M-2,2 L2,-2 M6,10 L10,6" stroke="lightgray" strokeWidth="1" /> + </pattern> + </defs> + + <RowLabels + dataRows={informationRow} + rowHeight={settings.rowHeight} + yOffset={computedSizesSvg.colWidth} + rowLabelColumnWidth={widthTotalRowInformation} + classTopTextColumns={classTopTextColumns} + onMouseEnterRowLabels={onMouseEnterRowLabels} + onMouseLeaveRowLabels={onMouseLeaveRowLabels} + marginText={configPaohvis.marginText} + handleClickHeaderSorting={handleClickHeaderSorting} + sortState={sortingOrderRow} + headerState={previousHeaderRow} + configStyle={configStyle} + /> <HyperEdgeRangesBlock dataModel={dataModel} @@ -893,15 +893,14 @@ export const PaohVis = ({ data, graphMetadata, schema, settings, updateSettings columnHeaderInformation={informationColumn} rowsMaxPerPage={configPaohvis.rowsMaxPerPage} configStyle={configStyle} - onMouseEnterHyperEdge={onMouseEnterHyperEdge} - onMouseLeaveHyperEdge={onMouseLeaveHyperEdge} - numRows={numRowsVisible} - sortState={sortingOrderColumn} - handleClickHeaderSorting={handleClickHeaderSortingColumns} - headerState={previousHeaderColumn} - /> - </svg> - + onMouseEnterHyperEdge={onMouseEnterHyperEdge} + onMouseLeaveHyperEdge={onMouseLeaveHyperEdge} + numRows={numRowsVisible} + sortState={sortingOrderColumn} + handleClickHeaderSorting={handleClickHeaderSortingColumns} + headerState={previousHeaderColumn} + /> + </svg> ); }; @@ -1090,6 +1089,7 @@ const PaohSettings = ({ settings, graphMetadata, updateSettings }: Visualization export const PaohVisComponent: VISComponentType<PaohVisProps> = { displayName: 'PaohVis', + description: 'Paths and Connection', component: PaohVis, settingsComponent: PaohSettings, settings: settings, diff --git a/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx b/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx index 461069b310306f3ba4f96982b553d62bff8febab..d12e943102096959cc998cfe8951bee469298470 100644 --- a/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx +++ b/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx @@ -52,6 +52,7 @@ const RawJSONSettings = ({ settings, updateSettings }: VisualizationSettingsProp export const RawJSONComponent: VISComponentType<RawJSONVisProps> = { displayName: 'RawJSONVis', component: RawJSONVis, + description: '(Raw) Data Export', settingsComponent: RawJSONSettings, settings: settings, }; diff --git a/libs/shared/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.tsx b/libs/shared/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.tsx index e7e90f844602e39d6fec5a2437b09365b339747c..583565e9c9e059ed8e707c8b1af8127ee1621356 100644 --- a/libs/shared/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.tsx +++ b/libs/shared/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.tsx @@ -36,7 +36,7 @@ const settings: SemSubstrProps = { dataPanels: [], }; -const displayName = 'SemSubstrVis'; +const displayName = 'SemanticSubstratesVis'; export const VisSemanticSubstrates = ({ data, graphMetadata, settings, updateSettings }: VisualizationPropTypes<SemSubstrProps>) => { // for sizing the vis @@ -929,6 +929,7 @@ const SemSubstrSettings = ({ settings, updateSettings, graphMetadata }: Visualiz export const SemSubstrVisComponent: VISComponentType<SemSubstrProps> = { displayName: displayName, + description: 'Node/Edge Attribute Exploration', component: VisSemanticSubstrates, settingsComponent: SemSubstrSettings, settings: settings, diff --git a/libs/shared/lib/vis/visualizations/tablevis/tablevis.tsx b/libs/shared/lib/vis/visualizations/tablevis/tablevis.tsx index 37e198c9dd1f02943a504250643fb279cdc1ae2a..b6b51faae97af5be2e138dcefa34b02a5014b253 100644 --- a/libs/shared/lib/vis/visualizations/tablevis/tablevis.tsx +++ b/libs/shared/lib/vis/visualizations/tablevis/tablevis.tsx @@ -197,6 +197,7 @@ const TableSettings = ({ settings, graphMetadata, updateSettings }: Visualizatio export const TableComponent: VISComponentType<TableProps> = { displayName: 'TableVis', + description: 'Node Attribute Statistics and Details', component: TableVis, settingsComponent: TableSettings, settings: settings,