Compare commits

...

2 Commits

Author SHA1 Message Date
Stephan Richter b875bfaba1 implemented quick filter on task index 6 days ago
Stephan Richter 65d398c668 preparing for task list filtering 6 days ago
  1. 31
      frontend/src/routes/task/Index.svelte
  2. 1
      translations/src/main/resources/de.json
  3. 2
      translations/src/main/resources/en.json

31
frontend/src/routes/task/Index.svelte

@ -6,6 +6,9 @@
import { error, yikes } from '../../warn.svelte'; import { error, yikes } from '../../warn.svelte';
import { t } from '../../translations.svelte.js'; import { t } from '../../translations.svelte.js';
let filter = $state(null);
let lower_filter = $derived(filter.toLowerCase());
let inverted_filter = $state(false);
let projects = $state({}); let projects = $state({});
let router = useTinyRouter(); let router = useTinyRouter();
let tasks = $state(null); let tasks = $state(null);
@ -44,6 +47,19 @@
router.navigate(`/task/${tid}/edit`); router.navigate(`/task/${tid}/edit`);
} }
function filterApplies(task){
if (!filter) return !inverted_filter;
if (task.name.toLowerCase().includes(lower_filter)) return !inverted_filter;
if (task.description.source.toLowerCase().includes(lower_filter)) return !inverted_filter;
if (projects[task.project_id].name.toLowerCase().includes(lower_filter)) return !inverted_filter;
if (task.parent_task_id){
const parent = map[task.parent_task_id];
if (parent && parent.name.toLowerCase().includes(lower_filter)) return !inverted_filter;
}
return inverted_filter;
}
function go(module, id){ function go(module, id){
router.navigate(`/${module}/${id}/view`); router.navigate(`/${module}/${id}/view`);
} }
@ -103,6 +119,17 @@
<fieldset> <fieldset>
<legend>{loading ? t('loading_object',{object:t('task_list')}) : t('task_list')}</legend> <legend>{loading ? t('loading_object',{object:t('task_list')}) : t('task_list')}</legend>
<div class="filter">
<label>
{t('filter')}: <input type="text" bind:value={filter} >
</label>
{#if filter}
<label>
<input type="checkbox" bind:checked={inverted_filter} />
{t('invert_filter')}
</label>
{/if}
</div>
{#if tasks} {#if tasks}
<table> <table>
<thead> <thead>
@ -117,7 +144,7 @@
</thead> </thead>
<tbody> <tbody>
{#each tasks as task,idx} {#each tasks as task,idx}
{#if task.status > 10 && task.status < 60 && !task.no_index && projects[task.project_id]?.status < 60 && !hidden[task.id]} {#if task.status > 10 && task.status < 60 && !task.no_index && projects[task.project_id]?.status < 60 && !hidden[task.id] && filterApplies(task)}
<tr> <tr>
<td onclick={() => go('task',task.id)}>{task.name}</td> <td onclick={() => go('task',task.id)}>{task.name}</td>
<td> <td>
@ -138,7 +165,7 @@
<td> <td>
<button class="symbol" onclick={() => edit(task.id)} title={t('edit')} ></button> <button class="symbol" onclick={() => edit(task.id)} title={t('edit')} ></button>
<button class="symbol" onclick={() => postpone(idx)} title={t('postpone')} ></button> <button class="symbol" onclick={() => postpone(idx)} title={t('postpone')} ></button>
<button class="symbol" onclick={() => open(idx)} title={t('open')}></button> <button class="symbol" onclick={() => open(idx)} title={t('state_open')}></button>
<button class="symbol" onclick={() => start(idx)} title={t('start')} ></button> <button class="symbol" onclick={() => start(idx)} title={t('start')} ></button>
<button class="symbol" onclick={() => complete(idx)} title={t('complete')} ></button> <button class="symbol" onclick={() => complete(idx)} title={t('complete')} ></button>
<button class="symbol" onclick={() => abort(idx)} title={t('abort')} ></button> <button class="symbol" onclick={() => abort(idx)} title={t('abort')} ></button>

1
translations/src/main/resources/de.json

@ -119,6 +119,7 @@
"impersonate": "zu Nutzer wechseln", "impersonate": "zu Nutzer wechseln",
"IMPERSONATE": "Nutzer wechseln", "IMPERSONATE": "Nutzer wechseln",
"index_page": "Aufgabenübersicht", "index_page": "Aufgabenübersicht",
"invert_filter": "Filter umkehren",
"invoice": "Rechnung", "invoice": "Rechnung",
"item": "Artikel", "item": "Artikel",
"items": "Artikel", "items": "Artikel",

2
translations/src/main/resources/en.json

@ -119,7 +119,9 @@
"impersonate": "impersonate", "impersonate": "impersonate",
"IMPERSONATE": "impersonate", "IMPERSONATE": "impersonate",
"index_page": "task overview", "index_page": "task overview",
"invert_filter": "Filter umkehren",
"invoice": "invoice", "invoice": "invoice",
"item": "Item",
"items": "items", "items": "items",
"join_objects" : "join {objects}", "join_objects" : "join {objects}",

Loading…
Cancel
Save