jason.lam 1 год назад
Родитель
Сommit
416d78ffdf
19 измененных файлов: 205 добавлений и 79 удалений
  1. +6
    -4
      src/components/FileList.js
  2. +6
    -1
      src/layout/MainLayout/Header/index.js
  3. +1
    -1
      src/pages/Organization/DetailPage/OrganizationCard.js
  4. +1
    -1
      src/pages/Organization/DetailPage_FromUser/OrganizationCard_loadFromUser.js
  5. +2
    -2
      src/pages/Proof/Reply_GLD/UploadFileTable.js
  6. +1
    -1
      src/pages/Proof/Reply_Public/ProofForm.js
  7. +1
    -1
      src/pages/Proof/Reply_Public/UploadFileTable.js
  8. +3
    -1
      src/pages/PublicNotice/ApplyForm/PublicNoticeApplyForm.js
  9. +1
    -1
      src/pages/User/DetailsPage_Individual/UserInformationCard_Individual.js
  10. +1
    -1
      src/pages/User/DetailsPage_Organization/UserInformationCard_Organization.js
  11. +11
    -9
      src/pages/authentication/auth-forms/AuthLoginCustom.js
  12. +30
    -23
      src/pages/authentication/auth-forms/BusCustomFormWizard.js
  13. +22
    -18
      src/pages/authentication/auth-forms/CustomFormWizard.js
  14. +12
    -8
      src/pages/authentication/auth-forms/IAmSmartFormWizard.js
  15. +8
    -3
      src/pages/authentication/auth-forms/PreviewUploadFileTable.js
  16. +8
    -3
      src/pages/authentication/auth-forms/UploadFileTable.js
  17. +31
    -1
      src/translations/en.json
  18. +30
    -0
      src/translations/zh-CN.json
  19. +30
    -0
      src/translations/zh-HK.json

+ 6
- 4
src/components/FileList.js Просмотреть файл

@@ -10,6 +10,7 @@ import * as DateUtils from "../utils/DateUtils"
import { FiDataGrid } from './FiDataGrid';
import {useTheme} from "@emotion/react";
import {useMediaQuery} from "@mui/material";
import {useIntl} from "react-intl";
// ==============================|| EVENT TABLE ||============================== //

