From 331087fb61955c1d2dbbbbe1d69405885a325e4f Mon Sep 17 00:00:00 2001
From: taf <75897907+tashifkhan@users.noreply.github.com>
Date: Sat, 4 Jan 2025 04:24:52 +0530
Subject: [PATCH 001/433] Update readme.md
---
readme.md | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/readme.md b/readme.md
index a243177..ccea2d3 100644
--- a/readme.md
+++ b/readme.md
@@ -1,5 +1,8 @@
# Time Table Python Creator
+
-
🤡 hosted here 🤡
+
This is a Flask-based web application that simplifies the process of creating and managing time tables. The application allows users to upload their time table files in various formats (CSV, XLSX, XLS, PDF) and generates a simplified schedule (you can download it too). Additionally, it provides an option to select electives and integrates with Google Calendar to add events.
From 7bd1a5214a7608398ca0e4d06ccaf5186fb754f8 Mon Sep 17 00:00:00 2001
From: taf <75897907+tashifkhan@users.noreply.github.com>
Date: Sat, 4 Jan 2025 05:50:49 +0530
Subject: [PATCH 005/433] Update README.md
---
README.md | 26 +++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/README.md b/README.md
index 1c05e65..b2ab5f5 100644
--- a/README.md
+++ b/README.md
@@ -57,22 +57,22 @@ Welcome to the JIIT Personalized Schedule Creator, a Next.js + Flask-based appli
1. Clone the repository and navigate:
- ```bash
- git clone https://github.com/your-username/jiit-schedule-creator.git
- cd jiit-schedule-creator/backend
- ```
+ ```bash
+ git clone https://github.com/your-username/jiit-schedule-creator.git
+ cd jiit-schedule-creator/backend
+ ```
2. Install dependencies:
- ```bash
- npm install
- ```
+ ```bash
+ npm install
+ ```
3. Run the development server:
- ```bash
- npm run dev
- ```
+ ```bash
+ npm run dev
+ ```
Frontend runs at: `http://localhost:3000`
@@ -94,9 +94,9 @@ We welcome contributions to enhance this project!
1. Fork the repository.
2. Create a new branch:
- ```bash
- git checkout -b feature-name
- ```
+```bash
+git checkout -b feature-name
+```
3. Commit changes and create a pull request.
From 2f3fb7c1a0e4ce941cb4578a43afed4a28bd0213 Mon Sep 17 00:00:00 2001
From: taf <75897907+tashifkhan@users.noreply.github.com>
Date: Sat, 4 Jan 2025 05:51:11 +0530
Subject: [PATCH 006/433] Update README.md
---
README.md | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/README.md b/README.md
index b2ab5f5..6a06ee2 100644
--- a/README.md
+++ b/README.md
@@ -56,11 +56,11 @@ Welcome to the JIIT Personalized Schedule Creator, a Next.js + Flask-based appli
## Installation
1. Clone the repository and navigate:
-
- ```bash
- git clone https://github.com/your-username/jiit-schedule-creator.git
- cd jiit-schedule-creator/backend
- ```
+
+ ```bash
+ git clone https://github.com/your-username/jiit-schedule-creator.git
+ cd jiit-schedule-creator/backend
+ ```
2. Install dependencies:
@@ -70,9 +70,9 @@ Welcome to the JIIT Personalized Schedule Creator, a Next.js + Flask-based appli
3. Run the development server:
- ```bash
- npm run dev
- ```
+ ```bash
+ npm run dev
+ ```
Frontend runs at: `http://localhost:3000`
@@ -94,9 +94,9 @@ We welcome contributions to enhance this project!
1. Fork the repository.
2. Create a new branch:
-```bash
-git checkout -b feature-name
-```
+ ```bash
+ git checkout -b feature-name
+ ```
3. Commit changes and create a pull request.
From 864db0fba936c7946ed475fa41fce552281259f1 Mon Sep 17 00:00:00 2001
From: Tashif Ahmad Khan
Date: Sat, 4 Jan 2025 05:58:02 +0530
Subject: [PATCH 007/433] shadcn
---
components.json | 20 ++
components/ui/form.tsx | 179 ++++++++++++++++++
components/ui/label.tsx | 26 +++
components/ui/toast.tsx | 129 +++++++++++++
hooks/use-toast.ts | 191 +++++++++++++++++++
lib/utils.ts | 6 +
package-lock.json | 395 +++++++++++++++++++++++++++++++++++++++-
package.json | 17 +-
8 files changed, 954 insertions(+), 9 deletions(-)
create mode 100644 components.json
create mode 100644 components/ui/form.tsx
create mode 100644 components/ui/label.tsx
create mode 100644 components/ui/toast.tsx
create mode 100644 hooks/use-toast.ts
create mode 100644 lib/utils.ts
diff --git a/components.json b/components.json
new file mode 100644
index 0000000..c597462
--- /dev/null
+++ b/components.json
@@ -0,0 +1,20 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "default",
+ "rsc": true,
+ "tsx": true,
+ "tailwind": {
+ "config": "tailwind.config.ts",
+ "css": "app/globals.css",
+ "baseColor": "neutral",
+ "cssVariables": true,
+ "prefix": ""
+ },
+ "aliases": {
+ "components": "@/components",
+ "utils": "@/lib/utils",
+ "ui": "@/components/ui",
+ "lib": "@/lib",
+ "hooks": "@/hooks"
+ }
+}
diff --git a/components/ui/form.tsx b/components/ui/form.tsx
new file mode 100644
index 0000000..b9fb860
--- /dev/null
+++ b/components/ui/form.tsx
@@ -0,0 +1,179 @@
+'use client';
+
+import * as React from 'react';
+import * as LabelPrimitive from '@radix-ui/react-label';
+import { Slot } from '@radix-ui/react-slot';
+import {
+ Controller,
+ ControllerProps,
+ FieldPath,
+ FieldValues,
+ FormProvider,
+ useFormContext,
+} from 'react-hook-form';
+
+import { cn } from '@/lib/utils';
+import { Label } from '@/components/ui/label';
+
+const Form = FormProvider;
+
+type FormFieldContextValue<
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath
+> = {
+ name: TName;
+};
+
+const FormFieldContext = React.createContext(
+ {} as FormFieldContextValue
+);
+
+const FormField = <
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath
+>({
+ ...props
+}: ControllerProps) => {
+ return (
+
+
+
+ );
+};
+
+const useFormField = () => {
+ const fieldContext = React.useContext(FormFieldContext);
+ const itemContext = React.useContext(FormItemContext);
+ const { getFieldState, formState } = useFormContext();
+
+ const fieldState = getFieldState(fieldContext.name, formState);
+
+ if (!fieldContext) {
+ throw new Error('useFormField should be used within ');
+ }
+
+ const { id } = itemContext;
+
+ return {
+ id,
+ name: fieldContext.name,
+ formItemId: `${id}-form-item`,
+ formDescriptionId: `${id}-form-item-description`,
+ formMessageId: `${id}-form-item-message`,
+ ...fieldState,
+ };
+};
+
+type FormItemContextValue = {
+ id: string;
+};
+
+const FormItemContext = React.createContext(
+ {} as FormItemContextValue
+);
+
+const FormItem = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const id = React.useId();
+
+ return (
+
+
+
+ );
+});
+FormItem.displayName = 'FormItem';
+
+const FormLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ const { error, formItemId } = useFormField();
+
+ return (
+
+ );
+});
+FormLabel.displayName = 'FormLabel';
+
+const FormControl = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ ...props }, ref) => {
+ const { error, formItemId, formDescriptionId, formMessageId } =
+ useFormField();
+
+ return (
+
+ );
+});
+FormControl.displayName = 'FormControl';
+
+const FormDescription = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const { formDescriptionId } = useFormField();
+
+ return (
+
+ );
+});
+FormDescription.displayName = 'FormDescription';
+
+const FormMessage = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, children, ...props }, ref) => {
+ const { error, formMessageId } = useFormField();
+ const body = error ? String(error?.message) : children;
+
+ if (!body) {
+ return null;
+ }
+
+ return (
+
+ {body}
+
+ );
+});
+FormMessage.displayName = 'FormMessage';
+
+export {
+ useFormField,
+ Form,
+ FormItem,
+ FormLabel,
+ FormControl,
+ FormDescription,
+ FormMessage,
+ FormField,
+};
diff --git a/components/ui/label.tsx b/components/ui/label.tsx
new file mode 100644
index 0000000..1e24ec0
--- /dev/null
+++ b/components/ui/label.tsx
@@ -0,0 +1,26 @@
+'use client';
+
+import * as React from 'react';
+import * as LabelPrimitive from '@radix-ui/react-label';
+import { cva, type VariantProps } from 'class-variance-authority';
+
+import { cn } from '@/lib/utils';
+
+const labelVariants = cva(
+ 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70'
+);
+
+const Label = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef &
+ VariantProps
+>(({ className, ...props }, ref) => (
+
+));
+Label.displayName = LabelPrimitive.Root.displayName;
+
+export { Label };
diff --git a/components/ui/toast.tsx b/components/ui/toast.tsx
new file mode 100644
index 0000000..bd67dce
--- /dev/null
+++ b/components/ui/toast.tsx
@@ -0,0 +1,129 @@
+'use client';
+
+import * as React from 'react';
+import * as ToastPrimitives from '@radix-ui/react-toast';
+import { cva, type VariantProps } from 'class-variance-authority';
+import { X } from 'lucide-react';
+
+import { cn } from '@/lib/utils';
+
+const ToastProvider = ToastPrimitives.Provider;
+
+const ToastViewport = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+ToastViewport.displayName = ToastPrimitives.Viewport.displayName;
+
+const toastVariants = cva(
+ 'group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full',
+ {
+ variants: {
+ variant: {
+ default: 'border bg-background text-foreground',
+ destructive:
+ 'destructive group border-destructive bg-destructive text-destructive-foreground',
+ },
+ },
+ defaultVariants: {
+ variant: 'default',
+ },
+ }
+);
+
+const Toast = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef &
+ VariantProps
+>(({ className, variant, ...props }, ref) => {
+ return (
+
+ );
+});
+Toast.displayName = ToastPrimitives.Root.displayName;
+
+const ToastAction = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+ToastAction.displayName = ToastPrimitives.Action.displayName;
+
+const ToastClose = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+ToastClose.displayName = ToastPrimitives.Close.displayName;
+
+const ToastTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+ToastTitle.displayName = ToastPrimitives.Title.displayName;
+
+const ToastDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+ToastDescription.displayName = ToastPrimitives.Description.displayName;
+
+type ToastProps = React.ComponentPropsWithoutRef;
+
+type ToastActionElement = React.ReactElement;
+
+export {
+ type ToastProps,
+ type ToastActionElement,
+ ToastProvider,
+ ToastViewport,
+ Toast,
+ ToastTitle,
+ ToastDescription,
+ ToastClose,
+ ToastAction,
+};
diff --git a/hooks/use-toast.ts b/hooks/use-toast.ts
new file mode 100644
index 0000000..7337115
--- /dev/null
+++ b/hooks/use-toast.ts
@@ -0,0 +1,191 @@
+'use client';
+
+// Inspired by react-hot-toast library
+import * as React from 'react';
+
+import type { ToastActionElement, ToastProps } from '@/components/ui/toast';
+
+const TOAST_LIMIT = 1;
+const TOAST_REMOVE_DELAY = 1000000;
+
+type ToasterToast = ToastProps & {
+ id: string;
+ title?: React.ReactNode;
+ description?: React.ReactNode;
+ action?: ToastActionElement;
+};
+
+const actionTypes = {
+ ADD_TOAST: 'ADD_TOAST',
+ UPDATE_TOAST: 'UPDATE_TOAST',
+ DISMISS_TOAST: 'DISMISS_TOAST',
+ REMOVE_TOAST: 'REMOVE_TOAST',
+} as const;
+
+let count = 0;
+
+function genId() {
+ count = (count + 1) % Number.MAX_SAFE_INTEGER;
+ return count.toString();
+}
+
+type ActionType = typeof actionTypes;
+
+type Action =
+ | {
+ type: ActionType['ADD_TOAST'];
+ toast: ToasterToast;
+ }
+ | {
+ type: ActionType['UPDATE_TOAST'];
+ toast: Partial;
+ }
+ | {
+ type: ActionType['DISMISS_TOAST'];
+ toastId?: ToasterToast['id'];
+ }
+ | {
+ type: ActionType['REMOVE_TOAST'];
+ toastId?: ToasterToast['id'];
+ };
+
+interface State {
+ toasts: ToasterToast[];
+}
+
+const toastTimeouts = new Map>();
+
+const addToRemoveQueue = (toastId: string) => {
+ if (toastTimeouts.has(toastId)) {
+ return;
+ }
+
+ const timeout = setTimeout(() => {
+ toastTimeouts.delete(toastId);
+ dispatch({
+ type: 'REMOVE_TOAST',
+ toastId: toastId,
+ });
+ }, TOAST_REMOVE_DELAY);
+
+ toastTimeouts.set(toastId, timeout);
+};
+
+export const reducer = (state: State, action: Action): State => {
+ switch (action.type) {
+ case 'ADD_TOAST':
+ return {
+ ...state,
+ toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),
+ };
+
+ case 'UPDATE_TOAST':
+ return {
+ ...state,
+ toasts: state.toasts.map((t) =>
+ t.id === action.toast.id ? { ...t, ...action.toast } : t
+ ),
+ };
+
+ case 'DISMISS_TOAST': {
+ const { toastId } = action;
+
+ // ! Side effects ! - This could be extracted into a dismissToast() action,
+ // but I'll keep it here for simplicity
+ if (toastId) {
+ addToRemoveQueue(toastId);
+ } else {
+ state.toasts.forEach((toast) => {
+ addToRemoveQueue(toast.id);
+ });
+ }
+
+ return {
+ ...state,
+ toasts: state.toasts.map((t) =>
+ t.id === toastId || toastId === undefined
+ ? {
+ ...t,
+ open: false,
+ }
+ : t
+ ),
+ };
+ }
+ case 'REMOVE_TOAST':
+ if (action.toastId === undefined) {
+ return {
+ ...state,
+ toasts: [],
+ };
+ }
+ return {
+ ...state,
+ toasts: state.toasts.filter((t) => t.id !== action.toastId),
+ };
+ }
+};
+
+const listeners: Array<(state: State) => void> = [];
+
+let memoryState: State = { toasts: [] };
+
+function dispatch(action: Action) {
+ memoryState = reducer(memoryState, action);
+ listeners.forEach((listener) => {
+ listener(memoryState);
+ });
+}
+
+type Toast = Omit;
+
+function toast({ ...props }: Toast) {
+ const id = genId();
+
+ const update = (props: ToasterToast) =>
+ dispatch({
+ type: 'UPDATE_TOAST',
+ toast: { ...props, id },
+ });
+ const dismiss = () => dispatch({ type: 'DISMISS_TOAST', toastId: id });
+
+ dispatch({
+ type: 'ADD_TOAST',
+ toast: {
+ ...props,
+ id,
+ open: true,
+ onOpenChange: (open) => {
+ if (!open) dismiss();
+ },
+ },
+ });
+
+ return {
+ id: id,
+ dismiss,
+ update,
+ };
+}
+
+function useToast() {
+ const [state, setState] = React.useState(memoryState);
+
+ React.useEffect(() => {
+ listeners.push(setState);
+ return () => {
+ const index = listeners.indexOf(setState);
+ if (index > -1) {
+ listeners.splice(index, 1);
+ }
+ };
+ }, [state]);
+
+ return {
+ ...state,
+ toast,
+ dismiss: (toastId?: string) => dispatch({ type: 'DISMISS_TOAST', toastId }),
+ };
+}
+
+export { useToast, toast };
diff --git a/lib/utils.ts b/lib/utils.ts
new file mode 100644
index 0000000..2819a83
--- /dev/null
+++ b/lib/utils.ts
@@ -0,0 +1,6 @@
+import { clsx, type ClassValue } from 'clsx';
+import { twMerge } from 'tailwind-merge';
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs));
+}
diff --git a/package-lock.json b/package-lock.json
index f23b5ff..5b05b34 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,9 +8,16 @@
"name": "jiit-timetable",
"version": "0.1.0",
"dependencies": {
+ "@radix-ui/react-label": "^2.1.1",
+ "@radix-ui/react-toast": "^1.2.4",
+ "class-variance-authority": "^0.7.1",
+ "clsx": "^2.1.1",
+ "lucide-react": "^0.469.0",
"next": "15.1.3",
"react": "^19.0.0",
- "react-dom": "^19.0.0"
+ "react-dom": "^19.0.0",
+ "react-hook-form": "^7.54.2",
+ "tailwind-merge": "^2.6.0"
},
"devDependencies": {
"@eslint/eslintrc": "^3",
@@ -875,6 +882,330 @@
"node": ">=14"
}
},
+ "node_modules/@radix-ui/primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz",
+ "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==",
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/react-collection": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.1.tgz",
+ "integrity": "sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.1",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.1",
+ "@radix-ui/react-slot": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz",
+ "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-context": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz",
+ "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.3.tgz",
+ "integrity": "sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.1",
+ "@radix-ui/react-compose-refs": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.1",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "@radix-ui/react-use-escape-keydown": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-label": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.1.tgz",
+ "integrity": "sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-portal": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.3.tgz",
+ "integrity": "sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.0.1",
+ "@radix-ui/react-use-layout-effect": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-presence": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz",
+ "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.1",
+ "@radix-ui/react-use-layout-effect": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-primitive": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz",
+ "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-slot": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz",
+ "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-toast": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.4.tgz",
+ "integrity": "sha512-Sch9idFJHJTMH9YNpxxESqABcAFweJG4tKv+0zo0m5XBvUSL8FM5xKcJLFLXononpePs8IclyX1KieL5SDUNgA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.1",
+ "@radix-ui/react-collection": "1.1.1",
+ "@radix-ui/react-compose-refs": "1.1.1",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-dismissable-layer": "1.1.3",
+ "@radix-ui/react-portal": "1.1.3",
+ "@radix-ui/react-presence": "1.1.2",
+ "@radix-ui/react-primitive": "2.0.1",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0",
+ "@radix-ui/react-visually-hidden": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz",
+ "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz",
+ "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz",
+ "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz",
+ "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-visually-hidden": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.1.tgz",
+ "integrity": "sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@rtsao/scc": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
@@ -939,7 +1270,7 @@
"version": "19.0.2",
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.2.tgz",
"integrity": "sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"csstype": "^3.0.2"
@@ -949,7 +1280,7 @@
"version": "19.0.2",
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.2.tgz",
"integrity": "sha512-c1s+7TKFaDRRxr1TxccIX2u7sfCnc3RxkVyBIUA2lCpyqCF+QoAwQ/CBg7bsMdVwP120HEH143VQezKtef5nCg==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"peerDependencies": {
"@types/react": "^19.0.0"
@@ -1705,12 +2036,33 @@
"node": ">= 6"
}
},
+ "node_modules/class-variance-authority": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
+ "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "clsx": "^2.1.1"
+ },
+ "funding": {
+ "url": "https://polar.sh/cva"
+ }
+ },
"node_modules/client-only": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
"license": "MIT"
},
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/color": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
@@ -1805,7 +2157,7 @@
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
- "dev": true,
+ "devOptional": true,
"license": "MIT"
},
"node_modules/damerau-levenshtein": {
@@ -3843,6 +4195,15 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/lucide-react": {
+ "version": "0.469.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.469.0.tgz",
+ "integrity": "sha512-28vvUnnKQ/dBwiCQtwJw7QauYnE7yd2Cyp4tTTJpvglX4EMpbflcdBgrgToX2j71B3YvugK/NH3BGUk+E/p/Fw==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -4583,6 +4944,22 @@
"react": "^19.0.0"
}
},
+ "node_modules/react-hook-form": {
+ "version": "7.54.2",
+ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.54.2.tgz",
+ "integrity": "sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/react-hook-form"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17 || ^18 || ^19"
+ }
+ },
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
@@ -5354,6 +5731,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/tailwind-merge": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz",
+ "integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/dcastil"
+ }
+ },
"node_modules/tailwindcss": {
"version": "3.4.17",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
diff --git a/package.json b/package.json
index 92c43f0..83c0cca 100644
--- a/package.json
+++ b/package.json
@@ -9,19 +9,26 @@
"lint": "next lint"
},
"dependencies": {
+ "@radix-ui/react-label": "^2.1.1",
+ "@radix-ui/react-toast": "^1.2.4",
+ "class-variance-authority": "^0.7.1",
+ "clsx": "^2.1.1",
+ "lucide-react": "^0.469.0",
+ "next": "15.1.3",
"react": "^19.0.0",
"react-dom": "^19.0.0",
- "next": "15.1.3"
+ "react-hook-form": "^7.54.2",
+ "tailwind-merge": "^2.6.0"
},
"devDependencies": {
- "typescript": "^5",
+ "@eslint/eslintrc": "^3",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
- "postcss": "^8",
- "tailwindcss": "^3.4.1",
"eslint": "^9",
"eslint-config-next": "15.1.3",
- "@eslint/eslintrc": "^3"
+ "postcss": "^8",
+ "tailwindcss": "^3.4.1",
+ "typescript": "^5"
}
}
From 72771be7f407071ec5921d035f00a02ba005ed7b Mon Sep 17 00:00:00 2001
From: Tashif Ahmad Khan
Date: Sat, 4 Jan 2025 05:58:47 +0530
Subject: [PATCH 008/433] eeee
---
README.md | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/README.md b/README.md
index 6a06ee2..b943c5c 100644
--- a/README.md
+++ b/README.md
@@ -56,10 +56,10 @@ Welcome to the JIIT Personalized Schedule Creator, a Next.js + Flask-based appli
## Installation
1. Clone the repository and navigate:
-
+
```bash
- git clone https://github.com/your-username/jiit-schedule-creator.git
- cd jiit-schedule-creator/backend
+ git clone https://github.com/tashifkhan/JIIT-time-table-website
+ cd jiit-schedule-creator
```
2. Install dependencies:
@@ -94,9 +94,9 @@ We welcome contributions to enhance this project!
1. Fork the repository.
2. Create a new branch:
- ```bash
- git checkout -b feature-name
- ```
+```bash
+git checkout -b feature-name
+```
3. Commit changes and create a pull request.
From 967d4c3124cead93b3ecb521fc95ae5bfb0ac989 Mon Sep 17 00:00:00 2001
From: Tashif Ahmad Khan
Date: Sat, 4 Jan 2025 06:00:55 +0530
Subject: [PATCH 009/433] layout
---
app/favicon.ico | Bin 25931 -> 0 bytes
app/icon.png | Bin 0 -> 200106 bytes
app/layout.tsx | 34 ++++++++--------
app/page.tsx | 100 +++---------------------------------------------
4 files changed, 22 insertions(+), 112 deletions(-)
delete mode 100644 app/favicon.ico
create mode 100644 app/icon.png
diff --git a/app/favicon.ico b/app/favicon.ico
deleted file mode 100644
index 718d6fea4835ec2d246af9800eddb7ffb276240c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 25931
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
LrJugUA?W`A8`#=m
diff --git a/app/icon.png b/app/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..86cb101edc88c10f008dcabb15bad06f46870229
GIT binary patch
literal 200106
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