TTime/frontend/src/Components/NewWeeklyReport.tsx

216 lines
8 KiB
TypeScript
Raw Normal View History

//info: New weekly report form component to create a new weekly report to
//sumbit development time, meeting time, admin time, own work time, study time and testing time
2024-03-18 21:40:07 +01:00
import { useState } from "react";
2024-03-19 02:11:47 +01:00
import type { NewWeeklyReport } from "../Types/goTypes";
2024-03-16 13:10:46 +01:00
import { api } from "../API/API";
2024-03-18 21:40:07 +01:00
import { useNavigate, useParams } from "react-router-dom";
2024-03-16 13:10:46 +01:00
import Button from "./Button";
/**
* Renders a form for creating a new weekly report.
* @returns The JSX element representing the new weekly report form.
*/
2024-03-17 14:19:57 +01:00
export default function NewWeeklyReport(): JSX.Element {
const [week, setWeek] = useState<number>(0);
2024-03-19 02:11:47 +01:00
const [developmentTime, setDevelopmentTime] = useState<number>();
const [meetingTime, setMeetingTime] = useState<number>();
const [adminTime, setAdminTime] = useState<number>();
const [ownWorkTime, setOwnWorkTime] = useState<number>();
const [studyTime, setStudyTime] = useState<number>();
const [testingTime, setTestingTime] = useState<number>();
2024-03-16 13:10:46 +01:00
2024-03-18 21:40:07 +01:00
const { projectName } = useParams();
const token = localStorage.getItem("accessToken") ?? "";
2024-03-17 14:19:57 +01:00
const handleNewWeeklyReport = async (): Promise<void> => {
const newWeeklyReport: NewWeeklyReport = {
2024-03-18 21:40:07 +01:00
projectName: projectName ?? "",
week: week,
2024-03-19 02:11:47 +01:00
developmentTime: developmentTime ?? 0,
meetingTime: meetingTime ?? 0,
adminTime: adminTime ?? 0,
ownWorkTime: ownWorkTime ?? 0,
studyTime: studyTime ?? 0,
testingTime: testingTime ?? 0,
2024-03-16 13:10:46 +01:00
};
await api.submitWeeklyReport(newWeeklyReport, token);
2024-03-16 13:10:46 +01:00
};
const navigate = useNavigate();
return (
<>
<div className="border-4 border-black bg-white flex flex-col justify-start min-h-[65vh] h-fit w-[50vw] rounded-3xl overflow-scroll space-y-[2vh] p-[30px] items-center">
2024-03-16 13:10:46 +01:00
<form
onSubmit={(e) => {
if (week === 0) {
2024-03-16 13:10:46 +01:00
alert("Please enter a week number");
e.preventDefault();
return;
}
e.preventDefault();
2024-03-17 14:19:57 +01:00
void handleNewWeeklyReport();
navigate(-1);
}}
2024-03-16 13:10:46 +01:00
>
<div className="flex flex-col items-center">
<input
className="w-fill h-[5vh] font-sans text-[3vh] pl-[1vw] rounded-full text-center pt-[1vh] pb-[1vh] border-2 border-black"
type="week"
placeholder="Week"
onChange={(e) => {
const weekNumber = parseInt(e.target.value.split("-W")[1]);
2024-03-16 13:10:46 +01:00
setWeek(weekNumber);
}}
onKeyDown={(event) => {
2024-03-19 02:11:47 +01:00
const keyValue = event.key;
if (!/\d/.test(keyValue) && keyValue !== "Backspace")
event.preventDefault();
2024-03-16 13:10:46 +01:00
}}
onPaste={(event) => {
event.preventDefault();
}}
/>
<table className="w-full text-center divide-y divide-x divide-white text-[30px]">
<thead>
<tr>
<th className="w-1/2 py-2 border-b-2 border-black">
Activity
</th>
<th className="w-1/2 py-2 border-b-2 border-black">
Total Time (min)
</th>
</tr>
</thead>
<tbody className="divide-y divide-black">
<tr className="h-[10vh]">
<td>Development</td>
<td>
<input
type="number"
min="0"
className="border-2 border-black rounded-md text-center w-1/2"
value={developmentTime}
2024-03-16 13:10:46 +01:00
onChange={(e) => {
setDevelopmentTime(parseInt(e.target.value));
2024-03-16 13:10:46 +01:00
}}
onKeyDown={(event) => {
const keyValue = event.key;
if (!/\d/.test(keyValue) && keyValue !== "Backspace")
event.preventDefault();
}}
/>
</td>
</tr>
<tr className="h-[10vh]">
<td>Meeting</td>
<td>
<input
type="number"
min="0"
className="border-2 border-black rounded-md text-center w-1/2"
value={meetingTime}
2024-03-16 13:10:46 +01:00
onChange={(e) => {
setMeetingTime(parseInt(e.target.value));
2024-03-16 13:10:46 +01:00
}}
onKeyDown={(event) => {
const keyValue = event.key;
if (!/\d/.test(keyValue) && keyValue !== "Backspace")
event.preventDefault();
}}
/>
</td>
</tr>
<tr className="h-[10vh]">
<td>Administration</td>
<td>
<input
type="number"
min="0"
className="border-2 border-black rounded-md text-center w-1/2"
value={adminTime}
2024-03-16 13:10:46 +01:00
onChange={(e) => {
setAdminTime(parseInt(e.target.value));
2024-03-16 13:10:46 +01:00
}}
onKeyDown={(event) => {
const keyValue = event.key;
if (!/\d/.test(keyValue) && keyValue !== "Backspace")
event.preventDefault();
}}
/>
</td>
</tr>
<tr className="h-[10vh]">
<td>Own Work</td>
<td>
<input
type="number"
min="0"
className="border-2 border-black rounded-md text-center w-1/2"
value={ownWorkTime}
2024-03-16 13:10:46 +01:00
onChange={(e) => {
setOwnWorkTime(parseInt(e.target.value));
2024-03-16 13:10:46 +01:00
}}
onKeyDown={(event) => {
const keyValue = event.key;
if (!/\d/.test(keyValue) && keyValue !== "Backspace")
event.preventDefault();
}}
/>
</td>
</tr>
<tr className="h-[10vh]">
<td>Studies</td>
<td>
<input
type="number"
min="0"
className="border-2 border-black rounded-md text-center w-1/2"
value={studyTime}
2024-03-16 13:10:46 +01:00
onChange={(e) => {
setStudyTime(parseInt(e.target.value));
2024-03-16 13:10:46 +01:00
}}
onKeyDown={(event) => {
const keyValue = event.key;
if (!/\d/.test(keyValue) && keyValue !== "Backspace")
event.preventDefault();
}}
/>
</td>
</tr>
<tr className="h-[10vh]">
<td>Testing</td>
<td>
<input
type="number"
min="0"
className="border-2 border-black rounded-md text-center w-1/2"
value={testingTime}
2024-03-16 13:10:46 +01:00
onChange={(e) => {
setTestingTime(parseInt(e.target.value));
2024-03-16 13:10:46 +01:00
}}
onKeyDown={(event) => {
const keyValue = event.key;
if (!/\d/.test(keyValue) && keyValue !== "Backspace")
event.preventDefault();
}}
/>
</td>
</tr>
</tbody>
</table>
<Button
text="Submit"
onClick={(): void => {
return;
}}
type="submit"
/>
</div>
</form>
</div>
</>
);
}