Browse Source

fine-tuning kanban

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
kanban
Stephan Richter 3 months ago
parent
commit
8b7ad60a38
  1. 3
      core/src/main/java/de/srsoftware/umbrella/core/model/Task.java
  2. 6
      frontend/src/routes/project/Kanban.svelte
  3. 7
      frontend/src/routes/project/KanbanCard.svelte
  4. 25
      web/src/main/resources/web/css/default.css

3
core/src/main/java/de/srsoftware/umbrella/core/model/Task.java

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

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

@ -5,6 +5,8 @@
import { api } from '../../urls.svelte.js'; import { api } from '../../urls.svelte.js';
import { t } from '../../translations.svelte.js'; import { t } from '../../translations.svelte.js';
import Card from './KanbanCard.svelte';
let { id } = $props(); let { id } = $props();
let error = $state(null); let error = $state(null);
@ -146,7 +148,7 @@
<span class="error">{error}</span> <span class="error">{error}</span>
{/if} {/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> <div class="head">{t('user')}</div>
{#if states} {#if states}
{#each Object.entries(states) as [sid,state]} {#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)} > <div class={[state, highlight.user == user && highlight.state == state ? 'highlight':'']} ondragover={ev => hover(ev,user,state)} ondrop={ev => drop(user,state)} >
{#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}
<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} {/each}
{/if} {/if}
</div> </div>

7
frontend/src/routes/project/KanbanCard.svelte

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

25
web/src/main/resources/web/css/default.css

@ -141,4 +141,27 @@ textarea{
color: white; color: white;
background: #333; background: #333;
font-weight: black; 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;
}
Loading…
Cancel
Save