From 878444d2a94a2048490497f3156fd858283d2dbb Mon Sep 17 00:00:00 2001 From: Pradeeppon01 Date: Wed, 7 Aug 2024 02:10:38 +0530 Subject: [PATCH] latest --- .env | 2 +- assets/Infinity_loader.gif | Bin 0 -> 75840 bytes package-lock.json | 55 +++++ package.json | 2 + src/App.css | 187 +++++++++++++++ src/App.jsx | 2 + src/Components/AnomolyAttendencePage.jsx | 6 +- src/Components/CustomQueryExecutorCard.jsx | 2 +- src/Components/Home.jsx | 1 + src/Components/IndividualStudAttendence.jsx | 248 ++++++++++++++++++++ src/Components/Notification.jsx | 117 +++++++++ src/Components/PlayGroundEditContainer.jsx | 155 ++++++++++-- src/Components/UpdatedPlaygroundUpdater.jsx | 73 +++--- 13 files changed, 785 insertions(+), 65 deletions(-) create mode 100644 assets/Infinity_loader.gif create mode 100644 src/Components/IndividualStudAttendence.jsx create mode 100644 src/Components/Notification.jsx diff --git a/.env b/.env index 43b1052..a5d5a49 100644 --- a/.env +++ b/.env @@ -2,4 +2,4 @@ METABASE_BASE_URL="http://metabase.usln.in/public/question/d8774923-09bb-4cd9-903b-559d417e12cf" #VITE_REACT_APP_BACKEND_URL="http://localhost:9999" -VITE_REACT_APP_BACKEND_URL="https://api.exampaper.vidh.ai" \ No newline at end of file +VITE_REACT_APP_BACKEND_URL="https://api.exampaper.vidh.ai" diff --git a/assets/Infinity_loader.gif b/assets/Infinity_loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..565fad26a60f5ad46f5c5a3f4895325a78acb9d6 GIT binary patch literal 75840 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�_$iue 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 E0f)^m5&!@I literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json index 8eedf4e..b9e7ac6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,8 @@ "react-dom": "^18.3.1", "react-lazy-load-image-component": "^1.6.0", "react-medium-image-zoom": "^5.2.4", + "react-notifications": "^1.7.4", + "react-notifications-component": "^4.0.1", "react-qr-barcode-scanner": "^1.0.6", "react-redux": "^9.1.2", "react-router-dom": "^6.23.1", @@ -5260,6 +5262,36 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-notifications": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/react-notifications/-/react-notifications-1.7.4.tgz", + "integrity": "sha512-dsR7mUQfe8YdFLqVsjT0GFd4n26UWkzefdjMELfEVygjuuyU6ZZ0LpZhFHdfmraGeBFLWHNxygpGlHHituUyjQ==", + "dependencies": { + "acorn": "6.4.1", + "classnames": "^2.1.1", + "prop-types": "^15.5.10", + "react-transition-group": "^4.4.1" + } + }, + "node_modules/react-notifications-component": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/react-notifications-component/-/react-notifications-component-4.0.1.tgz", + "integrity": "sha512-NRBkWO19AsXmN0b8YQ0L12eoCAhrnmIZtGm77ATWSfQEXPL5PYSyeACpx7tePP+R2De9b0IP4yk9vY4TtzC02w==", + "peerDependencies": { + "react": "^18.0.1" + } + }, + "node_modules/react-notifications/node_modules/acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/react-qr-barcode-scanner": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/react-qr-barcode-scanner/-/react-qr-barcode-scanner-1.0.6.tgz", @@ -9829,6 +9861,29 @@ "resolved": "https://registry.npmjs.org/react-medium-image-zoom/-/react-medium-image-zoom-5.2.4.tgz", "integrity": "sha512-XLu/fLqpbmhiDAGA6yie78tDv4kh8GxvS7kKQArSOvCvm5zvgItoh4h01NAAvnezQ60ovsTeedHiHG3eG9CcGg==" }, + "react-notifications": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/react-notifications/-/react-notifications-1.7.4.tgz", + "integrity": "sha512-dsR7mUQfe8YdFLqVsjT0GFd4n26UWkzefdjMELfEVygjuuyU6ZZ0LpZhFHdfmraGeBFLWHNxygpGlHHituUyjQ==", + "requires": { + "acorn": "6.4.1", + "classnames": "^2.1.1", + "prop-types": "^15.5.10", + "react-transition-group": "^4.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + } + } + }, + "react-notifications-component": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/react-notifications-component/-/react-notifications-component-4.0.1.tgz", + "integrity": "sha512-NRBkWO19AsXmN0b8YQ0L12eoCAhrnmIZtGm77ATWSfQEXPL5PYSyeACpx7tePP+R2De9b0IP4yk9vY4TtzC02w==" + }, "react-qr-barcode-scanner": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/react-qr-barcode-scanner/-/react-qr-barcode-scanner-1.0.6.tgz", diff --git a/package.json b/package.json index 9417ff9..ab6774e 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,8 @@ "react-dom": "^18.3.1", "react-lazy-load-image-component": "^1.6.0", "react-medium-image-zoom": "^5.2.4", + "react-notifications": "^1.7.4", + "react-notifications-component": "^4.0.1", "react-qr-barcode-scanner": "^1.0.6", "react-redux": "^9.1.2", "react-router-dom": "^6.23.1", diff --git a/src/App.css b/src/App.css index 210bc5a..780b669 100644 --- a/src/App.css +++ b/src/App.css @@ -48,4 +48,191 @@ .visited{ background-color:rgba(128, 128, 128, 0.5) !important; +} + +/* Notification Styles */ +.notification { + position: fixed; + top: 20px; + right: 20px; + padding: 15px; + border-radius: 5px; + color: #fff; + z-index: 1000; + opacity: 0; + transition: opacity 0.3s ease-in-out; +} + +.notification.show { + opacity: 1; +} + +.notification.hide { + opacity: 0; +} + +.notification.info { + background-color: #2196f3; +} + +.notification.success { + background-color: green; +} + +.notification.error { + background-color: #f44336; +} + + +.white-background{ + background-color: white; +} + +.grey-background{ + background-color: rgba(128, 128, 128, 0.1); +} + + +.notification { + opacity: 0; + transition: opacity 0.3s ease; + position: fixed; + top: 10px; + right: 10px; + padding: 10px; + z-index: 1000; + border-radius: 5px; +} + +.notification.show { + opacity: 1; +} + +.notification.hide { + opacity: 0; +} + +.notification.info { + background-color: blue; + color: white; +} + +.notification.success { + background-color: green; + color: white; +} + +.notification.error { + background-color: red; + color: white; +} + + +*{ + margin: 0; + padding: 0; + user-select: none; + box-sizing: border-box; + font-family: 'Poppins', sans-serif; +} +html,body{ + height: 100%; +} +body{ + display: grid; + place-items: center; + overflow: hidden; +} +button{ + padding: 8px 16px; + font-size: 25px; + font-weight: 500; + border-radius: 4px; + border: none; + outline: none; + background: #e69100; + color: white; + letter-spacing: 1px; + cursor: pointer; +} +.alert{ + background: #ffdb9b; + padding: 20px 40px; + min-width: 420px; + position: absolute; + right: 0; + top: 10px; + border-radius: 4px; + border-left: 8px solid #ffa502; + overflow: hidden; + opacity: 0; + pointer-events: none; +} +.alert.showAlert{ + opacity: 1; + pointer-events: auto; +} +.alert.show{ + animation: show_slide 1s ease forwards; +} +@keyframes show_slide { + 0%{ + transform: translateX(100%); + } + 40%{ + transform: translateX(-10%); + } + 80%{ + transform: translateX(0%); + } + 100%{ + transform: translateX(-10px); + } +} +.alert.hide{ + animation: hide_slide 1s ease forwards; +} +@keyframes hide_slide { + 0%{ + transform: translateX(-10px); + } + 40%{ + transform: translateX(0%); + } + 80%{ + transform: translateX(-10%); + } + 100%{ + transform: translateX(100%); + } +} +.alert .fa-exclamation-circle{ + position: absolute; + left: 20px; + top: 50%; + transform: translateY(-50%); + color: #ce8500; + font-size: 30px; +} +.alert .msg{ + padding: 0 20px; + font-size: 18px; + color: #ce8500; +} +.alert .close-btn{ + position: absolute; + right: 0px; + top: 50%; + transform: translateY(-50%); + background: #ffd080; + padding: 20px 18px; + cursor: pointer; +} +.alert .close-btn:hover{ + background: #ffc766; +} +.alert .close-btn .fas{ + color: #ce8500; + font-size: 22px; + line-height: 40px; } \ No newline at end of file diff --git a/src/App.jsx b/src/App.jsx index f556d45..9aa02b1 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -30,6 +30,7 @@ import PlayGround from "./Components/PlayGround"; import Revaluation from "./Components/Revaluation"; import PlayGroundUpdated from "./Components/PlaygroundUpdated" import DummyDuplicates from "./Components/DummyDuplicates"; +import IndividualStudAttendence from "./Components/IndividualStudAttendence"; function App() { @@ -58,6 +59,7 @@ function App() { path="/sqlPlayground/Editor" element={} > + }> } diff --git a/src/Components/AnomolyAttendencePage.jsx b/src/Components/AnomolyAttendencePage.jsx index b464f26..db103b6 100644 --- a/src/Components/AnomolyAttendencePage.jsx +++ b/src/Components/AnomolyAttendencePage.jsx @@ -16,7 +16,11 @@ const AnomolyAttendencePage = () =>{ { title: "Additional Sheet Insertion", url: "/anomoly/attendence/additionalSheet", - } + }, + { + title: "Individual Attendence Sheet Check", + url: "/anomoly/attendence/stud_check", + } ] return ( diff --git a/src/Components/CustomQueryExecutorCard.jsx b/src/Components/CustomQueryExecutorCard.jsx index 45e4f62..f7737d2 100644 --- a/src/Components/CustomQueryExecutorCard.jsx +++ b/src/Components/CustomQueryExecutorCard.jsx @@ -464,7 +464,7 @@ const CustomQueryExecutorCard = ({ }; return ( - + diff --git a/src/Components/Home.jsx b/src/Components/Home.jsx index a9329d4..b4d7a1c 100644 --- a/src/Components/Home.jsx +++ b/src/Components/Home.jsx @@ -1,6 +1,7 @@ import { Box } from "@mui/material"; import HomepageCard from "./HomepageCard"; import {useState,useEffect} from "react" +import Notification from "./Notification"; const Home = () => { const cards = [ diff --git a/src/Components/IndividualStudAttendence.jsx b/src/Components/IndividualStudAttendence.jsx new file mode 100644 index 0000000..aafe9ef --- /dev/null +++ b/src/Components/IndividualStudAttendence.jsx @@ -0,0 +1,248 @@ +import React, { useState, useEffect } from "react"; +import { Box, Button } from "@mui/material"; +import AntdesignLayout from "./AntdesignLayout"; +import LoadingContainer from "./LoadingContainer"; +import infinity_loader from "../../assets/Infinity_loader.gif"; +import Notification from "./Notification"; // Import the Notification component +import { Height } from "@mui/icons-material"; +import ZoomInIcon from "@mui/icons-material/ZoomIn"; +import ZoomOutIcon from "@mui/icons-material/ZoomOut"; + +const IndividualStudAttendence = () => { + const [registerNumber, setRegisterNumber] = useState(null); + const [subjectCode, setSubjectCode] = useState(null); + const [attendenceSerialNo, setAttendenceSerialNo] = useState(null); + const [isLoading, setIsLoading] = useState(false); + const [attendenceResults, setAttendenceResults] = useState(null); + const [zoomValue, setZoomValue] = useState(950); + const [absentStatus, setAbsentStatus] = useState(-1); + const [notification, setNotification] = useState(null); // Notification state + const [type, setType] = useState(null); + + const showNotification = (message, type) => { + setNotification({ message, type }); + }; + + const updateStudentStatus = async () => { + setIsLoading(true); + try { + const payload = { + attendenceResults, + absentStatus, + attendenceSerialNo, + register_number: registerNumber, + subject_code: subjectCode, + }; + + const response = await fetch( + `${ + import.meta.env.VITE_REACT_APP_BACKEND_URL + }/updateStudentAttendenceStatus`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(payload), + } + ); + + const responseData = await response.json(); + console.log("The response data ===== ", responseData); + + if (responseData?.status === "success") { + fetchAttendenceData(); + showNotification("Record updated successfully !!", "success"); + } + setIsLoading(false); + } catch (error) { + setIsLoading(false); + console.error("Error updating student status:", error); + showNotification("Error updating student status", "error"); + } + }; + + useEffect(() => { + console.log("Absent status changed ==== ", absentStatus); + if (Number(absentStatus) === 0 || Number(absentStatus) === 1) { + updateStudentStatus(); + } + }, [absentStatus]); + + const fetchAttendenceData = async () => { + setAbsentStatus(-1); + if (!attendenceSerialNo) { + if (!registerNumber || !subjectCode) { + showNotification( + "Registration Number && Subject Code is Mandatory !!", + "error" + ); + return; + } + } + if (registerNumber && subjectCode) { + setType(1); + } else if (attendenceSerialNo) { + setType(2); + } + setIsLoading(true); + try { + const payload = { + registerNumber, + subjectCode, + attendenceSerialNo, + }; + + const response = await fetch( + `${import.meta.env.VITE_REACT_APP_BACKEND_URL}/fetchAttendenceData`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(payload), + } + ); + + const responseData = await response.json(); + console.log("response data ========= ", responseData); + setIsLoading(false); + if (responseData?.status === "success") { + setAttendenceResults(responseData?.results); + setType(responseData?.type) + } + } catch (error) { + setIsLoading(false); + console.error("Error fetching attendance data:", error); + showNotification("Error fetching attendance data", "error"); + } + }; + + return ( + + +

