From d3cc3c4296f94126be84e30951120bb0cde1ff02 Mon Sep 17 00:00:00 2001
From: 2427021 <s.a.vink@students.uu.nl>
Date: Mon, 25 Mar 2024 12:04:16 +0100
Subject: [PATCH] feat(visManager): standardize settings

---
 .../lib/components/color-mode/index.tsx       |  2 +-
 .../lib/components/configuration/index.tsx    | 24 +++++++++++++++++++
 .../shared/lib/components/dropdowns/index.tsx |  5 +++-
 libs/shared/lib/components/inputs/index.tsx   | 14 ++++++++++-
 libs/shared/lib/info/settings.tsx             | 14 ++++++-----
 libs/shared/lib/vis/manager.tsx               |  2 ++
 .../visualizations/matrixvis/matrixvis.tsx    |  6 +++--
 .../nodelinkvis/nodelinkvis.tsx               |  6 +++--
 .../vis/visualizations/paohvis/paohvis.tsx    |  7 +++++-
 .../visualizations/rawjsonvis/rawjsonvis.tsx  |  7 +++++-
 .../vis/visualizations/tablevis/tablevis.tsx  |  6 +++--
 11 files changed, 76 insertions(+), 17 deletions(-)
 create mode 100644 libs/shared/lib/components/configuration/index.tsx

