Skip to content

Commit 6521ab5

Browse files
committed
task page filters tasks by fir
1 parent baa5780 commit 6521ab5

File tree

4 files changed

+48
-10
lines changed

4 files changed

+48
-10
lines changed

app/admin/events/page.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,13 +133,11 @@ export default function AdminEventsPage() {
133133
setLoading(false);
134134
return;
135135
}
136-
if (isVATGERLead()) {
137-
setSelectedFir("ALL");
138-
refreshEvents("ALL");
139-
} else if (user.fir?.code) {
136+
if (user.fir?.code) {
140137
setSelectedFir(user.fir.code);
141138
refreshEvents(user.fir.code);
142139
} else {
140+
setSelectedFir("ALL");
143141
refreshEvents("ALL");
144142
}
145143
}

app/admin/tasks/page.tsx

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,34 @@ export default function MyTasksPage() {
5656
// Filters for "all" tab
5757
const [statusFilter, setStatusFilter] = useState<"all" | "open" | "done">("all");
5858
const [assignFilter, setAssignFilter] = useState<"all" | "assigned" | "unassigned">("all");
59+
// FIR filter for "all" tab
60+
const [firFilter, setFirFilter] = useState<string | null>(null);
61+
const [availableFirs, setAvailableFirs] = useState<{ code: string; name: string }[]>([]);
5962

6063
const { user } = useUser();
6164
const currentCID = user?.cid;
6265

66+
// Determine the default FIR: use the user's own FIR if available.
67+
// VATGER leads without a FIR may pick from a selector.
68+
useEffect(() => {
69+
if (!user) return;
70+
if (user.fir?.code) {
71+
setFirFilter(user.fir.code);
72+
}
73+
if (user.effectiveLevel === "VATGER_LEITUNG" || user.effectiveLevel === "MAIN_ADMIN") {
74+
// Load available FIRs for the selector
75+
fetch("/api/firs")
76+
.then((r) => r.json())
77+
.then((firs: { code: string; name: string }[]) => setAvailableFirs(firs))
78+
.catch(() => {/* ignore */});
79+
}
80+
}, [user]);
81+
6382
const loadTasks = useCallback(async () => {
6483
try {
65-
const res = await fetch(`/api/tasks/my?view=${tab}`);
84+
const params = new URLSearchParams({ view: tab });
85+
if (tab === "all" && firFilter) params.set("firCode", firFilter);
86+
const res = await fetch(`/api/tasks/my?${params.toString()}`);
6687
if (!res.ok) throw new Error("Fehler beim Laden");
6788
const result = await res.json();
6889
setData(result);
@@ -72,7 +93,7 @@ export default function MyTasksPage() {
7293
} finally {
7394
setLoading(false);
7495
}
75-
}, [tab]);
96+
}, [tab, firFilter]);
7697

7798
useEffect(() => {
7899
setLoading(true);
@@ -372,7 +393,24 @@ export default function MyTasksPage() {
372393

373394
<TabsContent value="all" className="space-y-4 mt-4">
374395
{/* Filters */}
375-
<div className="flex items-center gap-3">
396+
<div className="flex items-center gap-3 flex-wrap">
397+
{/* FIR selector: only shown for VATGER leads / MAIN_ADMINs without a fixed FIR */}
398+
{(user?.effectiveLevel === "VATGER_LEITUNG" || user?.effectiveLevel === "MAIN_ADMIN") && (
399+
<Select
400+
value={firFilter ?? "ALL"}
401+
onValueChange={(v) => setFirFilter(v === "ALL" ? null : v)}
402+
>
403+
<SelectTrigger className="w-[180px] h-8 text-xs">
404+
<SelectValue placeholder="FIR auswählen" />
405+
</SelectTrigger>
406+
<SelectContent>
407+
<SelectItem value="ALL">Alle FIRs</SelectItem>
408+
{availableFirs.map((f) => (
409+
<SelectItem key={f.code} value={f.code}>{f.code}{f.name}</SelectItem>
410+
))}
411+
</SelectContent>
412+
</Select>
413+
)}
376414
<Select value={statusFilter} onValueChange={(v) => setStatusFilter(v as "all" | "open" | "done")}>
377415
<SelectTrigger className="w-[160px] h-8 text-xs">
378416
<SelectValue />

app/api/tasks/my/route.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export async function GET(req: NextRequest) {
2525
}
2626

2727
const view = req.nextUrl.searchParams.get("view") || "mine";
28+
const firCode = req.nextUrl.searchParams.get("firCode") || null;
2829

2930
const eventInclude = {
3031
select: { id: true, name: true, startTime: true, firCode: true },
@@ -55,6 +56,7 @@ export async function GET(req: NextRequest) {
5556
where: {
5657
event: {
5758
status: { notIn: ["CANCELLED"] },
59+
...(firCode ? { firCode } : {}),
5860
},
5961
},
6062
include: {

config/taskTemplates.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,15 @@ export const DEFAULT_TASK_TEMPLATES: TaskTemplate[] = [
2828
title: "Banner erstellen",
2929
description:
3030
"Erstelle einen Banner für das Event. Nach Fertigstellung kann die Banner-URL hinterlegt werden. Der Banner darf erst veröffentlicht werden, nachdem er im Clearing approved wurde.",
31-
deadlineDaysBefore: 35,
31+
deadlineDaysBefore: 33,
3232
sortOrder: 1,
3333
},
3434
{
3535
type: "CREATE_TEXT",
3636
title: "Bewerbungstext erstellen",
3737
description:
3838
"Schreibe einen Bewerbungstext für das Event. Der Text wird im internen Forum gepostet und ist anschließend fürs Clearing erforderlich.",
39-
deadlineDaysBefore: 35,
39+
deadlineDaysBefore: 33,
4040
sortOrder: 2,
4141
},
4242
{
@@ -52,7 +52,7 @@ export const DEFAULT_TASK_TEMPLATES: TaskTemplate[] = [
5252
title: "In myVATSIM eintragen",
5353
description:
5454
"Trage das Event im myVATSIM Admin Panel ein, damit es öffentlich sichtbar wird. Nach dem Eintragen muss myVATSIM das Event noch genehmigen.",
55-
deadlineDaysBefore: 7,
55+
deadlineDaysBefore: 8,
5656
sortOrder: 4,
5757
},
5858
];

0 commit comments

Comments
 (0)