From 772bb097d4558cc6314ec95c423afe46df3761d1 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Fri, 21 Nov 2025 13:48:26 +0100 Subject: [PATCH] refactord user sorting in kanban Signed-off-by: Stephan Richter --- frontend/src/routes/project/Kanban.svelte | 51 +++++++++++------------ 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/frontend/src/routes/project/Kanban.svelte b/frontend/src/routes/project/Kanban.svelte index 0e43c1f..b172525 100644 --- a/frontend/src/routes/project/Kanban.svelte +++ b/frontend/src/routes/project/Kanban.svelte @@ -51,6 +51,10 @@ window.history.replaceState(window.history.state, '', url); } + function byName(a,b) { + return a.name.localeCompare(b.name); + } + async function create(name,user_id,state){ var url = api('task/add'); let task = { @@ -87,7 +91,6 @@ if (task.assignee == user_id && task.status == state) return; // no change let patch = {members:{},status:+state} patch.members[user_id] = 'ASSIGNEE'; - //console.log('sending patch:',patch) const url = api(`task/${task.id}`); const resp = await fetch(url,{ credentials : 'include', @@ -110,7 +113,7 @@ async function load(){ try { await loadProject(); - await loadTasks({project_id:+id,parent_task_id:0}); + loadTasks({project_id:+id,parent_task_id:0}); } catch (ignored) {} } @@ -118,17 +121,19 @@ const url = api(`project/${id}`); const resp = await fetch(url,{credentials:'include'}); if (resp.ok){ - project = await resp.json(); + const json = await resp.json(); + project = json; + + // current user first users.push(user); if (!tasks[user.id]) tasks[user.id] = tasks[user.id] = {}; - for (var uid of Object.keys(project.members)){ - let member = project.members[uid]; - users.push(member.user); - if (!tasks[uid]) tasks[uid] = {}; - for (var state of Object.keys(project.allowed_states)) { - tasks[uid][state] = []; - } + + for (var member of Object.values(json.members).map(a => a.user).sort(byName)){ + if (member.id != user.id) users.push(member); + if (!tasks[member.id]) tasks[member.id] = {}; + for (var state of Object.keys(json.allowed_states)) tasks[member.id][state] = {}; } + yikes(); } else { error(resp); @@ -148,21 +153,21 @@ var json = await resp.json(); for (var task_id of Object.keys(json)) { let task = json[task_id]; - if (task.no_index) continue; - let state = task.status; + + let state = +task.status; let owner = null; let assignee = null; + for (var user_id of Object.keys(task.members)){ var member = task.members[user_id]; - if (member.permission.name == 'OWNER') owner = user_id; - if (member.permission.name == 'ASSIGNEE') assignee = user_id; - + if (member.permission.name == 'OWNER') owner = +user_id; + if (member.permission.name == 'ASSIGNEE') assignee = +user_id; } if (!assignee) assignee = owner; task.assignee = assignee; -// if (!tasks[assignee]) tasks[assignee] = {}; -// if (!tasks[assignee][state]) tasks[assignee][state] = {}; + if (!tasks[assignee]) tasks[assignee] = {}; + if (!tasks[assignee][state]) tasks[assignee][state] = {}; tasks[assignee][state][task_id] = task; } } else { @@ -204,8 +209,6 @@ } else { error(resp); } - - console.log(data); } onMount(load); @@ -242,13 +245,11 @@
{u.name} ({u.id})
{#each Object.entries(project.allowed_states) as [state,name]}
hover(ev,u.id,state)} ondragleave={e => delete highlight.user} ondrop={ev => drop(u.id,state)} > - {#if stateList && stateList[state]} - {#each Object.values(stateList[state]).sort((a,b) => a.name.localeCompare(b.name)) as task} + {#each Object.values(tasks[u.id][state]).sort(byName) as task} {#if !filter || task.name.toLowerCase().includes(filter) || (task.tags && task.tags.filter(tag => tag.toLowerCase().includes(filter)).length)} openTask(task.id)} ondragstart={ev => dragged=task} {task} tag_colors={project.tag_colors} /> {/if} {/each} - {/if}
create(name,uid,state)}/>
@@ -259,8 +260,4 @@
delete highlight.archive} ondrop={do_archive} > {t('hide')}
-{/if} - -
-    {JSON.stringify({project,users,tasks},null,2)}
-
\ No newline at end of file +{/if} \ No newline at end of file