diff --git a/frontend/src/routes/task/Index.svelte b/frontend/src/routes/task/Index.svelte index 7b35428b..ed448c68 100644 --- a/frontend/src/routes/task/Index.svelte +++ b/frontend/src/routes/task/Index.svelte @@ -16,6 +16,7 @@ let loading = $state(true); let map = $state({}); let hidden = $state({}); + let sort = $state({key:'',asc:true}); async function changeState(idx,state){ const task = tasks[idx]; @@ -37,6 +38,11 @@ changeState(idx,'COMPLETE'); } + function cursor(key){ + if (key != sort.key) return 'asc'; + return sort.asc ? 'desc' : 'asc'; + } + function edit(tid){ router.navigate(`/task/${tid}/edit`); } @@ -96,6 +102,40 @@ changeState(idx,'PENDING'); } + function compare(task1, task2, key){ + if (key == 'project') { + let pj_id_A = task1['project_id']; + let pj_id_B = task2['project_id']; + if (pj_id_A == pj_id_B) { + let parentA = ""; + if (task1['parent_task_id']){ + let parent = map[task1['parent_task_id']]; + if (parent) parentA = parent['name']; + } + let parentB = ""; + if (task2['parent_task_id']){ + let parent = map[task2['parent_task_id']]; + if (parent) parentB = parent['name']; + } + return parentA.localeCompare(parentB); + } + return projects[pj_id_A]['name'].localeCompare(projects[pj_id_B]['name']); + } + if (key == 'state') return task1['status'] - task2['status']; + let valA = task1[key] || ''; + let valB = task2[key] || ''; + return valA.localeCompare(valB); + } + + function resort(key){ + if (loading) return; + if (sort.key != key) { + sort.asc = true; + sort.key = key; + } else sort.asc = !sort.asc; + tasks = tasks.toSorted((a,b) => sort.asc ? compare(a,b,key) : compare(b,a,key)); + } + function start(idx){ changeState(idx,'STARTED'); } @@ -103,6 +143,15 @@ onMount(load); + + Umbrella – {t('tasks')} @@ -124,11 +173,11 @@ - - - - - + + + + + diff --git a/translations/src/main/resources/de.json b/translations/src/main/resources/de.json index 256906c4..1605fce3 100644 --- a/translations/src/main/resources/de.json +++ b/translations/src/main/resources/de.json @@ -357,6 +357,7 @@ "show": "anzeigen", "show_closed": "geschlossene anzeigen", "show_kanban": "Kanban-Ansicht", + "sort": "sortieren", "source": "Quelle", "start": "Start", "start_date": "Startdatum", diff --git a/translations/src/main/resources/en.json b/translations/src/main/resources/en.json index 604e1da8..a982fb50 100644 --- a/translations/src/main/resources/en.json +++ b/translations/src/main/resources/en.json @@ -357,6 +357,7 @@ "show": "show", "show_closed": "show closed", "show_kanban": "Kanban", + "sort": "sort", "source": "source", "start": "start", "start_date": "start date",
{t('name')}{t('project')} ({t('parent_task')}){t('state')}{t('start_date')}{t('due_date')} resort('name')}>{t('name')} resort('project')}>{t('project')} ({t('parent_task')}) resort('state')}>{t('state')} resort('start_date')}>{t('start_date')} resort('due_date')}>{t('due_date')} {t('users')} {t('actions')}