Skip to content

fix: keep sidebar chat menus above virtualized rows (OR-505) - #660

Closed
devin-ai-integration[bot] wants to merge 6 commits into
mainfrom
devin/1792007686-or505-sidebar-menu
Closed

devin-ai-integration[bot] wants to merge 6 commits into
mainfrom
devin/1792007686-or505-sidebar-menu

Conversation

@devin-ai-integration

@devin-ai-integration devin-ai-integration Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Closes #659
Linear: https://linear.app/alphaxiv/issue/OR-505/three-dot-problem

Summary

  • Use a shared Radix Dropdown Menu primitive for sidebar session actions, portaled outside transformed/clipped virtualized rows.
  • Delegate placement/collisions, RTL, keyboard navigation, dismissal and focus restoration to Radix; preserve owner-row dismiss-only clicks and inline Rename focus. Menus follow visible anchors and hide when detached; transcript scrolling does not dismiss them.
  • Remove SessionRow's bespoke geometry/listeners/focus effect and source-extraction tests. Add mounted behavior tests, run them in CI, and regenerate committed ui/dist. No unrelated dropdowns migrated.

Test plan

  • Reproduced on unmodified main 58eaa168380b95f2cca36907d8f627ae27280dd5 through real Codex chats.
  • UI tests (286) and mounted-component behavior tests (12), i18n/style lint, source/test typechecks and production UI build.
  • Rust fmt/Clippy/tests and all applicable CI checks green on final head 642d0909f3c053c77103fc59a551fd8ac90be6d8.
  • Fresh-context scope review: YES, independently loaded Ponytail FULL on final head.
  • Greptile 5/5 with no actionable notes on final head.
  • Rebuilt final head; recorded genuine Codex subscription CLI and fresh dashboard replies, followed by user-facing runtime verification.
  • Freshly fetched origin/main (4874754735487fa74e46563a95fd4ff29f119512); conflict-free at handoff.

Bug reproduction on main

Ubuntu 22.04.5 x86_64, Chrome 137.0.7118.2, OpenResearch 0.2.18, Codex 0.162.1. Expanded sidebar rows overlap the menu; clicking Rename opens a following conversation.

Bug reproduction on main

Post-fix functionality — final head 642d0909

Rebuilt exact head 642d0909f3c053c77103fc59a551fd8ac90be6d8 on Ubuntu 22.04.5 x86_64 / Chrome 137.0.7118.2, OpenResearch 0.2.18 and official Codex 0.162.1. Ponytail FULL independently loaded; genuine subscription-backed Codex CLI and dashboard preflights returned CODEX_OK.

Expanded-sidebar Rename targeted the intended older chat, immediately focused its editor, saved with Enter and persisted after refresh with the original transcript intact. The previously failing fully clipped, still-mounted owner now hides its menu and disables pointer interaction, leaving no clickable orphan.

Visible owner: usable menu Fully clipped owner: hidden menu
Visible-anchor menu Clipped-owner menu hidden

Post-fix functionality on Linux

Additional runtime coverage and limits

Passed visible-anchor sidebar scrolling, resize, real live row reorder, owner-row dismiss-only clicks, outside/trigger dismissal, Radix Arrow/Home/End/wrapping/typeahead/Tab behavior, Escape trigger-focus restoration and keyboard Rename/cancellation.

Transcript scrolling during genuine Codex streaming kept the menu usable; Escape did not stop the reply. Disposable Archive/Unarchive/confirmed Delete and Arabic RTL menu/Rename passed. English was restored. No material regression observed.

