From a7d6cd63f12f45a15f8dd82d8dada3864fe04e84 Mon Sep 17 00:00:00 2001 From: Hardik Gupta Date: Fri, 15 Aug 2025 23:14:48 +0530 Subject: [PATCH 1/4] udpatetoastlatest --- src/pages/AttendancePage/AttendancePage.jsx | 67 ++++++++++++++------- 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/src/pages/AttendancePage/AttendancePage.jsx b/src/pages/AttendancePage/AttendancePage.jsx index e5df8584..6e66df03 100644 --- a/src/pages/AttendancePage/AttendancePage.jsx +++ b/src/pages/AttendancePage/AttendancePage.jsx @@ -22,6 +22,7 @@ const AttendancePage = () => { const [attendedUser, setAttendedUser] = useState(null); const [hasShownAlert, setHasShownAlert] = useState(false); const [isSuccess, setIsSuccess] = useState(false); + const [alertShown, setAlertShown] = useState(false); const authCtx = useContext(AuthContext); useEffect(() => { @@ -82,19 +83,24 @@ const AttendancePage = () => { setScanner(qrScanner); } catch (error) { console.error("Error initializing scanner:", error); - if (!hasShownAlert) { + if (!alertShown) { Alert({ type: "error", message: "Failed to initialize QR scanner", position: "top-right", }); - setHasShownAlert(true); + setAlertShown(true); } setShowScanner(false); } }; const onScanSuccess = async (decodedText) => { + // Prevent multiple scans if already processing or alert shown + if (isScanning || alertShown) { + return; + } + setIsScanning(true); console.log("QR Code scanned successfully:", decodedText); console.log("Selected Event ID:", selectedEventId); @@ -118,18 +124,28 @@ const AttendancePage = () => { // store user details setAttendedUser(response.data.user || response.data); setIsSuccess(true); + + // Stop scanner and clear it if (scanner) { - scanner.clear(); + try { + scanner.clear(); + } catch (error) { + console.error("Error clearing scanner:", error); + } } + setShowSuccessModal(true); setIsScanning(false); - // show success alert - Alert({ - type: "success", - message: "Attendance marked successfully!", - position: "top-right", - }); + // show success alert only if no alert has been shown + if (!alertShown) { + Alert({ + type: "success", + message: "Attendance marked successfully!", + position: "top-right", + }); + setAlertShown(true); + } return; // exit early } @@ -149,14 +165,23 @@ const AttendancePage = () => { errorMessage = error.response.data.message; } - // show error alert - if (!hasShownAlert) { + // show error alert only if no alert has been shown + if (!alertShown) { Alert({ type: "error", message: errorMessage, position: "top-right", }); - setHasShownAlert(true); + setAlertShown(true); + } + + // Stop scanner after error to prevent multiple scans + if (scanner) { + try { + scanner.clear(); + } catch (error) { + console.error("Error clearing scanner:", error); + } } } finally { setIsScanning(false); @@ -170,7 +195,7 @@ const AttendancePage = () => { const handleScanQR = (eventId) => { setSelectedEventId(eventId); setShowScanner(true); - setHasShownAlert(false); // reset alert state + setAlertShown(false); // reset alert state setIsSuccess(false); // reset success state }; @@ -180,7 +205,7 @@ const AttendancePage = () => { // auto open scanner for next scan setTimeout(() => { setShowScanner(true); - setHasShownAlert(false); // reset alert state + setAlertShown(false); // reset alert state setIsSuccess(false); // reset success state }, 100); }; @@ -189,15 +214,15 @@ const AttendancePage = () => { const handleDownloadAttendance = async (eventId) => { try { - const response = await api.get(`/api/form/export-attendance/${eventId}?format=xlsx`, { + const response = await api.get(`/api/form/download/${eventId}`, { headers: { Authorization: `Bearer ${authCtx.token}` }, responseType: "blob", }); - const blob = new Blob([response.data], { type: "text/xlsx" }); + const blob = new Blob([response.data], { type: "text/csv" }); const url = window.URL.createObjectURL(blob); const link = document.createElement("a"); link.href = url; - link.setAttribute("download", `attendance_${eventId}.xlsx`); + link.setAttribute("download", `attendance_${eventId}.csv`); document.body.appendChild(link); link.click(); link.remove(); @@ -219,14 +244,14 @@ const AttendancePage = () => { errorMessage = error.response.data.message; } - // show error alert - if (!isSuccess && !hasShownAlert) { + // show error alert only if no alert has been shown + if (!alertShown) { Alert({ type: "error", message: errorMessage, position: "top-right", }); - setHasShownAlert(true); + setAlertShown(true); } console.error("Download error:", error); } @@ -263,7 +288,6 @@ const AttendancePage = () => { style={{ padding: "8px 16px", backgroundColor: "rgba(255, 138, 0, 0.9)" }} > - Attendance ); @@ -322,6 +346,7 @@ const AttendancePage = () => { } setShowScanner(false); setScanner(null); + setAlertShown(false); // reset alert state when closing scanner }} > From 746f66a58e42d78dd1724ce7a3aedca6a54926b5 Mon Sep 17 00:00:00 2001 From: Hardik Gupta Date: Thu, 21 Aug 2025 12:12:09 +0530 Subject: [PATCH 2/4] Attendance Sidebar --- src/App.jsx | 15 +++++---------- src/layouts/Profile/Sidebar/Sidebar.jsx | 24 +++++++++++++++++++++++- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 4684d98b..ff062477 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -123,11 +123,11 @@ function App() { {authCtx.user.access === "ADMIN" ? ( } /> ) : ( - <> - } /> - } /> - + } /> )} + + } /> + } /> {authCtx.user.access === "ADMIN" && ( @@ -140,11 +140,6 @@ function App() { authCtx.user.access === "SENIOR_EXECUTIVE_CREATIVE") && ( } /> )} - {/* Certificates Route */} - - {authCtx.user.access === "ADMIN" && ( - } /> - )} {authCtx.user.access === "ADMIN" && ( ]} /> )} - } /> + } /> )} { ); + const renderCertificateMenu = () => ( +
handleChange("Certificates")} + style={{ + background: activepage === "Certificates" ? "var(--primary)" : "transparent", + WebkitBackgroundClip: activepage === "Certificates" ? "text" : "initial", + backgroundClip: activepage === "Certificates" ? "text" : "initial", + color: activepage === "Certificates" ? "transparent" : "inherit", + }} + > + {" "} + Certificates +
+ ); + return ( <>
@@ -304,6 +325,7 @@ const Sidebar = ({ activepage, handleChange }) => {
)} + {renderCertificateMenu()} )} From bfe103d4043b28ba83730f403e40d444b85a2272 Mon Sep 17 00:00:00 2001 From: Hardik Gupta Date: Thu, 21 Aug 2025 12:14:51 +0530 Subject: [PATCH 3/4] attendance fix --- src/App.jsx | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index ff062477..4684d98b 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -123,11 +123,11 @@ function App() { {authCtx.user.access === "ADMIN" ? ( } /> ) : ( - } /> + <> + } /> + } /> + )} - - } /> - } /> {authCtx.user.access === "ADMIN" && ( @@ -140,6 +140,11 @@ function App() { authCtx.user.access === "SENIOR_EXECUTIVE_CREATIVE") && ( } /> )} + {/* Certificates Route */} + + {authCtx.user.access === "ADMIN" && ( + } /> + )} {authCtx.user.access === "ADMIN" && ( ]} /> )} - } /> + } /> )} Date: Thu, 21 Aug 2025 12:16:55 +0530 Subject: [PATCH 4/4] attendancefix --- src/pages/AttendancePage/AttendancePage.jsx | 69 +++++++-------------- 1 file changed, 22 insertions(+), 47 deletions(-) diff --git a/src/pages/AttendancePage/AttendancePage.jsx b/src/pages/AttendancePage/AttendancePage.jsx index 6e66df03..06486c43 100644 --- a/src/pages/AttendancePage/AttendancePage.jsx +++ b/src/pages/AttendancePage/AttendancePage.jsx @@ -22,7 +22,6 @@ const AttendancePage = () => { const [attendedUser, setAttendedUser] = useState(null); const [hasShownAlert, setHasShownAlert] = useState(false); const [isSuccess, setIsSuccess] = useState(false); - const [alertShown, setAlertShown] = useState(false); const authCtx = useContext(AuthContext); useEffect(() => { @@ -83,24 +82,19 @@ const AttendancePage = () => { setScanner(qrScanner); } catch (error) { console.error("Error initializing scanner:", error); - if (!alertShown) { + if (!hasShownAlert) { Alert({ type: "error", message: "Failed to initialize QR scanner", position: "top-right", }); - setAlertShown(true); + setHasShownAlert(true); } setShowScanner(false); } }; const onScanSuccess = async (decodedText) => { - // Prevent multiple scans if already processing or alert shown - if (isScanning || alertShown) { - return; - } - setIsScanning(true); console.log("QR Code scanned successfully:", decodedText); console.log("Selected Event ID:", selectedEventId); @@ -124,28 +118,18 @@ const AttendancePage = () => { // store user details setAttendedUser(response.data.user || response.data); setIsSuccess(true); - - // Stop scanner and clear it if (scanner) { - try { - scanner.clear(); - } catch (error) { - console.error("Error clearing scanner:", error); - } + scanner.clear(); } - setShowSuccessModal(true); setIsScanning(false); - // show success alert only if no alert has been shown - if (!alertShown) { - Alert({ - type: "success", - message: "Attendance marked successfully!", - position: "top-right", - }); - setAlertShown(true); - } + // show success alert + Alert({ + type: "success", + message: "Attendance marked successfully!", + position: "top-right", + }); return; // exit early } @@ -165,23 +149,14 @@ const AttendancePage = () => { errorMessage = error.response.data.message; } - // show error alert only if no alert has been shown - if (!alertShown) { + // show error alert + if (!hasShownAlert) { Alert({ type: "error", message: errorMessage, position: "top-right", }); - setAlertShown(true); - } - - // Stop scanner after error to prevent multiple scans - if (scanner) { - try { - scanner.clear(); - } catch (error) { - console.error("Error clearing scanner:", error); - } + setHasShownAlert(true); } } finally { setIsScanning(false); @@ -195,7 +170,7 @@ const AttendancePage = () => { const handleScanQR = (eventId) => { setSelectedEventId(eventId); setShowScanner(true); - setAlertShown(false); // reset alert state + setHasShownAlert(false); // reset alert state setIsSuccess(false); // reset success state }; @@ -205,7 +180,7 @@ const AttendancePage = () => { // auto open scanner for next scan setTimeout(() => { setShowScanner(true); - setAlertShown(false); // reset alert state + setHasShownAlert(false); // reset alert state setIsSuccess(false); // reset success state }, 100); }; @@ -214,15 +189,15 @@ const AttendancePage = () => { const handleDownloadAttendance = async (eventId) => { try { - const response = await api.get(`/api/form/download/${eventId}`, { + const response = await api.get(`/api/form/export-attendance/${eventId}?format=xlsx`, { headers: { Authorization: `Bearer ${authCtx.token}` }, responseType: "blob", }); - const blob = new Blob([response.data], { type: "text/csv" }); + const blob = new Blob([response.data], { type: "text/xlsx" }); const url = window.URL.createObjectURL(blob); const link = document.createElement("a"); link.href = url; - link.setAttribute("download", `attendance_${eventId}.csv`); + link.setAttribute("download", `attendance_${eventId}.xlsx`); document.body.appendChild(link); link.click(); link.remove(); @@ -244,14 +219,14 @@ const AttendancePage = () => { errorMessage = error.response.data.message; } - // show error alert only if no alert has been shown - if (!alertShown) { + // show error alert + if (!isSuccess && !hasShownAlert) { Alert({ type: "error", message: errorMessage, position: "top-right", }); - setAlertShown(true); + setHasShownAlert(true); } console.error("Download error:", error); } @@ -288,6 +263,7 @@ const AttendancePage = () => { style={{ padding: "8px 16px", backgroundColor: "rgba(255, 138, 0, 0.9)" }} > + Attendance ); @@ -346,7 +322,6 @@ const AttendancePage = () => { } setShowScanner(false); setScanner(null); - setAlertShown(false); // reset alert state when closing scanner }} > @@ -451,4 +426,4 @@ const AttendancePage = () => { ); }; -export default AttendancePage; +export default AttendancePage; \ No newline at end of file