All files / pages/Admin CoursesIndexPage.jsx

100% Statements 61/61
100% Branches 5/5
100% Functions 5/5
100% Lines 61/61

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 811x 1x   1x 1x 1x 1x 1x 1x   1x 9x   9x 9x 9x 9x 9x 9x 9x 9x 9x     9x   9x 1x 1x 1x 1x 1x 1x 1x 1x   9x 1x 1x 1x   9x 9x 9x 9x 9x     9x 1x 1x   9x   9x 9x 9x 9x 9x 9x 9x 9x 9x     9x 9x 9x 9x   9x 9x 9x 9x 9x         9x  
import React from "react";
import { useBackend, useBackendMutation } from "main/utils/useBackend";
 
import BasicLayout from "main/layouts/BasicLayout/BasicLayout";
import InstructorCoursesTable from "main/components/Courses/InstructorCoursesTable";
import { useCurrentUser } from "main/utils/currentUser";
import { Button } from "react-bootstrap";
import { toast } from "react-toastify";
import CourseModal from "main/components/Courses/CourseModal";
 
export default function CoursesIndexPage() {
  const currentUser = useCurrentUser();
 
  const {
    data: courses,
    error: _error,
    status: _status,
  } = useBackend(
    ["/api/courses/allForAdmins"],
    { method: "GET", url: "/api/courses/allForAdmins" },
    // Stryker disable next-line all : don't test default value of empty list
    [],
  );
 
  const [viewModal, setViewModal] = React.useState(false);
 
  const objectToAxiosParams = (course) => ({
    url: "/api/courses/post",
    method: "POST",
    params: {
      courseName: course.courseName,
      term: course.term,
      school: course.school,
    },
  });
 
  const onSuccess = (course) => {
    toast(`Course ${course.courseName} created`);
    setViewModal(false);
  };
 
  const mutation = useBackendMutation(
    objectToAxiosParams,
    { onSuccess },
    // Stryker disable next-line all : hard to set up test for caching
    ["/api/courses/allForAdmins"],
  );
 
  const onSubmit = async (data) => {
    mutation.mutate(data);
  };
 
  const createCourse = () => setViewModal(true);
 
  return (
    <BasicLayout>
      <div className="pt-2">
        <h1>Courses</h1>
        <Button
          onClick={createCourse}
          style={{ float: "right", marginBottom: 10 }}
          variant="primary"
        >
          Create Course
        </Button>
        <CourseModal
          showModal={viewModal}
          toggleShowModal={setViewModal}
          onSubmitAction={onSubmit}
        />
        <InstructorCoursesTable
          courses={courses}
          currentUser={currentUser}
          enableInstructorUpdate={true}
          deleteCourseButton={true}
        />
      </div>
    </BasicLayout>
  );
}