diff --git a/src/pages/ProofReply_GLD/ApplicationDetails.js b/src/pages/ProofReply_GLD/ApplicationDetails.js new file mode 100644 index 0000000..2e10973 --- /dev/null +++ b/src/pages/ProofReply_GLD/ApplicationDetails.js @@ -0,0 +1,244 @@ +// material-ui +import { + FormControl, + Grid, + Typography, + FormLabel, + TextField, +} from '@mui/material'; + +import { useFormik } from 'formik'; +import * as React from "react"; +import * as DateUtils from "utils/DateUtils" +import { useParams } from "react-router-dom"; +import Loadable from 'components/Loadable'; +const MainCard = Loadable(React.lazy(() => import('components/MainCard'))); +import * as StatusUtils from "../PublicNotice/ListPanel/PublicNoteStatusUtils"; +import FileList from "components/FileList" +// ==============================|| DASHBOARD - DEFAULT ||============================== // +const ApplicationDetailCard = ({ formData, }) => { + + const params = useParams(); + + const [data, setData] = React.useState({}); + //const [proofId, setProofId] = React.useState(); + + React.useEffect(() => { + if (formData) { + setData(formData); + //setProofId(formData.id); + } + }, [formData]); + + const formik = useFormik({ + enableReinitialize: true, + initialValues: data, + }); + + const DisplayField = ({ name, width }) => { + return ; + } + + function currencyFormat(num) { + let val = num ? num : 0; + return val.toLocaleString('en-US', { + minimumFractionDigits: 2 + }); + } + + + return ( + + + Public Notice: Proofreading Reply + +
+ + + + + + + App No.: + + + + + + + + + + + Status: + + + + + {StatusUtils.getStatusByText(data.appStatus)} + + + + + + + + + + Applicant: + + + + + {data.orgId === null ? + + : + + } + + + + + + + + Issue No: + + + + + + + + + + + + + Contact Person: + + + + + + + + + + + + Issue Date: + + + + + + + + + {/* + + + + Remarks: + + + + + + + + + + */} + + + + + + + Print file: + + + + + + + + + Deadline for payment and reply: + + + {DateUtils.dateStr(data.returnBeforeDate)} Before 2:00 PM + + + Fee: + + + {currencyFormat(data.fee)} + + + { + formik.values.groupType == "A" + ? + ( {data.noOfPages} page x $6,552 ) + : + ( {data.length} cm x {data.colCount == 2 ? "$364 Double Column" : "$182 Single Column"} ) + } + + + + + + + +
+
+ ); +}; + +export default ApplicationDetailCard; diff --git a/src/pages/ProofReply_GLD/ProofForm.js b/src/pages/ProofReply_GLD/ProofForm.js new file mode 100644 index 0000000..0164783 --- /dev/null +++ b/src/pages/ProofReply_GLD/ProofForm.js @@ -0,0 +1,108 @@ +// material-ui +import { + Typography, + Grid, +} from '@mui/material'; +import FileList from "components/FileList" +import MainCard from "components/MainCard"; +import * as React from "react"; +import { useParams } from "react-router-dom"; +import { useFormik } from 'formik'; +import * as DateUtils from "utils/DateUtils" + + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + + +const FormPanel = ({ formData }) => { + + const [data, setData] = React.useState({}); + const params = useParams(); + + React.useEffect(() => { + if (formData) { + setData(formData); + } + }, [formData]); + + const formik = useFormik({ + enableReinitialize: true, + initialValues: data, + }); + + + + 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 ( + + + + Public Notice: Proofreading Reply + + +
+ + { + formik.values.replyDate ? + + + Reply Date: {DateUtils.datetimeStr(formik.values.replyDate)} + + + Reply: {formik.values.action ? (Ready for printing (correct manuscript).) : (Not ready for printing (requires modification).)} + + { + formik.values.action ? + null + : + + + + } + + + : + ( + isOverTime() ? + + + The response timed out, please apply again. + + + : + + + Wait for reply. + + + ) + + + } +
+
+ ); +}; + +export default FormPanel; diff --git a/src/pages/ProofReply_GLD/UploadFileTable.js b/src/pages/ProofReply_GLD/UploadFileTable.js new file mode 100644 index 0000000..9090721 --- /dev/null +++ b/src/pages/ProofReply_GLD/UploadFileTable.js @@ -0,0 +1,111 @@ +// material-ui +import * as React from 'react'; +import { + DataGrid, + GridActionsCellItem, + GridRowModes +} from "@mui/x-data-grid"; +import RemoveCircleOutlineIcon from '@mui/icons-material/RemoveCircleOutline'; +import {useEffect} from "react"; +// import {useNavigate} from "react-router-dom"; +// import { useTheme } from '@mui/material/styles'; +import { + Box, + Stack +} from '@mui/material'; +// ==============================|| EVENT TABLE ||============================== // + +export default function UploadFileTable({recordList, setRecordList,}) { + + const [rows, setRows] = React.useState(recordList); + const [rowModesModel,setRowModesModel] = React.useState({}); + // const theme = useTheme(); + + // const navigate = useNavigate() + + useEffect(() => { + setRows(recordList); + // console.log(disableDelete); + }, [recordList]); + + function NoRowsOverlay() { + return ( + + No File Record + {/*
(rows={[]})
*/} +
+ ); + } + + const handleCancelClick = (id) => () => { + setRowModesModel({ + ...rowModesModel, + [id]: { mode: GridRowModes.View, ignoreModifications: true }, + }); + console.log("Starting Delete") + const editedRow = rows.find((row) => row.id === id); + console.log(editedRow) + console.log(editedRow.isNew) + setRecordList(rows.filter((row) => row.id !== id)); + setRows(rows.filter((row) => row.id !== id)); + } + + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: '', + width: 30, + cellClassName: 'actions', + // hide:true, + getActions: ({id}) => { + return [ + } + label="delete" + className="textPrimary" + onClick={handleCancelClick(id)} + color="error" + />] + }, + }, + { + id: 'name', + field: 'name', + headerName: '檔案名稱', + flex: 1, + }, + { + id: 'size', + field: 'size', + headerName: '檔案大小', + valueGetter: (params) => { + // console.log(params) + return Math.ceil(params.value/1024)+" KB"; + }, + flex: 1, + }, + ]; + + return ( + + + + ); +} diff --git a/src/pages/ProofReply_GLD/index.js b/src/pages/ProofReply_GLD/index.js new file mode 100644 index 0000000..d2604d4 --- /dev/null +++ b/src/pages/ProofReply_GLD/index.js @@ -0,0 +1,133 @@ +// material-ui +import { + Grid, + Typography, + Stack, + Box +} from '@mui/material'; +import * as UrlUtils from "utils/ApiPathConst"; +import * as React from "react"; +import * as HttpUtils from "utils/HttpUtils"; +import * as DateUtils from "utils/DateUtils"; +import { useParams } from "react-router-dom"; +import { useNavigate } from "react-router-dom"; + +import Loadable from 'components/Loadable'; +const LoadingComponent = Loadable(React.lazy(() => import('pages/extra-pages/LoadingComponent'))); +const ApplicationDetails = Loadable(React.lazy(() => import('./ApplicationDetails'))); +const ProofForm = Loadable(React.lazy(() => import('./ProofForm'))); +import titleBackgroundImg from 'assets/images/dashboard/gazette-bar.png' +const BackgroundHead = { + backgroundImage: `url(${titleBackgroundImg})`, + width: '100%', + height: '100%', + backgroundSize: 'contain', + backgroundRepeat: 'no-repeat', + backgroundColor: '#0C489E', + backgroundPosition: 'right' +} + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const Index = () => { + const params = useParams(); + const navigate = useNavigate() + + const [record, setRecord] = React.useState(); + const [onReady, setOnReady] = React.useState(false); + + React.useEffect(() => { + loadForm(); + }, []); + + React.useEffect(() => { + setOnReady(true); + }, [record]); + + + const loadForm = () => { + if (params.id > 0) { + + HttpUtils.get({ + url: UrlUtils.GET_PROOF + "/" + params.id, + onSuccess: (responseData) => { + if(!responseData.data?.id){ + navigate("/proof/search"); + } + responseData.data["phoneNumber"] = JSON.parse(responseData.data.contactTelNo).phoneNumber; + responseData.data["tel_countryCode"] = JSON.parse(responseData.data.contactTelNo).countryCode; + + responseData.data["faxNumber"] = JSON.parse(responseData.data.contactFaxNo).faxNumber; + responseData.data["fax_countryCode"] = JSON.parse(responseData.data.contactFaxNo).countryCode; + + responseData.data["issueNoStr"] = responseData.data.issueYear + + " Vol. " + zeroPad(responseData.data.issueVolume, 3) + + ", No. " + zeroPad(responseData.data.issueNo, 2); + + responseData.data["issueDateStr"] = DateUtils.dateFormat(responseData.data.issueDate, "D MMM YYYY (ddd)"); + + responseData.data["groupType"] = responseData.data.groupNo.charAt(0); + responseData.data["action"] = responseData.data.replyDate ? responseData.data.action : true; + setRecord(responseData.data); + } + }); + } + } + + function zeroPad(num, places) { + num = num ? num : 0; + var zero = places - num.toString().length + 1; + return Array(+(zero > 0 && zero)).join("0") + num; + } + + + return ( + !onReady ? + + : + ( + + +
+ + 校對記錄 + +
+
+ {/*row 1*/} + + +
+ + + + + + + + + + +
+
+
+ {/*row 2*/} +
+ + + ) + + + ); +}; + +export default Index; diff --git a/src/pages/ProofReply_Public/ProofForm.js b/src/pages/ProofReply_Public/ProofForm.js index b96612b..53d9e03 100644 --- a/src/pages/ProofReply_Public/ProofForm.js +++ b/src/pages/ProofReply_Public/ProofForm.js @@ -148,7 +148,7 @@ const FormPanel = ({ formData }) => { 校對回覆日期: {DateUtils.datetimeStr_Cht(formik.values.replyDate)} - 校對回覆: {formik.values.action ? "可以付印(稿件正確)" : "未能付印(需要修改)"} + 校對回覆: {formik.values.action ? (可以付印(稿件正確)): (未能付印(需要修改))} { formik.values.action ? diff --git a/src/pages/ProofSearch/DataGrid.js b/src/pages/ProofSearch/DataGrid.js index e71453e..cf2819c 100644 --- a/src/pages/ProofSearch/DataGrid.js +++ b/src/pages/ProofSearch/DataGrid.js @@ -17,7 +17,7 @@ export default function SearchPublicNoticeTable({ recordList }) { }, [recordList]); const handleEditClick = (params) => () => { - navigate('/application/'+ params.row.appId); + navigate('/proof/reply/'+ params.row.id); }; diff --git a/src/routes/GLDUserRoutes.js b/src/routes/GLDUserRoutes.js index 33ab5b3..44d748c 100644 --- a/src/routes/GLDUserRoutes.js +++ b/src/routes/GLDUserRoutes.js @@ -11,6 +11,7 @@ const ApplicationDetail = Loadable(lazy(() => import('pages/PublicNoticeDetail_G const ApplicationSearch = Loadable(lazy(() => import('pages/PublicNoticeSearch_GLD'))); const ProofSearch = Loadable(lazy(() => import('pages/ProofSearch'))); const ProofCreate_FromApp = Loadable(lazy(() => import('pages/ProofCreate_FromApp'))); +const ProofReply_GLD = Loadable(lazy(() => import('pages/ProofReply_GLD'))); // ==============================|| MAIN ROUTING ||============================== // const GLDUserRoutes = { @@ -43,6 +44,10 @@ const GLDUserRoutes = { { path: '/proof/create/:id', element: + }, + { + path: '/proof/reply/:id', + element: } ] },