diff --git a/apps/hub/app/(app)/admin/user/[id]/_components/forms.tsx b/apps/hub/app/(app)/admin/user/[id]/_components/forms.tsx index 376475bd..95534a3d 100644 --- a/apps/hub/app/(app)/admin/user/[id]/_components/forms.tsx +++ b/apps/hub/app/(app)/admin/user/[id]/_components/forms.tsx @@ -1,6 +1,6 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { BADGES, PERMISSION, User } from "@repo/db"; +import { BADGES, PERMISSION, Report, User } from "@repo/db"; import { useRef, useState } from "react"; import { useForm } from "react-hook-form"; import { deleteDispoHistory, editUser, resetPassword } from "../../action"; @@ -20,10 +20,10 @@ import { Select } from "../../../../../_components/ui/Select"; import { UserSchema } from "@repo/db/zod"; import { useRouter } from "next/navigation"; import { PaginatedTable, PaginatedTableRef } from "_components/PaginatedTable"; -import { min } from "date-fns"; import { cn } from "../../../../../../helper/cn"; -import { ChartBarBigIcon, PlaneIcon } from "lucide-react"; +import { ChartBarBigIcon, Check, Eye, PlaneIcon, Timer, X } from "lucide-react"; import Link from "next/link"; +import { ColumnDef } from "@tanstack/react-table"; interface ProfileFormProps { user: User; @@ -305,6 +305,79 @@ export const ConnectionHistory: React.FC<{ user: User }> = ({ ); }; +export const UserReports = ({ user }: { user: User }) => { + return ( +
+

+ User Reports +

+ { + return ( +
+ {row.getValue("reviewed") ? ( + + ) : ( + + )} +
+ ); + }, + }, + { + accessorKey: "Sender", + header: "Sender", + cell: ({ row }) => { + const user = row.getValue("Sender") as User; + return `${user.firstname} ${user.lastname} (${user.publicId})`; + }, + }, + { + accessorKey: "Reported", + header: "Reported", + cell: ({ row }) => { + const user = row.getValue("Reported") as User; + return `${user.firstname} ${user.lastname} (${user.publicId})`; + }, + }, + { + accessorKey: "timestamp", + header: "Time", + cell: ({ row }) => + new Date(row.getValue("timestamp")).toLocaleString(), + }, + { + accessorKey: "actions", + header: "Actions", + cell: ({ row }) => ( + + + + ), + }, + ] as ColumnDef[] + } + /> +
+ ); +}; + interface AdminFormProps { user: User; dispoTime: { @@ -317,9 +390,19 @@ interface AdminFormProps { minutes: number; lastLogin?: Date; }; + reports: { + total: number; + open: number; + total60Days: number; + }; } -export const AdminForm = ({ user, dispoTime, pilotTime }: AdminFormProps) => { +export const AdminForm = ({ + user, + dispoTime, + pilotTime, + reports, +}: AdminFormProps) => { const router = useRouter(); return ( @@ -388,7 +471,7 @@ export const AdminForm = ({ user, dispoTime, pilotTime }: AdminFormProps) => {

Aktivität

-
+
@@ -419,7 +502,34 @@ export const AdminForm = ({ user, dispoTime, pilotTime }: AdminFormProps) => {

Reports

+ {/* TODO: Report summary Here */} +
+
+
+ +
+
+ {reports.open} +
+
Offen
+
+
+
+ +
+
{reports.total60Days}
+
in den letzten 60 Tagen
+
+ {reports.total} insgesammt +
+
+
); }; diff --git a/apps/hub/app/(app)/admin/user/[id]/page.tsx b/apps/hub/app/(app)/admin/user/[id]/page.tsx index 78d27612..7d09774f 100644 --- a/apps/hub/app/(app)/admin/user/[id]/page.tsx +++ b/apps/hub/app/(app)/admin/user/[id]/page.tsx @@ -1,6 +1,11 @@ import { PersonIcon } from "@radix-ui/react-icons"; import { prisma, User } from "@repo/db"; -import { AdminForm, ConnectionHistory, ProfileForm } from "./_components/forms"; +import { + AdminForm, + ConnectionHistory, + ProfileForm, + UserReports, +} from "./_components/forms"; import { Error } from "../../../../_components/Error"; const Page = async ({ params }: { params: { id: string } }) => { @@ -62,6 +67,33 @@ const Page = async ({ params }: { params: { id: string } }) => { lastLogin: pilotSessions[pilotSessions.length - 1]?.loginTime, }; + const totalReportsReports = await prisma.report.count({ + where: { + reportedUserId: user?.id, + }, + }); + const totalReports60Days = await prisma.report.count({ + where: { + reportedUserId: user?.id, + timestamp: { + gte: new Date(Date.now() - 60 * 24 * 60 * 60 * 1000), + }, + }, + }); + + const totalReportsOpen = await prisma.report.count({ + where: { + reportedUserId: user?.id, + reviewed: false, + }, + }); + + const reports = { + total: totalReportsReports, + open: totalReportsOpen, + total60Days: totalReports60Days, + }; + if (!user) return ; return (
@@ -75,7 +107,15 @@ const Page = async ({ params }: { params: { id: string } }) => {
- + +
+
+
diff --git a/grafana/grafana.db b/grafana/grafana.db index 8420c5a1..8d29f836 100644 Binary files a/grafana/grafana.db and b/grafana/grafana.db differ