Browse Source

implemented interruption of fetch requests if task is clicked in kanban

feature/brute_force_protection
Stephan Richter 2 months ago
parent
commit
0455c76479
  1. 46
      frontend/src/routes/project/Kanban.svelte
  2. 1
      frontend/src/routes/task/View.svelte

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

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

1
frontend/src/routes/task/View.svelte

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

Loading…
Cancel
Save