Not tested: other browsers/OSes, Persian, Claude and flat-list mode on this final head (flat-list was covered in an earlier implementation's run).

Human review

Yes. Left open for Daniel (sox8502), whose history owns the session-menu/popover code. No merge performed; explicit approval is still required.

Automation improvements

  • Keep exactly one worktree on main before switching the tested checkout to a PR branch; dev-slot otherwise refuses startup. Preserve the slot registry/data for repeat verification.

Link to Devin session: https://app.devin.ai/sessions/b69acda394d34ebc848a0c3187843965
Open in Devin Desktop: https://app.devin.ai/desktop/session/b69acda394d34ebc848a0c3187843965?variant=devin
Requested by: @sox8502

@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".

  • Disable automatic comment, CI, and merge conflict monitoring

@greptile-apps

greptile-apps Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 5/5

[Medium impact] The PR appears safe to merge; no actionable issue remains in the reviewed changes.

Summary

Moves sidebar chat actions into a shared Radix menu rendered outside transformed rows.

  • Chat action menus stay above transformed sidebar rows.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  Row[Sidebar chat row] --> Trigger[Options button]
  Trigger --> Menu[Radix menu outside the row]
  Boundary[Sidebar scroll boundary] --> Menu
  Menu --> Rename[Inline Rename input]
  Menu --> Actions[Archive or Delete owner chat]
Loading

Reviews (6) · Last reviewed commit: "Merge main into OR-505 sidebar menu fix" · Reviewed by Greptile

Comment thread ui/src/components/ChatPanel.tsx Resolved
Comment thread ui/src/components/ChatPanel.tsx Resolved
Comment thread ui/src/components/ChatPanel.tsx Resolved
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

@greptileai Please review the latest head ab5ff14 after the fixes above.

@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

@greptileai Please review the latest head d9e45c5.

sox8502 commented Oct 14, 2026

Copy link
Copy Markdown
Contributor

@devin Please simplify this PR by putting dropdown behavior behind a shared, dependency-backed dropdown-menu primitive instead of implementing it inside SessionRow.

Current main's MenuItem is only a styled button, and usePopover is a handwritten open-state/outside-click/Escape hook. Introduce a shared dropdown component backed by an established accessible menu library that handles portaling, anchor positioning/collision handling, keyboard navigation, dismissal, and focus restoration. SessionRow should declare its trigger and Rename/Archive/Delete actions; it should not own menu geometry, global scroll/resize listeners, or focus-management effects.

Remove the bespoke dropdown machinery from SessionRow and replace the TypeScript-AST/transpileModule/new Function source-extraction tests with focused behavior-level regression coverage. Verify that a menu in an expanded, virtualized sidebar remains clickable and Rename edits the intended chat. Preserve RTL support, owner-row dismiss-only behavior, and sensible behavior during sidebar versus transcript scrolling through the primitive's supported APIs.

Keep the scope to introducing the shared primitive and using it for this session menu; do not migrate unrelated dropdowns in this PR. Rebuild the required committed ui/dist assets and complete the repository's review and verification gates. Leave the PR open; do not merge.

Comment thread ui/src/components/ChatPanel.tsx Resolved
@devin-ai-integration

devin-ai-integration Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor Author

@sox8502 Completed your dropdown-primitive request on 642d0909. Only the session menu uses the new shared Radix primitive; SessionRow no longer owns menu geometry, global listeners or dropdown focus effects. Source-extraction checks are replaced by 12 mounted behavior tests, and committed assets are rebuilt.

Scope review YES, Greptile 5/5 with no actionable notes, all applicable CI green, and recorded Linux/Chrome verification with genuine Codex passed. Arabic RTL, owner-row dismiss-only behavior and sidebar/transcript scrolling were verified. PR remains open and unmerged.

Verified Rename persistence

Final-head Linux/Codex verification

Untested: other OSes/browsers, Persian, Claude and final-head flat-list mode.

Written by Devin

@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

@greptileai Please review the latest head c9d56aa, including the shared Radix session-menu primitive and mounted behavior tests requested by Daniel.

@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

@greptileai Please review final head 450472e. Real runtime testing found an overscanned anchor could leave the sidebar while remaining inside the viewport; this follow-up supplies the sidebar via Radix collisionBoundary and adds mounted clipped-anchor coverage, without introducing geometry effects or global listeners.

@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

@greptileai Please review current head 642d090 against current main. The clipping-boundary correction remains unchanged; committed dashboard assets have been regenerated from the combined source.

@sox8502 sox8502 added the awaiting review Devin bugfix PR is open and needs human review before merge label Oct 14, 2026
@sox8502

sox8502 commented Oct 23, 2026

Copy link
Copy Markdown
Contributor

Superseded by #762, which has been merged and fixes #659 by positioning virtualized sidebar rows with top instead of transform. Closing this alternative implementation in favor of the minimal fix.

@sox8502 sox8502 closed this Oct 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting review Devin bugfix PR is open and needs human review before merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Three dot problem

1 participant