2024-03-20 13:55:56 +01:00
//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" ;
2024-03-20 13:55:56 +01:00
/ * *
* 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 {
2024-03-19 09:33:20 +01:00
const [ week , setWeek ] = useState < number > ( 0 ) ;
2024-03-20 21:53:27 +01:00
const [ developmentTime , setDevelopmentTime ] = useState < number > ( 0 ) ;
const [ meetingTime , setMeetingTime ] = useState < number > ( 0 ) ;
const [ adminTime , setAdminTime ] = useState < number > ( 0 ) ;
const [ ownWorkTime , setOwnWorkTime ] = useState < number > ( 0 ) ;
const [ studyTime , setStudyTime ] = useState < number > ( 0 ) ;
const [ testingTime , setTestingTime ] = useState < number > ( 0 ) ;
2024-03-16 13:10:46 +01:00
2024-03-18 21:40:07 +01:00
const { projectName } = useParams ( ) ;
2024-03-18 10:26:37 +01:00
const token = localStorage . getItem ( "accessToken" ) ? ? "" ;
2024-03-21 12:31:05 +01:00
const handleNewWeeklyReport = async ( ) : Promise < boolean > = > {
2024-03-17 14:19:57 +01:00
const newWeeklyReport : NewWeeklyReport = {
2024-03-18 21:40:07 +01:00
projectName : projectName ? ? "" ,
2024-03-19 09:33:20 +01:00
week : week ,
2024-03-20 21:53:27 +01:00
developmentTime : developmentTime ,
meetingTime : meetingTime ,
adminTime : adminTime ,
ownWorkTime : ownWorkTime ,
studyTime : studyTime ,
testingTime : testingTime ,
2024-03-16 13:10:46 +01:00
} ;
2024-03-18 10:26:37 +01:00
2024-03-21 12:31:05 +01:00
const response = await api . submitWeeklyReport ( newWeeklyReport , token ) ;
console . log ( response ) ;
if ( response . success ) {
return true ;
} else {
return false ;
}
2024-03-16 13:10:46 +01:00
} ;
const navigate = useNavigate ( ) ;
2024-03-21 08:57:56 +01:00
// Check if the browser is Chrome or Edge
2024-03-20 15:19:09 +01:00
const isChromeOrEdge = /Chrome|Edg/ . test ( navigator . userAgent ) ;
2024-03-14 13:21:19 +01:00
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 ) = > {
e . preventDefault ( ) ;
2024-03-21 12:31:05 +01:00
void ( async ( ) : Promise < void > = > {
if ( week === 0 || week > 53 || week < 1 ) {
alert ( "Please enter a valid week number" ) ;
return ;
}
const success = await handleNewWeeklyReport ( ) ;
if ( ! success ) {
alert (
2024-04-04 11:19:35 +02:00
"Error occurred! Your connection to the server might be lost or a time report for this week already exists, please check your connection or go to the edit page to edit your report or change week number." ,
2024-03-21 12:31:05 +01:00
) ;
return ;
}
2024-03-27 20:47:24 +01:00
alert ( "Weekly report submitted successfully" ) ;
2024-03-21 12:31:05 +01:00
navigate ( - 1 ) ;
} ) ( ) ;
2024-03-14 13:21:19 +01:00
} }
2024-03-16 13:10:46 +01:00
>
< div className = "flex flex-col items-center" >
2024-03-20 15:19:09 +01:00
{ isChromeOrEdge ? (
< 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 ] ) ;
setWeek ( weekNumber ) ;
} }
onKeyDown = { ( event ) = > {
const keyValue = event . key ;
if ( ! /\d/ . test ( keyValue ) && keyValue !== "Backspace" )
event . preventDefault ( ) ;
} }
onPaste = { ( event ) = > {
2024-03-19 02:11:47 +01:00
event . preventDefault ( ) ;
2024-03-20 15:19:09 +01:00
} }
/ >
) : (
< 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 = "text"
placeholder = "Week (Numbers Only)"
onChange = { ( e ) = > {
const weekNumber = parseInt ( e . target . value ) ;
2024-03-20 15:32:14 +01:00
setWeek ( weekNumber ) ;
2024-03-20 15:19:09 +01:00
} }
onKeyDown = { ( event ) = > {
const keyValue = event . key ;
if ( ! /\d/ . test ( keyValue ) && keyValue !== "Backspace" )
event . preventDefault ( ) ;
} }
onPaste = { ( event ) = > {
event . preventDefault ( ) ;
} }
/ >
) }
2024-03-16 13:10:46 +01:00
< 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"
2024-03-20 21:53:27 +01:00
value = { developmentTime === 0 ? "" : developmentTime }
2024-03-16 13:10:46 +01:00
onChange = { ( e ) = > {
2024-03-20 21:53:27 +01:00
if ( e . target . value === "" ) {
setDevelopmentTime ( 0 ) ;
return ;
} else {
setDevelopmentTime ( parseInt ( e . target . value ) ) ;
}
2024-03-16 13:10:46 +01:00
} }
onKeyDown = { ( event ) = > {
const keyValue = event . key ;
2024-04-02 15:43:18 +02:00
if (
! /\d/ . test ( keyValue ) &&
keyValue !== "Backspace" &&
keyValue !== "ArrowLeft" &&
keyValue !== "ArrowRight"
)
2024-03-16 13:10:46 +01:00
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"
2024-03-20 21:53:27 +01:00
value = { meetingTime === 0 ? "" : meetingTime }
2024-03-16 13:10:46 +01:00
onChange = { ( e ) = > {
2024-03-20 21:53:27 +01:00
if ( e . target . value === "" ) {
setMeetingTime ( 0 ) ;
return ;
} else {
setMeetingTime ( parseInt ( e . target . value ) ) ;
}
2024-03-16 13:10:46 +01:00
} }
onKeyDown = { ( event ) = > {
const keyValue = event . key ;
2024-04-02 15:43:18 +02:00
if (
! /\d/ . test ( keyValue ) &&
keyValue !== "Backspace" &&
keyValue !== "ArrowLeft" &&
keyValue !== "ArrowRight"
)
2024-03-16 13:10:46 +01:00
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"
2024-03-20 21:53:27 +01:00
value = { adminTime === 0 ? "" : adminTime }
2024-03-16 13:10:46 +01:00
onChange = { ( e ) = > {
2024-03-20 21:53:27 +01:00
if ( e . target . value === "" ) {
setAdminTime ( 0 ) ;
return ;
} else {
setAdminTime ( parseInt ( e . target . value ) ) ;
}
2024-03-16 13:10:46 +01:00
} }
onKeyDown = { ( event ) = > {
const keyValue = event . key ;
2024-04-02 15:43:18 +02:00
if (
! /\d/ . test ( keyValue ) &&
keyValue !== "Backspace" &&
keyValue !== "ArrowLeft" &&
keyValue !== "ArrowRight"
)
2024-03-16 13:10:46 +01:00
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"
2024-03-20 21:53:27 +01:00
value = { ownWorkTime === 0 ? "" : ownWorkTime }
2024-03-16 13:10:46 +01:00
onChange = { ( e ) = > {
2024-03-20 21:53:27 +01:00
if ( e . target . value === "" ) {
setOwnWorkTime ( 0 ) ;
return ;
} else {
setOwnWorkTime ( parseInt ( e . target . value ) ) ;
}
2024-03-16 13:10:46 +01:00
} }
onKeyDown = { ( event ) = > {
const keyValue = event . key ;
2024-04-02 15:43:18 +02:00
if (
! /\d/ . test ( keyValue ) &&
keyValue !== "Backspace" &&
keyValue !== "ArrowLeft" &&
keyValue !== "ArrowRight"
)
2024-03-16 13:10:46 +01:00
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"
2024-03-20 21:53:27 +01:00
value = { studyTime === 0 ? "" : studyTime }
2024-03-16 13:10:46 +01:00
onChange = { ( e ) = > {
2024-03-20 21:53:27 +01:00
if ( e . target . value === "" ) {
setStudyTime ( 0 ) ;
return ;
} else {
setStudyTime ( parseInt ( e . target . value ) ) ;
}
2024-03-16 13:10:46 +01:00
} }
onKeyDown = { ( event ) = > {
const keyValue = event . key ;
2024-04-02 15:43:18 +02:00
if (
! /\d/ . test ( keyValue ) &&
keyValue !== "Backspace" &&
keyValue !== "ArrowLeft" &&
keyValue !== "ArrowRight"
)
2024-03-16 13:10:46 +01:00
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"
2024-03-20 21:53:27 +01:00
value = { testingTime === 0 ? "" : testingTime }
2024-03-16 13:10:46 +01:00
onChange = { ( e ) = > {
2024-03-20 21:53:27 +01:00
if ( e . target . value === "" ) {
setTestingTime ( 0 ) ;
return ;
} else {
setTestingTime ( parseInt ( e . target . value ) ) ;
}
2024-03-16 13:10:46 +01:00
} }
onKeyDown = { ( event ) = > {
const keyValue = event . key ;
2024-04-02 15:43:18 +02:00
if (
! /\d/ . test ( keyValue ) &&
keyValue !== "Backspace" &&
keyValue !== "ArrowLeft" &&
keyValue !== "ArrowRight"
)
2024-03-16 13:10:46 +01:00
event . preventDefault ( ) ;
} }
/ >
< / td >
< / tr >
< / tbody >
< / table >
< Button
text = "Submit"
onClick = { ( ) : void = > {
return ;
} }
type = "submit"
/ >
< / div >
< / form >
2024-03-14 13:21:19 +01:00
< / div >
< / >
) ;
}