@@ -141,5 +141,5 @@ export const getPaymentMethod = (paymentMethod) => { | |||||
if(paymentMethod == "online") return 'payOnlineMethod'; | if(paymentMethod == "online") return 'payOnlineMethod'; | ||||
if(paymentMethod == "demandNote") return 'payDnMethod'; | if(paymentMethod == "demandNote") return 'payDnMethod'; | ||||
if(paymentMethod == "office") return 'payNPGOMethod'; | if(paymentMethod == "office") return 'payNPGOMethod'; | ||||
// return null; | |||||
return "other"; | |||||
} | } |
@@ -0,0 +1,32 @@ | |||||
// material-ui | |||||
import {useState, useEffect} from 'react'; | |||||
import iAmSmartICon from 'assets/images/icons/icon_iAmSmart.png'; | |||||
import { | |||||
Button, | |||||
Typography | |||||
}from '@mui/material'; | |||||
// ==============================|| EVENT TABLE ||============================== // | |||||
export function IAmSmartButton({ label, onClickFun, fullWidth }) { | |||||
const [_label, set_label] = useState(""); | |||||
useEffect(()=>{ | |||||
set_label(label); | |||||
} | |||||
,[label]); | |||||
const doOnClick=()=>{ | |||||
onClickFun(); | |||||
} | |||||
return ( | |||||
<Button onClick={()=>doOnClick()} sx={{textTransform: 'none'}} color="iAmSmart" fullWidth={fullWidth} size="large" variant="outlined" startIcon={<img src={iAmSmartICon} alt="iAM Smart" width="30" />}> | |||||
<Typography variant="h5"> | |||||
{_label} | |||||
</Typography> | |||||
</Button> | |||||
); | |||||
} |
@@ -67,7 +67,7 @@ const Index = ({ record }) => { | |||||
id: 'proofPaymentBody_demandNote2' | id: 'proofPaymentBody_demandNote2' | ||||
}, | }, | ||||
{ | { | ||||
beforeClosingDate: "{beforeClosingDate}", | |||||
closingDateOff: "{closingDateOff}", | |||||
email: record?.mail, | email: record?.mail, | ||||
} | } | ||||
) | ) | ||||
@@ -82,6 +82,10 @@ const FormPanel = ({ formData }) => { | |||||
setWarningText(intl.formatMessage({ id: 'MSG.overReviseDeadline' })); | setWarningText(intl.formatMessage({ id: 'MSG.overReviseDeadline' })); | ||||
setIsWarningPopUp(true); | setIsWarningPopUp(true); | ||||
return; | return; | ||||
}else if ( formData.creditor==false && paymentMethod=="") { | |||||
setWarningText(intl.formatMessage({ id: 'MSG.plzSelectPaymentMethod' })); | |||||
setIsWarningPopUp(true); | |||||
return; | |||||
} | } | ||||
if (!actionValue) { | if (!actionValue) { | ||||
@@ -103,7 +107,7 @@ const FormPanel = ({ formData }) => { | |||||
files: attachments ? attachments : [], | files: attachments ? attachments : [], | ||||
onSuccess: function (responseData) { | onSuccess: function (responseData) { | ||||
if (responseData.msg) { | if (responseData.msg) { | ||||
setWarningText(intl.formatMessage({ id: 'MSG.proofOutOfTime' })); | |||||
setWarningText(intl.formatMessage({ id: responseData.msg})); | |||||
setIsWarningPopUp(true); | setIsWarningPopUp(true); | ||||
return; | return; | ||||
} | } | ||||
@@ -171,7 +175,7 @@ const FormPanel = ({ formData }) => { | |||||
} | } | ||||
const isOverDnReviseDeadline = () => { | const isOverDnReviseDeadline = () => { | ||||
let reviseDeadline = DateUtils.convertToDate(formData.beforeClosingDate); | |||||
let reviseDeadline = DateUtils.convertToDate(formData.closingDateOff); | |||||
reviseDeadline?.setTime(reviseDeadline?.getTime() + (17 * 60 * 60 * 1000));// 17:00 | reviseDeadline?.setTime(reviseDeadline?.getTime() + (17 * 60 * 60 * 1000));// 17:00 | ||||
if (!reviseDeadline) return true; | if (!reviseDeadline) return true; | ||||
let current = new Date(); | let current = new Date(); | ||||
@@ -321,7 +325,7 @@ const FormPanel = ({ formData }) => { | |||||
<li><FormattedMessage id="post" /></li> | <li><FormattedMessage id="post" /></li> | ||||
</ul> | </ul> | ||||
</td> | </td> | ||||
<td style={tabelStyle}>{DateUtils.dateFormat(formData.beforeClosingDate, intl.formatMessage({ id: "dateStrFormat" }))} 5:00 p.m.</td> | |||||
<td style={tabelStyle}>{DateUtils.dateFormat(formData.closingDateOff, intl.formatMessage({ id: "dateStrFormat" }))} 5:00 p.m.</td> | |||||
<td style={tabelStyle}> | <td style={tabelStyle}> | ||||
<FormattedMessage id="payDnRemark" values={{ | <FormattedMessage id="payDnRemark" values={{ | ||||
date: DateUtils.dateFormat(formData.closingDate, intl.formatMessage({ id: "dateStrFormat" })) + " 12:30 p.m." | date: DateUtils.dateFormat(formData.closingDate, intl.formatMessage({ id: "dateStrFormat" })) + " 12:30 p.m." | ||||
@@ -408,7 +412,7 @@ const FormPanel = ({ formData }) => { | |||||
<li><FormattedMessage id="post" /></li> | <li><FormattedMessage id="post" /></li> | ||||
</ul> | </ul> | ||||
</td> | </td> | ||||
<td style={tabelStyle}>{DateUtils.dateFormat(formData.beforeClosingDate, intl.formatMessage({ id: "dateStrFormat" }))} 5:00 p.m.</td> | |||||
<td style={tabelStyle}>{DateUtils.dateFormat(formData.closingDateOff, intl.formatMessage({ id: "dateStrFormat" }))} 5:00 p.m.</td> | |||||
<td style={tabelStyle}> | <td style={tabelStyle}> | ||||
<FormattedMessage id="payDnRemark" values={{ | <FormattedMessage id="payDnRemark" values={{ | ||||
date: DateUtils.dateFormat(formData.closingDate, intl.formatMessage({ id: "dateStrFormat" })) + " 12:30 p.m." | date: DateUtils.dateFormat(formData.closingDate, intl.formatMessage({ id: "dateStrFormat" })) + " 12:30 p.m." | ||||
@@ -48,7 +48,7 @@ const PublicNoticeApplyForm = ({ loadedData, _selections , gazetteIssueList}) => | |||||
const [issueId, setIssueId] = useState(loadedData.issueId); | const [issueId, setIssueId] = useState(loadedData.issueId); | ||||
const [closeDate, setCloseDate] = useState(null); | const [closeDate, setCloseDate] = useState(null); | ||||
const [beforeClosingDate, setBeforeClosingDate] = useState(null); | |||||
const [closingDateOff, setClosingDateOff] = useState(null); | |||||
const navigate = useNavigate(); | const navigate = useNavigate(); | ||||
const BackgroundHead = { | const BackgroundHead = { | ||||
@@ -80,7 +80,7 @@ const PublicNoticeApplyForm = ({ loadedData, _selections , gazetteIssueList}) => | |||||
let data = gazetteIssueList[i]; | let data = gazetteIssueList[i]; | ||||
if(data.id == issueId){ | if(data.id == issueId){ | ||||
setCloseDate(data.closingDate) | setCloseDate(data.closingDate) | ||||
setBeforeClosingDate(data.beforeClosingDate) | |||||
setClosingDateOff(data.closingDateOff) | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
@@ -166,12 +166,12 @@ const PublicNoticeApplyForm = ({ loadedData, _selections , gazetteIssueList}) => | |||||
const apply = (values) => { | const apply = (values) => { | ||||
setSubmitting(true) | setSubmitting(true) | ||||
let careOf = values.careOf ? values.careOf : "" | |||||
let remarks = values.remarks ? values.remarks : "" | |||||
if (isDummyLoggedIn){ | |||||
let careOf = values.careOf ?? ""; | |||||
let remarks = values.remarks ??""; | |||||
if (isDummyLoggedIn()){ | |||||
careOf = values.careOfDum | careOf = values.careOfDum | ||||
} | } | ||||
if (isDummyLoggedIn){ | |||||
if (isDummyLoggedIn()){ | |||||
remarks = values.emailAddress | remarks = values.emailAddress | ||||
} | } | ||||
HttpUtils.postWithFiles({ | HttpUtils.postWithFiles({ | ||||
@@ -332,7 +332,7 @@ const PublicNoticeApplyForm = ({ loadedData, _selections , gazetteIssueList}) => | |||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td style={tabelStyle}><FormattedMessage id="payDn" /></td> | <td style={tabelStyle}><FormattedMessage id="payDn" /></td> | ||||
<td style={tabelStyle}>{DateUtils.dateFormat(beforeClosingDate, dft)} 5:00 p.m.</td> | |||||
<td style={tabelStyle}>{DateUtils.dateFormat(closingDateOff, dft)} 5:00 p.m.</td> | |||||
<td style={tabelStyle}>{DateUtils.dateFormat(closeDate, dft)} 12:30 p.m.</td> | <td style={tabelStyle}>{DateUtils.dateFormat(closeDate, dft)} 12:30 p.m.</td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
@@ -6,13 +6,13 @@ import { | |||||
Link, Button, Card, Box, Grid | Link, Button, Card, Box, Grid | ||||
} from '@mui/material'; | } from '@mui/material'; | ||||
import Typography from '@mui/material/Typography'; | import Typography from '@mui/material/Typography'; | ||||
import iAmSmartICon from 'assets/images/icons/icon_iAmSmart.png'; | |||||
import banner from 'assets/images/bg_ml.jpg'; | import banner from 'assets/images/bg_ml.jpg'; | ||||
import { Stack } from '../../../node_modules/@mui/material/index'; | import { Stack } from '../../../node_modules/@mui/material/index'; | ||||
import { iAmSmartPath, clientId, getBowserType, isAppBowser, iAmSmartCallbackPath} from 'auth/utils' | |||||
import { iAmSmartPath, clientId, getBowserType, isAppBowser, iAmSmartCallbackPath } from 'auth/utils' | |||||
import { IAmSmartButton } from "components/iAmSmartButton"; | |||||
import * as React from 'react'; | import * as React from 'react'; | ||||
import {FormattedMessage, useIntl} from "react-intl"; | |||||
import { FormattedMessage, useIntl } from "react-intl"; | |||||
// ================================|| LOGIN ||================================ // | // ================================|| LOGIN ||================================ // | ||||
@@ -33,31 +33,31 @@ const RegisterCustom = () => { | |||||
} | } | ||||
} | } | ||||
const openQR =()=>{ | |||||
let callbackUrl = "https://"+iAmSmartCallbackPath()+"/iamsmart/registrycallback"; | |||||
const openQR = () => { | |||||
let callbackUrl = "https://" + iAmSmartCallbackPath() + "/iamsmart/registrycallback"; | |||||
let url = iAmSmartPath + "/api/v1/auth/getQR" | let url = iAmSmartPath + "/api/v1/auth/getQR" | ||||
+ "?clientID=" + clientId | + "?clientID=" + clientId | ||||
+ "&responseType=code" | + "&responseType=code" | ||||
+"&source=" + getBowserType() | |||||
+"&redirectURI="+encodeURIComponent(callbackUrl) | |||||
+"&scope="+encodeURIComponent("eidapi_auth eidapi_profiles") | |||||
+"&lang="+(locale === 'en' ?"en-US":locale === 'zh-HK' ?"zh-HK":"zh-CN") | |||||
+ "&source=" + getBowserType() | |||||
+ "&redirectURI=" + encodeURIComponent(callbackUrl) | |||||
+ "&scope=" + encodeURIComponent("eidapi_auth eidapi_profiles") | |||||
+ "&lang=" + (locale === 'en' ? "en-US" : locale === 'zh-HK' ? "zh-HK" : "zh-CN") | |||||
//+"&state=" | //+"&state=" | ||||
+"&brokerPage=false" | |||||
+ "&brokerPage=false" | |||||
window.location.assign(url); | window.location.assign(url); | ||||
} | } | ||||
const openApp = () => { | const openApp = () => { | ||||
let callbackUrl = "https://"+iAmSmartCallbackPath()+"/iamsmart/registrycallback"; | |||||
let callbackUrl = "https://" + iAmSmartCallbackPath() + "/iamsmart/registrycallback"; | |||||
let url = iAmSmartPath + "/api/v1/auth/getQR" | let url = iAmSmartPath + "/api/v1/auth/getQR" | ||||
+ "?clientID=" + clientId | + "?clientID=" + clientId | ||||
+ "&responseType=code" | + "&responseType=code" | ||||
+"&source=" + getBowserType() | |||||
+"&redirectURI="+encodeURIComponent(callbackUrl) | |||||
+"&scope="+encodeURIComponent("eidapi_auth eidapi_profiles") | |||||
+"&lang="+(locale === 'en' ?"en-US":locale === 'zh-HK' ?"zh-HK":"zh-CN") | |||||
+ "&source=" + getBowserType() | |||||
+ "&redirectURI=" + encodeURIComponent(callbackUrl) | |||||
+ "&scope=" + encodeURIComponent("eidapi_auth eidapi_profiles") | |||||
+ "&lang=" + (locale === 'en' ? "en-US" : locale === 'zh-HK' ? "zh-HK" : "zh-CN") | |||||
//+"&state=" | //+"&state=" | ||||
+"&brokerPage=true" | |||||
+ "&brokerPage=true" | |||||
window.location.assign(url); | window.location.assign(url); | ||||
} | } | ||||
@@ -81,14 +81,14 @@ const RegisterCustom = () => { | |||||
<Grid container> | <Grid container> | ||||
<Grid item xs={12} md={12}> | <Grid item xs={12} md={12}> | ||||
<Typography mt={4} variant="h3"> | <Typography mt={4} variant="h3"> | ||||
<FormattedMessage id="registerTitle1"/> | |||||
<FormattedMessage id="registerTitle1" /> | |||||
<strong style={{ color: '#FF5733' }}> | <strong style={{ color: '#FF5733' }}> | ||||
{" " + intl.formatMessage({id: 'registerTitle2'}) + " "} | |||||
{" " + intl.formatMessage({ id: 'registerTitle2' }) + " "} | |||||
</strong> | </strong> | ||||
<FormattedMessage id="registerTitle3"/> | |||||
<FormattedMessage id="registerTitle3" /> | |||||
</Typography> | </Typography> | ||||
<Typography variant="body1"> | <Typography variant="body1"> | ||||
{intl.formatMessage({id: 'registerSubTitle'})} | |||||
{intl.formatMessage({ id: 'registerSubTitle' })} | |||||
</Typography> | </Typography> | ||||
</Grid> | </Grid> | ||||
</Grid> | </Grid> | ||||
@@ -96,44 +96,42 @@ const RegisterCustom = () => { | |||||
<Grid container > | <Grid container > | ||||
<Grid item xs={12} md={6} sx={{ borderRight: 1, borderColor: 'grey.500' }}> | <Grid item xs={12} md={6} sx={{ borderRight: 1, borderColor: 'grey.500' }}> | ||||
<Typography mb={4} variant="h3"> | <Typography mb={4} variant="h3"> | ||||
<FormattedMessage id="personalUser"/> | |||||
<FormattedMessage id="personalUser" /> | |||||
</Typography> | </Typography> | ||||
<Button variant="outlined" color="iAmSmart" sx={{textTransform: 'none'}} onClick={registerWithIAmSmart} startIcon={<img src={iAmSmartICon} alt="iAM Smart" width="30" />}> | |||||
<Typography variant="h5"> | |||||
<FormattedMessage id="continueWithIAmSmart"/> | |||||
</Typography> | |||||
</Button> | |||||
<IAmSmartButton | |||||
label={intl.formatMessage({ id: 'continueWithIAmSmart' })} | |||||
onClickFun={registerWithIAmSmart} | |||||
/> | |||||
<Box mt={4} ml={2} mr={2} bgcolor="grey.100" p={1.5} > | <Box mt={4} ml={2} mr={2} bgcolor="grey.100" p={1.5} > | ||||
<Typography textAlign='justify' variant="body1" display="block" gutterBottom> | <Typography textAlign='justify' variant="body1" display="block" gutterBottom> | ||||
<div dangerouslySetInnerHTML={{ __html: intl.formatMessage({id: 'MSG.registerIAmSmart'}) }} /> | |||||
<div dangerouslySetInnerHTML={{ __html: intl.formatMessage({ id: 'MSG.registerIAmSmart' }) }} /> | |||||
</Typography> | </Typography> | ||||
<Link href={intl.formatMessage({ id: "iamsmartLink" })}> | <Link href={intl.formatMessage({ id: "iamsmartLink" })}> | ||||
<FormattedMessage id="learnMore"/> | |||||
<FormattedMessage id="learnMore" /> | |||||
</Link> | </Link> | ||||
</Box> | </Box> | ||||
<Typography m={5}> | <Typography m={5}> | ||||
<FormattedMessage id="or"/> | |||||
<FormattedMessage id="or" /> | |||||
</Typography> | </Typography> | ||||
<Button href="/registerFrom" variant="contained"><Typography variant="h5"> | <Button href="/registerFrom" variant="contained"><Typography variant="h5"> | ||||
<FormattedMessage id="registerNewPersonalUser"/> | |||||
<FormattedMessage id="registerNewPersonalUser" /> | |||||
</Typography></Button> | </Typography></Button> | ||||
<Typography ml={4} mr={4} mt={4} variant="body1" display="block" sx={{ fontWeight: 'bold' }} gutterBottom> | <Typography ml={4} mr={4} mt={4} variant="body1" display="block" sx={{ fontWeight: 'bold' }} gutterBottom> | ||||
<div dangerouslySetInnerHTML={{ __html: intl.formatMessage({id: 'MSG.registerPersonal'}) }} /> | |||||
<div dangerouslySetInnerHTML={{ __html: intl.formatMessage({ id: 'MSG.registerPersonal' }) }} /> | |||||
</Typography> | </Typography> | ||||
</Grid> | </Grid> | ||||
<Grid item xs={12} md={6} sx={{ borderLeft: 1, borderColor: 'grey.500' }}> | <Grid item xs={12} md={6} sx={{ borderLeft: 1, borderColor: 'grey.500' }}> | ||||
<Typography mb={4} variant="h3"> | <Typography mb={4} variant="h3"> | ||||
<FormattedMessage id="businessUser"/> | |||||
<FormattedMessage id="businessUser" /> | |||||
</Typography> | </Typography> | ||||
<Button href="/registerFromOrganization" variant="contained" sx={{ mt: 0.5 }}><Typography variant="h5"> | <Button href="/registerFromOrganization" variant="contained" sx={{ mt: 0.5 }}><Typography variant="h5"> | ||||
<FormattedMessage id="registerNewBusinessUser"/> | |||||
<FormattedMessage id="registerNewBusinessUser" /> | |||||
</Typography></Button> | </Typography></Button> | ||||
<Typography ml={4} mr={4} mt={4} variant="body1" display="block" sx={{ fontWeight: 'bold' }} gutterBottom> | <Typography ml={4} mr={4} mt={4} variant="body1" display="block" sx={{ fontWeight: 'bold' }} gutterBottom> | ||||
<div dangerouslySetInnerHTML={{ __html: intl.formatMessage({id: 'MSG.registerOrg'}) }} /> | |||||
<div dangerouslySetInnerHTML={{ __html: intl.formatMessage({ id: 'MSG.registerOrg' }) }} /> | |||||
</Typography> | </Typography> | ||||
</Grid> | </Grid> | ||||
</Grid> | </Grid> | ||||
@@ -142,58 +140,60 @@ const RegisterCustom = () => { | |||||
</Card > | </Card > | ||||
</center> | </center> | ||||
<Dialog | <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' } | |||||
} | |||||
}} | |||||
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></DialogTitle> | <DialogTitle></DialogTitle> | ||||
<DialogContent> | <DialogContent> | ||||
<Typography variant="h3" > | <Typography variant="h3" > | ||||
<FormattedMessage id="authorizeIAmSmartForInfo"/> | |||||
<FormattedMessage id="authorizeIAmSmartForInfo" /> | |||||
</Typography> | </Typography> | ||||
<Typography variant="h5" style={{ padding: '4px' }}> | <Typography variant="h5" style={{ padding: '4px' }}> | ||||
<FormattedMessage id="iAmSmartSubTitle"/> | |||||
<FormattedMessage id="iAmSmartSubTitle" /> | |||||
</Typography> | </Typography> | ||||
</DialogContent> | </DialogContent> | ||||
<DialogContent > | <DialogContent > | ||||
<Grid container style={{ paddingLeft: '16px' }}> | <Grid container style={{ paddingLeft: '16px' }}> | ||||
<Grid item xs={6} > | <Grid item xs={6} > | ||||
<Typography style={{ padding: '4px' }}> | <Typography style={{ padding: '4px' }}> | ||||
{"- " + intl.formatMessage({id: 'userChineseName'})} | |||||
{"- " + intl.formatMessage({ id: 'userChineseName' })} | |||||
</Typography> | </Typography> | ||||
<Typography style={{ padding: '4px' }}> | <Typography style={{ padding: '4px' }}> | ||||
{"- " + intl.formatMessage({id: 'userEnglishName'})} | |||||
{"- " + intl.formatMessage({ id: 'userEnglishName' })} | |||||
</Typography> | </Typography> | ||||
<Typography style={{ padding: '4px' }}> | <Typography style={{ padding: '4px' }}> | ||||
{"- " + intl.formatMessage({id: 'userIDNo'})} | |||||
{"- " + intl.formatMessage({ id: 'userIDNo' })} | |||||
</Typography> | </Typography> | ||||
</Grid> | </Grid> | ||||
<Grid item xs={6} > | <Grid item xs={6} > | ||||
<Typography style={{ padding: '4px' }}> | <Typography style={{ padding: '4px' }}> | ||||
{"- " + intl.formatMessage({id: 'userEmailAddress'})} | |||||
{"- " + intl.formatMessage({ id: 'userEmailAddress' })} | |||||
</Typography> | </Typography> | ||||
<Typography style={{ padding: '4px' }}> | <Typography style={{ padding: '4px' }}> | ||||
{"- " + intl.formatMessage({id: 'userPhoneNumber'})} | |||||
{"- " + intl.formatMessage({ id: 'userPhoneNumber' })} | |||||
</Typography> | </Typography> | ||||
<Typography style={{ padding: '4px' }}> | <Typography style={{ padding: '4px' }}> | ||||
{"- " + intl.formatMessage({id: 'userAddress'})} | |||||
{"- " + intl.formatMessage({ id: 'userAddress' })} | |||||
</Typography> | </Typography> | ||||
</Grid> | </Grid> | ||||
</Grid> | </Grid> | ||||
</DialogContent> | </DialogContent> | ||||
<DialogContent align="right"> | <DialogContent align="right"> | ||||
<Button variant="outlined" onClick={getQRWithIAmSmart} startIcon={<img src={iAmSmartICon} alt="iAM Smart" width="30" />}><Typography variant="h5"> | |||||
<FormattedMessage id="iAmSmartAutoFillIn"/> | |||||
</Typography></Button> | |||||
<br/> | |||||
<IAmSmartButton | |||||
label={intl.formatMessage({ id: 'iAmSmartAutoFillIn' })} | |||||
onClickFun={getQRWithIAmSmart} | |||||
/> | |||||
<br /> | |||||
<Link href={intl.formatMessage({ id: "iamsmartLink" })}> | <Link href={intl.formatMessage({ id: "iamsmartLink" })}> | ||||
<FormattedMessage id="learnMore"/> | |||||
<FormattedMessage id="learnMore" /> | |||||
</Link> | </Link> | ||||
</DialogContent> | </DialogContent> | ||||
</Dialog> | </Dialog> | ||||
@@ -1,7 +1,7 @@ | |||||
import React, { | |||||
import { | |||||
useEffect, | useEffect, | ||||
useState, | useState, | ||||
lazy, | |||||
lazy, | |||||
// useContext | // useContext | ||||
} from 'react'; | } from 'react'; | ||||
import { Link as RouterLink } from 'react-router-dom'; | import { Link as RouterLink } from 'react-router-dom'; | ||||
@@ -36,18 +36,19 @@ import { useFormik, FormikProvider } from 'formik'; | |||||
import AnimateButton from 'components/@extended/AnimateButton'; | import AnimateButton from 'components/@extended/AnimateButton'; | ||||
import Loadable from 'components/Loadable'; | import Loadable from 'components/Loadable'; | ||||
const PasswordAlertDialog = Loadable(lazy(() => import('./PasswordAlertDialog'))); | const PasswordAlertDialog = Loadable(lazy(() => import('./PasswordAlertDialog'))); | ||||
// assets | // assets | ||||
import { EyeOutlined, EyeInvisibleOutlined } from '@ant-design/icons'; | import { EyeOutlined, EyeInvisibleOutlined } from '@ant-design/icons'; | ||||
// import axios from "axios"; | // import axios from "axios"; | ||||
import iAmSmartICon from 'assets/images/icons/icon_iAmSmart.png'; | |||||
import { useDispatch } from "react-redux"; | import { useDispatch } from "react-redux"; | ||||
import { handleLogin } from "auth/index"; | import { handleLogin } from "auth/index"; | ||||
import useJwt from "auth/jwt/useJwt"; | import useJwt from "auth/jwt/useJwt"; | ||||
import { handleLogoutFunction } from 'auth/index'; | import { handleLogoutFunction } from 'auth/index'; | ||||
import {FormattedMessage, useIntl} from "react-intl"; | |||||
import { FormattedMessage, useIntl } from "react-intl"; | |||||
import {IAmSmartButton} from "components/iAmSmartButton"; | |||||
// import LocaleContext from "components/I18nProvider"; | // import LocaleContext from "components/I18nProvider"; | ||||
const LoadingComponent = Loadable(React.lazy(() => import('pages/extra-pages/LoadingComponent'))); | |||||
const LoadingComponent = Loadable(lazy(() => import('pages/extra-pages/LoadingComponent'))); | |||||
// ============================|| FIREBASE - LOGIN ||============================ // | // ============================|| FIREBASE - LOGIN ||============================ // | ||||
@@ -65,7 +66,7 @@ const AuthLoginCustom = () => { | |||||
// let [posts, setPosts] = useState([]); | // let [posts, setPosts] = useState([]); | ||||
const [isValid, setisValid] = useState(false); | const [isValid, setisValid] = useState(false); | ||||
const [open, setOpen] = React.useState(false); | |||||
const [open, setOpen] = useState(false); | |||||
const [isButtonDisabled, setIsButtonDisabled] = useState(true); | const [isButtonDisabled, setIsButtonDisabled] = useState(true); | ||||
const [errorMassage, setErrorMassage] = useState(''); | const [errorMassage, setErrorMassage] = useState(''); | ||||
const [onLogin, setOnLogin] = useState(false); | const [onLogin, setOnLogin] = useState(false); | ||||
@@ -97,21 +98,21 @@ const AuthLoginCustom = () => { | |||||
const data = { ...userData, accessToken: response.data.accessToken, refreshToken: response.data.refreshToken } | const data = { ...userData, accessToken: response.data.accessToken, refreshToken: response.data.refreshToken } | ||||
// setSuccess(true) | // setSuccess(true) | ||||
// console.log(response.data); | // console.log(response.data); | ||||
if(response.data.type === "GLD"){ | |||||
if (response.data.type === "GLD") { | |||||
// setLocale("en"); | // setLocale("en"); | ||||
localStorage.setItem('locale','en'); | |||||
}else{ | |||||
if (response.data.preferLocale ==="zh_HK"){ | |||||
localStorage.setItem('locale', 'en'); | |||||
} else { | |||||
if (response.data.preferLocale === "zh_HK") { | |||||
// setLocale("zh-HK"); | // setLocale("zh-HK"); | ||||
localStorage.setItem('locale','zh-HK'); | |||||
localStorage.setItem('locale', 'zh-HK'); | |||||
} | } | ||||
if (response.data.preferLocale ==="zh-CN"){ | |||||
if (response.data.preferLocale === "zh-CN") { | |||||
// setLocale("zh-CN"); | // setLocale("zh-CN"); | ||||
localStorage.setItem('locale','zh-CN'); | |||||
localStorage.setItem('locale', 'zh-CN'); | |||||
} | } | ||||
if (response.data.preferLocale ==="en"){ | |||||
if (response.data.preferLocale === "en") { | |||||
// setLocale("zh-CN"); | // setLocale("zh-CN"); | ||||
localStorage.setItem('locale','en'); | |||||
localStorage.setItem('locale', 'en'); | |||||
} | } | ||||
} | } | ||||
dispatch(handleLogin(data)) | dispatch(handleLogin(data)) | ||||
@@ -123,9 +124,9 @@ const AuthLoginCustom = () => { | |||||
console.log(error) | console.log(error) | ||||
// setSuccess(false) | // setSuccess(false) | ||||
setOnLogin(false) | setOnLogin(false) | ||||
if(error.response!= undefined){ | |||||
if (error.response != undefined) { | |||||
setErrorMassage(error.response.data.error) | setErrorMassage(error.response.data.error) | ||||
}else{ | |||||
} else { | |||||
setErrorMassage("CONNECTION_ERROR") | setErrorMassage("CONNECTION_ERROR") | ||||
} | } | ||||
setOpen(true) | setOpen(true) | ||||
@@ -143,12 +144,12 @@ const AuthLoginCustom = () => { | |||||
}), | }), | ||||
validationSchema: yup.object().shape({ | validationSchema: yup.object().shape({ | ||||
// username: yup.string().min(6,'用戶名稱最少6位').required('請輸入用戶名稱'), | // username: yup.string().min(6,'用戶名稱最少6位').required('請輸入用戶名稱'), | ||||
username: yup.string().required(intl.formatMessage({id: 'requireUsername'})), | |||||
password: yup.string().min(8, intl.formatMessage({id: 'atLeast8CharPassword'})).required(intl.formatMessage({id: 'requirePassword'})) | |||||
.matches(/^(?=.*[a-z])/, intl.formatMessage({id: 'atLeastOneSmallLetter'})) | |||||
.matches(/^(?=.*[A-Z])/, intl.formatMessage({id: 'atLeastOneCapLetter'})) | |||||
.matches(/^(?=.*[0-9])/, intl.formatMessage({id: 'atLeast1Number'})) | |||||
.matches(/^(?=.*[!@#%&])/, intl.formatMessage({id: 'atLeast1SpecialChar'})), | |||||
username: yup.string().required(intl.formatMessage({ id: 'requireUsername' })), | |||||
password: yup.string().min(8, intl.formatMessage({ id: 'atLeast8CharPassword' })).required(intl.formatMessage({ id: 'requirePassword' })) | |||||
.matches(/^(?=.*[a-z])/, intl.formatMessage({ id: 'atLeastOneSmallLetter' })) | |||||
.matches(/^(?=.*[A-Z])/, intl.formatMessage({ id: 'atLeastOneCapLetter' })) | |||||
.matches(/^(?=.*[0-9])/, intl.formatMessage({ id: 'atLeast1Number' })) | |||||
.matches(/^(?=.*[!@#%&])/, intl.formatMessage({ id: 'atLeast1SpecialChar' })), | |||||
}), | }), | ||||
}); | }); | ||||
@@ -201,7 +202,7 @@ const AuthLoginCustom = () => { | |||||
const { handleSubmit } = useForm({}) | const { handleSubmit } = useForm({}) | ||||
const getQRWithIAmSmart = () => { | |||||
function getQRWithIAmSmart(){ | |||||
if (isAppBowser()) { | if (isAppBowser()) { | ||||
openApp(); | openApp(); | ||||
} else { | } else { | ||||
@@ -217,10 +218,10 @@ const AuthLoginCustom = () => { | |||||
+ "&source=" + getBowserType() | + "&source=" + getBowserType() | ||||
+ "&redirectURI=" + encodeURIComponent(callbackUrl) | + "&redirectURI=" + encodeURIComponent(callbackUrl) | ||||
+ "&scope=" + encodeURIComponent("eidapi_auth eidapi_profiles") | + "&scope=" + encodeURIComponent("eidapi_auth eidapi_profiles") | ||||
+"&lang="+(locale === 'en' ?"en-US":locale === 'zh-HK' ?"zh-HK":"zh-CN") | |||||
+ "&lang=" + (locale === 'en' ? "en-US" : locale === 'zh-HK' ? "zh-HK" : "zh-CN") | |||||
//+"&state=" | //+"&state=" | ||||
+ "&brokerPage=false" | + "&brokerPage=false" | ||||
window.location=url; | |||||
window.location = url; | |||||
} | } | ||||
const openApp = () => { | const openApp = () => { | ||||
@@ -249,10 +250,10 @@ const AuthLoginCustom = () => { | |||||
+ "&source=" + getBowserType() | + "&source=" + getBowserType() | ||||
+ "&redirectURI=" + encodeURIComponent(callbackUrl) | + "&redirectURI=" + encodeURIComponent(callbackUrl) | ||||
+ "&scope=" + encodeURIComponent("eidapi_auth eidapi_profiles") | + "&scope=" + encodeURIComponent("eidapi_auth eidapi_profiles") | ||||
+"&lang="+(locale === 'en' ?"en-US":locale === 'zh-HK' ?"zh-HK":"zh-CN") | |||||
+ "&lang=" + (locale === 'en' ? "en-US" : locale === 'zh-HK' ? "zh-HK" : "zh-CN") | |||||
//+"&state=" | //+"&state=" | ||||
+ "&brokerPage=true" | + "&brokerPage=true" | ||||
window.location=url; | |||||
window.location = url; | |||||
} | } | ||||
@@ -265,7 +266,7 @@ const AuthLoginCustom = () => { | |||||
<Stack spacing={1}> | <Stack spacing={1}> | ||||
<InputLabel htmlFor="email-login"> | <InputLabel htmlFor="email-login"> | ||||
<Typography variant="h5"> | <Typography variant="h5"> | ||||
<FormattedMessage id="userLoginName"/> | |||||
<FormattedMessage id="userLoginName" /> | |||||
</Typography> | </Typography> | ||||
</InputLabel> | </InputLabel> | ||||
<OutlinedInput | <OutlinedInput | ||||
@@ -297,7 +298,7 @@ const AuthLoginCustom = () => { | |||||
<Grid item xs={12}> | <Grid item xs={12}> | ||||
<Stack spacing={1}> | <Stack spacing={1}> | ||||
<InputLabel htmlFor="password-login"><Typography variant="h5"> | <InputLabel htmlFor="password-login"><Typography variant="h5"> | ||||
<FormattedMessage id="userPassword"/> | |||||
<FormattedMessage id="userPassword" /> | |||||
</Typography></InputLabel> | </Typography></InputLabel> | ||||
<OutlinedInput | <OutlinedInput | ||||
fullWidth | fullWidth | ||||
@@ -335,9 +336,9 @@ const AuthLoginCustom = () => { | |||||
<Grid container> | <Grid container> | ||||
<Grid item xs={12}> | <Grid item xs={12}> | ||||
<AnimateButton> | <AnimateButton> | ||||
{onLogin? | |||||
<LoadingComponent disableText={true} alignItems="center"/> | |||||
: | |||||
{onLogin ? | |||||
<LoadingComponent disableText={true} alignItems="center" /> | |||||
: | |||||
<Button disableElevation disabled={isButtonDisabled} | <Button disableElevation disabled={isButtonDisabled} | ||||
fullWidth size="large" type="submit" variant="contained" color="primary" | fullWidth size="large" type="submit" variant="contained" color="primary" | ||||
sx={{ | sx={{ | ||||
@@ -349,7 +350,7 @@ const AuthLoginCustom = () => { | |||||
} | } | ||||
}}> | }}> | ||||
<Typography variant="h5"> | <Typography variant="h5"> | ||||
<FormattedMessage id="login"/> | |||||
<FormattedMessage id="login" /> | |||||
</Typography> | </Typography> | ||||
</Button> | </Button> | ||||
} | } | ||||
@@ -357,17 +358,17 @@ const AuthLoginCustom = () => { | |||||
</Grid> | </Grid> | ||||
<Grid item xs={12}> | <Grid item xs={12}> | ||||
<Stack direction="row" justifyContent="flex-start" alignItems="center" spacing={1}> | <Stack direction="row" justifyContent="flex-start" alignItems="center" spacing={1}> | ||||
<Link component={RouterLink} to="/forgot/password" color="primary" sx={{textDecoration:"none"}}> | |||||
<Link component={RouterLink} to="/forgot/password" color="primary" sx={{ textDecoration: "none" }}> | |||||
<Typography align="center" variant="h7"> | <Typography align="center" variant="h7"> | ||||
<FormattedMessage id="forgotUserPassword"/>? | |||||
<FormattedMessage id="forgotUserPassword" />? | |||||
</Typography> | </Typography> | ||||
</Link> | </Link> | ||||
<Typography align="center" variant="h7"> | <Typography align="center" variant="h7"> | ||||
| | | | ||||
</Typography> | </Typography> | ||||
<Link component={RouterLink} to="/forgot/username" color="primary" sx={{textDecoration:"none"}}> | |||||
<Link component={RouterLink} to="/forgot/username" color="primary" sx={{ textDecoration: "none" }}> | |||||
<Typography align="center" variant="h7"> | <Typography align="center" variant="h7"> | ||||
<FormattedMessage id="forgotUsername"/>? | |||||
<FormattedMessage id="forgotUsername" />? | |||||
</Typography> | </Typography> | ||||
</Link> | </Link> | ||||
</Stack> | </Stack> | ||||
@@ -378,18 +379,18 @@ const AuthLoginCustom = () => { | |||||
<Grid container> | <Grid container> | ||||
<Grid item xs={12}> | <Grid item xs={12}> | ||||
<Stack direction="row" justifyContent="space-between" alignItems="center" spacing={2}> | <Stack direction="row" justifyContent="space-between" alignItems="center" spacing={2}> | ||||
<Button onClick={() => getQRWithIAmSmart()} sx={{textTransform: 'none'}} color="iAmSmart" fullWidth size="large" variant="outlined" startIcon={<img src={iAmSmartICon} alt="iAM Smart" width="30" />}> | |||||
<Typography variant="h5"> | |||||
<FormattedMessage id="iAmSmartLogin"/> | |||||
</Typography> | |||||
</Button> | |||||
<IAmSmartButton | |||||
label={intl.formatMessage({ id: "iAmSmartLogin" })} | |||||
onClickFun={getQRWithIAmSmart} | |||||
fullWidth={true} | |||||
/> | |||||
</Stack> | </Stack> | ||||
</Grid> | </Grid> | ||||
<Grid item xs={12}> | <Grid item xs={12}> | ||||
<Stack direction="row" justifyContent="space-between" alignItems="center" spacing={2}> | <Stack direction="row" justifyContent="space-between" alignItems="center" spacing={2}> | ||||
<Link href={intl.formatMessage({ id: "iamsmartLink" })} color="primary" sx={{textDecoration:"none"}}> | |||||
<Link href={intl.formatMessage({ id: "iamsmartLink" })} color="primary" sx={{ textDecoration: "none" }}> | |||||
<Typography align="center" variant="h7"> | <Typography align="center" variant="h7"> | ||||
{ intl.formatMessage({id: 'learnMore'})+" >"} | |||||
{intl.formatMessage({ id: 'learnMore' }) + " >"} | |||||
</Typography> | </Typography> | ||||
</Link> | </Link> | ||||
</Stack> | </Stack> | ||||
@@ -399,7 +400,7 @@ const AuthLoginCustom = () => { | |||||
<Grid item xs={12}> | <Grid item xs={12}> | ||||
<Stack direction="row" justifyContent="space-between" alignItems="center" spacing={2}> | <Stack direction="row" justifyContent="space-between" alignItems="center" spacing={2}> | ||||
<Button fullWidth size="large" variant="outlined" href="/register" ><Typography variant="h5"> | <Button fullWidth size="large" variant="outlined" href="/register" ><Typography variant="h5"> | ||||
<FormattedMessage id="createOrReActivate"/> | |||||
<FormattedMessage id="createOrReActivate" /> | |||||
</Typography></Button> | </Typography></Button> | ||||
</Stack> | </Stack> | ||||
</Grid> | </Grid> | ||||
@@ -85,7 +85,7 @@ const CustomFormWizard = (props) => { | |||||
const handleMouseDownId = (event) => { | const handleMouseDownId = (event) => { | ||||
event.preventDefault(); | event.preventDefault(); | ||||
}; | }; | ||||
const handleClickShowComId = () => { | const handleClickShowComId = () => { | ||||
setshowComId(!showId); | setshowComId(!showId); | ||||
}; | }; | ||||
@@ -102,18 +102,18 @@ const CustomFormWizard = (props) => { | |||||
} | } | ||||
}, [selectedAddress4, selectedAddress5]) | }, [selectedAddress4, selectedAddress5]) | ||||
function getRequiredErrStr(fieldname){ | |||||
return displayErrorMsg(intl.formatMessage({ id: 'require'},{fieldname:fieldname?intl.formatMessage({ id: fieldname}):""})); | |||||
function getRequiredErrStr(fieldname) { | |||||
return displayErrorMsg(intl.formatMessage({ id: 'require' }, { fieldname: fieldname ? intl.formatMessage({ id: fieldname }) : "" })); | |||||
} | } | ||||
function getMaxErrStr(num, fieldname){ | |||||
return displayErrorMsg(intl.formatMessage({ id: 'noMoreThenNWords' },{num:num, fieldname:fieldname?intl.formatMessage({ id: fieldname})+": ":""})); | |||||
function getMaxErrStr(num, fieldname) { | |||||
return displayErrorMsg(intl.formatMessage({ id: 'noMoreThenNWords' }, { num: num, fieldname: fieldname ? intl.formatMessage({ id: fieldname }) + ": " : "" })); | |||||
} | } | ||||
const responseToData = () => { | const responseToData = () => { | ||||
//let rd = JSON.parse("{\"emailAddress\":\"[email protected]\",\"postalAddress\":{\"EngPremisesAddress\":{\"EngDistrict\":{\"DcDistrict\":\"KC\",\"Sub-district\":\"TSING YI\"},\"EngEstate\":{\"EstateName\":\"Cheung Hang Estate\",\"EngPhase\":{\"PhaseName\":\"N/A\"}},\"BuildingName\":\"Hang Lai House\",\"EngBlock\":{\"BlockDescriptor\":\"Block\",\"BlockNo\":\"2\"},\"Region\":\"NT\",\"EngStreet\":{\"StreetName\":\"Liu To Road\",\"BuildingNoFrom\":\"6\"},\"Eng3dAddress\":{\"EngFloor\":{\"FloorNum\":\"33\"},\"EngUnit\":{\"UnitDescriptor\":\"Room\",\"UnitNo\":\"3301\"}}}},\"mobileNumber\":{\"CountryCode\":\"852\",\"SubscriberNumber\":\"99999999\"},\"residentialAddress\":{\"ChiPremisesAddress\":{\"Chi3dAddress\":{\"ChiUnit\":{\"UnitDescriptor\":\"室\",\"UnitNo\":\"1010\"},\"ChiFloor\":{\"FloorNum\":\"10\"}},\"ChiBlock\":{\"BlockDescriptor\":\"座\",\"BlockNo\":\"2\"},\"BuildingName\":\"亨麗樓(第2座)\",\"ChiDistrict\":{\"DcDistrict\":\"KC\",\"Sub-district\":\"青衣\"},\"Region\":\"新界\",\"ChiEstate\":{\"EstateName\":\"長亨邨\"},\"ChiStreet\":{\"StreetName\":\"寮肚路\",\"BuildingNoFrom\":\"6\"}}},\"enName\":{\"UnstructuredName\":\"Testing Co One\"},\"idNo\":{\"Identification\":\"G561107\",\"CheckDigit\":\"4\"},\"chName\":{\"ChineseName\":\"測試商一\"}}"); | |||||
let rd = JSON.parse(location.state?.responseData.data); | |||||
let rd = JSON.parse("{\"emailAddress\":\"[email protected]\",\"postalAddress\":{\"EngPremisesAddress\":{\"EngDistrict\":{\"DcDistrict\":\"KC\",\"Sub-district\":\"TSING YI\"},\"EngEstate\":{\"EstateName\":\"Cheung Hang Estate\",\"EngPhase\":{\"PhaseName\":\"N/A\"}},\"BuildingName\":\"Hang Lai House\",\"EngBlock\":{\"BlockDescriptor\":\"Block\",\"BlockNo\":\"2\"},\"Region\":\"NT\",\"EngStreet\":{\"StreetName\":\"Liu To Road\",\"BuildingNoFrom\":\"6\"},\"Eng3dAddress\":{\"EngFloor\":{\"FloorNum\":\"33\"},\"EngUnit\":{\"UnitDescriptor\":\"Room\",\"UnitNo\":\"3301\"}}}},\"mobileNumber\":{\"CountryCode\":\"852\",\"SubscriberNumber\":\"99999999\"},\"residentialAddress\":{\"ChiPremisesAddress\":{\"Chi3dAddress\":{\"ChiUnit\":{\"UnitDescriptor\":\"室\",\"UnitNo\":\"1010\"},\"ChiFloor\":{\"FloorNum\":\"10\"}},\"ChiBlock\":{\"BlockDescriptor\":\"座\",\"BlockNo\":\"2\"},\"BuildingName\":\"亨麗樓(第2座)\",\"ChiDistrict\":{\"DcDistrict\":\"KC\",\"Sub-district\":\"青衣\"},\"Region\":\"新界\",\"ChiEstate\":{\"EstateName\":\"長亨邨\"},\"ChiStreet\":{\"StreetName\":\"寮肚路\",\"BuildingNoFrom\":\"6\"}}},\"enName\":{\"UnstructuredName\":\"Testing Co One\"},\"idNo\":{\"Identification\":\"G561107\",\"CheckDigit\":\"4\"},\"chName\":{\"ChineseName\":\"測試商一\"}}"); | |||||
//let rd = JSON.parse(location.state?.responseData.data); | |||||
let data = { | let data = { | ||||
"enName": rd?.enName?.UnstructuredName ?? "", | "enName": rd?.enName?.UnstructuredName ?? "", | ||||
"chName": rd?.chName?.ChineseName ?? "", | "chName": rd?.chName?.ChineseName ?? "", | ||||
@@ -213,6 +213,7 @@ const CustomFormWizard = (props) => { | |||||
formik.setFieldValue("idNo", iAmSmartData.idNo ?? ""); | formik.setFieldValue("idNo", iAmSmartData.idNo ?? ""); | ||||
formik.setFieldValue("checkDigit", iAmSmartData.checkDigit ?? ""); | formik.setFieldValue("checkDigit", iAmSmartData.checkDigit ?? ""); | ||||
formik.setFieldValue("email", iAmSmartData.email ?? ""); | formik.setFieldValue("email", iAmSmartData.email ?? ""); | ||||
formik.setFieldValue("emailConfirm", iAmSmartData.email ?? ""); | |||||
formik.setFieldValue("phone", iAmSmartData.phone ?? ""); | formik.setFieldValue("phone", iAmSmartData.phone ?? ""); | ||||
formik.setFieldValue("phoneCountryCode", iAmSmartData.phoneCountryCode ?? ""); | formik.setFieldValue("phoneCountryCode", iAmSmartData.phoneCountryCode ?? ""); | ||||
formik.setFieldValue("address1", iAmSmartData.address1 ?? ""); | formik.setFieldValue("address1", iAmSmartData.address1 ?? ""); | ||||
@@ -393,11 +394,11 @@ const CustomFormWizard = (props) => { | |||||
address1: yup.string().max(40, getMaxErrStr(40)).required(displayErrorMsg(intl.formatMessage({ id: 'validateAddressLine1' }))), | address1: yup.string().max(40, getMaxErrStr(40)).required(displayErrorMsg(intl.formatMessage({ id: 'validateAddressLine1' }))), | ||||
address2: yup.string().max(40), | address2: yup.string().max(40), | ||||
address3: yup.string().max(40), | address3: yup.string().max(40), | ||||
email: yup.string().email(displayErrorMsg(intl.formatMessage({ id: 'validEmailFormat' }))).max(128, getMaxErrStr(128)).required(displayErrorMsg(intl.formatMessage({ id: 'requireEmail' }))), | |||||
emailConfirm: yup.string().email(displayErrorMsg(intl.formatMessage({ id: 'validEmailFormat' }))).max(128, getMaxErrStr(128)).required(displayErrorMsg(intl.formatMessage({ id: 'requireEmail' }))).oneOf([yup.ref('email'), null], displayErrorMsg(intl.formatMessage({ id: 'validSameEmail' }))), | |||||
email: yup.string().email(displayErrorMsg(intl.formatMessage({ id: 'validEmailFormat' }))).max(128, getMaxErrStr(128)).required(displayErrorMsg(intl.formatMessage({ id: 'requireEmail' }))), | |||||
emailConfirm: yup.string().email(displayErrorMsg(intl.formatMessage({ id: 'validEmailFormat' }))).max(128, getMaxErrStr(128)).required(displayErrorMsg(intl.formatMessage({ id: 'requireEmail' }))).oneOf([yup.ref('email'), null], displayErrorMsg(intl.formatMessage({ id: 'validSameEmail' }))), | |||||
phoneCountryCode: yup.string().min(2, displayErrorMsg(intl.formatMessage({ id: 'requireAtLeast2Number' }))).required(displayErrorMsg(intl.formatMessage({ id: 'requireDialingCode' }))), | phoneCountryCode: yup.string().min(2, displayErrorMsg(intl.formatMessage({ id: 'requireAtLeast2Number' }))).required(displayErrorMsg(intl.formatMessage({ id: 'requireDialingCode' }))), | ||||
phone: yup.string().min(8, displayErrorMsg(intl.formatMessage({ id: 'requireAtLeast8Number' }))).required(displayErrorMsg(intl.formatMessage({ id: 'requireContactNumber' }))), | phone: yup.string().min(8, displayErrorMsg(intl.formatMessage({ id: 'requireAtLeast8Number' }))).required(displayErrorMsg(intl.formatMessage({ id: 'requireContactNumber' }))), | ||||
captchaField: yup.string().max(5, getMaxErrStr(5)).required(displayErrorMsg(intl.formatMessage({ id: 'requireVerify' }))),//.oneOf([captcha], displayErrorMsg('請輸入有效驗證')), | |||||
captchaField: yup.string().max(5, getMaxErrStr(5)).required(displayErrorMsg(intl.formatMessage({ id: 'requireVerify' }))),//.oneOf([captcha], displayErrorMsg('請輸入有效驗證')), | |||||
}), | }), | ||||
}); | }); | ||||
@@ -442,17 +443,15 @@ const CustomFormWizard = (props) => { | |||||
</Grid> | </Grid> | ||||
<Grid item xs={12} md={12} > | <Grid item xs={12} md={12} > | ||||
<Grid container sx={{ mb: 1 }}> | <Grid container sx={{ mb: 1 }}> | ||||
<Stack direction="row"> | |||||
<InputLabel htmlFor="idDocType-signup"> | |||||
<Typography variant="h5" sx={{mr:1}}> | |||||
<FormattedMessage id="HKIDcard" />: | |||||
{/* {iAmSmartData.idNo + "(" + iAmSmartData.checkDigit + ")"} */} | |||||
</Typography> | |||||
<Typography variant="h5"> | |||||
{iAmSmartData?.idNo?.slice(0, 4)} | |||||
</Typography> | |||||
<InputLabel htmlFor="idDocType-signup"> | |||||
<Typography variant="h5" sx={{ mr: 1 }}> | |||||
<FormattedMessage id="HKIDcard" />: {iAmSmartData.idNo ? <img src={iAmSmartICon} alt="iAM Smart" width="25" /> : <></>} | |||||
{/* {iAmSmartData.idNo + "(" + iAmSmartData.checkDigit + ")"} */} | |||||
</Typography> | |||||
<Stack direction="row"> | |||||
<Typography variant="h5"> | <Typography variant="h5"> | ||||
{showId ?iAmSmartData?.idNo?.slice(4):"****"}{showId ? '(' + iAmSmartData.checkDigit + ')' :null} | |||||
{iAmSmartData?.idNo?.slice(0, 4)}{showId ? iAmSmartData?.idNo?.slice(4) : "****"}{showId ? '(' + iAmSmartData.checkDigit + ')' : null} | |||||
</Typography> | </Typography> | ||||
<IconButton | <IconButton | ||||
aria-label="toggle id visibility" | aria-label="toggle id visibility" | ||||
@@ -462,26 +461,27 @@ const CustomFormWizard = (props) => { | |||||
size="medium" | size="medium" | ||||
> | > | ||||
{showId ? <EyeOutlined /> : <EyeInvisibleOutlined />} | {showId ? <EyeOutlined /> : <EyeInvisibleOutlined />} | ||||
</IconButton> | |||||
</InputLabel> | |||||
</Stack> | |||||
</IconButton> | |||||
</Stack> | |||||
</InputLabel> | |||||
</Grid> | </Grid> | ||||
</Grid> | </Grid> | ||||
<Grid item xs={12} md={6}> | <Grid item xs={12} md={6}> | ||||
<Stack spacing={1}> | <Stack spacing={1}> | ||||
<InputLabel htmlFor="enName-signup"> | <InputLabel htmlFor="enName-signup"> | ||||
<Typography variant="h5"> | <Typography variant="h5"> | ||||
<FormattedMessage id="userEnglishName" />: {iAmSmartData.enName} | |||||
<FormattedMessage id="userEnglishName" />: {iAmSmartData.enName}{iAmSmartData.enName ? <img src={iAmSmartICon} alt="iAM Smart" width="25" /> : <></>} | |||||
</Typography> | </Typography> | ||||
</InputLabel> | |||||
</InputLabel> | |||||
</Stack> | </Stack> | ||||
</Grid> | </Grid> | ||||
<Grid item xs={12} md={6}> | <Grid item xs={12} md={6}> | ||||
<Stack spacing={1}> | <Stack spacing={1}> | ||||
<InputLabel htmlFor="chName-signup"> | <InputLabel htmlFor="chName-signup"> | ||||
<Typography variant="h5"> | <Typography variant="h5"> | ||||
{intl.formatMessage({ id: 'userChineseName' })}: {iAmSmartData.chName} | |||||
{intl.formatMessage({ id: 'userChineseName' })}: {iAmSmartData.chName}{iAmSmartData.chName ? <img src={iAmSmartICon} alt="iAM Smart" width="25" /> : <></>} | |||||
</Typography> | </Typography> | ||||
</InputLabel> | </InputLabel> | ||||
</Stack> | </Stack> | ||||
@@ -492,7 +492,7 @@ const CustomFormWizard = (props) => { | |||||
<Typography variant="h5"> | <Typography variant="h5"> | ||||
<FormattedMessage id="formAddress" /> | <FormattedMessage id="formAddress" /> | ||||
<span style={{ color: '#f10000' }}>*</span> | <span style={{ color: '#f10000' }}>*</span> | ||||
{iAmSmartData.address1 ? <img src={iAmSmartICon} alt="iAM Smart" width="25" /> : null} | |||||
{iAmSmartData.address1 !="" && iAmSmartData.address1 ==formik.values.address1 ? <img src={iAmSmartICon} alt="iAM Smart" width="25" /> : null} | |||||
</Typography> | </Typography> | ||||
</InputLabel> | </InputLabel> | ||||
<OutlinedInput | <OutlinedInput | ||||
@@ -553,7 +553,7 @@ const CustomFormWizard = (props) => { | |||||
value={selectedAddress4} | value={selectedAddress4} | ||||
options={address4ComboList} | options={address4ComboList} | ||||
disabled={checkCountry} | disabled={checkCountry} | ||||
error={Boolean(districtErrStr!="")} | |||||
error={Boolean(districtErrStr != "")} | |||||
onBlur={formik.handleBlur} | onBlur={formik.handleBlur} | ||||
getOptionLabel={(option) => option.type ? intl.formatMessage({ id: option.type }) : ""} | getOptionLabel={(option) => option.type ? intl.formatMessage({ id: option.type }) : ""} | ||||
onChange={(event, newValue) => { | onChange={(event, newValue) => { | ||||
@@ -625,7 +625,7 @@ const CustomFormWizard = (props) => { | |||||
<Typography variant="h5"> | <Typography variant="h5"> | ||||
<FormattedMessage id="userContactEmail" /> | <FormattedMessage id="userContactEmail" /> | ||||
<span style={{ color: '#f10000' }}>*</span> | <span style={{ color: '#f10000' }}>*</span> | ||||
{iAmSmartData.email ? <img src={iAmSmartICon} alt="iAM Smart" width="25" /> : null} | |||||
{iAmSmartData.email && iAmSmartData.email ==formik.values.email ? <img src={iAmSmartICon} alt="iAM Smart" width="25" /> : null} | |||||
</Typography> | </Typography> | ||||
</InputLabel> | </InputLabel> | ||||
<OutlinedInput | <OutlinedInput | ||||
@@ -671,7 +671,7 @@ const CustomFormWizard = (props) => { | |||||
error={Boolean(formik.touched.emailConfirm && formik.errors.emailConfirm)} | error={Boolean(formik.touched.emailConfirm && formik.errors.emailConfirm)} | ||||
id="emailConfirm-login" | id="emailConfirm-login" | ||||
type="email" | type="email" | ||||
value={formik.values.emailConfirm.trim()} | |||||
value={formik.values.emailConfirm} | |||||
name="emailConfirm" | name="emailConfirm" | ||||
// onBlur={formik.handleBlur} | // onBlur={formik.handleBlur} | ||||
onChange={formik.handleChange} | onChange={formik.handleChange} | ||||
@@ -704,7 +704,7 @@ const CustomFormWizard = (props) => { | |||||
<Typography variant="h5"> | <Typography variant="h5"> | ||||
<FormattedMessage id="userContactNumber" /> | <FormattedMessage id="userContactNumber" /> | ||||
<span style={{ color: '#f10000' }}>*</span> | <span style={{ color: '#f10000' }}>*</span> | ||||
{iAmSmartData.phone ? <img src={iAmSmartICon} alt="iAM Smart" width="25" /> : null} | |||||
{iAmSmartData.phone && iAmSmartData.phone ==formik.values.phone && iAmSmartData.phoneCountryCode ==formik.values.phoneCountryCode ? <img src={iAmSmartICon} alt="iAM Smart" width="25" /> : null} | |||||
</Typography> | </Typography> | ||||
</InputLabel> | </InputLabel> | ||||
<Stack direction="row"> | <Stack direction="row"> | ||||
@@ -852,9 +852,9 @@ const CustomFormWizard = (props) => { | |||||
<Grid item xs={12} md={12}> | <Grid item xs={12} md={12}> | ||||
<Grid container> | <Grid container> | ||||
<Grid item xs={12} md={12}> | <Grid item xs={12} md={12}> | ||||
<Typography variant="h5" height="80%" sx={{ textAlign: "left", overflow: "scroll", borderRadius: "inherit", borderStyle: "solid", borderWidth: "1px", borderColor: "#0C489E" }}> | |||||
<div style={{padding: 12}} dangerouslySetInnerHTML={{__html: intl.formatMessage({id: "termsAndCon"})}} /> | |||||
<Typography variant="h5" sx={{ textAlign: "left", borderRadius: "inherit", borderStyle: "solid", borderWidth: "1px", borderColor: "#0C489E" }}> | |||||
<div style={{ padding: 12 }} dangerouslySetInnerHTML={{ __html: intl.formatMessage({ id: "termsAndCon" }) }} /> | |||||
</Typography> | </Typography> | ||||
</Grid> | </Grid> | ||||
</Grid> | </Grid> | ||||
@@ -968,7 +968,7 @@ const CustomFormWizard = (props) => { | |||||
</Grid> | </Grid> | ||||
<Grid item xs={12} md={12} > | <Grid item xs={12} md={12} > | ||||
<Stack direction="row"> | <Stack direction="row"> | ||||
<Typography variant="h5" color={theme.palette.grey[600]} sx={{mr:1}}> | |||||
<Typography variant="h5" color={theme.palette.grey[600]} sx={{ mr: 1 }}> | |||||
<FormattedMessage id="userIdDoc" /> | <FormattedMessage id="userIdDoc" /> | ||||
</Typography> | </Typography> | ||||
<Typography variant="h5" name="preview-idDocType-1"> | <Typography variant="h5" name="preview-idDocType-1"> | ||||
@@ -976,7 +976,7 @@ const CustomFormWizard = (props) => { | |||||
{/* {formik.values.idNo + "(" + formik.values.checkDigit + ")"} */} | {/* {formik.values.idNo + "(" + formik.values.checkDigit + ")"} */} | ||||
</Typography> | </Typography> | ||||
<Typography variant="h5" name="preview-idDocType-2"> | <Typography variant="h5" name="preview-idDocType-2"> | ||||
{showComId ?formik?.values?.idNo?.slice(4):"****"}{showComId ? '(' + formik.values.checkDigit + ')' : null} | |||||
{showComId ? formik?.values?.idNo?.slice(4) : "****"}{showComId ? '(' + formik.values.checkDigit + ')' : null} | |||||
{/* {formik.values.idNo + "(" + formik.values.checkDigit + ")"} */} | {/* {formik.values.idNo + "(" + formik.values.checkDigit + ")"} */} | ||||
</Typography> | </Typography> | ||||
<IconButton | <IconButton | ||||
@@ -987,10 +987,9 @@ const CustomFormWizard = (props) => { | |||||
size="medium" | size="medium" | ||||
> | > | ||||
{showComId ? <EyeOutlined /> : <EyeInvisibleOutlined />} | {showComId ? <EyeOutlined /> : <EyeInvisibleOutlined />} | ||||
</IconButton> | |||||
</IconButton> | |||||
</Stack> | </Stack> | ||||
</Grid> | </Grid> | ||||
<Grid item xs={12} md={6}> | <Grid item xs={12} md={6}> | ||||
<Stack spacing={1} direction="row"> | <Stack spacing={1} direction="row"> | ||||
<Typography variant="h5" color={theme.palette.grey[600]}> | <Typography variant="h5" color={theme.palette.grey[600]}> | ||||
@@ -999,6 +998,7 @@ const CustomFormWizard = (props) => { | |||||
<Typography variant="h5" id="preview-enName-signup"> | <Typography variant="h5" id="preview-enName-signup"> | ||||
{formik.values.enName} | {formik.values.enName} | ||||
</Typography> | </Typography> | ||||
{iAmSmartData.enName ? <img src={iAmSmartICon} alt="iAM Smart" width="25" /> : <></>} | |||||
</Stack> | </Stack> | ||||
</Grid> | </Grid> | ||||
<Grid item xs={12} md={6}> | <Grid item xs={12} md={6}> | ||||
@@ -73,6 +73,7 @@ | |||||
"MSG.proofOutOfTime": "Response out of time, please apply again.", | "MSG.proofOutOfTime": "Response out of time, please apply again.", | ||||
"MSG.overReviseDeadline": "Over Revise Deadline", | "MSG.overReviseDeadline": "Over Revise Deadline", | ||||
"MSG.plzSelectPaymentMethod": "Please select Payment Method", | |||||
"MSG.plzSelectApp": "Please select application", | "MSG.plzSelectApp": "Please select application", | ||||
"MSG.actionFail": "Action failed", | "MSG.actionFail": "Action failed", | ||||
"MSG.paymentHolded": "Application number {appNo} is currently in the process of payment. If the payment is unsuccessful, please try again after 20 minutes. We apologise for any inconvenience caused.", | "MSG.paymentHolded": "Application number {appNo} is currently in the process of payment. If the payment is unsuccessful, please try again after 20 minutes. We apologise for any inconvenience caused.", | ||||
@@ -109,7 +110,7 @@ | |||||
"proofPaymentHeader_demandNote": "Public Notice: Proofreading Completed and Payment Means Selected", | "proofPaymentHeader_demandNote": "Public Notice: Proofreading Completed and Payment Means Selected", | ||||
"proofPaymentBody_demandNote": "We have received the manuscript proofreading confirmation and printing instructions for application number: {appNo}<br/><br/>You have selected to make payment by General Demand Note.", | "proofPaymentBody_demandNote": "We have received the manuscript proofreading confirmation and printing instructions for application number: {appNo}<br/><br/>You have selected to make payment by General Demand Note.", | ||||
"proofPaymentBody_demandNote2": "The General Demand Note will be sent to the following email address within one working day, but not later than {beforeClosingDate} 9:00 p.m. : <br/>{email}", | |||||
"proofPaymentBody_demandNote2": "The General Demand Note will be sent to the following email address within one working day, but not later than {closingDateOff} 9:00 p.m. : <br/>{email}", | |||||
"proofPaymentBody_demandNote3": "Please make payment and return the payment proof (e.g. ATM receipt, internet banking record) to [email protected] by {paymentDeadline}.", | "proofPaymentBody_demandNote3": "Please make payment and return the payment proof (e.g. ATM receipt, internet banking record) to [email protected] by {paymentDeadline}.", | ||||
"proofPaymentBody_demandNote4": "We will process the publication after receiving payment confirmation.", | "proofPaymentBody_demandNote4": "We will process the publication after receiving payment confirmation.", | ||||
@@ -136,11 +137,11 @@ | |||||
"login": "Login", | "login": "Login", | ||||
"logout": "Logout", | "logout": "Logout", | ||||
"iAmSmartLogin": "iAM Smart Login", | |||||
"iAmSmartLogin": "Login with iAM Smart", | |||||
"continueWithIAmSmart": "Continue with iAM Smart", | "continueWithIAmSmart": "Continue with iAM Smart", | ||||
"authorizeIAmSmartForInfo": "Authorize iAmSmart to provide personal information", | "authorizeIAmSmartForInfo": "Authorize iAmSmart to provide personal information", | ||||
"iAmSmartSubTitle": "In order to complete the account opening and establish a connection with \"iAmStart\", please authorize \"iAmSmart\" to provide the following personal information:", | "iAmSmartSubTitle": "In order to complete the account opening and establish a connection with \"iAmStart\", please authorize \"iAmSmart\" to provide the following personal information:", | ||||
"iAmSmartAutoFillIn": "Use \"iAmSmart\" to automatically fill in", | |||||
"iAmSmartAutoFillIn": "Open iAM Smart", | |||||
"register": "Register", | "register": "Register", | ||||
"userLoginName": "Username", | "userLoginName": "Username", | ||||
"userPassword": "Password", | "userPassword": "Password", | ||||
@@ -515,6 +516,7 @@ | |||||
"content": "Content", | "content": "Content", | ||||
"subject": "Subject", | "subject": "Subject", | ||||
"other":"Other", | |||||
"Dashboard": "Dashboard", | "Dashboard": "Dashboard", | ||||
"event": "Event" | "event": "Event" |
@@ -99,6 +99,7 @@ | |||||
"MSG.proofOutOfTime": "回复逾时,请重新申请。", | "MSG.proofOutOfTime": "回复逾时,请重新申请。", | ||||
"MSG.overReviseDeadline": "超过修改期限", | "MSG.overReviseDeadline": "超过修改期限", | ||||
"MSG.plzSelectPaymentMethod": "请选择付款方式", | |||||
"MSG.plzSelectApp": "请选择公共启事。", | "MSG.plzSelectApp": "请选择公共启事。", | ||||
"MSG.actionFail": "行动失败", | "MSG.actionFail": "行动失败", | ||||
"MSG.paymentHolded": "申请编号 {appNo} 已正在付款的流程中,如相关付款没有成功,请于20分钟后再尝试付款,不便之处,请见谅!", | "MSG.paymentHolded": "申请编号 {appNo} 已正在付款的流程中,如相关付款没有成功,请于20分钟后再尝试付款,不便之处,请见谅!", | ||||
@@ -135,7 +136,7 @@ | |||||
"proofPaymentHeader_demandNote": "Public Notice: Proofreading Completed and Payment Means Selected", | "proofPaymentHeader_demandNote": "Public Notice: Proofreading Completed and Payment Means Selected", | ||||
"proofPaymentBody_demandNote": "We have received the manuscript proofreading confirmation and printing instructions for application number: {appNo}<br/><br/>You have selected to make payment by General Demand Note.", | "proofPaymentBody_demandNote": "We have received the manuscript proofreading confirmation and printing instructions for application number: {appNo}<br/><br/>You have selected to make payment by General Demand Note.", | ||||
"proofPaymentBody_demandNote2": "The General Demand Note will be sent to the following email address within one working day, but not later than {beforeClosingDate} 9:00 p.m. : <br/>{email}", | |||||
"proofPaymentBody_demandNote2": "The General Demand Note will be sent to the following email address within one working day, but not later than {closingDateOff} 9:00 p.m. : <br/>{email}", | |||||
"proofPaymentBody_demandNote3": "Please make payment and return the payment proof (e.g. ATM receipt, internet banking record) to [email protected] by {paymentDeadline}.", | "proofPaymentBody_demandNote3": "Please make payment and return the payment proof (e.g. ATM receipt, internet banking record) to [email protected] by {paymentDeadline}.", | ||||
"proofPaymentBody_demandNote4": "We will process the publication after receiving payment confirmation.", | "proofPaymentBody_demandNote4": "We will process the publication after receiving payment confirmation.", | ||||
@@ -164,7 +165,7 @@ | |||||
"continueWithIAmSmart": "以「智方便」继续", | "continueWithIAmSmart": "以「智方便」继续", | ||||
"authorizeIAmSmartForInfo": "授权「智方便」提供个人资料", | "authorizeIAmSmartForInfo": "授权「智方便」提供个人资料", | ||||
"iAmSmartSubTitle": "为完成开户并建立与「智方便」的连接,请授权「智方便」提供以下个人资料:", | "iAmSmartSubTitle": "为完成开户并建立与「智方便」的连接,请授权「智方便」提供以下个人资料:", | ||||
"iAmSmartAutoFillIn": "使用「智方便」自动填表", | |||||
"iAmSmartAutoFillIn": "开启智方便", | |||||
"register": "申请", | "register": "申请", | ||||
"userLoginName": "用户登入名称", | "userLoginName": "用户登入名称", | ||||
"userPassword": "密码", | "userPassword": "密码", | ||||
@@ -505,6 +506,7 @@ | |||||
"content": "内容", | "content": "内容", | ||||
"subject": "主题", | "subject": "主题", | ||||
"other":"其他", | |||||
"Dashboard": "仪表板", | "Dashboard": "仪表板", | ||||
"event": "活动" | "event": "活动" |
@@ -100,6 +100,7 @@ | |||||
"MSG.proofOutOfTime": "回覆逾時,請重新申請。", | "MSG.proofOutOfTime": "回覆逾時,請重新申請。", | ||||
"MSG.overReviseDeadline": "超過修改期限", | "MSG.overReviseDeadline": "超過修改期限", | ||||
"MSG.plzSelectApp": "請選擇公共啟事。", | "MSG.plzSelectApp": "請選擇公共啟事。", | ||||
"MSG.plzSelectPaymentMethod": "請選擇付款方式", | |||||
"MSG.actionFail": "行動失敗", | "MSG.actionFail": "行動失敗", | ||||
"MSG.paymentHolded": "申請編號 {appNo} 已正在付款的流程中,如相關付款沒有成功,請於20分鐘後再嘗試付款,不便之處,請見諒!", | "MSG.paymentHolded": "申請編號 {appNo} 已正在付款的流程中,如相關付款沒有成功,請於20分鐘後再嘗試付款,不便之處,請見諒!", | ||||
"MSG.pay_credity1": "我們已收到你已確定申請編號: {appNo} 的稿件校對確定及可付印的指示,並將安排刊登於憲報 期數 {year} 年 {issueVolume} 卷 第 {issueNo} 期內。", | "MSG.pay_credity1": "我們已收到你已確定申請編號: {appNo} 的稿件校對確定及可付印的指示,並將安排刊登於憲報 期數 {year} 年 {issueVolume} 卷 第 {issueNo} 期內。", | ||||
@@ -135,7 +136,7 @@ | |||||
"proofPaymentHeader_demandNote": "Public Notice: Proofreading Completed and Payment Means Selected", | "proofPaymentHeader_demandNote": "Public Notice: Proofreading Completed and Payment Means Selected", | ||||
"proofPaymentBody_demandNote": "We have received the manuscript proofreading confirmation and printing instructions for application number: {appNo}<br/><br/>You have selected to make payment by General Demand Note.", | "proofPaymentBody_demandNote": "We have received the manuscript proofreading confirmation and printing instructions for application number: {appNo}<br/><br/>You have selected to make payment by General Demand Note.", | ||||
"proofPaymentBody_demandNote2": "The General Demand Note will be sent to the following email address within one working day, but not later than {beforeClosingDate} 9:00 p.m. : <br/>{email}", | |||||
"proofPaymentBody_demandNote2": "The General Demand Note will be sent to the following email address within one working day, but not later than {closingDateOff} 9:00 p.m. : <br/>{email}", | |||||
"proofPaymentBody_demandNote3": "Please make payment and return the payment proof (e.g. ATM receipt, internet banking record) to [email protected] by {paymentDeadline}.", | "proofPaymentBody_demandNote3": "Please make payment and return the payment proof (e.g. ATM receipt, internet banking record) to [email protected] by {paymentDeadline}.", | ||||
"proofPaymentBody_demandNote4": "We will process the publication after receiving payment confirmation.", | "proofPaymentBody_demandNote4": "We will process the publication after receiving payment confirmation.", | ||||
@@ -166,7 +167,7 @@ | |||||
"continueWithIAmSmart": "以「智方便」繼續", | "continueWithIAmSmart": "以「智方便」繼續", | ||||
"authorizeIAmSmartForInfo": "授權「智方便」提供個人資料", | "authorizeIAmSmartForInfo": "授權「智方便」提供個人資料", | ||||
"iAmSmartSubTitle": "為完成開戶並建立與「智方便」的連接,請授權「智方便」提供以下個人資料:", | "iAmSmartSubTitle": "為完成開戶並建立與「智方便」的連接,請授權「智方便」提供以下個人資料:", | ||||
"iAmSmartAutoFillIn": "使用「智方便」自動填表", | |||||
"iAmSmartAutoFillIn": "開啟智方便", | |||||
"register": "申請", | "register": "申請", | ||||
"userLoginName": "用戶登入名稱", | "userLoginName": "用戶登入名稱", | ||||
"userPassword": "密碼", | "userPassword": "密碼", | ||||
@@ -510,6 +511,7 @@ | |||||
"content": "内容", | "content": "内容", | ||||
"subject": "主題", | "subject": "主題", | ||||
"other":"其他", | |||||
"Dashboard": "儀表板", | "Dashboard": "儀表板", | ||||
"event": "活動" | "event": "活動" |