fix: don't open the lightbox on a modifier-click in the assets list view - #15540
fix: don't open the lightbox on a modifier-click in the assets list view#15540mattmillerai wants to merge 2 commits into
Conversation
A modifier-click on a list row's preview tile range-selected (or toggled) the row and then immediately covered the result with the lightbox, because AssetsListItem emitted preview-click unconditionally from both the preview and the placeholder branch. Gate the emit on no selection modifier being held, so a modifier-click falls through to the existing row selection handling. Plain click and row double-click still open the lightbox.
🎨 Storybook: ✅ Built — View Storybook🎭 Playwright: ✅ 1831 passed, 0 failed · 5 flaky📊 Browser Reports
📦 Bundle: 9.13 MB gzip 🟢 -82 BDetailsSummary
Category Glance App Entry Points — 3.71 kB (baseline 3.71 kB) • ⚪ 0 BMain entry bundles and manifests
Status: 1 added / 1 removed Graph Workspace — 1.37 MB (baseline 1.37 MB) • ⚪ 0 BGraph editor runtime, canvas, workflow orchestration
Status: 2 added / 2 removed / 1 unchanged Views & Navigation — 124 kB (baseline 124 kB) • ⚪ 0 BTop-level views, pages, and routed surfaces
Status: 13 added / 13 removed / 4 unchanged Panels & Settings — 566 kB (baseline 566 kB) • ⚪ 0 BConfiguration panels, inspectors, and settings screens
Status: 10 added / 10 removed / 16 unchanged User & Accounts — 27.5 kB (baseline 27.5 kB) • ⚪ 0 BAuthentication, profile, and account management bundles
Status: 6 added / 6 removed / 5 unchanged Editors & Dialogs — 125 kB (baseline 125 kB) • ⚪ 0 BModals, dialogs, drawers, and in-app editors
Status: 7 added / 7 removed / 1 unchanged UI Components — 67.1 kB (baseline 67.1 kB) • ⚪ 0 BReusable component library chunks
Status: 6 added / 6 removed / 8 unchanged Data & Services — 3.53 MB (baseline 3.53 MB) • 🔴 +117 BStores, services, APIs, and repositories
Status: 14 added / 14 removed / 3 unchanged Utilities & Hooks — 549 kB (baseline 549 kB) • ⚪ 0 BHelpers, composables, and utility bundles
Status: 18 added / 18 removed / 19 unchanged Vendor & Third-Party — 18.1 MB (baseline 18.1 MB) • ⚪ 0 BExternal libraries and shared vendor chunks Status: 18 unchanged Other — 14.2 MB (baseline 14.2 MB) • ⚪ 0 BBundles that do not match a named category
Status: 69 added / 69 removed / 219 unchanged ⚡ Performance Report
Show regressions
All metrics
Historical variance (last 15 runs)
Trend (last 15 commits on main)
Raw data{
"timestamp": "2026-08-21T08:40:59.002Z",
"gitSha": "a60df290084db9065190fab592967783f5da1255",
"branch": "matt/fe-1613-list-modifier-click-lightbox",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2090.3979999999933,
"styleRecalcs": 9,
"styleRecalcDurationMs": 8.226,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 580.492,
"heapDeltaBytes": 15920864,
"heapUsedBytes": 77312544,
"domNodes": -281,
"jsHeapTotalBytes": 4710400,
"scriptDurationMs": 7.814,
"eventListeners": -151,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-idle",
"durationMs": 2030.9419999999818,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8.788999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 477.4240000000001,
"heapDeltaBytes": 12726776,
"heapUsedBytes": 73690368,
"domNodes": -281,
"jsHeapTotalBytes": 4972544,
"scriptDurationMs": 6.433999999999998,
"eventListeners": -151,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66999999999998,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1856.648000000007,
"styleRecalcs": 74,
"styleRecalcDurationMs": 36.684999999999995,
"layouts": 12,
"layoutDurationMs": 3.523,
"taskDurationMs": 874.959,
"heapDeltaBytes": 15116536,
"heapUsedBytes": 76527064,
"domNodes": -279,
"jsHeapTotalBytes": 5234688,
"scriptDurationMs": 112.99300000000001,
"eventListeners": -151,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1796.4489999999387,
"styleRecalcs": 71,
"styleRecalcDurationMs": 34.5,
"layouts": 12,
"layoutDurationMs": 3.6889999999999996,
"taskDurationMs": 824.721,
"heapDeltaBytes": -4268940,
"heapUsedBytes": 56841140,
"domNodes": -284,
"jsHeapTotalBytes": 6021120,
"scriptDurationMs": 105.825,
"eventListeners": -151,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1714.0120000000252,
"styleRecalcs": 31,
"styleRecalcDurationMs": 15.356,
"layouts": 6,
"layoutDurationMs": 0.5680000000000002,
"taskDurationMs": 348.51899999999995,
"heapDeltaBytes": 2762708,
"heapUsedBytes": 63966148,
"domNodes": 76,
"jsHeapTotalBytes": 4456448,
"scriptDurationMs": 8.405000000000001,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1756.4149999999472,
"styleRecalcs": 31,
"styleRecalcDurationMs": 19.531,
"layouts": 6,
"layoutDurationMs": 0.735,
"taskDurationMs": 344.758,
"heapDeltaBytes": 2789964,
"heapUsedBytes": 64047128,
"domNodes": 76,
"jsHeapTotalBytes": 5242880,
"scriptDurationMs": 8.755999999999998,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "dom-widget-clipping",
"durationMs": 573.0719999999678,
"styleRecalcs": 10,
"styleRecalcDurationMs": 9.963,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 359.253,
"heapDeltaBytes": 10647512,
"heapUsedBytes": 72071876,
"domNodes": 16,
"jsHeapTotalBytes": 5505024,
"scriptDurationMs": 56.706999999999994,
"eventListeners": 2,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "dom-widget-clipping",
"durationMs": 533.0800000000409,
"styleRecalcs": 11,
"styleRecalcDurationMs": 6.774000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 343.868,
"heapDeltaBytes": 10072104,
"heapUsedBytes": 71862344,
"domNodes": 18,
"jsHeapTotalBytes": 4980736,
"scriptDurationMs": 53.742,
"eventListeners": 2,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "large-graph-idle",
"durationMs": 2034.9899999999934,
"styleRecalcs": 8,
"styleRecalcDurationMs": 6.827,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 586.138,
"heapDeltaBytes": 13163144,
"heapUsedBytes": 87969272,
"domNodes": -284,
"jsHeapTotalBytes": 3403776,
"scriptDurationMs": 13.171000000000003,
"eventListeners": -179,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-idle",
"durationMs": 2026.6540000000077,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8.522000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 599.094,
"heapDeltaBytes": 13252644,
"heapUsedBytes": 88049856,
"domNodes": -280,
"jsHeapTotalBytes": 2355200,
"scriptDurationMs": 13.271000000000004,
"eventListeners": -181,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-pan",
"durationMs": 2119.7890000000257,
"styleRecalcs": 69,
"styleRecalcDurationMs": 14.895999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1164.1580000000001,
"heapDeltaBytes": -13279856,
"heapUsedBytes": 63479560,
"domNodes": -281,
"jsHeapTotalBytes": 2093056,
"scriptDurationMs": 331.76000000000005,
"eventListeners": -149,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 2134.3030000000454,
"styleRecalcs": 69,
"styleRecalcDurationMs": 14.793999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1179.246,
"heapDeltaBytes": -13204828,
"heapUsedBytes": 63510012,
"domNodes": -281,
"jsHeapTotalBytes": 2617344,
"scriptDurationMs": 337.665,
"eventListeners": -147,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "large-graph-zoom",
"durationMs": 3199.2360000000417,
"styleRecalcs": 65,
"styleRecalcDurationMs": 14.422,
"layouts": 60,
"layoutDurationMs": 7.258000000000001,
"taskDurationMs": 1361.37,
"heapDeltaBytes": -10704940,
"heapUsedBytes": 67386840,
"domNodes": -285,
"jsHeapTotalBytes": 5500928,
"scriptDurationMs": 389.67400000000004,
"eventListeners": -155,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 3139.026000000058,
"styleRecalcs": 65,
"styleRecalcDurationMs": 14.412,
"layouts": 60,
"layoutDurationMs": 7.188,
"taskDurationMs": 1355.955,
"heapDeltaBytes": -13316360,
"heapUsedBytes": 64570200,
"domNodes": -288,
"jsHeapTotalBytes": 5763072,
"scriptDurationMs": 381.359,
"eventListeners": -153,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "legacy-node-drag",
"durationMs": 2355.747000000008,
"styleRecalcs": 47,
"styleRecalcDurationMs": 11.115999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1426.7350000000001,
"heapDeltaBytes": -14691872,
"heapUsedBytes": 69407992,
"domNodes": 14,
"jsHeapTotalBytes": 7114752,
"scriptDurationMs": 455.901,
"eventListeners": 186,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "legacy-node-drag",
"durationMs": 2210.6840000000147,
"styleRecalcs": 47,
"styleRecalcDurationMs": 10.591,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1392.98,
"heapDeltaBytes": 11829628,
"heapUsedBytes": 96065788,
"domNodes": 14,
"jsHeapTotalBytes": 8056832,
"scriptDurationMs": 454.376,
"eventListeners": 186,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "minimap-idle",
"durationMs": 2025.0819999999976,
"styleRecalcs": 8,
"styleRecalcDurationMs": 8.049000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 589.4789999999999,
"heapDeltaBytes": -12757676,
"heapUsedBytes": 71387396,
"domNodes": -274,
"jsHeapTotalBytes": 4190208,
"scriptDurationMs": 14.018999999999997,
"eventListeners": -151,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "minimap-idle",
"durationMs": 2028.1969999999774,
"styleRecalcs": 8,
"styleRecalcDurationMs": 6.856000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 590.687,
"heapDeltaBytes": -12915812,
"heapUsedBytes": 69275708,
"domNodes": -283,
"jsHeapTotalBytes": 4452352,
"scriptDurationMs": 13.104000000000001,
"eventListeners": -149,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 563.0659999999921,
"styleRecalcs": 46,
"styleRecalcDurationMs": 10.1,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 375.103,
"heapDeltaBytes": 11416796,
"heapUsedBytes": 72932948,
"domNodes": 18,
"jsHeapTotalBytes": 5242880,
"scriptDurationMs": 116.438,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 573.6109999999144,
"styleRecalcs": 46,
"styleRecalcDurationMs": 10.358,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 386.31000000000006,
"heapDeltaBytes": 11807272,
"heapUsedBytes": 73363336,
"domNodes": 18,
"jsHeapTotalBytes": 5242880,
"scriptDurationMs": 118.835,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 2030.507,
"styleRecalcs": 9,
"styleRecalcDurationMs": 8.078000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 490.5069999999999,
"heapDeltaBytes": 877376,
"heapUsedBytes": 62184952,
"domNodes": -280,
"jsHeapTotalBytes": 4448256,
"scriptDurationMs": 6.438000000000001,
"eventListeners": -181,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-idle",
"durationMs": 1994.2650000000413,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.6129999999999995,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 464.36000000000007,
"heapDeltaBytes": 17280604,
"heapUsedBytes": 79028380,
"domNodes": -280,
"jsHeapTotalBytes": 4448256,
"scriptDurationMs": 5.527999999999998,
"eventListeners": -151,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1715.9899999999766,
"styleRecalcs": 75,
"styleRecalcDurationMs": 33.452999999999996,
"layouts": 16,
"layoutDurationMs": 4.289000000000001,
"taskDurationMs": 756.0360000000001,
"heapDeltaBytes": 19521512,
"heapUsedBytes": 80865648,
"domNodes": -281,
"jsHeapTotalBytes": 4710400,
"scriptDurationMs": 81.55100000000002,
"eventListeners": -151,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1705.9269999999742,
"styleRecalcs": 76,
"styleRecalcDurationMs": 34.272999999999996,
"layouts": 16,
"layoutDurationMs": 4.3229999999999995,
"taskDurationMs": 758.888,
"heapDeltaBytes": 19110944,
"heapUsedBytes": 81022340,
"domNodes": -281,
"jsHeapTotalBytes": 4186112,
"scriptDurationMs": 83.31700000000001,
"eventListeners": -151,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "subgraph-transition-enter",
"durationMs": 1453.4790000000157,
"styleRecalcs": 19,
"styleRecalcDurationMs": 31.452999999999996,
"layouts": 14,
"layoutDurationMs": 14.488999999999999,
"taskDurationMs": 934.9900000000002,
"heapDeltaBytes": 20439188,
"heapUsedBytes": 102835964,
"domNodes": 13673,
"jsHeapTotalBytes": 11534336,
"scriptDurationMs": 16.218000000000004,
"eventListeners": 2373,
"totalBlockingTimeMs": 158,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8287.367000000017,
"styleRecalcs": 251,
"styleRecalcDurationMs": 38.391999999999996,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 4099.883999999999,
"heapDeltaBytes": 2783780,
"heapUsedBytes": 78593984,
"domNodes": -271,
"jsHeapTotalBytes": -565248,
"scriptDurationMs": 1041.163,
"eventListeners": -131,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8260.657000000037,
"styleRecalcs": 250,
"styleRecalcDurationMs": 37.599000000000004,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 4028.0190000000002,
"heapDeltaBytes": 14305840,
"heapUsedBytes": 89195960,
"domNodes": -279,
"jsHeapTotalBytes": 5201920,
"scriptDurationMs": 1034.177,
"eventListeners": -163,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-idle",
"durationMs": 16822.535000000018,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 16175.035000000002,
"heapDeltaBytes": -45953180,
"heapUsedBytes": 175047864,
"domNodes": -8312,
"jsHeapTotalBytes": -12783616,
"scriptDurationMs": 102.899,
"eventListeners": -16387,
"totalBlockingTimeMs": 0,
"frameDurationMs": 18.333333333333332,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 16912.98400000005,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 16260.992000000002,
"heapDeltaBytes": -43202084,
"heapUsedBytes": 179430000,
"domNodes": -8312,
"jsHeapTotalBytes": -14618624,
"scriptDurationMs": 106.165,
"eventListeners": -16387,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.219999999999953,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 20863.44600000007,
"styleRecalcs": 171,
"styleRecalcDurationMs": 17.587999999999994,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 20250.117,
"heapDeltaBytes": -14120436,
"heapUsedBytes": 193109216,
"domNodes": -8312,
"jsHeapTotalBytes": -10493952,
"scriptDurationMs": 394.5369999999999,
"eventListeners": -16385,
"totalBlockingTimeMs": 26,
"frameDurationMs": 17.776666666666763,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 20737.57599999999,
"styleRecalcs": 174,
"styleRecalcDurationMs": 17.30900000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 20106.562,
"heapDeltaBytes": -13393272,
"heapUsedBytes": 194215760,
"domNodes": -8312,
"jsHeapTotalBytes": -15441920,
"scriptDurationMs": 406.95699999999994,
"eventListeners": -16385,
"totalBlockingTimeMs": 34,
"frameDurationMs": 18.329999999999927,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "workflow-execution",
"durationMs": 121.05799999994815,
"styleRecalcs": 9,
"styleRecalcDurationMs": 17.148999999999997,
"layouts": 2,
"layoutDurationMs": 0.8450000000000001,
"taskDurationMs": 86.05,
"heapDeltaBytes": 3112136,
"heapUsedBytes": 64701524,
"domNodes": 133,
"jsHeapTotalBytes": 0,
"scriptDurationMs": 7.1160000000000005,
"eventListeners": 25,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "workflow-execution",
"durationMs": 113.98699999995188,
"styleRecalcs": 6,
"styleRecalcDurationMs": 16.923000000000002,
"layouts": 3,
"layoutDurationMs": 1.195,
"taskDurationMs": 73.879,
"heapDeltaBytes": 2952900,
"heapUsedBytes": 64002672,
"domNodes": 126,
"jsHeapTotalBytes": 262144,
"scriptDurationMs": 4.582000000000001,
"eventListeners": 25,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
}
]
} |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
Included review availability: 0 reviews are currently available. Your included PR review attempts over the past 7 days set your current allowance at 1 review per hour. Important Approval pendingCodeRabbit has no unresolved comments, but it has not reviewed the latest commit. Use the checkbox below to review the latest commit. CodeRabbit will approve the changes if it finds no blocking issues.
📝 WalkthroughWalkthrough
ChangesAsset preview selection
Estimated code review effort: 2 (Simple) | ~10 minutes Merge Risk: ⚪ Minimal · up to This narrowly changes modifier-click behavior so rows select without opening the lightbox, while preserving plain-click and double-click viewing. The change is merge-ready after normal checks, with no actionable merge-blocking risk remaining. Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (1 inconclusive)
✅ Passed checks (6 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
🔍 Cursor Review — Consolidated panel
Triggered by @mattmillerai.
Found 2 finding(s).
| Severity | Count |
|---|---|
| 🟢 Low | 2 |
Panel: 8/8 reviewers contributed findings.
AssetsListItem now always forwards the click event on preview-click instead of swallowing modifier-held clicks itself, so consumers that don't implement selection (JobAssetsList) keep opening the viewer on a modifier-held click. AssetsSidebarListView, which does implement selection, now gates both preview-click and dblclick on the modifier keys itself.
Codecov Report✅ All modified and coverable lines are covered by tests. @@ Coverage Diff @@
## main #15540 +/- ##
==========================================
+ Coverage 79.80% 82.07% +2.27%
==========================================
Files 2214 1887 -327
Lines 127820 122905 -4915
Branches 40829 40122 -707
==========================================
- Hits 102001 100879 -1122
+ Misses 25215 21521 -3694
+ Partials 604 505 -99
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 338 files with indirect coverage changes 🚀 New features to boost your workflow:
|
ELI-5
In the assets sidebar's list view, shift/cmd/ctrl-clicking a row's little preview thumbnail selected the row and then instantly slapped the fullscreen lightbox over the top of it, so you never got to see the selection you just made and had to dismiss a lightbox on every multi-select. Now a modifier-click just selects; a plain click or a row double-click still opens the lightbox.
Summary
AssetsListItememittedpreview-clickunconditionally from the preview tile, so a modifier-click both range-selected the row (via the row-level@clickthat the same event bubbles to) and opened the lightbox. Gate the emit on no selection modifier being held.Changes
AssetsListItem.vueroutes both preview-area click handlers — thepreviewUrlbranch and thev-elseplaceholder branch — throughonPreviewClick(event), which returns early whenshiftKey,metaKeyorctrlKeyis set instead of emittingpreview-click. The event still bubbles to the row's own@click, so the existing selection handling is untouched. Component tests cover both branches in both directions.preview-clickemit signature is unchanged, so neither consumer needed a change.Review Focus
Over-suppression is the hazard here, not under-suppression — if the guard leaked onto the plain-click case, opening a preview from the list would break entirely. The two pre-existing plain-click tests (
emits preview-click when preview is clicked/...when fallback icon is clicked) still assert the emit fires and still pass, which is what pins that down. Red/green verified: with the.vuechange stashed, all six new tests fail; with it applied, all ten pass.Alt-click is deliberately not suppressed. Alt is not a selection modifier in this area, and
@click.exactwould have swallowed it, so the check is spelled out as shift/meta/ctrl to matchMediaAssetCard.vue:346(the card path) andisMultiSelectKey(src/renderer/extensions/vueNodes/utils/selectionUtils.ts).JobAssetsList.vue:47is the second consumer and it is intentionally covered by the same gate. I checked whether it has selection semantics before assuming: it does not — itsAssetsListItemroot is a bare@click.stopwith no handler and the file has noisSelected/select path at all. So there the change is not a fix and not a regression: modifier-click on a job preview now does nothing instead of opening the viewer, and the viewer stays reachable there via plain click on the preview, row double-click, and the row's "View" action button. Its 12 existing tests pass unchanged.Judgment call — this adds a fourth hand-rolled
shiftKey || metaKey || ctrlKeyrather than reusing a helper. The obvious candidate,isMultiSelectKey, lives insrc/renderer/andsrc/platform/cannot import from it (import-x/no-restricted-paths,eslint.config.ts:393-398). #15028 (consolidate multi-select modifier detection) is still open and nothing has landed to reuse, so moving that helper down a layer belongs to that issue, not here. The localconst hasSelectionModifier = …is spelled identically toMediaAssetCard.vue:346on purpose, so #15028's consolidation is a mechanical sweep.Addresses finding 5 of #15220. Deliberately no
Fixes #15220: that issue is an umbrella of six independent findings from the #14765 review and this PR fixes exactly one of them, so closing it on merge would be wrong. Sweep of the half not fixed: of the six findings in #15220, five are untouched here (native video control bar modifier-clicks, audio cards not modifier-selectable, compact-grid video keyboard operability, orphanedisVideoPlaying/showVideoControls, and finding 6), and #15028's consolidation is likewise untouched — that issue stays open.Unexercised acceptance criterion: the manual browser pass (shift-click two rows in list view; double-click one row) was not run — no ComfyUI backend was available to populate the assets sidebar in this environment. The chain it would exercise (
AssetsListItem→AssetsSidebarListView.vue:48preview-asset→AssetsSidebarTab.vue:117handleZoomClick→MediaLightbox) was read and covered at the component level, but not driven end-to-end in a browser. The double-click path (AssetsSidebarListView.vue:47) and thestack-togglecontrol are untouched by the diff and their existing tests pass.Provenance
vitest run src/platform/assets/components/AssetsListItem.test.ts: 10 passed, 0 failed (6 new; all 6 fail with the.vuechange reverted);vitest run src/components/sidebar/tabs/AssetsSidebarListView.test.ts src/components/queue/job/JobAssetsList.test.ts: 19 passed, 0 failed;pnpm typecheck: exit 0;eslint+oxlint --type-aware+oxfmt --checkon both changed files: clean.