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;
+}