preparing to save ne task
This commit is contained in:
@@ -11,7 +11,9 @@ public interface ProjectService {
|
|||||||
CompanyService companyService();
|
CompanyService companyService();
|
||||||
Map<Long,Project> listCompanyProjects(long companyId, boolean includeClosed) throws UmbrellaException;
|
Map<Long,Project> listCompanyProjects(long companyId, boolean includeClosed) throws UmbrellaException;
|
||||||
Map<Long,Project> listUserProjects(long userId, boolean includeClosed) throws UmbrellaException;
|
Map<Long,Project> listUserProjects(long userId, boolean includeClosed) throws UmbrellaException;
|
||||||
|
Project load(long projectId);
|
||||||
Collection<Project> loadMembers(Collection<Project> projects);
|
Collection<Project> loadMembers(Collection<Project> projects);
|
||||||
|
|
||||||
default Project loadMembers(Project project){
|
default Project loadMembers(Project project){
|
||||||
loadMembers(List.of(project));
|
loadMembers(List.of(project));
|
||||||
return project;
|
return project;
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
let project = $state(null)
|
let project = $state(null)
|
||||||
let task = $state({
|
let task = $state({
|
||||||
name : '',
|
name : '',
|
||||||
description : { source : 'new_task', rendered : '' },
|
description : { source : '', rendered : '' },
|
||||||
members : {}
|
members : {}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -21,9 +21,12 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function addMember(member){
|
function addMember(member){
|
||||||
for (let uid of Object.keys(member)){
|
for (let uid of Object.keys(member)) task.members[uid] = project.members[uid];
|
||||||
task.members[uid] = project.members[uid];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function dropMember(member){
|
||||||
|
delete task.members[member.user.id];
|
||||||
|
console.log({drop:member.user.id});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function loadProject(){
|
async function loadProject(){
|
||||||
@@ -32,7 +35,7 @@
|
|||||||
if (resp.ok){
|
if (resp.ok){
|
||||||
project = await resp.json();
|
project = await resp.json();
|
||||||
task.project_id = project_id;
|
task.project_id = project_id;
|
||||||
task.members = project.members;
|
task.members = JSON.parse(JSON.stringify(project.members)); // deep copy
|
||||||
error = null;
|
error = null;
|
||||||
} else {
|
} else {
|
||||||
error = await resp.text();
|
error = await resp.text();
|
||||||
@@ -46,6 +49,22 @@
|
|||||||
return Object.fromEntries(candidates);
|
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);
|
onMount(load);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -85,9 +104,10 @@
|
|||||||
{t('members')}
|
{t('members')}
|
||||||
</th>
|
</th>
|
||||||
<td>
|
<td>
|
||||||
<MemberEditor members={task.members} {addMember} {getCandidates}/>
|
<MemberEditor members={task.members} {addMember} {getCandidates} {dropMember} />
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<button onclick={saveTask}>{t('save_task')}</button>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
@@ -153,6 +153,11 @@ public class ProjectModule extends BaseHandler implements ProjectService {
|
|||||||
return sendContent(ex,mapValues(projects));
|
return sendContent(ex,mapValues(projects));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Project load(long projectId) {
|
||||||
|
return projects.load(projectId);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<Project> loadMembers(Collection<Project> projectList) {
|
public Collection<Project> loadMembers(Collection<Project> projectList) {
|
||||||
var userMap = new HashMap<Long,UmbrellaUser>();
|
var userMap = new HashMap<Long,UmbrellaUser>();
|
||||||
|
|||||||
@@ -5,8 +5,7 @@ import static de.srsoftware.tools.Optionals.is0;
|
|||||||
import static de.srsoftware.tools.Optionals.isSet;
|
import static de.srsoftware.tools.Optionals.isSet;
|
||||||
import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
|
import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
|
||||||
import static de.srsoftware.umbrella.core.Constants.*;
|
import static de.srsoftware.umbrella.core.Constants.*;
|
||||||
import static de.srsoftware.umbrella.core.Paths.LIST;
|
import static de.srsoftware.umbrella.core.Paths.*;
|
||||||
import static de.srsoftware.umbrella.core.Paths.STATES;
|
|
||||||
import static de.srsoftware.umbrella.core.ResponseCode.HTTP_NOT_IMPLEMENTED;
|
import static de.srsoftware.umbrella.core.ResponseCode.HTTP_NOT_IMPLEMENTED;
|
||||||
import static de.srsoftware.umbrella.core.Util.mapValues;
|
import static de.srsoftware.umbrella.core.Util.mapValues;
|
||||||
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.forbidden;
|
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.forbidden;
|
||||||
@@ -83,6 +82,7 @@ public class TaskModule extends BaseHandler implements TaskService {
|
|||||||
if (user.isEmpty()) return unauthorized(ex);
|
if (user.isEmpty()) return unauthorized(ex);
|
||||||
var head = path.pop();
|
var head = path.pop();
|
||||||
return switch (head) {
|
return switch (head) {
|
||||||
|
case ADD -> postNewTask(user.get(),ex);
|
||||||
case ESTIMATED_TIMES -> estimatedTimes(user.get(),ex);
|
case ESTIMATED_TIMES -> estimatedTimes(user.get(),ex);
|
||||||
case LIST -> postTaskList(user.get(),ex);
|
case LIST -> postTaskList(user.get(),ex);
|
||||||
default -> super.doGet(path,ex);
|
default -> super.doGet(path,ex);
|
||||||
@@ -171,6 +171,17 @@ public class TaskModule extends BaseHandler implements TaskService {
|
|||||||
return mappedTask;
|
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 {
|
private boolean postTaskList(UmbrellaUser user, HttpExchange ex) throws IOException {
|
||||||
var json = json(ex);
|
var json = json(ex);
|
||||||
var showClosed = json.has(SHOW_CLOSED) && json.get(SHOW_CLOSED) instanceof Boolean bool ? bool : false;
|
var showClosed = json.has(SHOW_CLOSED) && json.get(SHOW_CLOSED) instanceof Boolean bool ? bool : false;
|
||||||
|
|||||||
@@ -159,6 +159,7 @@
|
|||||||
|
|
||||||
"saved": "gespeichert",
|
"saved": "gespeichert",
|
||||||
"save_service": "Service speichern",
|
"save_service": "Service speichern",
|
||||||
|
"save_task": "Aufgabe speichern",
|
||||||
"save_user": "Nutzer speichern",
|
"save_user": "Nutzer speichern",
|
||||||
"search": "Suche",
|
"search": "Suche",
|
||||||
"select_company" : "Wählen Sie eine ihrer Firmen:",
|
"select_company" : "Wählen Sie eine ihrer Firmen:",
|
||||||
|
|||||||
Reference in New Issue
Block a user