Skip to content

Commit 2ad4fa7

Browse files
trangdoan982claude
andauthored
ENG-1315: Disable node type change in canvas create-node modal (#906)
Prevent node type mismatch by disabling the node type selector when creating nodes from canvas contexts (DiscourseNodeTools, Convert-to, shape select). Non-canvas flows (command palette, node tag popup) remain unaffected. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 7d40985 commit 2ad4fa7

3 files changed

Lines changed: 11 additions & 1 deletion

File tree

apps/roam/src/components/ModifyNodeDialog.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export type ModifyNodeDialogProps = {
4747
extensionAPI?: OnloadArgs["extensionAPI"];
4848
includeDefaultNodes?: boolean; // Include default nodes (Page, Block) in node type selector
4949
imageUrl?: string; // For image conversion from canvas
50+
disableNodeTypeChange?: boolean; // Disable node type selector (e.g. canvas contexts)
5051
onSuccess: (result: {
5152
text: string;
5253
uid: string;
@@ -65,6 +66,7 @@ const ModifyNodeDialog = ({
6566
extensionAPI,
6667
includeDefaultNodes = false,
6768
imageUrl,
69+
disableNodeTypeChange = false,
6870
onSuccess,
6971
onClose,
7072
}: RoamOverlayProps<ModifyNodeDialogProps>) => {
@@ -520,8 +522,13 @@ const ModifyNodeDialog = ({
520522
setReferencedNodeValue({ text: "", uid: "" });
521523
}
522524
}}
523-
disabled={mode === "edit"}
525+
disabled={mode === "edit" || disableNodeTypeChange}
524526
popoverProps={{ openOnTargetFocus: false }}
527+
className={
528+
mode === "edit" || disableNodeTypeChange
529+
? "cursor-not-allowed opacity-50"
530+
: ""
531+
}
525532
/>
526533
</Label>
527534
</div>

apps/roam/src/components/canvas/DiscourseNodeUtil.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,7 @@ export class BaseDiscourseNodeUtil extends BaseBoxShapeUtil<DiscourseNodeShape>
543543
: undefined,
544544
extensionAPI,
545545
includeDefaultNodes: true,
546+
disableNodeTypeChange: true,
546547
onSuccess: async ({ text, uid, action }) => {
547548
if (action === "edit") {
548549
if (isPageUid(shape.props.uid))
@@ -665,6 +666,7 @@ export class BaseDiscourseNodeUtil extends BaseBoxShapeUtil<DiscourseNodeShape>
665666
initialValue: { text: cleanedText, uid: "" },
666667
extensionAPI,
667668
includeDefaultNodes: true,
669+
disableNodeTypeChange: true,
668670
onSuccess: async ({ text, uid }) => {
669671
if (!extensionAPI) return;
670672
try {

apps/roam/src/components/canvas/uiOverrides.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ export const getOnSelectForShape = ({
162162
initialValue: { text: initialText, uid: "" },
163163
extensionAPI,
164164
includeDefaultNodes: true,
165+
disableNodeTypeChange: true,
165166
imageUrl,
166167
onSuccess: async ({ text, uid }) => {
167168
editor.deleteShapes([shape.id]);

0 commit comments

Comments
 (0)