+ + setRegisterNumber(e.target.value)} + /> +
+
+ + setSubjectCode(e.target.value)} + /> +
+
+ + setAttendenceSerialNo(e.target.value)} + /> +
+ + + {attendenceResults?.length > 0 && ( + + + {Object.keys(attendenceResults[0]).map((key, index) => ( + + + {key} : {attendenceResults[0][key]} + + + ))} + {type === 1 && ( + + + + + )} + + + + + + + + {attendenceResults.length > 0 && type === 2 && ( + Attendence-image + )} + {attendenceResults.length > 0 && type === 1 && ( + Attendence-image + )} + + + + )} + {attendenceResults?.length == 0 && ( + Attendence Record Not Found !! + )} + {isLoading && } + {notification && ( + setNotification(null)} + /> + )} + + ); +}; + +export default IndividualStudAttendence; diff --git a/src/Components/Notification.jsx b/src/Components/Notification.jsx new file mode 100644 index 0000000..a414d98 --- /dev/null +++ b/src/Components/Notification.jsx @@ -0,0 +1,117 @@ +// // import React, { useEffect, useState } from 'react'; +// // import PropTypes from 'prop-types'; + +// // const Notification = ({ message, type, onClose, duration }) => { +// // const [visible, setVisible] = useState(true); + +// // useEffect(() => { +// // const timer = setTimeout(() => { +// // setVisible(false); +// // setTimeout(onClose, 300); // Allow time for the fade-out transition +// // }, duration); + +// // return () => clearTimeout(timer); +// // }, [onClose, duration]); + +// // return ( +// //
+// // {message} +// //
+// // ); +// // }; + +// // Notification.propTypes = { +// // message: PropTypes.string.isRequired, +// // type: PropTypes.string, +// // onClose: PropTypes.func.isRequired, +// // duration: PropTypes.number +// // }; + +// // Notification.defaultProps = { +// // type: 'info', +// // duration: 1000 // Set duration to 1000 milliseconds (1 second) +// // }; + +// // export default Notification; + + +// import React, { useEffect, useState } from 'react'; +// import PropTypes from 'prop-types'; + +// const Notification = ({ message, type, onClose, duration }) => { +// const [visible, setVisible] = useState(true); +// console.log("From notification container ....") + +// useEffect(() => { +// const timer = setTimeout(() => { +// setVisible(false); +// setTimeout(onClose, 300); // Allow time for the fade-out transition +// }, duration); + +// return () => clearTimeout(timer); +// }, [onClose, duration]); + +// return ( +// visible && ( +//
+// {message} +//
+// ) +// ); +// }; + +// Notification.propTypes = { +// message: PropTypes.string.isRequired, +// type: PropTypes.string, +// onClose: PropTypes.func.isRequired, +// duration: PropTypes.number +// }; + +// Notification.defaultProps = { +// type: 'info', +// duration: 3000 // Set duration to 3000 milliseconds (3 seconds) +// }; + +// export default Notification; + + + +import React, { useEffect, useState } from 'react'; +import PropTypes from 'prop-types'; + +const Notification = ({ message, type, onClose, duration }) => { + const [visible, setVisible] = useState(true); + console.log("From notification container ...."); + + useEffect(() => { + console.log("Notification useEffect triggered ...."); + const timer = setTimeout(() => { + setVisible(false); + setTimeout(onClose, 300); // Allow time for the fade-out transition + }, duration); + + return () => clearTimeout(timer); + }, [onClose, duration]); + + return ( + visible && ( +
+ {message} +
+ ) + ); +}; + +Notification.propTypes = { + message: PropTypes.string.isRequired, + type: PropTypes.string, + onClose: PropTypes.func.isRequired, + duration: PropTypes.number +}; + +Notification.defaultProps = { + type: 'info', + duration: 3000 // Set duration to 3000 milliseconds (3 seconds) +}; + +export default Notification; diff --git a/src/Components/PlayGroundEditContainer.jsx b/src/Components/PlayGroundEditContainer.jsx index 8ea901b..b900ab5 100644 --- a/src/Components/PlayGroundEditContainer.jsx +++ b/src/Components/PlayGroundEditContainer.jsx @@ -10,10 +10,11 @@ import TextInputField from "./TextInputField"; import { Height } from "@mui/icons-material"; import HighlightOffIcon from "@mui/icons-material/HighlightOff"; import LoadingContainer from "./LoadingContainer"; -//import { toast } from "react-toastify"; +import { toast } from "react-toastify"; import { updatePlayGroundAttendence } from "./Utilities/AttendencePlaygroundUtilities"; import { updateAttendenceBlank } from "./Utilities/AttendencePlaygroundUtilities"; - +import Notification from "./Notification"; // Import the Notification component +import { ToastContainer } from "react-toastify"; const PlayGroundEditContainer = ({ data, @@ -36,29 +37,94 @@ const PlayGroundEditContainer = ({ const [isLoading, setIsLoading] = useState(false); const [qrcode, setQrcode] = useState(null); const [subjectCode, setSubjectCode] = useState(null); + const [marksR1, setMarksR1] = useState(null); + const [marksR2, setMarksR2] = useState(null); const [open, setOpen] = useState(true); // Set open state to true by default + + const [notification, setNotification] = useState(null); // Notification state + + const showNotification = (message, type) => { + console.log("setting notification ===== ", message); + const notificationData = { message, type} + console.log("notification data ==== ",notificationData) + setNotification(notificationData); + }; const handleClose = () => { setOpen(false); }; - console.log("image_name ======================= ", imageName) + console.log("image_name ======================= ", imageName); + console.log("data === i ==== ", data); useEffect(() => { - if (data) { - setQrcode(data?.qrcode); - setBarcode(data?.barcode); - setMarks(data?.marks); - setSubjectCode(data?.subject_code); - setRegisterNumber(data?.register_number); - setTotalAbsent(data?.total_absent) - setTotalPresent(data?.total_present) - setTotalStudents(data?.total_students) + const fetchImageData = async () => { + setIsLoading(true) + try{ + if (data) { + const payload = { + type, + imageName, + tableName, + }; + const response = await fetch( + `${ + import.meta.env.VITE_REACT_APP_BACKEND_URL + }/fetchTableImageNameData`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(payload), + } + ); + const responseData = await response.json(); + setIsLoading(false) + console.log("response data {{{{ ", responseData); + if (responseData.status === "success") { + const imageData = responseData?.results; + if (imageData && imageData?.length > 0) { + const imageDataEle = imageData[0]; + setQrcode(imageDataEle?.qrcode); + setBarcode(imageDataEle?.barcode); + setMarks(imageDataEle?.marks); + setMarksR1(imageDataEle?.marks_R1); + setMarksR2(imageDataEle?.marks_R2); + setSubjectCode(imageDataEle?.subject_code); + setRegisterNumber(imageDataEle?.register_number); + setTotalAbsent(imageDataEle?.total_absent); + setTotalPresent(imageDataEle?.total_present); + setTotalStudents(imageDataEle?.total_students); + } + } + } + }catch(error){ + throw new Error(error) + setIsLoading(false) } + }; + fetchImageData() console.log("the currect editor type: ", type); }, [data]); + // useEffect(() => { + // if (data) { + // setQrcode(data?.qrcode); + // setBarcode(data?.barcode); + // setMarks(data?.marks); + // setMarksR1(data?.marks_R1); + // setMarksR2(data?.marks_R2); + // setSubjectCode(data?.subject_code); + // setRegisterNumber(data?.register_number); + // setTotalAbsent(data?.total_absent); + // setTotalPresent(data?.total_present); + // setTotalStudents(data?.total_students); + // } + // console.log("the currect editor type: ", type); + // }, [data]); + const updateRecordPartC = async () => { - if (!marks) { - return; - } + // if (!marks) { + // return; + // } setIsLoading(true); try { const payload = { @@ -68,6 +134,8 @@ const PlayGroundEditContainer = ({ s3Path, subjectCode, marks, + marksR1, + marksR2, imageName, rotateAngle, }; @@ -85,21 +153,28 @@ const PlayGroundEditContainer = ({ setIsLoading(false); console.log("response data ========= ", responseData); if (responseData?.status === "success") { - //toast.success("Record Updated Successfully ..."); + showNotification("Record updated successfully !!", "success"); setShowEditContainer(false); + const queryContainerEle = document.getElementById(imageName) + console.log("querycontainerEle ===== ",queryContainerEle) + if(queryContainerEle){ + queryContainerEle.classList.add("grey-background") + toast.success("Record Updated Successfully !!") + } } } catch (error) { setIsLoading(false); - //toast.error("Something Went Wrong ..."); + showNotification("Something Went Wrong !!", "error"); throw new Error(error); } }; const updateRecordPartA = async () => { + setNotification({}) console.log(registerNumber); console.log(subjectCode); console.log(barcode, qrcode); - console.log("image_name = ", imageName) + console.log("image_name = ", imageName); console.log(!registerNumber && !subjectCode && (!barcode || !qrcode)); if (!registerNumber && !subjectCode && (!barcode || !qrcode)) { return; @@ -128,10 +203,18 @@ const PlayGroundEditContainer = ({ ); const responseData = await response.json(); setIsLoading(false); - console.log("response data ========= ", responseData); + console.log("response data 122 ========= ", responseData); if (responseData?.status === "success") { - toast.success("Record Updated Successfully ..."); + showNotification("Record updated successfully !!", "success"); setShowEditContainer(false); + const queryContainerEle = document.getElementById(imageName) + console.log("querycontainerEle ===== ",queryContainerEle) + if(queryContainerEle){ + queryContainerEle.classList.add("grey-background") + } + setTimeout(()=>{ + showNotification("Record Updated Successfully !!","success") + },500) } } catch (error) { setIsLoading(false); @@ -155,8 +238,9 @@ const PlayGroundEditContainer = ({ style={{ zIndex: 100 }} fullWidth > + - + )} {type == "PartC" ? ( - + <> + + + + ) : type == "PartA" ? ( {isLoading && } + {notification && ( + setNotification(null)} + /> + )} ); }; diff --git a/src/Components/UpdatedPlaygroundUpdater.jsx b/src/Components/UpdatedPlaygroundUpdater.jsx index 9d154a6..f6fcc95 100644 --- a/src/Components/UpdatedPlaygroundUpdater.jsx +++ b/src/Components/UpdatedPlaygroundUpdater.jsx @@ -58,7 +58,9 @@ const UpdatedPlaygroundUpdater = ({ const [bar_code, set_Barcode] = useState(null); const [s3Path, setS3Path] = useState(null); const [subjectCode, setSubjectCode] = useState(null); - const [data,setData] = useState(null) + const [data, setData] = useState(null); + const [marksR1, setMarksR1] = useState(null); + const [marksR2, setMarksR2] = useState(null); const [open, setOpen] = useState(true); // Set open state to true by default const handleClose = () => { @@ -68,10 +70,10 @@ const UpdatedPlaygroundUpdater = ({ useEffect(() => { console.log("data ========== ", data); if (data) { - console.log("barcode = ", data.barcode) + console.log("barcode = ", data.barcode); setQrcode(data.qrcode); // set_Barcode(data.barcode) - set_Barcode(data.barcode === '' ? null : data.barcode); + set_Barcode(data.barcode === "" ? null : data.barcode); setMarks(data.marks); setS3Path(data.s3_path); setSubjectCode(data.subject_code); @@ -88,7 +90,6 @@ const UpdatedPlaygroundUpdater = ({ // console.log("barcode in use effect ==== ", barcode); // }, [barcode]); - console.log("data =================== ", data); // console.log("image column ====== ", s3_image_column); // console.log("s3 image ======= ", data[s3_image_column]); @@ -492,7 +493,7 @@ const UpdatedPlaygroundUpdater = ({ useEffect(() => { if (oldData?.image_name && tableName) { const fetchPrimaryKeyData = async () => { - setIsLoading(true) + setIsLoading(true); try { const payload = { table: tableName, @@ -510,7 +511,7 @@ const UpdatedPlaygroundUpdater = ({ ); const responseData = await response.json(); console.log("response json 11 === ", responseData); - setIsLoading(false) + setIsLoading(false); if (responseData?.status === "success") { const results = responseData?.data; console.log("results ==== ", results); @@ -520,7 +521,7 @@ const UpdatedPlaygroundUpdater = ({ } } } catch (error) { - setIsLoading(false) + setIsLoading(false); throw new Error(error); } }; @@ -590,7 +591,7 @@ const UpdatedPlaygroundUpdater = ({ /> - + {/* @@ -685,36 +686,38 @@ const UpdatedPlaygroundUpdater = ({ )} {type == "PartC" ? ( - + <> + + ) : type == "PartA" ? ( ) : null} - - + + - - - {/* + + {/* */} - -