183 lines
4.4 KiB
TypeScript
183 lines
4.4 KiB
TypeScript
import {
|
|
Button,
|
|
Checkbox,
|
|
CheckboxGroup,
|
|
HStack,
|
|
Modal,
|
|
ModalBody,
|
|
ModalCloseButton,
|
|
ModalContent,
|
|
ModalFooter,
|
|
ModalHeader,
|
|
ModalOverlay,
|
|
Radio,
|
|
RadioGroup,
|
|
Text,
|
|
Textarea,
|
|
useToast,
|
|
VStack,
|
|
} from "@chakra-ui/react";
|
|
import { useState } from "react";
|
|
|
|
export default function (props: {
|
|
departments: string[];
|
|
isOpen: boolean;
|
|
onClose: () => void;
|
|
}) {
|
|
const [departments, setDepartments] = useState([] as string[]);
|
|
const [loading, setLoading] = useState(false);
|
|
const [start, setStart] = useState("");
|
|
const [end, setEnd] = useState("");
|
|
const [reason, setReason] = useState("");
|
|
const [isHiatus, setIsHiatus] = useState(false);
|
|
const toast = useToast();
|
|
|
|
function reset() {
|
|
setEnd("");
|
|
setReason("");
|
|
setStart("");
|
|
|
|
props.onClose();
|
|
}
|
|
|
|
async function submit() {
|
|
setLoading(true);
|
|
|
|
if (!departments.length) {
|
|
toast({
|
|
title: "Validation Error",
|
|
description: "You need to select at least one department",
|
|
status: "error",
|
|
});
|
|
|
|
setLoading(false);
|
|
return;
|
|
}
|
|
|
|
if (!start || !end || !reason) {
|
|
toast({
|
|
description: "One or more fields are missing",
|
|
status: "error",
|
|
title: "Validation Error",
|
|
});
|
|
|
|
setLoading(false);
|
|
return;
|
|
}
|
|
|
|
const inactivityPost = await fetch("/api/inactivity/new", {
|
|
body: JSON.stringify({
|
|
departments,
|
|
end,
|
|
hiatus: departments.includes("DM") ? isHiatus : undefined,
|
|
reason,
|
|
start,
|
|
}),
|
|
headers: {
|
|
"content-type": "application/json",
|
|
},
|
|
method: "POST",
|
|
});
|
|
|
|
if (!inactivityPost.ok) {
|
|
setLoading(false);
|
|
toast({
|
|
description: ((await inactivityPost.json()) as { error: string }).error,
|
|
duration: 10000,
|
|
isClosable: true,
|
|
status: "error",
|
|
title: "Error",
|
|
});
|
|
|
|
return;
|
|
}
|
|
|
|
toast({
|
|
description: "Your inactivity notice has been created",
|
|
duration: 10000,
|
|
isClosable: true,
|
|
status: "success",
|
|
title: "Success",
|
|
});
|
|
|
|
setLoading(false);
|
|
props.onClose();
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<Modal isCentered isOpen={props.isOpen} onClose={props.onClose}>
|
|
<ModalOverlay />
|
|
<ModalContent>
|
|
<ModalHeader>New Inactivity Notice</ModalHeader>
|
|
<ModalCloseButton />
|
|
<ModalBody>
|
|
<Text>Start Date</Text>
|
|
<input
|
|
id="start"
|
|
onChange={(e) => setStart(e.target.value)}
|
|
type="date"
|
|
/>
|
|
<br />
|
|
<br />
|
|
<Text>End Date</Text>
|
|
<input
|
|
id="end"
|
|
onChange={(e) => setEnd(e.target.value)}
|
|
type="date"
|
|
/>
|
|
<br />
|
|
<br />
|
|
<Text>Reason</Text>
|
|
<Textarea
|
|
id="reason"
|
|
maxLength={500}
|
|
onChange={(e) => setReason(e.target.value)}
|
|
placeholder="Your reason for making this inactivity notice"
|
|
/>
|
|
<br />
|
|
<br />
|
|
<CheckboxGroup onChange={(a: string[]) => setDepartments(a)}>
|
|
<Text>Departments: </Text>
|
|
<VStack alignItems="start">
|
|
{props.departments.map((d) => (
|
|
<Checkbox key={d} value={d}>
|
|
{d}
|
|
</Checkbox>
|
|
))}
|
|
</VStack>
|
|
</CheckboxGroup>
|
|
{departments.includes("DM") ? (
|
|
<>
|
|
<br />
|
|
<br />
|
|
<RadioGroup
|
|
onChange={(v) => setIsHiatus(JSON.parse(v))}
|
|
value={JSON.stringify(isHiatus)}
|
|
>
|
|
<HStack>
|
|
<Radio value="false">Inactivity</Radio>
|
|
<Radio value="true">Hiatus</Radio>
|
|
</HStack>
|
|
</RadioGroup>
|
|
</>
|
|
) : null}
|
|
</ModalBody>
|
|
<ModalFooter>
|
|
<Button onClick={reset}>Cancel</Button>
|
|
<Button
|
|
colorScheme="blue"
|
|
ml="8px"
|
|
onClick={async () => await submit()}
|
|
isLoading={loading}
|
|
loadingText="Submitting..."
|
|
>
|
|
Submit
|
|
</Button>
|
|
</ModalFooter>
|
|
</ModalContent>
|
|
</Modal>
|
|
</>
|
|
);
|
|
}
|