diff --git a/backend/src/tracker/api/routes/vorlagen.py b/backend/src/tracker/api/routes/vorlagen.py index 71a81d0..c5bfa2d 100644 --- a/backend/src/tracker/api/routes/vorlagen.py +++ b/backend/src/tracker/api/routes/vorlagen.py @@ -45,8 +45,16 @@ def list_vorlagen( params.append(typ) if suche: - where_clauses.append("(v.betreff LIKE ? OR v.aktenzeichen LIKE ?)") - params.extend([f"%{suche}%", f"%{suche}%"]) + where_clauses.append( + "(v.betreff LIKE ? OR v.aktenzeichen LIKE ?" + " OR v.volltext_clean LIKE ?" + " OR v.id IN (" + " SELECT kb.vorlage_id FROM ki_bewertungen kb" + " WHERE kb.typ = 'zusammenfassung' AND kb.begruendung LIKE ?" + "))" + ) + like = f"%{suche}%" + params.extend([like, like, like, like]) where_sql = ("WHERE " + " AND ".join(where_clauses)) if where_clauses else "" diff --git a/frontend/src/routes/vorlagen/+page.svelte b/frontend/src/routes/vorlagen/+page.svelte index 90a8aeb..6452a04 100644 --- a/frontend/src/routes/vorlagen/+page.svelte +++ b/frontend/src/routes/vorlagen/+page.svelte @@ -5,6 +5,12 @@ import { formatDate } from '$lib/status'; let data: Paginated | null = $state(null); + + function highlight(text: string | null, query: string): string { + if (!text || !query) return text || '-'; + const escaped = query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + return text.replace(new RegExp(`(${escaped})`, 'gi'), '$1'); + } let error: string | null = $state(null); let loading = $state(false); @@ -71,7 +77,7 @@
- { if (e.key === 'Enter') applyFilters(); }} />
@@ -117,10 +123,20 @@ goto(`/vorlagen/${v.id}`)}> - {v.aktenzeichen || `#${v.id}`} + {#if filterSuche} + {@html highlight(v.aktenzeichen || `#${v.id}`, filterSuche)} + {:else} + {v.aktenzeichen || `#${v.id}`} + {/if} - {v.betreff || '-'} + + {#if filterSuche} + {@html highlight(v.betreff, filterSuche)} + {:else} + {v.betreff || '-'} + {/if} + {v.typ || '-'} {formatDate(v.datum_eingang)}