diff --git a/actions/user.ts b/actions/user.ts index d68b26e..1dafd1f 100644 --- a/actions/user.ts +++ b/actions/user.ts @@ -8,6 +8,35 @@ import {z} from "zod"; import {writeDossier} from "@/actions/dossier"; import {log} from "@/actions/log"; import {getController} from "@/actions/vatusa/controller"; +import { after } from "next/server"; + +export const updateOperatingInitials = async (user: User, initials: string,) => { + + const existing = await prisma.user.findFirst({ + where: { + operatingInitials: initials, + }, + }); + + if (existing) { + return "These operating initials are already in use."; + } + + await prisma.user.update({ + data: { + operatingInitials: initials, + }, + where: { + id: user.id, + } + }); + + after(async () => { + await log("UPDATE", "USER_SETTINGS", `User operating initials updated to ${initials} for ${user.firstName} ${user.lastName} (${user.cid})`,); + }); + + revalidatePath('/admin/oi-matrix'); +} export const updateSettings = async (formData: FormData) => { diff --git a/app/admin/oi-matrix/page.tsx b/app/admin/oi-matrix/page.tsx index ec5fee5..922e4c9 100644 --- a/app/admin/oi-matrix/page.tsx +++ b/app/admin/oi-matrix/page.tsx @@ -2,27 +2,31 @@ import React from 'react'; import prisma from "@/lib/db"; import {Box, Card, CardContent, Grid2, Stack, Tooltip, Typography} from "@mui/material"; import Link from "next/link"; +import OperatingInitialAssignmentItem from '@/components/OperatingInitials/OperatingInitialAssignmentItem'; +import { User } from 'next-auth'; export default async function Page() { - const inUseOperatingInitials = await prisma.user.findMany({ + const allControllers = await prisma.user.findMany({ where: { - operatingInitials: { - not: null, - }, controllerStatus: { not: 'NONE', }, }, select: { operatingInitials: true, + id: true, cid: true, firstName: true, lastName: true, controllerStatus: true, + rating: true, }, }); + const inUseOperatingInitials = allControllers + .filter((c) => c.operatingInitials); + const allPossibleOperatingInitials = Array.from({length: 26 * 26}, (_, i) => { const first = String.fromCharCode(65 + Math.floor(i / 26)); const second = String.fromCharCode(65 + i % 26); @@ -75,18 +79,7 @@ export default async function Page() { ) : ( - - - {initials} - - + ); })} diff --git a/components/EventPosition/EventPositionRequestForm.tsx b/components/EventPosition/EventPositionRequestForm.tsx index 80b6491..9158333 100644 --- a/components/EventPosition/EventPositionRequestForm.tsx +++ b/components/EventPosition/EventPositionRequestForm.tsx @@ -67,7 +67,7 @@ export default function EventPositionRequestForm({ admin, currentUser, event, ev onChange={(event, newValue) => { setUser(newValue ? newValue.id : ''); }} - renderInput={(params) => } + renderInput={(params) => } /> } diff --git a/components/OperatingInitials/OperatingInitialAssignmentItem.tsx b/components/OperatingInitials/OperatingInitialAssignmentItem.tsx new file mode 100644 index 0000000..91147e3 --- /dev/null +++ b/components/OperatingInitials/OperatingInitialAssignmentItem.tsx @@ -0,0 +1,68 @@ +'use client'; +import { updateOperatingInitials } from "@/actions/user"; +import { getRating } from "@/lib/vatsim"; +import { Autocomplete, Box, Button, Dialog, DialogActions, DialogContent, DialogTitle, TextField, Typography } from "@mui/material"; + +import { Grid2 } from "@mui/material"; +import { User } from "next-auth"; +import { useState } from "react"; +import { toast } from "react-toastify"; + +export default function OperatingInitialAssignmentItem({ initials, allControllers, }: { initials: string, allControllers: User[], }) { + + const [open, setOpen] = useState(false); + const [user, setUser] = useState(''); + + const handleSubmit = async () => { + + const u = allControllers.find((u) => u.id === user); + + if (!u) return; + + const error = await updateOperatingInitials(u, initials); + + if (error) { + toast.error(error); + return; + } + + toast.success(`Successfully assigned ${initials} to ${u.firstName} ${u.lastName}`); + setOpen(false); + } + + return ( + <> + + +
setOpen(true)}> + {initials} +
+
+
+ setOpen(false)}> + Assign Operating Initials - {initials} + + `${option.firstName} ${option.lastName} - ${getRating(option.rating)} (${option.cid})`} + value={allControllers.find((u) => u.id === user) || null} + onChange={(event, newValue) => { + setUser(newValue ? newValue.id : ''); + }} + renderInput={(params) => } /> + + + + + + + + ); +} \ No newline at end of file