refactor(list): polish list commands with icons, compact timestamps, and styled discussions

Phase 3 of the UX overhaul. Enhances the issues, merge requests, and
notes list displays with visual indicators and improved formatting.

List display changes (src/cli/commands/list.rs):
- Add state icons to issues (opened/closed) and merge requests
  (opened/merged/closed) using Icons:: helpers alongside text labels
- Replace [DRAFT] prefix with Icons::mr_draft() glyph for draft MRs
- Switch from format_relative_time to format_relative_time_compact for
  tighter column widths in tabular output
- Switch from format_labels to format_labels_bare for unlabeled style
- Change format_discussions() return type from String to StyledCell so
  unresolved counts render with Theme::warning() color inline
- Bold the section headers ("Issues", "Merge Requests", "Notes")
  with count separated from the label for cleaner scanning
- Import Icons from render module

Test updates (src/cli/commands/list_tests.rs):
- Update format_discussions tests to assert on StyledCell.text field
  instead of raw String, since the function now returns styled output
- The unresolved-count test checks starts_with/contains to handle
  embedded ANSI escape codes from Theme::warning()

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Taylor Eernisse
2026-02-14 10:01:07 -05:00
committed by teernisse
parent af8fc4af76
commit 4b372dfb38
2 changed files with 37 additions and 27 deletions

View File

@@ -62,17 +62,20 @@ fn format_labels_overflow() {
#[test]
fn format_discussions_empty() {
assert_eq!(format_discussions(0, 0), "");
assert_eq!(format_discussions(0, 0).text, "");
}
#[test]
fn format_discussions_no_unresolved() {
assert_eq!(format_discussions(5, 0), "5");
assert_eq!(format_discussions(5, 0).text, "5");
}
#[test]
fn format_discussions_with_unresolved() {
assert_eq!(format_discussions(5, 2), "5/2!");
let cell = format_discussions(5, 2);
// Text contains styled ANSI for warning-colored unresolved count
assert!(cell.text.starts_with("5/"), "got: {}", cell.text);
assert!(cell.text.contains("2!"), "got: {}", cell.text);
}
// -----------------------------------------------------------------------