Browse Source

refactord user sorting in kanban

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
module/projects
Stephan Richter 3 days ago
parent
commit
772bb097d4
  1. 49
      frontend/src/routes/project/Kanban.svelte

49
frontend/src/routes/project/Kanban.svelte

@ -51,6 +51,10 @@
window.history.replaceState(window.history.state, '', url); window.history.replaceState(window.history.state, '', url);
} }
function byName(a,b) {
return a.name.localeCompare(b.name);
}
async function create(name,user_id,state){ async function create(name,user_id,state){
var url = api('task/add'); var url = api('task/add');
let task = { let task = {
@ -87,7 +91,6 @@
if (task.assignee == user_id && task.status == state) return; // no change if (task.assignee == user_id && task.status == state) return; // no change
let patch = {members:{},status:+state} let patch = {members:{},status:+state}
patch.members[user_id] = 'ASSIGNEE'; patch.members[user_id] = 'ASSIGNEE';
//console.log('sending patch:',patch)
const url = api(`task/${task.id}`); const url = api(`task/${task.id}`);
const resp = await fetch(url,{ const resp = await fetch(url,{
credentials : 'include', credentials : 'include',
@ -110,7 +113,7 @@
async function load(){ async function load(){
try { try {
await loadProject(); await loadProject();
await loadTasks({project_id:+id,parent_task_id:0}); loadTasks({project_id:+id,parent_task_id:0});
} catch (ignored) {} } catch (ignored) {}
} }
@ -118,17 +121,19 @@
const url = api(`project/${id}`); const url = api(`project/${id}`);
const resp = await fetch(url,{credentials:'include'}); const resp = await fetch(url,{credentials:'include'});
if (resp.ok){ if (resp.ok){
project = await resp.json(); const json = await resp.json();
project = json;
// current user first
users.push(user); users.push(user);
if (!tasks[user.id]) tasks[user.id] = tasks[user.id] = {}; if (!tasks[user.id]) tasks[user.id] = tasks[user.id] = {};
for (var uid of Object.keys(project.members)){
let member = project.members[uid]; for (var member of Object.values(json.members).map(a => a.user).sort(byName)){
users.push(member.user); if (member.id != user.id) users.push(member);
if (!tasks[uid]) tasks[uid] = {}; if (!tasks[member.id]) tasks[member.id] = {};
for (var state of Object.keys(project.allowed_states)) { for (var state of Object.keys(json.allowed_states)) tasks[member.id][state] = {};
tasks[uid][state] = [];
}
} }
yikes(); yikes();
} else { } else {
error(resp); error(resp);
@ -148,21 +153,21 @@
var json = await resp.json(); var json = await resp.json();
for (var task_id of Object.keys(json)) { for (var task_id of Object.keys(json)) {
let task = json[task_id]; let task = json[task_id];
if (task.no_index) continue; if (task.no_index) continue;
let state = task.status;
let state = +task.status;
let owner = null; let owner = null;
let assignee = null; let assignee = null;
for (var user_id of Object.keys(task.members)){ for (var user_id of Object.keys(task.members)){
var member = task.members[user_id]; var member = task.members[user_id];
if (member.permission.name == 'OWNER') owner = user_id; if (member.permission.name == 'OWNER') owner = +user_id;
if (member.permission.name == 'ASSIGNEE') assignee = user_id; if (member.permission.name == 'ASSIGNEE') assignee = +user_id;
} }
if (!assignee) assignee = owner; if (!assignee) assignee = owner;
task.assignee = assignee; task.assignee = assignee;
// if (!tasks[assignee]) tasks[assignee] = {}; if (!tasks[assignee]) tasks[assignee] = {};
// if (!tasks[assignee][state]) tasks[assignee][state] = {}; if (!tasks[assignee][state]) tasks[assignee][state] = {};
tasks[assignee][state][task_id] = task; tasks[assignee][state][task_id] = task;
} }
} else { } else {
@ -204,8 +209,6 @@
} else { } else {
error(resp); error(resp);
} }
console.log(data);
} }
onMount(load); onMount(load);
@ -242,13 +245,11 @@
<div class="user">{u.name} ({u.id})</div> <div class="user">{u.name} ({u.id})</div>
{#each Object.entries(project.allowed_states) as [state,name]} {#each Object.entries(project.allowed_states) as [state,name]}
<div class={['state_'+state, highlight.user == u.id && highlight.state == state ? 'highlight':'']} ondragover={ev => hover(ev,u.id,state)} ondragleave={e => delete highlight.user} ondrop={ev => drop(u.id,state)} > <div class={['state_'+state, highlight.user == u.id && highlight.state == state ? 'highlight':'']} ondragover={ev => hover(ev,u.id,state)} ondragleave={e => delete highlight.user} ondrop={ev => drop(u.id,state)} >
{#if stateList && stateList[state]} {#each Object.values(tasks[u.id][state]).sort(byName) 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)} {#if !filter || task.name.toLowerCase().includes(filter) || (task.tags && task.tags.filter(tag => tag.toLowerCase().includes(filter)).length)}
<Card onclick={e => openTask(task.id)} ondragstart={ev => dragged=task} {task} tag_colors={project.tag_colors} /> <Card onclick={e => openTask(task.id)} ondragstart={ev => dragged=task} {task} tag_colors={project.tag_colors} />
{/if} {/if}
{/each} {/each}
{/if}
<div class="add_task"> <div class="add_task">
<LineEditor value={t('add_object',{object:t('task')})} editable={true} onSet={(name) => create(name,uid,state)}/> <LineEditor value={t('add_object',{object:t('task')})} editable={true} onSet={(name) => create(name,uid,state)}/>
</div> </div>
@ -260,7 +261,3 @@
{t('hide')} {t('hide')}
</div> </div>
{/if} {/if}
<pre>
{JSON.stringify({project,users,tasks},null,2)}
</pre>
Loading…
Cancel
Save