Merge branch 'module/projects' into dev

This commit is contained in:
2025-11-26 08:47:34 +01:00
4 changed files with 37 additions and 6 deletions

View File

@@ -185,6 +185,10 @@
highlight.archive = true; highlight.archive = true;
} }
function is_custom(state){
return [10,20,40,60,100].includes(state);
}
function openTask(task_id){ function openTask(task_id){
window.open(`/task/${task_id}/view`, '_blank').focus(); window.open(`/task/${task_id}/view`, '_blank').focus();
} }
@@ -244,7 +248,7 @@
{#each users as u} {#each users as u}
<div class="user">{u.name}</div> <div class="user">{u.name}</div>
{#each Object.entries(project.allowed_states) as [state,name]} {#each Object.entries(project.allowed_states) as [state,name]}
<div class={['state_'+state, highlight.user == u.id && highlight.state == state ? 'highlight':'']} ondragover={ev => hover(ev,u.id,state)} ondragleave={e => delete highlight.user} ondrop={ev => drop(u.id,state)} > <div class={['state_'+state, is_custom(state) ? '':'state_custom' ,highlight.user == u.id && highlight.state == state ? 'highlight':'']} ondragover={ev => 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} {#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)} {#if !filter || task.name.toLowerCase().includes(filter) || (task.tags && task.tags.filter(tag => tag.toLowerCase().includes(filter)).length)}
<Card onclick={e => openTask(task.id)} ondragstart={ev => dragged=task} {task} tag_colors={project.tag_colors} /> <Card onclick={e => openTask(task.id)} ondragstart={ev => dragged=task} {task} tag_colors={project.tag_colors} />

View File

@@ -186,8 +186,6 @@ tr:hover .taglist .tag button {
border-color: 1px solid; border-color: 1px solid;
} }
.warn { .warn {
background-color: yellow; background-color: yellow;
color: black; color: black;
@@ -201,6 +199,7 @@ tr:hover .taglist .tag button {
.task.p10 .name{ .task.p10 .name{
color: #ffa736; color: #ffa736;
} }
.kanban .state_custom .box.p10,
.kanban .state_20 .box.p10, .kanban .state_20 .box.p10,
.kanban .state_40 .box.p10{ .kanban .state_40 .box.p10{
border: 5px solid #ffa736; border: 5px solid #ffa736;
@@ -209,6 +208,7 @@ tr:hover .taglist .tag button {
.task.p20 .name{ .task.p20 .name{
color: #ff8f00; color: #ff8f00;
} }
.kanban .state_custom .box.p20,
.kanban .state_20 .box.p20, .kanban .state_20 .box.p20,
.kanban .state_40 .box.p20{ .kanban .state_40 .box.p20{
border: 5px solid #ff8f00; border: 5px solid #ff8f00;
@@ -217,6 +217,7 @@ tr:hover .taglist .tag button {
.task.p30 .name{ .task.p30 .name{
color: #ff7b06; color: #ff7b06;
} }
.kanban .state_custom .box.p30,
.kanban .state_20 .box.p30, .kanban .state_20 .box.p30,
.kanban .state_40 .box.p30{ .kanban .state_40 .box.p30{
border: 5px solid #ff7b06; border: 5px solid #ff7b06;
@@ -225,6 +226,7 @@ tr:hover .taglist .tag button {
.task.p40 .name{ .task.p40 .name{
color: #ff6306; color: #ff6306;
} }
.kanban .state_custom .box.p40,
.kanban .state_20 .box.p40, .kanban .state_20 .box.p40,
.kanban .state_40 .box.p40{ .kanban .state_40 .box.p40{
border: 5px solid #ff6306; border: 5px solid #ff6306;
@@ -233,6 +235,7 @@ tr:hover .taglist .tag button {
.task.p50 .name{ .task.p50 .name{
color: #ff4c06; color: #ff4c06;
} }
.kanban .state_custom .box.p50,
.kanban .state_20 .box.p50, .kanban .state_20 .box.p50,
.kanban .state_40 .box.p50{ .kanban .state_40 .box.p50{
border: 5px solid #ff4c06; border: 5px solid #ff4c06;
@@ -241,6 +244,7 @@ tr:hover .taglist .tag button {
.task.p60 .name{ .task.p60 .name{
color: #ff3506; color: #ff3506;
} }
.kanban .state_custom .box.p60,
.kanban .state_20 .box.p60, .kanban .state_20 .box.p60,
.kanban .state_40 .box.p60{ .kanban .state_40 .box.p60{
border: 5px solid #ff3506; border: 5px solid #ff3506;
@@ -249,6 +253,7 @@ tr:hover .taglist .tag button {
.task.p70 .name{ .task.p70 .name{
color: #ff0000; color: #ff0000;
} }
.kanban .state_custom .box.p70,
.kanban .state_20 .box.p70, .kanban .state_20 .box.p70,
.kanban .state_40 .box.p70{ .kanban .state_40 .box.p70{
border: 5px solid #ff0000; border: 5px solid #ff0000;
@@ -257,6 +262,7 @@ tr:hover .taglist .tag button {
.task.p80 .name{ .task.p80 .name{
color: #df153b; color: #df153b;
} }
.kanban .state_custom .box.p80,
.kanban .state_20 .box.p80, .kanban .state_20 .box.p80,
.kanban .state_40 .box.p80{ .kanban .state_40 .box.p80{
border: 5px solid #df153b; border: 5px solid #df153b;
@@ -266,6 +272,7 @@ tr:hover .taglist .tag button {
background-color: #991c34; background-color: #991c34;
color: #ffff00; color: #ffff00;
} }
.kanban .state_custom .box.p90,
.kanban .state_20 .box.p90, .kanban .state_20 .box.p90,
.kanban .state_40 .box.p90{ .kanban .state_40 .box.p90{
border: 5px solid #991c34; border: 5px solid #991c34;
@@ -275,6 +282,7 @@ tr:hover .taglist .tag button {
background-color: #733440; background-color: #733440;
color: #ffff00; color: #ffff00;
} }
.kanban .state_custom .box.p100,
.kanban .state_20 .box.p100, .kanban .state_20 .box.p100,
.kanban .state_40 .box.p100{ .kanban .state_40 .box.p100{
border: 5px solid #733440; border: 5px solid #733440;
@@ -282,4 +290,4 @@ tr:hover .taglist .tag button {
.vcard span.inactive{ .vcard span.inactive{
color: #222200; color: #222200;
} }

View File

@@ -176,7 +176,6 @@ tr:hover .taglist .tag button {
background: black; background: black;
} }
.version a.selected{ .version a.selected{
border-color: orange; border-color: orange;
} }
@@ -194,6 +193,7 @@ tr:hover .taglist .tag button {
.task.p10 .name{ .task.p10 .name{
color: #fff066; color: #fff066;
} }
.kanban .state_custom .box.p10,
.kanban .state_20 .box.p10, .kanban .state_20 .box.p10,
.kanban .state_40 .box.p10{ .kanban .state_40 .box.p10{
border: 5px solid #fff066; border: 5px solid #fff066;
@@ -202,6 +202,7 @@ tr:hover .taglist .tag button {
.task.p20 .name{ .task.p20 .name{
color: #ffe706; color: #ffe706;
} }
.kanban .state_custom .box.p20,
.kanban .state_20 .box.p20, .kanban .state_20 .box.p20,
.kanban .state_40 .box.p20{ .kanban .state_40 .box.p20{
border: 5px solid #ffe706; border: 5px solid #ffe706;
@@ -210,6 +211,7 @@ tr:hover .taglist .tag button {
.task.p30 .name{ .task.p30 .name{
color: #ffa906; color: #ffa906;
} }
.kanban .state_custom .box.p30,
.kanban .state_20 .box.p30, .kanban .state_20 .box.p30,
.kanban .state_40 .box.p30{ .kanban .state_40 .box.p30{
border: 5px solid #ffa906; border: 5px solid #ffa906;
@@ -218,6 +220,7 @@ tr:hover .taglist .tag button {
.task.p40 .name{ .task.p40 .name{
color: #ff8606; color: #ff8606;
} }
.kanban .state_custom .box.p40,
.kanban .state_20 .box.p40, .kanban .state_20 .box.p40,
.kanban .state_40 .box.p40{ .kanban .state_40 .box.p40{
border: 5px solid #ff8606; border: 5px solid #ff8606;
@@ -226,6 +229,7 @@ tr:hover .taglist .tag button {
.task.p50 .name{ .task.p50 .name{
color: #ff4c06; color: #ff4c06;
} }
.kanban .state_custom .box.p50,
.kanban .state_20 .box.p50, .kanban .state_20 .box.p50,
.kanban .state_40 .box.p50{ .kanban .state_40 .box.p50{
border: 5px solid #ff4c06; border: 5px solid #ff4c06;
@@ -234,6 +238,7 @@ tr:hover .taglist .tag button {
.task.p60 .name{ .task.p60 .name{
color: #ff3506; color: #ff3506;
} }
.kanban .state_custom .box.p60,
.kanban .state_20 .box.p60, .kanban .state_20 .box.p60,
.kanban .state_40 .box.p60{ .kanban .state_40 .box.p60{
border: 5px solid #ff3506; border: 5px solid #ff3506;
@@ -242,6 +247,7 @@ tr:hover .taglist .tag button {
.task.p70 .name{ .task.p70 .name{
color: #ff0000; color: #ff0000;
} }
.kanban .state_custom .box.p70,
.kanban .state_20 .box.p70, .kanban .state_20 .box.p70,
.kanban .state_40 .box.p70{ .kanban .state_40 .box.p70{
border: 5px solid #ff0000; border: 5px solid #ff0000;
@@ -250,6 +256,7 @@ tr:hover .taglist .tag button {
.task.p80 .name{ .task.p80 .name{
color: #df153b; color: #df153b;
} }
.kanban .state_custom .box.p80,
.kanban .state_20 .box.p80, .kanban .state_20 .box.p80,
.kanban .state_40 .box.p80{ .kanban .state_40 .box.p80{
border: 5px solid #df153b; border: 5px solid #df153b;
@@ -259,6 +266,7 @@ tr:hover .taglist .tag button {
background-color: #991c34; background-color: #991c34;
color: #ffff00; color: #ffff00;
} }
.kanban .state_custom .box.p90,
.kanban .state_20 .box.p90, .kanban .state_20 .box.p90,
.kanban .state_40 .box.p90{ .kanban .state_40 .box.p90{
border: 5px solid #991c34; border: 5px solid #991c34;
@@ -268,6 +276,7 @@ tr:hover .taglist .tag button {
background-color: #733440; background-color: #733440;
color: #ffff00; color: #ffff00;
} }
.kanban .state_custom .box.p100,
.kanban .state_20 .box.p100, .kanban .state_20 .box.p100,
.kanban .state_40 .box.p100{ .kanban .state_40 .box.p100{
border: 5px solid #733440; border: 5px solid #733440;

View File

@@ -179,6 +179,7 @@ tr:hover .taglist .tag button {
.task.p10 .name{ .task.p10 .name{
color: #c9fbb2; color: #c9fbb2;
} }
.kanban .state_custom .box.p10,
.kanban .state_20 .box.p10, .kanban .state_20 .box.p10,
.kanban .state_40 .box.p10{ .kanban .state_40 .box.p10{
border: 5px solid #c9fbb2; border: 5px solid #c9fbb2;
@@ -187,6 +188,7 @@ tr:hover .taglist .tag button {
.task.p20 .name{ .task.p20 .name{
color: #cbff57; color: #cbff57;
} }
.kanban .state_custom .box.p20,
.kanban .state_20 .box.p20, .kanban .state_20 .box.p20,
.kanban .state_40 .box.p20{ .kanban .state_40 .box.p20{
border: 5px solid #cbff57; border: 5px solid #cbff57;
@@ -195,6 +197,7 @@ tr:hover .taglist .tag button {
.task.p30 .name{ .task.p30 .name{
color: #dfff44; color: #dfff44;
} }
.kanban .state_custom .box.p30,
.kanban .state_20 .box.p30, .kanban .state_20 .box.p30,
.kanban .state_40 .box.p30{ .kanban .state_40 .box.p30{
border: 5px solid #dfff44; border: 5px solid #dfff44;
@@ -203,6 +206,7 @@ tr:hover .taglist .tag button {
.task.p40 .name{ .task.p40 .name{
color: #f8ff29; color: #f8ff29;
} }
.kanban .state_custom .box.p40,
.kanban .state_20 .box.p40, .kanban .state_20 .box.p40,
.kanban .state_40 .box.p40{ .kanban .state_40 .box.p40{
border: 5px solid #f8ff29; border: 5px solid #f8ff29;
@@ -211,6 +215,7 @@ tr:hover .taglist .tag button {
.task.p50 .name{ .task.p50 .name{
color: #ffdb1b; color: #ffdb1b;
} }
.kanban .state_custom .box.p50,
.kanban .state_20 .box.p50, .kanban .state_20 .box.p50,
.kanban .state_40 .box.p50{ .kanban .state_40 .box.p50{
border: 5px solid #ffdb1b; border: 5px solid #ffdb1b;
@@ -219,6 +224,7 @@ tr:hover .taglist .tag button {
.task.p60 .name{ .task.p60 .name{
color: #ff9309; color: #ff9309;
} }
.kanban .state_custom .box.p60,
.kanban .state_20 .box.p60, .kanban .state_20 .box.p60,
.kanban .state_40 .box.p60{ .kanban .state_40 .box.p60{
border: 5px solid #ff9309; border: 5px solid #ff9309;
@@ -227,6 +233,7 @@ tr:hover .taglist .tag button {
.task.p70 .name{ .task.p70 .name{
color: #ff6c00; color: #ff6c00;
} }
.kanban .state_custom .box.p70,
.kanban .state_20 .box.p70, .kanban .state_20 .box.p70,
.kanban .state_40 .box.p70{ .kanban .state_40 .box.p70{
border: 5px solid #ff6c00; border: 5px solid #ff6c00;
@@ -235,6 +242,7 @@ tr:hover .taglist .tag button {
.task.p80 .name{ .task.p80 .name{
color: #ff3c00; color: #ff3c00;
} }
.kanban .state_custom .box.p80,
.kanban .state_20 .box.p80, .kanban .state_20 .box.p80,
.kanban .state_40 .box.p80{ .kanban .state_40 .box.p80{
border: 5px solid #ff3c00; border: 5px solid #ff3c00;
@@ -243,6 +251,7 @@ tr:hover .taglist .tag button {
.task.p90 .name{ .task.p90 .name{
color: #ff0000; color: #ff0000;
} }
.kanban .state_custom .box.p90,
.kanban .state_20 .box.p90, .kanban .state_20 .box.p90,
.kanban .state_40 .box.p90{ .kanban .state_40 .box.p90{
border: 5px solid #ff0000; border: 5px solid #ff0000;
@@ -251,6 +260,7 @@ tr:hover .taglist .tag button {
.task.p100 .name{ .task.p100 .name{
color: #ff0048; color: #ff0048;
} }
.kanban .state_custom .box.p100,
.kanban .state_20 .box.p100, .kanban .state_20 .box.p100,
.kanban .state_40 .box.p100{ .kanban .state_40 .box.p100{
border: 5px solid #ff0048; border: 5px solid #ff0048;
@@ -258,4 +268,4 @@ tr:hover .taglist .tag button {
.vcard span.inactive{ .vcard span.inactive{
color: #bbb; color: #bbb;
} }