From 5a751e0aea31c86ad2351aa799f4bdf800eab87b Mon Sep 17 00:00:00 2001 From: Ansh Agnihotry Date: Fri, 14 Aug 2026 17:01:11 +0530 Subject: [PATCH 1/4] galti sudharlo(edit option) --- public/sitemap-0.xml | 63 +- src/components/panelist/ApplicantEditForm.tsx | 408 ++++++++ src/components/panelist/ApplicantFormView.tsx | 441 +++++++- .../supabase/actions/applicants.actions.ts | 300 +++++- yarn.lock | 989 +++++++++++++----- 5 files changed, 1805 insertions(+), 396 deletions(-) create mode 100644 src/components/panelist/ApplicantEditForm.tsx diff --git a/public/sitemap-0.xml b/public/sitemap-0.xml index 9a1f304..6b2c38c 100644 --- a/public/sitemap-0.xml +++ b/public/sitemap-0.xml @@ -1,33 +1,36 @@ -https://roboticspec.com2026-08-10T09:07:57.626Zdaily0.7 -https://roboticspec.com/activities2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/admin2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/admin/components/ActivitiesEditor2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/admin/components/BlogsEditor2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/admin/components/BubbleMenu2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/admin/components/EventsEditor2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/admin/components/FormatButton2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/admin/components/HeroEditor2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/admin/components/MarkdownEditor2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/admin/components/MenuBar2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/admin/components/ProjectsEditor2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/admin/components/ResourceEditor2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/admin/components/Role2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/admin/components/SelectSearch2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/admin/components/TeamEditor2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/admin/components/role/RoleAccordion2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/admin/components/role/RolesPanel2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/admin/components/role/UserRow2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/admin/components/role/UsersPanel2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/admin/page2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/contact2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/events2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/events/components/EventCalendar2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/login2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/login/callback2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/project2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/project/components/ProjectCard2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/resources2026-08-10T09:07:57.627Zdaily0.7 -https://roboticspec.com/resources/components/ResourceCard2026-08-10T09:07:57.627Zdaily0.7 +https://roboticspec.com2026-08-14T11:28:46.391Zdaily0.7 +https://roboticspec.com/activities2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/admin2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/admin/components/ActivitiesEditor2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/admin/components/BlogsEditor2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/admin/components/BubbleMenu2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/admin/components/EventsEditor2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/admin/components/FormatButton2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/admin/components/HeroEditor2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/admin/components/MarkdownEditor2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/admin/components/MenuBar2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/admin/components/ProjectsEditor2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/admin/components/ResourceEditor2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/admin/components/Role2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/admin/components/SelectSearch2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/admin/components/TeamEditor2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/admin/components/role/RoleAccordion2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/admin/components/role/RolesPanel2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/admin/components/role/UserRow2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/admin/components/role/UsersPanel2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/admin/page2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/apply2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/contact2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/events2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/events/components/EventCalendar2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/login2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/login/callback2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/panelist2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/panelist/dashboard2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/project2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/project/components/ProjectCard2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/resources2026-08-14T11:28:46.392Zdaily0.7 +https://roboticspec.com/resources/components/ResourceCard2026-08-14T11:28:46.392Zdaily0.7 \ No newline at end of file diff --git a/src/components/panelist/ApplicantEditForm.tsx b/src/components/panelist/ApplicantEditForm.tsx new file mode 100644 index 0000000..bd30f96 --- /dev/null +++ b/src/components/panelist/ApplicantEditForm.tsx @@ -0,0 +1,408 @@ +import { useEffect, useState } from "react"; + +import { ApplicantType } from "@/types"; + +import { Input } from "@/components/ui/input"; +import { Textarea } from "@/components/ui/textarea"; +import { Button } from "@/components/ui/button"; + +import { + Save, + X, +} from "lucide-react"; + +import { APPLICATION_QUESTIONS } from "../ApplicationForm"; + +export interface ApplicantEditFormProps { + applicant: ApplicantType; + + onSave: ( + updatedApplicant: ApplicantType + ) => Promise; + + onCancel: () => void; +} + +const ApplicantEditForm = ({ + applicant, + onSave, + onCancel, +}: ApplicantEditFormProps) => { + const [name, setName] = useState( + applicant.name || "" + ); + + const [sid, setSid] = useState( + applicant.sid || "" + ); + + const [phone, setPhone] = useState( + applicant.phone || "" + ); + + const [branch, setBranch] = useState( + applicant.branch || "" + ); + + const [remarks, setRemarks] = useState( + applicant.remarks || "" + ); + + const [responses, setResponses] = + useState>( + applicant.responses || {} + ); + + const [isSaving, setIsSaving] = + useState(false); + + /* + * Refresh form when applicant changes. + */ + useEffect(() => { + setName(applicant.name || ""); + setSid(applicant.sid || ""); + setPhone(applicant.phone || ""); + setBranch(applicant.branch || ""); + setRemarks(applicant.remarks || ""); + + setResponses( + applicant.responses || {} + ); + }, [applicant]); + + /* + * Update an application response. + */ + const handleResponseChange = ( + questionId: string, + value: string + ) => { + setResponses((current) => ({ + ...current, + [questionId]: value, + })); + }; + + /* + * Save. + */ + const handleSave = async () => { + if (isSaving) { + return; + } + + if (!name.trim()) { + alert("Name cannot be empty."); + return; + } + + if (!sid.trim()) { + alert("SID cannot be empty."); + return; + } + + if ( + !applicant.isWalkin && + !branch.trim() + ) { + alert("Branch cannot be empty."); + return; + } + + setIsSaving(true); + + try { + const updatedApplicant: + ApplicantType = { + ...applicant, + + name: name.trim(), + + sid: sid.trim(), + + phone: phone.trim(), + + remarks: + remarks.trim(), + + ...(applicant.isWalkin + ? {} + : { + branch: + branch.trim(), + + responses, + }), + }; + + await onSave( + updatedApplicant + ); + } catch (error) { + console.error( + "Error saving applicant:", + error + ); + + alert( + "Failed to save applicant changes." + ); + } finally { + setIsSaving(false); + } + }; + + return ( +
+ + {/* Scrollable form */} +
+ +
+ +

+ Edit Applicant +

+ + {/* Basic information */} +
+ + {/* Name */} +
+ + + + setName( + e.target.value + ) + } + placeholder="Applicant name" + /> +
+ + {/* SID */} +
+ + + + setSid( + e.target.value + ) + } + placeholder="Student ID" + /> +
+ + {/* Phone */} +
+ + + + setPhone( + e.target.value + ) + } + placeholder="Phone number" + /> +
+ + {/* Branch */} + {!applicant.isWalkin && ( +
+ + + + setBranch( + e.target.value + ) + } + placeholder="Branch" + /> +
+ )} + +
+ + {/* ------------------------------------------------ + Remarks + ------------------------------------------------ */} +
+ + + +