@@ -1446,50 +1446,79 @@ fn build_detail_lines(app: &App, selected_dep: Option<usize>) -> Vec<Line<'stati
14461446 ] ) ) ;
14471447 }
14481448
1449- // deps
1449+ // deps — sorted open/doing first, with titles inline
14501450 if !issue. deps ( ) . is_empty ( ) {
14511451 lines. push ( Line :: from ( "" ) ) ;
14521452 lines. push ( Line :: from ( Span :: styled (
14531453 "Blocked by:" ,
14541454 Style :: default ( ) . fg ( Color :: DarkGray ) ,
14551455 ) ) ) ;
1456- for ( idx, dep_id) in issue. deps ( ) . iter ( ) . enumerate ( ) {
1457- let is_selected = selected_dep == Some ( idx) ;
1456+
1457+ // build sorted indices: open/doing first, done/skip last
1458+ let deps = issue. deps ( ) ;
1459+ let mut dep_indices: Vec < usize > = ( 0 ..deps. len ( ) ) . collect ( ) ;
1460+ dep_indices. sort_by_key ( |& i| {
1461+ app. issues
1462+ . get ( & deps[ i] )
1463+ . map ( |iss| matches ! ( iss. status( ) , Status :: Done | Status :: Skip ) as u8 )
1464+ . unwrap_or ( 0 )
1465+ } ) ;
1466+
1467+ for ( display_idx, & orig_idx) in dep_indices. iter ( ) . enumerate ( ) {
1468+ let dep_id = & deps[ orig_idx] ;
1469+ let is_selected = selected_dep == Some ( display_idx) ;
14581470 // show number for selection (1-9) when selection enabled, otherwise bullet
14591471 let prefix = if selected_dep. is_some ( ) {
1460- if idx < 9 {
1461- format ! ( "{}" , idx + 1 )
1472+ if display_idx < 9 {
1473+ format ! ( "{}" , display_idx + 1 )
14621474 } else {
14631475 "-" . to_string ( )
14641476 }
14651477 } else {
14661478 " " . to_string ( )
14671479 } ;
14681480
1469- let ( symbol, status_text, base_color) = if let Some ( dep_issue) = app. issues . get ( dep_id)
1470- {
1471- match dep_issue. status ( ) {
1472- Status :: Done => ( "✓" , "done" , Color :: Green ) ,
1473- Status :: Skip => ( "⊘" , "skip" , Color :: DarkGray ) ,
1474- Status :: Doing => ( "→" , "doing" , Color :: Yellow ) ,
1475- Status :: Open => ( "○" , "open" , Color :: White ) ,
1476- }
1477- } else {
1478- ( "?" , "missing" , Color :: Red )
1479- } ;
1481+ let ( symbol, status_text, base_color, title) =
1482+ if let Some ( dep_issue) = app. issues . get ( dep_id) {
1483+ let t = dep_issue. title ( ) ;
1484+ let truncated = if t. chars ( ) . count ( ) > 60 {
1485+ let mut s: String = t. chars ( ) . take ( 59 ) . collect ( ) ;
1486+ s. push ( '…' ) ;
1487+ s
1488+ } else {
1489+ t. to_string ( )
1490+ } ;
1491+ match dep_issue. status ( ) {
1492+ Status :: Done => ( "✓" , "done" , Color :: Green , truncated) ,
1493+ Status :: Skip => ( "⊘" , "skip" , Color :: DarkGray , truncated) ,
1494+ Status :: Doing => ( "→" , "doing" , Color :: Yellow , truncated) ,
1495+ Status :: Open => ( "○" , "open" , Color :: White , truncated) ,
1496+ }
1497+ } else {
1498+ ( "?" , "missing" , Color :: Red , String :: new ( ) )
1499+ } ;
14801500
14811501 let mut style = Style :: default ( ) . fg ( base_color) ;
14821502 if is_selected {
14831503 style = style. add_modifier ( Modifier :: BOLD ) ;
14841504 }
14851505
1486- lines. push ( Line :: from ( Span :: styled (
1487- format ! ( "{} {} {} ({})" , prefix, symbol, dep_id, status_text) ,
1488- style,
1489- ) ) ) ;
1506+ let text = if title. is_empty ( ) {
1507+ format ! ( "{} {} {} ({})" , prefix, symbol, dep_id, status_text)
1508+ } else {
1509+ format ! (
1510+ "{} {} {} ({}) {}" ,
1511+ prefix, symbol, dep_id, status_text, title
1512+ )
1513+ } ;
1514+
1515+ lines. push ( Line :: from ( Span :: styled ( text, style) ) ) ;
14901516 }
14911517
1492- if let Some ( dep_id) = selected_dep. and_then ( |idx| issue. deps ( ) . get ( idx) ) {
1518+ if let Some ( dep_id) = selected_dep
1519+ . and_then ( |idx| dep_indices. get ( idx) )
1520+ . and_then ( |& orig_idx| issue. deps ( ) . get ( orig_idx) )
1521+ {
14931522 lines. push ( Line :: from ( "" ) ) ;
14941523 lines. push ( Line :: from ( Span :: styled (
14951524 "dependency preview:" ,
@@ -1523,29 +1552,52 @@ fn build_detail_lines(app: &App, selected_dep: Option<usize>) -> Vec<Line<'stati
15231552 }
15241553 }
15251554
1526- // dependents (reverse deps - issues that depend on this one)
1555+ // dependents (reverse deps - issues that depend on this one) — sorted open/doing first
15271556 let dependents = get_dependents ( issue. id ( ) , & app. issues ) ;
15281557 if !dependents. is_empty ( ) {
15291558 lines. push ( Line :: from ( "" ) ) ;
15301559 lines. push ( Line :: from ( Span :: styled (
15311560 "Blocks:" ,
15321561 Style :: default ( ) . fg ( Color :: DarkGray ) ,
15331562 ) ) ) ;
1534- for dep_id in & dependents {
1535- let ( symbol, status_text, base_color) = if let Some ( dep_issue) = app. issues . get ( dep_id)
1536- {
1537- match dep_issue. status ( ) {
1538- Status :: Done => ( "✓" , "done" , Color :: Green ) ,
1539- Status :: Skip => ( "⊘" , "skip" , Color :: DarkGray ) ,
1540- Status :: Doing => ( "→" , "doing" , Color :: Yellow ) ,
1541- Status :: Open => ( "○" , "open" , Color :: White ) ,
1542- }
1563+
1564+ let mut sorted_dependents = dependents. clone ( ) ;
1565+ sorted_dependents. sort_by_key ( |id| {
1566+ app. issues
1567+ . get ( id)
1568+ . map ( |iss| matches ! ( iss. status( ) , Status :: Done | Status :: Skip ) as u8 )
1569+ . unwrap_or ( 0 )
1570+ } ) ;
1571+
1572+ for dep_id in & sorted_dependents {
1573+ let ( symbol, status_text, base_color, title) =
1574+ if let Some ( dep_issue) = app. issues . get ( dep_id) {
1575+ let t = dep_issue. title ( ) ;
1576+ let truncated = if t. chars ( ) . count ( ) > 60 {
1577+ let mut s: String = t. chars ( ) . take ( 59 ) . collect ( ) ;
1578+ s. push ( '…' ) ;
1579+ s
1580+ } else {
1581+ t. to_string ( )
1582+ } ;
1583+ match dep_issue. status ( ) {
1584+ Status :: Done => ( "✓" , "done" , Color :: Green , truncated) ,
1585+ Status :: Skip => ( "⊘" , "skip" , Color :: DarkGray , truncated) ,
1586+ Status :: Doing => ( "→" , "doing" , Color :: Yellow , truncated) ,
1587+ Status :: Open => ( "○" , "open" , Color :: White , truncated) ,
1588+ }
1589+ } else {
1590+ ( "?" , "missing" , Color :: Red , String :: new ( ) )
1591+ } ;
1592+
1593+ let text = if title. is_empty ( ) {
1594+ format ! ( " {} {} ({})" , symbol, dep_id, status_text)
15431595 } else {
1544- ( "? ", "missing" , Color :: Red )
1596+ format ! ( " {} {} ({}) {} ", symbol , dep_id , status_text , title )
15451597 } ;
15461598
15471599 lines. push ( Line :: from ( Span :: styled (
1548- format ! ( " {} {} ({})" , symbol , dep_id , status_text ) ,
1600+ text ,
15491601 Style :: default ( ) . fg ( base_color) ,
15501602 ) ) ) ;
15511603 }
0 commit comments