refactor: extract LocateNodeButton for errors panel - #13401
Conversation
|
Warning Review limit reachedYou’ve reached a temporary PR review limit under our Fair Usage Limits Policy. Next review available in: 43 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (3)
📝 WalkthroughWalkthroughChangesErrors panel locate controls
Estimated code review effort: 2 (Simple) | ~15 minutes Possibly related issues
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 6✅ Passed checks (6 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
🎭 Playwright: ✅ 1716 passed, 0 failed · 1 flaky📊 Browser Reports
🎨 Storybook: ✅ Built — View Storybook📦 Bundle: 7.91 MB gzip 🔴 +151 BDetailsSummary
Category Glance App Entry Points — 47.3 kB (baseline 47.3 kB) • ⚪ 0 BMain entry bundles and manifests
Status: 1 added / 1 removed Graph Workspace — 1.25 MB (baseline 1.25 MB) • 🟢 -164 BGraph editor runtime, canvas, workflow orchestration
Status: 1 added / 1 removed Views & Navigation — 109 kB (baseline 109 kB) • ⚪ 0 BTop-level views, pages, and routed surfaces Status: 14 unchanged Panels & Settings — 550 kB (baseline 550 kB) • ⚪ 0 BConfiguration panels, inspectors, and settings screens Status: 26 unchanged User & Accounts — 29.1 kB (baseline 29.1 kB) • ⚪ 0 BAuthentication, profile, and account management bundles Status: 10 unchanged Editors & Dialogs — 121 kB (baseline 121 kB) • ⚪ 0 BModals, dialogs, drawers, and in-app editors Status: 6 unchanged UI Components — 56.8 kB (baseline 56.8 kB) • ⚪ 0 BReusable component library chunks Status: 13 unchanged Data & Services — 273 kB (baseline 273 kB) • ⚪ 0 BStores, services, APIs, and repositories Status: 16 unchanged Utilities & Hooks — 3.4 MB (baseline 3.4 MB) • ⚪ 0 BHelpers, composables, and utility bundles Status: 36 unchanged Vendor & Third-Party — 15.7 MB (baseline 15.7 MB) • ⚪ 0 BExternal libraries and shared vendor chunks Status: 16 unchanged Other — 11.9 MB (baseline 11.9 MB) • ⚪ 0 BBundles that do not match a named category Status: 163 unchanged ⚡ Performance Report
Show regressions
All metrics
Historical variance (last 15 runs)
Trend (last 15 commits on main)
Raw data{
"timestamp": "2026-07-18T13:40:55.857Z",
"gitSha": "d634452fdeea05ee4f1f3d3a0cfb04ccde222f5d",
"branch": "matt/be-2256-locate-node-button",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2095.47299999997,
"styleRecalcs": 10,
"styleRecalcDurationMs": 10.735000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 421.929,
"heapDeltaBytes": 3865444,
"heapUsedBytes": 72673172,
"domNodes": 20,
"jsHeapTotalBytes": 19939328,
"scriptDurationMs": 18.289,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "canvas-idle",
"durationMs": 2044.5130000000518,
"styleRecalcs": 10,
"styleRecalcDurationMs": 7.5729999999999995,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 420.813,
"heapDeltaBytes": -20161300,
"heapUsedBytes": 48703632,
"domNodes": -264,
"jsHeapTotalBytes": 19542016,
"scriptDurationMs": 17.376999999999995,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1990.6330000000025,
"styleRecalcs": 79,
"styleRecalcDurationMs": 45.161,
"layouts": 12,
"layoutDurationMs": 4.899000000000001,
"taskDurationMs": 961.0730000000001,
"heapDeltaBytes": -14987060,
"heapUsedBytes": 53735644,
"domNodes": -266,
"jsHeapTotalBytes": 20066304,
"scriptDurationMs": 134.77100000000002,
"eventListeners": -131,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1758.232000000021,
"styleRecalcs": 74,
"styleRecalcDurationMs": 35.917,
"layouts": 12,
"layoutDurationMs": 3.377,
"taskDurationMs": 809.302,
"heapDeltaBytes": -15239556,
"heapUsedBytes": 53728400,
"domNodes": -264,
"jsHeapTotalBytes": 19279872,
"scriptDurationMs": 113.432,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1756.0849999999846,
"styleRecalcs": 31,
"styleRecalcDurationMs": 18.128,
"layouts": 6,
"layoutDurationMs": 0.665,
"taskDurationMs": 318.988,
"heapDeltaBytes": 7113164,
"heapUsedBytes": 75873020,
"domNodes": 79,
"jsHeapTotalBytes": 20201472,
"scriptDurationMs": 18.664,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1724.2149999999583,
"styleRecalcs": 30,
"styleRecalcDurationMs": 14.903999999999998,
"layouts": 6,
"layoutDurationMs": 0.5760000000000001,
"taskDurationMs": 300.614,
"heapDeltaBytes": 7241880,
"heapUsedBytes": 76255572,
"domNodes": 77,
"jsHeapTotalBytes": 19939328,
"scriptDurationMs": 17.858,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "dom-widget-clipping",
"durationMs": 528.6459999999806,
"styleRecalcs": 13,
"styleRecalcDurationMs": 8.953000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 333.69599999999997,
"heapDeltaBytes": -11700752,
"heapUsedBytes": 57210420,
"domNodes": 22,
"jsHeapTotalBytes": 19677184,
"scriptDurationMs": 53.349999999999994,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "dom-widget-clipping",
"durationMs": 596.4099999999917,
"styleRecalcs": 12,
"styleRecalcDurationMs": 9.001999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 351.264,
"heapDeltaBytes": -11728088,
"heapUsedBytes": 57123032,
"domNodes": 20,
"jsHeapTotalBytes": 20201472,
"scriptDurationMs": 55.523999999999994,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2015.8899999999562,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.268,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 529.477,
"heapDeltaBytes": 4803376,
"heapUsedBytes": 64140592,
"domNodes": -270,
"jsHeapTotalBytes": 5455872,
"scriptDurationMs": 79.997,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2032.6669999999467,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8.838000000000003,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 533.878,
"heapDeltaBytes": 5337956,
"heapUsedBytes": 66637916,
"domNodes": -264,
"jsHeapTotalBytes": 5193728,
"scriptDurationMs": 80.119,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "large-graph-pan",
"durationMs": 2153.3980000000383,
"styleRecalcs": 68,
"styleRecalcDurationMs": 14.755999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1083.57,
"heapDeltaBytes": -4648316,
"heapUsedBytes": 55587304,
"domNodes": -271,
"jsHeapTotalBytes": 4669440,
"scriptDurationMs": 369.369,
"eventListeners": -127,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "large-graph-pan",
"durationMs": 2173.283999999967,
"styleRecalcs": 69,
"styleRecalcDurationMs": 18.795,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1054.7759999999998,
"heapDeltaBytes": 1376900,
"heapUsedBytes": 61760912,
"domNodes": -269,
"jsHeapTotalBytes": 5660672,
"scriptDurationMs": 367.259,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 3147.570999999971,
"styleRecalcs": 65,
"styleRecalcDurationMs": 15.347000000000003,
"layouts": 60,
"layoutDurationMs": 8.328999999999999,
"taskDurationMs": 1334.488,
"heapDeltaBytes": -5405052,
"heapUsedBytes": 56223500,
"domNodes": -273,
"jsHeapTotalBytes": 7553024,
"scriptDurationMs": 478.58500000000004,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "large-graph-zoom",
"durationMs": 3134.5199999999522,
"styleRecalcs": 65,
"styleRecalcDurationMs": 14.928999999999998,
"layouts": 60,
"layoutDurationMs": 7.968000000000001,
"taskDurationMs": 1295.2359999999999,
"heapDeltaBytes": -5254872,
"heapUsedBytes": 56275320,
"domNodes": -273,
"jsHeapTotalBytes": 8339456,
"scriptDurationMs": 464.99099999999993,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "minimap-idle",
"durationMs": 2002.9139999999757,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.644000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 541.144,
"heapDeltaBytes": 5075572,
"heapUsedBytes": 65878164,
"domNodes": -268,
"jsHeapTotalBytes": 5193728,
"scriptDurationMs": 82.94200000000001,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "minimap-idle",
"durationMs": 2014.8299999999608,
"styleRecalcs": 8,
"styleRecalcDurationMs": 6.284999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 517.569,
"heapDeltaBytes": 4913948,
"heapUsedBytes": 66226708,
"domNodes": -269,
"jsHeapTotalBytes": 5193728,
"scriptDurationMs": 77.917,
"eventListeners": -127,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 573.0280000000221,
"styleRecalcs": 47,
"styleRecalcDurationMs": 10.887999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 361.59200000000004,
"heapDeltaBytes": -11441764,
"heapUsedBytes": 57534136,
"domNodes": 20,
"jsHeapTotalBytes": 21250048,
"scriptDurationMs": 121.96499999999999,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 588.0110000000514,
"styleRecalcs": 48,
"styleRecalcDurationMs": 11.559,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 384.82300000000004,
"heapDeltaBytes": -11482488,
"heapUsedBytes": 57494956,
"domNodes": 22,
"jsHeapTotalBytes": 20725760,
"scriptDurationMs": 126.75799999999998,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "subgraph-idle",
"durationMs": 2004.9450000000206,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8.41,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 400.078,
"heapDeltaBytes": -18990376,
"heapUsedBytes": 49936424,
"domNodes": -267,
"jsHeapTotalBytes": 19279872,
"scriptDurationMs": 13.908999999999999,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 2022.4719999999934,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.4590000000000005,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 404.28200000000004,
"heapDeltaBytes": -20447368,
"heapUsedBytes": 48312076,
"domNodes": -266,
"jsHeapTotalBytes": 20066304,
"scriptDurationMs": 13.866,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1706.8070000000262,
"styleRecalcs": 76,
"styleRecalcDurationMs": 37.80799999999999,
"layouts": 16,
"layoutDurationMs": 4.4670000000000005,
"taskDurationMs": 648.395,
"heapDeltaBytes": -5201908,
"heapUsedBytes": 63684456,
"domNodes": 62,
"jsHeapTotalBytes": 19677184,
"scriptDurationMs": 87.103,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1731.1019999999644,
"styleRecalcs": 77,
"styleRecalcDurationMs": 37.650000000000006,
"layouts": 16,
"layoutDurationMs": 4.171,
"taskDurationMs": 713.3530000000001,
"heapDeltaBytes": -18988440,
"heapUsedBytes": 49988304,
"domNodes": -263,
"jsHeapTotalBytes": 21377024,
"scriptDurationMs": 91.274,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "subgraph-transition-enter",
"durationMs": 932.3010000000522,
"styleRecalcs": 19,
"styleRecalcDurationMs": 29.788999999999994,
"layouts": 15,
"layoutDurationMs": 13.205000000000002,
"taskDurationMs": 729.4019999999999,
"heapDeltaBytes": 1302212,
"heapUsedBytes": 83290392,
"domNodes": 13673,
"jsHeapTotalBytes": 12058624,
"scriptDurationMs": 27.03900000000001,
"eventListeners": 2369,
"totalBlockingTimeMs": 127,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "viewport-pan-sweep",
"durationMs": 8169.573999999955,
"styleRecalcs": 250,
"styleRecalcDurationMs": 42.077000000000005,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3669.6850000000004,
"heapDeltaBytes": 16802304,
"heapUsedBytes": 78138704,
"domNodes": -265,
"jsHeapTotalBytes": 8282112,
"scriptDurationMs": 1225.357,
"eventListeners": -113,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8207.194000000072,
"styleRecalcs": 251,
"styleRecalcDurationMs": 43.623,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3606.973,
"heapDeltaBytes": 17090212,
"heapUsedBytes": 77956092,
"domNodes": -265,
"jsHeapTotalBytes": 6447104,
"scriptDurationMs": 1155.961,
"eventListeners": -113,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 13860.964000000024,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 13843.328000000001,
"heapDeltaBytes": -41939608,
"heapUsedBytes": 158775364,
"domNodes": -8311,
"jsHeapTotalBytes": -7802880,
"scriptDurationMs": 529.938,
"eventListeners": -16384,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.77333333333336,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-idle",
"durationMs": 13427.010999999993,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 13413.680000000002,
"heapDeltaBytes": -56388700,
"heapUsedBytes": 169677900,
"domNodes": -8311,
"jsHeapTotalBytes": -9637888,
"scriptDurationMs": 523.531,
"eventListeners": -16384,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.220000000000073,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-pan",
"durationMs": 17179.892999999993,
"styleRecalcs": 110,
"styleRecalcDurationMs": 17.054999999999986,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 17155.534,
"heapDeltaBytes": -47577552,
"heapUsedBytes": 180805544,
"domNodes": -8311,
"jsHeapTotalBytes": -10248192,
"scriptDurationMs": 867.3839999999999,
"eventListeners": -16380,
"totalBlockingTimeMs": 164,
"frameDurationMs": 17.219999999999953,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 16636.761999999977,
"styleRecalcs": 103,
"styleRecalcDurationMs": 15.490999999999977,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 16612.234,
"heapDeltaBytes": -43664612,
"heapUsedBytes": 165444192,
"domNodes": -8311,
"jsHeapTotalBytes": -14356480,
"scriptDurationMs": 907.463,
"eventListeners": -16382,
"totalBlockingTimeMs": 9,
"frameDurationMs": 17.223333333333358,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "workflow-execution",
"durationMs": 449.75299999998697,
"styleRecalcs": 13,
"styleRecalcDurationMs": 19.453000000000007,
"layouts": 2,
"layoutDurationMs": 0.456,
"taskDurationMs": 123.64100000000002,
"heapDeltaBytes": -15720648,
"heapUsedBytes": 52452828,
"domNodes": 130,
"jsHeapTotalBytes": 6045696,
"scriptDurationMs": 13.353,
"eventListeners": 67,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "workflow-execution",
"durationMs": 492.6259999999729,
"styleRecalcs": 13,
"styleRecalcDurationMs": 20.607,
"layouts": 3,
"layoutDurationMs": 0.7279999999999999,
"taskDurationMs": 125.47500000000001,
"heapDeltaBytes": -16601908,
"heapUsedBytes": 51238960,
"domNodes": 119,
"jsHeapTotalBytes": 7356416,
"scriptDurationMs": 10.469000000000001,
"eventListeners": 49,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
}
]
} |
There was a problem hiding this comment.
🔍 Cursor Review — Consolidated panel
Triggered by @mattmillerai.
✅ No high-signal findings.
Panel: 8/8 reviewers contributed findings.
Codecov Report❌ Patch coverage is
@@ Coverage Diff @@
## main #13401 +/- ##
==========================================
- Coverage 78.65% 77.81% -0.84%
==========================================
Files 1683 1687 +4
Lines 98357 95618 -2739
Branches 34800 33646 -1154
==========================================
- Hits 77364 74409 -2955
- Misses 20526 20775 +249
+ Partials 467 434 -33
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 181 files with indirect coverage changes 🚀 New features to boost your workflow:
|
Deduplicate the byte-identical locate icon-button repeated across four sites in the errors panel (ErrorNodeCard, TabErrors, MissingPackGroupRow x2) into a single LocateNodeButton component. Standardizes the decorative icon's aria-hidden and the click .stop modifier, which previously varied between sites.
4638b2c to
5c32def
Compare
|
Rebased onto |
…cate labels - Replace closure-captured counter with vi.fn() spy in the click-propagation test so it actually fails when @click.stop is removed - Add keyboard-activation coverage and pin aria-label via DOM assertion - Give each MissingPackGroupRow locate button a distinct accessible name via locateNodeFor, matching ErrorGroupList (WCAG 2.4.6) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The LocateNodeButton extraction switched the locate button aria-label
from the static "Locate node on canvas" to the per-item
`rightSidePanel.locateNodeFor` ("Locate {item}"), but these test queries
were not updated, so they failed to find the button.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Fixed the failing |
…ange
The extracted LocateNodeButton now carries a per-item accessible name
("Locate {item}"), so getByRole('button', { name }) matched both the row
label button and the locate button, tripping Playwright strict mode. Use
exact matching to target the row label button.
|
Fixed the failing |
…ode-button # Conflicts: # src/components/rightSidePanel/errors/ErrorGroupList.vue
|
Merged latest |
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/components/rightSidePanel/errors/ErrorNodeCard.vue`:
- Around line 39-42: Update the LocateNodeButton label in ErrorNodeCard to use
the node-specific rightSidePanel.locateNodeFor translation with card.nodeTitle
or card.title, plus a safe fallback when both are unavailable. Add an
integration assertion verifying each error card’s locate button exposes the
expected node-specific accessible name.
In `@src/components/rightSidePanel/errors/MissingPackGroupRow.test.ts`:
- Line 165: Strengthen the negative assertions in MissingPackGroupRow tests
around the resolving and non-locatable rows: verify that no locate action button
is rendered for the relevant row, rather than only checking that the “Locate
OnlyNode” label is absent. Apply the same absence or expected-count assertion to
the additional cases at the referenced assertions.
🪄 Autofix (Beta)
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: f3f924e3-f157-4d33-bf49-1a74bf664cd6
📒 Files selected for processing (7)
browser_tests/tests/propertiesPanel/errorsTabMissingNodes.spec.tssrc/components/rightSidePanel/errors/ErrorGroupList.vuesrc/components/rightSidePanel/errors/ErrorNodeCard.vuesrc/components/rightSidePanel/errors/LocateNodeButton.test.tssrc/components/rightSidePanel/errors/LocateNodeButton.vuesrc/components/rightSidePanel/errors/MissingPackGroupRow.test.tssrc/components/rightSidePanel/errors/MissingPackGroupRow.vue
Use rightSidePanel.locateNodeFor with the card node title (safe fallback to generic label) so runtime error cards expose distinguishable locate buttons. Strengthen MissingPackGroupRow negative assertions to check locate-button count, not only a specific label's absence.
christian-byrne
left a comment
There was a problem hiding this comment.
Automated multi-agent review (8 agents). The extraction is clean: .stop propagation is safe (Button declares no click emit so the modifier attaches a native DOM listener), aria-label forwarding through Reka UI's Primitive is confirmed, all four call sites wire @locate correctly, no regression on the prior double-escape fix, and locateNodeFor exists in all 10 locale files. Two test quality gaps below.
ELI-5
The errors panel had the same little "locate this node" button copy-pasted in four places, with tiny inconsistencies between the copies. This pulls it into one small reusable component so every locate button is defined once and behaves identically.
Summary
Extract the duplicated locate icon-button (
variant="textonly" size="icon-sm"with alucide--locateicon) from the errors panel into a singleLocateNodeButton.vue.Changes
src/components/rightSidePanel/errors/LocateNodeButton.vue(proplabelfor the accessible name, emitslocate). Replaces the four byte-identical<Button>locate sites —ErrorNodeCard.vue,TabErrors.vue, and two inMissingPackGroupRow.vue. Standardizes two prior inconsistencies across those sites: the decorative icon now always carriesaria-hidden="true"(previously omitted in ErrorNodeCard/TabErrors) and the click handler always uses the.stopmodifier (previously plain@clickin MissingPackGroupRow, which sits under no ancestor click handler so behavior is unchanged).locateNodeemit are unchanged.Review Focus
label, notariaLabelas the grooming note suggested: a prop namedariaLabelcollides with the nativearia-labelglobal attribute, sovue-tsccaptures the kebab binding as a fallthrough attr and the required prop goes unresolved (real type error).labelis unambiguous and maps cleanly onto the button'saria-label.packTextButtonClassto a shared const and replace the two inline text-button strings) is gated on a design decision: those strings diverge in font size —ErrorNodeCardusestext-sm/relaxedwhileTabErrors/packTextButtonClassusetext-xs/relaxed— so unifying them changes ErrorNodeCard's rendered text size. That needs a design call on the intended size and is left for a follow-up rather than guessed at here.Tests
New
LocateNodeButton.test.tscovers accessible name,locateemission, and click-propagation stopping. ExistingErrorNodeCard/TabErrors/MissingPackGroupRowsuites pass unchanged (61 tests).pnpm typecheck,eslint, andoxfmtclean.