diff --git a/frontend/src/routes/project/Kanban.svelte b/frontend/src/routes/project/Kanban.svelte index b124e7b..f32007f 100644 --- a/frontend/src/routes/project/Kanban.svelte +++ b/frontend/src/routes/project/Kanban.svelte @@ -7,10 +7,12 @@ import { t } from '../../translations.svelte.js'; import { user } from '../../user.svelte.js'; - import Card from './KanbanCard.svelte'; - import LineEditor from '../../Components/LineEditor.svelte'; + import Card from './KanbanCard.svelte'; + import LineEditor from '../../Components/LineEditor.svelte'; + import MarkdownEditor from '../../Components/MarkdownEditor.svelte'; let { id } = $props(); + let descr = $state(false); let filter_input = $state(''); let router = useTinyRouter(); if (router.hasQueryParam('filter')) filter_input = router.getQueryParam('filter'); @@ -25,6 +27,24 @@ $effect(() => updateUrl(filter_input)); + async function do_archive(ex){ + ex.preventDefault(); + var task = dragged; + const url = api(`task/${task.id}`); + const resp = await fetch(url,{ + credentials : 'include', + method : 'PATCH', + body : JSON.stringify({no_index:true}) + }); + delete highlight.archive; + if (resp.ok){ + yikes(); + delete tasks[task.assignee][task.status][task.id] + } else { + error(resp); + } + } + function updateUrl(){ let url = window.location.origin + window.location.pathname; if (filter_input) url += '?filter=' + encodeURI(filter_input); @@ -149,6 +169,11 @@ highlight = {user:user_id,state:state}; } + function hover_archive(ev){ + ev.preventDefault(); + highlight.archive = true; + } + function openTask(task_id){ controller.abort(); router.navigate(`/task/${task_id}/view`) @@ -190,6 +215,10 @@ {/if} {#if project} +
descr = !descr}> + {t('description')} – {t('expand_on_click')} + {@html project.description.rendered} +
@@ -207,7 +236,7 @@ {#each Object.entries(tasks) as [uid,stateList]}
{users[uid]}
{#each Object.entries(project.allowed_states) as [state,name]} -
hover(ev,uid,state)} ondrop={ev => drop(uid,state)} > +
hover(ev,uid,state)} ondragleave={e => delete highlight.user} ondrop={ev => drop(uid,state)} > {#if stateList[state]} {#each Object.values(stateList[state]).sort((a,b) => a.name.localeCompare(b.name)) as task} {#if !filter || task.name.toLowerCase().includes(filter) || (task.tags && task.tags.filter(tag => tag.toLowerCase().includes(filter)).length)} @@ -222,4 +251,7 @@ {/each} {/each}
-{/if} \ No newline at end of file +
delete highlight.archive} ondrop={do_archive} > +{t('archive')} +
+{/if} diff --git a/frontend/src/routes/project/KanbanCard.svelte b/frontend/src/routes/project/KanbanCard.svelte index f11988c..251a1f7 100644 --- a/frontend/src/routes/project/KanbanCard.svelte +++ b/frontend/src/routes/project/KanbanCard.svelte @@ -16,7 +16,10 @@
+ {onclick} {ondragstart} + style={style} + title={task.description.source} +> {task.name} {#if task.estimated_time} diff --git a/frontend/src/routes/tags/Reference.svelte b/frontend/src/routes/tags/Reference.svelte index dc831b4..7cc78e2 100644 --- a/frontend/src/routes/tags/Reference.svelte +++ b/frontend/src/routes/tags/Reference.svelte @@ -36,7 +36,7 @@ {#if module=='bookmark'} {@html target(object.comment.rendered).replace(/

(.*?)<\/p>/, '$1')}

-{object.url} +{object.url}