export default function FileList({ refType, refId, allowDelete, sx, dateHideable,lang, ...props }) {
@@ -17,6 +18,7 @@ export default function FileList({ refType, refId, allowDelete, sx, dateHideable
const [rowModesModel] = React.useState({});
const theme = useTheme();
const isMdOrLg = useMediaQuery(theme.breakpoints.up('md'));
const intl = useIntl();

React.useEffect(() => {
loadData();
@@ -95,14 +97,14 @@ export default function FileList({ refType, refId, allowDelete, sx, dateHideable
{
id: 'filename',
field: 'filename',
headerName: lang=="ch"?"檔案名稱":'File Name',
headerName: intl.formatMessage({id: 'fileName'}),
width: isMdOrLg ? 'auto' : 400,
flex: isMdOrLg ? 3 : undefined,
},
{
id: 'filesize',
field: 'filesize',
headerName: lang=="ch"?"檔案大小":'File Size',
headerName: intl.formatMessage({id: 'fileName'}),
width: isMdOrLg ? 'auto' : 160,
flex: isMdOrLg ? 1 : undefined,
valueGetter: (params) => {
@@ -143,14 +145,14 @@ export default function FileList({ refType, refId, allowDelete, sx, dateHideable
{
id: 'filename',
field: 'filename',
headerName: lang=="ch"?"檔案名稱":'File Name',
headerName: intl.formatMessage({id: 'fileName'}),
width: isMdOrLg ? 'auto' : 400,
flex: isMdOrLg ? 3 : undefined,
},
{
id: 'filesize',
field: 'filesize',
headerName: lang=="ch"?"檔案大小":'File Size',
headerName: intl.formatMessage({id: 'fileSize'}),
width: isMdOrLg ? 'auto' : 160,
flex: isMdOrLg ? 1 : undefined,
valueGetter: (params) => {


+ 6
- 1
src/layout/MainLayout/Header/index.js Просмотреть файл

@@ -327,7 +327,12 @@ function Header(props) {

<Grid item>
<Grid container direction="row" >
<LocaleSelector />
{
isGLDLoggedIn()?
<Grid item/>
:
<LocaleSelector />
}
<Profile />
</Grid>
</Grid>


+ 1
- 1
src/pages/Organization/DetailPage/OrganizationCard.js Просмотреть файл

@@ -49,7 +49,7 @@ const OrganizationCard = ({ userData, loadDataFun, id, setEditModeFun }) => {
validationSchema: yup.object().shape({
enCompanyName: yup.string().max(255).required(displayErrorMsg('請輸入英文名稱')),
chCompanyName: yup.string().max(255, displayErrorMsg('請輸入中文名稱')).nullable(),
addressLine1: yup.string().max(255).required(displayErrorMsg('請輸入第一行地址')),
addressLine1: yup.string().max(255).required(displayErrorMsg(intl.formatMessage({id: 'validateAddressLine1'}))),
addressLine2: yup.string().max(255, displayErrorMsg("length must <= 255")),
addressLine3: yup.string().max(255, displayErrorMsg("length must <= 255")),
fax_countryCode: yup.string().min(3, displayErrorMsg(intl.formatMessage({id: 'requireDialingCode'}))).nullable(),


+ 1
- 1
src/pages/Organization/DetailPage_FromUser/OrganizationCard_loadFromUser.js Просмотреть файл

@@ -47,7 +47,7 @@ const OrganizationCard_loadFromUser = ({ userData, userId }) => {
validationSchema: yup.object().shape({
enCompanyName: yup.string().max(255, displayErrorMsg("請輸入英文名稱")).required(displayErrorMsg('請輸入英文名稱')),
chCompanyName: yup.string().max(255, displayErrorMsg('請輸入中文名稱')).nullable(),
addressLine1: yup.string().max(255).required(displayErrorMsg('請輸入第一行地址')),
addressLine1: yup.string().max(255).required(displayErrorMsg(intl.formatMessage({id: 'validateAddressLine1'}))),
addressLine2: yup.string().max(255).nullable(),
addressLine3: yup.string().max(255).nullable(),
fax_countryCode: yup.string().min(3, displayErrorMsg(intl.formatMessage({id: 'requireDialingCode'}))).nullable(),


+ 2
- 2
src/pages/Proof/Reply_GLD/UploadFileTable.js Просмотреть файл

@@ -73,13 +73,13 @@ export default function UploadFileTable({recordList, setRecordList,}) {
{
id: 'name',
field: 'name',
headerName: '檔案名稱',
headerName: intl.formatMessage({id: 'fileName'}),
flex: 1,
},
{
id: 'size',
field: 'size',
headerName: '檔案大小',
headerName: intl.formatMessage({id: 'fileSize'}),
valueGetter: (params) => {
// console.log(params)
return Math.ceil(params.value/1024)+" KB";


+ 1
- 1
src/pages/Proof/Reply_Public/ProofForm.js Просмотреть файл

@@ -113,7 +113,7 @@ const FormPanel = ({ formData }) => {
return;
}
if (file.size >= (10 * 1024 * 1034)) {
setWarningText("上傳檔案大小應<10MB");
setWarningText(intl.formatMessage({id: 'fileSizeWarning'}));
setIsWarningPopUp(true);
return;
}


+ 1
- 1
src/pages/Proof/Reply_Public/UploadFileTable.js Просмотреть файл

@@ -83,7 +83,7 @@ export default function UploadFileTable({recordList, setRecordList,}) {
{
id: 'size',
field: 'size',
headerName: '檔案大小',
headerName: intl.formatMessage({id: 'fileSize'}),
valueGetter: (params) => {
// console.log(params)
return Math.ceil(params.value/1024)+" KB";


+ 3
- 1
src/pages/PublicNotice/ApplyForm/PublicNoticeApplyForm.js Просмотреть файл

@@ -23,6 +23,7 @@ import { useNavigate } from "react-router-dom";
import { notifyActionSuccess } from 'utils/CommonFunction';
import {PNSPS_LONG_BUTTON_THEME} from "../../../themes/buttonConst";
import {ThemeProvider} from "@emotion/react";
import {useIntl} from "react-intl";

// ==============================|| DASHBOARD - DEFAULT ||============================== //

@@ -30,6 +31,7 @@ const PublicNoticeApplyForm = ({ loadedData, selections }) => {
const [isWarningPopUp, setIsWarningPopUp] = React.useState(false);
const [warningText, setWarningText] = React.useState("");
const [attachment, setAttachment] = React.useState({});
const intl = useIntl();

const [issueId, setIssueId] = React.useState(loadedData.issueId);
const navigate = useNavigate();
@@ -74,7 +76,7 @@ const PublicNoticeApplyForm = ({ loadedData, selections }) => {
setIsWarningPopUp(true);
return;
} else if (attachment.size >= (10 * 1024 * 1034)) {
setWarningText("上傳檔案大小應<10MB");
setWarningText(intl.formatMessage({id: 'fileSizeWarning'}));
setIsWarningPopUp(true);
return;
}


+ 1
- 1
src/pages/User/DetailsPage_Individual/UserInformationCard_Individual.js Просмотреть файл

@@ -40,7 +40,7 @@ const UserInformationCard_Individual = ({ formData, loadDataFun }) => {
validationSchema: yup.object().shape({
enName: yup.string().max(255).required(intl.formatMessage({id: 'userRequireEnglishName'})),
chName: yup.string().max(255).required(intl.formatMessage({id: 'userRequireChineseName'})),
addressLine1: yup.string().max(255).required('請輸入第一行地址'),
addressLine1: yup.string().max(255).required(intl.formatMessage({id: 'validateAddressLine1'})),
addressLine2: yup.string().max(255).nullable(),
addressLine3: yup.string().max(255).nullable(),
emailAddress: yup.string().email(intl.formatMessage({id: 'validEmailFormat'})).max(255).required(intl.formatMessage({id: 'requireEmail'})),


+ 1
- 1
src/pages/User/DetailsPage_Organization/UserInformationCard_Organization.js Просмотреть файл

@@ -50,7 +50,7 @@ const UserInformationCard_Organization = ({ userData, loadDataFun, orgData }) =>
contactPerson: yup.string().max(255).required(displayErrorMsg(intl.formatMessage({id: 'userRequireName'}))),
enCompanyName: yup.string().max(255).required(displayErrorMsg('請輸入英文名稱')),
chCompanyName: yup.string().max(255).nullable(),
addressLine1: yup.string().max(255).required(displayErrorMsg('請輸入第一行地址')),
addressLine1: yup.string().max(255).required(displayErrorMsg(intl.formatMessage({id: 'validateAddressLine1'}))),
addressLine2: yup.string().max(255).nullable(),
addressLine3: yup.string().max(255).nullable(),
emailBus: yup.string().max(255).required(displayErrorMsg(intl.formatMessage({id: 'requireEmail'}))),


+ 11
- 9
src/pages/authentication/auth-forms/AuthLoginCustom.js Просмотреть файл

@@ -112,12 +112,12 @@ const AuthLoginCustom = () => {
}),
validationSchema: yup.object().shape({
// username: yup.string().min(6,'用戶名稱最少6位').required('請輸入用戶名稱'),
username: yup.string().required('請輸入用戶名稱'),
password: yup.string().min(8, '請輸入最少8位密碼').required('請輸入密碼')
.matches(/^(?=.*[a-z])/, '請包括最少1個小寫字母')
.matches(/^(?=.*[A-Z])/, '請包括最少1個大寫字母')
.matches(/^(?=.*[0-9])/, '請包括最少1個數字')
.matches(/^(?=.*[!@#%&])/, '請包括最少1個特殊字符'),
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'})),
}),
});

@@ -312,9 +312,11 @@ const AuthLoginCustom = () => {
</Grid>
<Grid item xs={12}>
<Stack direction="row" justifyContent="space-between" alignItems="center" spacing={2}>
<Button onClick={() => getQRWithIAmSmart()} color="iAmSmart" fullWidth size="large" variant="outlined" startIcon={<img src={iAmSmartICon} alt="iAM Smart" width="30" />}><Typography variant="h5">
<FormattedMessage id="iAmSmartLogin"/>
</Typography></Button>
<Button onClick={() => getQRWithIAmSmart()} color="iAmSmart" fullWidth size="large" variant="outlined" startIcon={<img src={iAmSmartICon} alt="iAM Smart" width="30" />}>
<Typography variant="h5">
<FormattedMessage id="iAmSmartLogin"/>
</Typography>
</Button>
</Stack>
</Grid>
<Grid item xs={12}>


+ 30
- 23
src/pages/authentication/auth-forms/BusCustomFormWizard.js Просмотреть файл

@@ -496,29 +496,29 @@ const BusCustomFormWizard = (props) => {
}),

validationSchema: yup.object().shape({
username: yup.string().min(6, displayErrorMsg('用戶名稱最少6位')).required(displayErrorMsg('請輸入用戶名稱'))
.matches(/^[aA-zZ0-9\s]+$/, { message: displayErrorMsg("用戶名稱不包含特殊字符") })
.matches(/^\S*$/, { message: displayErrorMsg('用戶名稱不包含空格') }),
password: yup.string().min(8, displayErrorMsg('請輸入最少8位密碼')).required(displayErrorMsg('請輸入密碼'))
.matches(/^\S*$/, { message: displayErrorMsg('密碼不包含空格') })
.matches(/^(?=.*[a-z])/, { message: displayErrorMsg('請包括最少1個小寫字母') })
.matches(/^(?=.*[A-Z])/, { message: displayErrorMsg('請包括最少1個大寫字母') })
.matches(/^(?=.*[0-9])/, { message: displayErrorMsg('請包括最少1個數字') })
.matches(/^(?=.*[!@#%&])/, { message: displayErrorMsg('請包括最少1個特殊字符') }),
confirmPassword: yup.string().min(8, displayErrorMsg('請最少輸入8位密碼')).required(displayErrorMsg(intl.formatMessage({id: 'pleaseConfirmPassword'}))).oneOf([yup.ref('password'), null], displayErrorMsg('請輸入相同密碼')),
username: yup.string().min(6, displayErrorMsg(intl.formatMessage({id: 'atLeast6CharAccount'}))).required(displayErrorMsg(intl.formatMessage({id: 'requireUsername'})))
.matches(/^[aA-zZ0-9\s]+$/, { message: displayErrorMsg(intl.formatMessage({id: 'noSpecialCharAccount'})) })
.matches(/^\S*$/, { message: displayErrorMsg(intl.formatMessage({id: 'noSpaceAccount'})) }),
password: yup.string().min(8, displayErrorMsg(intl.formatMessage({id: 'atLeast8CharPassword'}))).required(displayErrorMsg(intl.formatMessage({id: 'requirePassword'})))
.matches(/^\S*$/, { message: displayErrorMsg(intl.formatMessage({id: 'noSpacePassword'})) })
.matches(/^(?=.*[a-z])/, { message: displayErrorMsg(intl.formatMessage({id: 'atLeastOneSmallLetter'})) })
.matches(/^(?=.*[A-Z])/, { message: displayErrorMsg(intl.formatMessage({id: 'atLeastOneCapLetter'})) })
.matches(/^(?=.*[0-9])/, { message: displayErrorMsg(intl.formatMessage({id: 'atLeast1Number'})) })
.matches(/^(?=.*[!@#%&])/, { message: displayErrorMsg(intl.formatMessage({id: 'atLeast1SpecialChar'})) }),
confirmPassword: yup.string().min(8, displayErrorMsg(intl.formatMessage({id: 'atLeast8CharPassword'}))).required(displayErrorMsg(intl.formatMessage({id: 'pleaseConfirmPassword'}))).oneOf([yup.ref('password'), null], displayErrorMsg(intl.formatMessage({id: 'samePassword'}))),
enName: yup.string().max(255).required(displayErrorMsg(intl.formatMessage({id: 'userRequireEnglishName'}))),
enCompanyName: yup.string().matches(/^[^$^*()]+$/, { message: displayErrorMsg('No special characters $/^/*/(/)') }).when('chCompanyName', {
is: (chCompanyName) => !chCompanyName || chCompanyName.length === 0,
then: yup.string().required(displayErrorMsg('Please enter either English or Chinese name')),
}),
chCompanyName: yup.string().matches(/^[^$^*()]+$/, { message: displayErrorMsg('不包含特殊字符 $/^/*/(/)') }).when('enCompanyName', {
chCompanyName: yup.string().matches(/^[^$^*()]+$/, { message: displayErrorMsg(intl.formatMessage({id: 'notContainSpecialChar'})) }).when('enCompanyName', {
is: (enCompanyName) => !enCompanyName || enCompanyName.length === 0,
then: yup.string().required(displayErrorMsg('請輸入英文或中文名稱')),
then: yup.string().required(displayErrorMsg(intl.formatMessage({id: 'validateEngOrChiName'}))),
}),
chName: yup.string().max(255).required(displayErrorMsg(intl.formatMessage({id: 'userRequireChineseName'}))),
address1: yup.string().max(255).required(displayErrorMsg('請輸入第一行地址')),
address2: yup.string().max(255).required(displayErrorMsg('請輸入第二行地址')),
address3: yup.string().max(255).required(displayErrorMsg('請輸入第三行地址')),
address1: yup.string().max(255).required(displayErrorMsg(intl.formatMessage({id: 'validateAddressLine1'}))),
address2: yup.string().max(255).required(displayErrorMsg(intl.formatMessage({id: 'validateAddressLine2'}))),
address3: yup.string().max(255).required(displayErrorMsg(intl.formatMessage({id: 'validateAddressLine3'}))),
email: yup.string().email(displayErrorMsg(intl.formatMessage({id: 'validEmailFormat'}))).max(255).required(displayErrorMsg(intl.formatMessage({id: 'requireEmail'}))),
emailConfirm: yup.string().email(displayErrorMsg(intl.formatMessage({id: 'validEmailFormat'}))).max(255).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'}))),
@@ -1288,15 +1288,18 @@ const BusCustomFormWizard = (props) => {
<Grid container>
<Grid item xs={12} md={12}>
<Stack spacing={1} direction="column" justifyContent="space-between" alignItems="baseline" sx={{ mb: { xs: -0.5, sm: 0.5 } }}>
<Typography display="inline" variant="h4" sx={{ color: 'primary.primary' }}>商業登記證及其他文件
<Typography display="inline" variant="h4" sx={{ color: 'primary.primary' }}>
<FormattedMessage id="businessRegCertAndDoc"/>
<span style={{ color: '#f10000' }}>*</span>
</Typography>
<Typography display="inline" variant="h6" sx={{ color: 'primary.primary' }}>請上傳你的 有效商業登記證及其他文件 的數碼檔案,以驗證你的身份。</Typography>
<Typography display="inline" variant="h6" sx={{ color: 'primary.primary' }}>
<FormattedMessage id="pleaseUploadDoc"/>
</Typography>
{/* <Typography display="inline" variant="h6" sx={{ fontSize: 12,color: 'primary.primary'}}>如: 香港身份證; 護照; 中國內地身份證等</Typography> */}
<Stack mt={1} direction="row" justifyContent="flex-start" alignItems="center" spacing={2}>
<ThemeProvider theme={PNSPS_LONG_BUTTON_THEME}>
<Button variant="contained" component="label" sx={{ height: '40px' }}>
上傳商業登記證及其他文件
<FormattedMessage id="uploadFile"/>
<input
accept="image/png, .jpg, .bmp, .pdf"
//className={classes.input}
@@ -1325,7 +1328,7 @@ const BusCustomFormWizard = (props) => {
<Grid container>
<Grid item xs={12} md={12}>
<Typography display="inline" variant="h4" sx={{ color: 'primary.primary' }}>
條款和條件
<FormattedMessage id="termsAndCondition"/>
<span style={{ color: '#f10000' }}>*</span>
</Typography>
</Grid>
@@ -1349,11 +1352,13 @@ const BusCustomFormWizard = (props) => {
color="primary"
size="small"
/>
<Typography variant="pnspsFormHeader">我接受</Typography>
<Typography variant="pnspsFormHeader">
<FormattedMessage id="acceptTerms"/>
</Typography>
</Grid>
</Grid>
</Grid>
<Grid item xs={6} s={6} md={2} lg={2}>
<Grid item xs={6} s={6} md={3} lg={3}>
<Grid container>
<Grid item sx={{ display: 'flex', alignItems: 'center' }}>
<Checkbox
@@ -1363,7 +1368,9 @@ const BusCustomFormWizard = (props) => {
color="primary"
size="small"
/>
<Typography variant="pnspsFormHeader">我不接受</Typography>
<Typography variant="pnspsFormHeader">
<FormattedMessage id="rejectTerms"/>
</Typography>
</Grid>
</Grid>
</Grid>
@@ -1376,7 +1383,7 @@ const BusCustomFormWizard = (props) => {
<Grid container>
<Stack direction="column">
<Typography display="inline" variant="h4" sx={{ color: 'primary.primary' }}>
驗證
<FormattedMessage id="verify"/>
<span style={{ color: '#f10000' }}>*</span>
</Typography>
<Stack spacing={1} direction="row">


+ 22
- 18
src/pages/authentication/auth-forms/CustomFormWizard.js Просмотреть файл

@@ -554,21 +554,21 @@ const CustomFormWizard = (props) => {
captchaField: ''
}),
validationSchema: yup.object().shape({
username: yup.string().min(6, displayErrorMsg('用戶名稱最少6位')).required(displayErrorMsg("請輸入用戶名稱"))
.matches(/^[aA-zZ0-9\s]+$/, { message: displayErrorMsg("用戶名稱不包含特殊字符") })
.matches(/^\S*$/, { message: displayErrorMsg("用戶名稱不包含空格") }),
password: yup.string().min(8, displayErrorMsg('請輸入最少8位密碼')).required(displayErrorMsg('請輸入密碼'))
.matches(/^\S*$/, { message: displayErrorMsg('密碼不包含空格') })
.matches(/^(?=.*[a-z])/, { message: displayErrorMsg('請包括最少1個小寫字母') })
.matches(/^(?=.*[A-Z])/, { message: displayErrorMsg('請包括最少1個大寫字母') })
.matches(/^(?=.*[0-9])/, { message: displayErrorMsg('請包括最少1個數字') })
.matches(/^(?=.*[!@#%&])/, { message: displayErrorMsg('請包括最少1個特殊字符') }),
confirmPassword: yup.string().min(8, displayErrorMsg('請最少輸入8位密碼')).required(displayErrorMsg(intl.formatMessage({id: 'pleaseConfirmPassword'}))).oneOf([yup.ref('password'), null], displayErrorMsg('請輸入相同密碼')),
username: yup.string().min(6, displayErrorMsg(intl.formatMessage({id: 'atLeast6CharAccount'}))).required(displayErrorMsg(intl.formatMessage({id: 'requireUsername'})))
.matches(/^[aA-zZ0-9\s]+$/, { message: displayErrorMsg(intl.formatMessage({id: 'noSpecialCharAccount'})) })
.matches(/^\S*$/, { message: displayErrorMsg(intl.formatMessage({id: 'noSpaceAccount'})) }),
password: yup.string().min(8, displayErrorMsg(intl.formatMessage({id: 'atLeast8CharPassword'}))).required(displayErrorMsg(intl.formatMessage({id: 'requirePassword'})))
.matches(/^\S*$/, { message: displayErrorMsg(intl.formatMessage({id: 'noSpacePassword'})) })
.matches(/^(?=.*[a-z])/, { message: displayErrorMsg(intl.formatMessage({id: 'atLeastOneSmallLetter'})) })
.matches(/^(?=.*[A-Z])/, { message: displayErrorMsg(intl.formatMessage({id: 'atLeastOneCapLetter'})) })
.matches(/^(?=.*[0-9])/, { message: displayErrorMsg(intl.formatMessage({id: 'atLeast1Number'})) })
.matches(/^(?=.*[!@#%&])/, { message: displayErrorMsg(intl.formatMessage({id: 'atLeast1SpecialChar'})) }),
confirmPassword: yup.string().min(8, displayErrorMsg(intl.formatMessage({id: 'atLeast8CharPassword'}))).required(displayErrorMsg(intl.formatMessage({id: 'pleaseConfirmPassword'}))).oneOf([yup.ref('password'), null], displayErrorMsg(intl.formatMessage({id: 'samePassword'}))),
enName: yup.string().max(255).required(displayErrorMsg(intl.formatMessage({id: 'userRequireEnglishName'}))),
chName: yup.string().max(6).required(displayErrorMsg(intl.formatMessage({id: 'userRequireChineseName'}))),
address1: yup.string().max(255).required(displayErrorMsg('請輸入第一行地址')),
address2: yup.string().max(255).required(displayErrorMsg('請輸入第二行地址')),
address3: yup.string().max(255).required(displayErrorMsg('請輸入第三行地址')),
address1: yup.string().max(255).required(displayErrorMsg(intl.formatMessage({id: 'validateAddressLine1'}))),
address2: yup.string().max(255).required(displayErrorMsg(intl.formatMessage({id: 'validateAddressLine2'}))),
address3: yup.string().max(255).required(displayErrorMsg(intl.formatMessage({id: 'validateAddressLine3'}))),
email: yup.string().email(displayErrorMsg(intl.formatMessage({id: 'validEmailFormat'}))).max(255).required(displayErrorMsg(intl.formatMessage({id: 'requireEmail'}))),
emailConfirm: yup.string().email(displayErrorMsg(intl.formatMessage({id: 'validEmailFormat'}))).max(255).required(displayErrorMsg(intl.formatMessage({id: 'requireEmail'}))).oneOf([yup.ref('email'), null], displayErrorMsg(intl.formatMessage({id: 'validSameEmail'}))),
idNo: yup.string().required(displayErrorMsg(`請輸入${selectedIdDocInputType}號碼`))
@@ -1496,7 +1496,7 @@ const CustomFormWizard = (props) => {
<Grid container>
<Grid item xs={12} md={12}>
<Typography display="inline" variant="h4" sx={{ color: 'primary.primary' }}>
條款和條件
<FormattedMessage id="termsAndCondition"/>
<span style={{ color: '#f10000' }}>*</span>
</Typography>
</Grid>
@@ -1520,11 +1520,13 @@ const CustomFormWizard = (props) => {
color="primary"
size="small"
/>
<Typography variant="pnspsFormHeader">我接受</Typography>
<Typography variant="pnspsFormHeader">
<FormattedMessage id="acceptTerms"/>
</Typography>
</Grid>
</Grid>
</Grid>
<Grid item xs={6} s={6} md={2} lg={2}>
<Grid item xs={6} s={6} md={3} lg={3}>
<Grid container>
<Grid item sx={{ display: 'flex', alignItems: 'center' }}>
<Checkbox
@@ -1534,7 +1536,9 @@ const CustomFormWizard = (props) => {
color="primary"
size="small"
/>
<Typography variant="pnspsFormHeader">我不接受</Typography>
<Typography variant="pnspsFormHeader">
<FormattedMessage id="rejectTerms"/>
</Typography>
</Grid>
</Grid>
</Grid>
@@ -1547,7 +1551,7 @@ const CustomFormWizard = (props) => {
<Grid container>
<Stack direction="column">
<Typography display="inline" variant="h4" sx={{ color: 'primary.primary' }}>
驗證
<FormattedMessage id="verify"/>
<span style={{ color: '#f10000' }}>*</span>
</Typography>
<Stack spacing={1} direction="row">


+ 12
- 8
src/pages/authentication/auth-forms/IAmSmartFormWizard.js Просмотреть файл

@@ -363,9 +363,9 @@ const CustomFormWizard = (props) => {
captchaField: ''
}),
validationSchema: yup.object().shape({
address1: yup.string().max(255).required(displayErrorMsg('請輸入第一行地址')),
address2: yup.string().max(255).required(displayErrorMsg('請輸入第二行地址')),
address3: yup.string().max(255).required(displayErrorMsg('請輸入第三行地址')),
address1: yup.string().max(255).required(displayErrorMsg(intl.formatMessage({id: 'validateAddressLine1'}))),
address2: yup.string().max(255).required(displayErrorMsg(intl.formatMessage({id: 'validateAddressLine2'}))),
address3: yup.string().max(255).required(displayErrorMsg(intl.formatMessage({id: 'validateAddressLine3'}))),
email: yup.string().email(displayErrorMsg(intl.formatMessage({id: 'validEmailFormat'}))).max(255).required(displayErrorMsg(intl.formatMessage({id: 'requireEmail'}))),
emailConfirm: yup.string().email(displayErrorMsg(intl.formatMessage({id: 'validEmailFormat'}))).max(255).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'}))),
@@ -789,7 +789,7 @@ const CustomFormWizard = (props) => {
<Grid container>
<Grid item xs={12} md={12}>
<Typography display="inline" variant="h4" sx={{ color: 'primary.primary' }}>
條款和條件
<FormattedMessage id="termsAndCondition"/>
<span style={{ color: '#f10000' }}>*</span>
</Typography>
</Grid>
@@ -813,11 +813,13 @@ const CustomFormWizard = (props) => {
color="primary"
size="small"
/>
<Typography variant="h5">我接受</Typography>
<Typography variant="h5">
<FormattedMessage id="acceptTerms"/>
</Typography>
</Grid>
</Grid>
</Grid>
<Grid item xs={6} s={6} md={2} lg={2}>
<Grid item xs={6} s={6} md={3} lg={3}>
<Grid container>
<Grid item sx={{ display: 'flex', alignItems: 'center' }}>
<Checkbox
@@ -827,7 +829,9 @@ const CustomFormWizard = (props) => {
color="primary"
size="small"
/>
<Typography variant="h5">我不接受</Typography>
<Typography variant="h5">
<FormattedMessage id="rejectTerms"/>
</Typography>
</Grid>
</Grid>
</Grid>
@@ -840,7 +844,7 @@ const CustomFormWizard = (props) => {
<Grid container>
<Stack direction="column">
<Typography display="inline" variant="h4" sx={{ color: 'primary.primary' }}>
驗證
<FormattedMessage id="verify"/>
<span style={{ color: '#f10000' }}>*</span>
</Typography>
<Stack spacing={1} direction="row">


+ 8
- 3
src/pages/authentication/auth-forms/PreviewUploadFileTable.js Просмотреть файл

@@ -14,6 +14,7 @@ import {
Stack,
Typography
} from '@mui/material';
import {FormattedMessage} from "react-intl";
// ==============================|| EVENT TABLE ||============================== //

export default function PreviewUploadFileTable({ recordList, }) {
@@ -32,7 +33,7 @@ export default function PreviewUploadFileTable({ recordList, }) {
return (
<Stack height="100%" alignItems="center" justifyContent="center">
<Typography variant="h6">
沒有上傳檔案
<FormattedMessage id="noFile"/>
</Typography>
{/* <pre>(rows=&#123;[]&#125;)</pre> */}
</Stack>
@@ -74,13 +75,17 @@ export default function PreviewUploadFileTable({ recordList, }) {
{
id: 'name',
field: 'name',
headerName: <Typography variant="h6">檔案名稱</Typography>,
headerName: <Typography variant="h6">
<FormattedMessage id="fileName"/>
</Typography>,
flex: 1,
},
{
id: 'size',
field: 'size',
headerName: <Typography variant="h6">檔案大小</Typography>,
headerName: <Typography variant="h6">
<FormattedMessage id="fileSize"/>
</Typography>,
valueGetter: (params) => {
// console.log(params)
return Math.ceil(params.value / 1024) + " KB";


+ 8
- 3
src/pages/authentication/auth-forms/UploadFileTable.js Просмотреть файл

@@ -14,6 +14,7 @@ import {
Stack,
Typography
} from '@mui/material';
import {FormattedMessage} from "react-intl";
// ==============================|| EVENT TABLE ||============================== //

export default function UploadFileTable({ recordList, setUpdateRows, }) {
@@ -33,7 +34,7 @@ export default function UploadFileTable({ recordList, setUpdateRows, }) {
return (
<Stack height="100%" alignItems="center" justifyContent="center">
<Typography variant="h6">
沒有上傳檔案
<FormattedMessage id="noFile"/>
</Typography>
{/* <pre>(rows=&#123;[]&#125;)</pre> */}
</Stack>
@@ -76,13 +77,17 @@ export default function UploadFileTable({ recordList, setUpdateRows, }) {
{
id: 'name',
field: 'name',
headerName: <Typography variant="h6">檔案名稱</Typography>,
headerName: <Typography variant="h6">
<FormattedMessage id="fileName"/>
</Typography>,
flex: 4,
},
{
id: 'size',
field: 'size',
headerName: <Typography variant="h6">檔案大小</Typography>,
headerName: <Typography variant="h6">
<FormattedMessage id="fileSize"/>
</Typography>,
valueGetter: (params) => {
// console.log(params)
return Math.ceil(params.value / 1024) + " KB";


+ 31
- 1
src/translations/en.json Просмотреть файл

@@ -21,7 +21,7 @@
"companyOrUserRecord": "Company/Institutional User Records",

"login": "Login",
"iAmSmartLogin": "iAmSmart Login",
"iAmSmartLogin": "iAmSmart login",
"continueWithIAmSmart": "Continue with iAmSmart",
"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:",
@@ -85,6 +85,19 @@
"pleaseEnterOrgOrCompName": "Please enter the English/Chinese name of the organisation/company",
"sameAsBusinessRegistrationCert": "Same as Business Registration Certificate",
"businessRegCertNumber": "Business Reg Cert Number",
"businessRegCertAndDoc":"Business Registration Certificate and other documents",
"pleaseUploadDoc": "Please upload a digital file of your valid business registration certificate and other documents to verify your identity.",
"uploadFile": "Upload business registration certificate and other documents",
"fileName": "File name",
"fileSize": "File size",
"fileSizeWarning": "Upload file size should be <10MB",
"noFile": "No file uploaded",
"termsAndCondition": "Terms and Conditions",
"acceptTerms": "I accept",
"rejectTerms": "I do not accept",
"verify": "Verify",
"validVerify": "Please enter valid verification",
"autoLogout": "Login verification has expired, please login again.",
"pleaseFillInBusinessRegCertNumber": "Please fill in Business Registration Certificate Number",
"pleaseFillInValidBusinessRegCertNumber": "Please fill in valid Business Registration Certificate Number",
"businessRegCertValidityDate": "Business Reg Cert validity date",
@@ -93,6 +106,23 @@
"addressLine1": "First line",
"addressLine2": "Second line",
"addressLine3": "Third line",
"validateAddressLine1": "Please enter the first line of address",
"validateAddressLine2": "Please enter the second line of address",
"validateAddressLine3": "Please enter the third line of address",
"validateEngOrChiName": "Please enter the English or Chinese name",
"notContainSpecialChar": "Does not contain special characters $/^/*/(/)",
"samePassword": "Please enter the same password",
"atLeast8CharPassword": "Please enter a password of at least 8 digits",
"atLeast1SpecialChar": "Please include at least 1 special character",
"atLeast1Number": "Please include at least 1 number",
"atLeastOneCapLetter": "Please include at least 1 capital letter",
"atLeastOneSmallLetter": "Please include at least 1 lowercase letter",
"noSpacePassword": "Password does not contain spaces",
"noSpaceAccount": "User name does not contain spaces",
"noSpecialCharAccount": "User name does not contain special characters",
"atLeast6CharAccount": "User name must be at least 6 characters",
"requireUsername": "Please enter user name",
"requirePassword": "Please enter password",
"region": "Region (only applicable to Hong Kong)",
"regionOrCountry": "Country/Region",
"hongKong": "Hong Kong",


+ 30
- 0
src/translations/zh-CN.json Просмотреть файл

@@ -85,6 +85,19 @@
"pleaseEnterOrgOrCompName": "请输入机构/公司英文名称或中文名称",
"sameAsBusinessRegistrationCert": "与商业登记证相同",
"businessRegCertNumber": "商业登记证号码",
"businessRegCertAndDoc":"商业登记证及其他文件",
"pleaseUploadDoc": "请上传你的 有效商业登记证及其他文件 的数码档案,以验证你的身份。",
"uploadFile": "上传商业登记证及其他文件",
"fileName": "档案名称",
"fileSize": "档案大小",
"fileSizeWarning": "上传档案大小应<10MB",
"noFile": "没有上传档案",
"termsAndCondition": "条款和条件",
"acceptTerms": "我接受",
"rejectTerms": "我不接受",
"verify": "验证",
"validVerify": "请输入有效验证",
"autoLogout": "登入验证已过期,请重新登入。",
"pleaseFillInBusinessRegCertNumber": "请输入商业登记证号码",
"pleaseFillInValidBusinessRegCertNumber": "请输入有效商业登记证号码",
"businessRegCertValidityDate": "商业登记证有效日期",
@@ -93,6 +106,23 @@
"addressLine1": "第一行",
"addressLine2": "第二行",
"addressLine3": "第三行",
"validateAddressLine1": "请输入第一行地址",
"validateAddressLine2": "请输入第二行地址",
"validateAddressLine3": "请输入第三行地址",
"validateEngOrChiName": "请输入英文或中文名称",
"notContainSpecialChar": "不包含特殊字符 $/^/*/(/)",
"samePassword": "请输入相同密码",
"atLeast8CharPassword": "请输入最少8位密码",
"atLeast1SpecialChar": "请包括最少1个特殊字符",
"atLeast1Number": "请包括最少1个数字",
"atLeastOneCapLetter": "请包括最少1个大写字母",
"atLeastOneSmallLetter": "请包括最少1个小写字母",
"noSpacePassword": "密码不包含空格",
"noSpaceAccount": "用户名称不包含空格",
"noSpecialCharAccount": "用户名称不包含特殊字符",
"atLeast6CharAccount": "用户名称最少6位",
"requireUsername": "请输入用户名称",
"requirePassword": "请输入密码",
"region": "区域 (只适用于香港)",
"region Or Country": "国家/地区",
"hong Kong": "香港",


+ 30
- 0
src/translations/zh-HK.json Просмотреть файл

@@ -85,6 +85,19 @@
"pleaseEnterOrgOrCompName": "請輸入機構/公司英文名稱或中文名稱",
"sameAsBusinessRegistrationCert": "與商業登記證相同",
"businessRegCertNumber": "商業登記證號碼",
"businessRegCertAndDoc":"商業登記證及其他文件",
"pleaseUploadDoc": "請上傳你的 有效商業登記證及其他文件 的數碼檔案,以驗證你的身份。",
"uploadFile": "上傳商業登記證及其他文件",
"fileName": "檔案名稱",
"fileSize": "檔案大小",
"fileSizeWarning": "上傳檔案大小應<10MB",
"noFile": "沒有上傳檔案",
"termsAndCondition": "條款和條件",
"acceptTerms": "我接受",
"rejectTerms": "我不接受",
"verify": "驗證",
"validVerify": "請輸入有效驗證",
"autoLogout": "登入驗證已過期,請重新登入。",
"pleaseFillInBusinessRegCertNumber": "請輸入商業登記證號碼",
"pleaseFillInValidBusinessRegCertNumber": "請輸入有效商業登記證號碼",
"businessRegCertValidityDate": "商業登記證有效日期",
@@ -93,6 +106,23 @@
"addressLine1": "第一行",
"addressLine2": "第二行",
"addressLine3": "第三行",
"validateAddressLine1": "請輸入第一行地址",
"validateAddressLine2": "請輸入第二行地址",
"validateAddressLine3": "請輸入第三行地址",
"validateEngOrChiName": "請輸入英文或中文名稱",
"notContainSpecialChar": "不包含特殊字符 $/^/*/(/)",
"samePassword": "請輸入相同密碼",
"atLeast8CharPassword": "請輸入最少8位密碼",
"atLeast1SpecialChar": "請包括最少1個特殊字符",
"atLeast1Number": "請包括最少1個數字",
"atLeastOneCapLetter": "請包括最少1個大寫字母",
"atLeastOneSmallLetter": "請包括最少1個小寫字母",
"noSpacePassword": "密碼不包含空格",
"noSpaceAccount": "用戶名稱不包含空格",
"noSpecialCharAccount": "用戶名稱不包含特殊字符",
"atLeast6CharAccount": "用戶名稱最少6位",
"requireUsername": "請輸入用戶名稱",
"requirePassword": "請輸入密碼",
"region": "區域 (只適用於香港)",
"regionOrCountry": "國家/地區",
"hongKong": "香港",


Загрузка…
Отмена
Сохранить