@@ -5,26 +5,35 @@ import { | |||||
Typography, | Typography, | ||||
FormLabel, | FormLabel, | ||||
TextField, | TextField, | ||||
Button, | |||||
Stack, | |||||
Dialog, DialogTitle, DialogContent, DialogActions, | |||||
} from '@mui/material'; | } from '@mui/material'; | ||||
import { useFormik } from 'formik'; | import { useFormik } from 'formik'; | ||||
import * as React from "react"; | import * as React from "react"; | ||||
import * as HttpUtils from "utils/HttpUtils" | |||||
import * as UrlUtils from "utils/ApiPathConst" | |||||
import * as DateUtils from "utils/DateUtils" | import * as DateUtils from "utils/DateUtils" | ||||
import * as FormatUtils from "utils/FormatUtils" | import * as FormatUtils from "utils/FormatUtils" | ||||
import { useNavigate } from "react-router-dom"; | |||||
import { useParams } from "react-router-dom"; | import { useParams } from "react-router-dom"; | ||||
import Loadable from 'components/Loadable'; | import Loadable from 'components/Loadable'; | ||||
const MainCard = Loadable(React.lazy(() => import('components/MainCard'))); | const MainCard = Loadable(React.lazy(() => import('components/MainCard'))); | ||||
import * as StatusUtils from "utils/statusUtils/PublicNoteStatusUtils"; | import * as StatusUtils from "utils/statusUtils/PublicNoteStatusUtils"; | ||||
import FileList from "components/FileList" | import FileList from "components/FileList" | ||||
// ==============================|| DASHBOARD - DEFAULT ||============================== // | // ==============================|| DASHBOARD - DEFAULT ||============================== // | ||||
const ApplicationDetailCard = ({ | |||||
formData, | |||||
const ApplicationDetailCard = ({ | |||||
formData, | |||||
showCancelBtn | |||||
// setBackButtonPos | // setBackButtonPos | ||||
}) => { | }) => { | ||||
const params = useParams(); | const params = useParams(); | ||||
const navigate = useNavigate() | |||||
const [data, setData] = React.useState({}); | const [data, setData] = React.useState({}); | ||||
const [cancelPopUp, setCancelPopUp] = React.useState(false); | |||||
//const [proofId, setProofId] = React.useState(); | //const [proofId, setProofId] = React.useState(); | ||||
React.useEffect(() => { | React.useEffect(() => { | ||||
@@ -61,8 +70,22 @@ const ApplicationDetailCard = ({ | |||||
/>; | />; | ||||
} | } | ||||
const confirmCancel = () =>{ | |||||
setCancelPopUp(false); | |||||
HttpUtils.get({ | |||||
url: UrlUtils.CANCEL_PROOF+"/"+params.id, | |||||
onSuccess: function(){ | |||||
navigate("/proof/reply/"+params.id); | |||||
} | |||||
}); | |||||
} | |||||
const doCancel = () =>{ | |||||
setCancelPopUp(true); | |||||
} | |||||
// React.useEffect(()=>{ | // React.useEffect(()=>{ | ||||
// if (document.getElementById("applicationDetailsMainCard")) setBackButtonPos(`${document.getElementById("applicationDetailsMainCard")?.getBoundingClientRect().left / 3}px`) | |||||
// if (document.getElementById("applicationDetailsMainCard")) setBackButtonPos(`${document.getElementById("applicationDetailsMainCard")?.getBoundingClientRect().left / 3}px`) | |||||
// },[document.getElementById("applicationDetailsMainCard")]) | // },[document.getElementById("applicationDetailsMainCard")]) | ||||
return ( | return ( | ||||
@@ -72,7 +95,25 @@ const ApplicationDetailCard = ({ | |||||
content={false} | content={false} | ||||
> | > | ||||
<Typography variant="h4" sx={{ textAlign: "left", mb: 2, borderBottom: "1px solid black" }}> | <Typography variant="h4" sx={{ textAlign: "left", mb: 2, borderBottom: "1px solid black" }}> | ||||
Public Notice: Proofreading Reply | |||||
<Stack | |||||
direction="row" | |||||
justifyContent="space-between" | |||||
alignItems="center" | |||||
> | |||||
Public Notice: Proofreading Reply | |||||
<Button | |||||
component="span" | |||||
variant="contained" | |||||
size="large" | |||||
color="error" | |||||
disabled={showCancelBtn} | |||||
onClick={doCancel} | |||||
> | |||||
<Typography variant="h5">Cancel</Typography> | |||||
</Button> | |||||
</Stack> | |||||
</Typography> | </Typography> | ||||
<form> | <form> | ||||
<Grid container direction="column"> | <Grid container direction="column"> | ||||
@@ -237,6 +278,18 @@ const ApplicationDetailCard = ({ | |||||
</Grid> | </Grid> | ||||
</Grid> | </Grid> | ||||
<div> | |||||
<Dialog open={cancelPopUp} onClose={() => setCancelPopUp(false)} > | |||||
<DialogTitle><Typography variant="h3">Confirm</Typography></DialogTitle> | |||||
<DialogContent style={{ display: 'flex', }}> | |||||
<Typography variant="h4" style={{ padding: '16px' }}>Are you sure you want to cancel this proof?</Typography> | |||||
</DialogContent> | |||||
<DialogActions> | |||||
<Button onClick={() => setCancelPopUp(false)}><Typography variant="h5">Cancel</Typography></Button> | |||||
<Button onClick={() => confirmCancel()}><Typography variant="h5">Confirm</Typography></Button> | |||||
</DialogActions> | |||||
</Dialog> | |||||
</div> | |||||
</form> | </form> | ||||
</MainCard> | </MainCard> | ||||
); | ); | ||||
@@ -14,7 +14,7 @@ import * as DateUtils from "utils/DateUtils" | |||||
// ==============================|| DASHBOARD - DEFAULT ||============================== // | // ==============================|| DASHBOARD - DEFAULT ||============================== // | ||||
const FormPanel = ({ formData }) => { | |||||
const FormPanel = ({ formData, isOverTime }) => { | |||||
const [data, setData] = React.useState({}); | const [data, setData] = React.useState({}); | ||||
const params = useParams(); | const params = useParams(); | ||||
@@ -32,17 +32,6 @@ const FormPanel = ({ formData }) => { | |||||
const isOverTime = () => { | |||||
let returnBeforeDate = DateUtils.convertToDate(formik.values?.returnBeforeDate); | |||||
if (!returnBeforeDate) return true; | |||||
returnBeforeDate = returnBeforeDate.setHours(14, 0, 0, 0); | |||||
let current = new Date(); | |||||
return current.getTime() > returnBeforeDate; | |||||
} | |||||
return ( | return ( | ||||
<MainCard xs={12} md={12} lg={12} | <MainCard xs={12} md={12} lg={12} | ||||
border={false} | border={false} | ||||
@@ -84,7 +73,7 @@ const FormPanel = ({ formData }) => { | |||||
</Grid> | </Grid> | ||||
: | : | ||||
( | ( | ||||
isOverTime() ? | |||||
isOverTime ? | |||||
<Grid container direction="column" sx={{ paddingLeft: 4, paddingRight: 4 }} spacing={1}> | <Grid container direction="column" sx={{ paddingLeft: 4, paddingRight: 4 }} spacing={1}> | ||||
<Grid item xs={12} md={12} textAlign="left"> | <Grid item xs={12} md={12} textAlign="left"> | ||||
<Typography variant="h5">The response timed out, please apply again.</Typography> | <Typography variant="h5">The response timed out, please apply again.</Typography> | ||||
@@ -36,8 +36,10 @@ const Index = () => { | |||||
const params = useParams(); | const params = useParams(); | ||||
const navigate = useNavigate() | const navigate = useNavigate() | ||||
const [record, setRecord] = React.useState(); | |||||
const [record, setRecord] = React.useState({}); | |||||
const [onReady, setOnReady] = React.useState(false); | const [onReady, setOnReady] = React.useState(false); | ||||
const [isOverTime, setIsOverTime] = React.useState(false); | |||||
const [showCancelBtn, setShowCancelBtn] = React.useState(false); | |||||
React.useLayoutEffect(() => { | React.useLayoutEffect(() => { | ||||
loadForm(); | loadForm(); | ||||
@@ -71,6 +73,12 @@ const Index = () => { | |||||
responseData.data["groupType"] = responseData.data.groupNo.charAt(0); | responseData.data["groupType"] = responseData.data.groupNo.charAt(0); | ||||
responseData.data["action"] = responseData.data.replyDate ? responseData.data.action : true; | responseData.data["action"] = responseData.data.replyDate ? responseData.data.action : true; | ||||
let returnBeforeDate = DateUtils.convertToDate(responseData.data.returnBeforeDate); | |||||
let current = new Date(); | |||||
setIsOverTime(current.getTime() > returnBeforeDate.getTime()); | |||||
setShowCancelBtn(responseData.data.cancelled || responseData.data.replyDate || current.getTime() > returnBeforeDate.getTime()) | |||||
setRecord(responseData.data); | setRecord(responseData.data); | ||||
} | } | ||||
}); | }); | ||||
@@ -125,6 +133,7 @@ const Index = () => { | |||||
<ApplicationDetails | <ApplicationDetails | ||||
// setBackButtonPos={setBackButtonPos} | // setBackButtonPos={setBackButtonPos} | ||||
formData={record} | formData={record} | ||||
showCancelBtn={showCancelBtn} | |||||
style={{ | style={{ | ||||
display: "flex", | display: "flex", | ||||
height: "100%", | height: "100%", | ||||
@@ -137,6 +146,7 @@ const Index = () => { | |||||
<Box xs={12} md={12} sx={{ p: 4, borderRadius: '10px', backgroundColor: '#ffffff' }}> | <Box xs={12} md={12} sx={{ p: 4, borderRadius: '10px', backgroundColor: '#ffffff' }}> | ||||
<ProofForm | <ProofForm | ||||
formData={record} | formData={record} | ||||
isOverTime={isOverTime} | |||||
/> | /> | ||||
</Box> | </Box> | ||||
</Grid> | </Grid> | ||||
@@ -80,6 +80,7 @@ export const GET_PROOF = apiPath+'/proof/details';//GET | |||||
export const REPLY_PROOF = apiPath+'/proof/reply';//GET | export const REPLY_PROOF = apiPath+'/proof/reply';//GET | ||||
export const PROOF_CHECK_PRICE = apiPath+'/proof/check-price';//GET | export const PROOF_CHECK_PRICE = apiPath+'/proof/check-price';//GET | ||||
export const GET_PROOF_PAY = apiPath+'/proof/pay-details';//GET | export const GET_PROOF_PAY = apiPath+'/proof/pay-details';//GET | ||||
export const CANCEL_PROOF = apiPath+'/proof/cancel';//GET | |||||
export const PAYMENT_CREATE = apiPath+'/payment/create';//POST | export const PAYMENT_CREATE = apiPath+'/payment/create';//POST | ||||
@@ -5,21 +5,25 @@ const confirm = {color:"#22a13f", eng:"Confirmed", cht:"可以付印"} | |||||
const unable = {color:"#d9372b", eng:"Re-proofing", cht:"未能付印"} | const unable = {color:"#d9372b", eng:"Re-proofing", cht:"未能付印"} | ||||
const timeOut = {color:"#8a8784", eng:"No Reply", cht:"回覆逾時"} | const timeOut = {color:"#8a8784", eng:"No Reply", cht:"回覆逾時"} | ||||
const pendingReply = {color:"#f5a83d", eng:"Pending Reply", cht:"未回覆"} | const pendingReply = {color:"#f5a83d", eng:"Pending Reply", cht:"未回覆"} | ||||
const cancel = {color:"#000", textColor:"#fff", eng:"Cancelled", cht:"已取消"} | |||||
export function getStatus_Cht(params) { | export function getStatus_Cht(params) { | ||||
let status = getStatus(params); | let status = getStatus(params); | ||||
return getStatusTag({color: status.color, text:status.cht }) | |||||
return getStatusTag({color: status.color, textColor:status.textColor, text:status.cht }) | |||||
} | } | ||||
export function getStatus_Eng(params) { | export function getStatus_Eng(params) { | ||||
let status = getStatus(params); | let status = getStatus(params); | ||||
return getStatusTag({color: status.color, text:status.eng }) | |||||
return getStatusTag({color: status.color, textColor:status.textColor, text:status.eng }) | |||||
} | } | ||||
function getStatus(params) { | function getStatus(params) { | ||||
let replyDate = params.row?params.row.replyDate:params.replyDate; | let replyDate = params.row?params.row.replyDate:params.replyDate; | ||||
let action = params.row?params.row.action:params.action; | let action = params.row?params.row.action:params.action; | ||||
let returnBeforeDate = params.row?params.row.returnBeforeDate:params.returnBeforeDate; | let returnBeforeDate = params.row?params.row.returnBeforeDate:params.returnBeforeDate; | ||||
let isCancelled = params.row?params.row.cancelled:params.cancelled; | |||||
if(isCancelled) return cancel; | |||||
if(replyDate){ | if(replyDate){ | ||||
return action?confirm:unable; | return action?confirm:unable; | ||||