diff --git a/app/routes/inactivities.tsx b/app/routes/inactivities.tsx index b77ce0f..813f947 100644 --- a/app/routes/inactivities.tsx +++ b/app/routes/inactivities.tsx @@ -2,6 +2,13 @@ import { Button, Container, Heading, + ListItem, + Modal, + ModalBody, + ModalCloseButton, + ModalContent, + ModalHeader, + ModalOverlay, Table, TableCaption, TableContainer, @@ -9,8 +16,12 @@ import { Td, Thead, Tr, + UnorderedList, + useDisclosure, + useToast, } from "@chakra-ui/react"; import { useLoaderData } from "@remix-run/react"; +import { useState } from "react"; export async function loader({ context }: { context: RequestContext }) { const { current_user: currentUser } = context.data; @@ -46,7 +57,7 @@ export async function loader({ context }: { context: RequestContext }) { const today = new Date().toISOString().split("T").at(0); const { results } = await context.env.D1.prepare( - "SELECT decisions, end, start, user FROM inactivity_notices WHERE start <= ?1 AND date(end, '+30 days') <= ?1; ", + "SELECT decisions, end, id, start, user FROM inactivity_notices WHERE start <= ?1 AND date(end, '+30 days') <= ?1; ", ) .bind(today) .all(); @@ -63,6 +74,7 @@ export async function loader({ context }: { context: RequestContext }) { }) as unknown as { decisions: { [k: string]: boolean }; end: string; + id: string; start: string; user: { email: string; id: string; username: string }; }[]; @@ -70,9 +82,75 @@ export async function loader({ context }: { context: RequestContext }) { export default function () { const data = useLoaderData(); + const [currentInactivity, setInactivity] = useState( + {} as { [k: string]: any }, + ); + const { isOpen, onClose, onOpen } = useDisclosure(); + const toast = useToast(); + + async function getInactivity(id: string) { + const inactivityResponse = await fetch(`/api/inactivity/${id}`); + + if (!inactivityResponse.ok) { + let msg = "Unknown error"; + + try { + msg = ((await inactivityResponse.json()) as { error: string }).error; + } catch {} + + toast({ + description: msg, + status: "error", + title: "Failed to fetch inactivity", + }); + + return; + } + + setInactivity(await inactivityResponse.json()); + onOpen(); + } return ( + + + + Inactivity Details + + + + Username: ${currentInactivity.user.username} + User ID: ${currentInactivity.user.id} + Start Date: ${currentInactivity.start} + End Date: ${currentInactivity.end} + + Is Hiatus: ${currentInactivity.hiatus ? "Yes" : "No"} + + Reason: ${currentInactivity.reason} + + Decisions: +
+ Approved: $ + {Object.keys(currentInactivity.decisions).filter( + (d) => currentInactivity.decisions[d], + )} +
+ Denied: $ + {Object.keys(currentInactivity.decisions).filter( + (d) => !currentInactivity.decisions[d], + )} +
+ Pending: $ + {currentInactivity.departments.filter( + (d: "DM" | "ET" | "FM" | "WM") => + typeof currentInactivity.decisions[d] === "undefined", + )} +
+
+
+
+
Current Inactivity Notices