diff --git a/Dockerfile.cron b/Dockerfile.cron index 2741c6b..34e8a55 100644 --- a/Dockerfile.cron +++ b/Dockerfile.cron @@ -2,25 +2,27 @@ FROM golang:1.23-bookworm RUN useradd cronuser RUN mkdir -p /app +RUN touch /var/log/cron.log RUN chown -R cronuser /app + WORKDIR /app RUN apt update RUN apt install -y cron rsyslog -COPY --chown=cronuser:cronuser ./crontab_file /etc/cron.d/cron-scraper -RUN crontab -u cronuser /etc/cron.d/cron-scraper -RUN chmod u+s /usr/sbin/cron -COPY --chown=cronuser:cronuser ./cron-startup.sh ./cron-startup.sh +COPY ./crontab_file /etc/cron.d/cron-scraper +RUN chmod 0644 /etc/cron.d/cron-scraper +COPY ./cron-startup.sh ./cron-startup.sh USER cronuser COPY ./swatscraper/go.mod ./swatscraper/go.sum ./ RUN go mod download -COPY --chown=cronuser:cronuser ./scraper.env ./env +COPY --chown=cronuser:cronuser ./scraper.env ./.env COPY --chown=cronuser:cronuser ./swatscraper/*.go ./ RUN GOCACHE=/app/.cache CGO_ENABLED=0 GOOS=linux go build -o /app/swatscraper +USER root ENTRYPOINT ["./cron-startup.sh"] diff --git a/README.md b/README.md index 72972ff..a265aed 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,45 @@ -# Scheduler v2 +
-## Technologies Used + -- [Next.js 14](https://nextjs.org/docs/getting-started) -- [NextUI v2](https://nextui.org/) -- [Tailwind CSS](https://tailwindcss.com/) -- [Tailwind Variants](https://tailwind-variants.org) -- [TypeScript](https://www.typescriptlang.org/) -- [Framer Motion](https://www.framer.com/motion/) -- [next-themes](https://github.com/pacocoursey/next-themes) -- [Golang](https://go.dev/) +

SCCS Course Planner

+ +

The SCCS Course Planner is an all in one solution for planning your classes at Swarthmore College!

+ +![repo_last_commit] +[![License][repo_license_img]][repo_license_url] +![repo_size] +![build_status] -### Install dependencies +

Looking to plan your classes? Visit the live site!

+
-Install [Golang](https://go.dev/dl/) +## 🏁 Getting Started -Install [NodeJS](https://nodejs.org/en) v18.18 or higher +### Install + + ### Clone the Repo(recursivly!) + ```bash git clone --recursive https://github.com/swat-sccs/scheduler-v2.git + git checkout dev cd scheduler-v2 ``` ### Configure your .env file + Paste the following into a .env in the root of the project. + ```env DATABASE_URL="postgresql://postgres:example@localhost:5432/scheduler_db" @@ -42,30 +57,40 @@ first run only: ```bash go mod init github.com/swatscraper go mod tidy -``` - -```bash go run main.go -semester=spring -year=2025 # Change to semester of choice - ``` - - ### View the dev site Head on over to http://localhost:3000 - - ### (Optional) View the database visually and in the browser! ```bash npx prisma studio ``` -Head on over to http://localhost:5555. Use this to confirm your database is populated. +Head on over to http://localhost:5555. Use this to confirm your database is populated. +### 📡 Technologies in Use + +- [Next.js 14](https://nextjs.org/docs/getting-started) +- [NextUI v2](https://nextui.org/) +- [Tailwind CSS](https://tailwindcss.com/) +- [Tailwind Variants](https://tailwind-variants.org) +- [TypeScript](https://www.typescriptlang.org/) +- [Framer Motion](https://www.framer.com/motion/) +- [next-themes](https://github.com/pacocoursey/next-themes) +- [Golang](https://go.dev/) ## License Licensed under the [MIT license](https://github.com/swat-sccs/scheduler-v2/blob/main/LICENSE). + + + +[repo_license_img]: https://img.shields.io/badge/license-Mit-red?style=for-the-badge&logo=none +[repo_license_url]: https://github.com/swat-sccs/scheduler-v2?tab=MIT-1-ov-file#readme +[repo_last_commit]: https://img.shields.io/github/last-commit/swat-sccs/scheduler-v2?style=for-the-badge&link=https%3A%2F%2Fgithub.com%2Fswat-sccs%2Fscheduler-v2&color=%2343AA8B +[build_status]: https://img.shields.io/github/check-runs/swat-sccs/scheduler-v2/main?style=for-the-badge&label=Build&color=%2343AA8B +[repo_size]: https://img.shields.io/github/repo-size/swat-sccs/scheduler-v2?style=for-the-badge diff --git a/app/actions/getCourses.ts b/app/actions/getCourses.ts index 36521b5..2bf561e 100644 --- a/app/actions/getCourses.ts +++ b/app/actions/getCourses.ts @@ -8,10 +8,99 @@ export async function setPlanCookie(plan: string) { (await cookies()).set("plan", plan); } -export async function getInitialCourses() { +export async function getInitialCourses( + query: any, + term: any, + dotw: any, + stime: any +) { + const startTime = stime.toString().split(",").filter(Number); + return await prisma.course.findMany({ relationLoadStrategy: "join", // or 'query' - take: 10, + take: 20, + + where: { + ...(term + ? { + year: term, + } + : {}), + //year: term, + + ...(query + ? { + OR: [ + { + courseTitle: { + search: query.trim().split(" ").join(" | "), + mode: "insensitive", + }, + }, + { + sectionAttributes: { + some: { + code: { + search: query.trim().split(" ").join(" | "), + mode: "insensitive", + }, + }, + }, + }, + { + subject: { + search: query.trim().split(" ").join(" | "), + mode: "insensitive", + }, + }, + { + courseNumber: { + search: query.trim().split(" ").join(" | "), + mode: "insensitive", + }, + }, + { + instructor: { + displayName: { + search: query.trim().split(" ").join(" | "), + mode: "insensitive", + }, + }, + }, + ], + } + : {}), + + ...(startTime.length > 0 + ? { + facultyMeet: { + meetingTimes: { + beginTime: { + in: startTime, + }, + }, + }, + } + : {}), + + ...(dotw.length > 0 + ? { + facultyMeet: { + meetingTimes: { + is: { + monday: dotw.includes("monday") ? true : Prisma.skip, + tuesday: dotw.includes("tuesday") ? true : Prisma.skip, + wednesday: dotw.includes("wednesday") ? true : Prisma.skip, + thursday: dotw.includes("thursday") ? true : Prisma.skip, + friday: dotw.includes("friday") ? true : Prisma.skip, + saturday: dotw.includes("saturday") ? true : Prisma.skip, + sunday: dotw.includes("sunday") ? true : Prisma.skip, + }, + }, + }, + } + : {}), + }, include: { sectionAttributes: true, @@ -37,6 +126,9 @@ export async function getCourses( return await prisma.course.findMany({ relationLoadStrategy: "join", // or 'query' take: take, + cursor: { + id: 1, + }, include: { sectionAttributes: true, diff --git a/app/calendar/page.tsx b/app/calendar/page.tsx index 03fc762..5acf8c8 100644 --- a/app/calendar/page.tsx +++ b/app/calendar/page.tsx @@ -5,123 +5,120 @@ import Calendar from "../../components/Calendar"; import prisma from "../../lib/prisma"; import { getPlanCookie } from "../actions/actions"; import { generateColorFromName } from "../../components/primitives"; -export default async function CalendarPage() { - async function getEvents() { - const output: any = []; - const planCookie: any = await getPlanCookie(); - let courses; +interface Event { + classNames: string; + textColor: string; + title: string; + daColor: string; + subject: string; + courseNumber: string; + instructor: string; + room: string; + color: string; + borderWidth: string; + daysOfWeek: (false | "0" | "1" | "2" | "3" | "4" | "5" | "6" | undefined)[]; + startTime: string; + endTime: string; +} - if (planCookie) { - const plan = await prisma.coursePlan.findUnique({ - where: { - id: parseInt(planCookie), - }, - include: { - courses: { - include: { - instructor: true, - facultyMeet: { - include: { - meetingTimes: true, - }, +async function getEvents(): Promise { + "use server"; + const output: Event[] = []; + const planCookie: any = await getPlanCookie(); + + let courses; + + if (planCookie) { + const plan = await prisma.coursePlan.findUnique({ + where: { + id: parseInt(planCookie), + }, + include: { + courses: { + include: { + instructor: true, + facultyMeet: { + include: { + meetingTimes: true, }, }, }, }, - }); + }, + }); - courses = plan?.courses; - } + courses = plan?.courses; + } - if (courses) { - for (let i = 0; i < courses.length; i++) { - const color = generateColorFromName(courses[i].subject); + if (courses) { + for (let i = 0; i < courses.length; i++) { + const color = generateColorFromName(courses[i].subject); - const num: string = courses[i].courseReferenceNumber; - const meetingTimes = await prisma.meetingTime.findFirst({ - where: { - courseReferenceNumber: num, - }, - }); + const num: string = courses[i].courseReferenceNumber; + const meetingTimes = await prisma.meetingTime.findFirst({ + where: { + courseReferenceNumber: num, + }, + }); - output.push({ - classNames: "font-sans", - textColor: "white", - title: courses[i]?.courseTitle, - daColor: color, - subject: courses[i]?.subject, - courseNumber: courses[i]?.courseNumber, - instructor: courses[i]?.instructor.displayName, - room: - courses[i]?.facultyMeet.meetingTimes.building + - " " + - courses[i]?.facultyMeet.meetingTimes.room, - color: "rgba(0,0,0,0)", + output.push({ + classNames: "font-sans", + textColor: "white", + title: courses[i]?.courseTitle, + daColor: color, + subject: courses[i]?.subject, + courseNumber: courses[i]?.courseNumber, + instructor: courses[i]?.instructor.displayName, + room: + courses[i]?.facultyMeet.meetingTimes.building + + " " + + courses[i]?.facultyMeet.meetingTimes.room, + color: "rgba(0,0,0,0)", - borderWidth: "0px", - daysOfWeek: [ - meetingTimes?.sunday && "0", - meetingTimes?.monday && "1", - meetingTimes?.tuesday && "2", - meetingTimes?.wednesday && "3", - meetingTimes?.thursday && "4", - meetingTimes?.friday && "5", - meetingTimes?.saturday && "6", - ], + borderWidth: "0px", + daysOfWeek: [ + meetingTimes?.sunday && "0", + meetingTimes?.monday && "1", + meetingTimes?.tuesday && "2", + meetingTimes?.wednesday && "3", + meetingTimes?.thursday && "4", + meetingTimes?.friday && "5", + meetingTimes?.saturday && "6", + ], - startTime: - meetingTimes?.beginTime.slice(0, 2) + - ":" + - meetingTimes?.beginTime.slice(2), - endTime: - meetingTimes?.endTime.slice(0, 2) + - ":" + - meetingTimes?.endTime.slice(2), - }); - } + startTime: + meetingTimes?.beginTime.slice(0, 2) + + ":" + + meetingTimes?.beginTime.slice(2), + endTime: + meetingTimes?.endTime.slice(0, 2) + + ":" + + meetingTimes?.endTime.slice(2), + }); } - - return output; } - async function getUniqueStartEndTimes() { - const maxstart = await prisma.meetingTime.findFirst({ - where: { - beginTime: { not: "" }, - }, - orderBy: { - beginTime: "desc", - }, - }); - const maxend = await prisma.meetingTime.findFirst({ - where: { - endTime: { not: "" }, - }, - orderBy: { - beginTime: "desc", - }, - }); + return output; +} - /* - let times = { - minTime: - maxstart?.beginTime.slice(0, 2) + ":" + maxstart?.beginTime.slice(2), - maxTime: - maxstart?.endTime.slice(0, 2) + ":" + maxstart?.beginTime.slice(2), - };*/ - console.log(maxstart); +export default async function CalendarPage() { + const events: Event[] = await getEvents(); + let endTime = "17:00"; + let startTime = "09:00"; - return maxstart; + for (const event of events) { + if (event.startTime < startTime && event.startTime != ":") + startTime = event.startTime; + if (event.endTime > endTime && event.endTime != ":") + endTime = event.endTime; } - const events = await getEvents(); - //let times = await getUniqueStartEndTimes(); return (
- +
diff --git a/app/page.tsx b/app/page.tsx index ce6f466..f120379 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -2,11 +2,13 @@ import * as React from "react"; import { Suspense } from "react"; import { Skeleton } from "@nextui-org/skeleton"; +import { cookies } from "next/headers"; import Search from "../components/Search"; import { FullCourseList } from "../components/FullCourseList"; import CreatePlan from "../components/CreatePlan"; import prisma from "../lib/prisma"; import { getInitialCourses } from "../app/actions/getCourses"; +import { redirect } from "next/navigation"; async function getCourses() { const courses = await prisma.course.findMany(); @@ -69,13 +71,21 @@ export default async function Page(props: { stime?: Array; }>; }) { + const cookieStore = await cookies(); + const pagePref = cookieStore.get("pagePref"); + if (pagePref && pagePref.value != "plan") { + console.log("wtf"); + console.log(pagePref.value); + redirect("/" + pagePref.value); + } + const searchParams = await props.searchParams; const query = searchParams?.query || ""; const term = searchParams?.term || ""; const dotw = searchParams?.dotw || []; const stime = searchParams?.stime || []; const homePageProps: any = {}; - const initalCourses = await getInitialCourses(); + const initalCourses = await getInitialCourses(query, term, dotw, stime); homePageProps["fullCourseList"] = ( - {/* - - -
- */} - - + {eventInfo.timeText} {"|"} {eventInfo.event.extendedProps.room} -
+
{eventInfo.event.extendedProps.subject} {eventInfo.event.extendedProps.courseNumber} :

{eventInfo.event.title}

-
+
{eventInfo.event.extendedProps.instructor.replace("'", "'")}
- ); } return ( - +
+ +
); } diff --git a/components/CourseCard.tsx b/components/CourseCard.tsx index 46d1c84..854826b 100644 --- a/components/CourseCard.tsx +++ b/components/CourseCard.tsx @@ -56,7 +56,9 @@ export default function CourseCard(props: any) { className="flex w-6 h-6 lg:w-8 lg:h-8 rounded-md justify-center items-center" style={{ backgroundColor: color_mappings[index] }} > -

{item[0]}

+

+ {item[0]} +

); } @@ -80,10 +82,7 @@ export default function CourseCard(props: any) { return ( -
+
updatePlan(props.course)}>
@@ -124,12 +123,12 @@ export default function CourseCard(props: any) {
{props.course.facultyMeet.meetingTimes.room ? ( -
+
{props.course.facultyMeet.meetingTimes.buildingDescription}{" "} {props.course.facultyMeet.meetingTimes.room}
-
+
{props.course.facultyMeet.meetingTimes ? (
@@ -157,8 +156,8 @@ export default function CourseCard(props: any) {
) : ( -
-

+

+

Contact your Professor for additional details.

diff --git a/components/CreatePlan.tsx b/components/CreatePlan.tsx index f19f2db..590dae8 100644 --- a/components/CreatePlan.tsx +++ b/components/CreatePlan.tsx @@ -131,27 +131,22 @@ export default function CreatePlan(props: any) { removeCourseFromPlan(selectedCoursePlan, course)} >
-
{course.subject} {""} {course.courseNumber}
{course.courseTitle.replace(/&/g, "&")}
-
diff --git a/components/PlanCard.tsx b/components/PlanCard.tsx index 4ac08a8..77f07bc 100644 --- a/components/PlanCard.tsx +++ b/components/PlanCard.tsx @@ -13,10 +13,7 @@ export default function PlanCard(props: any) { shadow="sm" >
@@ -31,7 +28,7 @@ export default function PlanCard(props: any) { onClick={() => removeCourseFromPlan(props.selectedCoursePlan[0], props.course) } - + */ > X diff --git a/components/Search.tsx b/components/Search.tsx index 0f35480..33e80c9 100644 --- a/components/Search.tsx +++ b/components/Search.tsx @@ -142,6 +142,9 @@ export default function Search(props: any) { { + const cookies = useCookies(); const pathname = usePathname(); const [isMenuOpen, setIsMenuOpen] = React.useState(false); @@ -56,6 +58,9 @@ export const Navbar = (props: any) => { return (
{ SCCS  - + Course Planner  @@ -90,6 +95,9 @@ export const Navbar = (props: any) => { radius: "full", variant: pathname === item.href ? "shadow" : "ghost", })} + onClick={() => { + cookies.set("pagePref", item.label.toLowerCase()); + }} href={item.href} > {item.label} @@ -109,8 +117,11 @@ export const Navbar = (props: any) => { {status === "authenticated" ? ( - @@ -128,8 +139,9 @@ export const Navbar = (props: any) => { )} @@ -147,7 +159,13 @@ export const Navbar = (props: any) => {
{siteConfig.navItems.map((item, index) => ( - + { + cookies.set("pagePref", item.label.toLowerCase()); + }} + > {item.label} @@ -158,7 +176,7 @@ export const Navbar = (props: any) => { @@ -177,7 +195,7 @@ export const Navbar = (props: any) => { variant="bordered" onClick={() => signIn("keycloak", { callbackUrl: "/" })} > - Log In + Log In )} diff --git a/components/primitives.ts b/components/primitives.ts index 46064a7..6607a15 100644 --- a/components/primitives.ts +++ b/components/primitives.ts @@ -56,22 +56,22 @@ export const subtitle = tv({ }); export const courseColors = [ - "#093145", - "#107896", - "#829356", - "#5A5A66", - "#4A6D7C", - "#C2571A", - "#9A2617", - "#201335", - "#636363", - "#087E8B", - "#590925", - "#034748", - "#19381F", - "#631D76", - "#4B4E6D", - "#590004", + "bg-[color:hsl(0deg_60%_50%)] dark:bg-[color:hsl(0deg_60%_35%)]", + "bg-[color:hsl(21.17deg_60%_50%)] dark:bg-[color:hsl(21.17deg_60%_35%)]", + "bg-[color:hsl(42.34deg_60%_50%)] dark:bg-[color:hsl(42.34deg_60%_35%)]", + "bg-[color:hsl(63.51deg_60%_50%)] dark:bg-[color:hsl(63.51deg_60%_35%)]", + "bg-[color:hsl(84.68deg_60%_50%)] dark:bg-[color:hsl(84.68deg_60%_35%)]", + "bg-[color:hsl(105.85deg_60%_50%)] dark:bg-[color:hsl(105.85deg_60%_35%)]", + "bg-[color:hsl(127.02deg_60%_50%)] dark:bg-[color:hsl(127.02deg_60%_35%)]", + "bg-[color:hsl(148.19deg_60%_50%)] dark:bg-[color:hsl(148.19deg_60%_35%)]", + "bg-[color:hsl(169.36deg_60%_50%)] dark:bg-[color:hsl(169.36deg_60%_35%)]", + "bg-[color:hsl(190.53deg_60%_50%)] dark:bg-[color:hsl(190.53deg_60%_35%)]", + "bg-[color:hsl(211.70deg_60%_50%)] dark:bg-[color:hsl(211.70deg_60%_35%)]", + "bg-[color:hsl(232.87deg_60%_50%)] dark:bg-[color:hsl(232.87deg_60%_35%)]", + "bg-[color:hsl(254.04deg_60%_50%)] dark:bg-[color:hsl(254.04deg_60%_35%)]", + "bg-[color:hsl(275.21deg_60%_50%)] dark:bg-[color:hsl(275.21deg_60%_35%)]", + "bg-[color:hsl(296.38deg_60%_50%)] dark:bg-[color:hsl(296.38deg_60%_35%)]", + "bg-[color:hsl(317.55deg_60%_50%)] dark:bg-[color:hsl(317.55deg_60%_35%)]", ]; export function generateColorFromName(name: string) { @@ -81,5 +81,8 @@ export function generateColorFromName(name: string) { hash += name.charCodeAt(i) * i; } + console.log("generated:"); + console.log(courseColors[hash % courseColors.length]); + return courseColors[hash % courseColors.length]; } diff --git a/components/theme-switch.tsx b/components/theme-switch.tsx index 72b5980..c0636f7 100644 --- a/components/theme-switch.tsx +++ b/components/theme-switch.tsx @@ -43,7 +43,7 @@ export const ThemeSwitch: FC = ({ className: clsx( "px-px transition-opacity hover:opacity-80 cursor-pointer", className, - classNames?.base, + classNames?.base ), })} > @@ -65,11 +65,15 @@ export const ThemeSwitch: FC = ({ "px-0", "mx-0", ], - classNames?.wrapper, + classNames?.wrapper ), })} > - {!isSelected || isSSR ? : } + {!isSelected || isSSR ? ( + + ) : ( + + )}
); diff --git a/cron-startup.sh b/cron-startup.sh index 2336a34..4fbe90b 100755 --- a/cron-startup.sh +++ b/cron-startup.sh @@ -1,3 +1,3 @@ #!/bin/bash echo "Start cron" -cron -f +cron -f diff --git a/crontab_file b/crontab_file index 2f4b534..bf1e857 100644 --- a/crontab_file +++ b/crontab_file @@ -1 +1,2 @@ -0 * * * * /app/swatscraper -semester=spring -year=2025 +* * * * * root date >> /var/log/cron.log +0 * * * * root /app/swatscraper -semester=spring -year=2025 -env=/app/.env >> /var/log/cron.log diff --git a/package-lock.json b/package-lock.json index e16419f..9b6347f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { - "name": "next-app-template", - "version": "0.0.1", + "name": "scheduler", + "version": "2.0.0-beta", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "next-app-template", - "version": "0.0.1", + "name": "scheduler", + "version": "2.0.0-beta", "dependencies": { "@emotion/react": "^11.13.3", "@emotion/styled": "^11.13.0", @@ -425,9 +425,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", - "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", + "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.4", @@ -439,18 +439,18 @@ } }, "node_modules/@eslint/core": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", - "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", + "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "license": "MIT", "dependencies": { "ajv": "^6.12.4", @@ -483,9 +483,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz", - "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==", + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", + "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -501,9 +501,9 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.2.tgz", - "integrity": "sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", + "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", "license": "Apache-2.0", "dependencies": { "levn": "^0.4.1" @@ -513,13 +513,13 @@ } }, "node_modules/@formatjs/ecma402-abstract": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.3.tgz", - "integrity": "sha512-aElGmleuReGnk2wtYOzYFmNWYoiWWmf1pPPCYg0oiIQSJj0mjc4eUfzUXaSOJ4S8WzI/cLqnCTWjqz904FT2OQ==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.4.tgz", + "integrity": "sha512-lFyiQDVvSbQOpU+WFd//ILolGj4UgA/qXrKeZxdV14uKiAUiPAtX6XAn7WBCRi7Mx6I7EybM9E5yYn4BIpZWYg==", "license": "MIT", "dependencies": { "@formatjs/fast-memoize": "2.2.3", - "@formatjs/intl-localematcher": "0.5.7", + "@formatjs/intl-localematcher": "0.5.8", "tslib": "2" } }, @@ -533,30 +533,30 @@ } }, "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.3.tgz", - "integrity": "sha512-9L99QsH14XjOCIp4TmbT8wxuffJxGK8uLNO1zNhLtcZaVXvv626N0s4A2qgRCKG3dfYWx9psvGlFmvyVBa6u/w==", + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.4.tgz", + "integrity": "sha512-Tbvp5a9IWuxUcpWNIW6GlMQYEc4rwNHR259uUFoKWNN1jM9obf9Ul0e+7r7MvFOBNcN+13K7NuKCKqQiAn1QEg==", "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.3", - "@formatjs/icu-skeleton-parser": "1.8.7", + "@formatjs/ecma402-abstract": "2.2.4", + "@formatjs/icu-skeleton-parser": "1.8.8", "tslib": "2" } }, "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.8.7", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.7.tgz", - "integrity": "sha512-fI+6SmS2g7h3srfAKSWa5dwreU5zNEfon2uFo99OToiLF6yxGE+WikvFSbsvMAYkscucvVmTYNlWlaDPp0n5HA==", + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.8.tgz", + "integrity": "sha512-vHwK3piXwamFcx5YQdCdJxUQ1WdTl6ANclt5xba5zLGDv5Bsur7qz8AD7BevaKxITwpgDeU0u8My3AIibW9ywA==", "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.3", + "@formatjs/ecma402-abstract": "2.2.4", "tslib": "2" } }, "node_modules/@formatjs/intl-localematcher": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.7.tgz", - "integrity": "sha512-GGFtfHGQVFe/niOZp24Kal5b2i36eE2bNL0xi9Sg/yd0TR8aLjcteApZdHmismP5QQax1cMnZM9yWySUUjJteA==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.8.tgz", + "integrity": "sha512-I+WDNWWJFZie+jkfkiK5Mp4hEDyRSEvmyfYadflOno/mmKJKcB17fEpEH0oJu/OWhhCJ8kJBDz2YMd/6cDl7Mg==", "license": "MIT", "dependencies": { "tslib": "2" @@ -1128,9 +1128,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.6.tgz", - "integrity": "sha512-nz1SlR9TdBYYPz4qKoNasMPRiGb4PaIHFkzLzhju0YVYS5QSuFF2+n7CsiHMIDcHv3piPu/xDWI53ruhOqvZwQ==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.7.tgz", + "integrity": "sha512-POuIBi80BZBogQkG4PQKIGwy4QFwB+kOr+OI4k7Znh7LqMAIhwB9OC00l6M+w1GrZJYj3T8R5WX8G6QAIvoVEw==", "license": "MIT", "peer": true, "funding": { @@ -1139,9 +1139,9 @@ } }, "node_modules/@mui/icons-material": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.6.tgz", - "integrity": "sha512-5r9urIL2lxXb/sPN3LFfFYEibsXJUb986HhhIeu1gOcte460pwdSiEhBSxkAuyT8Dj7jvu9MjqSBmSumQELo8A==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.7.tgz", + "integrity": "sha512-RGzkeHNArIVy5ZQ12bq/8VYNeICEyngngsFskTJ/2hYKhIeIII3iRGtaZaSvLpXh7h3Fg3VKTulT+QU0w5K4XQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0" @@ -1154,7 +1154,7 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@mui/material": "^6.1.6", + "@mui/material": "^6.1.7", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, @@ -1165,17 +1165,17 @@ } }, "node_modules/@mui/material": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.6.tgz", - "integrity": "sha512-1yvejiQ/601l5AK3uIdUlAVElyCxoqKnl7QA+2oFB/2qYPWfRwDgavW/MoywS5Y2gZEslcJKhe0s2F3IthgFgw==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.7.tgz", + "integrity": "sha512-KsjujQL/A2hLd1PV3QboF+W6SSL5QqH6ZlSuQoeYz9r69+TnyBFIevbYLxdjJcJmGBjigL5pfpn7hTGop+vhSg==", "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.26.0", - "@mui/core-downloads-tracker": "^6.1.6", - "@mui/system": "^6.1.6", + "@mui/core-downloads-tracker": "^6.1.7", + "@mui/system": "^6.1.7", "@mui/types": "^7.2.19", - "@mui/utils": "^6.1.6", + "@mui/utils": "^6.1.7", "@popperjs/core": "^2.11.8", "@types/react-transition-group": "^4.4.11", "clsx": "^2.1.1", @@ -1194,7 +1194,7 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@mui/material-pigment-css": "^6.1.6", + "@mui/material-pigment-css": "^6.1.7", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -1215,14 +1215,14 @@ } }, "node_modules/@mui/private-theming": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.6.tgz", - "integrity": "sha512-ioAiFckaD/fJSnTrUMWgjl9HYBWt7ixCh7zZw7gDZ+Tae7NuprNV6QJK95EidDT7K0GetR2rU3kAeIR61Myttw==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.7.tgz", + "integrity": "sha512-uLbfUSsug5K0LVkv0PI6Flste3le8+6WSL2omdTiYde93P89Qr7pKr8TA6d2yXfr+Bm+SvD8/fGnkaRwFkryuQ==", "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.26.0", - "@mui/utils": "^6.1.6", + "@mui/utils": "^6.1.7", "prop-types": "^15.8.1" }, "engines": { @@ -1243,9 +1243,9 @@ } }, "node_modules/@mui/styled-engine": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.6.tgz", - "integrity": "sha512-I+yS1cSuSvHnZDBO7e7VHxTWpj+R7XlSZvTC4lS/OIbUNJOMMSd3UDP6V2sfwzAdmdDNBi7NGCRv2SZ6O9hGDA==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.7.tgz", + "integrity": "sha512-Ou4CxN7MQmwrfG1Pu6EYjPgPChQXxPDJrwgizLXlRPOad5qAq4gYXRuzrGQ2DfGjjwmJhjI8T6A0SeapAZPGig==", "license": "MIT", "peer": true, "dependencies": { @@ -1278,17 +1278,17 @@ } }, "node_modules/@mui/system": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.6.tgz", - "integrity": "sha512-qOf1VUE9wK8syiB0BBCp82oNBAVPYdj4Trh+G1s+L+ImYiKlubWhhqlnvWt3xqMevR+D2h1CXzA1vhX2FvA+VQ==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.7.tgz", + "integrity": "sha512-qbMGgcC/FodpuRSfjXlEDdbNQaW++eATh0vNBcPUv2/YXSpReoOpoT9FhogxEBNks+aQViDXBRZKh6HX2fVmwg==", "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.26.0", - "@mui/private-theming": "^6.1.6", - "@mui/styled-engine": "^6.1.6", + "@mui/private-theming": "^6.1.7", + "@mui/styled-engine": "^6.1.7", "@mui/types": "^7.2.19", - "@mui/utils": "^6.1.6", + "@mui/utils": "^6.1.7", "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -1334,9 +1334,9 @@ } }, "node_modules/@mui/utils": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.6.tgz", - "integrity": "sha512-sBS6D9mJECtELASLM+18WUcXF6RH3zNxBRFeyCRg8wad6NbyNrdxLuwK+Ikvc38sTZwBzAz691HmSofLqHd9sQ==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.7.tgz", + "integrity": "sha512-Gr7cRZxBoZ0BIa3Xqf/2YaUrBLyNPJvXPQH3OsD9WMZukI/TutibbQBVqLYpgqJn8pKSjbD50Yq2auG0wI1xOw==", "license": "MIT", "peer": true, "dependencies": { @@ -6088,9 +6088,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", - "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -6309,9 +6309,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.56", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.56.tgz", - "integrity": "sha512-7lXb9dAvimCFdvUMTyucD4mnIndt/xhRKFAlky0CyFogdnNmdPQNoHI23msF/2V4mpTxMzgMdjK4+YRlFlRQZw==", + "version": "1.5.62", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.62.tgz", + "integrity": "sha512-t8c+zLmJHa9dJy96yBZRXGQYoiCEnHYgFwn1asvSPZSUdVxnB62A4RASd7k41ytG3ErFBA0TpHlKg9D9SQBmLg==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -6343,9 +6343,9 @@ } }, "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "version": "1.23.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", + "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", @@ -6363,7 +6363,7 @@ "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.4", "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", + "globalthis": "^1.0.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", @@ -6379,10 +6379,10 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", + "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.9", @@ -6523,26 +6523,26 @@ } }, "node_modules/eslint": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz", - "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==", + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz", + "integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==", "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.18.0", - "@eslint/core": "^0.7.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.14.0", - "@eslint/plugin-kit": "^0.2.0", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.15.0", + "@eslint/plugin-kit": "^0.2.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.0", + "@humanwhocodes/retry": "^0.4.1", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.5", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", @@ -6561,8 +6561,7 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" @@ -7224,9 +7223,9 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", "license": "ISC" }, "node_modules/follow-redirects": { @@ -7302,9 +7301,9 @@ } }, "node_modules/framer-motion": { - "version": "11.11.12", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.11.12.tgz", - "integrity": "sha512-FC+efAcn62h6tXpeclgsekrpATdkIAa3+MffG2W2OLae0c7MV2NKgOcrwmScPKDg7qgyZC8Rqu36/4n5inMBtA==", + "version": "11.11.17", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.11.17.tgz", + "integrity": "sha512-O8QzvoKiuzI5HSAHbcYuL6xU+ZLXbrH7C8Akaato4JzQbX2ULNeniqC2Vo5eiCtFktX9XsJ+7nUhxcl2E2IjpA==", "license": "MIT", "dependencies": { "tslib": "^2.4.0" @@ -7687,14 +7686,14 @@ } }, "node_modules/intl-messageformat": { - "version": "10.7.6", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.6.tgz", - "integrity": "sha512-IsMU/hqyy3FJwNJ0hxDfY2heJ7MteSuFvcnCebxRp67di4Fhx1gKKE+qS0bBwUF8yXkX9SsPUhLeX/B6h5SKUA==", + "version": "10.7.7", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.7.tgz", + "integrity": "sha512-F134jIoeYMro/3I0h08D0Yt4N9o9pjddU/4IIxMMURqbAtI2wu70X8hvG1V48W49zXHXv3RKSF/po+0fDfsGjA==", "license": "BSD-3-Clause", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.3", + "@formatjs/ecma402-abstract": "2.2.4", "@formatjs/fast-memoize": "2.2.3", - "@formatjs/icu-messageformat-parser": "2.9.3", + "@formatjs/icu-messageformat-parser": "2.9.4", "tslib": "2" } }, @@ -9417,9 +9416,9 @@ } }, "node_modules/react-textarea-autosize": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.4.tgz", - "integrity": "sha512-eSSjVtRLcLfFwFcariT77t9hcbVJHQV76b51QjQGarQIHml2+gM2lms0n3XrhnDmgK5B+/Z7TmQk5OHNzqYm/A==", + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.5.tgz", + "integrity": "sha512-CVA94zmfp8m4bSHtWwmANaBR8EPsKy2aZ7KwqhoS4Ftib87F9Kvi7XQhOixypPLMc6kVYgOXvKFuuzZDpHGRPg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", @@ -10248,12 +10247,6 @@ "node": ">=6" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "license": "MIT" - }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", diff --git a/package.json b/package.json index cec1232..46fab0b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "next-app-template", - "version": "0.0.1", + "name": "scheduler", + "version": "2.0.0-beta", "private": true, "scripts": { "dev": "next dev", diff --git a/prisma/migrations/20241116082646_/migration.sql b/prisma/migrations/20241116082646_/migration.sql new file mode 100644 index 0000000..76d7c18 --- /dev/null +++ b/prisma/migrations/20241116082646_/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Course" ADD COLUMN "linkedSections" TEXT; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 5bd6175..4107bff 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -43,6 +43,7 @@ model Course { facultyId Int facultyMeetId Int year String + linkedSections String? avgRating Float? instructor Faculty @relation(fields: [facultyId], references: [id]) facultyMeet MeetingsFaculty @relation(fields: [facultyMeetId], references: [id]) diff --git a/public/logo/logo.png b/public/logo/logo.png new file mode 100644 index 0000000..22b8179 Binary files /dev/null and b/public/logo/logo.png differ diff --git a/styles/globals.css b/styles/globals.css index b8cc390..947af0c 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -40,6 +40,11 @@ .fc-col-header { background-color: #151d2b; font-family: var(--font-sans); + border-radius: 0.5rem 0.5rem 0px 0px; +} + +.fc { + border-radius: 0.5rem; } .fc-event-main-frame { @@ -50,8 +55,15 @@ text-overflow: ellipsis; } -h2 { - font-size: 1.1em; +.fc-theme-standard .fc-scrollgrid { + border-radius: 0.5rem; +} + +.fc-theme-standard td { + border-radius: 0rem 0rem 0.5rem 0.5rem; +} +.fc-theme-standard th { + border-radius: 0.5rem 0.5rem 0rem 0rem; } .smallFont { diff --git a/swatscraper b/swatscraper index b3a2157..ed190e6 160000 --- a/swatscraper +++ b/swatscraper @@ -1 +1 @@ -Subproject commit b3a2157105945977bd67c3ad3e81bc4992b85a8b +Subproject commit ed190e652c3e2380e69976869d8e3a2a89a04ab4 diff --git a/tailwind.config.js b/tailwind.config.js index 3d455c7..dcccabe 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -24,11 +24,26 @@ module.exports = { plugins: [ nextui({ themes: { - light: {}, + light: { + colors: { + background: "#E5E7EB", + background_navbar: "#31425E", + background_layer: "#31425E", + foreground: "#000000", + light_foreground: "#F1F1F1", + primary: { + DEFAULT: "#9FADBC", + foreground: "#314f25E", + }, + secondary: "#F46523", + focus: "#F46523", + }, + }, dark: { colors: { background: "#0C1019", background_navbar: "#151D2B", + background_layer: "#2C2C33", foreground: "#D9D9D9", light_foreground: "#181C25", primary: { @@ -36,7 +51,7 @@ module.exports = { foreground: "#1D2125", }, secondary: "#F46523", - focus: "#BEF264", + focus: "#F46523", }, }, },