feat(sidebar): group bulk actions, empty-area quick menu, sort#40
Merged
Conversation
Adds Remote control all, Sleep all, Start all, and Close all entries to both the group-strip tab and the inline group-header context menus. Items enable/disable based on live vs dormant member counts. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sidebar right-click on empty space (header, session list, group strip, empty terminal grid) now shows a shared quick menu with: - New session / New group - Bulk actions submenu — Wake all dormant, Sleep all, Close all - Group display mode toggle (None / FilterStrip / InlineHeaders) - Expand / collapse all group sections - Session row icons mode (OnHover / Always / Hidden) - Show git branch / worktree clusters toggles - All settings… The legacy + group footer button is removed; group creation flows through "New group…" in the same menu. New sort button in the SESSIONS header (left of +). Opens a direction-aware menu: Name, Folder, Last active, Git ▸ (Branch, Dirty, Repo). Re-clicking the active field flips direction; switching fields picks the field's natural starting direction. Direction glyph lives in the MenuItem icon slot so it column-aligns. Sessions without live git info sink to the bottom of git-based orderings. ShellSession gains a LastActivityAt timestamp updated when a session becomes the active one, persisted via the existing state.json path. SessionManager.SortSessions exposes a one-shot Sort(Comparison). Visual polish: vertical filter strip now has a hairline divider between All/Ungrouped and the user groups; Ungrouped glyph changed from "∅" to "□" so it reads as the hollow companion to the "▦" All glyph. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Contributor
Code reviewFound 1 issue:
CodeShellManager/src/CodeShellManager/Models/ShellSession.cs Lines 19 to 28 in dd4ebd4 🤖 Generated with Claude Code - If this code review was useful, please react with 👍. Otherwise, react with 👎. |
LastActivityAt was initialized to DateTime.UtcNow, which fires when System.Text.Json deserializes a pre-PR state.json that doesn't carry the key — every legacy session loaded as "active right now" and sorted to the top of "Sort by Last active" in load order rather than reflecting real activity. Initialize to default (DateTime.MinValue) as a sentinel; SessionManager. LoadFromState then backfills from CreatedAt for any session that comes back from disk without the field. SessionManager.CreateSession sets it explicitly on the new-session path so new sessions still get a real timestamp.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
⇅button in the SESSIONS header (left of+). Direction-aware sort menu with Name / Folder / Last active / Git ▸ (Branch, Dirty, Repo). Re-clicking the active field flips direction; switching fields picks each field's natural starting direction. Direction glyph lives in the MenuItem icon slot so it column-aligns; the active row renders SemiBold + 100% opacity, inactive rows show their default direction as a 45%-opacity preview.Implementation notes
ShellSession.LastActivityAt(defaults toCreatedAt) is updated whenever the active session changes, persisted via the existing state.json flow.SessionManager.SortSessions(Comparison<ShellSession>)is a one-shot in-place sort; drag-reorder still works afterwards.Dictionary<id, SessionViewModel>lookup; dormant sessions (no live VM) sink to the bottom of every git ordering.Test plan
🤖 Generated with Claude Code