feat(tickets): filtres multi-critères par cases à cocher (backend + frontend)
Passe les filtres de la liste des tickets en sélection multiple (#12). Backend Rust : - IssueListFilter : statuses/priorities en Vec, filter_matches en OR intra-champ et AND inter-champs - TicketListRequestDto en tableaux + from_request (parse/déduplication) - MCP idea_ticket_list aligné sur le nouveau contrat Frontend : - TicketListQuery.statuses/priorities - UI de cases à cocher, toggle/clear des filtres Tests verts : issue_store (7), app-tauri --lib (59), mcp_server (24), issue_usecases (6), sprint_usecases (6), frontend vitest (505), npm run build (exit 0). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -112,7 +112,7 @@ async fn issue_store_update_checks_expected_version() {
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn issue_store_lists_by_index_filters() {
|
||||
async fn issue_store_lists_by_index_filters_with_empty_or_and_and_semantics() {
|
||||
let tmp = TempDir::new();
|
||||
let root = tmp.root();
|
||||
let store = FsIssueStore::new();
|
||||
@ -127,21 +127,61 @@ async fn issue_store_lists_by_index_filters() {
|
||||
})
|
||||
.unwrap();
|
||||
store.create(&root, &closed).await.unwrap();
|
||||
let qa_high = issue(&root, 3, "Gamma")
|
||||
.mutate(IssueActor::System, 3_000, |i| {
|
||||
i.status = IssueStatus::Qa;
|
||||
i.priority = IssuePriority::Critical;
|
||||
})
|
||||
.unwrap();
|
||||
store.create(&root, &qa_high).await.unwrap();
|
||||
|
||||
let rows = store
|
||||
let all = store.list(&root, IssueListFilter::default()).await.unwrap();
|
||||
assert_eq!(all.len(), 3);
|
||||
|
||||
let by_status_or = store
|
||||
.list(
|
||||
&root,
|
||||
IssueListFilter {
|
||||
status: Some(IssueStatus::Closed),
|
||||
priority: Some(IssuePriority::Low),
|
||||
statuses: vec![IssueStatus::Closed, IssueStatus::Qa],
|
||||
..IssueListFilter::default()
|
||||
},
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
assert_eq!(rows.len(), 1);
|
||||
assert_eq!(rows[0].title, "Beta");
|
||||
assert_eq!(by_status_or.len(), 2);
|
||||
assert_eq!(by_status_or[0].title, "Beta");
|
||||
assert_eq!(by_status_or[1].title, "Gamma");
|
||||
|
||||
let by_priority_or = store
|
||||
.list(
|
||||
&root,
|
||||
IssueListFilter {
|
||||
priorities: vec![IssuePriority::Low, IssuePriority::Critical],
|
||||
..IssueListFilter::default()
|
||||
},
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
assert_eq!(by_priority_or.len(), 2);
|
||||
assert_eq!(by_priority_or[0].title, "Beta");
|
||||
assert_eq!(by_priority_or[1].title, "Gamma");
|
||||
|
||||
let by_status_and_priority = store
|
||||
.list(
|
||||
&root,
|
||||
IssueListFilter {
|
||||
statuses: vec![IssueStatus::Closed, IssueStatus::Qa],
|
||||
priorities: vec![IssuePriority::Low],
|
||||
..IssueListFilter::default()
|
||||
},
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
assert_eq!(by_status_and_priority.len(), 1);
|
||||
assert_eq!(by_status_and_priority[0].title, "Beta");
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
|
||||
Reference in New Issue
Block a user