mirror of
https://codeberg.org/icewind/logsmash.git
synced 2026-06-03 18:14:11 +02:00
allow filtering group by menu
This commit is contained in:
parent
22980f4e18
commit
b33aa02997
3 changed files with 46 additions and 3 deletions
|
|
@ -198,6 +198,13 @@ impl GroupingOptions {
|
||||||
.into_iter()
|
.into_iter()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn matches(&self, filter: &str) -> bool {
|
||||||
|
if filter.is_empty() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
self.as_str().to_ascii_lowercase().contains(filter)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn group_key(&self, line: &LogLine) -> Option<u64> {
|
pub fn group_key(&self, line: &LogLine) -> Option<u64> {
|
||||||
let mut hasher = AHasher::default();
|
let mut hasher = AHasher::default();
|
||||||
match self {
|
match self {
|
||||||
|
|
|
||||||
|
|
@ -165,6 +165,7 @@ fn ui(frame: &mut Frame, app: &App, state: &mut UiState) {
|
||||||
options,
|
options,
|
||||||
previous,
|
previous,
|
||||||
list_state,
|
list_state,
|
||||||
|
filter,
|
||||||
..
|
..
|
||||||
}) => {
|
}) => {
|
||||||
ui(frame, app, previous);
|
ui(frame, app, previous);
|
||||||
|
|
@ -173,8 +174,18 @@ fn ui(frame: &mut Frame, app: &App, state: &mut UiState) {
|
||||||
Constraint::Percentage(20),
|
Constraint::Percentage(20),
|
||||||
Constraint::Length(options.len() as u16 + 2), // top and bottom border + content
|
Constraint::Length(options.len() as u16 + 2), // top and bottom border + content
|
||||||
);
|
);
|
||||||
let popup = SelectList::new(options.iter().map(|option| option.as_str()))
|
let mut block = Block::bordered().title("Group By");
|
||||||
.block(Block::bordered().title("Group By"));
|
if !filter.is_empty() {
|
||||||
|
block = block.title_bottom(filter.as_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
let popup = SelectList::new(
|
||||||
|
options
|
||||||
|
.iter()
|
||||||
|
.filter(|o| o.matches(filter))
|
||||||
|
.map(|option| option.as_str()),
|
||||||
|
)
|
||||||
|
.block(block);
|
||||||
frame.render_widget(Clear, area);
|
frame.render_widget(Clear, area);
|
||||||
frame.render_stateful_widget(popup, area, list_state);
|
frame.render_stateful_widget(popup, area, list_state);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@ impl<'a> UiState<'a> {
|
||||||
previous: Some(_),
|
previous: Some(_),
|
||||||
..
|
..
|
||||||
})
|
})
|
||||||
|
| UiState::GroupByMenu(_)
|
||||||
| UiState::Distinct(DistinctLogsState { .. })
|
| UiState::Distinct(DistinctLogsState { .. })
|
||||||
| UiState::Log(LogState { .. })
|
| UiState::Log(LogState { .. })
|
||||||
| UiState::Errors(ErrorLinesState { .. })
|
| UiState::Errors(ErrorLinesState { .. })
|
||||||
|
|
@ -112,6 +113,7 @@ pub struct GroupByMenuState<'a> {
|
||||||
pub previous: Box<UiState<'a>>,
|
pub previous: Box<UiState<'a>>,
|
||||||
pub list_state: SizedListState,
|
pub list_state: SizedListState,
|
||||||
pub next: UiPage,
|
pub next: UiPage,
|
||||||
|
pub filter: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PartialEq for GroupByMenuState<'_> {
|
impl PartialEq for GroupByMenuState<'_> {
|
||||||
|
|
@ -126,7 +128,16 @@ impl<'a> GroupByMenuState<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn enter(self, selected: usize) -> UiState<'a> {
|
pub fn enter(self, selected: usize) -> UiState<'a> {
|
||||||
let group_option = self.options[selected];
|
let Some(group_option) = self
|
||||||
|
.options
|
||||||
|
.iter()
|
||||||
|
.filter(|o| o.matches(&self.filter))
|
||||||
|
.copied()
|
||||||
|
.nth(selected)
|
||||||
|
else {
|
||||||
|
return self.into();
|
||||||
|
};
|
||||||
|
|
||||||
let lines = match self.previous.as_ref() {
|
let lines = match self.previous.as_ref() {
|
||||||
UiState::Group(group) => &group.result.lines.lines,
|
UiState::Group(group) => &group.result.lines.lines,
|
||||||
UiState::Distinct(group) => &group.lines,
|
UiState::Distinct(group) => &group.lines,
|
||||||
|
|
@ -166,6 +177,7 @@ impl<'a> GroupState<'a> {
|
||||||
previous: Box::new(self.into()),
|
previous: Box::new(self.into()),
|
||||||
list_state: SizedListState::new(GroupingOptions::all().count()),
|
list_state: SizedListState::new(GroupingOptions::all().count()),
|
||||||
next: UiPage::Group,
|
next: UiPage::Group,
|
||||||
|
filter: String::new(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -248,6 +260,7 @@ impl<'a> DistinctLogsState<'a> {
|
||||||
previous: Box::new(self.into()),
|
previous: Box::new(self.into()),
|
||||||
list_state: SizedListState::new(GroupingOptions::all().count()),
|
list_state: SizedListState::new(GroupingOptions::all().count()),
|
||||||
next: UiPage::DistinctLogs,
|
next: UiPage::DistinctLogs,
|
||||||
|
filter: String::new(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -382,6 +395,7 @@ impl<'a> UiState<'a> {
|
||||||
match self {
|
match self {
|
||||||
UiState::GroupList(state) => state.mode,
|
UiState::GroupList(state) => state.mode,
|
||||||
UiState::Group(state) => state.mode,
|
UiState::Group(state) => state.mode,
|
||||||
|
UiState::GroupByMenu(_) => Mode::FilterInput,
|
||||||
UiState::Distinct(state) => state.mode,
|
UiState::Distinct(state) => state.mode,
|
||||||
_ => Mode::Normal,
|
_ => Mode::Normal,
|
||||||
}
|
}
|
||||||
|
|
@ -578,6 +592,17 @@ impl<'a> UiState<'a> {
|
||||||
let selected = state.selected();
|
let selected = state.selected();
|
||||||
(true, state.enter(selected))
|
(true, state.enter(selected))
|
||||||
}
|
}
|
||||||
|
(UiState::GroupByMenu(mut state), UiEvent::Text(c)) => {
|
||||||
|
state.filter.push(c);
|
||||||
|
(true, state.into())
|
||||||
|
}
|
||||||
|
(UiState::GroupByMenu(mut state), UiEvent::PopText(PopMode::Character)) => {
|
||||||
|
state.filter.pop();
|
||||||
|
(true, state.into())
|
||||||
|
}
|
||||||
|
(UiState::GroupByMenu(GroupByMenuState { previous, .. }), UiEvent::ClearFilter) => {
|
||||||
|
(true, *previous)
|
||||||
|
}
|
||||||
(UiState::Distinct(state), UiEvent::Select) => {
|
(UiState::Distinct(state), UiEvent::Select) => {
|
||||||
let selected = state.selected();
|
let selected = state.selected();
|
||||||
(true, state.enter(selected, app))
|
(true, state.enter(selected, app))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue