diff --git a/src/App.jsx b/src/App.jsx index a1e9392..e43f0ed 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -20,6 +20,7 @@ import QueryExecutor from "./Components/QueryExecutor"; import RecordEditor from "./Components/RecordEditor"; import VerifyMarks from "./Components/VerifyMarks"; import QueryCardEditor from "./Components/QueryCardEditor"; +import AnomolyPartC from "./Components/AnomolyPartC"; function App() { return ( @@ -76,6 +77,8 @@ function App() { path="/anomoly/partA/booklet" element={} > + }> + diff --git a/src/Components/AnomolyPartC.jsx b/src/Components/AnomolyPartC.jsx new file mode 100644 index 0000000..9ab21e2 --- /dev/null +++ b/src/Components/AnomolyPartC.jsx @@ -0,0 +1,332 @@ +import React, { useEffect, useState } from 'react'; +import { Box, Button, Card, CardContent, Typography, CircularProgress } from '@mui/material'; +import { Layout, theme, Pagination } from 'antd'; +import { useNavigate } from "react-router-dom"; +import ArrowBackIcon from "@mui/icons-material/ArrowBack"; +import HomeIcon from "@mui/icons-material/Home"; +import QueryExecutorCard from './QueryExecutorCard'; +import { updatePartCErrorList, updatePartCErrorData, updateSelectedError, updateSelectedJson } from '../redux/actions/actions'; +import { useSelector, useDispatch } from 'react-redux'; +import SystemNumberDialog from './SystemNumberDialog'; + +const { Content, Header } = Layout; + +function AnomalyPartC() { + const [isLoading, setIsLoading] = useState(false); + const [isLoading2, setIsLoading2] = useState(false); + const [anomalyData, setAnomalyData] = useState(null); + const [evErrors, setEvErrors] = useState([]); + const [error, setError] = useState(null); + const [errorReason, setErrorReason] = useState(null); + const [currentPage, setCurrentPage] = useState(1); + const [totalPages, setTotalPages] = useState(1); + const [showSystemNoContainer, setShowSystemNoContainer] = useState(false); + const [selectedIndex, setSelectedIndex] = useState(null); + + const { + token: { colorBgContainer, borderRadiusLG }, + } = theme.useToken(); + const navigate = useNavigate(); + const dispatch = useDispatch(); + const evErrorsList = useSelector((state) => state?.partCErrorList); + console.log("evErrorsList = ", evErrorsList) + + const evErrorsData = useSelector((state) => state?.partCErrorData); + console.log("evErrorData: ", evErrorsData) + + const reduxSystemNo = useSelector((state) => state?.systemNumber); + console.log("systemno: ", reduxSystemNo) + + // const selectedError = useSelector((state) => state?.selectedError); + // console.log("selectedError: ", selectedError) + + // const selectedErrorData = useSelector((state) => state?.selectedErrorData); + // console.log("selectedErrorData: ", selectedErrorData) + + const selectedErrorJson = useSelector((state) => state?.selectedErrorJson); + console.log("selectedErrorJson: ", selectedErrorJson) + + + + useEffect(() => { + if(!reduxSystemNo){ + setShowSystemNoContainer(true) + }else{ + if(evErrorsList.length > 0){ + setAnomalyData(evErrorsList) + }else{ + fetchAnomalyData(); + } + } + + }, [reduxSystemNo]); + + useEffect(() => { + if(!reduxSystemNo){ + setShowSystemNoContainer(true) + }else{ + if( evErrorsData.length>0){ + setEvErrors(evErrorsData) + } + if (error && errorReason) { + fetchAnomalyRecords(reduxSystemNo); + } + } + + }, [error, errorReason]); + + useEffect(() => { + if (evErrors && evErrors.length > 0) { + console.log("len = ", evErrors.length) + const tp = Math.ceil(evErrors.length / 10); + console.log("tp = ", tp) + setTotalPages(tp); + } + }, [evErrors]); + + const updateSystemReservationStatus = async (systemRecords) => { + const payload = { + systemRecords, + sysNo:reduxSystemNo + }; + try { + fetch( + `${ + import.meta.env.VITE_REACT_APP_BACKEND_URL + }/updateSystemReservationStatusPartC`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(payload), + } + ) + .then((response) => response.json()) + .then((responseData) => { + console.log("response from updation : ", responseData); + }); + } catch (error) { + throw new Error("Error in update system records : ", systemRecords); + } + }; + + const fetchAnomalyData = async () => { + setIsLoading(true); + try { + const response = await fetch( + `${import.meta.env.VITE_REACT_APP_BACKEND_URL}/getpartcEv`, + { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + } + ); + const responseData = await response.json(); + setAnomalyData(responseData.data); + dispatch(updatePartCErrorList(responseData.data)) + + } catch (error) { + console.error("Error fetching data: ", error); + } finally { + setIsLoading(false); + } + }; + + const fetchAnomalyRecords = async (reduxSystemNo) => { + setIsLoading(true); + try { + const response = await fetch( + `${import.meta.env.VITE_REACT_APP_BACKEND_URL}/getpartcEvErrors`, + { + method: "POST", + body: JSON.stringify({ + error, + error_reason: errorReason, + sysno: reduxSystemNo + }), + headers: { + "Content-Type": "application/json", + }, + } + ); + const responseData = await response.json(); + var systemRecords = responseData?.data + console.log("System record ====== ",responseData.systemRecord) + if(!responseData.systemRecord){ + systemRecords = getRecordsBySystemId( + responseData?.data, + reduxSystemNo + ); + } + updateSystemReservationStatus(systemRecords); + console.log("System records : ", systemRecords); + + setEvErrors(systemRecords); + dispatch(updatePartCErrorData(systemRecords)) + } catch (error) { + console.error("Error fetching data: ", error); + } finally { + setIsLoading(false); + } + }; + + function getRecordsBySystemId(records, systemId) { + const new_data = []; + for (var i = 0; i < records.length; i++) { + var count = i % 5; + if (count === systemId - 1) { + new_data.push(records[i]); + } + } + return new_data; + } + + const handleClick = (error, errorReason, index) => { + setError(error); + setErrorReason(errorReason); + setCurrentPage(1); + setSelectedIndex(index); + let tmp = {} + tmp["error"] = error + tmp["error_reason"] = errorReason + console.log("tmp = ", tmp) + dispatch(updateSelectedJson(tmp)) + }; + + const handlePageChange = (page) => { + setIsLoading2(true); + setCurrentPage(page); + }; + + useEffect(() => { + if (currentPage > 0) { + setIsLoading2(false); + } + }, [currentPage, evErrors]); + + const getCurrentPageData = () => { + const startIndex = (currentPage - 1) * 10; + const endIndex = startIndex + 10; + return evErrors.slice(startIndex, endIndex); + }; + + const handleSystemNoChange = () => { + console.log("System No Change is called"); + setShowSystemNoContainer(true); + dispatch(updateSelectedJson({})) + // dispatch(updatePartCErrorList([])) + dispatch(updatePartCErrorData([])) + + }; + + return ( + + +
+ + + + {reduxSystemNo && ( + + System No : {reduxSystemNo} + + )} + + + +
+ + {isLoading ? ( + + + + ) : ( + <> + {anomalyData && anomalyData.map((item, index) => ( + handleClick(item.error, item.error_reason, index)} + key={index} + style={{ margin: '16px', borderRadius: borderRadiusLG, + alignItems: 'flex-start', textAlign: 'start', cursor: 'pointer', + color:"white", + backgroundColor: selectedIndex === index ? '#3f51b5' : '#537895', + backgroundImage: selectedIndex === index ? + 'linear-gradient(315deg, #70a1ff 0%, #c2c0c0 74%);' : + 'linear-gradient(315deg, #537895 0%, #09203f 74%)' + }} + > + + {item.error && ( + + Code: {item.error} + + )} + {item['count(*)'] && ( + + Count: {item['count(*)']} + + )} + {item.error_reason && ( + + Reason: {item.error_reason} + + )} + + + ))} + {evErrors && evErrors.length > 0 &&( + <> + + + + {isLoading2 ? ( + + + + ) : ( + getCurrentPageData().map((data, index) => ( + + )) + )} + + )} + + )} + + {showSystemNoContainer && ( + + )} +
+
+ ); +} + +export default AnomalyPartC; diff --git a/src/Components/Home.jsx b/src/Components/Home.jsx index 9fafbe7..bc3c1ea 100644 --- a/src/Components/Home.jsx +++ b/src/Components/Home.jsx @@ -20,6 +20,10 @@ const Home = () => { title: "Part A OCR Anomoly - Old Dummy", url: "/anomoly/partA?type=old", }, + { + title: "Part C", + url: "/anomoly/partC", + }, // { // title:"Verification", // url:"/verification" diff --git a/src/Components/QueryExecutorCard.jsx b/src/Components/QueryExecutorCard.jsx index 41fa43e..3808a8d 100644 --- a/src/Components/QueryExecutorCard.jsx +++ b/src/Components/QueryExecutorCard.jsx @@ -51,7 +51,7 @@ const QueryExecutorCard = ({ data, s3_image_column, query }) => { const responseData = await response.json(); if (responseData.status === "success") { const updatedData = { ...dataValue, is_cover: 1 }; - console.log("Data ===== ", updatedData); + // console.log("Data ===== ", updatedData); setDataValue(updatedData); console.log("Updation successfull ...."); toast.success("Record Marked As Ev !..."); @@ -63,6 +63,38 @@ const QueryExecutorCard = ({ data, s3_image_column, query }) => { } }; + const mark_as_dummy = async () => { + const payload = { + data, + }; + try { + setIsLoading(true); + const response = await fetch( + `${import.meta.env.VITE_REACT_APP_BACKEND_URL}/partcDummyMarking`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(payload), + } + ); + setIsLoading(false); + const responseData = await response.json(); + if (responseData.status === "success") { + console.log("Updation successfull ...."); + const updatedData = { ...dataValue, type: 102 }; + // console.log("Data ===== ", updatedData); + setDataValue(updatedData); + toast.success("Record Marked as Dummy ! ...."); + } else { + throw new Error(responseData?.message); + } + } catch (error) { + throw new Error(error); + } + } + const mark_as_backpage = async () => { const payload = { data, @@ -84,7 +116,7 @@ const QueryExecutorCard = ({ data, s3_image_column, query }) => { if (responseData.status === "success") { console.log("Updation successfull ...."); const updatedData = { ...dataValue, is_backpage: 1 }; - console.log("Data ===== ", updatedData); + // console.log("Data ===== ", updatedData); setDataValue(updatedData); toast.success("Record Marked as Backpage ! ...."); } else { @@ -160,6 +192,14 @@ const QueryExecutorCard = ({ data, s3_image_column, query }) => { > Mark As EV + )}