Browse Source

improvement: inheriting tags from project and parent tasks

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
module/notes
Stephan Richter 3 months ago
parent
commit
4e9f15c6a3
  1. 29
      frontend/src/routes/task/Add.svelte
  2. 8
      task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java
  3. 2
      web/src/main/resources/web/css/default.css

29
frontend/src/routes/task/Add.svelte

@ -8,6 +8,7 @@
import MarkdownEditor from '../../Components/MarkdownEditor.svelte'; import MarkdownEditor from '../../Components/MarkdownEditor.svelte';
import MemberEditor from '../../Components/MemberEditor.svelte'; import MemberEditor from '../../Components/MemberEditor.svelte';
import Tags from '../tags/TagList.svelte';
let { project_id = null, parent_task_id } = $props(); let { project_id = null, parent_task_id } = $props();
let error = $state(null); let error = $state(null);
@ -17,12 +18,13 @@
let task = $state({ let task = $state({
name : '', name : '',
description : { source : '', rendered : '' }, description : { source : '', rendered : '' },
members : {},
estimated_time: null,
start_date: null,
due_date: null, due_date: null,
estimated_time: null,
no_index: false,
members : {},
show_closed: false, show_closed: false,
no_index: false start_date: null,
tags: []
}); });
let router = useTinyRouter(); let router = useTinyRouter();
@ -38,6 +40,7 @@
async function load(){ async function load(){
if (parent_task_id) await loadParent(); if (parent_task_id) await loadParent();
if (project_id) loadProject(); if (project_id) loadProject();
loadTags();
} }
async function loadParent(){ async function loadParent(){
@ -68,6 +71,16 @@
} }
} }
async function loadTags(){
let url = null;
if (project_id) url = api(`tags/project/${project_id}`);
if (parent_task_id) url = api(`tags/task/${parent_task_id}`);
if (url) {
const resp = await fetch(url,{credentials:'include'});
if (resp.ok) task.tags = await resp.json();
}
}
async function getCandidates(text){ async function getCandidates(text){
const origin = parent_task ? parent_task.members : project.members; const origin = parent_task ? parent_task.members : project.members;
const candidates = Object.values(origin) const candidates = Object.values(origin)
@ -154,6 +167,14 @@
<MarkdownEditor bind:value={task.description} simple={true} /> <MarkdownEditor bind:value={task.description} simple={true} />
</td> </td>
</tr> </tr>
<tr>
<th>
{t('tags')}
</th>
<td>
<Tags module="task" bind:tags={task.tags} />
</td>
</tr>
{#if extendedSettings} {#if extendedSettings}
<tr> <tr>
<th> <th>

8
task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java

@ -29,6 +29,8 @@ import de.srsoftware.umbrella.core.model.Token;
import de.srsoftware.umbrella.core.model.UmbrellaUser; import de.srsoftware.umbrella.core.model.UmbrellaUser;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.*;
import org.json.JSONArray;
import org.json.JSONObject; import org.json.JSONObject;
public class TaskModule extends BaseHandler implements TaskService { public class TaskModule extends BaseHandler implements TaskService {
@ -312,9 +314,9 @@ public class TaskModule extends BaseHandler implements TaskService {
var permission = nested.has(CODE) ? Permission.of(nested.getInt(CODE)) : Permission.valueOf(nested.getString(NAME)); var permission = nested.has(CODE) ? Permission.of(nested.getInt(CODE)) : Permission.valueOf(nested.getString(NAME));
taskDb.setMember(task.id(),userId,permission); taskDb.setMember(task.id(),userId,permission);
} }
if (isSet(task.parentTaskId())){ if (json.has(TAGS) && json.get(TAGS) instanceof JSONArray arr){
var tagList = tags.getTags(TASK,task.parentTaskId(),user); var tagList = arr.toList().stream().filter(e -> e instanceof String).map(String.class::cast).toList();
tags.save(TASK,task.id(),memberIds,tagList); tags.save(TASK,task.id(),null,tagList);
} }
return sendContent(ex,loadMembers(task)); return sendContent(ex,loadMembers(task));
} }

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

@ -10,7 +10,7 @@ body {
font-family: sans; font-family: sans;
background: black; background: black;
color: orange; color: orange;
margin: 0; margin: 0 0 40px 0;
} }
fieldset { fieldset {

Loading…
Cancel
Save