implemented interruption of fetch requests if task is clicked in kanban

This commit is contained in:
2025-08-25 23:13:38 +02:00
parent 53db593936
commit 0455c76479
2 changed files with 32 additions and 15 deletions

View File

@@ -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 @@
}
async function load(){
await loadProject();
await loadTasks({project_id:+id,parent_task_id:0});
ready = true;
loadTags();
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 @@
}
async function loadTag(task){
const url = api(`tags/task/${task.id}`);
const resp = await fetch(url,{credentials:'include'});
if (resp.ok) {
const tags = await resp.json();
if (tags.length) task.tags = tags.sort();
}
try {
const url = api(`tags/task/${task.id}`);
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(){
@@ -138,7 +150,8 @@
selector.show_closed = true;
selector.no_index = true;
var resp = await fetch(url,{
credentials : 'include',
credentials :'include',
signal : signal,
method : 'POST',
body : JSON.stringify(selector)
});
@@ -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 @@
{#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}

View File

@@ -46,7 +46,6 @@
function updateOn(id){
task = null;
loadTask();
console.log(router);
}
function addChild(){