Skip to content

Commit 448985e

Browse files
aksOpsclaude
andcommitted
feat: mock-fidelity pass — read-only details view, widget-based UI
Restructure the details surface and move rendering onto ratatui widgets per design-mock feedback: - Details is now a read-only issue view (side panel on wide terminals, modal on narrow): title with status dot, state chip, colored label pills, due date, linked source, rendered markdown description with acceptance-criteria checkboxes, and Edit / Move / Close actions. Editing moved to a dedicated EditIssue overlay ('e' or Enter). - 'm' moves the selected issue one column right (GitLab transition when connected, local move offline) - Rounded borders everywhere (ratatui border::ROUNDED); Tabs widget for Settings sections and story Edit/Preview/Generated tabs; settings text fields render as bordered input Blocks with focus/error borders and inline validation in the title; toggles as ☑/☐ rows - Buttons render as half-block pills instead of colored text - Board cards: colored status dot, per-label deterministic pill colors, uppercase label subtitle, "+N more issues" column footer, "+" new-issue affordance in column headers - Topbar: "● Connected • project @user", "⟳ Synced Nm ago" after sync, Help and Settings buttons; "● Ready" idle indicator in the status bar - Generate Stories: Select All button + Ctrl+A toggle-all - Help overlay: two-column shortcut layout - Mouse capture releases automatically inside overlays so terminal-native text selection/copy works in text areas; board keeps drag & drop 278 tests pass; fmt clean; clippy unchanged (pre-existing warnings only). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EJsFyUeN5xJiw9hQzjx3Gj
1 parent 4016579 commit 448985e

11 files changed

Lines changed: 611 additions & 273 deletions

File tree

src/jobs.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -882,7 +882,7 @@ pub fn apply_job_result(app: &mut crate::App, result: JobResult) {
882882
app.upsert_issue_record(&issue);
883883
if app.editor_submit_in_flight {
884884
app.editor_submit_in_flight = false;
885-
if app.overlay == Some(crate::Overlay::Details) {
885+
if app.overlay == Some(crate::Overlay::EditIssue) {
886886
app.close_overlay();
887887
}
888888
}
@@ -999,6 +999,7 @@ pub fn apply_job_result(app: &mut crate::App, result: JobResult) {
999999
let skipped = sync.skipped.len();
10001000
app.open_assigned_set = sync.open_assigned_set;
10011001
app.has_synced = true;
1002+
app.last_synced = Some(std::time::Instant::now());
10021003
app.replace_issue_records(&sync.issues);
10031004
app.set_status(
10041005
crate::StatusKind::Success,
@@ -2577,7 +2578,7 @@ mod tests {
25772578
#[test]
25782579
fn issue_updated_success_closes_pending_details_modal() {
25792580
let mut app = crate::App::demo();
2580-
app.open_details();
2581+
app.open_edit_issue();
25812582
app.editor_submit_in_flight = true;
25822583

25832584
apply_job_result(
@@ -2596,20 +2597,20 @@ mod tests {
25962597
JobResult::IssueUpdated(Err("update failed".into())),
25972598
] {
25982599
let mut app = crate::App::demo();
2599-
app.open_details();
2600+
app.open_edit_issue();
26002601
app.editor_submit_in_flight = true;
26012602

26022603
apply_job_result(&mut app, result);
26032604

2604-
assert_eq!(app.overlay, Some(crate::Overlay::Details));
2605+
assert_eq!(app.overlay, Some(crate::Overlay::EditIssue));
26052606
assert!(!app.editor_submit_in_flight);
26062607
}
26072608
}
26082609

26092610
#[test]
26102611
fn ai_editor_stale_result_does_not_overwrite_after_cancel() {
26112612
let mut app = crate::App::demo();
2612-
app.open_details();
2613+
app.open_edit_issue();
26132614
app.editor_description = "keep me".into();
26142615
app.request_improve_description();
26152616
let generation_id = app.ai_generation_id;

0 commit comments

Comments
 (0)