working on task index

This commit is contained in:
2025-08-04 08:50:40 +02:00
parent 8eef37eb1a
commit 983f1bac49
5 changed files with 105 additions and 30 deletions

View File

@@ -25,6 +25,7 @@
import Search from "./routes/search/Search.svelte"; import Search from "./routes/search/Search.svelte";
import SendDoc from "./routes/document/Send.svelte"; import SendDoc from "./routes/document/Send.svelte";
import TagUses from "./routes/tags/TagUses.svelte"; import TagUses from "./routes/tags/TagUses.svelte";
import TaskList from "./routes/task/Index.svelte";
import User from "./routes/user/User.svelte"; import User from "./routes/user/User.svelte";
import ViewDoc from "./routes/document/View.svelte"; import ViewDoc from "./routes/document/View.svelte";
import ViewPrj from "./routes/project/View.svelte"; import ViewPrj from "./routes/project/View.svelte";
@@ -67,6 +68,7 @@
<Route path="/project/:id/view" component={ViewPrj} /> <Route path="/project/:id/view" component={ViewPrj} />
<Route path="/search" component={Search} /> <Route path="/search" component={Search} />
<Route path="/tags/use/:tag" component={TagUses} /> <Route path="/tags/use/:tag" component={TagUses} />
<Route path="/task" component={TaskList} />
<Route path="/task/:parent_task_id/add_subtask" component={AddTask} /> <Route path="/task/:parent_task_id/add_subtask" component={AddTask} />
<Route path="/task/:id/view" component={ViewTask} /> <Route path="/task/:id/view" component={ViewTask} />
<Route path="/user" component={User} /> <Route path="/user" component={User} />

View File

@@ -0,0 +1,51 @@
<script>
import { onMount } from 'svelte';
import { api } from '../../urls.svelte.js';
import { t } from '../../translations.svelte.js';
let error = $state(null);
let tasks = $state(null);
async function load(){
const url = api('task');
const resp = await fetch(url,{credentials:'include'});
let project_ids = {};
if (resp.ok){
tasks = await resp.json();
for (let task of (Object.values(tasks))) project_ids[task.project_id] = true;
} else {
error = await resp.text();
}
project_ids = Object.keys(project_ids);
console.log(project_ids);
}
onMount(load);
</script>
<fieldsett>
<legend>{t('task_list')}</legend>
{#if error}
<soan class="error">{error}</soan>
{/if}
{#if tasks}
<table>
<thead>
<tr>
<th>{t('title')}</th>
<th>{t('project')} / {t('parent_task')}</th>
</tr>
</thead>
<tbody>
{#each Object.entries(tasks) as [tid,task]}
<tr>
<td>{task.name}</td>
<td>{task.project_id} {task.parent_task_id?tasks[task.parent_task_id]?.name:''}</td>
<td>TODO: load projects</td>
</tr>
{/each}
</tbody>
</table>
{/if}
</fieldsett>

View File

@@ -6,6 +6,7 @@ import static de.srsoftware.tools.jdbc.Condition.*;
import static de.srsoftware.tools.jdbc.Query.*; import static de.srsoftware.tools.jdbc.Query.*;
import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL; import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL;
import static de.srsoftware.umbrella.core.Constants.*; import static de.srsoftware.umbrella.core.Constants.*;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.databaseException;
import static de.srsoftware.umbrella.core.model.Status.OPEN; import static de.srsoftware.umbrella.core.model.Status.OPEN;
import static de.srsoftware.umbrella.project.Constants.*; import static de.srsoftware.umbrella.project.Constants.*;
import static de.srsoftware.umbrella.task.Constants.*; import static de.srsoftware.umbrella.task.Constants.*;
@@ -210,6 +211,22 @@ CREATE TABLE IF NOT EXISTS {0} (
} }
} }
@Override
public HashMap<Long, Task> listUserTasks(long userId) {
try {
var rs = select(ALL).from(TABLE_TASKS).leftJoin(ID,TABLE_TASKS_USERS,TASK_ID).where(USER_ID,equal(userId)).exec(db);
var map = new HashMap<Long,Task>();
while (rs.next()) {
var task = Task.of(rs);
map.put(task.id(),task);
}
rs.close();
return map;
} catch (SQLException e) {
throw databaseException("Failed to load tasks of user {0}",userId);
}
}
@Override @Override
public Task load(long taskId) throws UmbrellaException { public Task load(long taskId) throws UmbrellaException {
try { try {

View File

@@ -18,8 +18,8 @@ public interface TaskDb {
HashMap<Long, Task> listChildrenOf(Long parentTaskId, UmbrellaUser user, boolean showClosed); HashMap<Long, Task> listChildrenOf(Long parentTaskId, UmbrellaUser user, boolean showClosed);
HashMap<Long, Task> listProjectTasks(Long projectId, Long parentTaskId, boolean noIndex) throws UmbrellaException; HashMap<Long, Task> listProjectTasks(Long projectId, Long parentTaskId, boolean noIndex) throws UmbrellaException;
HashMap<Long, Task> listRootTasks(Long projectId, UmbrellaUser user, boolean showClosed); HashMap<Long, Task> listRootTasks(Long projectId, UmbrellaUser user, boolean showClosed);
HashMap<Long, Task> listTasks(Collection<Long> projectIds) throws UmbrellaException; HashMap<Long, Task> listTasks(Collection<Long> projectIds) throws UmbrellaException;
HashMap<Long, Task> listUserTasks(long userId);
Task load(long taskId) throws UmbrellaException; Task load(long taskId) throws UmbrellaException;

View File

@@ -103,7 +103,7 @@ public class TaskModule extends BaseHandler implements TaskService {
var head = path.pop(); var head = path.pop();
return switch (head) { return switch (head) {
case PERMISSIONS -> getPermissionList(ex); case PERMISSIONS -> getPermissionList(ex);
case null -> super.doGet(path,ex); case null -> getUserTasks(user.get(),ex);
default -> { default -> {
var taskId = Long.parseLong(head); var taskId = Long.parseLong(head);
head = path.pop(); head = path.pop();
@@ -201,6 +201,11 @@ public class TaskModule extends BaseHandler implements TaskService {
return sendContent(ex,task); return sendContent(ex,task);
} }
private boolean getUserTasks(UmbrellaUser user, HttpExchange ex) throws IOException {
var list = taskDb.listUserTasks(user.id());
return sendContent(ex,mapValues(list));
}
@Override @Override
public HashMap<Long, Task> listCompanyTasks(long companyId) throws UmbrellaException { public HashMap<Long, Task> listCompanyTasks(long companyId) throws UmbrellaException {
var projectList = projects.listCompanyProjects(companyId,false); var projectList = projects.listCompanyProjects(companyId,false);