|
|
|
|
@ -51,6 +51,10 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -204,8 +209,6 @@
|
|
|
|
|
} else { |
|
|
|
|
error(resp); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
console.log(data); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
onMount(load); |
|
|
|
|
@ -242,13 +245,11 @@
@@ -242,13 +245,11 @@
|
|
|
|
|
<div class="user">{u.name} ({u.id})</div> |
|
|
|
|
{#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)} > |
|
|
|
|
{#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)} |
|
|
|
|
<Card onclick={e => openTask(task.id)} ondragstart={ev => dragged=task} {task} tag_colors={project.tag_colors} /> |
|
|
|
|
{/if} |
|
|
|
|
{/each} |
|
|
|
|
{/if} |
|
|
|
|
<div class="add_task"> |
|
|
|
|
<LineEditor value={t('add_object',{object:t('task')})} editable={true} onSet={(name) => create(name,uid,state)}/> |
|
|
|
|
</div> |
|
|
|
|
@ -259,8 +260,4 @@
@@ -259,8 +260,4 @@
|
|
|
|
|
<div class="archive {highlight.archive?'hover':''}" ondragover={hover_archive} ondragleave={e => delete highlight.archive} ondrop={do_archive} > |
|
|
|
|
{t('hide')} |
|
|
|
|
</div> |
|
|
|
|
{/if} |
|
|
|
|
|
|
|
|
|
<pre> |
|
|
|
|
{JSON.stringify({project,users,tasks},null,2)} |
|
|
|
|
</pre> |
|
|
|
|
{/if} |