From 45813d85413d613a59c35cb12e916acbd6f174ad Mon Sep 17 00:00:00 2001
From: IceTeaXXD <13521024@std.stei.itb.ac.id>
Date: Tue, 14 Nov 2023 22:58:34 +0700
Subject: [PATCH] feat: edit assignment modal

---
 src/components/Assignment/AssignmentCards.tsx |  56 +++---
 .../Assignment/AssignmentDetails.tsx          |   3 +
 .../Assignment/EditAssignmentModal.tsx        | 175 ++++++++++++++++++
 3 files changed, 213 insertions(+), 21 deletions(-)
 create mode 100644 src/components/Assignment/EditAssignmentModal.tsx

diff --git a/src/components/Assignment/AssignmentCards.tsx b/src/components/Assignment/AssignmentCards.tsx
index de6b900..320bd5d 100644
--- a/src/components/Assignment/AssignmentCards.tsx
+++ b/src/components/Assignment/AssignmentCards.tsx
@@ -13,7 +13,8 @@ import {
 import React from "react"
 import { FiEdit } from "react-icons/fi"
 import { Link } from "react-router-dom"
-import { DeleteAssignmentDialog } from "./DeletAssignmentDialog"
+import { DeleteAssignmentDialog } from "./DeleteAssignmentDialog"
+import { EditAssignmentModal } from "./EditAssignmentModal"
 
 export interface AssignmentCardsProps {
   index: Number
@@ -22,6 +23,7 @@ export interface AssignmentCardsProps {
   assignment_name: string
   assignment_description: string
   onDeleteSuccess: () => void
+  onEditSuccess: () => void
 }
 
 export const AssignmentCards = ({
@@ -30,15 +32,22 @@ export const AssignmentCards = ({
   assignment_id,
   assignment_name,
   assignment_description,
-  onDeleteSuccess
+  onDeleteSuccess,
+  onEditSuccess
 }: AssignmentCardsProps) => {
   // TODO: SET THE APPLICANTS AND SUBMSISSIONS @MATTHEW MAHENDRA
   const [applicants, setApplicants] = React.useState(0)
   const [submissions, setSubmissions] = React.useState(0)
-  const [isOpen, setIsOpen] = React.useState(false)
-  const onClose = () => setIsOpen(false)
-  const onDelete = () => {
-    setIsOpen(true)
+  const [isOpenEditAssignment, setIsOpenEditAssignment] = React.useState(false)
+  const [isOpenDeleteAssignment, setIsOpenDeleteAssignment] =
+    React.useState(false)
+  const onCloseEditAssignment = () => setIsOpenEditAssignment(false)
+  const onCloseDeleteAssignment = () => setIsOpenDeleteAssignment(false)
+  const onEditAssignment = () => {
+    setIsOpenEditAssignment(true)
+  }
+  const onDeleteAssignment = () => {
+    setIsOpenDeleteAssignment(true)
   }
 
   return (
@@ -98,31 +107,36 @@ export const AssignmentCards = ({
               />
             </Tooltip>
           </Link>
-          <Link
-            to={`/scholarships/${scholarship_id}/assignments/${assignment_id}/edit`}
-          >
-            <Tooltip label="Edit Assignment" aria-label="A tooltip">
-              <IconButton
-                aria-label="Edit Assignment"
-                icon={<Icon as={FiEdit} />}
-                colorScheme="blue"
-                size="sm"
-              />
-            </Tooltip>
-          </Link>
+          <Tooltip label="Edit Assignment" aria-label="A tooltip">
+            <IconButton
+              aria-label="Edit Assignment"
+              icon={<Icon as={FiEdit} />}
+              colorScheme="blue"
+              size="sm"
+              onClick={onEditAssignment}
+            />
+          </Tooltip>
           <Tooltip label="Delete Assignment" aria-label="A tooltip">
             <IconButton
               aria-label="Delete Assignment"
               icon={<DeleteIcon />}
               colorScheme="red"
               size="sm"
-              onClick={onDelete}
+              onClick={onDeleteAssignment}
             />
           </Tooltip>
 
+          <EditAssignmentModal
+            isOpen={isOpenEditAssignment}
+            onClose={onCloseEditAssignment}
+            scholarship_id={scholarship_id}
+            assignment_id={assignment_id}
+            onEditSuccess={onEditSuccess}
+          />
+
           <DeleteAssignmentDialog
-            isOpen={isOpen}
-            onClose={onClose}
+            isOpen={isOpenDeleteAssignment}
+            onClose={onCloseDeleteAssignment}
             scholarship_id={scholarship_id}
             assignment_id={assignment_id}
             onDeleteSuccess={onDeleteSuccess}
diff --git a/src/components/Assignment/AssignmentDetails.tsx b/src/components/Assignment/AssignmentDetails.tsx
index adca44a..9349c7b 100644
--- a/src/components/Assignment/AssignmentDetails.tsx
+++ b/src/components/Assignment/AssignmentDetails.tsx
@@ -65,6 +65,9 @@ const AssignmentDetails = () => {
               onDeleteSuccess={() => {
                 setShouldFetchAssignments(true)
               }}
+              onEditSuccess={() => {
+                setShouldFetchAssignments(true)
+              }}
             />
           ))
         ) : (
diff --git a/src/components/Assignment/EditAssignmentModal.tsx b/src/components/Assignment/EditAssignmentModal.tsx
new file mode 100644
index 0000000..b682e51
--- /dev/null
+++ b/src/components/Assignment/EditAssignmentModal.tsx
@@ -0,0 +1,175 @@
+/* eslint-disable react-hooks/exhaustive-deps */
+import React, { useEffect } from "react"
+import {
+  Button,
+  FormControl,
+  FormErrorMessage,
+  FormLabel,
+  Icon,
+  Input,
+  Modal,
+  ModalBody,
+  ModalCloseButton,
+  ModalContent,
+  ModalFooter,
+  ModalHeader,
+  ModalOverlay,
+  Textarea
+} from "@chakra-ui/react"
+import axios from "axios"
+import { Form, Formik, Field } from "formik"
+import { FiEdit } from "react-icons/fi"
+interface EditAssignmentModalProps {
+  isOpen: boolean
+  onClose: () => void
+  scholarship_id: Number
+  assignment_id: Number
+  onEditSuccess: () => void
+}
+
+export const EditAssignmentModal: React.FC<EditAssignmentModalProps> = ({
+  isOpen,
+  onClose,
+  scholarship_id,
+  assignment_id,
+  onEditSuccess
+}) => {
+  const [assignmentName, setAssignmentName] = React.useState("")
+  const [assignmentDescription, setAssignmentDescription] = React.useState("")
+
+  async function GetAssignment() {
+    try {
+      const URL =
+        process.env.REACT_APP_API_URL +
+        "/api/assignment/" +
+        scholarship_id +
+        "/" +
+        assignment_id
+      const response = await axios.get(URL)
+      console.log(response)
+      setAssignmentName(response.data.data.assignment_name)
+      setAssignmentDescription(response.data.data.assignment_description)
+    } catch (error) {
+      console.error("Error fetching assignment:", error)
+    }
+  }
+
+  async function EditAssignment() {
+    try {
+      const URL =
+        process.env.REACT_APP_API_URL +
+        "/api/assignment/" +
+        scholarship_id +
+        "/" +
+        assignment_id
+      const response = await axios.patch(URL, {
+        name: assignmentName,
+        desc: assignmentDescription
+      })
+      console.log(response)
+      onClose()
+      onEditSuccess()
+    } catch (error) {
+      console.error("Error deleting assignment:", error)
+    }
+  }
+
+  function validateField(value: any) {
+    if (!value) {
+      return "Field is required"
+    }
+  }
+
+  // when the modal is opened, fetch the assignment
+  useEffect(() => {
+    if (isOpen) {
+      GetAssignment()
+    }
+  }, [isOpen])
+
+  return (
+    <Modal isOpen={isOpen} onClose={onClose}>
+      <Formik
+        initialValues={{
+          name: assignmentName,
+          description: assignmentDescription
+        }}
+        onSubmit={(values, actions) => {
+          EditAssignment()
+          actions.setSubmitting(false)
+        }}
+      >
+        {(props) => (
+          <Form>
+            <ModalOverlay />
+            <ModalContent>
+              <ModalHeader>Edit Assignment</ModalHeader>
+              <ModalCloseButton />
+              <ModalBody pb={6}>
+                <Field name="name" validate={validateField}>
+                  {({ field, form }: any) => (
+                    <FormControl
+                      isInvalid={form.errors.name && form.touched.name}
+                    >
+                      <FormLabel htmlFor="name">Assignment Name</FormLabel>
+                      <Input
+                        {...field}
+                        id="name"
+                        placeholder="Assignment Name"
+                        onChange={(e) => {
+                          setAssignmentName(e.target.value)
+                        }}
+                        value={assignmentName}
+                      />
+                      <FormErrorMessage>{form.errors.name}</FormErrorMessage>
+                    </FormControl>
+                  )}
+                </Field>
+
+                <Field name="description" validate={validateField}>
+                  {({ field, form }: any) => (
+                    <FormControl
+                      isInvalid={
+                        form.errors.description && form.touched.description
+                      }
+                    >
+                      <FormLabel htmlFor="description">
+                        Assignment Description
+                      </FormLabel>
+                      <Textarea
+                        {...field}
+                        id="description"
+                        placeholder="Assignment Description"
+                        onChange={(e) => {
+                          setAssignmentDescription(e.target.value)
+                        }}
+                        value={assignmentDescription}
+                      />
+                      <FormErrorMessage>
+                        {form.errors.description}
+                      </FormErrorMessage>
+                    </FormControl>
+                  )}
+                </Field>
+              </ModalBody>
+
+              <ModalFooter>
+                <Button
+                  colorScheme="blue"
+                  mr={3}
+                  onClick={() => {
+                    props.handleSubmit()
+                  }}
+                  leftIcon={<Icon as={FiEdit} />}
+                >
+                  Edit
+                </Button>
+                <Button onClick={onClose}>Cancel</Button>
+              </ModalFooter>
+            </ModalContent>
+          </Form>
+        )}
+      </Formik>
+    </Modal>
+  )
+}
-- 
GitLab