From c976ec15071e18f17fe39b132fff4d7efa3d0964 Mon Sep 17 00:00:00 2001
From: 2427021 <s.a.vink@students.uu.nl>
Date: Fri, 5 Apr 2024 16:28:11 +0200
Subject: [PATCH] feat(visManager): fixed storybooks

---
 .../lib/vis/hooks/useVisualizationManager.tsx |   3 +-
 libs/shared/lib/vis/views/recommender.tsx     |   2 +-
 .../visualizations/mapvis/mapvis.stories.tsx  |  45 ++---
 .../matrixvis/matrix.stories.tsx              |  87 ++++-----
 .../nodelinkvis/nodelinkvis.stories.tsx       | 174 +++++++-----------
 .../paohvis/paohvis.stories.tsx               | 100 +++++-----
 .../rawjsonvis/rawjsonvis.stories.tsx         |  88 +++------
 .../visualizations/rawjsonvis/rawjsonvis.tsx  |   2 -
 .../semanticsubstrates.stories.tsx            |   0
 .../semanticsubstrates/semanticsubstrates.tsx |   0
 .../subcomponents/OptimizedAutocomplete.tsx   |  94 ----------
 .../utils/ToPlotDataParserUseCase.tsx         |   0
 .../semanticsubstratesvis.stories.tsx         |  69 +++----
 .../semanticsubstratesvis.tsx                 |  33 +++-
 .../tablevis/tablevis.stories.tsx             |  69 +++----
 .../vis/visualizations/tablevis/tablevis.tsx  |   2 +-
 16 files changed, 279 insertions(+), 489 deletions(-)
 delete mode 100644 libs/shared/lib/vis/visualizations/semanticsubstrates/semanticsubstrates.stories.tsx
 delete mode 100644 libs/shared/lib/vis/visualizations/semanticsubstrates/semanticsubstrates.tsx
 delete mode 100644 libs/shared/lib/vis/visualizations/semanticsubstrates/subcomponents/OptimizedAutocomplete.tsx
 delete mode 100644 libs/shared/lib/vis/visualizations/semanticsubstrates/utils/ToPlotDataParserUseCase.tsx

diff --git a/libs/shared/lib/vis/hooks/useVisualizationManager.tsx b/libs/shared/lib/vis/hooks/useVisualizationManager.tsx
index d39d750df..268c948ac 100644
--- a/libs/shared/lib/vis/hooks/useVisualizationManager.tsx
+++ b/libs/shared/lib/vis/hooks/useVisualizationManager.tsx
@@ -23,8 +23,9 @@ export const Visualizations: Record<string, Function> = {
   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'),
+  SemanticSubstratesVis: () => import('../visualizations/semanticsubstratesvis/semanticsubstratesvis'),
+  // MapVis: () => import('../visualizations/mapvis/mapvis'),
 };
 
 export const VISUALIZATION_TYPES: string[] = Object.keys(Visualizations);
diff --git a/libs/shared/lib/vis/views/recommender.tsx b/libs/shared/lib/vis/views/recommender.tsx
index 09ea04509..1bc681b19 100644
--- a/libs/shared/lib/vis/views/recommender.tsx
+++ b/libs/shared/lib/vis/views/recommender.tsx
@@ -7,7 +7,7 @@ const options = {
   TableVis: '',
   NodeLinkVis: '',
   PaohVis: '',
-  // 'Semantic Substrates': '',
+  SemanticSubstratesVis: '',
   MatrixVis: '',
 };
 
diff --git a/libs/shared/lib/vis/visualizations/mapvis/mapvis.stories.tsx b/libs/shared/lib/vis/visualizations/mapvis/mapvis.stories.tsx
index e2edc474b..a89ba6db0 100644
--- a/libs/shared/lib/vis/visualizations/mapvis/mapvis.stories.tsx
+++ b/libs/shared/lib/vis/visualizations/mapvis/mapvis.stories.tsx
@@ -1,21 +1,23 @@
 import React from 'react';
 import { Meta } from '@storybook/react';
-import { VisualizationPanel } from '../../components/panel';
 import { Provider } from 'react-redux';
 import { configureStore } from '@reduxjs/toolkit';
-import {
-  setNewGraphQueryResult,
-  graphQueryResultSlice,
-  querybuilderSlice,
-  schemaSlice,
-  visualizationSlice,
-} from '../../../data-access/store';
+import { graphQueryResultSlice, querybuilderSlice, schemaSlice, visualizationSlice } from '../../../data-access/store';
 import { mockMobilityQueryResult, bigMockQueryResults } from '../../../mock-data';
-import { setActiveVisualization } from '@graphpolaris/shared/lib/data-access/store/visualizationSlice';
+import { MapComponent } from './mapvis';
 
