|
|
|
@ -1,48 +1,47 @@ |
|
|
|
<script> |
|
|
|
<script> |
|
|
|
import { onMount } from 'svelte'; |
|
|
|
import { onMount } from 'svelte'; |
|
|
|
import { useTinyRouter } from 'svelte-tiny-router'; |
|
|
|
import { useTinyRouter } from 'svelte-tiny-router'; |
|
|
|
|
|
|
|
|
|
|
|
import { api } from '../../urls.svelte.js'; |
|
|
|
import { api } from '../../urls.svelte.js'; |
|
|
|
import { t } from '../../translations.svelte.js'; |
|
|
|
import { t } from '../../translations.svelte.js'; |
|
|
|
import { user } from '../../user.svelte.js'; |
|
|
|
import { user } from '../../user.svelte.js'; |
|
|
|
|
|
|
|
|
|
|
|
import Card from './KanbanCard.svelte'; |
|
|
|
import Card from './KanbanCard.svelte'; |
|
|
|
import LineEditor from '../../Components/LineEditor.svelte'; |
|
|
|
import LineEditor from '../../Components/LineEditor.svelte'; |
|
|
|
|
|
|
|
|
|
|
|
let { id } = $props(); |
|
|
|
let { id } = $props(); |
|
|
|
|
|
|
|
|
|
|
|
let dragged = null; |
|
|
|
let dragged = null; |
|
|
|
let error = $state(null); |
|
|
|
let error = $state(null); |
|
|
|
let highlight = $state({}); |
|
|
|
let highlight = $state({}); |
|
|
|
let project = $state(null); |
|
|
|
|
|
|
|
let ready = $state(false); |
|
|
|
|
|
|
|
let router = useTinyRouter(); |
|
|
|
|
|
|
|
let states = $state(null); |
|
|
|
|
|
|
|
let tasks = $state({}); |
|
|
|
|
|
|
|
let filter_input = $state(''); |
|
|
|
let filter_input = $state(''); |
|
|
|
let filter = $derived(filter_input.toLowerCase()); |
|
|
|
let filter = $derived(filter_input.toLowerCase()); |
|
|
|
let users = {}; |
|
|
|
let project = $state(null); |
|
|
|
|
|
|
|
let ready = $state(false); |
|
|
|
let columns = $derived(states?Object.keys(states).length+1:1); |
|
|
|
let router = useTinyRouter(); |
|
|
|
|
|
|
|
let states = $state(null); |
|
|
|
|
|
|
|
let tasks = $state({}); |
|
|
|
|
|
|
|
let users = {}; |
|
|
|
|
|
|
|
let columns = $derived(states?Object.keys(states).length+1:1); |
|
|
|
|
|
|
|
|
|
|
|
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 = { |
|
|
|
description: '', |
|
|
|
description : '', |
|
|
|
members : {}, |
|
|
|
members : {}, |
|
|
|
name: name, |
|
|
|
name : name, |
|
|
|
project_id: +id, |
|
|
|
project_id : +id, |
|
|
|
status : { code : +state} |
|
|
|
status : { code : +state} |
|
|
|
} |
|
|
|
} |
|
|
|
task.members[user_id] = { permission: { name : 'ASSIGNEE' }}; |
|
|
|
task.members[user_id] = { permission: { name : 'ASSIGNEE' }}; |
|
|
|
task.members[user.id] = { permission: { name : 'OWNER' }}; |
|
|
|
task.members[user.id] = { permission: { name : 'OWNER' }}; |
|
|
|
const resp = await fetch(url,{ |
|
|
|
const resp = await fetch(url,{ |
|
|
|
credentials:'include', |
|
|
|
credentials : 'include', |
|
|
|
method:'POST', |
|
|
|
method : 'POST', |
|
|
|
body: JSON.stringify(task) |
|
|
|
body : JSON.stringify(task) |
|
|
|
}); |
|
|
|
}); |
|
|
|
if (resp.ok) { |
|
|
|
if (resp.ok) { |
|
|
|
task = await resp.json(); |
|
|
|
task = await resp.json(); |
|
|
|
task.assignee = user_id; |
|
|
|
task.assignee = user_id; |
|
|
|
if (!tasks[user_id]) tasks[user_id] = {}; |
|
|
|
if (!tasks[user_id]) tasks[user_id] = {}; |
|
|
|
if (!tasks[user_id][state]) tasks[user_id][state] = {}; |
|
|
|
if (!tasks[user_id][state]) tasks[user_id][state] = {}; |
|
|
|
@ -54,18 +53,18 @@ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async function drop(user_id,state){ |
|
|
|
async function drop(user_id,state){ |
|
|
|
let task = dragged; |
|
|
|
let task = dragged; |
|
|
|
dragged = null; |
|
|
|
dragged = null; |
|
|
|
highlight = {}; |
|
|
|
highlight = {}; |
|
|
|
if (task.assignee == user_id && task.status.code == state) return; // no change |
|
|
|
if (task.assignee == user_id && task.status.code == state) return; // no change |
|
|
|
let patch = {members:{},status:+state} |
|
|
|
let patch = {members:{},status:+state} |
|
|
|
patch.members[user_id] = 'ASSIGNEE'; |
|
|
|
patch.members[user_id] = 'ASSIGNEE'; |
|
|
|
|
|
|
|
|
|
|
|
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', |
|
|
|
method: 'PATCH', |
|
|
|
method : 'PATCH', |
|
|
|
body: JSON.stringify(patch) |
|
|
|
body : JSON.stringify(patch) |
|
|
|
}); |
|
|
|
}); |
|
|
|
if (resp.ok){ |
|
|
|
if (resp.ok){ |
|
|
|
delete tasks[task.assignee][task.status.code][task.id] |
|
|
|
delete tasks[task.assignee][task.status.code][task.id] |
|
|
|
@ -73,8 +72,8 @@ |
|
|
|
if (!tasks[user_id][state]) tasks[user_id][state] = {} |
|
|
|
if (!tasks[user_id][state]) tasks[user_id][state] = {} |
|
|
|
tasks[user_id][state][task.id] = task; |
|
|
|
tasks[user_id][state][task.id] = task; |
|
|
|
task.assignee = user_id; |
|
|
|
task.assignee = user_id; |
|
|
|
task.status = {code:state,name:states[state]}; |
|
|
|
task.status = {code:state,name:states[state]}; |
|
|
|
error = null; |
|
|
|
error = null; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
error = await resp.text(); |
|
|
|
error = await resp.text(); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -89,7 +88,7 @@ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async function loadProject(){ |
|
|
|
async function loadProject(){ |
|
|
|
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(); |
|
|
|
project = await resp.json(); |
|
|
|
@ -105,18 +104,18 @@ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async function loadStates(){ |
|
|
|
async function loadStates(){ |
|
|
|
const url = api(`project/${id}/states`); |
|
|
|
const url = api(`project/${id}/states`); |
|
|
|
const resp = await fetch(url,{credentials:'include'}); |
|
|
|
const resp = await fetch(url,{credentials:'include'}); |
|
|
|
if (resp.ok){ |
|
|
|
if (resp.ok){ |
|
|
|
states = await resp.json(); |
|
|
|
states = await resp.json(); |
|
|
|
error = null; |
|
|
|
error = null; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
error = await resp.text(); |
|
|
|
error = await resp.text(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async function loadTag(task){ |
|
|
|
async function loadTag(task){ |
|
|
|
const url = api(`tags/task/${task.id}`); |
|
|
|
const url = api(`tags/task/${task.id}`); |
|
|
|
const resp = await fetch(url,{credentials:'include'}); |
|
|
|
const resp = await fetch(url,{credentials:'include'}); |
|
|
|
if (resp.ok) { |
|
|
|
if (resp.ok) { |
|
|
|
const tags = await resp.json(); |
|
|
|
const tags = await resp.json(); |
|
|
|
@ -136,24 +135,24 @@ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async function loadTasks(selector){ |
|
|
|
async function loadTasks(selector){ |
|
|
|
const url = api('task/list'); |
|
|
|
const url = api('task/list'); |
|
|
|
selector.show_closed = true; |
|
|
|
selector.show_closed = true; |
|
|
|
selector.no_index = true; |
|
|
|
selector.no_index = true; |
|
|
|
var resp = await fetch(url,{ |
|
|
|
var resp = await fetch(url,{ |
|
|
|
credentials: 'include', |
|
|
|
credentials : 'include', |
|
|
|
method:'POST', |
|
|
|
method : 'POST', |
|
|
|
body:JSON.stringify(selector) |
|
|
|
body : JSON.stringify(selector) |
|
|
|
}); |
|
|
|
}); |
|
|
|
if (resp.ok){ |
|
|
|
if (resp.ok){ |
|
|
|
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]; |
|
|
|
let state = task.status.code; |
|
|
|
let state = task.status.code; |
|
|
|
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; |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|