diff --git a/typescript/frontend-marios2/src/content/dashboards/Tickets/TicketList.tsx b/typescript/frontend-marios2/src/content/dashboards/Tickets/TicketList.tsx index c081da1c5..6bd163214 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Tickets/TicketList.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Tickets/TicketList.tsx @@ -78,9 +78,26 @@ function TicketList() { .catch(() => {}); }, []); + // Group partner names that differ only by case / whitespace so the same + // partner does not appear as multiple dropdown entries (e.g. "Breu AG" vs + // "Breu Ag"). Normalize for matching, but show one canonical label per group. + const normalizePartner = (p: string) => + p.trim().replace(/\s+/g, ' ').toLowerCase(); + const partnerOptions = Array.from( - new Set(tickets.map((t) => t.distributionPartner).filter((p) => p && p.trim() !== '')) - ).sort(); + tickets + .map((t) => t.distributionPartner) + .filter((p) => p && p.trim() !== '') + .reduce((map, p) => { + const key = normalizePartner(p); + const display = p.trim().replace(/\s+/g, ' '); + const current = map.get(key); + // One canonical label per group; pick the alphabetically first spelling. + if (!current || display.localeCompare(current) < 0) map.set(key, display); + return map; + }, new Map()) + .values() + ).sort((a, b) => a.localeCompare(b)); const assigneeOptions = adminUsers .filter((u) => { @@ -99,7 +116,9 @@ function TicketList() { t.subject.toLowerCase().includes(search.toLowerCase()) || t.installationName.toLowerCase().includes(search.toLowerCase()); const matchesStatus = statusFilter.length === 0 || statusFilter.includes(t.status); - const matchesPartner = partnerFilter === '' || t.distributionPartner === partnerFilter; + const matchesPartner = + partnerFilter === '' || + normalizePartner(t.distributionPartner ?? '') === normalizePartner(partnerFilter); const matchesAssignee = assigneeFilter === '' || (assigneeFilter === '__unassigned__'