From 4d0896a8b185c610c13e78909b9f631e67c41197 Mon Sep 17 00:00:00 2001 From: Michael Gartner Date: Sun, 24 Aug 2025 03:00:14 -0600 Subject: [PATCH 1/4] Add auto canvas relations setting to user preferences --- .../components/canvas/DiscourseNodeUtil.tsx | 20 ++++++++++++---- apps/roam/src/components/canvas/Tldraw.tsx | 15 +++++++++--- .../settings/HomePersonalSettings.tsx | 23 +++++++++++++++++++ apps/roam/src/data/userSettings.ts | 1 + 4 files changed, 51 insertions(+), 8 deletions(-) diff --git a/apps/roam/src/components/canvas/DiscourseNodeUtil.tsx b/apps/roam/src/components/canvas/DiscourseNodeUtil.tsx index 570ff8eac..9d9516a4f 100644 --- a/apps/roam/src/components/canvas/DiscourseNodeUtil.tsx +++ b/apps/roam/src/components/canvas/DiscourseNodeUtil.tsx @@ -38,6 +38,8 @@ import calcCanvasNodeSizeAndImg from "~/utils/calcCanvasNodeSizeAndImg"; import { createTextJsxFromSpans } from "./DiscourseRelationShape/helpers"; import { loadImage } from "~/utils/loadImage"; import { getRelationColor } from "./DiscourseRelationShape/DiscourseRelationUtil"; +import { AUTO_CANVAS_RELATIONS_KEY } from "~/data/userSettings"; +import { getSetting } from "~/utils/extensionSettings"; // TODO REPLACE WITH TLDRAW DEFAULTS // https://github.com/tldraw/tldraw/pull/1580/files @@ -546,11 +548,19 @@ export class BaseDiscourseNodeUtil extends ShapeUtil { // Update Shape Relations const relationIds = getRelationIds(); this.deleteRelationsInCanvas({ shape, relationIds }); - await this.createExistingRelations({ - shape, - relationIds, - finalUid: uid, - }); + + // Check if auto canvas relations is enabled + const autoCanvasRelations = getSetting( + AUTO_CANVAS_RELATIONS_KEY, + true, + ); + if (autoCanvasRelations) { + await this.createExistingRelations({ + shape, + relationIds, + finalUid: uid, + }); + } editor.setEditingShape(null); }} diff --git a/apps/roam/src/components/canvas/Tldraw.tsx b/apps/roam/src/components/canvas/Tldraw.tsx index 541901d11..15c2e20bc 100644 --- a/apps/roam/src/components/canvas/Tldraw.tsx +++ b/apps/roam/src/components/canvas/Tldraw.tsx @@ -82,6 +82,8 @@ import { createMigrations } from "./DiscourseRelationShape/discourseRelationMigr import ToastListener, { dispatchToastEvent } from "./ToastListener"; import sendErrorEmail from "~/utils/sendErrorEmail"; import { TLDRAW_DATA_ATTRIBUTE } from "./tldrawStyles"; +import { AUTO_CANVAS_RELATIONS_KEY } from "~/data/userSettings"; +import { getSetting } from "~/utils/extensionSettings"; declare global { interface Window { @@ -829,9 +831,16 @@ const InsideEditorAndUiContext = ({ editor.sideEffects.registerAfterCreateHandler("shape", (shape) => { const util = editor.getShapeUtil(shape); if (util instanceof BaseDiscourseNodeUtil) { - void util.createExistingRelations({ - shape: shape as DiscourseNodeShape, - }); + // Check if auto canvas relations is enabled + const autoCanvasRelations = getSetting( + AUTO_CANVAS_RELATIONS_KEY, + true, + ); + if (autoCanvasRelations) { + void util.createExistingRelations({ + shape: shape as DiscourseNodeShape, + }); + } } }); diff --git a/apps/roam/src/components/settings/HomePersonalSettings.tsx b/apps/roam/src/components/settings/HomePersonalSettings.tsx index b0ba42c27..d6f8821df 100644 --- a/apps/roam/src/components/settings/HomePersonalSettings.tsx +++ b/apps/roam/src/components/settings/HomePersonalSettings.tsx @@ -13,6 +13,7 @@ import { hideDiscourseFloatingMenu, } from "~/components/DiscourseFloatingMenu"; import { NodeSearchMenuTriggerSetting } from "../DiscourseNodeSearchMenu"; +import { AUTO_CANVAS_RELATIONS_KEY } from "~/data/userSettings"; const HomePersonalSettings = ({ onloadArgs }: { onloadArgs: OnloadArgs }) => { const extensionAPI = onloadArgs.extensionAPI; @@ -143,6 +144,28 @@ const HomePersonalSettings = ({ onloadArgs }: { onloadArgs: OnloadArgs }) => { } /> + { + const target = e.target as HTMLInputElement; + void extensionAPI.settings.set( + AUTO_CANVAS_RELATIONS_KEY, + target.checked, + ); + }} + labelElement={ + <> + Auto Canvas Relations + + + } + /> ); }; diff --git a/apps/roam/src/data/userSettings.ts b/apps/roam/src/data/userSettings.ts index a66cbf938..1fab6bd06 100644 --- a/apps/roam/src/data/userSettings.ts +++ b/apps/roam/src/data/userSettings.ts @@ -3,3 +3,4 @@ export const DEFAULT_CANVAS_PAGE_FORMAT_KEY = "default-canvas-page-format"; export const HIDE_METADATA_KEY = "hide-metadata"; export const DEFAULT_FILTERS_KEY = "default-filters"; export const QUERY_BUILDER_SETTINGS_KEY = "query-builder-settings"; +export const AUTO_CANVAS_RELATIONS_KEY = "auto-canvas-relations"; From 55cd7197574263d0f5b1ce700995b7622ec69119 Mon Sep 17 00:00:00 2001 From: Michael Gartner Date: Sun, 24 Aug 2025 03:04:13 -0600 Subject: [PATCH 2/4] . --- apps/roam/src/components/canvas/DiscourseNodeUtil.tsx | 1 - apps/roam/src/components/canvas/Tldraw.tsx | 1 - 2 files changed, 2 deletions(-) diff --git a/apps/roam/src/components/canvas/DiscourseNodeUtil.tsx b/apps/roam/src/components/canvas/DiscourseNodeUtil.tsx index 9d9516a4f..1cd12d801 100644 --- a/apps/roam/src/components/canvas/DiscourseNodeUtil.tsx +++ b/apps/roam/src/components/canvas/DiscourseNodeUtil.tsx @@ -549,7 +549,6 @@ export class BaseDiscourseNodeUtil extends ShapeUtil { const relationIds = getRelationIds(); this.deleteRelationsInCanvas({ shape, relationIds }); - // Check if auto canvas relations is enabled const autoCanvasRelations = getSetting( AUTO_CANVAS_RELATIONS_KEY, true, diff --git a/apps/roam/src/components/canvas/Tldraw.tsx b/apps/roam/src/components/canvas/Tldraw.tsx index 15c2e20bc..a6df7c7c6 100644 --- a/apps/roam/src/components/canvas/Tldraw.tsx +++ b/apps/roam/src/components/canvas/Tldraw.tsx @@ -831,7 +831,6 @@ const InsideEditorAndUiContext = ({ editor.sideEffects.registerAfterCreateHandler("shape", (shape) => { const util = editor.getShapeUtil(shape); if (util instanceof BaseDiscourseNodeUtil) { - // Check if auto canvas relations is enabled const autoCanvasRelations = getSetting( AUTO_CANVAS_RELATIONS_KEY, true, From 52a1bd82c4efb2ab7ce459f898355a5707db6eb9 Mon Sep 17 00:00:00 2001 From: Michael Gartner Date: Sun, 24 Aug 2025 03:08:39 -0600 Subject: [PATCH 3/4] Update auto canvas relations setting to default to false --- apps/roam/src/components/canvas/DiscourseNodeUtil.tsx | 2 +- apps/roam/src/components/canvas/Tldraw.tsx | 2 +- apps/roam/src/components/settings/HomePersonalSettings.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/roam/src/components/canvas/DiscourseNodeUtil.tsx b/apps/roam/src/components/canvas/DiscourseNodeUtil.tsx index 1cd12d801..060bb62d4 100644 --- a/apps/roam/src/components/canvas/DiscourseNodeUtil.tsx +++ b/apps/roam/src/components/canvas/DiscourseNodeUtil.tsx @@ -551,7 +551,7 @@ export class BaseDiscourseNodeUtil extends ShapeUtil { const autoCanvasRelations = getSetting( AUTO_CANVAS_RELATIONS_KEY, - true, + false, ); if (autoCanvasRelations) { await this.createExistingRelations({ diff --git a/apps/roam/src/components/canvas/Tldraw.tsx b/apps/roam/src/components/canvas/Tldraw.tsx index a6df7c7c6..b89769882 100644 --- a/apps/roam/src/components/canvas/Tldraw.tsx +++ b/apps/roam/src/components/canvas/Tldraw.tsx @@ -833,7 +833,7 @@ const InsideEditorAndUiContext = ({ if (util instanceof BaseDiscourseNodeUtil) { const autoCanvasRelations = getSetting( AUTO_CANVAS_RELATIONS_KEY, - true, + false, ); if (autoCanvasRelations) { void util.createExistingRelations({ diff --git a/apps/roam/src/components/settings/HomePersonalSettings.tsx b/apps/roam/src/components/settings/HomePersonalSettings.tsx index d6f8821df..467b91244 100644 --- a/apps/roam/src/components/settings/HomePersonalSettings.tsx +++ b/apps/roam/src/components/settings/HomePersonalSettings.tsx @@ -146,7 +146,7 @@ const HomePersonalSettings = ({ onloadArgs }: { onloadArgs: OnloadArgs }) => { /> { const target = e.target as HTMLInputElement; From 2295d700bda80971c6c9d913c19fd01f51c73b68 Mon Sep 17 00:00:00 2001 From: Michael Gartner Date: Sun, 24 Aug 2025 03:19:55 -0600 Subject: [PATCH 4/4] Refactor relation deletion logic in BaseDiscourseNodeUtil to ensure relations are deleted before creating existing relations when auto canvas relations are enabled. --- apps/roam/src/components/canvas/DiscourseNodeUtil.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/roam/src/components/canvas/DiscourseNodeUtil.tsx b/apps/roam/src/components/canvas/DiscourseNodeUtil.tsx index 060bb62d4..da1752d9e 100644 --- a/apps/roam/src/components/canvas/DiscourseNodeUtil.tsx +++ b/apps/roam/src/components/canvas/DiscourseNodeUtil.tsx @@ -546,14 +546,13 @@ export class BaseDiscourseNodeUtil extends ShapeUtil { this.updateProps(shape.id, shape.type, { title: text, uid }); // Update Shape Relations - const relationIds = getRelationIds(); - this.deleteRelationsInCanvas({ shape, relationIds }); - const autoCanvasRelations = getSetting( AUTO_CANVAS_RELATIONS_KEY, false, ); if (autoCanvasRelations) { + const relationIds = getRelationIds(); + this.deleteRelationsInCanvas({ shape, relationIds }); await this.createExistingRelations({ shape, relationIds,