From 29239590bacb9d770aa0135b4dba96bbd09ce126 Mon Sep 17 00:00:00 2001 From: IRBorisov <8611739+IRBorisov@users.noreply.github.com> Date: Sun, 30 Jul 2023 00:47:07 +0300 Subject: [PATCH] Setup term graph experiments --- .../src/components/Common/ConceptTab.tsx | 2 +- .../src/components/Common/GraphThemed.tsx | 29 +++++++++ rsconcept/frontend/src/index.css | 2 +- .../src/pages/RSFormPage/EditorTermGraph.tsx | 65 ++++++++++++++----- .../frontend/src/pages/RSFormPage/RSTabs.tsx | 6 +- rsconcept/frontend/src/utils/models.ts | 4 +- rsconcept/frontend/src/utils/staticUI.ts | 20 +++++- 7 files changed, 105 insertions(+), 23 deletions(-) create mode 100644 rsconcept/frontend/src/components/Common/GraphThemed.tsx diff --git a/rsconcept/frontend/src/components/Common/ConceptTab.tsx b/rsconcept/frontend/src/components/Common/ConceptTab.tsx index 5b77a4ed..7868a717 100644 --- a/rsconcept/frontend/src/components/Common/ConceptTab.tsx +++ b/rsconcept/frontend/src/components/Common/ConceptTab.tsx @@ -5,7 +5,7 @@ function ConceptTab({ children, className, ...otherProps }: TabProps) { return ( {children} diff --git a/rsconcept/frontend/src/components/Common/GraphThemed.tsx b/rsconcept/frontend/src/components/Common/GraphThemed.tsx new file mode 100644 index 00000000..c2487ac1 --- /dev/null +++ b/rsconcept/frontend/src/components/Common/GraphThemed.tsx @@ -0,0 +1,29 @@ +import { Ref } from 'react'; +import { darkTheme, GraphCanvas, GraphCanvasProps, GraphCanvasRef, lightTheme } from 'reagraph'; + +import { useConceptTheme } from '../../context/ThemeContext'; +import { resources } from '../../utils/constants'; + +interface GraphThemedProps +extends Omit { + ref?: Ref + sizeClass: string +} + +function GraphThemed({ sizeClass, ...props }: GraphThemedProps) { + const { darkMode } = useConceptTheme(); + + return ( +
+
+ +
+
+ ); +} + +export default GraphThemed; diff --git a/rsconcept/frontend/src/index.css b/rsconcept/frontend/src/index.css index b979485e..edaddada 100644 --- a/rsconcept/frontend/src/index.css +++ b/rsconcept/frontend/src/index.css @@ -52,7 +52,7 @@ } .clr-tab { - @apply text-gray-600 dark:text-zinc-200 hover:bg-gray-300 dark:hover:bg-gray-400 + @apply clr-border text-gray-600 dark:text-zinc-200 hover:bg-gray-300 dark:hover:bg-gray-400 } .clr-hover { diff --git a/rsconcept/frontend/src/pages/RSFormPage/EditorTermGraph.tsx b/rsconcept/frontend/src/pages/RSFormPage/EditorTermGraph.tsx index 07ef5aa8..260e1ad4 100644 --- a/rsconcept/frontend/src/pages/RSFormPage/EditorTermGraph.tsx +++ b/rsconcept/frontend/src/pages/RSFormPage/EditorTermGraph.tsx @@ -1,13 +1,16 @@ -import { useMemo } from 'react'; -import { darkTheme, GraphCanvas, GraphEdge, GraphNode, lightTheme } from 'reagraph'; +import { useMemo, useRef } from 'react'; +import Select from 'react-select'; +import { GraphCanvasRef, GraphEdge, GraphNode, LayoutTypes, useSelection } from 'reagraph'; +import GraphThemed from '../../components/Common/GraphThemed'; import { useRSForm } from '../../context/RSFormContext'; -import { useConceptTheme } from '../../context/ThemeContext'; -import { resources } from '../../utils/constants'; +import useLocalStorage from '../../hooks/useLocalStorage'; +import { GraphLayoutSelector } from '../../utils/staticUI'; function EditorTermGraph() { const { schema } = useRSForm(); - const { darkMode } = useConceptTheme(); + const [ layout, setLayout ] = useLocalStorage('graph_layout', 'forceatlas2'); + const graphRef = useRef(null); const nodes: GraphNode[] = useMemo(() => { return schema?.items.map(cst => { @@ -18,7 +21,7 @@ function EditorTermGraph() { ) ?? []; }, [schema?.items]); - const edges = useMemo(() => { + const edges: GraphEdge[] = useMemo(() => { const result: GraphEdge[] = []; let edgeID = 1; schema?.graph.nodes.forEach(source => { @@ -34,17 +37,49 @@ function EditorTermGraph() { return result; }, [schema?.graph]); + const { + selections, actives, + onNodeClick, + onCanvasClick, + onNodePointerOver, + onNodePointerOut + } = useSelection({ + type: 'multi', // 'single' | 'multi' | 'multiModifier' + ref: graphRef, + nodes, + edges, + pathSelectionType: 'all', + focusOnSelect: 'singleOnly' + }); + return ( -
-
- +
+
+