{:else if module=='task' || module=='project'} diff --git a/translations/src/main/resources/de.json b/translations/src/main/resources/de.json index 5679d6d..825ee12 100644 --- a/translations/src/main/resources/de.json +++ b/translations/src/main/resources/de.json @@ -81,6 +81,7 @@ "end": "Ende", "estimated_time": "geschätzte Zeit", "estimated_times": "geschätzte Zeiten", + "expand_on_click": "Anklicken zum Anzeigen", "extended_settings": "erweiterte Einstellungen", "failed": "fehlgeschlagen", diff --git a/translations/src/main/resources/en.json b/translations/src/main/resources/en.json index 9feb1ee..83afe40 100644 --- a/translations/src/main/resources/en.json +++ b/translations/src/main/resources/en.json @@ -81,6 +81,7 @@ "end": "end", "estimated_time": "estimated duration", "estimated_times": "estimated durations", + "expand_on_click": "click to expand", "extended_settings": "extended settings", "failed": "failed", diff --git a/web/src/main/resources/web/css/bloodshed-color.css b/web/src/main/resources/web/css/bloodshed-color.css index 5304e19..037b75e 100644 --- a/web/src/main/resources/web/css/bloodshed-color.css +++ b/web/src/main/resources/web/css/bloodshed-color.css @@ -42,6 +42,16 @@ textarea{ background-color: black; } +.archive{ + background: red; + color: black; +} + +.archive.hover{ + background: orange; + color: black; +} + .error { background-color: red; color: black; diff --git a/web/src/main/resources/web/css/bloodshed.css b/web/src/main/resources/web/css/bloodshed.css index 27f0690..ddab8ce 100644 --- a/web/src/main/resources/web/css/bloodshed.css +++ b/web/src/main/resources/web/css/bloodshed.css @@ -36,6 +36,15 @@ button{ border-style: solid; } +fieldset[tabindex="0"]{ + max-height: 55px; + overflow: hidden; +} + +fieldset[tabindex="0"]:focus-within{ + max-height: unset; +} + footer { position: fixed; bottom: 0; @@ -53,6 +62,21 @@ nav { border-bottom: 1px solid; } +td, tr{ + vertical-align: baseline; +} + +.archive { + position: fixed; + top: 10px; + right: 10px; + padding: 7px 30px; + z-index: 100; + border-radius: 5px; + text-align: center; + border: 1px solid; +} + .error { padding: 5px; border-radius: 6px; @@ -63,17 +87,6 @@ nav { border-radius: 6px; } -fieldset[tabindex="0"]{ - max-height: 55px; - overflow: hidden; -} - -fieldset[tabindex="0"]:focus-within{ - max-height: unset; -} -td, tr{ - vertical-align: baseline; -} .customer, .sender, .invoice_meta{ @@ -193,6 +206,15 @@ textarea{ right: 20px; } +.kanban.description{ + max-height: 50px; + overflow: hidden; +} + +.kanban.description.active{ + max-height: unset; +} + .project th, .task th{ text-align: right; @@ -362,7 +384,7 @@ a.wikilink{ } .grid2 > :nth-child(2n-1){ - text-align: initial ; + text-align: initial; padding-top: 8px; } } \ No newline at end of file diff --git a/web/src/main/resources/web/css/default-color.css b/web/src/main/resources/web/css/default-color.css index fa55397..5f34fbc 100644 --- a/web/src/main/resources/web/css/default-color.css +++ b/web/src/main/resources/web/css/default-color.css @@ -45,6 +45,15 @@ textarea{ background-color: #333; } +.archive{ + background: black; +} + +.archive.hover{ + background: orange; + color: black; +} + .em { background: rgba(255, 215, 0, 0.09); } diff --git a/web/src/main/resources/web/css/default.css b/web/src/main/resources/web/css/default.css index 29840e6..ddab8ce 100644 --- a/web/src/main/resources/web/css/default.css +++ b/web/src/main/resources/web/css/default.css @@ -36,6 +36,15 @@ button{ border-style: solid; } +fieldset[tabindex="0"]{ + max-height: 55px; + overflow: hidden; +} + +fieldset[tabindex="0"]:focus-within{ + max-height: unset; +} + footer { position: fixed; bottom: 0; @@ -53,6 +62,21 @@ nav { border-bottom: 1px solid; } +td, tr{ + vertical-align: baseline; +} + +.archive { + position: fixed; + top: 10px; + right: 10px; + padding: 7px 30px; + z-index: 100; + border-radius: 5px; + text-align: center; + border: 1px solid; +} + .error { padding: 5px; border-radius: 6px; @@ -63,17 +87,6 @@ nav { border-radius: 6px; } -fieldset[tabindex="0"]{ - max-height: 55px; - overflow: hidden; -} - -fieldset[tabindex="0"]:focus-within{ - max-height: unset; -} -td, tr{ - vertical-align: baseline; -} .customer, .sender, .invoice_meta{ @@ -193,6 +206,15 @@ textarea{ right: 20px; } +.kanban.description{ + max-height: 50px; + overflow: hidden; +} + +.kanban.description.active{ + max-height: unset; +} + .project th, .task th{ text-align: right; @@ -254,6 +276,10 @@ nav > form{ display:inline; } +li > a > p:nth-child(1){ + display: inline; +} + .timetracks .duration{ font-weight: bold; } @@ -361,5 +387,4 @@ a.wikilink{ text-align: initial; padding-top: 8px; } -} - +} \ No newline at end of file diff --git a/web/src/main/resources/web/css/winter-color.css b/web/src/main/resources/web/css/winter-color.css index 33b4f99..ea62157 100644 --- a/web/src/main/resources/web/css/winter-color.css +++ b/web/src/main/resources/web/css/winter-color.css @@ -41,6 +41,15 @@ textarea{ background-color: lightcyan;; } +.archive{ + background: white; +} + +.archive.hover{ + background: lightblue; + color: black; +} + .error { background-color: red; color: black; diff --git a/web/src/main/resources/web/css/winter.css b/web/src/main/resources/web/css/winter.css index 27f0690..ddab8ce 100644 --- a/web/src/main/resources/web/css/winter.css +++ b/web/src/main/resources/web/css/winter.css @@ -36,6 +36,15 @@ button{ border-style: solid; } +fieldset[tabindex="0"]{ + max-height: 55px; + overflow: hidden; +} + +fieldset[tabindex="0"]:focus-within{ + max-height: unset; +} + footer { position: fixed; bottom: 0; @@ -53,6 +62,21 @@ nav { border-bottom: 1px solid; } +td, tr{ + vertical-align: baseline; +} + +.archive { + position: fixed; + top: 10px; + right: 10px; + padding: 7px 30px; + z-index: 100; + border-radius: 5px; + text-align: center; + border: 1px solid; +} + .error { padding: 5px; border-radius: 6px; @@ -63,17 +87,6 @@ nav { border-radius: 6px; } -fieldset[tabindex="0"]{ - max-height: 55px; - overflow: hidden; -} - -fieldset[tabindex="0"]:focus-within{ - max-height: unset; -} -td, tr{ - vertical-align: baseline; -} .customer, .sender, .invoice_meta{ @@ -193,6 +206,15 @@ textarea{ right: 20px; } +.kanban.description{ + max-height: 50px; + overflow: hidden; +} + +.kanban.description.active{ + max-height: unset; +} + .project th, .task th{ text-align: right; @@ -362,7 +384,7 @@ a.wikilink{ } .grid2 > :nth-child(2n-1){ - text-align: initial ; + text-align: initial; padding-top: 8px; } } \ No newline at end of file