-const Component: Meta<typeof VisualizationPanel> = {
+const Mockstore = configureStore({
+  reducer: {
+    schema: schemaSlice.reducer,
+    graphQueryResult: graphQueryResultSlice.reducer,
+    visualize: visualizationSlice.reducer,
+    querybuilder: querybuilderSlice.reducer,
+  },
+});
+
+const Component: Meta<typeof MapComponent.component> = {
   title: 'Visualizations/MapVis',
-  component: VisualizationPanel,
+  component: MapComponent.component,
   decorators: [
     (story) => (
       <Provider store={Mockstore}>
@@ -32,28 +34,15 @@ const Component: Meta<typeof VisualizationPanel> = {
   ],
 };
 
-const Mockstore = configureStore({
-  reducer: {
-    schema: schemaSlice.reducer,
-    graphQueryResult: graphQueryResultSlice.reducer,
-    visualize: visualizationSlice.reducer,
-    querybuilder: querybuilderSlice.reducer,
-  },
-});
-
 export const DutchVehicleTheft = {
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    dispatch(setNewGraphQueryResult({ queryID: '1', result: { type: 'nodelink', payload: mockMobilityQueryResult } }));
-    dispatch(setActiveVisualization('MapVis'));
+  args: {
+    data: mockMobilityQueryResult,
   },
 };
 
 export const AmericanFlights = {
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    dispatch(setNewGraphQueryResult({ queryID: '1', result: { type: 'nodelink', payload: bigMockQueryResults } }));
-    dispatch(setActiveVisualization('MapVis'));
+  args: {
+    data: bigMockQueryResults,
   },
 };
 
diff --git a/libs/shared/lib/vis/visualizations/matrixvis/matrix.stories.tsx b/libs/shared/lib/vis/visualizations/matrixvis/matrix.stories.tsx
index 4186e5e1d..5fdecb241 100644
--- a/libs/shared/lib/vis/visualizations/matrixvis/matrix.stories.tsx
+++ b/libs/shared/lib/vis/visualizations/matrixvis/matrix.stories.tsx
@@ -17,10 +17,11 @@ import {
 import { SchemaUtils } from '../../../schema/schema-utils';
 import { simpleSchemaAirportRaw } from '../../../mock-data/schema/simpleAirportRaw';
 import { setActiveVisualization } from '@graphpolaris/shared/lib/data-access/store/visualizationSlice';
+import MatrixVisComponent from './matrixvis';
 
-const Component: Meta<typeof VisualizationPanel> = {
+const Component: Meta<typeof MatrixVisComponent.component> = {
   title: 'Visualizations/MatrixVis',
-  component: VisualizationPanel,
+  component: MatrixVisComponent.component,
   decorators: [
     (story) => (
       <Provider store={Mockstore}>
@@ -49,75 +50,55 @@ const Mockstore: any = configureStore({
 export const TestWithData = {
   layout: 'fullscreen',
   args: {
-    loading: false,
+    data: {
+      nodes: [
+        { id: 'agent/007', attributes: { name: 'Daniel Craig' } },
+        { id: 'villain', attributes: { name: 'Le Chiffre' } },
+      ],
+      edges: [{ id: 'escape/escape', from: 'agent/007', to: 'villain', attributes: { name: 'Escape' } }],
+    },
+    ml: {},
+    configuration: MatrixVisComponent.configuration,
   },
   play: async () => {
-    const dispatch = Mockstore.dispatch;
-    const schema = SchemaUtils.schemaBackend2Graphology(simpleSchemaAirportRaw);
-    dispatch(setSchema(schema.export()));
-    dispatch(
-      setNewGraphQueryResult({
-        queryID: '1',
-        result: {
-          type: 'nodelink',
-          payload: {
-            nodes: [
-              { id: 'agent/007', attributes: { name: 'Daniel Craig' } },
-              { id: 'villain', attributes: { name: 'Le Chiffre' } },
-            ],
-            edges: [{ id: 'escape/escape', from: 'agent/007', to: 'villain', attributes: { name: 'Escape' } }],
-          },
-        },
-      }),
-    );
-    dispatch(setActiveVisualization('MatrixVis'));
+    // const dispatch = Mockstore.dispatch;
+    // const schema = SchemaUtils.schemaBackend2Graphology(simpleSchemaAirportRaw);
+    // dispatch(setSchema(schema.export()));
   },
 };
 
 export const TestWithNoData = {
-  args: { loading: false },
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    dispatch(
-      setNewGraphQueryResult({
-        queryID: '1',
-        result: {
-          type: 'nodelink',
-          payload: {
-            nodes: [],
-            edges: [],
-          },
-        },
-      }),
-    );
-    dispatch(setActiveVisualization('MatrixVis'));
+  args: {
+    data: {
+      nodes: [],
+      edges: [],
+    },
+    ml: {},
+    configuration: MatrixVisComponent.configuration,
   },
 };
 
 export const TestWithBig2ndChamber = {
-  args: { loading: false },
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    dispatch(setNewGraphQueryResult({ queryID: '1', result: { type: 'nodelink', payload: big2ndChamberQueryResult } }));
-    dispatch(setActiveVisualization('MatrixVis'));
+  args: {
+    data: big2ndChamberQueryResult,
+    ml: {},
+    configuration: MatrixVisComponent.configuration,
   },
 };
 
 export const TestWithSmallFlights = {
-  args: { loading: false },
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    dispatch(setNewGraphQueryResult({ queryID: '1', result: { type: 'nodelink', payload: smallFlightsQueryResults } }));
-    dispatch(setActiveVisualization('MatrixVis'));
+  args: {
+    data: smallFlightsQueryResults,
+    ml: {},
+    configuration: MatrixVisComponent.configuration,
   },
 };
 
 export const TestWithLargeQueryResult = {
-  args: { loading: false },
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    dispatch(setNewGraphQueryResult({ queryID: '1', result: { type: 'nodelink', payload: mockLargeQueryResults } }));
-    dispatch(setActiveVisualization('MatrixVis'));
+  args: {
+    data: mockLargeQueryResults,
+    ml: {},
+    configuration: MatrixVisComponent.configuration,
   },
 };
 
diff --git a/libs/shared/lib/vis/visualizations/nodelinkvis/nodelinkvis.stories.tsx b/libs/shared/lib/vis/visualizations/nodelinkvis/nodelinkvis.stories.tsx
index 56538de9c..a19fe1e7f 100644
--- a/libs/shared/lib/vis/visualizations/nodelinkvis/nodelinkvis.stories.tsx
+++ b/libs/shared/lib/vis/visualizations/nodelinkvis/nodelinkvis.stories.tsx
@@ -1,13 +1,6 @@
 import React from 'react';
 import { Meta } from '@storybook/react';
-import { VisualizationPanel } from '../../components/panel';
-import {
-  setNewGraphQueryResult,
-  graphQueryResultSlice,
-  querybuilderSlice,
-  schemaSlice,
-  visualizationSlice,
-} from '../../../data-access/store';
+import { graphQueryResultSlice, querybuilderSlice, schemaSlice, visualizationSlice } from '../../../data-access/store';
 import { configureStore } from '@reduxjs/toolkit';
 import { Provider } from 'react-redux';
 import {
@@ -17,11 +10,20 @@ import {
   recommendationPersonActedInMovieQueryResultPayload,
   slackReactionToThreadedMessageQueryResultPayload,
 } from '../../../mock-data';
-import { setActiveVisualization } from '@graphpolaris/shared/lib/data-access/store/visualizationSlice';
+import { NodeLinkComponent } from './nodelinkvis';
 
-const Component: Meta<typeof VisualizationPanel> = {
+const Mockstore = configureStore({
+  reducer: {
+    schema: schemaSlice.reducer,
+    graphQueryResult: graphQueryResultSlice.reducer,
+    visualize: visualizationSlice.reducer,
+    querybuilder: querybuilderSlice.reducer,
+  },
+});
+
+const Component: Meta<typeof NodeLinkComponent.component> = {
   title: 'Visualizations/NodeLinkVis',
-  component: VisualizationPanel,
+  component: NodeLinkComponent.component,
   decorators: [
     (story) => (
       <Provider store={Mockstore}>
@@ -38,127 +40,93 @@ const Component: Meta<typeof VisualizationPanel> = {
   ],
 };
 
-const Mockstore = configureStore({
-  reducer: {
-    schema: schemaSlice.reducer,
-    graphQueryResult: graphQueryResultSlice.reducer,
-    visualize: visualizationSlice.reducer,
-    querybuilder: querybuilderSlice.reducer,
-  },
-});
-
 export const TestWithData = {
-  layout: 'fullscreen',
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-
-    dispatch(
-      setNewGraphQueryResult({
-        queryID: '1',
-        result: {
-          type: 'nodelink',
-          payload: {
-            nodes: [
-              { id: 'agent/007', attributes: { name: 'Daniel Craig' } },
-              { id: 'villain', attributes: { name: 'Le Chiffre' } },
-            ],
-            edges: [{ id: 'escape/escape', from: 'agent/007', to: 'villain', attributes: { name: 'Escape' } }],
-          },
-        },
-      }),
-    );
-    dispatch(setActiveVisualization('NodeLinkVis'));
+  args: {
+    data: {
+      nodes: [
+        { id: 'agent/007', attributes: { name: 'Daniel Craig' } },
+        { id: 'villain', attributes: { name: 'Le Chiffre' } },
+      ],
+      edges: [{ id: 'escape/escape', from: 'agent/007', to: 'villain', attributes: { name: 'Escape' } }],
+    },
+    ml: {},
+    configuration: NodeLinkComponent.configuration,
+    dispatch: () => {},
   },
 };
 
 export const TestWithDoubleArchData = {
-  layout: 'fullscreen',
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-
-    dispatch(
-      setNewGraphQueryResult({
-        queryID: '1',
-        result: {
-          type: 'nodelink',
-          payload: {
-            nodes: [
-              { id: 'agent/007', attributes: { name: 'Daniel Craig' } },
-              { id: 'villain', attributes: { name: 'Le Chiffre' } },
-            ],
-            edges: [
-              { id: 'escape/escape', from: 'agent/007', to: 'villain', attributes: { name: 'Escape' } },
-              { id: 'escape/escape', to: 'agent/007', from: 'villain', attributes: { name: 'Escape' } },
-            ],
-          },
-        },
-      }),
-    );
-    dispatch(setActiveVisualization(Visualizations.NodeLink));
+  args: {
+    data: {
+      nodes: [
+        { id: 'agent/007', attributes: { name: 'Daniel Craig' } },
+        { id: 'villain', attributes: { name: 'Le Chiffre' } },
+      ],
+      edges: [
+        { id: 'escape/escape', from: 'agent/007', to: 'villain', attributes: { name: 'Escape' } },
+        { id: 'escape/escape', to: 'agent/007', from: 'villain', attributes: { name: 'Escape' } },
+      ],
+    },
+    ml: {},
+    configuration: NodeLinkComponent.configuration,
+    dispatch: () => {},
   },
 };
 
 export const TestWithNoData = {
-  args: { loading: false },
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    dispatch(
-      setNewGraphQueryResult({
-        queryID: '1',
-        result: {
-          type: 'nodelink',
-          payload: {
-            nodes: [],
-            edges: [],
-          },
-        },
-      }),
-    );
-    dispatch(setActiveVisualization('NodeLinkVis'));
+  args: {
+    data: {
+      nodes: [],
+      edges: [],
+    },
+    ml: {},
+    configuration: NodeLinkComponent.configuration,
+    dispatch: () => {},
   },
 };
 
 export const TestWithBig2ndChamber = {
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    dispatch(setNewGraphQueryResult({ queryID: '1', result: { type: 'nodelink', payload: big2ndChamberQueryResult } }));
-    dispatch(setActiveVisualization('NodeLinkVis'));
+  args: {
+    data: big2ndChamberQueryResult,
+    ml: {},
+    configuration: NodeLinkComponent.configuration,
+    dispatch: () => {},
   },
 };
 
 export const TestWithSmallFlights = {
-  args: { loading: false },
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    dispatch(setNewGraphQueryResult({ queryID: '1', result: { type: 'nodelink', payload: smallFlightsQueryResults } }));
-    dispatch(setActiveVisualization('NodeLinkVis'));
+  args: {
+    data: smallFlightsQueryResults,
+    ml: {},
+    configuration: NodeLinkComponent.configuration,
+    dispatch: () => {},
   },
 };
 
 export const TestWithLargeQueryResult = {
-  args: { loading: false },
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    dispatch(setNewGraphQueryResult({ queryID: '1', result: { type: 'nodelink', payload: mockLargeQueryResults } }));
-    dispatch(setActiveVisualization('NodeLinkVis'));
+  args: {
+    data: mockLargeQueryResults,
+    ml: {},
+    configuration: NodeLinkComponent.configuration,
+    dispatch: () => {},
   },
 };
 
 export const TestWithRecommendationPersonActedInMovieQueryResult = {
-  args: { loading: false },
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    dispatch(setNewGraphQueryResult(recommendationPersonActedInMovieQueryResultPayload));
-    dispatch(setActiveVisualization(Visualizations.NodeLink));
+  args: {
+    data: recommendationPersonActedInMovieQueryResultPayload.result.payload,
+    ml: {},
+    configuration: NodeLinkComponent.configuration,
+    dispatch: () => {},
   },
 };
 
 export const TestWithSlackReactionToThreadedMessageQueryResult = {
-  args: { loading: false },
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    dispatch(setNewGraphQueryResult(slackReactionToThreadedMessageQueryResultPayload));
-    dispatch(setActiveVisualization(Visualizations.NodeLink));
+  args: {
+    data: slackReactionToThreadedMessageQueryResultPayload.result.payload,
+    ml: {},
+    configuration: NodeLinkComponent.configuration,
+    dispatch: () => {},
   },
 };
 
diff --git a/libs/shared/lib/vis/visualizations/paohvis/paohvis.stories.tsx b/libs/shared/lib/vis/visualizations/paohvis/paohvis.stories.tsx
index 9b2b279fa..0bb20c19e 100644
--- a/libs/shared/lib/vis/visualizations/paohvis/paohvis.stories.tsx
+++ b/libs/shared/lib/vis/visualizations/paohvis/paohvis.stories.tsx
@@ -1,14 +1,7 @@
-import {
-  setNewGraphQueryResult,
-  graphQueryResultSlice,
-  querybuilderSlice,
-  schemaSlice,
-  setSchema,
-  visualizationSlice,
-} from '../../../data-access/store';
+import React from 'react';
+import { graphQueryResultSlice, querybuilderSlice, schemaSlice, setSchema, visualizationSlice } from '../../../data-access/store';
 import { configureStore } from '@reduxjs/toolkit';
 import { Meta } from '@storybook/react';
-import { VisualizationPanel } from '../../components/panel';
 import { Provider } from 'react-redux';
 import { SchemaUtils } from '../../../schema/schema-utils';
 import {
@@ -20,11 +13,20 @@ import {
   mockRecommendationsActorMovie,
 } from '../../../mock-data';
 import { simpleSchemaAirportRaw } from '../../../mock-data/schema/simpleAirportRaw';
-import { setActiveVisualization } from '@graphpolaris/shared/lib/data-access/store/visualizationSlice';
+import PaohVisComponent from './paohvis';
+
+const Mockstore = configureStore({
+  reducer: {
+    schema: schemaSlice.reducer,
+    graphQueryResult: graphQueryResultSlice.reducer,
+    visualize: visualizationSlice.reducer,
+    querybuilder: querybuilderSlice.reducer,
+  },
+});
 
-const Component: Meta<typeof VisualizationPanel> = {
+const Component: Meta<typeof PaohVisComponent.component> = {
   title: 'Visualizations/Paohvis',
-  component: VisualizationPanel,
+  component: PaohVisComponent.component,
   decorators: [
     (story) => (
       <Provider store={Mockstore}>
@@ -41,16 +43,23 @@ const Component: Meta<typeof VisualizationPanel> = {
   ],
 };
 
-const Mockstore = configureStore({
-  reducer: {
-    schema: schemaSlice.reducer,
-    graphQueryResult: graphQueryResultSlice.reducer,
-    visualize: visualizationSlice.reducer,
-    querybuilder: querybuilderSlice.reducer,
-  },
-});
-
 export const TestWithData = {
+  args: {
+    data: {
+      nodes: [
+        { id: '1/a', label: 'a', attributes: { a: 's1' } },
+        { id: '1/b1', label: 'b1', attributes: { a: 's1' } },
+        { id: '1/b2', label: 'b2', attributes: { a: 's1' } },
+        { id: '1/b3', label: 'b3', attributes: { a: 's1' } },
+      ],
+      edges: [
+        { id: '1c/z1', label: 'z1', from: '1/b1', to: '1/a', attributes: { a: 's1' } },
+        { id: '1c/z2', label: 'z2', from: '1/a', to: '1/b1', attributes: { a: 's1' } },
+        { id: '1c/z3', label: 'z3', from: '1/b2', to: '1/b3', attributes: { a: 's2' } },
+      ],
+    },
+    configuration: PaohVisComponent.configuration,
+  },
   play: async () => {
     const dispatch = Mockstore.dispatch;
     const schema = SchemaUtils.schemaBackend2Graphology({
@@ -71,72 +80,55 @@ export const TestWithData = {
         },
       ],
     });
-
     dispatch(setSchema(schema.export()));
-    dispatch(
-      setNewGraphQueryResult({
-        queryID: '1',
-        result: {
-          type: 'nodelink',
-          payload: {
-            nodes: [
-              { id: '1/a', label: 'a', attributes: { a: 's1' } },
-              { id: '1/b1', label: 'b1', attributes: { a: 's1' } },
-              { id: '1/b2', label: 'b2', attributes: { a: 's1' } },
-              { id: '1/b3', label: 'b3', attributes: { a: 's1' } },
-            ],
-            edges: [
-              { id: '1c/z1', label: 'z1', from: '1/b1', to: '1/a', attributes: { a: 's1' } },
-              { id: '1c/z2', label: 'z2', from: '1/a', to: '1/b1', attributes: { a: 's1' } },
-              { id: '1c/z3', label: 'z3', from: '1/b2', to: '1/b3', attributes: { a: 's2' } },
-            ],
-          },
-        },
-      }),
-    );
-    dispatch(setActiveVisualization('PaohVis'));
   },
 };
 
 export const TestWithMarieBoucherSample = {
+  args: {
+    data: marieBoucherSample,
+    configuration: PaohVisComponent.configuration,
+  },
   play: async () => {
     const dispatch = Mockstore.dispatch;
     const schema = SchemaUtils.schemaBackend2Graphology(marieBoucherSampleSchemaRaw);
-
     dispatch(setSchema(schema.export()));
-    dispatch(setNewGraphQueryResult({ queryID: '1', result: { type: 'nodelink', payload: marieBoucherSample } }));
-    dispatch(setActiveVisualization('PaohVis'));
   },
 };
 
 export const TestWithBig2ndChamber = {
+  args: {
+    data: big2ndChamberQueryResult,
+    configuration: PaohVisComponent.configuration,
+  },
   play: async () => {
     const dispatch = Mockstore.dispatch;
     const schema = SchemaUtils.schemaBackend2Graphology(big2ndChamberSchemaRaw);
     dispatch(setSchema(schema.export()));
-    dispatch(setNewGraphQueryResult({ queryID: '1', result: { type: 'nodelink', payload: big2ndChamberQueryResult } }));
-    dispatch(setActiveVisualization('PaohVis'));
   },
 };
 
 export const TestWithAirport = {
+  args: {
+    data: bigMockQueryResults,
+    configuration: PaohVisComponent.configuration,
+  },
   play: async () => {
     const dispatch = Mockstore.dispatch;
     const schema = SchemaUtils.schemaBackend2Graphology(simpleSchemaAirportRaw);
-
     dispatch(setSchema(schema.export()));
-    dispatch(setNewGraphQueryResult({ queryID: '1', result: { type: 'nodelink', payload: bigMockQueryResults } }));
-    dispatch(setActiveVisualization('PaohVis'));
   },
 };
 
 export const TestWithRecommendationsActorMovie = {
+  args: {
+    data: mockRecommendationsActorMovie,
+    configuration: PaohVisComponent.configuration,
+  },
   play: async () => {
     const dispatch = Mockstore.dispatch;
     const schema = SchemaUtils.schemaBackend2Graphology(marieBoucherSampleSchemaRaw);
     dispatch(setSchema(schema.export()));
-    dispatch(setNewGraphQueryResult({ queryID: '1', result: { type: 'nodelink', payload: mockRecommendationsActorMovie } }));
-    dispatch(setActiveVisualization('PaohVis'));
   },
 };
 
diff --git a/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.stories.tsx b/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.stories.tsx
index 2b051e6f0..bdfc75c5b 100644
--- a/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.stories.tsx
+++ b/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.stories.tsx
@@ -1,23 +1,23 @@
 import React from 'react';
 import { Meta } from '@storybook/react';
-import { VisualizationPanel } from '../../components/panel';
-import {
-  setNewGraphQueryResult,
-  graphQueryResultSlice,
-  querybuilderSlice,
-  resetGraphQueryResults,
-  schemaSlice,
-  store,
-  visualizationSlice,
-} from '../../../data-access/store';
+import { graphQueryResultSlice, querybuilderSlice, schemaSlice, visualizationSlice } from '../../../data-access/store';
 import { configureStore } from '@reduxjs/toolkit';
 import { Provider } from 'react-redux';
 import { mockLargeQueryResults } from '../../../mock-data/query-result';
-import { setActiveVisualization } from '@graphpolaris/shared/lib/data-access/store/visualizationSlice';
+import RawJSONComponent from './rawjsonvis';
 
-const Component: Meta<typeof VisualizationPanel> = {
+const Mockstore = configureStore({
+  reducer: {
+    schema: schemaSlice.reducer,
+    graphQueryResult: graphQueryResultSlice.reducer,
+    visualize: visualizationSlice.reducer,
+    querybuilder: querybuilderSlice.reducer,
+  },
+});
+
+const Component: Meta<typeof RawJSONComponent.component> = {
   title: 'Visualizations/RawJSONVIS',
-  component: VisualizationPanel,
+  component: RawJSONComponent.component,
   decorators: [
     (story) => (
       <Provider store={Mockstore}>
@@ -34,61 +34,33 @@ const Component: Meta<typeof VisualizationPanel> = {
   ],
 };
 
-const Mockstore = configureStore({
-  reducer: {
-    schema: schemaSlice.reducer,
-    graphQueryResult: graphQueryResultSlice.reducer,
-    visualize: visualizationSlice.reducer,
-    querybuilder: querybuilderSlice.reducer,
-  },
-});
-
 export const SimpleData = {
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    dispatch(
-      setNewGraphQueryResult({
-        queryID: '1',
-        result: {
-          type: 'nodelink',
-          payload: {
-            nodes: [
-              { id: 'agent/007', attributes: { name: 'Daniel Craig' } },
-              { id: 'villain', attributes: { name: 'Le Chiffre' } },
-            ],
-            edges: [],
-          },
-        },
-      }),
-    );
-    dispatch(setActiveVisualization('RawJSONVis'));
+  args: {
+    data: {
+      nodes: [
+        { id: 'agent/007', attributes: { name: 'Daniel Craig' } },
+        { id: 'villain', attributes: { name: 'Le Chiffre' } },
+      ],
+      edges: [],
+    },
+    configuration: RawJSONComponent.configuration,
   },
 };
 
 export const LargeData = {
   args: {
-    loading: false,
-  },
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    dispatch(
-      setNewGraphQueryResult({
-        queryID: '1',
-        result: {
-          type: 'nodelink',
-          payload: mockLargeQueryResults,
-        },
-      }),
-    );
-    dispatch(setActiveVisualization('RawJSONVis'));
+    data: mockLargeQueryResults,
+    configuration: RawJSONComponent.configuration,
   },
 };
 
 export const Empty = {
-  play: async () => {
-    const dispatch = store.dispatch;
-    dispatch(resetGraphQueryResults());
-    dispatch(setActiveVisualization('RawJSONVis'));
+  args: {
+    data: {
+      nodes: [],
+      edges: [],
+    },
+    configuration: RawJSONComponent.configuration,
   },
 };
 
diff --git a/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx b/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx
index 2d9d64834..fa8ec2355 100644
--- a/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx
+++ b/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx
@@ -22,8 +22,6 @@ const configuration: RawJSONVisProps = {
 };
 
 export const RawJSONVis = React.memo(({ data, configuration }: VisualizationPropTypes) => {
-  console.log(configuration);
-
   return (
     <ReactJSONView
       src={data}
diff --git a/libs/shared/lib/vis/visualizations/semanticsubstrates/semanticsubstrates.stories.tsx b/libs/shared/lib/vis/visualizations/semanticsubstrates/semanticsubstrates.stories.tsx
deleted file mode 100644
index e69de29bb..000000000
diff --git a/libs/shared/lib/vis/visualizations/semanticsubstrates/semanticsubstrates.tsx b/libs/shared/lib/vis/visualizations/semanticsubstrates/semanticsubstrates.tsx
deleted file mode 100644
index e69de29bb..000000000
diff --git a/libs/shared/lib/vis/visualizations/semanticsubstrates/subcomponents/OptimizedAutocomplete.tsx b/libs/shared/lib/vis/visualizations/semanticsubstrates/subcomponents/OptimizedAutocomplete.tsx
deleted file mode 100644
index 194a3bbf5..000000000
--- a/libs/shared/lib/vis/visualizations/semanticsubstrates/subcomponents/OptimizedAutocomplete.tsx
+++ /dev/null
@@ -1,94 +0,0 @@
-/**
- * This program has been developed by students from the bachelor Computer Science at
- * Utrecht University within the Software Project course.
- * © Copyright Utrecht University (Department of Information and Computing Sciences)
- */
-
-/* istanbul ignore file */
-/* The comment above was added so the code coverage wouldn't count this file towards code coverage.
- * We do not test components/renderfunctions/styling files.
- * See testing plan for more details.*/
-
-import React from 'react';
-import { VariableSizeList, ListChildComponentProps } from 'react-window';
-import styles from './OptimizedAutocomplete.module.scss';
-
-const LISTBOX_PADDING = 8; // px
-
-function renderRow(props: ListChildComponentProps) {
-  const { data, index, style } = props;
-  return React.cloneElement(data[index], {
-    style: {
-      ...style,
-      top: (style.top as number) + LISTBOX_PADDING,
-    },
-  });
-}
-
-const OuterElementContext = React.createContext({});
-
-const OuterElementType = React.forwardRef<HTMLDivElement>((props, ref) => {
-  const outerProps = React.useContext(OuterElementContext);
-  return <div ref={ref} {...props} {...outerProps} />;
-});
-
-function useResetCache(data: any) {
-  const ref = React.useRef<VariableSizeList>(null);
-  React.useEffect(() => {
-    if (ref.current != null) {
-      ref.current.resetAfterIndex(0, true);
-    }
-  }, [data]);
-  return ref;
-}
-
-// Adapter for react-window
-const ListboxComponent = React.forwardRef<HTMLDivElement>(function ListboxComponent(props: any, ref) {
-  const { children, ...other } = props;
-  const itemData = React.Children.toArray(children);
-  const itemCount = itemData.length;
-  const itemSize = 36;
-
-  return <div ref={ref}></div>;
-});
-
-const renderGroup = (params: any) => [<div key={params.key}>{params.group}</div>, params.children];
-
-type OptimizedAutocomplete = {
-  currentValue: string;
-  options: string[];
-  useMaterialStyle?: { label: string; helperText: string };
-  /** Called when the value of the input field changes. */
-  onChange?(value: string): void;
-  /** Called when the user leaves focus of the input field. */
-  onLeave?(value: string): void;
-};
-/** Renders the autocomplete input field with the given props. */
-export default function OptimizedAutocomplete(props: OptimizedAutocomplete) {
-  let newValue = props.currentValue;
-  console.log(props);
-
-  return (
-    <input
-      id="optimized-autocomplete"
-      style={{ width: 200 }}
-      className={styles.listbox}
-      // defaultValue={props.currentValue}
-      placeholder={props.currentValue}
-      // renderOption={(props, option, state) => <Typography noWrap>{option}</Typography>}
-      onChange={(e) => {
-        let value = e.target.value;
-        console.log(value);
-
-        newValue = value || '?';
-        if (props.onChange) props.onChange(newValue);
-      }}
-      onBlur={() => {
-        if (props.onLeave) props.onLeave(newValue);
-      }}
-      onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>): void => {
-        if (e.key == 'Enter' && props.onLeave) props.onLeave(newValue);
-      }}
-    />
-  );
-}
diff --git a/libs/shared/lib/vis/visualizations/semanticsubstrates/utils/ToPlotDataParserUseCase.tsx b/libs/shared/lib/vis/visualizations/semanticsubstrates/utils/ToPlotDataParserUseCase.tsx
deleted file mode 100644
index e69de29bb..000000000
diff --git a/libs/shared/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.stories.tsx b/libs/shared/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.stories.tsx
index 752304cb0..ef0adea22 100644
--- a/libs/shared/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.stories.tsx
+++ b/libs/shared/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.stories.tsx
@@ -1,16 +1,7 @@
 import React from 'react';
 import { Meta } from '@storybook/react';
-import { VisualizationPanel } from '../../visualizationPanel';
-import { SchemaUtils } from '../../../schema/schema-utils';
-
-import {
-  setNewGraphQueryResult,
-  graphQueryResultSlice,
-  querybuilderSlice,
-  schemaSlice,
-  setSchema,
-  visualizationSlice,
-} from '../../../data-access/store';
+import { SemSubstrVisComponent } from './semanticsubstratesvis';
+import { graphQueryResultSlice, querybuilderSlice, schemaSlice, visualizationSlice } from '../../../data-access/store';
 import { configureStore } from '@reduxjs/toolkit';
 import { Provider } from 'react-redux';
 import {
@@ -20,15 +11,19 @@ import {
   marieBoucherSampleSchemaRaw,
   big2ndChamberSchemaRaw,
 } from '../../../mock-data';
-import { setActiveVisualization } from '@graphpolaris/shared/lib/data-access/store/visualizationSlice';
 
-const Component: Meta<typeof VisualizationPanel> = {
-  /* 👇 The title prop is optional.
-   * See https://storybook.js.org/docs/react/configure/overview#configure-story-loading
-   * to learn how to generate automatic titles
-   */
-  title: 'Visualizations/VisSemanticSubstrates',
-  component: VisualizationPanel,
+const Mockstore = configureStore({
+  reducer: {
+    schema: schemaSlice.reducer,
+    graphQueryResult: graphQueryResultSlice.reducer,
+    visualize: visualizationSlice.reducer,
+    querybuilder: querybuilderSlice.reducer,
+  },
+});
+
+const Component: Meta<typeof SemSubstrVisComponent.component> = {
+  title: 'Visualizations/SemanticSubstrates',
+  component: SemSubstrVisComponent.component,
   decorators: [
     (story) => (
       <Provider store={Mockstore}>
@@ -45,42 +40,24 @@ const Component: Meta<typeof VisualizationPanel> = {
   ],
 };
 
-const Mockstore = configureStore({
-  reducer: {
-    schema: schemaSlice.reducer,
-    graphQueryResult: graphQueryResultSlice.reducer,
-    visualize: visualizationSlice.reducer,
-    querybuilder: querybuilderSlice.reducer,
-  },
-});
-
 export const TestWithBig2ndChamber = {
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    const schema = SchemaUtils.schemaBackend2Graphology(big2ndChamberSchemaRaw);
-    dispatch(setSchema(schema.export()));
-    dispatch(setNewGraphQueryResult({ queryID: '1', result: { type: 'nodelink', payload: big2ndChamberQueryResult } }));
-    dispatch(setActiveVisualization('SemSubstrVis'));
+  args: {
+    data: big2ndChamberQueryResult,
+    configuration: SemSubstrVisComponent.configuration,
   },
 };
 
 export const TestWithRecommendationsActorMovie = {
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    const schema = SchemaUtils.schemaBackend2Graphology(marieBoucherSampleSchemaRaw);
-    dispatch(setSchema(schema.export()));
-    dispatch(setNewGraphQueryResult({ queryID: '1', result: { type: 'nodelink', payload: mockRecommendationsActorMovie } }));
-    dispatch(setActiveVisualization('SemSubstrVis'));
+  args: {
+    data: mockRecommendationsActorMovie,
+    configuration: SemSubstrVisComponent.configuration,
   },
 };
 
 export const TestWithGOTcharacter2character = {
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    const schema = SchemaUtils.schemaBackend2Graphology(marieBoucherSampleSchemaRaw);
-    dispatch(setSchema(schema.export()));
-    dispatch(setNewGraphQueryResult({ queryID: '1', result: { type: 'nodelink', payload: gotCharacter2Character } }));
-    dispatch(setActiveVisualization('SemSubstrVis'));
+  args: {
+    data: gotCharacter2Character,
+    configuration: SemSubstrVisComponent.configuration,
   },
 };
 
diff --git a/libs/shared/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.tsx b/libs/shared/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.tsx
index 56bc0a031..ed0ae4038 100644
--- a/libs/shared/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.tsx
+++ b/libs/shared/lib/vis/visualizations/semanticsubstratesvis/semanticsubstratesvis.tsx
@@ -1,8 +1,10 @@
 import React, { useRef, useState, useMemo, useEffect } from 'react';
 import Scatterplot, { KeyedScatterplotProps } from './components/Scatterplot';
+import { GraphMetaData } from '@graphpolaris/shared/lib/data-access/statistics';
+import { SettingsContainer } from '@graphpolaris/shared/lib/vis/components/config';
 
 import { categoricalColors } from 'config/src/colors';
-import { VISComponentType, VisualizationPropTypes } from '../../types';
+import { VisualizationPropTypes, VISComponentType } from '../../common';
 import { findConnectionsNodes, getRegionData, setExtension, filterArray, getUniqueValues } from './components/utils';
 
 import { Node } from '@graphpolaris/shared/lib/data-access/store/graphQueryResultSlice';
@@ -24,13 +26,19 @@ import { MultiGraph } from 'graphology';
 import { select, selectAll, scaleOrdinal } from 'd3';
 
 import { buildGraphology, configVisualRegion, config, numColorsCategorical, marginAxis, isColorCircleFix } from './utils';
+import { Input } from '../../..';
 
 export type SemSubstrProps = {
   showColor: boolean;
 };
 
+const configuration: SemSubstrProps = {
+  showColor: true,
+};
+
 const displayName = 'SemSubstrVis';
-export const VisSemanticSubstrates = ({ data: graphQueryResult, schema, settings }: VisualizationPropTypes) => {
+
+export const VisSemanticSubstrates = ({ data: graphQueryResult, configuration }: VisualizationPropTypes) => {
   const nodes = graphQueryResult.nodes;
   const edges = graphQueryResult.edges;
 
@@ -415,10 +423,27 @@ export const VisSemanticSubstrates = ({ data: graphQueryResult, schema, settings
   );
 };
 
+const SemSubstrSettings = ({
+  configuration,
+  graph,
+  updateSettings,
+}: {
+  configuration: SemSubstrProps;
+  graph: GraphMetaData;
+  updateSettings: (val: any) => void;
+}) => {
+  return (
+    <SettingsContainer>
+      <Input type="boolean" label="Show color" value={configuration.showColor} onChange={(val) => updateSettings({ showColor: val })} />
+    </SettingsContainer>
+  );
+};
+
 export const SemSubstrVisComponent: VISComponentType = {
   displayName: displayName,
-  VIS: VisSemanticSubstrates,
-  settings: {},
+  component: VisSemanticSubstrates,
+  settings: SemSubstrSettings,
+  configuration: configuration,
 };
 
 export default SemSubstrVisComponent;
diff --git a/libs/shared/lib/vis/visualizations/tablevis/tablevis.stories.tsx b/libs/shared/lib/vis/visualizations/tablevis/tablevis.stories.tsx
index edf3eabf7..26488d4a2 100644
--- a/libs/shared/lib/vis/visualizations/tablevis/tablevis.stories.tsx
+++ b/libs/shared/lib/vis/visualizations/tablevis/tablevis.stories.tsx
@@ -1,14 +1,6 @@
 import React from 'react';
 import { Meta } from '@storybook/react';
-import { VisualizationPanel } from '../../components/panel';
-import {
-  setNewGraphQueryResult,
-  graphQueryResultSlice,
-  querybuilderSlice,
-  schemaSlice,
-  setSchema,
-  visualizationSlice,
-} from '../../../data-access/store';
+import { graphQueryResultSlice, querybuilderSlice, schemaSlice, visualizationSlice } from '../../../data-access/store';
 import { configureStore } from '@reduxjs/toolkit';
 import { Provider } from 'react-redux';
 import {
@@ -18,14 +10,21 @@ import {
   typesMockQueryResults,
   typesMockSchemaRaw,
 } from '../../../mock-data';
-
-import { SchemaUtils } from '../../../schema/schema-utils';
 import { simpleSchemaAirportRaw } from '../../../mock-data/schema/simpleAirportRaw';
-import { setActiveVisualization } from '@graphpolaris/shared/lib/data-access/store/visualizationSlice';
+import TableComponent from './tablevis';
+
+const Mockstore = configureStore({
+  reducer: {
+    schema: schemaSlice.reducer,
+    graphQueryResult: graphQueryResultSlice.reducer,
+    visualize: visualizationSlice.reducer,
+    querybuilder: querybuilderSlice.reducer,
+  },
+});
 
-const Component: Meta<typeof VisualizationPanel> = {
+const Component: Meta<typeof TableComponent.component> = {
   title: 'Visualizations/TableVis',
-  component: VisualizationPanel,
+  component: TableComponent.component,
   decorators: [
     (story) => (
       <Provider store={Mockstore}>
@@ -42,45 +41,27 @@ const Component: Meta<typeof VisualizationPanel> = {
   ],
 };
 
-const Mockstore = configureStore({
-  reducer: {
-    schema: schemaSlice.reducer,
-    graphQueryResult: graphQueryResultSlice.reducer,
-    visualize: visualizationSlice.reducer,
-    querybuilder: querybuilderSlice.reducer,
-  },
-});
-
 export const TestWithAirport = {
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    const schema = SchemaUtils.schemaBackend2Graphology(simpleSchemaAirportRaw);
-
-    dispatch(setSchema(schema.export()));
-    dispatch(setNewGraphQueryResult({ queryID: '1', result: { type: 'nodelink', payload: bigMockQueryResults } }));
-    dispatch(setActiveVisualization('TableVis'));
+  args: {
+    data: bigMockQueryResults,
+    schema: simpleSchemaAirportRaw,
+    configuration: TableComponent.configuration,
   },
 };
 
 export const TestWithBig2ndChamber = {
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    const schema = SchemaUtils.schemaBackend2Graphology(big2ndChamberSchemaRaw);
-
-    dispatch(setSchema(schema.export()));
-    dispatch(setNewGraphQueryResult({ queryID: '1', result: { type: 'nodelink', payload: big2ndChamberQueryResult } }));
-    dispatch(setActiveVisualization('TableVis'));
+  args: {
+    data: big2ndChamberQueryResult,
+    schema: big2ndChamberSchemaRaw,
+    configuration: TableComponent.configuration,
   },
 };
 
 export const TestWithTypesMock = {
-  play: async () => {
-    const dispatch = Mockstore.dispatch;
-    const schema = SchemaUtils.schemaBackend2Graphology(typesMockSchemaRaw);
-
-    dispatch(setSchema(schema.export()));
-    dispatch(setNewGraphQueryResult({ queryID: '1', result: { type: 'nodelink', payload: typesMockQueryResults } }));
-    dispatch(setActiveVisualization('TableVis'));
+  args: {
+    data: typesMockQueryResults,
+    schema: typesMockSchemaRaw,
+    configuration: TableComponent.configuration,
   },
 };
 
diff --git a/libs/shared/lib/vis/visualizations/tablevis/tablevis.tsx b/libs/shared/lib/vis/visualizations/tablevis/tablevis.tsx
index 6a6b8908b..552b40db3 100644
--- a/libs/shared/lib/vis/visualizations/tablevis/tablevis.tsx
+++ b/libs/shared/lib/vis/visualizations/tablevis/tablevis.tsx
@@ -20,7 +20,7 @@ const configuration: TableProps = {
 
 export const TableVis = ({ data, schema, configuration }: VisualizationPropTypes) => {
   const ref = useRef<HTMLDivElement>(null);
-  console.log(configuration);
+
   const attributesArray = useMemo<AugmentedNodeAttributes[]>(
     () =>
       data.nodes.map((node) => {
-- 
GitLab