All files / components/Courses CoursesTable.jsx

100% Statements 81/81
100% Branches 10/10
100% Functions 7/7
100% Lines 81/81

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 1111x 1x 1x 1x       1x 1x       1x 1x   1x 36x 36x 36x 36x 36x 36x   36x   36x 2x 2x   36x 36x 36x 36x     36x 5x 5x 5x   36x 2x 2x 2x   36x 36x 36x 36x 36x 36x 36x 36x 36x 36x 36x 36x 36x 36x 36x 36x 36x 36x   36x 36x 36x 36x 36x   36x 25x 11x   36x 36x 36x 36x 36x   36x 36x   36x 36x 36x 36x 36x 36x 36x     36x 36x 36x 36x 36x             36x 36x 36x 36x     36x  
import React, { useState } from "react";
import Button from "react-bootstrap/Button";
import Modal from "react-bootstrap/Modal";
import OurTable, {
  ButtonColumn,
  HrefButtonColumn,
} from "main/components/OurTable";
import { useBackendMutation } from "main/utils/useBackend";
import {
  cellToAxiosParamsDelete,
  onDeleteSuccess,
} from "main/utils/courseUtils";
import { useNavigate } from "react-router";
import { hasRole } from "main/utils/currentUser";
 
export default function CoursesTable({
  courses,
  currentUser,
  testid = "CoursesTable",
}) {
  const [showModal, setShowModal] = useState(false);
  const [cellToDelete, setCellToDelete] = useState(null);
 
  const navigate = useNavigate();
 
  const editCallback = (cell) => {
    navigate(`/admin/editcourses/${cell.row.values.id}`);
  };
 
  const deleteMutation = useBackendMutation(
    cellToAxiosParamsDelete,
    { onSuccess: onDeleteSuccess },
    ["/api/course/all"],
  );
 
  const deleteCallback = async (cell) => {
    setCellToDelete(cell);
    setShowModal(true);
  };
 
  const confirmDelete = async (cell) => {
    deleteMutation.mutate(cell);
    setShowModal(false);
  };
 
  const columns = [
    {
      Header: "id",
      accessor: "id",
    },
    {
      Header: "Code",
      accessor: "code",
    },
    {
      Header: "Name",
      accessor: "name",
    },
    {
      Header: "Term",
      accessor: "term",
    },
  ];
 
  const columnsIfAdmin = [
    ...columns,
    ButtonColumn("Edit", "primary", editCallback, testid),
    ButtonColumn("Delete", "danger", deleteCallback, testid),
  ];
 
  const columnsToDisplay = hasRole(currentUser, "ROLE_ADMIN")
    ? columnsIfAdmin
    : columns;
 
  const coursesModal = (
    <Modal
      data-testid="CoursesTable-Modal"
      show={showModal}
      onHide={() => setShowModal(false)}
    >
      <Modal.Header closeButton>
        <Modal.Title>Confirm Deletion</Modal.Title>
      </Modal.Header>
      <Modal.Body>Are you sure you want to delete this course?</Modal.Body>
      <Modal.Footer>
        <Button
          variant="secondary"
          data-testid="CoursesTable-Modal-Cancel"
          onClick={() => setShowModal(false)}
        >
          Keep this Course
        </Button>
        <Button
          variant="danger"
          data-testid="CoursesTable-Modal-Delete"
          onClick={() => confirmDelete(cellToDelete)}
        >
          Permanently Delete
        </Button>
      </Modal.Footer>
    </Modal>
  );
 
  return (
    <>
      <OurTable data={courses} columns={columnsToDisplay} testid={testid} />
      {hasRole(currentUser, "ROLE_ADMIN") && coursesModal}
    </>
  );
}