diff --git a/packages/frontend/components/Plan/ErrorModalError.tsx b/packages/frontend/components/Plan/ErrorModalError.tsx new file mode 100644 index 000000000..00afdb944 --- /dev/null +++ b/packages/frontend/components/Plan/ErrorModalError.tsx @@ -0,0 +1,70 @@ +import { ChevronDownIcon, ChevronUpIcon, WarningIcon } from "@chakra-ui/icons"; +import { Box, Flex, Text, Collapse } from "@chakra-ui/react"; +import { useState } from "react"; + +interface ErrorModalErrorProps { + title: string; + message: string; +} + +export const ErrorModalError: React.FC = ({ + title, + message, +}) => { + const [opened, setOpened] = useState(false); + + return ( + + setOpened(!opened)} + direction="row" + justifyContent="space-between" + alignItems="flex-start" + height="45px" + color="black" + fontWeight="bold" + p="sm" + position="sticky" + top="0px" + zIndex={1} + > + + + + + {title} + + + + + + {opened ? ( + + ) : ( + + )} + + + + + + {message} + + + + ); +}; diff --git a/packages/frontend/components/Plan/ReqErrorModal.tsx b/packages/frontend/components/Plan/ReqErrorModal.tsx index b32d99559..075cad284 100644 --- a/packages/frontend/components/Plan/ReqErrorModal.tsx +++ b/packages/frontend/components/Plan/ReqErrorModal.tsx @@ -16,6 +16,7 @@ import { INEUReqCourseError, INEUReqError, ScheduleCourse2, + ScheduleTerm2, } from "@graduate/common"; import { HelperToolTip } from "../Help"; import { @@ -25,22 +26,35 @@ import { import { useFetchCourse } from "../../hooks"; import { GraduateToolTip } from "../GraduateTooltip"; import { SetStateAction } from "react"; +import { ErrorModalError } from "./"; interface ReqErrorModalProps { setHovered: (isHovered: SetStateAction) => void; course: ScheduleCourse2; + term?: ScheduleTerm2; preReqErr?: INEUReqError; coReqErr?: INEUReqError; } export const ReqErrorModal: React.FC = ({ course, + term, setHovered, coReqErr = undefined, preReqErr = undefined, }) => { const { isOpen, onOpen, onClose } = useDisclosure(); + const err = + course.name === "Co-op Education" && + term !== undefined && + (term.id === "1-FL" || term.id === "4-SP"); + let msg = "This is an error."; + if (err && term.id === "1-FL") { + msg = "You may only register a co-op in your second year and beyond."; + } else if (err && term.id === "4-Sp") { + msg = "You cannot register a co-op in your last semester."; + } return ( = ({ )} - {preReqErr && ( + {(preReqErr || err) && ( = ({ )} + {err && ( + + )} diff --git a/packages/frontend/components/Plan/ScheduleTerm.tsx b/packages/frontend/components/Plan/ScheduleTerm.tsx index 889ce8360..11919d43a 100644 --- a/packages/frontend/components/Plan/ScheduleTerm.tsx +++ b/packages/frontend/components/Plan/ScheduleTerm.tsx @@ -78,6 +78,7 @@ export const ScheduleTerm: React.FC = ({ coReqErr={termCoReqErr?.[courseToString(scheduleCourse)]} preReqErr={termPreReqErr?.[courseToString(scheduleCourse)]} scheduleCourse={scheduleCourse} + scheduleTerm={scheduleTerm} removeCourse={(course: ScheduleCourse2) => removeCourseFromTermInCurrPlan( course, diff --git a/packages/frontend/components/Plan/index.ts b/packages/frontend/components/Plan/index.ts index 559250c38..be33986ff 100644 --- a/packages/frontend/components/Plan/index.ts +++ b/packages/frontend/components/Plan/index.ts @@ -5,3 +5,4 @@ export * from "./EditPlanModal"; export * from "./DeletePlanModal"; export * from "./AddYearButton"; export * from "./TransferCourses"; +export * from "./ErrorModalError"; diff --git a/packages/frontend/components/ScheduleCourse/ScheduleCourse.tsx b/packages/frontend/components/ScheduleCourse/ScheduleCourse.tsx index 6263ddec4..9b3483715 100644 --- a/packages/frontend/components/ScheduleCourse/ScheduleCourse.tsx +++ b/packages/frontend/components/ScheduleCourse/ScheduleCourse.tsx @@ -7,6 +7,7 @@ import { INEUReqError, IRequiredCourse, ScheduleCourse2, + ScheduleTerm2, SeasonEnum, } from "@graduate/common"; import { forwardRef, PropsWithChildren, useEffect, useState } from "react"; @@ -23,6 +24,7 @@ import { GraduateToolTip } from "../GraduateTooltip"; interface DraggableScheduleCourseProps { scheduleCourse: ScheduleCourse2; + scheduleTerm?: ScheduleTerm2; coReqErr?: INEUReqError; preReqErr?: INEUReqError; isInSidebar?: boolean; @@ -40,6 +42,7 @@ export const DraggableScheduleCourse: React.FC< DraggableScheduleCourseProps > = ({ scheduleCourse, + scheduleTerm, removeCourse, preReqErr = undefined, coReqErr = undefined, @@ -68,6 +71,7 @@ export const DraggableScheduleCourse: React.FC< preReqErr={preReqErr} ref={setNodeRef} scheduleCourse={scheduleCourse} + scheduleTerm={scheduleTerm} removeCourse={removeCourse} isInSidebar={isInSidebar} isChecked={isChecked} @@ -186,6 +190,7 @@ const ScheduleCourse = forwardRef( coReqErr = undefined, preReqErr = undefined, scheduleCourse, + scheduleTerm, removeCourse, isInSidebar = false, isChecked = false, @@ -202,7 +207,13 @@ const ScheduleCourse = forwardRef( ) => { const [hovered, setHovered] = useState(false); const isValidRemove = isRemove && !isFromSidebar; - const isCourseError = coReqErr !== undefined || preReqErr !== undefined; + const isCourseError = + coReqErr !== undefined || + preReqErr !== undefined || + // hard coded co-op error for now + (scheduleCourse.name === "Co-op Education" && + scheduleTerm !== undefined && + (scheduleTerm.id === "1-FL" || scheduleTerm.id === "4-SP")); /* This component uses some plain HTML elements instead of Chakra @@ -253,6 +264,7 @@ const ScheduleCourse = forwardRef(