diff --git a/libs/shared/lib/components/color-mode/index.tsx b/libs/shared/lib/components/color-mode/index.tsx
index 97abb3e04..24a32b5b3 100644
--- a/libs/shared/lib/components/color-mode/index.tsx
+++ b/libs/shared/lib/components/color-mode/index.tsx
@@ -47,7 +47,7 @@ const ColorMode = () => {
         <TooltipTrigger asChild>
           <Button variant="ghost" iconComponent={iconComponent} onClick={toggleTheme} />
         </TooltipTrigger>
-        <TooltipContent side={'bottom'}>
+        <TooltipContent side={'right'}>
           <p>{`Switch to ${theme === 'dark-mode' ? 'light' : 'dark'}-mode`}</p>
         </TooltipContent>
       </Tooltip>
diff --git a/libs/shared/lib/components/configuration/index.tsx b/libs/shared/lib/components/configuration/index.tsx
new file mode 100644
index 000000000..736cf3167
--- /dev/null
+++ b/libs/shared/lib/components/configuration/index.tsx
@@ -0,0 +1,24 @@
+import React, { ReactNode } from 'react';
+
+type SettingsContainerProps = {
+  children: ReactNode;
+};
+
+export function SettingsContainer({ children }: SettingsContainerProps) {
+  return <div className="p-4">{children}</div>;
+}
+
+type SettingsHeaderProps = {
+  name: string;
+  icon?: ReactNode;
+  onClickIcon?: () => void;
+};
+
+export function SettingsHeader({ name, icon, onClickIcon }: SettingsHeaderProps) {
+  return (
+    <div className="flex justify-between items-center">
+      <span className="text-xs font-bold">{name}</span>
+      {icon && icon}
+    </div>
+  );
+}
diff --git a/libs/shared/lib/components/dropdowns/index.tsx b/libs/shared/lib/components/dropdowns/index.tsx
index 658d30e4b..2d840e6d3 100644
--- a/libs/shared/lib/components/dropdowns/index.tsx
+++ b/libs/shared/lib/components/dropdowns/index.tsx
@@ -26,10 +26,13 @@ type DropdownButtonProps = {
 };
 
 export function DropdownButton({ title, onClick, size, disabled }: DropdownButtonProps) {
+  const paddingClass = size === 'xs' ? 'py-1' : size === 'sm' ? 'px-1 py-1' : size === 'md' ? 'px-2 py-1' : 'px-4 py-2';
+  const textSizeClass = size === 'xs' ? 'text-xs' : size === 'sm' ? 'text-sm' : size === 'md' ? 'text-base' : 'text-lg';
+
   return (
     <>
       <button
-        className="inline-flex w-full justify-between items-center gap-x-1.5 rounded bg-light px-3 py-2 text-secondary-900 shadow-sm ring-1 ring-inset ring-secondary-300 hover:bg-secondary-50 disabled:bg-secondary-100 disabled:cursor-not-allowed disabled:text-secondary-400"
+        className={`inline-flex w-full justify-between items-center gap-x-1.5 rounded bg-light ${textSizeClass} ${paddingClass} text-secondary-900 shadow-sm ring-1 ring-inset ring-secondary-300 hover:bg-secondary-50 disabled:bg-secondary-100 disabled:cursor-not-allowed disabled:text-secondary-400`}
         onClick={onClick}
         disabled={disabled}
       >
diff --git a/libs/shared/lib/components/inputs/index.tsx b/libs/shared/lib/components/inputs/index.tsx
index e52a53dd7..abb4bd547 100644
--- a/libs/shared/lib/components/inputs/index.tsx
+++ b/libs/shared/lib/components/inputs/index.tsx
@@ -63,6 +63,7 @@ type DropdownProps = {
   value: string | number | undefined;
   type: 'dropdown';
   options: any;
+  size?: 'xs' | 'sm' | 'md' | 'xl';
   tooltip?: string;
   onChange?: (value: string | number) => void;
   required?: boolean;
@@ -242,7 +243,17 @@ export const BooleanInput = ({ label, value, onChange, tooltip }: BooleanProps)
   );
 };
 
-export const DropDownInput = ({ label, value, options, onChange, required = false, tooltip, disabled = false, info }: DropdownProps) => {
+export const DropDownInput = ({
+  label,
+  value,
+  options,
+  onChange,
+  required = false,
+  tooltip,
+  size = 'sm',
+  disabled = false,
+  info,
+}: DropdownProps) => {
   const dropdownRef = React.useRef<HTMLDivElement>(null);
   const [isDropdownOpen, setIsDropdownOpen] = React.useState<boolean>(false);
 
@@ -273,6 +284,7 @@ export const DropDownInput = ({ label, value, options, onChange, required = fals
       <DropdownContainer className="w-full" ref={dropdownRef}>
         <DropdownButton
           title={value}
+          size={size}
           disabled={disabled}
           onClick={(e) => {
             e.stopPropagation();
diff --git a/libs/shared/lib/info/settings.tsx b/libs/shared/lib/info/settings.tsx
index 02122089c..999092997 100644
--- a/libs/shared/lib/info/settings.tsx
+++ b/libs/shared/lib/info/settings.tsx
@@ -7,8 +7,8 @@ type Props = {};
 
 export default function Settings({ manager }: { manager: any }) {
   return (
-    <div>
-      <div className="border-b border-secondary-200">
+    <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
@@ -21,13 +21,15 @@ export default function Settings({ manager }: { manager: any }) {
             }}
           />
         </div>
-        <div className="flex justify-between items-center px-4 py-4">
+        <div className="flex justify-between items-center px-4 py-1">
           <span className="text-xs font-normal">Type</span>
-          <Input type="dropdown" />
+          <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-4">
+        <div className="flex justify-between items-center px-4 py-1">
           <span className="text-xs font-normal">Name</span>
-          <Input type="text" />
+          <input type="text" className="border rouded w-36" value={manager.active} onChange={() => {}} />
         </div>
       </div>
       {manager.renderSettings()}
diff --git a/libs/shared/lib/vis/manager.tsx b/libs/shared/lib/vis/manager.tsx
index c69ca19d1..f3624bc30 100644
--- a/libs/shared/lib/vis/manager.tsx
+++ b/libs/shared/lib/vis/manager.tsx
@@ -36,6 +36,7 @@ export const useVisualizationManager = () => {
   const [visualization, setVisualization] = useState<VISComponentType>();
   const [hoverItem, setHoverItem] = useState<any>();
   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;
@@ -135,6 +136,7 @@ export const useVisualizationManager = () => {
     renderComponent,
     renderSettings,
     active,
+    activeType,
     tabs,
     changeActive,
     reorderVisualizations,
diff --git a/libs/shared/lib/vis/visualizations/matrixvis/matrixvis.tsx b/libs/shared/lib/vis/visualizations/matrixvis/matrixvis.tsx
index 86c3877bb..b0954e8aa 100644
--- a/libs/shared/lib/vis/visualizations/matrixvis/matrixvis.tsx
+++ b/libs/shared/lib/vis/visualizations/matrixvis/matrixvis.tsx
@@ -6,6 +6,7 @@ import { MatrixPixi } from './components/MatrixPixi';
 import { VisualizationPropTypes, VISComponentType } from '../../types';
 import Input from '@graphpolaris/shared/lib/components/inputs';
 import { GraphMetaData } from '@graphpolaris/shared/lib/data-access/statistics';
+import { SettingsContainer, SettingsHeader } from '@graphpolaris/shared/lib/components/configuration';
 
 export interface MatrixVisProps {
   marks: string;
@@ -46,7 +47,8 @@ const MatrixSettings = ({
   updateSettings: (val: any) => void;
 }) => {
   return (
-    <div>
+    <SettingsContainer>
+      <SettingsHeader name="JSON visualization" />
       <Input
         type="dropdown"
         label="Configure marks"
@@ -54,7 +56,7 @@ const MatrixSettings = ({
         options={['rect', 'circle']}
         onChange={(val) => updateSettings({ marks: val })}
       />
-    </div>
+    </SettingsContainer>
   );
 };
 
diff --git a/libs/shared/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx b/libs/shared/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx
index 8d1d36db2..1788afec5 100644
--- a/libs/shared/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx
+++ b/libs/shared/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx
@@ -7,6 +7,7 @@ import { ML, setShortestPathSource, setShortestPathTarget } from '../../../data-
 import { VisualizationPropTypes, VISComponentType } from '../../types';
 import Input from '@graphpolaris/shared/lib/components/inputs';
 import { GraphMetaData } from '@graphpolaris/shared/lib/data-access/statistics';
+import { SettingsContainer, SettingsHeader } from '@graphpolaris/shared/lib/components/configuration';
 
 export interface NodelinkVisProps {
   layout: string;
@@ -92,7 +93,8 @@ const NodelinkSettings = ({
   updateSettings: (val: any) => void;
 }) => {
   return (
-    <div>
+    <SettingsContainer>
+      <SettingsHeader name="NodeLink visualization" />
       <Input
         type="dropdown"
         label="Layout"
@@ -106,7 +108,7 @@ const NodelinkSettings = ({
         value={configuration.showPopUpOnHover}
         onChange={(val) => updateSettings({ showPopUpOnHover: val })}
       />
-    </div>
+    </SettingsContainer>
   );
 };
 
diff --git a/libs/shared/lib/vis/visualizations/paohvis/paohvis.tsx b/libs/shared/lib/vis/visualizations/paohvis/paohvis.tsx
index d18c548ce..ba55bee18 100644
--- a/libs/shared/lib/vis/visualizations/paohvis/paohvis.tsx
+++ b/libs/shared/lib/vis/visualizations/paohvis/paohvis.tsx
@@ -29,6 +29,7 @@ import MakePaohvisMenu from './components/MakePaohvisMenu';
 import { RowLabelColumn } from './components/RowLabelColumn';
 import { VISComponentType, VisualizationPropTypes } from '../../types';
 import { GraphMetaData } from '@graphpolaris/shared/lib/data-access/statistics';
+import { SettingsContainer, SettingsHeader } from '@graphpolaris/shared/lib/components/configuration';
 
 type PaohvisViewModelState = {
   rowHeight: number;
@@ -654,7 +655,11 @@ const PaohSettings = ({
   graph: GraphMetaData;
   updateSettings: (val: any) => void;
 }) => {
-  return <div>To be implemented</div>;
+  return (
+    <SettingsContainer>
+      <SettingsHeader name="Paoh visualization" />
+    </SettingsContainer>
+  );
 };
 
 export const PaohVisComponent: VISComponentType = {
diff --git a/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx b/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx
index 29d370bb7..8009c5ffd 100644
--- a/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx
+++ b/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx
@@ -2,6 +2,7 @@ import React, { useEffect } from 'react';
 import ReactJSONView from 'react-json-view';
 import { VisualizationPropTypes, VISComponentType } from '../../types';
 import { GraphMetaData } from '@graphpolaris/shared/lib/data-access/statistics';
+import { SettingsContainer, SettingsHeader } from '@graphpolaris/shared/lib/components/configuration';
 
 export interface RawJSONVisProps {}
 
@@ -34,7 +35,11 @@ const RawJSONSettings = ({
   graph: GraphMetaData;
   updateSettings: (val: any) => void;
 }) => {
-  return <div>To be implemented</div>;
+  return (
+    <SettingsContainer>
+      <SettingsHeader name="JSON visualization" />
+    </SettingsContainer>
+  );
 };
 
 export const RawJSONComponent: VISComponentType = {
diff --git a/libs/shared/lib/vis/visualizations/tablevis/tablevis.tsx b/libs/shared/lib/vis/visualizations/tablevis/tablevis.tsx
index d740b4a7a..4aa2c453f 100644
--- a/libs/shared/lib/vis/visualizations/tablevis/tablevis.tsx
+++ b/libs/shared/lib/vis/visualizations/tablevis/tablevis.tsx
@@ -4,6 +4,7 @@ import { SchemaAttribute } from '../../../schema';
 import { VisualizationPropTypes, VISComponentType } from '../../types';
 import Input from '@graphpolaris/shared/lib/components/inputs';
 import { GraphMetaData } from '@graphpolaris/shared/lib/data-access/statistics';
+import { SettingsContainer, SettingsHeader } from '@graphpolaris/shared/lib/components/configuration';
 
 export type TableProps = {
   showBarplot: boolean;
@@ -53,7 +54,8 @@ const TableSettings = ({
   updateSettings: (val: any) => void;
 }) => {
   return (
-    <div>
+    <SettingsContainer>
+      <SettingsHeader name="Table visualization" />
       <Input
         type="dropdown"
         label="Items per page"
@@ -67,7 +69,7 @@ const TableSettings = ({
         value={configuration.showBarplot}
         onChange={(val) => updateSettings({ showBarplot: val })}
       />
-    </div>
+    </SettingsContainer>
   );
 };
 
-- 
GitLab