From a3eeb9383b6a4eb384df197665c9b40d368a9565 Mon Sep 17 00:00:00 2001
From: 2427021 <s.a.vink@students.uu.nl>
Date: Thu, 28 Mar 2024 12:19:10 +0100
Subject: [PATCH] feat(visManager): table settings

---
 .../visualizations/rawjsonvis/rawjsonvis.tsx  |  6 +++--
 .../tablevis/components/Table.tsx             | 23 ++++++++++------
 .../vis/visualizations/tablevis/tablevis.tsx  | 27 +++++++++++++------
 3 files changed, 38 insertions(+), 18 deletions(-)

diff --git a/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx b/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx
index e71607313..054e98f9f 100644
--- a/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx
+++ b/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx
@@ -22,6 +22,8 @@ const configuration: RawJSONVisProps = {
 };
 
 export const RawJSONVis = React.memo(({ data, configuration }: VisualizationPropTypes) => {
+  console.log(configuration);
+
   return (
     <div className="overflow-y-auto">
       <ReactJSONView
@@ -64,7 +66,7 @@ const RawJSONSettings = ({
         options={['circle', 'square', 'triangle']}
         onChange={(val) => updateSettings({ iconStyle: val })}
       />
-      <Input
+      {/* <Input
         type="boolean"
         label="Show data types"
         value={configuration.showDataTypes}
@@ -81,7 +83,7 @@ const RawJSONSettings = ({
         label="Enable clipboard"
         value={configuration.enableClipboard}
         onChange={(val) => updateSettings({ enableClipboard: val })}
-      />
+      /> */}
     </SettingsContainer>
   );
 };
diff --git a/libs/shared/lib/vis/visualizations/tablevis/components/Table.tsx b/libs/shared/lib/vis/visualizations/tablevis/components/Table.tsx
index ce4a3e89f..ace9e717d 100644
--- a/libs/shared/lib/vis/visualizations/tablevis/components/Table.tsx
+++ b/libs/shared/lib/vis/visualizations/tablevis/components/Table.tsx
@@ -15,6 +15,7 @@ type TableProps = {
   data: AugmentedNodeAttributes[];
   itemsPerPage: number;
   showBarPlot: boolean;
+  showAttributes: string[];
 };
 type Data2RenderI = {
   name: string;
@@ -24,7 +25,7 @@ type Data2RenderI = {
   showBarPlot?: boolean;
 };
 
-export const Table = ({ data, itemsPerPage, showBarPlot }: TableProps) => {
+export const Table = ({ data, itemsPerPage, showBarPlot, showAttributes }: TableProps) => {
   const maxUniqueValues = 69;
   const barPlotNumBins = 10;
 
@@ -38,7 +39,12 @@ export const Table = ({ data, itemsPerPage, showBarPlot }: TableProps) => {
     currentData: AugmentedNodeAttributes[];
   } | null>(null);
   const [data2Render, setData2Render] = useState<Data2RenderI[]>([]);
-  const dataColumns = useMemo(() => Object.keys(data[0].attribute), [data]);
+  const dataColumns = useMemo(() => {
+    if (showAttributes && showAttributes.length > 0) {
+      return showAttributes.filter((attr) => Object.keys(data[0].attribute).includes(attr));
+    }
+    return Object.keys(data[0].attribute);
+  }, [data, showAttributes]);
   const totalPages = Math.ceil(sortedData.length / itemsPerPage);
 
   useEffect(() => {
@@ -227,16 +233,17 @@ export const Table = ({ data, itemsPerPage, showBarPlot }: TableProps) => {
                     <th className="border-light bg-light" key={index}>
                       <div className="th" key={index + item}>
                         <div className="h-full w-full overflow-hidden">
-                          {data2Render[index].showBarPlot &&
-                          (data2Render[index]?.typeData === 'int' || data2Render[index]?.typeData === 'float') ? (
-                            <BarPlot typeBarPlot="numerical" numBins={barPlotNumBins} data={data2Render[index].data} />
-                          ) : !data2Render[index]?.typeData || !data2Render[index].showBarPlot ? (
+                          {showBarPlot && data2Render[index].showBarPlot ? (
+                            data2Render[index].typeData === 'int' || data2Render[index].typeData === 'float' ? (
+                              <BarPlot typeBarPlot="numerical" numBins={barPlotNumBins} data={data2Render[index].data} />
+                            ) : (
+                              <BarPlot typeBarPlot="categorical" numBins={barPlotNumBins} data={data2Render[index].data} />
+                            )
+                          ) : (
                             <div className="font-normal mx-auto flex flex-row items-start justify-center w-full gap-1 text-center text-secondary-700">
                               <span className="text-2xs overflow-x-hidden truncate">Unique values:</span>
                               <span className="text-xs shrink-0">{data2Render[index]?.numElements}</span>
                             </div>
-                          ) : (
-                            <BarPlot typeBarPlot="categorical" numBins={barPlotNumBins} data={data2Render[index].data} />
                           )}
                         </div>
                       </div>
diff --git a/libs/shared/lib/vis/visualizations/tablevis/tablevis.tsx b/libs/shared/lib/vis/visualizations/tablevis/tablevis.tsx
index b6b54b945..ef6ead2a0 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) => {
@@ -40,7 +40,12 @@ export const TableVis = ({ data, schema, configuration }: VisualizationPropTypes
   return (
     <div className="h-full w-full" ref={ref}>
       {attributesArray.length > 0 && (
-        <Table data={attributesArray} itemsPerPage={configuration.itemsPerPage} showBarPlot={configuration.showBarplot} />
+        <Table
+          data={attributesArray}
+          itemsPerPage={configuration.itemsPerPage}
+          showBarPlot={configuration.showBarplot}
+          showAttributes={configuration.displayAttributes}
+        />
       )}
     </div>
   );
@@ -55,13 +60,19 @@ const TableSettings = ({
   graph: GraphMetaData;
   updateSettings: (val: any) => void;
 }) => {
-  const uniqueAttributes = new Set();
-  Object.keys(graph.nodes.types).forEach((label) => {
-    Object.keys(graph.nodes.types[label].attributes).forEach((attr: string) => {
-      uniqueAttributes.add(attr);
+  const allAttributes: string[] = Object.keys(graph.nodes.types).reduce((acc: string[], label: string) => {
+    const labelAttributes = Object.keys(graph.nodes.types[label].attributes);
+    return acc.concat(labelAttributes);
+  }, []);
+
+  // Find the intersection of attributes across all nodes
+  const intersectionAttributes = allAttributes.filter((attr) => {
+    return Object.keys(graph.nodes.types).every((label) => {
+      return graph.nodes.types[label].attributes.hasOwnProperty(attr);
     });
   });
-  const attributes: string[] = Array.from(uniqueAttributes) as string[];
+
+  const uniqueIntersectionAttributes = Array.from(new Set(intersectionAttributes));
 
   return (
     <SettingsContainer>
@@ -85,7 +96,7 @@ const TableSettings = ({
           <Input
             type="checkbox"
             value={configuration.displayAttributes}
-            options={attributes}
+            options={uniqueIntersectionAttributes}
             onChange={(val: string[] | string) => {
               const updatedVal = Array.isArray(val) ? val : [val];
               updateSettings({ displayAttributes: updatedVal });
-- 
GitLab