diff --git a/apps/searchneu/app/api/scheduler/saved-plans/route.ts b/apps/searchneu/app/api/scheduler/saved-plans/route.ts index e89fc15f..9e695a74 100644 --- a/apps/searchneu/app/api/scheduler/saved-plans/route.ts +++ b/apps/searchneu/app/api/scheduler/saved-plans/route.ts @@ -55,6 +55,11 @@ export async function POST(req: NextRequest) { } try { + const term = await getTerm(body.term); + if (!term) { + return Response.json({ error: "term not found" }, { status: 400 }); + } + // Auto-generate name if not provided let planName = body.name; if (!planName) { @@ -62,19 +67,11 @@ export async function POST(req: NextRequest) { .select() .from(savedPlansT) .where( - and( - eq(savedPlansT.userId, user.id), - eq(savedPlansT.termId, parseInt(body.term, 10)), - ), + and(eq(savedPlansT.userId, user.id), eq(savedPlansT.termId, term.id)), ); planName = `Plan ${existingPlans.length + 1}`; } - const term = await getTerm(body.term); - if (!term) { - return Response.json({ error: "term not found" }, { status: 400 }); - } - // Create the saved plan const [savedPlan] = await db .insert(savedPlansT) diff --git a/apps/searchneu/components/scheduler/generator/SchedulerWrapper.tsx b/apps/searchneu/components/scheduler/generator/SchedulerWrapper.tsx index 9f6fc6c0..2cf93dcb 100644 --- a/apps/searchneu/components/scheduler/generator/SchedulerWrapper.tsx +++ b/apps/searchneu/components/scheduler/generator/SchedulerWrapper.tsx @@ -12,7 +12,7 @@ import { getScheduleKey } from "@/lib/scheduler/scheduleKey"; import { SchedulerView } from "./calendar/SchedulerView"; import { ScheduleSidebar } from "./right-sidebar/ScheduleSidebar"; import { FilterPanel } from "./left-sidebar/FilterPanel"; -import { GroupedTerms, Campus, Nupath } from "@/lib/catalog/types"; +import { GroupedTerms, Campus, Nupath, Term } from "@/lib/catalog/types"; import { PlanData, PlanCourse, @@ -44,6 +44,7 @@ export function SchedulerWrapper({ // Store the plan ID from when we save the plan initially const [planId, setPlanId] = useState(null); const [planName, setPlanName] = useState("Plan"); + const [currentTerm, setCurrentTerm] = useState(terms.neu[0]); const searchParams = useSearchParams(); const planIdFromUrl = searchParams.get("planId"); @@ -138,6 +139,16 @@ export function SchedulerWrapper({ setPlanId(planIdNum); setPlanName(planData.name); + // Find and set the current term by termId + if (planData.termId) { + // Search through the already-loaded terms prop to find matching term + const foundTerm = Object.values(terms).flat() as Term[]; + const matchingTerm = foundTerm.find((t) => t.id === planData.termId); + if (matchingTerm) { + setCurrentTerm(matchingTerm); + } + } + // Extract locked courses and hidden sections from saved plan const lockedCourseIds: Set = new Set(); const hiddenSectionIds: Set = new Set(); @@ -623,6 +634,7 @@ export function SchedulerWrapper({ lockedCourseIds={filters.lockedCourseIds ?? new Set()} onLockedCourseIdsChange={handleLockedCourseIdsChange} planId={planIdFromUrl ? parseInt(planIdFromUrl) : undefined} + currentTerm={currentTerm} onSchedulesGenerated={onSchedulesGenerated} /> diff --git a/apps/searchneu/components/scheduler/generator/left-sidebar/FilterPanel.tsx b/apps/searchneu/components/scheduler/generator/left-sidebar/FilterPanel.tsx index 247c4148..810b696d 100644 --- a/apps/searchneu/components/scheduler/generator/left-sidebar/FilterPanel.tsx +++ b/apps/searchneu/components/scheduler/generator/left-sidebar/FilterPanel.tsx @@ -10,7 +10,7 @@ import { import { CoursesTab } from "./CoursesTab"; import { FiltersTab } from "./FiltersTab"; import AddCoursesModal from "../../shared/modal/AddCoursesModal"; -import { GroupedTerms } from "@/lib/catalog/types"; +import { GroupedTerms, Term } from "@/lib/catalog/types"; interface FilterPanelProps { filters: ScheduleFilters; @@ -23,6 +23,7 @@ interface FilterPanelProps { lockedCourseIds: Set; onLockedCourseIdsChange: (ids: Set) => void; planId?: number; + currentTerm?: Term | null; onSchedulesGenerated?: () => void; } @@ -39,6 +40,7 @@ export function FilterPanel({ lockedCourseIds, onLockedCourseIdsChange, planId, + currentTerm, onSchedulesGenerated, }: FilterPanelProps) { const { openFeedback } = useFeedback(); @@ -52,7 +54,7 @@ export function FilterPanel({ open={isModalOpen} closeFn={() => setIsModalOpen(false)} terms={terms} - selectedTerm={null} + selectedTerm={currentTerm || null} planId={planId} callback={onSchedulesGenerated} /> diff --git a/apps/searchneu/components/scheduler/shared/modal/AddCoursesModal.tsx b/apps/searchneu/components/scheduler/shared/modal/AddCoursesModal.tsx index 45a51435..2cb3da50 100644 --- a/apps/searchneu/components/scheduler/shared/modal/AddCoursesModal.tsx +++ b/apps/searchneu/components/scheduler/shared/modal/AddCoursesModal.tsx @@ -339,10 +339,7 @@ export default function AddCoursesModal(props: AddCoursesModalProps) {