diff --git a/bin/commands/issue/select/ui.rs b/bin/commands/issue/select/ui.rs index 3a71708b..7277faeb 100644 --- a/bin/commands/issue/select/ui.rs +++ b/bin/commands/issue/select/ui.rs @@ -132,83 +132,6 @@ pub struct BrowsePage<'a> { shortcuts: BoxedWidget, } -impl<'a> BrowsePage<'a> { - fn build_footer(props: &BrowsePageProps<'a>, selected: Option) -> Vec> { - let search = Line::from(vec![ - span::default(" Search ").cyan().dim().reversed(), - span::default(" "), - span::default(&props.search).gray().dim(), - ]); - - let open = Line::from(vec![ - span::positive(&props.stats.get("Open").unwrap_or(&0).to_string()).dim(), - span::default(" Open").dim(), - ]); - let solved = Line::from(vec![ - span::default(&props.stats.get("Solved").unwrap_or(&0).to_string()) - .magenta() - .dim(), - span::default(" Solved").dim(), - ]); - let closed = Line::from(vec![ - span::default(&props.stats.get("Closed").unwrap_or(&0).to_string()) - .magenta() - .dim(), - span::default(" Closed").dim(), - ]); - let sum = Line::from(vec![ - span::default("Σ ").dim(), - span::default(&props.issues.len().to_string()).dim(), - ]); - - let progress = selected - .map(|selected| TableUtils::progress(selected, props.issues.len(), props.page_size)) - .unwrap_or_default(); - let progress = span::default(&format!("{}%", progress)).dim(); - - match IssueItemFilter::from_str(&props.search) - .unwrap_or_default() - .state() - { - Some(state) => { - let block = match state { - issue::State::Open => open, - issue::State::Closed { - reason: issue::CloseReason::Other, - } => closed, - issue::State::Closed { - reason: issue::CloseReason::Solved, - } => solved, - }; - - [ - Column::new(Text::from(search), Constraint::Fill(1)), - Column::new( - Text::from(block.clone()), - Constraint::Min(block.width() as u16), - ), - Column::new(Text::from(progress), Constraint::Min(4)), - ] - .to_vec() - } - None => [ - Column::new(Text::from(search), Constraint::Fill(1)), - Column::new( - Text::from(open.clone()), - Constraint::Min(open.width() as u16), - ), - Column::new( - Text::from(closed.clone()), - Constraint::Min(closed.width() as u16), - ), - Column::new(Text::from(sum.clone()), Constraint::Min(sum.width() as u16)), - Column::new(Text::from(progress), Constraint::Min(4)), - ] - .to_vec(), - } - } -} - impl<'a: 'static> Widget for BrowsePage<'a> { type Action = Action; type State = State; @@ -260,7 +183,7 @@ impl<'a: 'static> Widget for BrowsePage<'a> { let props = BrowsePageProps::from(state); FooterProps::default() - .columns(Self::build_footer(&props, props.selected)) + .columns(browse_footer(&props, props.selected)) .to_boxed() }) .to_boxed(), @@ -638,6 +561,81 @@ impl<'a: 'static> Widget for HelpPage<'a> { } } +fn browse_footer<'a>(props: &BrowsePageProps<'a>, selected: Option) -> Vec> { + let search = Line::from(vec![ + span::default(" Search ").cyan().dim().reversed(), + span::default(" "), + span::default(&props.search).gray().dim(), + ]); + + let open = Line::from(vec![ + span::positive(&props.stats.get("Open").unwrap_or(&0).to_string()).dim(), + span::default(" Open").dim(), + ]); + let solved = Line::from(vec![ + span::default(&props.stats.get("Solved").unwrap_or(&0).to_string()) + .magenta() + .dim(), + span::default(" Solved").dim(), + ]); + let closed = Line::from(vec![ + span::default(&props.stats.get("Closed").unwrap_or(&0).to_string()) + .magenta() + .dim(), + span::default(" Closed").dim(), + ]); + let sum = Line::from(vec![ + span::default("Σ ").dim(), + span::default(&props.issues.len().to_string()).dim(), + ]); + + let progress = selected + .map(|selected| TableUtils::progress(selected, props.issues.len(), props.page_size)) + .unwrap_or_default(); + let progress = span::default(&format!("{}%", progress)).dim(); + + match IssueItemFilter::from_str(&props.search) + .unwrap_or_default() + .state() + { + Some(state) => { + let block = match state { + issue::State::Open => open, + issue::State::Closed { + reason: issue::CloseReason::Other, + } => closed, + issue::State::Closed { + reason: issue::CloseReason::Solved, + } => solved, + }; + + [ + Column::new(Text::from(search), Constraint::Fill(1)), + Column::new( + Text::from(block.clone()), + Constraint::Min(block.width() as u16), + ), + Column::new(Text::from(progress), Constraint::Min(4)), + ] + .to_vec() + } + None => [ + Column::new(Text::from(search), Constraint::Fill(1)), + Column::new( + Text::from(open.clone()), + Constraint::Min(open.width() as u16), + ), + Column::new( + Text::from(closed.clone()), + Constraint::Min(closed.width() as u16), + ), + Column::new(Text::from(sum.clone()), Constraint::Min(sum.width() as u16)), + Column::new(Text::from(progress), Constraint::Min(4)), + ] + .to_vec(), + } +} + fn help_text() -> Text<'static> { Text::from( [