github.com/quickfeed/quickfeed@v0.0.0-20240507093252-ed8ca812a09c/public/src/components/ManageSubmissionStatus.tsx (about) 1 import React from "react" 2 import { Submission_Status } from "../../proto/qf/types_pb" 3 import { Color, isManuallyGraded } from "../Helpers" 4 import { useActions, useAppState } from "../overmind" 5 import { ButtonType } from "./admin/Button" 6 import DynamicButton from "./DynamicButton" 7 8 const ManageSubmissionStatus = (): JSX.Element => { 9 const actions = useActions() 10 const state = useAppState() 11 const assignment = state.selectedAssignment 12 13 const [rebuilding, setRebuilding] = React.useState(false) 14 const [updating, setUpdating] = React.useState<Submission_Status>(Submission_Status.NONE) 15 16 17 const handleRebuild = async () => { 18 if (rebuilding) { return } // Don't allow multiple rebuilds at once 19 setRebuilding(true) 20 await actions.rebuildSubmission({ owner: state.submissionOwner, submission: state.selectedSubmission }) 21 setRebuilding(false) 22 } 23 24 const handleSetStatus = async (status: Submission_Status) => { 25 if (updating !== Submission_Status.NONE) { return } // Don't allow multiple updates at once 26 setUpdating(status) 27 await actions.updateSubmission({ owner: state.submissionOwner, submission: state.selectedSubmission, status }) 28 setUpdating(Submission_Status.NONE) 29 } 30 31 const getButtonType = (status: Submission_Status): ButtonType => { 32 if (state.selectedSubmission?.status === status) { 33 return ButtonType.BUTTON 34 } 35 return ButtonType.OUTLINE 36 } 37 38 return ( 39 <div className="row m-auto"> 40 <DynamicButton 41 text="Approve" 42 color={Color.GREEN} 43 type={getButtonType(Submission_Status.APPROVED)} 44 className="col mr-2" 45 onClick={() => handleSetStatus(Submission_Status.APPROVED)} 46 /> 47 <DynamicButton 48 text="Revision" 49 color={Color.YELLOW} 50 type={getButtonType(Submission_Status.REVISION)} 51 className="col mr-2" 52 onClick={() => handleSetStatus(Submission_Status.REVISION)} 53 /> 54 <DynamicButton 55 text="Reject" 56 color={Color.RED} 57 type={getButtonType(Submission_Status.REJECTED)} 58 className="col mr-2" 59 onClick={() => handleSetStatus(Submission_Status.REJECTED)} 60 /> 61 {assignment && !isManuallyGraded(assignment) && ( 62 <DynamicButton 63 text={rebuilding ? "Rebuilding..." : "Rebuild"} 64 color={Color.BLUE} 65 type={ButtonType.OUTLINE} 66 className="col mr-2" 67 onClick={handleRebuild} 68 /> 69 )} 70 </div> 71 ) 72 } 73 74 export default ManageSubmissionStatus