preparing to save ne task
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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 @@
|
||||
}
|
||||
|
||||
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 @@
|
||||
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 @@
|
||||
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 @@
|
||||
{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>
|
||||
@@ -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>();
|
||||
|
||||
@@ -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 {
|
||||
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 {
|
||||
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 {
|
||||
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;
|
||||
|
||||
@@ -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:",
|
||||
|
||||
Reference in New Issue
Block a user