From a0564e7c447fcbb743fcf79f8569d5dd854d7029 Mon Sep 17 00:00:00 2001
From: Marcos Pieras <pieras.marcos@gmail.com>
Date: Tue, 23 Jul 2024 12:52:53 +0000
Subject: [PATCH] feat: add vis description to recommender panel

---
 libs/shared/lib/vis/common/types.ts           |  1 +
 .../lib/vis/components/VisualizationPanel.tsx |  2 -
 libs/shared/lib/vis/views/Recommender.tsx     | 36 ++++++++++--
 .../lib/vis/visualizations/mapvis/mapvis.tsx  |  1 +
 .../visualizations/matrixvis/matrixvis.tsx    |  1 +
 .../nodelinkvis/nodelinkvis.tsx               |  1 +
 .../vis/visualizations/paohvis/paohvis.tsx    | 58 +++++++++----------
 .../visualizations/rawjsonvis/rawjsonvis.tsx  |  1 +
 .../semanticsubstratesvis.tsx                 |  3 +-
 .../vis/visualizations/tablevis/tablevis.tsx  |  1 +
 10 files changed, 69 insertions(+), 36 deletions(-)

diff --git a/libs/shared/lib/vis/common/types.ts b/libs/shared/lib/vis/common/types.ts
index d3eda36aa..988ab9acd 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 881dafbb6..95a10c05b 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 1082b836a..74c730298 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 c4458e284..e6d90b7e2 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 3b9223034..8d9caf3e7 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 4daa88491..928272c33 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 a643ea9d8..af58aef15 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 461069b31..d12e94310 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 e7e90f844..583565e9c 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 37e198c9d..b6b51faae 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,
-- 
GitLab