mirror of
https://seed.radicle.dev/rad:z39mP9rQAaGmERfUMPULfPUi473tY.git
synced 2026-11-16 00:10:38 +08:00
issue: Move out browse footer
This commit is contained in:
@@ -132,83 +132,6 @@ pub struct BrowsePage<'a> {
|
||||
shortcuts: BoxedWidget,
|
||||
}
|
||||
|
||||
impl<'a> BrowsePage<'a> {
|
||||
fn build_footer(props: &BrowsePageProps<'a>, selected: Option<usize>) -> Vec<Column<'a>> {
|
||||
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<usize>) -> Vec<Column<'a>> {
|
||||
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(
|
||||
[
|
||||
|
||||
Reference in New Issue
Block a user