|
|
|
|
@ -22,6 +22,8 @@
@@ -22,6 +22,8 @@
|
|
|
|
|
let tasks = $state({}); |
|
|
|
|
let users = {}; |
|
|
|
|
let columns = $derived(project.allowed_states?Object.keys(project.allowed_states).length+1:1); |
|
|
|
|
const controller = new AbortController(); |
|
|
|
|
const signal = controller.signal; |
|
|
|
|
|
|
|
|
|
$effect(() => updateUrl(filter_input)); |
|
|
|
|
|
|
|
|
|
@ -91,15 +93,20 @@
@@ -91,15 +93,20 @@
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
async function load(){ |
|
|
|
|
try { |
|
|
|
|
await loadProject(); |
|
|
|
|
await loadTasks({project_id:+id,parent_task_id:0}); |
|
|
|
|
ready = true; |
|
|
|
|
loadTags(); |
|
|
|
|
} catch (ignored) {} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
async function loadProject(){ |
|
|
|
|
const url = api(`project/${id}`); |
|
|
|
|
const resp = await fetch(url,{credentials:'include'}); |
|
|
|
|
const resp = await fetch(url,{ |
|
|
|
|
credentials:'include', |
|
|
|
|
signal: signal |
|
|
|
|
}); |
|
|
|
|
if (resp.ok){ |
|
|
|
|
project = await resp.json(); |
|
|
|
|
for (var uid of Object.keys(project.members)){ |
|
|
|
|
@ -114,12 +121,17 @@
@@ -114,12 +121,17 @@
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
async function loadTag(task){ |
|
|
|
|
try { |
|
|
|
|
const url = api(`tags/task/${task.id}`); |
|
|
|
|
const resp = await fetch(url,{credentials:'include'}); |
|
|
|
|
const resp = await fetch(url,{ |
|
|
|
|
credentials:'include', |
|
|
|
|
signal: signal |
|
|
|
|
}); |
|
|
|
|
if (resp.ok) { |
|
|
|
|
const tags = await resp.json(); |
|
|
|
|
if (tags.length) task.tags = tags.sort(); |
|
|
|
|
} |
|
|
|
|
} catch (ignored) {} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function loadTags(){ |
|
|
|
|
@ -139,6 +151,7 @@
@@ -139,6 +151,7 @@
|
|
|
|
|
selector.no_index = true; |
|
|
|
|
var resp = await fetch(url,{ |
|
|
|
|
credentials :'include', |
|
|
|
|
signal : signal, |
|
|
|
|
method : 'POST', |
|
|
|
|
body : JSON.stringify(selector) |
|
|
|
|
}); |
|
|
|
|
@ -172,6 +185,11 @@
@@ -172,6 +185,11 @@
|
|
|
|
|
highlight = {user:user_id,state:state}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function openTask(task_id){ |
|
|
|
|
controller.abort(); |
|
|
|
|
router.navigate(`/task/${task_id}/view`) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
onMount(load); |
|
|
|
|
</script> |
|
|
|
|
|
|
|
|
|
@ -201,12 +219,12 @@
@@ -201,12 +219,12 @@
|
|
|
|
|
{#if stateList[state]} |
|
|
|
|
{#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={e => openTask(task.id)} ondragstart={ev => dragged=task} {task} /> |
|
|
|
|
{/if} |
|
|
|
|
{/each} |
|
|
|
|
{/if} |
|
|
|
|
<div class="add_task"> |
|
|
|
|
<LineEditor value={t('add_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> |
|
|
|
|
{/each} |
|
|
|
|
|