Browse Source

preparing to save ne task

kanban
Stephan Richter 3 months ago
parent
commit
9cbcfb3b7f
  1. 2
      core/src/main/java/de/srsoftware/umbrella/core/api/ProjectService.java
  2. 32
      frontend/src/routes/task/Add.svelte
  3. 5
      project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java
  4. 17
      task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java
  5. 1
      translations/src/main/resources/de.json

2
core/src/main/java/de/srsoftware/umbrella/core/api/ProjectService.java

@ -11,7 +11,9 @@ public interface ProjectService { @@ -11,7 +11,9 @@ public interface ProjectService {
CompanyService companyService();
Map<Long,Project> listCompanyProjects(long companyId, boolean includeClosed) throws UmbrellaException;
Map<Long,Project> listUserProjects(long userId, boolean includeClosed) throws UmbrellaException;
Project load(long projectId);
Collection<Project> loadMembers(Collection<Project> projects);
default Project loadMembers(Project project){
loadMembers(List.of(project));
return project;

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

@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@
let project = $state(null)
let task = $state({
name : '',
description : { source : 'new_task', rendered : '' },
description : { source : '', rendered : '' },
members : {}
});
@ -21,9 +21,12 @@ @@ -21,9 +21,12 @@
}
function addMember(member){
for (let uid of Object.keys(member)){
task.members[uid] = project.members[uid];
}
for (let uid of Object.keys(member)) task.members[uid] = project.members[uid];
}
function dropMember(member){
delete task.members[member.user.id];
console.log({drop:member.user.id});
}
async function loadProject(){
@ -32,7 +35,7 @@ @@ -32,7 +35,7 @@
if (resp.ok){
project = await resp.json();
task.project_id = project_id;
task.members = project.members;
task.members = JSON.parse(JSON.stringify(project.members)); // deep copy
error = null;
} else {
error = await resp.text();
@ -46,6 +49,22 @@ @@ -46,6 +49,22 @@
return Object.fromEntries(candidates);
}
async function saveTask(){
var url = api('task/add');
const resp = await fetch(url,{
credentials:'include',
method:'POST',
body: JSON.stringify(task)
});
if (resp.ok) {
task = await resp.json();
router.navigate(`/task/${task.id}/view`);
error = null;
} else {
error = await resp.text();
}
}
onMount(load);
</script>
@ -85,9 +104,10 @@ @@ -85,9 +104,10 @@
{t('members')}
</th>
<td>
<MemberEditor members={task.members} {addMember} {getCandidates}/>
<MemberEditor members={task.members} {addMember} {getCandidates} {dropMember} />
</td>
</tr>
</tbody>
</table>
<button onclick={saveTask}>{t('save_task')}</button>
</fieldset>

5
project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java

@ -153,6 +153,11 @@ public class ProjectModule extends BaseHandler implements ProjectService { @@ -153,6 +153,11 @@ public class ProjectModule extends BaseHandler implements ProjectService {
return sendContent(ex,mapValues(projects));
}
@Override
public Project load(long projectId) {
return projects.load(projectId);
}
@Override
public Collection<Project> loadMembers(Collection<Project> projectList) {
var userMap = new HashMap<Long,UmbrellaUser>();

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

@ -5,8 +5,7 @@ import static de.srsoftware.tools.Optionals.is0; @@ -5,8 +5,7 @@ import static de.srsoftware.tools.Optionals.is0;
import static de.srsoftware.tools.Optionals.isSet;
import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
import static de.srsoftware.umbrella.core.Constants.*;
import static de.srsoftware.umbrella.core.Paths.LIST;
import static de.srsoftware.umbrella.core.Paths.STATES;
import static de.srsoftware.umbrella.core.Paths.*;
import static de.srsoftware.umbrella.core.ResponseCode.HTTP_NOT_IMPLEMENTED;
import static de.srsoftware.umbrella.core.Util.mapValues;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.forbidden;
@ -38,7 +37,7 @@ public class TaskModule extends BaseHandler implements TaskService { @@ -38,7 +37,7 @@ public class TaskModule extends BaseHandler implements TaskService {
private final UserService users;
private final CompanyService companies;
public TaskModule(Configuration config, ProjectService projectService) throws UmbrellaException {
public TaskModule(Configuration config, ProjectService projectService) throws UmbrellaException {
var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE));
taskDb = new SqliteDb(connect(dbFile));
projects = projectService;
@ -83,6 +82,7 @@ public class TaskModule extends BaseHandler implements TaskService { @@ -83,6 +82,7 @@ public class TaskModule extends BaseHandler implements TaskService {
if (user.isEmpty()) return unauthorized(ex);
var head = path.pop();
return switch (head) {
case ADD -> postNewTask(user.get(),ex);
case ESTIMATED_TIMES -> estimatedTimes(user.get(),ex);
case LIST -> postTaskList(user.get(),ex);
default -> super.doGet(path,ex);
@ -171,6 +171,17 @@ public class TaskModule extends BaseHandler implements TaskService { @@ -171,6 +171,17 @@ public class TaskModule extends BaseHandler implements TaskService {
return mappedTask;
}
private boolean postNewTask(UmbrellaUser user, HttpExchange ex) throws IOException {
var json = json(ex);
if (!(json.has(PROJECT_ID) && json.get(PROJECT_ID) instanceof Number pid)) throw missingFieldException(PROJECT_ID);
long projectId = pid.longValue();
var project = projects.load(projectId);
var member = project.members().get(user.id());
if (member == null || member.permission() == Permission.READ_ONLY) throw forbidden("You are not allowed to create new tasks in this project");
Task task = Task.of(json);
return taskDb.save(task);
}
private boolean postTaskList(UmbrellaUser user, HttpExchange ex) throws IOException {
var json = json(ex);
var showClosed = json.has(SHOW_CLOSED) && json.get(SHOW_CLOSED) instanceof Boolean bool ? bool : false;

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

@ -159,6 +159,7 @@ @@ -159,6 +159,7 @@
"saved": "gespeichert",
"save_service": "Service speichern",
"save_task": "Aufgabe speichern",
"save_user": "Nutzer speichern",
"search": "Suche",
"select_company" : "Wählen Sie eine ihrer Firmen:",

Loading…
Cancel
Save