feat: redesign Exams List page to show submitted custom exams

- Added Custom Exams tab showing all exams from Generation page
- Displays title, module badges, duration, and status
- Added Create Exam button
- Kept Exam Sessions tab for institutional sessions
- Search filters across exams

Made-with: Cursor
This commit is contained in:
Yamen Ahmad
2026-04-12 11:07:54 +04:00
parent 677ba85c77
commit 1e688107fa
22591 changed files with 3100321 additions and 95 deletions

42
node_modules/input-otp/dist/index.d.mts generated vendored Normal file
View File

@@ -0,0 +1,42 @@
import * as React$1 from 'react';
interface SlotProps {
isActive: boolean;
char: string | null;
placeholderChar: string | null;
hasFakeCaret: boolean;
}
interface RenderProps {
slots: SlotProps[];
isFocused: boolean;
isHovering: boolean;
}
type OverrideProps<T, R> = Omit<T, keyof R> & R;
type OTPInputBaseProps = OverrideProps<React.InputHTMLAttributes<HTMLInputElement>, {
value?: string;
onChange?: (newValue: string) => unknown;
maxLength: number;
textAlign?: 'left' | 'center' | 'right';
onComplete?: (...args: any[]) => unknown;
pushPasswordManagerStrategy?: 'increase-width' | 'none';
pasteTransformer?: (pasted: string) => string;
containerClassName?: string;
noScriptCSSFallback?: string | null;
}>;
type InputOTPRenderFn = (props: RenderProps) => React.ReactNode;
type OTPInputProps = OTPInputBaseProps & ({
render: InputOTPRenderFn;
children?: never;
} | {
render?: never;
children: React.ReactNode;
});
declare const OTPInputContext: React$1.Context<RenderProps>;
declare const OTPInput: React$1.ForwardRefExoticComponent<OTPInputProps & React$1.RefAttributes<HTMLInputElement>>;
declare const REGEXP_ONLY_DIGITS = "^\\d+$";
declare const REGEXP_ONLY_CHARS = "^[a-zA-Z]+$";
declare const REGEXP_ONLY_DIGITS_AND_CHARS = "^[a-zA-Z0-9]+$";
export { OTPInput, OTPInputContext, type OTPInputProps, REGEXP_ONLY_CHARS, REGEXP_ONLY_DIGITS, REGEXP_ONLY_DIGITS_AND_CHARS, type RenderProps, type SlotProps };

42
node_modules/input-otp/dist/index.d.ts generated vendored Normal file
View File

@@ -0,0 +1,42 @@
import * as React$1 from 'react';
interface SlotProps {
isActive: boolean;
char: string | null;
placeholderChar: string | null;
hasFakeCaret: boolean;
}
interface RenderProps {
slots: SlotProps[];
isFocused: boolean;
isHovering: boolean;
}
type OverrideProps<T, R> = Omit<T, keyof R> & R;
type OTPInputBaseProps = OverrideProps<React.InputHTMLAttributes<HTMLInputElement>, {
value?: string;
onChange?: (newValue: string) => unknown;
maxLength: number;
textAlign?: 'left' | 'center' | 'right';
onComplete?: (...args: any[]) => unknown;
pushPasswordManagerStrategy?: 'increase-width' | 'none';
pasteTransformer?: (pasted: string) => string;
containerClassName?: string;
noScriptCSSFallback?: string | null;
}>;
type InputOTPRenderFn = (props: RenderProps) => React.ReactNode;
type OTPInputProps = OTPInputBaseProps & ({
render: InputOTPRenderFn;
children?: never;
} | {
render?: never;
children: React.ReactNode;
});
declare const OTPInputContext: React$1.Context<RenderProps>;
declare const OTPInput: React$1.ForwardRefExoticComponent<OTPInputProps & React$1.RefAttributes<HTMLInputElement>>;
declare const REGEXP_ONLY_DIGITS = "^\\d+$";
declare const REGEXP_ONLY_CHARS = "^[a-zA-Z]+$";
declare const REGEXP_ONLY_DIGITS_AND_CHARS = "^[a-zA-Z0-9]+$";
export { OTPInput, OTPInputContext, type OTPInputProps, REGEXP_ONLY_CHARS, REGEXP_ONLY_DIGITS, REGEXP_ONLY_DIGITS_AND_CHARS, type RenderProps, type SlotProps };

21
node_modules/input-otp/dist/index.js generated vendored Normal file

File diff suppressed because one or more lines are too long

1
node_modules/input-otp/dist/index.js.map generated vendored Normal file

File diff suppressed because one or more lines are too long

21
node_modules/input-otp/dist/index.mjs generated vendored Normal file

File diff suppressed because one or more lines are too long

1
node_modules/input-otp/dist/index.mjs.map generated vendored Normal file

File diff suppressed because one or more lines are too long