feat(subgraph): hide linked widget content - #14763
Conversation
🎨 Storybook: ✅ Built — View Storybook🎭 Playwright: ❌ 1771 passed, 9 failed · 2 flaky❌ Failed Tests📊 Browser Reports
📦 Bundle: 8.46 MB gzip 🔴 +1.15 kBDetailsSummary
Category Glance App Entry Points — 3.64 kB (baseline 3.64 kB) • ⚪ 0 BMain entry bundles and manifests
Status: 1 added / 1 removed Graph Workspace — 1.35 MB (baseline 1.35 MB) • 🔴 +1.85 kBGraph editor runtime, canvas, workflow orchestration
Status: 1 added / 1 removed / 1 unchanged Views & Navigation — 124 kB (baseline 124 kB) • 🔴 +22 BTop-level views, pages, and routed surfaces
Status: 14 added / 14 removed / 3 unchanged Panels & Settings — 570 kB (baseline 570 kB) • ⚪ 0 BConfiguration panels, inspectors, and settings screens
Status: 10 added / 10 removed / 16 unchanged User & Accounts — 27 kB (baseline 27 kB) • ⚪ 0 BAuthentication, profile, and account management bundles
Status: 6 added / 6 removed / 4 unchanged Editors & Dialogs — 124 kB (baseline 124 kB) • ⚪ 0 BModals, dialogs, drawers, and in-app editors
Status: 6 added / 6 removed / 1 unchanged UI Components — 71 kB (baseline 71 kB) • ⚪ 0 BReusable component library chunks
Status: 7 added / 7 removed / 7 unchanged Data & Services — 3.49 MB (baseline 3.48 MB) • 🔴 +2.77 kBStores, services, APIs, and repositories
Status: 14 added / 14 removed / 3 unchanged Utilities & Hooks — 386 kB (baseline 386 kB) • ⚪ 0 BHelpers, composables, and utility bundles
Status: 16 added / 16 removed / 20 unchanged Vendor & Third-Party — 15.7 MB (baseline 15.7 MB) • ⚪ 0 BExternal libraries and shared vendor chunks Status: 16 unchanged Other — 13.8 MB (baseline 13.8 MB) • 🔴 +66 BBundles that do not match a named category
Status: 71 added / 71 removed / 210 unchanged ⚡ Performance Report
Show regressions
All metrics
Historical variance (last 15 runs)
Trend (last 15 commits on main)
Raw data{
"timestamp": "2026-08-07T13:44:10.604Z",
"gitSha": "dc9b1f705d55ab1111caa44abe20e5a8cb2ffa2b",
"branch": "jaeone94/hide-linked-widget-content",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2130.741999999998,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.811,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 626.6020000000001,
"heapDeltaBytes": 5373832,
"heapUsedBytes": 69384652,
"domNodes": 18,
"jsHeapTotalBytes": 25427968,
"scriptDurationMs": 28.555999999999997,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "canvas-idle",
"durationMs": 2022.8700000000117,
"styleRecalcs": 10,
"styleRecalcDurationMs": 9.044,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 484.386,
"heapDeltaBytes": 5371512,
"heapUsedBytes": 69389032,
"domNodes": 20,
"jsHeapTotalBytes": 24641536,
"scriptDurationMs": 17.198,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "canvas-mouse-sweep",
"durationMs": 2150.8870000000115,
"styleRecalcs": 83,
"styleRecalcDurationMs": 51.867,
"layouts": 12,
"layoutDurationMs": 3.942,
"taskDurationMs": 1070.7630000000001,
"heapDeltaBytes": 106428,
"heapUsedBytes": 64112224,
"domNodes": 65,
"jsHeapTotalBytes": 25427968,
"scriptDurationMs": 138.38,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1857.2370000000546,
"styleRecalcs": 75,
"styleRecalcDurationMs": 35.33,
"layouts": 12,
"layoutDurationMs": 3.5620000000000003,
"taskDurationMs": 869.182,
"heapDeltaBytes": -13895428,
"heapUsedBytes": 50108084,
"domNodes": -278,
"jsHeapTotalBytes": 22786048,
"scriptDurationMs": 113.959,
"eventListeners": -153,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1778.3289999999852,
"styleRecalcs": 31,
"styleRecalcDurationMs": 19.666,
"layouts": 6,
"layoutDurationMs": 0.7699999999999998,
"taskDurationMs": 476.46500000000003,
"heapDeltaBytes": 8443300,
"heapUsedBytes": 72662512,
"domNodes": 75,
"jsHeapTotalBytes": 24379392,
"scriptDurationMs": 29.189999999999998,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1780.0280000000157,
"styleRecalcs": 33,
"styleRecalcDurationMs": 17.318,
"layouts": 6,
"layoutDurationMs": 0.7229999999999999,
"taskDurationMs": 386.059,
"heapDeltaBytes": 8351308,
"heapUsedBytes": 72444276,
"domNodes": 77,
"jsHeapTotalBytes": 25427968,
"scriptDurationMs": 19.518,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "dom-widget-clipping",
"durationMs": 628.8559999999848,
"styleRecalcs": 12,
"styleRecalcDurationMs": 7.980000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 403.616,
"heapDeltaBytes": -11028596,
"heapUsedBytes": 53061972,
"domNodes": 20,
"jsHeapTotalBytes": 25165824,
"scriptDurationMs": 59.449999999999996,
"eventListeners": 2,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "dom-widget-clipping",
"durationMs": 589.9799999999686,
"styleRecalcs": 11,
"styleRecalcDurationMs": 7.252000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 375.981,
"heapDeltaBytes": -10997412,
"heapUsedBytes": 53006120,
"domNodes": 18,
"jsHeapTotalBytes": 25165824,
"scriptDurationMs": 56.245000000000005,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-idle",
"durationMs": 2085.6940000000463,
"styleRecalcs": 9,
"styleRecalcDurationMs": 8.514000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 844.894,
"heapDeltaBytes": 7868364,
"heapUsedBytes": 67384200,
"domNodes": -280,
"jsHeapTotalBytes": 3252224,
"scriptDurationMs": 135.42200000000003,
"eventListeners": -179,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2019.0249999999423,
"styleRecalcs": 7,
"styleRecalcDurationMs": 6.6800000000000015,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 701.395,
"heapDeltaBytes": 6075480,
"heapUsedBytes": 66766940,
"domNodes": -282,
"jsHeapTotalBytes": 3252224,
"scriptDurationMs": 107.017,
"eventListeners": -149,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-pan",
"durationMs": 2244.5699999999533,
"styleRecalcs": 68,
"styleRecalcDurationMs": 14.764,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1373.242,
"heapDeltaBytes": 3966660,
"heapUsedBytes": 64945584,
"domNodes": -285,
"jsHeapTotalBytes": 3969024,
"scriptDurationMs": 434.057,
"eventListeners": -147,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 2138.7039999999615,
"styleRecalcs": 68,
"styleRecalcDurationMs": 14.037,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1244.491,
"heapDeltaBytes": 4952760,
"heapUsedBytes": 65557252,
"domNodes": -286,
"jsHeapTotalBytes": 3444736,
"scriptDurationMs": 411.912,
"eventListeners": -149,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-zoom",
"durationMs": 3297.4969999999644,
"styleRecalcs": 64,
"styleRecalcDurationMs": 15.257,
"layouts": 60,
"layoutDurationMs": 8.526,
"taskDurationMs": 1665.7990000000002,
"heapDeltaBytes": 2543076,
"heapUsedBytes": 64667636,
"domNodes": -289,
"jsHeapTotalBytes": 5873664,
"scriptDurationMs": 570.604,
"eventListeners": -183,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-zoom",
"durationMs": 3181.5319999999474,
"styleRecalcs": 65,
"styleRecalcDurationMs": 14.744,
"layouts": 60,
"layoutDurationMs": 7.852999999999999,
"taskDurationMs": 1529.899,
"heapDeltaBytes": -3897532,
"heapUsedBytes": 58204660,
"domNodes": -287,
"jsHeapTotalBytes": 6660096,
"scriptDurationMs": 525.766,
"eventListeners": -153,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "minimap-idle",
"durationMs": 2044.0020000000345,
"styleRecalcs": 7,
"styleRecalcDurationMs": 7.074000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 830.379,
"heapDeltaBytes": 6893224,
"heapUsedBytes": 67358196,
"domNodes": -283,
"jsHeapTotalBytes": 3252224,
"scriptDurationMs": 124.962,
"eventListeners": -151,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "minimap-idle",
"durationMs": 2040.0399999999763,
"styleRecalcs": 8,
"styleRecalcDurationMs": 6.954999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 694.2729999999999,
"heapDeltaBytes": 7245728,
"heapUsedBytes": 68123500,
"domNodes": -284,
"jsHeapTotalBytes": 3252224,
"scriptDurationMs": 101.7,
"eventListeners": -149,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 626.7290000000116,
"styleRecalcs": 46,
"styleRecalcDurationMs": 10.692,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 425.44499999999994,
"heapDeltaBytes": -10128152,
"heapUsedBytes": 53942128,
"domNodes": 18,
"jsHeapTotalBytes": 25690112,
"scriptDurationMs": 127.68199999999999,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 596.1540000000696,
"styleRecalcs": 47,
"styleRecalcDurationMs": 10.886,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 401.17800000000005,
"heapDeltaBytes": -10550344,
"heapUsedBytes": 53801656,
"domNodes": 20,
"jsHeapTotalBytes": 25690112,
"scriptDurationMs": 121.2,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "subgraph-idle",
"durationMs": 2003.85,
"styleRecalcs": 10,
"styleRecalcDurationMs": 9.831,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 582.453,
"heapDeltaBytes": 5494596,
"heapUsedBytes": 69666808,
"domNodes": 20,
"jsHeapTotalBytes": 24903680,
"scriptDurationMs": 22.212,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "subgraph-idle",
"durationMs": 1996.112999999923,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 467.02399999999994,
"heapDeltaBytes": 4967196,
"heapUsedBytes": 69227908,
"domNodes": 20,
"jsHeapTotalBytes": 24903680,
"scriptDurationMs": 14.029,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1791.2149999999656,
"styleRecalcs": 78,
"styleRecalcDurationMs": 41.95,
"layouts": 16,
"layoutDurationMs": 4.871,
"taskDurationMs": 909.949,
"heapDeltaBytes": -17745364,
"heapUsedBytes": 46412512,
"domNodes": -281,
"jsHeapTotalBytes": 23048192,
"scriptDurationMs": 102.572,
"eventListeners": -153,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1706.862000000001,
"styleRecalcs": 76,
"styleRecalcDurationMs": 35.759,
"layouts": 16,
"layoutDurationMs": 4.799,
"taskDurationMs": 807.874,
"heapDeltaBytes": -16909432,
"heapUsedBytes": 47196776,
"domNodes": -279,
"jsHeapTotalBytes": 23572480,
"scriptDurationMs": 91.311,
"eventListeners": -153,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "subgraph-transition-enter",
"durationMs": 1385.514999999998,
"styleRecalcs": 18,
"styleRecalcDurationMs": 28.635999999999996,
"layouts": 14,
"layoutDurationMs": 11.100999999999999,
"taskDurationMs": 938.1339999999998,
"heapDeltaBytes": 33148804,
"heapUsedBytes": 99674028,
"domNodes": 13753,
"jsHeapTotalBytes": 13369344,
"scriptDurationMs": 35.929,
"eventListeners": 2455,
"totalBlockingTimeMs": 122,
"frameDurationMs": 16.666666666666696,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8607.219999999983,
"styleRecalcs": 250,
"styleRecalcDurationMs": 43.305,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 5032.503,
"heapDeltaBytes": 13799044,
"heapUsedBytes": 73330440,
"domNodes": -281,
"jsHeapTotalBytes": 5804032,
"scriptDurationMs": 1536.673,
"eventListeners": -131,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "viewport-pan-sweep",
"durationMs": 8277.699999999983,
"styleRecalcs": 250,
"styleRecalcDurationMs": 40.393,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 4400.059,
"heapDeltaBytes": 11110508,
"heapUsedBytes": 71256268,
"domNodes": -281,
"jsHeapTotalBytes": 6328320,
"scriptDurationMs": 1320.04,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 18535.266999999978,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 18517.674,
"heapDeltaBytes": -42348092,
"heapUsedBytes": 177383328,
"domNodes": -8312,
"jsHeapTotalBytes": -7806976,
"scriptDurationMs": 590.669,
"eventListeners": -16387,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.776666666666763,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 18145.76899999997,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 18128.365999999998,
"heapDeltaBytes": -43692588,
"heapUsedBytes": 166588136,
"domNodes": -8341,
"jsHeapTotalBytes": -9904128,
"scriptDurationMs": 581.036,
"eventListeners": -16389,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.776666666666642,
"p95FrameDurationMs": 16.80000000000291
},
{
"name": "vue-large-graph-pan",
"durationMs": 23983.126000000026,
"styleRecalcs": 182,
"styleRecalcDurationMs": 29.864,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 23944.9,
"heapDeltaBytes": -54725832,
"heapUsedBytes": 170706412,
"domNodes": -8312,
"jsHeapTotalBytes": -10235904,
"scriptDurationMs": 996.408,
"eventListeners": -16379,
"totalBlockingTimeMs": 1163,
"frameDurationMs": 17.779999999999927,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 21739.208000000075,
"styleRecalcs": 152,
"styleRecalcDurationMs": 20.345000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 21711.53,
"heapDeltaBytes": -52637156,
"heapUsedBytes": 164877912,
"domNodes": -8312,
"jsHeapTotalBytes": -9904128,
"scriptDurationMs": 889.5360000000001,
"eventListeners": -16377,
"totalBlockingTimeMs": 482,
"frameDurationMs": 18.333333333333332,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "workflow-execution",
"durationMs": 479.2720000000372,
"styleRecalcs": 13,
"styleRecalcDurationMs": 18.279000000000003,
"layouts": 3,
"layoutDurationMs": 0.7000000000000001,
"taskDurationMs": 130.73200000000003,
"heapDeltaBytes": 5319380,
"heapUsedBytes": 68427868,
"domNodes": 134,
"jsHeapTotalBytes": 5242880,
"scriptDurationMs": 10.231,
"eventListeners": 99,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "workflow-execution",
"durationMs": 473.74600000000555,
"styleRecalcs": 10,
"styleRecalcDurationMs": 18.317999999999998,
"layouts": 3,
"layoutDurationMs": 0.6840000000000002,
"taskDurationMs": 115.36399999999999,
"heapDeltaBytes": 5074172,
"heapUsedBytes": 68230112,
"domNodes": 119,
"jsHeapTotalBytes": 4718592,
"scriptDurationMs": 9.892000000000001,
"eventListeners": 97,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
}
]
} |
📝 WalkthroughWalkthroughThe PR adds linked-widget rendering modes for promoted subgraph widgets. It hides duplicate media previews and contextual actions, recalculates node sizing, adds widget styling, and introduces unit and browser coverage for linking and unlinking behavior. ChangesLinked widget processing and display
Promoted preview filtering and node sizing
Linked widget contextual actions
Subgraph and browser validation
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant BrowserTest
participant SubgraphWorkflow
participant LGraphNode
participant NodeWidgets
participant useMoreOptionsMenu
BrowserTest->>SubgraphWorkflow: load promoted-image workflow
SubgraphWorkflow->>LGraphNode: enter promoted subgraph
LGraphNode->>NodeWidgets: render linked widget state
NodeWidgets->>useMoreOptionsMenu: pass action suppression state
useMoreOptionsMenu-->>BrowserTest: show filtered contextual actions
BrowserTest->>SubgraphWorkflow: remove input link
SubgraphWorkflow->>LGraphNode: update node content and height
Possibly related PRs
Suggested labels: Suggested reviewers: Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Codecov Report❌ Patch coverage is @@ Coverage Diff @@
## main #14763 +/- ##
==========================================
- Coverage 79.24% 79.23% -0.01%
==========================================
Files 1803 1804 +1
Lines 118367 118437 +70
Branches 35506 34707 -799
==========================================
+ Hits 93801 93849 +48
- Misses 23974 23989 +15
- Partials 592 599 +7
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 4 files with indirect coverage changes 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/renderer/extensions/vueNodes/components/LGraphNode.vue (1)
419-427: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winInclude the media source in the resize dependency.
linkedWidgetKeyomitswidget.sourceExecutionId, butvisiblePromotedPreviewshides previews from that source. Reconnecting a linked media widget to a different source changes which promoted previews are shown without changing the linked widget identity, so the resize watcher does not callfitNodeToVisibleContent. IncludesourceExecutionIdinlinkedWidgetKey, or watch the preview visibility dependency directly, and add a regression for linked-to-linked source changes.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/renderer/extensions/vueNodes/components/LGraphNode.vue` around lines 419 - 427, Update the linkedWidgetKey computed dependency in LGraphNode.vue to include each linked widget’s sourceExecutionId, ensuring changes between linked media sources trigger the existing resize/fitNodeToVisibleContent watcher. Preserve the current identity and index components, and add a regression test covering a linked-to-linked source change.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@src/renderer/extensions/vueNodes/components/LGraphNode.vue`:
- Around line 419-427: Update the linkedWidgetKey computed dependency in
LGraphNode.vue to include each linked widget’s sourceExecutionId, ensuring
changes between linked media sources trigger the existing
resize/fitNodeToVisibleContent watcher. Preserve the current identity and index
components, and add a regression test covering a linked-to-linked source change.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: c80c570a-c802-439d-9d05-5d3ffe39e59f
📒 Files selected for processing (6)
browser_tests/fixtures/components/ContextMenu.tsbrowser_tests/tests/vueNodes/widgets/linkedWidgetContent.spec.tssrc/composables/graph/useMoreOptionsMenu.tssrc/renderer/extensions/vueNodes/components/LGraphNode.vuesrc/renderer/extensions/vueNodes/components/NodeWidgets.vuesrc/renderer/extensions/vueNodes/composables/useProcessedWidgets.ts
ecafcc5 to
4b6c8cc
Compare
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/composables/graph/useMoreOptionsMenu.ts`:
- Around line 201-204: Update the widget lookup in the menu action flow to
resolve the source node identified by menuContext.widgetNodeId before searching
for menuContext.widgetName. Use that resolved node’s widgets for contextual
widget actions, while continuing to use the selected node for generic node
actions.
In `@src/renderer/extensions/vueNodes/utils/linkedWidgetUtils.test.ts`:
- Around line 74-83: Extend the isInputMediaPreview tests to assert false for
undefined previews, previews with an empty images array, and previews containing
null image entries. Keep the existing valid all-input and invalid output/mixed
cases unchanged, ensuring only valid input media previews return true.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 7245950b-aa79-4f87-abf8-edf75a7a9492
📒 Files selected for processing (11)
browser_tests/fixtures/selectors.tsbrowser_tests/tests/vueNodes/widgets/linkedWidgetContent.spec.tssrc/composables/graph/useMoreOptionsMenu.tssrc/renderer/extensions/vueNodes/components/LGraphNode.test.tssrc/renderer/extensions/vueNodes/components/LGraphNode.vuesrc/renderer/extensions/vueNodes/components/NodeWidgets.test.tssrc/renderer/extensions/vueNodes/components/NodeWidgets.vuesrc/renderer/extensions/vueNodes/composables/useProcessedWidgets.test.tssrc/renderer/extensions/vueNodes/composables/useProcessedWidgets.tssrc/renderer/extensions/vueNodes/utils/linkedWidgetUtils.test.tssrc/renderer/extensions/vueNodes/utils/linkedWidgetUtils.ts
| const menuContext = nodeMenuContext.value | ||
| const widget = menuContext?.widgetName | ||
| ? node?.widgets?.find((item) => item.name === menuContext.widgetName) | ||
| : undefined |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift
Resolve the contextual widget from widgetNodeId.
The caller passes widget.nodeId, but this lookup ignores menuContext.widgetNodeId and searches only the selected host node. For a promoted widget from a nested node, widget becomes undefined. The menu then cannot derive that widget’s action labels for suppression.
Resolve the source node from widgetNodeId before looking up widgetName. Keep the selected host node for generic node actions.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/composables/graph/useMoreOptionsMenu.ts` around lines 201 - 204, Update
the widget lookup in the menu action flow to resolve the source node identified
by menuContext.widgetNodeId before searching for menuContext.widgetName. Use
that resolved node’s widgets for contextual widget actions, while continuing to
use the selected node for generic node actions.
| describe(isInputMediaPreview, () => { | ||
| it('accepts only local input media', () => { | ||
| expect( | ||
| isInputMediaPreview({ images: [{ type: 'input' }, { type: 'input' }] }) | ||
| ).toBe(true) | ||
| expect(isInputMediaPreview({ images: [{ type: 'output' }] })).toBe(false) | ||
| expect( | ||
| isInputMediaPreview({ images: [{ type: 'input' }, { type: 'output' }] }) | ||
| ).toBe(false) | ||
| }) |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Cover empty and null media preview states.
This new predicate controls output-preview suppression. Add assertions for undefined, an empty images array, and null image entries. These cases must return false so the node does not hide output content without a valid input preview.
As per path instructions, “include edge cases such as … null/empty media data.”
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/renderer/extensions/vueNodes/utils/linkedWidgetUtils.test.ts` around
lines 74 - 83, Extend the isInputMediaPreview tests to assert false for
undefined previews, previews with an empty images array, and previews containing
null image entries. Keep the existing valid all-input and invalid output/mixed
cases unchanged, ensuring only valid input media previews return true.
Source: Path instructions
Summary
Hide the contents of linked Vue widgets so the graph shows that their values come from connections rather than editable local controls.
Changes
IMAGEUPLOAD.imageInputNamewidget is linked and its stored media is marked asinput.ELI5
Once a cable is connected to a widget, the cable supplies the value. Keeping the old control visible makes it look editable even though it no longer owns the value.
This change keeps the control's familiar size and shape but removes its stale contents and shows a small link indicator. Disconnecting the cable restores the control and its actions.
For media loaders, only the local file preview associated with the explicitly declared upload input is hidden. Other preview systems keep their existing behavior.
Review Focus
Screenshots
The current prototype follows the linked-state treatment shared in the design discussion.
Verification
pnpm typecheck, andpnpm typecheck:browser.pnpm knip.