fine-tuning kanban

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
2025-07-27 13:27:02 +02:00
parent 770f2aab5b
commit 8b7ad60a38
4 changed files with 37 additions and 4 deletions

View File

@@ -152,14 +152,15 @@ public class Task implements Mappable {
case DESCRIPTION: description = json.getString(key); break;
case DUE_DATE: dueDate = json.isNull(DUE_DATE) || json.getString(DUE_DATE).isBlank() ? null : LocalDate.parse(json.getString(DUE_DATE)); break;
case ESTIMATED_TIME: estimatedTime = json.isNull(ESTIMATED_TIME) ? null : json.getDouble(ESTIMATED_TIME); break;
case MEMBERS: continue;
case NAME: name = json.getString(key); break;
case NO_INDEX: noIndex = json.getBoolean(NO_INDEX); break;
case SHOW_CLOSED: showClosed = json.getBoolean(SHOW_CLOSED); break;
case START_DATE: start = json.isNull(START_DATE) || json.getString(START_DATE).isBlank() ? null : LocalDate.parse(json.getString(START_DATE)); break;
case STATUS: status = json.get(key) instanceof Number number ? Status.of(number.intValue()) : Status.valueOf(json.getString(key)); break;
default: {
key = null;
LOG.log(WARNING,"Tried to patch field ''{0}'' of task, which is not implemented!",key);
key = null;
}
}
if (key != null) dirtyFields.add(key);

View File

@@ -5,6 +5,8 @@
import { api } from '../../urls.svelte.js';
import { t } from '../../translations.svelte.js';
import Card from './KanbanCard.svelte';
let { id } = $props();
let error = $state(null);
@@ -146,7 +148,7 @@
<span class="error">{error}</span>
{/if}
<div class="grid" style="display: grid; grid-template-columns: {`repeat(${columns}, auto)`}">
<div class="kanban" style="display: grid; grid-template-columns: {`repeat(${columns}, auto)`}">
<div class="head">{t('user')}</div>
{#if states}
{#each Object.entries(states) as [sid,state]}
@@ -159,7 +161,7 @@
<div class={[state, highlight.user == user && highlight.state == state ? 'highlight':'']} ondragover={ev => hover(ev,user,state)} ondrop={ev => drop(user,state)} >
{#if stateList[state]}
{#each Object.values(stateList[state]).sort((a,b) => a.name.localeCompare(b.name)) as task}
<div draggable="true" class="box" onclick={() => router.navigate(`/task/${task.id}/view`)} ondragstart={ev => dragged=task} >{task.name}</div>
<Card onclick={() => router.navigate(`/task/${task.id}/view`)} ondragstart={ev => dragged=task} {task} />
{/each}
{/if}
</div>

View File

@@ -0,0 +1,7 @@
<script>
let { ondragstart, task } = $props();
</script>
<div draggable="true" class="box" {ondragstart} >
{task.name}
</div>

View File

@@ -141,4 +141,27 @@ textarea{
color: white;
background: #333;
font-weight: black;
}
}
.kanban .box,
.kanban .head,
.kanban .user{
border-radius: 5px;
margin: 2px;
min-height: 50px;
color: black;
padding: 2px;
}
.kanban .box{
background: orange;
}
.kanban .head,
.kanban .user{
background: black;
border: 1px solid orange;
color: orange;
text-align: center;
}
.kanban .highlight{
background: #4b3000;
}