From 5d081916df7304e54fd7e17b87c7cd9ce5fe120a Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Mon, 7 Sep 2026 22:08:03 +0200 Subject: [PATCH] added filter option to timetrack page Signed-off-by: Stephan Richter --- frontend/src/routes/time/Index.svelte | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/frontend/src/routes/time/Index.svelte b/frontend/src/routes/time/Index.svelte index 71c6f879..11bcfc62 100644 --- a/frontend/src/routes/time/Index.svelte +++ b/frontend/src/routes/time/Index.svelte @@ -15,12 +15,14 @@ let router = useTinyRouter(); let times = $state(null); + let filter = $state(""); + let lc_filter = $derived(filter.toLowerCase()); let closed = $state(false); let tasks = {}; let projects = {}; let project_filter = $state(null); if (router.hasQueryParam('project')) project_filter = router.getQueryParam('project'); - let sortedTimes = $derived.by(() => Object.values(times).filter(match_prj_filter).map(time => ({ + let sortedTimes = $derived.by(() => Object.values(times).filter(match_prj_filter).filter(key_filter).map(time => ({ ...time, start: display(time.start_time), end: display(time.end_time), @@ -111,7 +113,17 @@ return false; } - + function key_filter(time){ + if (!filter) return true; + if (users[time.user_id].name.toLowerCase().includes(lc_filter)) return true; + if (time.subject.toLowerCase().includes(lc_filter)) return true; + for (var tid of time.task_ids){ + var task = tasks[tid]; + if (tasks[tid].name.toLowerCase().includes(lc_filter)) return true; + if (projects[tasks[tid].project_id].name.toLowerCase().includes(lc_filter)) return true; + } + return false; + } async function loadTimes(){ const url = api('time'); @@ -234,6 +246,11 @@ Umbrella – {t('timetracking')} +

{t('timetracking')}

{#if times} @@ -250,6 +267,10 @@ {t('show_closed')} +