diff --git a/backend/pkg/db/users/User.go b/backend/pkg/db/users/User.go index a13ad73..a943a51 100644 --- a/backend/pkg/db/users/User.go +++ b/backend/pkg/db/users/User.go @@ -177,6 +177,14 @@ func (userName UserName) ChangePassword(password string) (string, error) { } } +func (userName UserName) GetTasks() ([]tasks.TaskID, error) { + var tasks []tasks.TaskID + + err := db.DB.Select(&tasks, "SELECT taskID FROM USER_TASKS WHERE userName = $1", userName) + + return tasks, err +} + func (userName UserName) SetTasks(tasks []tasks.TaskID) error { // remove all current possible tasks if _, err := db.DB.Exec("DELETE FROM USER_TASKS WHERE userName = $1", userName); err != nil { diff --git a/backend/pkg/router/router.go b/backend/pkg/router/router.go index 7d92570..5a519a3 100644 --- a/backend/pkg/router/router.go +++ b/backend/pkg/router/router.go @@ -99,6 +99,7 @@ func init() { "events/user/assigned": (*Handler).getEventsUserAssigned, "tasks": (*Handler).getTasks, // all available tasks "users": (*Handler).getUsers, // all users + "user/tasks": (*Handler).getUserTasks, // get all possible tasks for the user "availabilities": (*Handler).getAvailabilities, // all available availabilities }, "POST": { diff --git a/backend/pkg/router/user.go b/backend/pkg/router/user.go index afcea9f..b08fc88 100644 --- a/backend/pkg/router/user.go +++ b/backend/pkg/router/user.go @@ -20,6 +20,16 @@ func (a *Handler) getUsers() { } } +func (a *Handler) getUserTasks() { + if tasks, err := a.UserName.GetTasks(); err != nil { + a.Status = fiber.StatusInternalServerError + + logger.Error().Msgf("getting possible user-tasks failed: %v", err) + } else { + a.Data = tasks + } +} + func (a *Handler) postUser() { // check admin diff --git a/client/src/Zustand.ts b/client/src/Zustand.ts index 2aefe9e..99599bb 100644 --- a/client/src/Zustand.ts +++ b/client/src/Zustand.ts @@ -1,7 +1,7 @@ "use client"; import { create } from "zustand"; -import { Task } from "./lib"; +import { Task, TaskID } from "./lib"; import { Availability } from "./app/admin/(availabilities)/AvailabilityEditor"; export interface BaseEvent { @@ -41,6 +41,7 @@ export type UserAddModify = User & { interface Zustand { user: StateUser | null; + userTasks?: TaskID[]; tasks?: Task[]; availabilities?: Availability[]; users?: User[]; diff --git a/client/src/app/events/page.tsx b/client/src/app/events/page.tsx index 7ca630b..b236151 100644 --- a/client/src/app/events/page.tsx +++ b/client/src/app/events/page.tsx @@ -2,7 +2,7 @@ import AddEvent from "@/components/Event/AddEvent"; import AssignmentTable from "@/components/Event/AssignmentTable"; import Event from "@/components/Event/Event"; -import { apiCall } from "@/lib"; +import { apiCall, getUserTasks } from "@/lib"; import zustand, { EventDataWithAvailability } from "@/Zustand"; import { Add } from "@carbon/icons-react"; import { Button, Tab, Tabs } from "@heroui/react"; @@ -37,6 +37,14 @@ export default function Events() { }, }); + const userTasks = useAsyncList({ + async load() { + return { + items: await getUserTasks(), + }; + }, + }); + function showEvent(event: EventDataWithAvailability): boolean { switch (filter) { case "assigned": @@ -45,13 +53,17 @@ export default function Events() { }); case "pending": - return event.availability === null; + return event.availability === null && showAvailabilitySelector(event); default: return true; } } + function showAvailabilitySelector(event: EventDataWithAvailability): boolean { + return event.tasks.some((t) => userTasks.items.includes(t.taskID)); + } + return (