Browse Source

Merge branch 'main' into module/contact

module/contact
Stephan Richter 4 weeks ago
parent
commit
876515497f
  1. 34
      frontend/src/routes/project/Kanban.svelte
  2. 5
      frontend/src/routes/project/KanbanCard.svelte
  3. 2
      frontend/src/routes/tags/Reference.svelte
  4. 1
      translations/src/main/resources/de.json
  5. 1
      translations/src/main/resources/en.json
  6. 10
      web/src/main/resources/web/css/bloodshed-color.css
  7. 46
      web/src/main/resources/web/css/bloodshed.css
  8. 9
      web/src/main/resources/web/css/default-color.css
  9. 49
      web/src/main/resources/web/css/default.css
  10. 9
      web/src/main/resources/web/css/winter-color.css
  11. 46
      web/src/main/resources/web/css/winter.css

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

@ -9,8 +9,10 @@ @@ -9,8 +9,10 @@
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 @@ @@ -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 @@ @@ -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 @@ @@ -190,6 +215,10 @@
{/if}
{#if project}
<fieldset class="kanban description {descr?'active':''}" onclick={e => descr = !descr}>
<legend>{t('description')}{t('expand_on_click')}</legend>
{@html project.description.rendered}
</fieldset>
<div class="kanban" style="display: grid; grid-template-columns: {`repeat(${columns}, auto)`}">
<span class="filter">
<input type="text" bind:value={filter_input} autofocus />
@ -207,7 +236,7 @@ @@ -207,7 +236,7 @@
{#each Object.entries(tasks) as [uid,stateList]}
<div class="user">{users[uid]}</div>
{#each Object.entries(project.allowed_states) as [state,name]}
<div class={['state_'+state, highlight.user == uid && highlight.state == state ? 'highlight':'']} ondragover={ev => hover(ev,uid,state)} ondrop={ev => drop(uid,state)} >
<div class={['state_'+state, highlight.user == uid && highlight.state == state ? 'highlight':'']} ondragover={ev => 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 @@ @@ -222,4 +251,7 @@
{/each}
{/each}
</div>
<div class="archive {highlight.archive?'hover':''}" ondragover={hover_archive} ondragleave={e => delete highlight.archive} ondrop={do_archive} >
{t('archive')}
</div>
{/if}

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

@ -16,7 +16,10 @@ @@ -16,7 +16,10 @@
<div
draggable="true"
class={`box prio_${task.total_prio} p${Math.floor(task.total_prio/10)*10} p${task.total_prio % 10}`}
{onclick} {ondragstart} style={style}>
{onclick} {ondragstart}
style={style}
title={task.description.source}
>
<span class="title">{task.name}</span>
{#if task.estimated_time}
<span class="estimate">

2
frontend/src/routes/tags/Reference.svelte

@ -36,7 +36,7 @@ @@ -36,7 +36,7 @@
{#if module=='bookmark'}
{@html target(object.comment.rendered).replace(/<p>(.*?)<\/p>/, '$1')} <!-- this is a workaround for in-proper formatting of paragraphs within list items in firefox -->
<p>
<a href={object.url}>{object.url}</a>
<a href={object.url} target="_blank">{object.url}</a>
</p>
<hr/>
{:else if module=='task' || module=='project'}

1
translations/src/main/resources/de.json

@ -81,6 +81,7 @@ @@ -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",

1
translations/src/main/resources/en.json

@ -81,6 +81,7 @@ @@ -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",

10
web/src/main/resources/web/css/bloodshed-color.css

@ -42,6 +42,16 @@ textarea{ @@ -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;

46
web/src/main/resources/web/css/bloodshed.css

@ -36,6 +36,15 @@ button{ @@ -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 { @@ -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 { @@ -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{ @@ -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{ @@ -362,7 +384,7 @@ a.wikilink{
}
.grid2 > :nth-child(2n-1){
text-align: initial ;
text-align: initial;
padding-top: 8px;
}
}

9
web/src/main/resources/web/css/default-color.css

@ -45,6 +45,15 @@ textarea{ @@ -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);
}

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

@ -36,6 +36,15 @@ button{ @@ -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 { @@ -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 { @@ -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{ @@ -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{ @@ -254,6 +276,10 @@ nav > form{
display:inline;
}
li > a > p:nth-child(1){
display: inline;
}
.timetracks .duration{
font-weight: bold;
}
@ -362,4 +388,3 @@ a.wikilink{ @@ -362,4 +388,3 @@ a.wikilink{
padding-top: 8px;
}
}

9
web/src/main/resources/web/css/winter-color.css

@ -41,6 +41,15 @@ textarea{ @@ -41,6 +41,15 @@ textarea{
background-color: lightcyan;;
}
.archive{
background: white;
}
.archive.hover{
background: lightblue;
color: black;
}
.error {
background-color: red;
color: black;

46
web/src/main/resources/web/css/winter.css

@ -36,6 +36,15 @@ button{ @@ -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 { @@ -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 { @@ -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{ @@ -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{ @@ -362,7 +384,7 @@ a.wikilink{
}
.grid2 > :nth-child(2n-1){
text-align: initial ;
text-align: initial;
padding-top: 8px;
}
}
Loading…
Cancel
Save