From ef3e2285275bb854dad7c8d92f08aa689051ae9d Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Mon, 13 Jul 2026 12:32:51 +0200 Subject: [PATCH 1/3] fixed typo Signed-off-by: Stephan Richter --- translations/src/main/resources/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translations/src/main/resources/en.json b/translations/src/main/resources/en.json index 688e3d88..fa4828a3 100644 --- a/translations/src/main/resources/en.json +++ b/translations/src/main/resources/en.json @@ -329,7 +329,7 @@ "saved": "saved", "save_object": "save {object}", "search": "search", - "searching…": "searhcing…", + "searching…": "searching…", "select a new parent for {entity}": "select a new parent for '{entity}'", "select_company" : "select on of you companies:", "select_customer": "select customer", From a752cd0ae8ef1ec17652b2f3336423f9cedbb254 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Wed, 15 Jul 2026 18:23:41 +0200 Subject: [PATCH 2/3] improving css Signed-off-by: Stephan Richter --- web/src/main/resources/web/css/bloodshed.css | 4 ++++ web/src/main/resources/web/css/default.css | 4 ++++ web/src/main/resources/web/css/winter.css | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/web/src/main/resources/web/css/bloodshed.css b/web/src/main/resources/web/css/bloodshed.css index ef977dcd..ecdb96ef 100644 --- a/web/src/main/resources/web/css/bloodshed.css +++ b/web/src/main/resources/web/css/bloodshed.css @@ -356,6 +356,10 @@ span.timetracking { grid-column-end: span 2; } +.markdown svg{ + display: block; +} + .editable:hover{ border: 1px dotted; } diff --git a/web/src/main/resources/web/css/default.css b/web/src/main/resources/web/css/default.css index d4b7e86d..8086f099 100644 --- a/web/src/main/resources/web/css/default.css +++ b/web/src/main/resources/web/css/default.css @@ -450,6 +450,10 @@ span.timetracking { grid-column-end: span 2; } +.markdown svg{ + display: block; +} + .editable:hover{ border: 1px dotted; } diff --git a/web/src/main/resources/web/css/winter.css b/web/src/main/resources/web/css/winter.css index a8b8d7b5..6ecba7df 100644 --- a/web/src/main/resources/web/css/winter.css +++ b/web/src/main/resources/web/css/winter.css @@ -449,6 +449,10 @@ span.timetracking { grid-column-end: span 2; } +.markdown svg{ + display: block; +} + .editable:hover{ border: 1px dotted; } From 8d93dbfc112f130b4c71a518b384fc3e72ceebe9 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Sun, 19 Jul 2026 23:47:53 +0200 Subject: [PATCH 3/3] implemented timetracking as kanban drag target Signed-off-by: Stephan Richter --- frontend/src/Components/TimeRecorder.svelte | 40 ++++++++++++++++++--- frontend/src/routes/project/Kanban.svelte | 7 +++- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/frontend/src/Components/TimeRecorder.svelte b/frontend/src/Components/TimeRecorder.svelte index b39bfd35..fc049d0b 100644 --- a/frontend/src/Components/TimeRecorder.svelte +++ b/frontend/src/Components/TimeRecorder.svelte @@ -4,12 +4,47 @@ import { api } from '../urls.svelte'; import { t } from '../translations.svelte'; + import { error, yikes } from '../warn.svelte'; import { msToTime, now } from '../time.svelte'; import { timetrack } from '../user.svelte'; let interval = null; const router = useTinyRouter(); + async function addTime(task_id){ + const url = api(`time/track_task/${task_id}`); + const resp = await fetch(url,{ + credentials : 'include', + method : 'POST', + body : now() + }); // create new time or return time with assigned tasks + if (resp.ok) { + const track = await resp.json(); + timetrack.running = track; + yikes(); + } else { + error(resp); + } + } + + + function go(){ + router.navigate('/time'); + } + + function ondragover(ev){ + ev.preventDefault(); + } + + function ondragleave(ev){ + ev.preventDefault(); + } + + function ondrop(ev){ + let task_id = ev.dataTransfer.getData('task'); + if (task_id) addTime(task_id); + } + async function stopTrack(){ if (timetrack.running.id){ const url = api(`time/${timetrack.running.id}/stop`); @@ -28,9 +63,6 @@ } } - function go(){ - router.navigate('/time'); - } function updateElapsed(){ timetrack.elapsed = msToTime(Date.now() - timetrack.start); @@ -54,7 +86,7 @@ {#if timetrack.running} - + {timetrack.running.subject} {#if timetrack.elapsed}({timetrack.elapsed}){/if} diff --git a/frontend/src/routes/project/Kanban.svelte b/frontend/src/routes/project/Kanban.svelte index 07341024..9b37d048 100644 --- a/frontend/src/routes/project/Kanban.svelte +++ b/frontend/src/routes/project/Kanban.svelte @@ -207,6 +207,11 @@ return false; } + function ondragstart(ev, task){ + dragged = task; + ev.dataTransfer.setData("task",task.id); + } + function openTask(task_id){ window.open(`/task/${task_id}/view`, '_blank').focus(); } @@ -306,7 +311,7 @@
hover(ev,u.id,state)} ondragleave={e => delete highlight.user} ondrop={ev => drop(u.id,state)} > {#each Object.values(tasks[u.id][state]).sort(byName) as task} {#if !filter || task.name.toLowerCase().includes(filter) || (task.tags && task.tags.filter(tag => tag.toLowerCase().includes(filter)).length)} - openTask(task.id)} ondragstart={ev => dragged=task} {task} tag_colors={project.tag_colors} /> + openTask(task.id)} ondragstart={ev => ondragstart(ev,task)} {task} tag_colors={project.tag_colors} /> {/if} {/each}
show_task_form(project.id,u.id,+state)}>