working on kanban filter and tag sorting

This commit is contained in:
2025-07-28 00:45:09 +02:00
parent 2bd7270f83
commit 0aa7aa67dc
4 changed files with 17 additions and 0 deletions

View File

@@ -19,6 +19,8 @@
let router = useTinyRouter(); let router = useTinyRouter();
let states = $state(null); let states = $state(null);
let tasks = $state({}); let tasks = $state({});
let filter_input = $state('');
let filter = $derived(filter_input.toLowerCase());
let users = {}; let users = {};
let columns = $derived(states?Object.keys(states).length+1:1); let columns = $derived(states?Object.keys(states).length+1:1);
@@ -184,6 +186,10 @@
{#if ready} {#if ready}
<div class="kanban" style="display: grid; grid-template-columns: {`repeat(${columns}, auto)`}"> <div class="kanban" style="display: grid; grid-template-columns: {`repeat(${columns}, auto)`}">
<span class="filter">
<input type="text" bind:value={filter_input} />
{t('filter')}
</span>
<div class="head">{t('user')}</div> <div class="head">{t('user')}</div>
{#if states} {#if states}
{#each Object.entries(states) as [sid,state]} {#each Object.entries(states) as [sid,state]}
@@ -196,7 +202,9 @@
<div class={[state, highlight.user == uid && highlight.state == state ? 'highlight':'']} ondragover={ev => hover(ev,uid,state)} ondrop={ev => drop(uid,state)} > <div class={[state, highlight.user == uid && highlight.state == state ? 'highlight':'']} ondragover={ev => hover(ev,uid,state)} ondrop={ev => drop(uid,state)} >
{#if stateList[state]} {#if stateList[state]}
{#each Object.values(stateList[state]).sort((a,b) => a.name.localeCompare(b.name)) as task} {#each Object.values(stateList[state]).sort((a,b) => a.name.localeCompare(b.name)) as task}
{#if !filter || task.name.toLowerCase().includes(filter) || (task.tags && task.tags.filter(tag => tag.toLowerCase().includes(filter)).length)}
<Card onclick={() => router.navigate(`/task/${task.id}/view`)} ondragstart={ev => dragged=task} {task} /> <Card onclick={() => router.navigate(`/task/${task.id}/view`)} ondragstart={ev => dragged=task} {task} />
{/if}
{/each} {/each}
{/if} {/if}
<div class="add_task"> <div class="add_task">

View File

@@ -22,6 +22,7 @@
if (resp.ok){ if (resp.ok){
tag = await resp.text(); tag = await resp.text();
tags.push(tag); tags.push(tag);
tags = tags.sort();
} else { } else {
error = await resp.text(); error = await resp.text();
} }
@@ -49,6 +50,7 @@
const resp = await fetch(url,{credentials:'include'}); const resp = await fetch(url,{credentials:'include'});
if (resp.ok) { if (resp.ok) {
tags = await resp.json(); tags = await resp.json();
tags = tags.sort();
} else { } else {
error = await resp.text(); error = await resp.text();
} }

View File

@@ -70,6 +70,7 @@
"failed": "fehlgeschlagen", "failed": "fehlgeschlagen",
"files": "Dateien", "files": "Dateien",
"filter": "Filter",
"footer": "Fuß-Text", "footer": "Fuß-Text",
"foreign_id": "externe Kennung", "foreign_id": "externe Kennung",
"forgot_pass" : "Password vergessen?", "forgot_pass" : "Password vergessen?",

View File

@@ -198,6 +198,12 @@ textarea{
z-index: 20; z-index: 20;
} }
.kanban .filter{
position: absolute;
top: 60px;
right: 20px;
}
.project th, .project th,
.task th{ .task th{
text-align: right; text-align: right;