| @@ -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; | ||||