"use client" import { useState } from 'react'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faSort, faSortUp, faSortDown } from '@fortawesome/free-solid-svg-icons'; const Exams = () => { const [sortField, setSortField] = useState<'grade' | 'date' | null>(null); const [sortOrder, setSortOrder] = useState<'asc' | 'desc' | null>(null); // Real exam data const stats = { average: 8.95, credits: { current: 108, total: 240 }, passed: 19, remaining: 22 }; const exams = [ { id: 1, code: "F23L1W005", subject: "Бизнис и менаџмент", session: "2024 (Зимска) Прва испитна сесија", date: "21.02.2024", semester: 1, credits: 6.00, type: "З", grade: 7 }, { id: 2, code: "F23L1W007", subject: "Вовед во компјутерските науки", session: "2024 (Зимска) Прва испитна сесија", date: "06.02.2024", semester: 1, credits: 6.00, type: "З", grade: 10 }, { id: 3, code: "F23L2W003", subject: "Избрани теми од математика", session: "2024 (Зимска) Прва испитна сесија", date: "12.02.2024", semester: 1, credits: 6.00, type: "З", grade: 9 }, { id: 4, code: "F23L1W018", subject: "Професионални вештини", session: "2024 (Зимска) Прва испитна сесија", date: "01.02.2024", semester: 1, credits: 4.00, type: "З", grade: 9 }, { id: 5, code: "F23L1W004", subject: "Спорт и здравје", session: "2024 (Летна) Втора испитна сесија", date: "15.07.2024", semester: 1, credits: 2.00, type: "З", grade: "Реализиран" }, { id: 6, code: "F23L1W020", subject: "Структурно програмирање", session: "2024 (Зимска) Прва испитна сесија", date: "12.02.2024", semester: 1, credits: 6.00, type: "З", grade: 10 }, { id: 7, code: "F23L1S003", subject: "Архитектура и организација на компјутери", session: "2024 (Летна) Втора испитна сесија", date: "03.07.2024", semester: 2, credits: 6.00, type: "З", grade: 9 }, { id: 8, code: "F23L1S023", subject: "Бизнис статистика", session: "2024 (Летна) Втора испитна сесија", date: "02.07.2024", semester: 2, credits: 6.00, type: "З", grade: 8 }, { id: 9, code: "F23L1S120", subject: "Креативни вештини за решавање проблеми", session: "2024 (Летна) Втора испитна сесија", date: "25.06.2024", semester: 2, credits: 6.00, type: "И", grade: 10 }, { id: 10, code: "F23L1S016", subject: "Објектно-ориентирано програмирање", session: "2024 (Летна) Втора испитна сесија", date: "13.07.2024", semester: 2, credits: 6.00, type: "З", grade: 10 }, { id: 11, code: "F23L1S146", subject: "Основи на Веб дизајн", session: "2024 (Летна) Втора испитна сесија", date: "24.06.2024", semester: 2, credits: 6.00, type: "З", grade: 10 }, { id: 12, code: "F23L2W100", subject: "Економија за ИКТ инженери", session: "2025 (Зимска) Прва испитна сесија", date: "03.02.2025", semester: 3, credits: 6.00, type: "З", grade: 8 }, { id: 13, code: "F23L2W109", subject: "Интернет програмирање на клиентска страна", session: "2025 (Зимска) Прва испитна сесија", date: "30.01.2025", semester: 3, credits: 6.00, type: "И", grade: 10 }, { id: 14, code: "F23L2W014", subject: "Компјутерски мрежи и безбедност", session: "2025 (Зимска) Прва испитна сесија", date: "10.02.2025", semester: 3, credits: 6.00, type: "З", grade: 7 }, { id: 15, code: "F23L2W201", subject: "Примена на алгоритми и податочни структури", session: "2025 (Зимска) Прва испитна сесија", date: "13.02.2025", semester: 3, credits: 6.00, type: "З", grade: 10 }, { id: 16, code: "F23L2W167", subject: "Шаблони за дизајн на кориснички интерфејси", session: "2025 (Зимска) Прва испитна сесија", date: "06.02.2025", semester: 3, credits: 6.00, type: "И", grade: 10 }, { id: 17, code: "F23L2S026", subject: "Маркетинг", session: "2025 (Летна) Втора испитна сесија", date: "12.06.2025", semester: 4, credits: 6.00, type: "З", grade: 8 }, { id: 18, code: "F23L2S017", subject: "Оперативни системи", session: "2025 (Летна) Втора испитна сесија", date: "19.06.2025", semester: 4, credits: 6.00, type: "З", grade: 7 }, { id: 19, code: "F23L2S029", subject: "Софтверско инженерство", session: "2025 (Летна) Втора испитна сесија", date: "23.06.2025", semester: 4, credits: 6.00, type: "З", grade: 8 } ]; const getGradeColor = (grade: number | string) => { if (grade === "Реализиран") return "bg-blue-100 text-blue-800 border-blue-200"; if (typeof grade === "number") { if (grade >= 9) return "bg-green-100 text-green-800 border-green-200"; if (grade >= 8) return "bg-yellow-100 text-yellow-800 border-yellow-200"; if (grade >= 6) return "bg-orange-100 text-orange-800 border-orange-200"; return "bg-red-100 text-red-800 border-red-200"; } return "bg-gray-100 text-gray-800 border-gray-200"; }; const handleSortByGrade = () => { if (sortField === 'grade') { if (sortOrder === 'desc') { setSortOrder('asc'); } else if (sortOrder === 'asc') { setSortField(null); setSortOrder(null); } else { setSortOrder('desc'); } } else { setSortField('grade'); setSortOrder('desc'); } }; const handleSortByDate = () => { if (sortField === 'date') { if (sortOrder === 'desc') { setSortOrder('asc'); } else if (sortOrder === 'asc') { setSortField(null); setSortOrder(null); } else { setSortOrder('desc'); } } else { setSortField('date'); setSortOrder('desc'); } }; const getSortedExams = () => { if (!sortField || !sortOrder) return exams; return [...exams].sort((a, b) => { if (sortField === 'grade') { // Handle "Реализиран" grade separately if (a.grade === "Реализиран" && b.grade === "Реализиран") return 0; if (a.grade === "Реализиран") return sortOrder === 'asc' ? -1 : 1; if (b.grade === "Реализиран") return sortOrder === 'asc' ? 1 : -1; // Handle numeric grades const gradeA = typeof a.grade === 'number' ? a.grade : 0; const gradeB = typeof b.grade === 'number' ? b.grade : 0; return sortOrder === 'asc' ? gradeA - gradeB : gradeB - gradeA; } if (sortField === 'date') { // Convert date strings to Date objects for proper sorting const dateA = new Date(a.date.split('.').reverse().join('-')); // Convert DD.MM.YYYY to YYYY-MM-DD const dateB = new Date(b.date.split('.').reverse().join('-')); return sortOrder === 'asc' ? dateA.getTime() - dateB.getTime() : dateB.getTime() - dateA.getTime(); } return 0; }); }; const getSortIcon = (field: 'grade' | 'date') => { if (sortField === field) { if (sortOrder === 'asc') return faSortUp; if (sortOrder === 'desc') return faSortDown; } return faSort; }; const creditsPercentage = (stats.credits.current / stats.credits.total) * 100; return (
{/* Statistics Section */}
{/* Average Grade */}
{stats.average}
Просек
{/* Credits */}
{stats.credits.current} /{stats.credits.total}
Кредити
{/* Passed Exams */}
{stats.passed}
Положени
{/* Remaining Exams */}
{stats.remaining}
Останато
{/* Progress Bar spanning entire statistics section */}
{/* Exams Table */}

Испити

{getSortedExams().map((exam) => ( ))}
# Предмет Семестар Кредити
{exam.id} {exam.subject} {exam.semester} {exam.credits} {exam.date} {exam.grade}
); }; export default Exams;