All files / pages/PersonalSchedules PersonalSchedulesEditPage.js

100% Statements 18/18
100% Branches 4/4
100% Functions 5/5
100% Lines 17/17

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 111 112 113                      34x 32x             34x 34x           33x                                 33x                     33x                           33x 1x     1x     33x             33x   33x 1x     33x 1x     32x                                        
import BasicLayout from "main/layouts/BasicLayout/BasicLayout";
import { useParams } from "react-router-dom";
import PersonalScheduleForm from "main/components/PersonalSchedules/PersonalScheduleForm";
import CourseTable from "main/components/Courses/CourseTable";
import { Navigate } from "react-router-dom";
import { useBackend, useBackendMutation } from "main/utils/useBackend";
import { toast } from "react-toastify";
import { useCurrentUser } from "main/utils/currentUser";
import { Button } from "react-bootstrap";
 
export default function PersonalSchedulesEditPage() {
  const createButton = () => {
    return (
      <Button variant="primary" href="/personalschedules/list" style={{}}>
        Back
      </Button>
    );
  };
 
  let { id } = useParams();
  const currentUser = useCurrentUser();
 
  const {
    data: personalSchedule,
    _error,
    _status,
  } = useBackend(
    // Stryker disable next-line all : don't test internal caching of React Query
    [`/api/personalschedules?id=${id}`],
    {
      // Stryker disable next-line all : GET is the default, so changing this to "" doesn't introduce a bug
      method: "GET",
      url: `/api/personalschedules`,
      params: {
        id,
      },
    },
  );
 
  const {
    data: courses,
    error: _PCerror,
    status: _PCstatus,
  } = useBackend(
    // Stryker disable next-line all : don't test internal caching of React Query
    [`/api/courses/user/psid/all?psId=${id}`],
    {
      // Stryker disable next-line StringLiteral : GET is default, so replacing with "" is an equivalent mutation
      method: "GET",
      url: `/api/courses/user/psid/all?psId=${id}`,
    },
    [],
  );
 
  const objectToAxiosParams = (personalSchedule) => ({
    url: "/api/personalschedules",
    method: "PUT",
    params: {
      id: personalSchedule.id,
    },
    data: {
      user: personalSchedule.user,
      name: personalSchedule.name,
      description: personalSchedule.description,
      quarter: personalSchedule.quarter,
    },
  });
 
  const onSuccess = (personalSchedule) => {
    toast(
      `PersonalSchedule Updated - id: ${personalSchedule.id} name: ${personalSchedule.name}`,
    );
    console.log(personalSchedule.quarter);
  };
 
  const mutation = useBackendMutation(
    objectToAxiosParams,
    { onSuccess },
    // Stryker disable next-line all : hard to set up test for caching
    [`/api/personalschedules/id=${id}`],
  );
 
  const { isSuccess } = mutation;
 
  const onSubmit = async (data) => {
    mutation.mutate(data);
  };
 
  if (isSuccess) {
    return <Navigate to="/personalschedules/list" />;
  }
 
  return (
    <BasicLayout>
      <div className="pt-2">
        <h1>Edit Personal Schedule</h1>
        {createButton()}
        {personalSchedule && (
          <PersonalScheduleForm
            submitAction={onSubmit}
            buttonLabel={"Update"}
            initialPersonalSchedule={personalSchedule}
          />
        )}
        <p className="py-5">
          <h1>Courses</h1>
          <CourseTable courses={courses} currentUser={currentUser} />
        </p>
      </div>
    </BasicLayout>
  );
}