From 0da66617a88a70cd8fea40726c913038b9a1951a Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 4 Oct 2025 14:14:02 +0300 Subject: [PATCH] chore(react): reintroduce link distance --- apps/client/src/widgets/note_map.ts | 33 -------------------- apps/client/src/widgets/note_map/NoteMap.tsx | 16 ++++++++++ apps/client/src/widgets/react/Slider.tsx | 20 ++++++++++++ 3 files changed, 36 insertions(+), 33 deletions(-) create mode 100644 apps/client/src/widgets/react/Slider.tsx diff --git a/apps/client/src/widgets/note_map.ts b/apps/client/src/widgets/note_map.ts index 8eb187837..1dec31d44 100644 --- a/apps/client/src/widgets/note_map.ts +++ b/apps/client/src/widgets/note_map.ts @@ -10,19 +10,6 @@ import type ForceGraph from "force-graph"; import type { GraphData, LinkObject, NodeObject } from "force-graph"; import type FNote from "../entities/fnote.js"; -const esc = utils.escapeHtml; - -const TPL = /*html*/`
- - - - -
- - -
-`; - type WidgetMode = "type" | "ribbon"; type Data = GraphData>; @@ -41,7 +28,6 @@ export default class NoteMapWidget extends NoteContextAwareWidget { constructor(widgetMode: WidgetMode) { super(); - this.fixNodes = false; // needed to save the status of the UI element. Is set later in the code this.widgetMode = widgetMode; // 'type' or 'ribbon' } @@ -55,25 +41,6 @@ export default class NoteMapWidget extends NoteContextAwareWidget { new ResizeObserver(() => this.setDimensions()).observe(this.$container[0]); } - async refreshWithNote(note: FNote) { - this.$widget.show(); - - const ForceGraph = (await import("force-graph")).default; - this.graph = new ForceGraph(this.$container[0]) - // Rendering code was here - - let distancevalue = 40; // default value for the link force of the nodes - - this.$widget.find(".fixnodes-type-switcher input").on("change", async (e) => { - distancevalue = parseInt(e.target.closest("input")?.value ?? "0"); - this.graph.d3Force("link")?.distance(distancevalue); - - this.renderData(data); - }); - - this.renderData(data); - } - cleanup() { this.$container.html(""); } diff --git a/apps/client/src/widgets/note_map/NoteMap.tsx b/apps/client/src/widgets/note_map/NoteMap.tsx index 182ff1010..5365c22a7 100644 --- a/apps/client/src/widgets/note_map/NoteMap.tsx +++ b/apps/client/src/widgets/note_map/NoteMap.tsx @@ -11,6 +11,7 @@ import ActionButton from "../react/ActionButton"; import { t } from "../../services/i18n"; import link_context_menu from "../../menus/link_context_menu"; import appContext from "../../components/app_context"; +import Slider from "../react/Slider"; interface NoteMapProps { note: FNote; @@ -27,6 +28,8 @@ export default function NoteMap({ note, widgetMode, parentRef }: NoteMapProps) { const graphRef = useRef>>(); const containerSize = useElementSize(parentRef); const [ fixNodes, setFixNodes ] = useState(false); + const [ linkDistance, setLinkDistance ] = useState(40); + const notesAndRelationsRef = useRef(); // Build the note graph instance. useEffect(() => { @@ -71,11 +74,18 @@ export default function NoteMap({ note, widgetMode, parentRef }: NoteMapProps) { // Set data graph.graphData(notesAndRelations); + notesAndRelationsRef.current = notesAndRelations; }); return () => container.replaceChildren(); }, [ note, mapType ]); + useEffect(() => { + if (!graphRef.current || !notesAndRelationsRef.current) return; + graphRef.current.d3Force("link")?.distance(linkDistance); + graphRef.current.graphData(notesAndRelationsRef.current); + }, [ linkDistance ]); + // React to container size useEffect(() => { if (!containerSize || !graphRef.current) return; @@ -110,6 +120,12 @@ export default function NoteMap({ note, widgetMode, parentRef }: NoteMapProps) { onClick={() => setFixNodes(!fixNodes)} frame /> + +
diff --git a/apps/client/src/widgets/react/Slider.tsx b/apps/client/src/widgets/react/Slider.tsx new file mode 100644 index 000000000..515362ea4 --- /dev/null +++ b/apps/client/src/widgets/react/Slider.tsx @@ -0,0 +1,20 @@ +interface SliderProps { + value: number; + onChange(newValue: number); + min?: number; + max?: number; + title?: string; +} + +export default function Slider({ onChange, ...restProps }: SliderProps) { + return ( + { + onChange(e.currentTarget.valueAsNumber); + }} + {...restProps} + /> + ); +}