From e546519e7a07a738519f08677d8c64f3f78c70b4 Mon Sep 17 00:00:00 2001 From: ARJUN S THAMPI <61703062+arjun-thampi@users.noreply.github.com> Date: Wed, 25 Mar 2026 11:26:45 +0530 Subject: [PATCH] feat: add inquiry page --- frontend/src/App.tsx | 2 + frontend/src/api/inquiry.ts | 11 ++ frontend/src/components/layout/Sidebar.tsx | 4 + frontend/src/pages/inquiry.tsx | 167 +++++++++++++++++++++ 4 files changed, 184 insertions(+) create mode 100644 frontend/src/api/inquiry.ts create mode 100644 frontend/src/pages/inquiry.tsx diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index f2a027b..fb6e48f 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -17,6 +17,7 @@ import Appointment from "./pages/Appointment"; import EmailPage from "./pages/email"; import CareerPage from "./pages/Career"; import CandidatePage from "./pages/candidates"; +import InquiryPage from "./pages/inquiry"; export default function App() { return ( @@ -38,6 +39,7 @@ export default function App() { } /> } /> } /> + } /> diff --git a/frontend/src/api/inquiry.ts b/frontend/src/api/inquiry.ts new file mode 100644 index 0000000..e18d5ec --- /dev/null +++ b/frontend/src/api/inquiry.ts @@ -0,0 +1,11 @@ +import apiClient from "@/api/client"; + +export const getInquiriesApi = async () => { + const res = await apiClient.get("/inquiry/getAll"); + return res.data; +}; + +export const deleteInquiryApi = async (id: number) => { + const res = await apiClient.delete(`/inquiry/${id}`); + return res.data; +}; diff --git a/frontend/src/components/layout/Sidebar.tsx b/frontend/src/components/layout/Sidebar.tsx index d434faa..a7413e5 100644 --- a/frontend/src/components/layout/Sidebar.tsx +++ b/frontend/src/components/layout/Sidebar.tsx @@ -27,6 +27,10 @@ export default function Sidebar() { name: "Candidates", path: "/candidate", }, + { + name: "Inquiry", + path: "/inquiry", + }, { name: "Email", path: "/email", diff --git a/frontend/src/pages/inquiry.tsx b/frontend/src/pages/inquiry.tsx new file mode 100644 index 0000000..778243b --- /dev/null +++ b/frontend/src/pages/inquiry.tsx @@ -0,0 +1,167 @@ +import { useState, useEffect, useCallback } from "react"; + +import { getInquiriesApi, deleteInquiryApi } from "@/api/inquiry"; +import { exportToExcel } from "@/utils/exportToExcel"; + +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; + +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; + +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; + +import { Loader2, Trash, RefreshCw, Download } from "lucide-react"; + +export default function InquiryPage() { + const [inquiries, setInquiries] = useState([]); + const [loading, setLoading] = useState(true); + + const [searchText, setSearchText] = useState(""); + + const fetchAll = useCallback(async () => { + setLoading(true); + try { + const res = await getInquiriesApi(); + setInquiries(res?.data || []); + } catch (err) { + console.error(err); + } finally { + setLoading(false); + } + }, []); + + useEffect(() => { + fetchAll(); + }, [fetchAll]); + + const filteredInquiries = inquiries.filter((item) => { + return ( + item.fullName?.toLowerCase().includes(searchText.toLowerCase()) || + item.number?.includes(searchText) || + item.emailId?.toLowerCase().includes(searchText.toLowerCase()) || + item.subject?.toLowerCase().includes(searchText.toLowerCase()) + ); + }); + + async function handleDelete(id: number) { + if (!confirm("Delete inquiry?")) return; + await deleteInquiryApi(id); + fetchAll(); + } + + const handleExport = () => { + const exportData = filteredInquiries.map((item) => ({ + ID: item.id, + Name: item.fullName, + Phone: item.number, + Email: item.emailId, + Subject: item.subject, + Message: item.message, + Date: new Date(item.createdAt).toLocaleDateString(), + })); + + exportToExcel(exportData, "inquiries"); + }; + + return ( +
+
+

Inquiries

+ +
+ setSearchText(e.target.value)} + className="w-[260px]" + /> + + + + +
+
+ + + + Inquiry List + + + +
+ + + + ID + Name + Phone + Email + Subject + Message + Date + Actions + + + + + {loading ? ( + + + + + + ) : filteredInquiries.length === 0 ? ( + + + No inquiries found + + + ) : ( + filteredInquiries.map((item) => ( + + {item.id} + {item.fullName} + {item.number} + {item.emailId} + {item.subject} + + + {item.message} + + + + {new Date(item.createdAt).toLocaleDateString()} + + + + + + + )) + )} + +
+
+
+
+
+ ); +}