From afedf554792a0aa49efedc61de422d5d7737525b Mon Sep 17 00:00:00 2001 From: khushbu-25 Date: Mon, 13 Apr 2026 12:11:33 +0530 Subject: [PATCH] fix-sem-creation-form-and-instructor-name-issue Hide dashboard sections when the semester creation and Rename buttons in the admin header to "Create New Semester"-"Exit" and Remove confirmation popups from toggle switches in the course info and fixed- instructor name-issue --- .../instructor-panel/CourseInfo.tsx | 57 ++++++++++++++--- .../university-admin/DashboardHeader.tsx | 44 ++++++------- .../api/access-control/get-acl-userdetails.ts | 8 +-- .../api/access-control/get-all-members.ts | 11 ++-- .../add-course-to-semester.ts | 8 +-- .../u/[institution]/university-admin.tsx | 63 ++++++++++++------- 6 files changed, 124 insertions(+), 67 deletions(-) diff --git a/packages/alea-frontend/components/instructor-panel/CourseInfo.tsx b/packages/alea-frontend/components/instructor-panel/CourseInfo.tsx index d16a28eaa..81905e6cd 100644 --- a/packages/alea-frontend/components/instructor-panel/CourseInfo.tsx +++ b/packages/alea-frontend/components/instructor-panel/CourseInfo.tsx @@ -32,6 +32,47 @@ import { useRouter } from 'next/router'; import { getLocaleObject } from '../../lang/utils'; import { useEffect, useState } from 'react'; +function parseInstructors(val: unknown): Array<{ id: string; name: string }> { + if (val == null) return []; + if (Array.isArray(val)) { + return val.map((v: any) => { + if (typeof v === 'string') { + return { id: v, name: v }; + } + return { + id: v.id || v.name || '', + name: v.name || v.id || '', + }; + }); + } + if (typeof val === 'string') { + const s = val.trim(); + if (!s) return []; + + try { + const parsed = JSON.parse(s); + + if (Array.isArray(parsed)) { + return parsed.map((v: any) => { + if (typeof v === 'string') { + return { id: v, name: v }; + } + return { + id: v.id || v.name || '', + name: v.name || v.id || '', + }; + }); + } + + return []; + } catch { + return [{ id: s, name: s }]; + } + } + + return []; +} + interface CourseInfoTabProps { courseId: string; instanceId: string; @@ -114,10 +155,8 @@ export default function CourseInfoTab({ courseId, instanceId }: CourseInfoTabPro } try { - const savedInstructors = resolvedInfo!.instructors ?? []; - const savedMap = new Map( - resolvedInfo.instructors.map((s) => [s.id, s]) - ); + const savedInstructors = parseInstructors(resolvedInfo!.instructors); + const savedMap = new Map(savedInstructors.map((s) => [s.id, s])); const aclIds = await getCourseAcls(courseId, instanceId); const instructorAclIds = (aclIds || []).filter((id) => id.endsWith('-instructors')); @@ -323,7 +362,6 @@ export default function CourseInfoTab({ courseId, instanceId }: CourseInfoTabPro checked={courseInfo.hasHomework || false} onChange={async (e) => { const next = e.target.checked; - if (!confirm(t.confirmUpdateHomework)) return; try { await updateHasHomework({ courseId, instanceId, hasHomework: next }); @@ -344,7 +382,6 @@ export default function CourseInfoTab({ courseId, instanceId }: CourseInfoTabPro checked={courseInfo.hasQuiz || false} onChange={async (e) => { const next = e.target.checked; - if (!confirm(t.confirmUpdateQuiz)) return; try { await updateHasQuiz({ courseId, instanceId, hasQuiz: next }); @@ -365,7 +402,6 @@ export default function CourseInfoTab({ courseId, instanceId }: CourseInfoTabPro checked={courseInfo.hasCheatsheet || false} onChange={async (e) => { const next = e.target.checked; - if (!confirm(t.confirmUpdateCheatsheet)) return; try { await updateHasCheatsheet({ courseId, instanceId, hasCheatsheet: next }); @@ -385,10 +421,13 @@ export default function CourseInfoTab({ courseId, instanceId }: CourseInfoTabPro checked={courseInfo.canStudentUploadCheatsheet || false} onChange={async (e) => { const next = e.target.checked; - if (!confirm(t.confirmUpdateCanStudentUploadCheatsheet)) return; try { - await updateCanStudentUploadCheatsheet({ courseId, instanceId, canStudentUploadCheatsheet: next }); + await updateCanStudentUploadCheatsheet({ + courseId, + instanceId, + canStudentUploadCheatsheet: next, + }); setField('canStudentUploadCheatsheet', next); } catch (err) { console.error('Failed to update student cheatsheet upload', err); diff --git a/packages/alea-frontend/components/university-admin/DashboardHeader.tsx b/packages/alea-frontend/components/university-admin/DashboardHeader.tsx index 2688d2214..7c92a07b9 100644 --- a/packages/alea-frontend/components/university-admin/DashboardHeader.tsx +++ b/packages/alea-frontend/components/university-admin/DashboardHeader.tsx @@ -36,33 +36,35 @@ export const DashboardHeader: React.FC = ({ University Admin Dashboard - - Semester - - + {!showSemForm && ( + + Semester + + + )} diff --git a/packages/alea-frontend/pages/api/access-control/get-acl-userdetails.ts b/packages/alea-frontend/pages/api/access-control/get-acl-userdetails.ts index ed2384a9b..3b1a44a3b 100644 --- a/packages/alea-frontend/pages/api/access-control/get-acl-userdetails.ts +++ b/packages/alea-frontend/pages/api/access-control/get-acl-userdetails.ts @@ -21,16 +21,16 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) if (directMembers.length === 0) { return res.status(200).send([]); } - const userIdPlaceholders = directMembers.map(() => '?').join(', '); - const userInfoResults: { firstname: string; lastname: string; userId: string }[] = + const placeholders = directMembers.map(() => '?').join(','); + const userInfoResults: { firstName: string; lastName: string; userId: string }[] = await executeDontEndSet500OnError( - `SELECT firstName as firstname, lastName as lastname, userId FROM userInfo WHERE userId IN (${userIdPlaceholders})`, + `select firstName, lastName, userId from userInfo where userId IN (${placeholders})`, directMembers, res ); const result = directMembers.map((userId) => { const userInfo = userInfoResults.find((record) => record.userId === userId); - const fullName = userInfo ? `${userInfo.firstname} ${userInfo.lastname}` : ''; + const fullName = userInfo ? `${userInfo.firstName} ${userInfo.lastName}` : ''; return { fullName, userId }; }); res.status(200).send(result); diff --git a/packages/alea-frontend/pages/api/access-control/get-all-members.ts b/packages/alea-frontend/pages/api/access-control/get-all-members.ts index 7be99a3c3..ecc506381 100644 --- a/packages/alea-frontend/pages/api/access-control/get-all-members.ts +++ b/packages/alea-frontend/pages/api/access-control/get-all-members.ts @@ -11,14 +11,15 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) if (!members || members.length === 0) { return res.status(200).send([]); } - - const result: { firstname: string; lastname: string; userId: string }[] = + + const placeholders = members.map(() => '?').join(','); + const result: { firstName: string; lastName: string; userId: string }[] = await executeDontEndSet500OnError( - `select firstname, lastname, userId from userInfo where userId IN (?)`, - [members], + `select firstName, lastName, userId from userInfo where userId IN (${placeholders})`, + members, res ); res .status(200) - .send(result.map((c) => ({ fullName: `${c.firstname} ${c.lastname}`, userId: c.userId }))); + .send(result.map((c) => ({ fullName: `${c.firstName} ${c.lastName}`, userId: c.userId }))); } diff --git a/packages/alea-frontend/pages/api/university-admin/semester-courses/add-course-to-semester.ts b/packages/alea-frontend/pages/api/university-admin/semester-courses/add-course-to-semester.ts index c5d3ed81e..7e26c62a0 100644 --- a/packages/alea-frontend/pages/api/university-admin/semester-courses/add-course-to-semester.ts +++ b/packages/alea-frontend/pages/api/university-admin/semester-courses/add-course-to-semester.ts @@ -34,8 +34,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) } const alreadyExistCourseIdRow = await executeAndEndSet500OnError( - `SELECT courseName, notes, landing, slides, teaser - FROM courseMetadata + `SELECT courseName, notes, landing, slides, teaser, instructors FROM courseMetadata WHERE courseId = ? AND universityId = ? LIMIT 1`, [courseId, universityId], @@ -48,6 +47,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) let landing = ''; let slides = ''; let teaser: string | null = null; + let instructors: any = []; if (Array.isArray(alreadyExistCourseIdRow) && alreadyExistCourseIdRow.length > 0) { const template = alreadyExistCourseIdRow[0] as any; @@ -56,9 +56,9 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) landing = template?.landing || landing; slides = template?.slides || slides; teaser = template?.teaser ?? teaser; + instructors = template?.instructors || instructors; } - const insertResult = await executeAndEndSet500OnError( `INSERT INTO courseMetadata ( courseId, @@ -92,7 +92,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) landing, slides, teaser, - JSON.stringify([]), + typeof instructors === 'string' ? instructors : JSON.stringify(instructors), ], res ); diff --git a/packages/alea-frontend/pages/u/[institution]/university-admin.tsx b/packages/alea-frontend/pages/u/[institution]/university-admin.tsx index 33b0f295e..ebe46b5a9 100644 --- a/packages/alea-frontend/pages/u/[institution]/university-admin.tsx +++ b/packages/alea-frontend/pages/u/[institution]/university-admin.tsx @@ -2,11 +2,7 @@ import { useEffect, useState } from 'react'; import { Box, Paper, Typography } from '@mui/material'; import { useRouter } from 'next/router'; import MainLayout from '../../../layouts/MainLayout'; -import { - getSemesterInfo, - getInstances, - SemesterData, -} from '@alea/spec'; +import { getSemesterInfo, getInstances, SemesterData } from '@alea/spec'; import { DashboardHeader } from '../../../components/university-admin/DashboardHeader'; import { SemesterForm } from '../../../components/university-admin/SemesterForm'; import { CourseManagement } from '../../../components/university-admin/CourseManagement'; @@ -121,9 +117,7 @@ export default function UniversityAdminDashboard() { Checking Authorization... - - Please wait while we verify your access. - + Please wait while we verify your access. @@ -186,13 +180,23 @@ export default function UniversityAdminDashboard() { /> {semesterOptions.length === 0 && !loadingOptions && ( - + No Semester Available - No semester is available to create semester info. Please add a new semester to create semester info. + No semester is available to create semester info. Please add a new semester to + create semester info. @@ -201,26 +205,37 @@ export default function UniversityAdminDashboard() { {showSemForm && ( )} - - - - - + - - - - - + + + + + + + + + + )}