Add issue label and milestone filters

This commit is contained in:
Georg Bauer
2026-07-31 13:42:06 +02:00
parent 6374636b04
commit 6eb27537e8
9 changed files with 492 additions and 18 deletions

View File

@@ -211,12 +211,87 @@ impl GotchaCore {
repository: String,
) -> Result<Vec<IssueRow>, GotchaError> {
let server = self.server()?;
let status = self.state.lock().unwrap().preferences.issue_status.clone();
let (status, filter) = {
let state = self.state.lock().unwrap();
(
state.preferences.issue_status.clone(),
state
.preferences
.issue_filters
.get(&repository_key(&server.url, &owner, &repository))
.cloned()
.unwrap_or_default(),
)
};
let labels: Vec<_> = filter.labels.into_iter().collect();
Ok(issue_rows(
&load_issues(&server, &owner, &repository, &status).await?,
&load_issues(
&server,
&owner,
&repository,
&status,
&labels,
&filter.milestone,
)
.await?,
))
}
pub async fn issue_filters(
&self,
owner: String,
repository: String,
) -> Result<IssueFilterOptions, GotchaError> {
let server = self.server()?;
let filter = self
.state
.lock()
.unwrap()
.preferences
.issue_filters
.get(&repository_key(&server.url, &owner, &repository))
.cloned()
.unwrap_or_default();
let (labels, milestones) = tokio::try_join!(
load_labels(&server, &owner, &repository),
load_milestones(&server, &owner, &repository)
)?;
Ok(issue_filter_options(&labels, &milestones, &filter))
}
pub fn set_issue_filters(
&self,
owner: String,
repository: String,
milestone: String,
labels: Vec<String>,
) -> Result<(), GotchaError> {
let owner = owner.trim();
let repository = repository.trim();
if owner.is_empty() || repository.is_empty() {
return Err("Select a repository first.".into());
}
let filter = IssueFilter {
milestone,
labels: labels
.into_iter()
.filter(|label| !label.is_empty())
.collect(),
};
let mut state = self.state.lock().unwrap();
let server = state
.active_server
.and_then(|index| state.preferences.servers.get(index))
.ok_or("Select a server first.")?;
let key = repository_key(&server.url, owner, repository);
if filter == IssueFilter::default() {
state.preferences.issue_filters.remove(&key);
} else {
state.preferences.issue_filters.insert(key, filter);
}
save_preferences(&state.preferences).map_err(Into::into)
}
pub async fn issue(
&self,
owner: String,