| @@ -227,7 +227,9 @@ export const handleRefreshTokenFunction = () => { | |||
| }) | |||
| .catch((refreshError) => { | |||
| console.log('Failed to refresh token'); | |||
| console.log(refreshError) | |||
| if (refreshError != undefined){ | |||
| console.log(refreshError) | |||
| } | |||
| // token = null | |||
| isRefresh = false; | |||
| }); | |||
| @@ -35,7 +35,9 @@ const RefreshTokenProvider = ({ children }) => { | |||
| }) | |||
| .catch((refreshError) => { | |||
| console.log('Failed to refresh token'); | |||
| console.log(refreshError) | |||
| if (refreshError != undefined){ | |||
| console.log(refreshError) | |||
| } | |||
| token.current = null | |||
| isRefresh.current = false; | |||
| }); | |||
| @@ -21,6 +21,7 @@ const SysSettingProvider = ({ children }) => { | |||
| // console.log(responseData) | |||
| setSysSetting(responseData); | |||
| localStorage.setItem('sysEnv', responseData.sysEnv) | |||
| localStorage.setItem('paymentSuspention', responseData.suspensionMode) | |||
| } | |||
| }); | |||
| } | |||
| @@ -25,11 +25,12 @@ const SearchPublicNoticeForm = ({ applySearch, generateXML, searchCriteria, onGr | |||
| // const [minDate, setMinDate] = React.useState(searchCriteria.dateFrom); | |||
| const [minDate, setMinDate] = React.useState(searchCriteria.dateFrom); | |||
| const [maxDate] = React.useState(searchCriteria.dateFrom); | |||
| // const [status, setStatus] = React.useState(ComboData.paymentStatus[0]); | |||
| const [maxDate,setMaxDate] = React.useState(searchCriteria.dateFrom); | |||
| const [fromDateValue, setFromDateValue] = React.useState("dd / mm / yyyy"); | |||
| const [toDateValue, setToDateValue] = React.useState("dd / mm / yyyy"); | |||
| // const [status, setStatus] = React.useState(ComboData.paymentStatus[0]); | |||
| const { | |||
| const { | |||
| // register, | |||
| handleSubmit, | |||
| } = useForm() | |||
| @@ -37,19 +38,27 @@ const SearchPublicNoticeForm = ({ applySearch, generateXML, searchCriteria, onGr | |||
| React.useEffect(() => { | |||
| setFromDateValue(minDate); | |||
| }, [minDate]); | |||
| React.useEffect(() => { | |||
| setToDateValue(maxDate); | |||
| }, [maxDate]); | |||
| const onSubmit = () => { | |||
| let sentDateFrom = ""; | |||
| let sentDateTo = ""; | |||
| if (fromDateValue != "dd / mm / yyyy") { | |||
| sentDateFrom = DateUtils.dateValue(fromDateValue) | |||
| } | |||
| if (toDateValue != "dd / mm / yyyy") { | |||
| sentDateTo = DateUtils.dateValue(toDateValue) | |||
| } | |||
| const temp = { | |||
| // code: data.code, | |||
| // transNo: data.transNo, | |||
| dateFrom: sentDateFrom, | |||
| // dateTo: data.dateTo, | |||
| dateTo: sentDateTo, | |||
| // status : (status?.type && status?.type != 'all') ? status?.type : "", | |||
| }; | |||
| applySearch(temp); | |||
| @@ -57,16 +66,20 @@ const SearchPublicNoticeForm = ({ applySearch, generateXML, searchCriteria, onGr | |||
| const generateHandler = () => { | |||
| let sentDateFrom = ""; | |||
| let sentDateTo = ""; | |||
| if (fromDateValue != "dd / mm / yyyy") { | |||
| sentDateFrom = DateUtils.dateValue(fromDateValue) | |||
| } | |||
| if (toDateValue != "dd / mm / yyyy") { | |||
| sentDateTo = DateUtils.dateValue(toDateValue) | |||
| } | |||
| // const dateTo = getValues("dateTo") | |||
| const temp = { | |||
| // code: data.code, | |||
| // transNo: data.transNo, | |||
| dateFrom: sentDateFrom, | |||
| dateTo: "", | |||
| dateTo: sentDateTo, | |||
| // status : (status?.type && status?.type != 'all') ? status?.type : "", | |||
| }; | |||
| generateXML(temp); | |||
| @@ -90,8 +103,7 @@ const SearchPublicNoticeForm = ({ applySearch, generateXML, searchCriteria, onGr | |||
| {/*row 2*/} | |||
| <Grid container display="flex" alignItems={"center"}> | |||
| <Grid item xs={9} s={6} md={4} lg={4} sx={{ ml: 3, mr: 3, mb: 3 }}> | |||
| <Grid item xs={9} s={6} md={4} lg={4} sx={{ ml: 3, mr: 3, mb: 3 }}> | |||
| <LocalizationProvider dateAdapter={AdapterDayjs}> | |||
| <DemoItem components={['DatePicker']}> | |||
| <DatePicker | |||
| @@ -104,7 +116,7 @@ const SearchPublicNoticeForm = ({ applySearch, generateXML, searchCriteria, onGr | |||
| // }, | |||
| }} | |||
| format="DD/MM/YYYY" | |||
| label="Credit Date" | |||
| label="From Date" | |||
| value={minDate === null ? null : dayjs(minDate)} | |||
| maxDate={maxDate === null ? null : dayjs(maxDate)} | |||
| onChange={(newValue) => { | |||
| @@ -119,21 +131,30 @@ const SearchPublicNoticeForm = ({ applySearch, generateXML, searchCriteria, onGr | |||
| </Grid> | |||
| <Grid item xs={9} s={6} md={4} lg={4} sx={{ ml: 3, mr: 3, mb: 3 }}> | |||
| {/* <TextField | |||
| fullWidth | |||
| InputLabelProps={{ | |||
| shrink: true | |||
| }} | |||
| {...register("dateTo")} | |||
| InputProps={{ inputProps: { min: minDate } }} | |||
| onChange={(newValue) => { | |||
| setMaxDate(DateUtils.dateValue(newValue)); | |||
| }} | |||
| id="dateTo" | |||
| type="date" | |||
| label="To" | |||
| defaultValue={searchCriteria.dateTo} | |||
| /> */} | |||
| <LocalizationProvider dateAdapter={AdapterDayjs}> | |||
| <DemoItem components={['DatePicker']}> | |||
| <DatePicker | |||
| id="dateTo" | |||
| // onError={(newError) => setReceiptFromError(newError)} | |||
| slotProps={{ | |||
| field: { readOnly: true, }, | |||
| // textField: { | |||
| // helperText: receiptFromErrorMessage, | |||
| // }, | |||
| }} | |||
| format="DD/MM/YYYY" | |||
| label="To Date" | |||
| value={maxDate === null ? null : dayjs(maxDate)} | |||
| minDate={minDate === null ? null : dayjs(minDate)} | |||
| onChange={(newValue) => { | |||
| // console.log(newValue) | |||
| if(newValue!=null){ | |||
| setMaxDate(newValue); | |||
| } | |||
| }} | |||
| /> | |||
| </DemoItem > | |||
| </LocalizationProvider> | |||
| </Grid> | |||
| {/* <Grid item xs={9} s={6} md={4} lg={3}> | |||
| @@ -2,7 +2,9 @@ | |||
| import { | |||
| Grid, | |||
| Typography, | |||
| Stack | |||
| Stack, | |||
| Button, | |||
| Dialog, DialogTitle, DialogContent, DialogActions, | |||
| } from '@mui/material'; | |||
| import MainCard from "components/MainCard"; | |||
| import {GEN_GFMIS_XML} from "utils/ApiPathConst"; | |||
| @@ -10,6 +12,12 @@ import * as React from "react"; | |||
| import * as HttpUtils from "utils/HttpUtils"; | |||
| import * as DateUtils from "utils/DateUtils"; | |||
| import {DatePicker} from "@mui/x-date-pickers/DatePicker"; | |||
| import dayjs from "dayjs"; | |||
| import {DemoItem} from "@mui/x-date-pickers/internals/demo"; | |||
| import {LocalizationProvider} from "@mui/x-date-pickers/LocalizationProvider"; | |||
| import {AdapterDayjs} from "@mui/x-date-pickers/AdapterDayjs"; | |||
| import Loadable from 'components/Loadable'; | |||
| const LoadingComponent = Loadable(React.lazy(() => import('pages/extra-pages/LoadingComponent'))); | |||
| const SearchForm = Loadable(React.lazy(() => import('./SearchForm'))); | |||
| @@ -31,24 +39,41 @@ const BackgroundHead = { | |||
| const Index = () => { | |||
| const [searchCriteria, setSearchCriteria] = React.useState({ | |||
| dateFrom: DateUtils.dateValue(new Date()), | |||
| // dateFrom: DateUtils.dateValue(new Date().setDate(new Date().getDate()-14)), | |||
| dateTo: DateUtils.dateValue(new Date()), | |||
| dateFrom: DateUtils.dateValue(new Date().setDate(new Date().getDate()-14)), | |||
| }); | |||
| const [onReady, setOnReady] = React.useState(false); | |||
| const [onGridReady, setGridOnReady] = React.useState(false); | |||
| const [isPopUp, setIsPopUp] = React.useState(false); | |||
| const [downloadInput, setDownloadInput] = React.useState(); | |||
| const [inputDate, setInputDate] = React.useState(searchCriteria.dateTo); | |||
| const [inputDateValue, setInputDateValue] = React.useState("dd / mm / yyyy"); | |||
| React.useEffect(() => { | |||
| setInputDateValue(inputDate); | |||
| }, [inputDate]); | |||
| React.useEffect(() => { | |||
| setOnReady(true); | |||
| }, [searchCriteria]); | |||
| function downloadXML(input) { | |||
| function downloadXML() { | |||
| // console.log(input) | |||
| setIsPopUp(false) | |||
| let sentDateFrom = ""; | |||
| if (inputDateValue != "dd / mm / yyyy") { | |||
| sentDateFrom = DateUtils.dateValue(inputDateValue) | |||
| } | |||
| HttpUtils.get({ | |||
| url: GEN_GFMIS_XML + "/today", | |||
| params:{ | |||
| // dateTo: input.dateTo, | |||
| dateFrom: input.dateFrom, | |||
| dateTo: downloadInput.dateTo, | |||
| dateFrom: downloadInput.dateFrom, | |||
| inputDate: sentDateFrom | |||
| }, | |||
| onSuccess: (responseData) => { | |||
| // console.log(responseData) | |||
| @@ -100,6 +125,7 @@ const Index = () => { | |||
| function applySearch(input) { | |||
| setGridOnReady(true) | |||
| setSearchCriteria(input); | |||
| setInputDate(input.dateFrom) | |||
| } | |||
| function applyGridOnReady(input) { | |||
| @@ -107,7 +133,8 @@ const Index = () => { | |||
| } | |||
| function generateXML(input) { | |||
| downloadXML(input); | |||
| setDownloadInput(input); | |||
| setIsPopUp(true) | |||
| } | |||
| return ( | |||
| @@ -147,6 +174,50 @@ const Index = () => { | |||
| /> | |||
| </MainCard> | |||
| </Grid> | |||
| <Dialog | |||
| open={isPopUp} | |||
| onClose={() => setIsPopUp(false)} | |||
| PaperProps={{ | |||
| sx: { | |||
| minWidth: '40vw', | |||
| maxWidth: { xs: '90vw', s: '90vw', m: '70vw', lg: '70vw' }, | |||
| maxHeight: { xs: '90vh', s: '70vh', m: '70vh', lg: '60vh' } | |||
| } | |||
| }} | |||
| > | |||
| <DialogTitle> Bank Statement Collection Date </DialogTitle> | |||
| <DialogContent style={{ display: 'flex', }}> | |||
| <LocalizationProvider dateAdapter={AdapterDayjs}> | |||
| <DemoItem components={['DatePicker']}> | |||
| <DatePicker | |||
| id="dateFrom" | |||
| // onError={(newError) => setReceiptFromError(newError)} | |||
| slotProps={{ | |||
| field: { readOnly: true, }, | |||
| // textField: { | |||
| // helperText: receiptFromErrorMessage, | |||
| // }, | |||
| }} | |||
| format="DD/MM/YYYY" | |||
| // label="Credit Date" | |||
| value={inputDate === null ? null : dayjs(inputDate)} | |||
| maxDate={searchCriteria.dateTo === null ? null : dayjs(searchCriteria.dateTo)} | |||
| minDate={searchCriteria.dateFrom === null ? null : dayjs(searchCriteria.dateFrom)} | |||
| onChange={(newValue) => { | |||
| // console.log(newValue) | |||
| if(newValue!=null){ | |||
| setInputDate(newValue); | |||
| } | |||
| }} | |||
| /> | |||
| </DemoItem > | |||
| </LocalizationProvider> | |||
| </DialogContent> | |||
| <DialogActions> | |||
| <Button onClick={() => setIsPopUp(false)}><Typography variant="h5">Cancel</Typography></Button> | |||
| <Button onClick={() => downloadXML()}><Typography variant="h5">Confirm</Typography></Button> | |||
| </DialogActions> | |||
| </Dialog> | |||
| </Grid> | |||
| ); | |||
| }; | |||
| @@ -13,6 +13,7 @@ import { useParams } from "react-router-dom"; | |||
| import { useNavigate } from "react-router-dom"; | |||
| import * as DateUtils from "utils/DateUtils" | |||
| import * as FormatUtils from "utils/FormatUtils"; | |||
| import { checkPaymentSuspention } from "utils/Utils"; | |||
| import Loadable from 'components/Loadable'; | |||
| const LoadingComponent = Loadable(React.lazy(() => import('pages/extra-pages/LoadingComponent'))); | |||
| @@ -150,7 +151,6 @@ const Index = () => { | |||
| <Typography variant="h4" sx={{ textAlign: "left", ml: 4, mr: 4, mt: 4, borderBottom: "1px solid black" }}> | |||
| <FormattedMessage id="proofPaymentHeader_online" /> | |||
| </Typography> | |||
| <Typography variant="h5" sx={{ ml: 8, mt: 4, mr: 8, textAlign: "left" }}> | |||
| <div dangerouslySetInnerHTML={{ | |||
| __html: intl.formatMessage( | |||
| @@ -174,36 +174,46 @@ const Index = () => { | |||
| ) | |||
| }} /> | |||
| <br /> | |||
| {checkPaymentSuspention()? | |||
| <div> | |||
| <Typography style={{ textAlign: "flex-start" }}> | |||
| <div dangerouslySetInnerHTML={{ __html: intl.formatMessage({ id: "suspensionMessage" }) }} /> | |||
| </Typography> | |||
| <br /> | |||
| </div>:null | |||
| } | |||
| </Typography> | |||
| <Typography variant="h4" sx={{ ml: 8, textAlign: "left" }}> | |||
| <ThemeProvider theme={PNSPS_BUTTON_THEME}> | |||
| <Button | |||
| component="span" | |||
| variant="contained" | |||
| // sx={{ ml: { sm: 4, md: 4, lg: 4 }, mr: 4, mt: { xs: 2, sm: 2 }, mb: { xs: 2, sm: 2 } }} | |||
| sx={{mr: 4 }} | |||
| onClick={() => { setIsPopUp(true) }} | |||
| > | |||
| <FormattedMessage id="payInstantly" /> | |||
| </Button> | |||
| </ThemeProvider> | |||
| {!checkPaymentSuspention()? | |||
| <Typography variant="h4" sx={{ ml: 8, textAlign: "left" }}> | |||
| <ThemeProvider theme={PNSPS_BUTTON_THEME}> | |||
| <Button | |||
| component="span" | |||
| variant="contained" | |||
| // sx={{ ml: { sm: 4, md: 4, lg: 4 }, mr: 4, mt: { xs: 2, sm: 2 }, mb: { xs: 2, sm: 2 } }} | |||
| sx={{mr: 4 }} | |||
| onClick={() => { setIsPopUp(true) }} | |||
| > | |||
| <FormattedMessage id="payInstantly" /> | |||
| </Button> | |||
| </ThemeProvider> | |||
| <FormattedMessage id="or" /> | |||
| <FormattedMessage id="or" /> | |||
| <ThemeProvider theme={PNSPS_BUTTON_THEME}> | |||
| <Button | |||
| component="span" | |||
| variant="contained" | |||
| sx={{ ml: { sm: 4, md: 4, lg: 4 }, mr: 4, mt: { xs: 2, sm: 2 }, mb: { xs: 2, sm: 2 } }} | |||
| onClick={() => { | |||
| navigate("/publicNotice"); | |||
| }} | |||
| > | |||
| <FormattedMessage id="payLater" /> | |||
| </Button> | |||
| </ThemeProvider> | |||
| </Typography> | |||
| <ThemeProvider theme={PNSPS_BUTTON_THEME}> | |||
| <Button | |||
| component="span" | |||
| variant="contained" | |||
| sx={{ ml: { sm: 4, md: 4, lg: 4 }, mr: 4, mt: { xs: 2, sm: 2 }, mb: { xs: 2, sm: 2 } }} | |||
| onClick={() => { | |||
| navigate("/publicNotice"); | |||
| }} | |||
| > | |||
| <FormattedMessage id="payLater" /> | |||
| </Button> | |||
| </ThemeProvider> | |||
| </Typography>:null | |||
| } | |||
| <Typography variant="h4" sx={{ ml: 8, mt: 4, mr: 8, textAlign: "left" }}> | |||
| <div dangerouslySetInnerHTML={{ | |||
| @@ -258,47 +258,43 @@ const ApplicationDetailCard = ({ formData, }) => { | |||
| <Grid item xs={12} md={5} lg={5} sx={{ mb: 1, }}> | |||
| <Grid container alignItems={"center"}> | |||
| { | |||
| data.creditor == true ? | |||
| <> | |||
| <Grid item xs={12} md={12} lg={12} | |||
| sx={{ display: 'flex', alignItems: 'center' }}> | |||
| <Typography variant="h5" display="inline"> | |||
| <FormattedMessage id="commentDeadline" />: | |||
| </Typography> | |||
| </Grid> | |||
| <Grid item xs={12} md={12} lg={12} sx={{ mb: 4, display: 'flex', alignItems: 'center' }}> | |||
| <Typography variant="h5">  | |||
| {locale === 'en' ? | |||
| `${intl.formatMessage({ id: 'before' })} ${DateUtils.dateFormat(data?.reviseDeadline, intl.formatMessage({ id: "paymentMethodDatetimeStrFormat" }))?.replace("am", "a.m.")?.replace("pm", "p.m.")} ` | |||
| : | |||
| `${DateUtils.dateFormat(data?.reviseDeadline, intl.formatMessage({ id: "paymentMethodDatetimeStrFormat" }))?.replace("am", "上午")?.replace("pm", "下午")}${intl.formatMessage({ id: 'before' })}` | |||
| } | |||
| </Typography> | |||
| </Grid> | |||
| {data.creditor == true ? | |||
| <> | |||
| <Grid item xs={12} md={12} lg={12} | |||
| sx={{ display: 'flex', alignItems: 'center' }}> | |||
| <Typography variant="h5" display="inline"> | |||
| <FormattedMessage id="commentDeadline" />: | |||
| </Typography> | |||
| </Grid> | |||
| <Grid item xs={12} md={12} lg={12} sx={{ mb: 4, display: 'flex', alignItems: 'center' }}> | |||
| <Typography variant="h5">  | |||
| {locale === 'en' ? | |||
| `${intl.formatMessage({ id: 'before' })} ${DateUtils.dateFormat(data?.reviseDeadline, intl.formatMessage({ id: "paymentMethodDatetimeStrFormat" }))?.replace("am", "a.m.")?.replace("pm", "p.m.")} ` | |||
| : | |||
| `${DateUtils.dateFormat(data?.reviseDeadline, intl.formatMessage({ id: "paymentMethodDatetimeStrFormat" }))?.replace("am", "上午")?.replace("pm", "下午")}${intl.formatMessage({ id: 'before' })}` | |||
| } | |||
| </Typography> | |||
| </Grid> | |||
| <Grid item xs={12} md={12} lg={12} | |||
| sx={{ display: 'flex', alignItems: 'center' }}> | |||
| <Typography variant="h5" display="inline"> | |||
| <FormattedMessage id="paymentDeadline" />: | |||
| </Typography> | |||
| </Grid> | |||
| <Grid item xs={12} md={12} lg={12} sx={{ mb: 4, display: 'flex', alignItems: 'center' }}> | |||
| <Typography variant="h5">  | |||
| {locale === 'en' ? | |||
| `${intl.formatMessage({ id: 'before' })} ${DateUtils.dateFormat(data?.proofPaymentDeadline, intl.formatMessage({ id: "paymentMethodDatetimeStrFormat" }))?.replace("am", "a.m.")?.replace("pm", "p.m.")} ` | |||
| : | |||
| `${DateUtils.dateFormat(data?.proofPaymentDeadline, intl.formatMessage({ id: "paymentMethodDatetimeStrFormat" }))?.replace("am", "上午")?.replace("pm", "下午")}${intl.formatMessage({ id: 'before' })}` | |||
| } | |||
| </Typography> | |||
| </Grid> | |||
| </> | |||
| <Grid item xs={12} md={12} lg={12} | |||
| sx={{ display: 'flex', alignItems: 'center' }}> | |||
| <Typography variant="h5" display="inline"> | |||
| <FormattedMessage id="paymentDeadline" />: | |||
| </Typography> | |||
| </Grid> | |||
| <Grid item xs={12} md={12} lg={12} sx={{ mb: 4, display: 'flex', alignItems: 'center' }}> | |||
| <Typography variant="h5">  | |||
| {locale === 'en' ? | |||
| `${intl.formatMessage({ id: 'before' })} ${DateUtils.dateFormat(data?.proofPaymentDeadline, intl.formatMessage({ id: "paymentMethodDatetimeStrFormat" }))?.replace("am", "a.m.")?.replace("pm", "p.m.")} ` | |||
| : | |||
| `${DateUtils.dateFormat(data?.proofPaymentDeadline, intl.formatMessage({ id: "paymentMethodDatetimeStrFormat" }))?.replace("am", "上午")?.replace("pm", "下午")}${intl.formatMessage({ id: 'before' })}` | |||
| } | |||
| </Typography> | |||
| </Grid> | |||
| </> | |||
| : | |||
| <></> | |||
| } | |||
| <></> | |||
| } | |||
| <Grid item xs={12} sm={3} md={3} lg={3} | |||
| sx={{ mb: 1, display: 'flex', alignItems: 'center' }}> | |||
| <Typography> | |||
| @@ -28,7 +28,8 @@ import { ThemeProvider } from "@emotion/react"; | |||
| import { FormattedMessage, useIntl } from "react-intl"; | |||
| import { | |||
| isDummyLoggedIn, | |||
| checkIsOnlyOnlinePaymentByIssueDate | |||
| checkIsOnlyOnlinePaymentByIssueDate, | |||
| checkPaymentSuspention | |||
| } from "utils/Utils" | |||
| const UploadFileTable = Loadable(React.lazy(() => import('./UploadFileTable'))); | |||
| @@ -320,8 +321,6 @@ const FormPanel = ({ formData }) => { | |||
| <FormControlLabel value={false} control={<Radio />} label={intl.formatMessage({ id: 'proofWithError' })} /> | |||
| </RadioGroup> | |||
| </Grid> | |||
| { | |||
| actionValue && formData.creditor == false ? | |||
| isDummyLoggedIn() ? | |||
| @@ -436,6 +435,11 @@ const FormPanel = ({ formData }) => { | |||
| </td> | |||
| <td style={tabelStyle}> | |||
| <FormattedMessage id="payOnline" /> | |||
| {checkPaymentSuspention()? | |||
| <Typography style={{ padding: '16px' }}> | |||
| <div dangerouslySetInnerHTML={{ __html: intl.formatMessage({ id: "suspensionMessage" }) }} /> | |||
| </Typography>:null | |||
| } | |||
| <br /><a href="#payOnlineDetails" color='#fff' onClick={() => { | |||
| setWarningTitle(intl.formatMessage({ id: "paymentMeans" }) + ": " + intl.formatMessage({ id: "payOnline" })) | |||
| setWarningText( | |||
| @@ -661,8 +665,6 @@ const FormPanel = ({ formData }) => { | |||
| </Stack> | |||
| </Grid> | |||
| } | |||
| <Grid item xs={12} md={12} textAlign="left"> | |||
| <ThemeProvider theme={PNSPS_BUTTON_THEME}> | |||
| <Button | |||
| @@ -676,7 +678,6 @@ const FormPanel = ({ formData }) => { | |||
| </Button> | |||
| </ThemeProvider> | |||
| </Grid> | |||
| </Grid> | |||
| ) | |||
| @@ -10,7 +10,7 @@ import { GET_SYS_PARAMS } from "utils/ApiPathConst"; | |||
| // ==============================|| DASHBOARD - DEFAULT ||============================== // | |||
| const Table = ({onRowClick, searchCriteria}) => { | |||
| const Table = ({onRowClick, searchCriteria, refreshTrigger}) => { | |||
| const [_searchCriteria, set_searchCriteria] = React.useState(searchCriteria); | |||
| React.useEffect(() => { | |||
| @@ -70,7 +70,7 @@ const Table = ({onRowClick, searchCriteria}) => { | |||
| doLoad={React.useMemo(() => ({ | |||
| url:GET_SYS_PARAMS, | |||
| params:_searchCriteria | |||
| }), [_searchCriteria])} | |||
| }), [_searchCriteria, refreshTrigger])} | |||
| /> | |||
| {/* </Box> */} | |||
| </div> | |||
| @@ -3,11 +3,13 @@ import { | |||
| Grid, | |||
| Typography, | |||
| Stack, | |||
| Button, | |||
| Dialog, DialogTitle, DialogContent, DialogActions, | |||
| // Box, | |||
| } from '@mui/material'; | |||
| import * as React from "react"; | |||
| import { GET_SYS_PARAMS } from "utils/ApiPathConst"; | |||
| import { GET_SYS_PARAMS, GET_PAYMENT_SUSPENSION_MODE, UPDATE_PAYMENT_SUSPENSION_MODE } from "utils/ApiPathConst"; | |||
| import Loadable from 'components/Loadable'; | |||
| import MainCard from "components/MainCard"; | |||
| @@ -36,11 +38,24 @@ const SystemSetting = () => { | |||
| const [searchCriteria, setSearchCriteria] = React.useState({}); | |||
| const [selectedItem, setSelectedItem] = React.useState({}); | |||
| const [reloadTime, setReloadTime] = React.useState(new Date()) | |||
| const [isPopUp, setIsPopUp] = React.useState(false); | |||
| const [refreshTrigger, setRefreshTrigger] = React.useState(0); | |||
| const [suspensionMode, setSuspensionMode] = React.useState(); | |||
| const [onReady, setOnReady] = React.useState(false); | |||
| const forceRefresh = () => { | |||
| setRefreshTrigger(prev => prev + 1); | |||
| }; | |||
| React.useEffect(()=>{ | |||
| setSearchCriteria({}) | |||
| loadPaymentSuspension() | |||
| }, []); | |||
| React.useEffect(() => { | |||
| setOnReady(true); | |||
| }, [suspensionMode]); | |||
| const onRowClick = (param) => { | |||
| setSelectedItem(param.row); | |||
| } | |||
| @@ -60,6 +75,29 @@ const SystemSetting = () => { | |||
| onSuccess: () => { | |||
| notifyActionSuccess(); | |||
| setReloadTime(new Date()); | |||
| // forceRefresh() | |||
| } | |||
| }); | |||
| } | |||
| const loadPaymentSuspension = () => { | |||
| HttpUtils.get({ | |||
| url: GET_PAYMENT_SUSPENSION_MODE, | |||
| onSuccess: (responseData) => { | |||
| setSuspensionMode(responseData) | |||
| } | |||
| }); | |||
| } | |||
| const onPaymentSuspension = () => { | |||
| setIsPopUp(false); | |||
| HttpUtils.post({ | |||
| url: UPDATE_PAYMENT_SUSPENSION_MODE, | |||
| onSuccess: (responseData) => { | |||
| setSuspensionMode(responseData) | |||
| notifyActionSuccess(); | |||
| setReloadTime(new Date()); | |||
| forceRefresh() | |||
| } | |||
| }); | |||
| } | |||
| @@ -90,13 +128,14 @@ const SystemSetting = () => { | |||
| <Table | |||
| searchCriteria={searchCriteria} | |||
| onRowClick={onRowClick} | |||
| refreshTrigger={refreshTrigger} | |||
| /> | |||
| </MainCard> | |||
| </Grid> | |||
| </Grid> | |||
| </Grid> | |||
| <Grid item xs={12} sm={4} md={4} lg={4}> | |||
| <Grid container> | |||
| <Grid container spacing> | |||
| <Grid item xs={12} md={12}> | |||
| <MainCard elevation={0} | |||
| border={false} | |||
| @@ -110,9 +149,48 @@ const SystemSetting = () => { | |||
| </Grid> | |||
| </Grid> | |||
| </Grid> | |||
| <Grid item xs={12} sm={4} md={4} lg={4}> | |||
| {onReady? | |||
| <Grid container mb={2}> | |||
| <Grid item xs={12} md={12}> | |||
| <Button | |||
| variant="contained" | |||
| color="red" | |||
| onClick={()=>{ | |||
| setIsPopUp(true); | |||
| }} | |||
| > | |||
| {suspensionMode?"Cancel Payment Suspension Mode":"Enable Payment Suspension Mode"} | |||
| </Button> | |||
| </Grid> | |||
| </Grid>:null | |||
| } | |||
| </Grid> | |||
| </Grid> | |||
| </Grid> | |||
| {/*col 2*/} | |||
| <div> | |||
| <Dialog | |||
| open={isPopUp} | |||
| onClose={() => setIsPopUp(false)} | |||
| PaperProps={{ | |||
| sx: { | |||
| minWidth: '40vw', | |||
| maxWidth: { xs: '90vw', s: '90vw', m: '70vw', lg: '70vw' }, | |||
| maxHeight: { xs: '90vh', s: '70vh', m: '70vh', lg: '60vh' } | |||
| } | |||
| }} | |||
| > | |||
| <DialogTitle>Payment Suspension Mode</DialogTitle> | |||
| <DialogContent style={{ display: 'flex', }}> | |||
| <Typography variant="h5" style={{ padding: '16px' }}>{suspensionMode?"Cancel payment suspension mode?":"Enable payment suspension mode?"}</Typography> | |||
| </DialogContent> | |||
| <DialogActions> | |||
| <Button onClick={() => setIsPopUp(false)}><Typography variant="h5">Cancel</Typography></Button> | |||
| <Button onClick={() => onPaymentSuspension()}><Typography variant="h5">Confirm</Typography></Button> | |||
| </DialogActions> | |||
| </Dialog> | |||
| </div> | |||
| </> | |||
| </Grid> | |||
| ); | |||
| @@ -2,11 +2,12 @@ import PropTypes from 'prop-types'; | |||
| import { Box, Grid, Typography } from '@mui/material'; | |||
| // import { Stack } from '@mui/material'; | |||
| import Loadable from 'components/Loadable'; | |||
| import { lazy } from 'react'; | |||
| import { lazy, useContext } from 'react'; | |||
| import { FormattedMessage, useIntl } from "react-intl"; | |||
| import { checkSysEnv } from "utils/Utils"; | |||
| import { checkSysEnv, checkPaymentSuspention } from "utils/Utils"; | |||
| import backbroundImg from 'assets/images/bg_ml.jpg'; | |||
| import 'assets/style/loginStyles.css'; | |||
| import { SysContext } from "components/SysSettingProvider" | |||
| const AuthCard = Loadable(lazy(() => import('./AuthCardCustom'))); | |||
| @@ -20,6 +21,7 @@ const BackgroundHead = { | |||
| const AuthWrapper = ({ children }) => { | |||
| // Move useIntl inside component | |||
| const intl = useIntl(); | |||
| const { sysSetting } = useContext(SysContext); | |||
| return ( | |||
| <Box sx={{ minHeight: '87vh' }}> | |||
| @@ -41,9 +43,15 @@ const AuthWrapper = ({ children }) => { | |||
| sx={{ minHeight: { md: 'calc(87vh)' } }} | |||
| > | |||
| <Grid item xs={12} sx={{ ml: 4,}}> | |||
| {checkPaymentSuspention()? | |||
| <Typography style={{ textAlign: "flex-start" }}> | |||
| <div style={{ padding: 12 }} dangerouslySetInnerHTML={{ __html: intl.formatMessage({ id: "suspensionMessage" }) }} /> | |||
| </Typography> | |||
| : | |||
| <Typography style={{ textAlign: "flex-start" }}> | |||
| <div style={{ padding: 12 }} dangerouslySetInnerHTML={{ __html: intl.formatMessage({ id: "homePageHeaderMessage" }) }} /> | |||
| </Typography> | |||
| } | |||
| </Grid> | |||
| <Grid container direction="column" | |||
| justifyContent="flex-start" | |||
| @@ -73,18 +81,20 @@ const AuthWrapper = ({ children }) => { | |||
| </Grid> | |||
| </Grid> | |||
| </Grid> | |||
| <Grid item xs={12} md={4} lg={4} xl={4}> | |||
| <Grid | |||
| container | |||
| justifyContent="center" | |||
| alignItems="center" | |||
| sx={{ minHeight: { xs: 'calc(90vh - 134px)', md: 'calc(90vh - 112px)' }, }} | |||
| > | |||
| <Grid item xs={12} md={11} lg={11} xl={11}> | |||
| <AuthCard>{children}</AuthCard> | |||
| {sysSetting?.publicLogin? | |||
| <Grid item xs={12} md={4} lg={4} xl={4}> | |||
| <Grid | |||
| container | |||
| justifyContent="center" | |||
| alignItems="center" | |||
| sx={{ minHeight: { xs: 'calc(90vh - 134px)', md: 'calc(90vh - 112px)' }, }} | |||
| > | |||
| <Grid item xs={12} md={11} lg={11} xl={11}> | |||
| <AuthCard>{children}</AuthCard> | |||
| </Grid> | |||
| </Grid> | |||
| </Grid> | |||
| </Grid> | |||
| </Grid>:null | |||
| } | |||
| </Grid> | |||
| </div> | |||
| </Box> | |||
| @@ -6,7 +6,8 @@ import { | |||
| Typography, | |||
| Stack, | |||
| Button, | |||
| Box | |||
| Box, | |||
| Dialog, DialogTitle, DialogContent, DialogActions, | |||
| } from '@mui/material'; | |||
| import { isORGLoggedIn, } from "utils/Utils"; | |||
| import titleBackgroundImg from 'assets/images/dashboard/gazette-bar.png' | |||
| @@ -17,6 +18,7 @@ import Loadable from 'components/Loadable'; | |||
| import * as HttpUtils from "utils/HttpUtils"; | |||
| import * as UrlUtils from "utils/ApiPathConst"; | |||
| import * as DateUtils from "utils/DateUtils"; | |||
| import { checkPaymentSuspention } from "utils/Utils"; | |||
| const Message = Loadable(React.lazy(() => import('./Message'))); | |||
| const Notice = Loadable(React.lazy(() => import('./Notice'))); | |||
| @@ -49,10 +51,13 @@ const DashboardDefault = () => { | |||
| const [isLoading, setLoding] = useState(true); | |||
| const [itemList, setItemList] = React.useState([]); | |||
| const [listData, setListData] = React.useState([]); | |||
| const [paymentSuspention, setPaymentSuspention] = useState(false); | |||
| const [isPopUp, setIsPopUp] = React.useState(false); | |||
| React.useEffect(() => { | |||
| loadMessageData() | |||
| loadNoticeData() | |||
| checkPaymentSuspention()?setPaymentSuspention(true):setPaymentSuspention(false) | |||
| localStorage.setItem('searchCriteria',"") | |||
| }, []); | |||
| @@ -70,6 +75,14 @@ const DashboardDefault = () => { | |||
| } | |||
| } | |||
| React.useEffect(() => { | |||
| // console.log(messageOnReady) | |||
| // console.log(onNoticeReady) | |||
| if(paymentSuspention){ | |||
| setIsPopUp(true); | |||
| } | |||
| }, [paymentSuspention]); | |||
| React.useEffect(() => { | |||
| // console.log(messageOnReady) | |||
| // console.log(onNoticeReady) | |||
| @@ -214,6 +227,33 @@ const DashboardDefault = () => { | |||
| </Grid> | |||
| </Grid> | |||
| </Grid> | |||
| <div> | |||
| <Dialog | |||
| open={isPopUp} | |||
| onClose={() => setIsPopUp(false)} | |||
| PaperProps={{ | |||
| sx: { | |||
| minWidth: '40vw', | |||
| maxWidth: { xs: '90vw', s: '90vw', m: '70vw', lg: '70vw' }, | |||
| maxHeight: { xs: '90vh', s: '70vh', m: '70vh', lg: '60vh' } | |||
| } | |||
| }} | |||
| > | |||
| <DialogTitle> | |||
| <Typography variant="h5"> | |||
| <FormattedMessage id="systemNotice" /> | |||
| </Typography> | |||
| </DialogTitle> | |||
| <DialogContent style={{ display: 'flex', }}> | |||
| <Typography variant="h5" style={{ padding: '16px' }}> | |||
| <div dangerouslySetInnerHTML={{ __html: intl.formatMessage({ id: "suspensionMessage" }) }} /> | |||
| </Typography> | |||
| </DialogContent> | |||
| <DialogActions> | |||
| <Button onClick={() => setIsPopUp(false)}><Typography variant="h5"><FormattedMessage id="ok" /></Typography></Button> | |||
| </DialogActions> | |||
| </Dialog> | |||
| </div> | |||
| </Grid> | |||
| ); | |||
| }; | |||
| @@ -21,6 +21,7 @@ | |||
| "gazetteLength": "Length", | |||
| "gazetteSampleName": "Gazette Supplement No. 6", | |||
| "reason": "Reason", | |||
| "systemNotice": "System Notice", | |||
| "payInstantly": "Pay now", | |||
| "payLater": "Pay later", | |||
| @@ -21,6 +21,7 @@ | |||
| "gazetteLength": "长度", | |||
| "gazetteSampleName": "宪报第6号副刊公共启事", | |||
| "reason": "原因", | |||
| "systemNotice": "系统公告", | |||
| "payInstantly": "即时付款", | |||
| "payLater": "稍后付款", | |||
| @@ -21,6 +21,7 @@ | |||
| "gazetteLength": "長度", | |||
| "gazetteSampleName": "憲報第6號副刊公共啟事", | |||
| "reason": "原因", | |||
| "systemNotice": "系統公告", | |||
| "payInstantly": "即時付款", | |||
| "payLater": "稍後付款", | |||
| @@ -9,6 +9,8 @@ export const CHANGE_PASSWORD_PATH = "/user/change-password" | |||
| export const GET_SYS_PARAMS = apiPath+'/settings'; | |||
| export const PRIVACY_POLICY_PATH = apiPath+'/privacyPolicy'; | |||
| export const UPDATE_PAYMENT_SUSPENSION_MODE = apiPath+'/settings/update-payment-suspension'; | |||
| export const GET_PAYMENT_SUSPENSION_MODE = apiPath+'/settings/get-payment-suspension'; | |||
| export const I_AM_SMART_PATH = apiPath+'/smart/call/iAmSmart'; | |||
| export const I_AM_SMART_APP_PATH = apiPath+'/smart/call/app/iAmSmart'; | |||
| @@ -111,6 +111,12 @@ export const checkSysEnv = () =>{ | |||
| return localStorage.getItem('sysEnv') | |||
| } | |||
| } | |||
| export const checkPaymentSuspention = () =>{ | |||
| if (localStorage.getItem('paymentSuspention') != null){ | |||
| // console.log(localStorage.getItem('sysEnv')) | |||
| return localStorage.getItem('paymentSuspention') | |||
| } | |||
| } | |||
| /** | |||
| ** This function is used for demo purpose route navigation | |||
| ** In real app you won't need this function because your app will navigate to same route for each users regardless of ability | |||