diff --git a/frontend/src/routes/project/Kanban.svelte b/frontend/src/routes/project/Kanban.svelte index 0ab2208..b3dbe30 100644 --- a/frontend/src/routes/project/Kanban.svelte +++ b/frontend/src/routes/project/Kanban.svelte @@ -19,11 +19,13 @@ let columns = $derived(states?Object.keys(states).length+1:1); let dragged = null; let users = {}; + let ready = $state(false); async function load(){ - loadProject(); - loadStates(); + await loadProject(); + await loadStates(); await loadTasks({project_id:+id,parent_task_id:0}); + ready = true; } async function loadProject(){ @@ -31,6 +33,11 @@ const resp = await fetch(url,{credentials:'include'}); if (resp.ok){ project = await resp.json(); + for (var uid of Object.keys(project.members)){ + let member = project.members[uid]; + users[uid] = member.user.name; + if (!tasks[uid]) tasks[uid] = {}; + } error = null; } else { error = await resp.text(); @@ -68,7 +75,7 @@ var member = task.members[user_id]; if (member.permission.name == 'OWNER') owner = user_id; if (member.permission.name == 'ASSIGNEE') assignee = user_id; - users[user_id] = member.user.name; + } if (!assignee) assignee = owner; task.assignee = assignee; @@ -116,31 +123,6 @@ onMount(load); - - {#if project}

router.navigate(`/project/${project.id}/view`)}>{project.name}

{/if} @@ -148,6 +130,7 @@ {error} {/if} +{#if ready}
{t('user')}
{#if states} @@ -155,10 +138,10 @@
{t('state_'+state.toLowerCase())}
{/each} {/if} - {#each Object.entries(tasks) as [user,stateList]} -
{users[user]}
+ {#each Object.entries(tasks) as [uid,stateList]} +
{users[uid]}
{#each Object.entries(states) as [state,name]} -
hover(ev,user,state)} ondrop={ev => drop(user,state)} > +
hover(ev,uid,state)} ondrop={ev => drop(uid,state)} > {#if stateList[state]} {#each Object.values(stateList[state]).sort((a,b) => a.name.localeCompare(b.name)) as task} router.navigate(`/task/${task.id}/view`)} ondragstart={ev => dragged=task} {task} /> @@ -167,4 +150,5 @@
{/each} {/each} -
\ No newline at end of file +
+{/if} \ No newline at end of file diff --git a/frontend/src/routes/project/KanbanCard.svelte b/frontend/src/routes/project/KanbanCard.svelte index 42eb929..8191f8c 100644 --- a/frontend/src/routes/project/KanbanCard.svelte +++ b/frontend/src/routes/project/KanbanCard.svelte @@ -1,7 +1,21 @@ -
-{task.name} +
+ {task.name} + {#if task.estimated_time} + + ({task.estimated_time} h) + + {/if} + {#if task.due_date} + + {#if task.start_date} + {task.start_date} + {/if} + → {task.due_date} + + {/if} +
\ No newline at end of file diff --git a/web/src/main/resources/web/css/default.css b/web/src/main/resources/web/css/default.css index a58abee..861f5e6 100644 --- a/web/src/main/resources/web/css/default.css +++ b/web/src/main/resources/web/css/default.css @@ -146,22 +146,38 @@ textarea{ .kanban .box, .kanban .head, .kanban .user{ - border-radius: 5px; - margin: 2px; - min-height: 50px; - color: black; - padding: 2px; - } + border-radius: 5px; + margin: 2px; + min-height: 50px; + color: black; + padding: 2px; +} .kanban .box{ - background: orange; - } + background: orange; + position: relative; +} .kanban .head, .kanban .user{ - background: black; - border: 1px solid orange; - color: orange; - text-align: center; - } + background: black; + border: 1px solid orange; + color: orange; + text-align: center; +} .kanban .highlight{ - background: #4b3000; - } \ No newline at end of file + background: #4b3000; +} +.kanban .estimate{ + border: 0 none; + position: absolute; + top: 0; + right: 0; + font-weight: bold; + font-size: 0.6em; +} +.kanban .due_date{ + position: absolute; + font-weight: bold; + font-size: 0.6em; + bottom: 0; + right: 0; +}