| @@ -4,6 +4,7 @@ import { | |||
| Button | |||
| } from '@mui/material'; | |||
| import * as DateUtils from "utils/DateUtils"; | |||
| import * as FormatUtils from "utils/FormatUtils"; | |||
| import * as PublicNoteStatusUtils from "utils/statusUtils/PublicNoteStatusUtils" | |||
| import { FiDataGrid } from "components/FiDataGrid"; | |||
| // ==============================|| EVENT TABLE ||============================== // | |||
| @@ -100,6 +101,15 @@ export default function SearchPublicNoticeTable({ recordList }) { | |||
| return (params?.value) ? (params?.value) : ""; | |||
| } | |||
| }, | |||
| { | |||
| id: 'fee', | |||
| field: 'fee', | |||
| headerName: 'Amount($)', | |||
| flex: 1, | |||
| valueGetter: (params) => { | |||
| return FormatUtils.currencyFormat(params?.value); | |||
| } | |||
| }, | |||
| ]; | |||
| return ( | |||
| @@ -110,7 +120,7 @@ export default function SearchPublicNoticeTable({ recordList }) { | |||
| rowHeight={80} | |||
| rows={rows} | |||
| columns={columns} | |||
| customPageSize={5} | |||
| customPageSize={10} | |||
| onRowDoubleClick={handleEditClick} | |||
| /> | |||
| </div> | |||
| @@ -43,7 +43,7 @@ export default function SearchDemandNote({ recordList, reloadFun, applySearch }) | |||
| const findReadyToSend=()=>{ | |||
| const temp = { | |||
| status: 'pending', | |||
| readySend: true | |||
| }; | |||
| applySearch(temp); | |||
| } | |||
| @@ -165,13 +165,14 @@ export default function SearchDemandNote({ recordList, reloadFun, applySearch }) | |||
| { | |||
| field: 'appNo', | |||
| headerName: 'App No.', | |||
| width: 120, | |||
| width: 150, | |||
| }, | |||
| { | |||
| id: 'contactPerson', | |||
| field: 'contactPerson', | |||
| headerName: 'Client', | |||
| width: 300, | |||
| minWidth: 300, | |||
| flex:1, | |||
| renderCell: (params) => { | |||
| let company = params.row.enCompanyName != null?params.row.enCompanyName: params.row.chCompanyName; | |||
| company = company != null ? company : ""; | |||
| @@ -200,7 +201,7 @@ export default function SearchDemandNote({ recordList, reloadFun, applySearch }) | |||
| { | |||
| field: 'cm', | |||
| headerName: 'Length', | |||
| width: 100, | |||
| width: 120, | |||
| renderCell: (params) => { | |||
| return (<> | |||
| {params?.value + "cm"}<br /> | |||
| @@ -211,7 +212,7 @@ export default function SearchDemandNote({ recordList, reloadFun, applySearch }) | |||
| { | |||
| field: 'amount', | |||
| headerName: 'Amount($)', | |||
| width: 100, | |||
| width: 120, | |||
| align: 'right', | |||
| valueGetter: (params) => { | |||
| return FormatUtils.currencyFormat(params?.value); | |||
| @@ -220,7 +221,7 @@ export default function SearchDemandNote({ recordList, reloadFun, applySearch }) | |||
| { | |||
| field: 'dnNo', | |||
| headerName: 'DN No.', | |||
| width: 220, | |||
| width: 250, | |||
| renderCell: (params) => { | |||
| return <Button sx={{fontSize: '8px'}} onClick={handleDnClick(params)}><u>{params.row.dnNo}</u></Button>; | |||
| }, | |||
| @@ -229,11 +230,11 @@ export default function SearchDemandNote({ recordList, reloadFun, applySearch }) | |||
| id: 'issueDate', | |||
| field: 'issueDate', | |||
| headerName: 'Due Date / Sent Date', | |||
| width: 250, | |||
| width: 300, | |||
| renderCell: (params) => { | |||
| return (<> | |||
| {DateUtils.dateStr(params?.value)} | |||
| {params.row.sentDate ? "<br />" + DateUtils.datetimeStr(params.row.sentDate) + " - " + params.row.sentBy : " / To be sent"} | |||
| {params.row.sentDate ? <><br /> {DateUtils.datetimeStr(params.row.sentDate)} - {params.row.sentBy} </>: <> / To be sent</>} | |||
| </>); | |||
| } | |||
| }, | |||
| @@ -243,7 +244,7 @@ export default function SearchDemandNote({ recordList, reloadFun, applySearch }) | |||
| renderHeader: () => ( | |||
| <><DownloadIcon />DN File</> | |||
| ), | |||
| width: 250, | |||
| width: 280, | |||
| renderCell: (params) => { | |||
| return <Button onClick={onDownloadClick(params)}><u>{params.row.filename}</u></Button>; | |||
| }, | |||
| @@ -156,7 +156,7 @@ const SearchDemandNoteForm = ({ applySearch, orgComboData, searchCriteria, issue | |||
| }} | |||
| renderInput={(params) => ( | |||
| <TextField {...params} | |||
| label="Organisation" | |||
| label="BR No./Organisation" | |||
| InputLabelProps={{ | |||
| shrink: true | |||
| }} | |||
| @@ -2,7 +2,7 @@ | |||
| import { | |||
| Grid, Button, Checkbox, FormControlLabel, Typography, | |||
| Dialog, DialogTitle, DialogContent, DialogActions, | |||
| FormHelperText | |||
| FormHelperText, TextField, | |||
| } from '@mui/material'; | |||
| // import { FormControlLabel } from '@material-ui/core'; | |||
| import MainCard from "components/MainCard"; | |||
| @@ -10,6 +10,7 @@ import * as React from "react"; | |||
| import { useFormik } from 'formik'; | |||
| import * as yup from 'yup'; | |||
| import { useEffect, useState } from "react"; | |||
| import * as DateUtils from 'utils/DateUtils'; | |||
| import * as HttpUtils from 'utils/HttpUtils'; | |||
| import * as UrlUtils from "utils/ApiPathConst"; | |||
| import * as FieldUtils from "utils/FieldUtils"; | |||
| @@ -19,8 +20,8 @@ import Loadable from 'components/Loadable'; | |||
| import { lazy } from 'react'; | |||
| import { notifySaveSuccess } from 'utils/CommonFunction'; | |||
| import { useIntl } from "react-intl"; | |||
| import {PNSPS_BUTTON_THEME} from "themes/buttonConst"; | |||
| import {ThemeProvider} from "@emotion/react"; | |||
| import { PNSPS_BUTTON_THEME } from "themes/buttonConst"; | |||
| import { ThemeProvider } from "@emotion/react"; | |||
| // ==============================|| DASHBOARD - DEFAULT ||============================== // | |||
| @@ -48,12 +49,12 @@ const OrganizationCard = ({ userData, loadDataFun, id, setEditModeFun }) => { | |||
| return <Typography variant="errorMessage1">{errorMsg}</Typography> | |||
| } | |||
| 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 }) + ": " : "" })); | |||
| } | |||
| 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 }) : "" })); | |||
| } | |||
| const formik = useFormik({ | |||
| @@ -83,11 +84,11 @@ const OrganizationCard = ({ userData, loadDataFun, id, setEditModeFun }) => { | |||
| }), | |||
| }), | |||
| onSubmit: values => { | |||
| if (values.country==null){ | |||
| setErrorMsg(intl.formatMessage({id: 'pleaseFillInCountry'})) | |||
| if (values.country == null) { | |||
| setErrorMsg(intl.formatMessage({ id: 'pleaseFillInCountry' })) | |||
| } else { | |||
| if (values.country.key ==1 && values.district == null){ | |||
| setErrorMsg(intl.formatMessage({id: 'pleaseFillInDistrict'})) | |||
| if (values.country.key == 1 && values.district == null) { | |||
| setErrorMsg(intl.formatMessage({ id: 'pleaseFillInDistrict' })) | |||
| } else { | |||
| HttpUtils.post({ | |||
| url: UrlUtils.POST_ORG_SAVE_PATH, | |||
| @@ -124,7 +125,7 @@ const OrganizationCard = ({ userData, loadDataFun, id, setEditModeFun }) => { | |||
| setEditMode(false); | |||
| } | |||
| }); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| }); | |||
| @@ -204,24 +205,24 @@ const OrganizationCard = ({ userData, loadDataFun, id, setEditModeFun }) => { | |||
| </> : | |||
| <> | |||
| <ThemeProvider theme={PNSPS_BUTTON_THEME}> | |||
| <Grid item sx={{ ml: 0, mr: 3 }}> | |||
| <Button | |||
| variant="contained" | |||
| onClick={loadDataFun} | |||
| color="cancel" | |||
| > | |||
| <Grid item sx={{ ml: 0, mr: 3 }}> | |||
| <Button | |||
| variant="contained" | |||
| onClick={loadDataFun} | |||
| color="cancel" | |||
| > | |||
| Reset & Back | |||
| </Button> | |||
| </Grid> | |||
| <Grid item sx={{ ml: 3, mr: 3 }}> | |||
| <Button | |||
| variant="contained" | |||
| type="submit" | |||
| color="success" | |||
| > | |||
| Save | |||
| </Button> | |||
| </Grid> | |||
| </Button> | |||
| </Grid> | |||
| <Grid item sx={{ ml: 3, mr: 3 }}> | |||
| <Button | |||
| variant="contained" | |||
| type="submit" | |||
| color="success" | |||
| > | |||
| Save | |||
| </Button> | |||
| </Grid> | |||
| </ThemeProvider> | |||
| </> | |||
| } | |||
| @@ -244,13 +245,13 @@ const OrganizationCard = ({ userData, loadDataFun, id, setEditModeFun }) => { | |||
| currentUserData.creditor ? | |||
| <Grid item sx={{ ml: 3, mr: 3 }}> | |||
| <ThemeProvider theme={PNSPS_BUTTON_THEME}> | |||
| <Button | |||
| variant="contained" | |||
| color="error" | |||
| onClick={() => setNonCreditorConfirmPopUp(true)} | |||
| > | |||
| Mark as Non-Creditor | |||
| </Button> | |||
| <Button | |||
| variant="contained" | |||
| color="error" | |||
| onClick={() => setNonCreditorConfirmPopUp(true)} | |||
| > | |||
| Mark as Non-Credit Client | |||
| </Button> | |||
| </ThemeProvider> | |||
| </Grid> | |||
| : | |||
| @@ -261,7 +262,7 @@ const OrganizationCard = ({ userData, loadDataFun, id, setEditModeFun }) => { | |||
| color="orange" | |||
| onClick={() => setCreditorConfirmPopUp(true)} | |||
| > | |||
| Mark as Creditor | |||
| Mark as Credit Client | |||
| </Button> | |||
| </ThemeProvider> | |||
| </Grid> | |||
| @@ -300,7 +301,7 @@ const OrganizationCard = ({ userData, loadDataFun, id, setEditModeFun }) => { | |||
| <Grid item lg={4} > | |||
| <FormControlLabel | |||
| control={<Checkbox checked={formik.values.creditor} />} | |||
| label="is Creditor" | |||
| label="is Credit Client" | |||
| name="creditor" | |||
| onChange={() => { | |||
| formik.setFieldValue("creditor", !formik.values.creditor); | |||
| @@ -331,12 +332,29 @@ const OrganizationCard = ({ userData, loadDataFun, id, setEditModeFun }) => { | |||
| </Grid> | |||
| <Grid item lg={4} > | |||
| {FieldUtils.getDateField({ | |||
| label: FieldUtils.notNullFieldLabel("Expiry Date:"), | |||
| valueName: "brExpiryDate", | |||
| disabled: (!editMode && !createMode), | |||
| form: formik | |||
| })} | |||
| <Grid container alignItems={"center"}> | |||
| <Grid item xs={12} md={3} lg={3} sx={{ display: 'flex', alignItems: 'center' }}> | |||
| <Typography variant="pnspsFormParagraphBold">{FieldUtils.notNullFieldLabel("Expiry Date:")}</Typography> | |||
| </Grid> | |||
| <Grid item xs={12} md={6} lg={6}> | |||
| <TextField | |||
| fullWidth | |||
| id="brExpiryDate" | |||
| name="brExpiryDate" | |||
| type="date" | |||
| inputProps={{ min: DateUtils.dateStr(new Date()) }} | |||
| error={Boolean(formik.errors["brExpiryDate"])} | |||
| helperText={formik.errors["brExpiryDate"] ? formik.errors["brExpiryDate"] : ''} | |||
| onChange={formik.handleChange} | |||
| value={formik.values["brExpiryDate"]} | |||
| disabled={(!editMode && !createMode)} | |||
| sx={{ | |||
| width:'100%' | |||
| }} | |||
| /> | |||
| </Grid> | |||
| </Grid> | |||
| </Grid> | |||
| <Grid item lg={4} > | |||
| @@ -423,7 +441,7 @@ const OrganizationCard = ({ userData, loadDataFun, id, setEditModeFun }) => { | |||
| > | |||
| <DialogTitle><Typography variant="h3">Confirm</Typography></DialogTitle> | |||
| <DialogContent style={{ display: 'flex', }}> | |||
| <Typography variant="h4" style={{ padding: '16px' }}>Are you sure mark as Creditor?</Typography> | |||
| <Typography variant="h4" style={{ padding: '16px' }}>Are you sure mark as Credit Client?</Typography> | |||
| </DialogContent> | |||
| <DialogActions> | |||
| <Button onClick={() => setCreditorConfirmPopUp(false)}><Typography variant="h5">Cancel</Typography></Button> | |||
| @@ -445,7 +463,7 @@ const OrganizationCard = ({ userData, loadDataFun, id, setEditModeFun }) => { | |||
| > | |||
| <DialogTitle><Typography variant="h3">Confirm</Typography></DialogTitle> | |||
| <DialogContent style={{ display: 'flex', }}> | |||
| <Typography variant="h4" style={{ padding: '16px' }}>Are you sure mark as Non-Creditor?</Typography> | |||
| <Typography variant="h4" style={{ padding: '16px' }}>Are you sure mark as Non-Credit Client?</Typography> | |||
| </DialogContent> | |||
| <DialogActions> | |||
| <Button onClick={() => setNonCreditorConfirmPopUp(false)}><Typography variant="h5">Cancel</Typography></Button> | |||
| @@ -224,16 +224,7 @@ const OrganizationPubCard = ({ userData, loadDataFun, id, setEditModeFun }) => { | |||
| disabled: true, | |||
| form: formik | |||
| })} | |||
| {/* <FormControlLabel | |||
| control={<Checkbox checked={formik.values.creditor} />} | |||
| label="is Creditor" | |||
| name="creditor" | |||
| onChange={() => { | |||
| formik.setFieldValue("creditor", !formik.values.creditor); | |||
| }} | |||
| disabled={true} | |||
| //disabled={!editMode && !createMode} | |||
| /> */} | |||
| </Grid> | |||
| <Grid item lg={4} ></Grid> | |||
| @@ -349,7 +340,7 @@ const OrganizationPubCard = ({ userData, loadDataFun, id, setEditModeFun }) => { | |||
| > | |||
| <DialogTitle><Typography variant="h3">Confirm</Typography></DialogTitle> | |||
| <DialogContent style={{ display: 'flex', }}> | |||
| <Typography variant="h4" style={{ padding: '16px' }}>Are you sure mark as Creditor?</Typography> | |||
| <Typography variant="h4" style={{ padding: '16px' }}>Are you sure mark as Credit Client?</Typography> | |||
| </DialogContent> | |||
| <DialogActions> | |||
| <Button onClick={() => setCreditorConfirmPopUp(false)}><Typography variant="h5">Cancel</Typography></Button> | |||
| @@ -371,7 +362,7 @@ const OrganizationPubCard = ({ userData, loadDataFun, id, setEditModeFun }) => { | |||
| > | |||
| <DialogTitle><Typography variant="h3">Confirm</Typography></DialogTitle> | |||
| <DialogContent style={{ display: 'flex', }}> | |||
| <Typography variant="h4" style={{ padding: '16px' }}>Are you sure mark as Non-Creditor?</Typography> | |||
| <Typography variant="h4" style={{ padding: '16px' }}>Are you sure mark as Non-Credit Client?</Typography> | |||
| </DialogContent> | |||
| <DialogActions> | |||
| <Button onClick={() => setNonCreditorConfirmPopUp(false)}><Typography variant="h5">Cancel</Typography></Button> | |||
| @@ -2,12 +2,13 @@ | |||
| import { | |||
| Grid, Button, Typography, | |||
| Dialog, DialogTitle, DialogContent, DialogActions, | |||
| FormHelperText | |||
| FormHelperText, TextField | |||
| } from '@mui/material'; | |||
| import MainCard from "components/MainCard"; | |||
| import * as React from "react"; | |||
| import * as yup from 'yup'; | |||
| import { useEffect, useState } from "react"; | |||
| import * as DateUtils from 'utils/DateUtils'; | |||
| import * as HttpUtils from 'utils/HttpUtils'; | |||
| import * as UrlUtils from "utils/ApiPathConst"; | |||
| import * as FieldUtils from "utils/FieldUtils"; | |||
| @@ -18,7 +19,7 @@ const LoadingComponent = Loadable(lazy(() => import('../../extra-pages/LoadingCo | |||
| import Loadable from 'components/Loadable'; | |||
| import { lazy } from 'react'; | |||
| import { notifyCreateSuccess } from 'utils/CommonFunction'; | |||
| import {useIntl} from "react-intl"; | |||
| import { useIntl } from "react-intl"; | |||
| // ==============================|| DASHBOARD - DEFAULT ||============================== // | |||
| @@ -48,34 +49,34 @@ const OrganizationCard_loadFromUser = ({ userData, userId }) => { | |||
| enableReinitialize: true, | |||
| initialValues: currentUserData, | |||
| validationSchema: yup.object().shape({ | |||
| enCompanyName: yup.string().max(255, displayErrorMsg(intl.formatMessage({id: 'userRequireEnglishName'}))).required(displayErrorMsg(intl.formatMessage({id: 'userRequireEnglishName'}))), | |||
| chCompanyName: yup.string().max(255, displayErrorMsg(intl.formatMessage({id: 'userRequireChineseName'}))).nullable(), | |||
| addressLine1: yup.string().max(40).required(displayErrorMsg(intl.formatMessage({id: 'validateAddressLine1'}))), | |||
| enCompanyName: yup.string().max(255, displayErrorMsg(intl.formatMessage({ id: 'userRequireEnglishName' }))).required(displayErrorMsg(intl.formatMessage({ id: 'userRequireEnglishName' }))), | |||
| chCompanyName: yup.string().max(255, displayErrorMsg(intl.formatMessage({ id: 'userRequireChineseName' }))).nullable(), | |||
| addressLine1: yup.string().max(40).required(displayErrorMsg(intl.formatMessage({ id: 'validateAddressLine1' }))), | |||
| addressLine2: yup.string().max(40).nullable(), | |||
| addressLine3: yup.string().max(40).nullable(), | |||
| fax_countryCode: yup.string().min(3, displayErrorMsg(intl.formatMessage({id: 'requireDialingCode'}))).nullable(), | |||
| tel_countryCode: yup.string().min(3, displayErrorMsg(intl.formatMessage({id: 'requireDialingCode'}))), | |||
| phoneNumber: yup.string().min(8, displayErrorMsg(intl.formatMessage({id: 'requiredValidNumber'}))).required(displayErrorMsg(intl.formatMessage({id: 'requireContactNumber'}))), | |||
| fax_countryCode: yup.string().min(3, displayErrorMsg(intl.formatMessage({ id: 'requireDialingCode' }))).nullable(), | |||
| tel_countryCode: yup.string().min(3, displayErrorMsg(intl.formatMessage({ id: 'requireDialingCode' }))), | |||
| phoneNumber: yup.string().min(8, displayErrorMsg(intl.formatMessage({ id: 'requiredValidNumber' }))).required(displayErrorMsg(intl.formatMessage({ id: 'requireContactNumber' }))), | |||
| faxNumber: yup.string().min(8).nullable(), | |||
| brExpiryDate: yup.string().min(8).required(displayErrorMsg(intl.formatMessage({id: 'pleaseFillInBusinessRegCertValidityDate'}))), | |||
| brNo: yup.string().max(8).required(displayErrorMsg(intl.formatMessage({id: 'pleaseFillInBusinessRegCertNumber'}))) | |||
| .test('checkBrNoFormat', displayErrorMsg(`${intl.formatMessage({id: 'pleaseFillInValidBusinessRegCertNumber'})} (e.g. 12341234)`), function (value) { | |||
| var brNo_pattern = /[0-9]{8}/ | |||
| if (value !== undefined) { | |||
| if (value.match(brNo_pattern)) { | |||
| return true | |||
| } else { | |||
| return false | |||
| brExpiryDate: yup.string().min(8).required(displayErrorMsg(intl.formatMessage({ id: 'pleaseFillInBusinessRegCertValidityDate' }))), | |||
| brNo: yup.string().max(8).required(displayErrorMsg(intl.formatMessage({ id: 'pleaseFillInBusinessRegCertNumber' }))) | |||
| .test('checkBrNoFormat', displayErrorMsg(`${intl.formatMessage({ id: 'pleaseFillInValidBusinessRegCertNumber' })} (e.g. 12341234)`), function (value) { | |||
| var brNo_pattern = /[0-9]{8}/ | |||
| if (value !== undefined) { | |||
| if (value.match(brNo_pattern)) { | |||
| return true | |||
| } else { | |||
| return false | |||
| } | |||
| } | |||
| } | |||
| }), | |||
| }), | |||
| }), | |||
| onSubmit: values => { | |||
| if (values.country==null){ | |||
| setErrorMsg(intl.formatMessage({id: 'pleaseFillInCountry'})) | |||
| if (values.country == null) { | |||
| setErrorMsg(intl.formatMessage({ id: 'pleaseFillInCountry' })) | |||
| } else { | |||
| if (values.country.key ==1 && values.district == null){ | |||
| setErrorMsg(intl.formatMessage({id: 'pleaseFillInDistrict'})) | |||
| if (values.country.key == 1 && values.district == null) { | |||
| setErrorMsg(intl.formatMessage({ id: 'pleaseFillInDistrict' })) | |||
| } else { | |||
| HttpUtils.post({ | |||
| url: UrlUtils.POST_ORG_SAVE_PATH, | |||
| @@ -107,7 +108,7 @@ const OrganizationCard_loadFromUser = ({ userData, userId }) => { | |||
| } | |||
| }, | |||
| onSuccess: function (responseData) { | |||
| if(responseData.msg){ | |||
| if (responseData.msg) { | |||
| setFailText(responseData.msg); | |||
| setIsFailPopUp(true); | |||
| return; | |||
| @@ -143,131 +144,148 @@ const OrganizationCard_loadFromUser = ({ userData, userId }) => { | |||
| <div style={{ padding: 24 }}> | |||
| <form onSubmit={formik.handleSubmit}> | |||
| {!onReady? | |||
| <LoadingComponent /> | |||
| : | |||
| <Grid container spacing={1}> | |||
| {/*top*/} | |||
| <Grid item s={12} md={12} lg={12} sx={{ mb: 3 }} alignItems={"start"} justifyContent="center"> | |||
| <Grid item sx={{mr: 3 }}> | |||
| <Button | |||
| size="large" | |||
| variant="contained" | |||
| type="submit" | |||
| sx={{ | |||
| textTransform: 'capitalize', | |||
| alignItems: 'end' | |||
| }} | |||
| > | |||
| Create | |||
| </Button> | |||
| </Grid> | |||
| </Grid> | |||
| {/*top*/} | |||
| <form onSubmit={formik.handleSubmit}> | |||
| {!onReady ? | |||
| <LoadingComponent /> | |||
| : | |||
| <Grid container spacing={1}> | |||
| {/*top*/} | |||
| <Grid item s={12} md={12} lg={12} sx={{ mb: 3 }} alignItems={"start"} justifyContent="center"> | |||
| <Grid item sx={{ mr: 3 }}> | |||
| <Button | |||
| size="large" | |||
| variant="contained" | |||
| type="submit" | |||
| sx={{ | |||
| textTransform: 'capitalize', | |||
| alignItems: 'end' | |||
| }} | |||
| > | |||
| Create | |||
| </Button> | |||
| </Grid> | |||
| </Grid> | |||
| {/*top*/} | |||
| <Grid item xs={12}> | |||
| <FormHelperText error id="helper-text-address1-signup"> | |||
| <Typography variant="errorMessage1"> | |||
| {errorMsg} | |||
| </Typography> | |||
| </FormHelperText> | |||
| </Grid> | |||
| <Grid item lg={4}> | |||
| {FieldUtils.getTextField({ | |||
| label: "BR No.:", | |||
| valueName: "brNo", | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item xs={12}> | |||
| <FormHelperText error id="helper-text-address1-signup"> | |||
| <Typography variant="errorMessage1"> | |||
| {errorMsg} | |||
| </Typography> | |||
| </FormHelperText> | |||
| </Grid> | |||
| <Grid item lg={8}></Grid> | |||
| <Grid item lg={4}> | |||
| {FieldUtils.getTextField({ | |||
| label: "BR No.:", | |||
| valueName: "brNo", | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item lg={4}> | |||
| {FieldUtils.getTextField({ | |||
| label: FieldUtils.notNullFieldLabel("Name (Eng):"), | |||
| valueName: "enCompanyName", | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item lg={8}></Grid> | |||
| <Grid item lg={4}> | |||
| {FieldUtils.getTextField({ | |||
| label: "Name (Ch):", | |||
| valueName: "chCompanyName", | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item lg={4}> | |||
| {FieldUtils.getTextField({ | |||
| label: FieldUtils.notNullFieldLabel("Name (Eng):"), | |||
| valueName: "enCompanyName", | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item lg={4}> | |||
| {FieldUtils.getDateField({ | |||
| label: FieldUtils.notNullFieldLabel("Expiry Date:"), | |||
| valueName: "brExpiryDate", | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item lg={4}> | |||
| {FieldUtils.getTextField({ | |||
| label: "Name (Ch):", | |||
| valueName: "chCompanyName", | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item lg={4}> | |||
| {FieldUtils.getTextField({ | |||
| label: FieldUtils.notNullFieldLabel("Contact Person:"), | |||
| valueName: "contactPerson", | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item lg={4} > | |||
| <Grid container alignItems={"center"}> | |||
| <Grid item xs={12} md={3} lg={3} sx={{ display: 'flex', alignItems: 'center' }}> | |||
| <Typography variant="pnspsFormParagraphBold">{FieldUtils.notNullFieldLabel("Expiry Date:")}</Typography> | |||
| </Grid> | |||
| <Grid item xs={12} md={6} lg={6}> | |||
| <TextField | |||
| fullWidth | |||
| id="brExpiryDate" | |||
| name="brExpiryDate" | |||
| type="date" | |||
| inputProps={{ min: DateUtils.dateStr(new Date()) }} | |||
| error={Boolean(formik.errors["brExpiryDate"])} | |||
| helperText={formik.errors["brExpiryDate"] ? formik.errors["brExpiryDate"] : ''} | |||
| onChange={formik.handleChange} | |||
| value={formik.values["brExpiryDate"]} | |||
| sx={{ | |||
| width: '100%' | |||
| }} | |||
| /> | |||
| </Grid> | |||
| </Grid> | |||
| <Grid item lg={4}> | |||
| {FieldUtils.getPhoneField({ | |||
| label: FieldUtils.notNullFieldLabel("Contact Tel:"), | |||
| valueName: { | |||
| code: "tel_countryCode", | |||
| num: "phoneNumber" | |||
| }, | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| </Grid> | |||
| <Grid item lg={4}> | |||
| {FieldUtils.getPhoneField({ | |||
| label: "Fax No:", | |||
| valueName: { | |||
| code: "fax_countryCode", | |||
| num: "faxNumber" | |||
| }, | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item lg={4}> | |||
| {FieldUtils.getTextField({ | |||
| label: FieldUtils.notNullFieldLabel("Contact Person:"), | |||
| valueName: "contactPerson", | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item lg={4}> | |||
| {FieldUtils.getComboField({ | |||
| label: FieldUtils.notNullFieldLabel("Country:"), | |||
| valueName: "country", | |||
| dataList: ComboData.country, | |||
| getOptionLabel: (option) => option.type? intl.formatMessage({ id: option.type}) : "", | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item lg={4}> | |||
| {FieldUtils.getPhoneField({ | |||
| label: FieldUtils.notNullFieldLabel("Contact Tel:"), | |||
| valueName: { | |||
| code: "tel_countryCode", | |||
| num: "phoneNumber" | |||
| }, | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item lg={4}> | |||
| {FieldUtils.getComboField({ | |||
| label: FieldUtils.notNullFieldLabel("District:"), | |||
| valueName: "district", | |||
| dataList: ComboData.district, | |||
| getOptionLabel: (option) => option.type? intl.formatMessage({ id: option.type}) : "", | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item lg={4}> | |||
| {FieldUtils.getPhoneField({ | |||
| label: "Fax No:", | |||
| valueName: { | |||
| code: "fax_countryCode", | |||
| num: "faxNumber" | |||
| }, | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item lg={4}> | |||
| {FieldUtils.getAddressField({ | |||
| label: FieldUtils.notNullFieldLabel("Address:"), | |||
| valueName: ["addressLine1", "addressLine2", "addressLine3"], | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| </Grid> | |||
| } | |||
| </form> | |||
| <Grid item lg={4}> | |||
| {FieldUtils.getComboField({ | |||
| label: FieldUtils.notNullFieldLabel("Country:"), | |||
| valueName: "country", | |||
| dataList: ComboData.country, | |||
| getOptionLabel: (option) => option.type ? intl.formatMessage({ id: option.type }) : "", | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item lg={4}> | |||
| {FieldUtils.getComboField({ | |||
| label: FieldUtils.notNullFieldLabel("District:"), | |||
| valueName: "district", | |||
| dataList: ComboData.district, | |||
| getOptionLabel: (option) => option.type ? intl.formatMessage({ id: option.type }) : "", | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item lg={4}> | |||
| {FieldUtils.getAddressField({ | |||
| label: FieldUtils.notNullFieldLabel("Address:"), | |||
| valueName: ["addressLine1", "addressLine2", "addressLine3"], | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| </Grid> | |||
| } | |||
| </form> | |||
| </div> | |||
| <div> | |||
| @@ -123,7 +123,7 @@ const OrganizationSearchForm = ({ applySearch }) => { | |||
| renderInput={(params) => ( | |||
| <TextField | |||
| {...params} | |||
| label="Creditor/Non-creditor" | |||
| label="Credit Client/Non-Credit Client" | |||
| InputLabelProps={{ | |||
| shrink: true | |||
| }} | |||
| @@ -85,8 +85,8 @@ export default function OrganizationTable({ recordList }) { | |||
| { | |||
| id: 'creditor', | |||
| field: 'creditor', | |||
| headerName: 'Creditor', | |||
| width: 100, | |||
| headerName: 'Credit Client', | |||
| width: 150, | |||
| valueGetter: (params) => { | |||
| return params?.value?"Yes":""; | |||
| } | |||
| @@ -64,7 +64,7 @@ export default function SearchPublicNoticeTable({ recordList }) { | |||
| { | |||
| id: 'appNo', | |||
| field: 'appNo', | |||
| headerName: intl.formatMessage({id: 'terms'}), | |||
| headerName: intl.formatMessage({id: 'particulars'}), | |||
| width: isMdOrLg ? 'auto' : 300, | |||
| flex: isMdOrLg ? 1 : undefined, | |||
| renderCell: (params) => { | |||
| @@ -81,7 +81,7 @@ export default function SearchPublicNoticeTable({ recordList }) { | |||
| { | |||
| id: 'fee', | |||
| field: 'fee', | |||
| headerName: intl.formatMessage({id: 'currencyPrice'}) + ' (HK$)', | |||
| headerName: intl.formatMessage({id: 'currencyAmount'}) + ' ($)', | |||
| width: 200, | |||
| valueGetter: (params) => { | |||
| return (params?.value) ? "$ " + FormatUtils.currencyFormat(params?.value) : ""; | |||
| @@ -102,9 +102,9 @@ export default function SearchPublicNoticeTable({ recordList }) { | |||
| <Grid container direction="row" justifyContent="flex-end" sx={{backgroundColor: '#fff' }}> | |||
| <Grid item> | |||
| <Typography align="right" variant="h4" sx={{mr:2,mt:1}}> | |||
| <FormattedMessage id="payTotal"/>: | |||
| <FormattedMessage id="payTotal"/> : | |||
| <span style={{ color: "blue", fontWeight: "bold", }}> | |||
| (HK$) {FormatUtils.currencyFormat(total)} | |||
| $ {FormatUtils.currencyFormat(total)} | |||
| </span> | |||
| </Typography> | |||
| </Grid> | |||
| @@ -136,7 +136,7 @@ const PaymentDetails = ({ formData,doPrint,onDownload }) => { | |||
| <Grid container > | |||
| <Grid item xs={6} md={6} sx={{ml:-5, textAlign: "right" }}> | |||
| <FormLabel sx={{ fontSize: "16px", color: "#000000" }}> | |||
| <FormattedMessage id="payTotal"/>: | |||
| <FormattedMessage id="payTotalDeatail"/>: | |||
| </FormLabel> | |||
| </Grid> | |||
| <Grid xs={6} md={5} sx={{ml:5,textAlign: "left" }}> | |||
| @@ -299,7 +299,7 @@ const Index = () => { | |||
| <Typography variant="h3" sx={{ ml: 8, mt: 4, mr: 8, textAlign: "center" }}> | |||
| <img src={FpsIcon} width="80" height="80" alt="FPS"></img> | |||
| <br /> | |||
| <FormattedMessage id="payTotal"/> | |||
| <FormattedMessage id="payTotalDeatail"/> | |||
| <br /> | |||
| {"HK$ " + currencyFormat(paymentData.amount)} | |||
| </Typography> | |||
| @@ -64,7 +64,7 @@ export default function SearchPublicNoticeTable({ recordList }) { | |||
| headerName: 'Trans. Date', | |||
| flex: 1, | |||
| valueGetter: (params) => { | |||
| return DateUtils.datetimeStr(params?.value); | |||
| return DateUtils.dateStr(params?.value); | |||
| } | |||
| }, | |||
| { | |||
| @@ -72,7 +72,7 @@ export default function SearchPublicNoticeTable({ recordList }) { | |||
| headerName: 'Status', | |||
| width: 150, | |||
| renderCell: (params) => { | |||
| return PaymentStatus.getStatus_Cht(params); | |||
| return PaymentStatus.getStatus_Eng(params); | |||
| } | |||
| }, | |||
| { | |||
| @@ -77,7 +77,7 @@ export default function SearchPublicNoticeTable({ recordList }) { | |||
| width: isMdOrLg ? 'auto' : 160, | |||
| flex: isMdOrLg ? 1 : undefined, | |||
| valueGetter: (params) => { | |||
| return DateUtils.datetimeStr(params?.value); | |||
| return DateUtils.dateStr(params?.value); | |||
| } | |||
| }, | |||
| { | |||
| @@ -94,7 +94,7 @@ export default function SearchPublicNoticeTable({ recordList }) { | |||
| { | |||
| id: 'payAmount', | |||
| field: 'payAmount', | |||
| headerName: intl.formatMessage({id: 'fee'}), | |||
| headerName: intl.formatMessage({id: 'currencyAmount'}) + ' ($)', | |||
| width: 150, | |||
| valueGetter: (params) => { | |||
| return (params?.value) ? "$ " + FormatUtils.currencyFormat(params?.value) : ""; | |||
| @@ -37,6 +37,9 @@ const FormPanel = ({ formData }) => { | |||
| const [saving, setSaving] = React.useState(false); | |||
| const [proofPaymentDeadlineMin, setProofPaymentDeadlineMin] = React.useState({}); | |||
| const [reviseDeadlineMin, setReviseDeadlineMin] = React.useState({}); | |||
| const navigate = useNavigate() | |||
| React.useEffect(() => { | |||
| @@ -46,6 +49,8 @@ const FormPanel = ({ formData }) => { | |||
| setColumnPrice(ComboData.proofPrice[1]) | |||
| formData['length'] = 18; | |||
| } | |||
| setProofPaymentDeadlineMin(formData.proofPaymentDeadline); | |||
| setReviseDeadlineMin(formData.reviseDeadline); | |||
| } | |||
| }, [formData]); | |||
| @@ -206,6 +211,7 @@ const FormPanel = ({ formData }) => { | |||
| onChange={formik.handleChange} | |||
| name="reviseDeadline" | |||
| value={formik.values["reviseDeadline"]} | |||
| InputProps={{ inputProps: { min: DateUtils.datetimeStr(reviseDeadlineMin) } }} | |||
| variant="outlined" | |||
| sx={ | |||
| { | |||
| @@ -232,6 +238,7 @@ const FormPanel = ({ formData }) => { | |||
| onChange={formik.handleChange} | |||
| name="proofPaymentDeadline" | |||
| value={formik.values["proofPaymentDeadline"]} | |||
| InputProps={{ inputProps: { min: DateUtils.datetimeStr(proofPaymentDeadlineMin) } }} | |||
| variant="outlined" | |||
| sx={ | |||
| { | |||
| @@ -139,7 +139,7 @@ const ApplicationDetailCard = ({ | |||
| <Grid container alignItems={"center"}> | |||
| <Grid item xs={12} md={3} lg={3} | |||
| sx={{ display: 'flex', alignItems: 'center' }}> | |||
| <FormLabel><Typography variant="h5">App No.:</Typography></FormLabel> | |||
| <FormLabel><Typography variant="h5">App. No.:</Typography></FormLabel> | |||
| </Grid> | |||
| <Grid item xs={12} md={9} lg={9}> | |||
| @@ -151,7 +151,7 @@ const ApplicationDetailCard = ({ | |||
| <Grid container alignItems={"left"}> | |||
| <Grid item xs={12} md={3} lg={3} | |||
| sx={{ display: 'flex', alignItems: 'center' }}> | |||
| <FormLabel><Typography variant="h5">Status:</Typography></FormLabel> | |||
| <FormLabel><Typography variant="h5">App. Status:</Typography></FormLabel> | |||
| </Grid> | |||
| <Grid item xs={12} md={9} lg={9} sx={{ display: 'flex', alignItems: 'center' }}> | |||
| @@ -83,11 +83,7 @@ const FormPanel = ({ formData }) => { | |||
| onSuccess: function () { | |||
| notifyActionSuccess("提交成功!") | |||
| if (actionValue) { | |||
| if(data.creditor){ | |||
| navigate("/proof/search"); | |||
| }else{ | |||
| navigate("/proof/pay/" + params.id); | |||
| } | |||
| navigate("/proof/pay/" + params.id); | |||
| } else { | |||
| navigate("/proof/search"); | |||
| } | |||
| @@ -20,6 +20,7 @@ import Loadable from 'components/Loadable'; | |||
| import { lazy } from 'react'; | |||
| const LoadingComponent = Loadable(lazy(() => import('../../extra-pages/LoadingComponent'))); | |||
| import * as HttpUtils from "utils/HttpUtils" | |||
| import * as DateUtils from "utils/DateUtils" | |||
| import * as UrlUtils from "utils/ApiPathConst" | |||
| import * as StatusUtils from "utils/statusUtils/PublicNoteStatusUtils"; | |||
| @@ -93,7 +94,11 @@ const ApplicationDetailCard = ( | |||
| }; | |||
| const complatedClick = () => () => { | |||
| setStatus("complete") | |||
| let issueDate = DateUtils.convertToDate(applicationDetailData.gazetteIssueDetail.issueDate); | |||
| let current = new Date(); | |||
| if(current.getTime() >= issueDate.getTime()){ | |||
| setStatus("complete") | |||
| } | |||
| }; | |||
| const withdrawnClick = () => () => { | |||
| @@ -225,11 +230,13 @@ const ApplicationDetailCard = ( | |||
| // size="large" | |||
| variant="contained" | |||
| onClick={complatedClick()} | |||
| disabled={(new Date()).getTime() < DateUtils.convertToDate(applicationDetailData.gazetteIssueDetail.issueDate).getTime()} | |||
| sx={{ | |||
| textTransform: 'capitalize', | |||
| alignItems: 'end', | |||
| backgroundColor: '#52b202' | |||
| }}> | |||
| <DoneIcon /> | |||
| <Typography ml={1} variant="h5">Complete</Typography> | |||
| </Button> | |||
| @@ -119,6 +119,7 @@ const GazetteDetailCard = ( | |||
| // size="large" | |||
| variant="contained" | |||
| onClick={groupDetailClick()} | |||
| disabled={applicationDetailData.data.status!="submitted"&&applicationDetailData.data.status!="reviewed"} | |||
| sx={{ | |||
| textTransform: 'capitalize', | |||
| alignItems: 'end' | |||
| @@ -167,7 +167,13 @@ const ApplicationDetailCard = ( | |||
| variant="contained" | |||
| onClick={cancelledClick()} | |||
| color="edit" | |||
| disabled={currentApplicationDetailData.status !== "submitted"} | |||
| disabled={currentApplicationDetailData.status == "rejected" | |||
| || currentApplicationDetailData.status == "cancelled" | |||
| || (!currentApplicationDetailData.creditor | |||
| && currentApplicationDetailData.status == "paid") | |||
| || (currentApplicationDetailData.creditor | |||
| && currentApplicationDetailData.status == "confirmed") | |||
| } | |||
| title={intl.formatMessage({ id: 'cancel' })} | |||
| startIcon={<CloseIcon />} | |||
| aria-label={intl.formatMessage({ id: 'cancel' })} | |||
| @@ -81,12 +81,16 @@ export default function BaseGrid({rows}) { | |||
| renderCell: (params) => ( | |||
| isORGLoggedIn()? | |||
| <div> | |||
| <FormattedMessage id="gazetteCount" />: {params.row.issueVolume + "/" + params.row.issueYear | |||
| + " No. " + params.row.issueNo}<br /> | |||
| Care Of: {params.row.careOf} <br/> | |||
| <FormattedMessage variant="pnspsNormalText" id="myRemarks"/>: {params.row.remarks} | |||
| </div>: | |||
| <div> | |||
| {params.row.remarks} | |||
| <FormattedMessage id="gazetteCount" />: {params.row.issueVolume + "/" + params.row.issueYear | |||
| + " No. " + params.row.issueNo}<br /> | |||
| <FormattedMessage variant="pnspsNormalText" id="myRemarks"/>:{params.row.remarks} | |||
| {/* <Typography variant="pnspsNormalText">{params.row.remarks}</Typography> */} | |||
| </div> | |||
| ) | |||
| @@ -19,9 +19,9 @@ import { useNavigate } from "react-router-dom"; | |||
| import { | |||
| isORGLoggedIn, | |||
| } from "utils/Utils"; | |||
| import {ThemeProvider, useTheme} from "@emotion/react"; | |||
| import {PNSPS_BUTTON_THEME} from "../../../themes/buttonConst"; | |||
| import {FormattedMessage, useIntl} from "react-intl"; | |||
| import { ThemeProvider, useTheme } from "@emotion/react"; | |||
| import { PNSPS_BUTTON_THEME } from "../../../themes/buttonConst"; | |||
| import { FormattedMessage, useIntl } from "react-intl"; | |||
| // ==============================|| EVENT TABLE ||============================== // | |||
| export default function SubmittedTab({ rows }) { | |||
| @@ -66,8 +66,8 @@ export default function SubmittedTab({ rows }) { | |||
| console.log(rows) | |||
| console.log(selectedCareOf) | |||
| rows.forEach((element) => { | |||
| if (element.careOf===selectedCareOf.label){ | |||
| afteSelectedList.push(element) | |||
| if (element.careOf === selectedCareOf.label) { | |||
| afteSelectedList.push(element) | |||
| } | |||
| }); | |||
| // afteSelectedList.push(rows.find(obj => obj.careOf ===(selectedCareOf.label))); | |||
| @@ -91,6 +91,11 @@ export default function SubmittedTab({ rows }) { | |||
| for (var i = 0; i < datas?.length; i++) { | |||
| appIdList.push(datas[i].id); | |||
| } | |||
| if(appIdList.length<1){ | |||
| setExpiryDateErrText(intl.formatMessage({ id: 'MSG.plzSelectApp' })); | |||
| setExpiryDateErr(true); | |||
| return; | |||
| } | |||
| HttpUtils.post({ | |||
| url: UrlUtils.POST_CHECK_APP_EXPRITY_DATE, | |||
| params: { | |||
| @@ -105,7 +110,7 @@ export default function SubmittedTab({ rows }) { | |||
| responData.msg.forEach((item) => { | |||
| str += "App: " + item.appNo + ", 到期日: " + DateUtils.datetimeStr_Cht(item.expiryDate) + "\n"; | |||
| }); | |||
| setExpiryDateErrText(str.split('\n').map(str => <>{str}<br/></>)); | |||
| setExpiryDateErrText(str.split('\n').map(str => <>{str}<br /></>)); | |||
| setExpiryDateErr(true); | |||
| } | |||
| }); | |||
| @@ -117,69 +122,41 @@ export default function SubmittedTab({ rows }) { | |||
| { | |||
| id: 'appNo', | |||
| field: 'appNo', | |||
| headerName: intl.formatMessage({id: 'applicationId'}), | |||
| headerName: intl.formatMessage({ id: 'applicationId' }), | |||
| width: isMdOrLg ? 'auto' : 160, | |||
| flex: isMdOrLg ? 1 : undefined, | |||
| }, | |||
| { | |||
| id: 'created', | |||
| field: 'created', | |||
| headerName: intl.formatMessage({id: 'submitDate'}), | |||
| headerName: intl.formatMessage({ id: 'submitDate' }), | |||
| width: isMdOrLg ? 'auto' : 160, | |||
| flex: isMdOrLg ? 1 : undefined, | |||
| valueGetter: (params) => { | |||
| return DateUtils.datetimeStr(params.value); | |||
| } | |||
| }, | |||
| // { | |||
| // id: 'contactPerson', | |||
| // field: 'contactPerson', | |||
| // headerName: '聯絡人', | |||
| // flex: 2, | |||
| // renderCell: (params) => { | |||
| // let phone = JSON.parse(params.row.contactTelNo); | |||
| // let faxNo = JSON.parse(params.row.contactFaxNo); | |||
| // let contact = ""; | |||
| // if (phone) { | |||
| // contact = "電話: " + phone?.countryCode + " " + phone?.phoneNumber | |||
| // } | |||
| // if (faxNo && faxNo?.faxNumber) { | |||
| // if (contact != "") | |||
| // contact = contact + ", " | |||
| // contact = contact + "傳真:" + faxNo?.countryCode + " " + faxNo?.faxNumber | |||
| // } | |||
| // return (<> | |||
| // {params?.value}<br /> | |||
| // {contact} | |||
| // </>); | |||
| // } | |||
| // }, | |||
| { | |||
| id: 'remarks', | |||
| field: 'remarks', | |||
| headerName: isORGLoggedIn() ? intl.formatMessage({id: 'gazetteCount2_1'}) : intl.formatMessage({id: 'myRemarks'}), | |||
| headerName: isORGLoggedIn() ? intl.formatMessage({ id: 'gazetteCount2_1' }) : intl.formatMessage({ id: 'myRemarks' }), | |||
| width: isMdOrLg ? 'auto' : 400, | |||
| flex: isMdOrLg ? 3 : undefined, | |||
| renderCell: (params) => ( | |||
| isORGLoggedIn() ? | |||
| <div> | |||
| Care Of: {params.row.careOf}<br/> | |||
| <FormattedMessage id="myRemarks"/>: {params.row.remarks} | |||
| Care Of: {params.row.careOf}<br /> | |||
| <FormattedMessage id="myRemarks" />: {params.row.remarks} | |||
| </div> : | |||
| <div> | |||
| {/* <Typography variant="pnspsNormalText"> */} | |||
| {params.row.remarks} | |||
| {/* </Typography> */} | |||
| {params.row.remarks} | |||
| </div> | |||
| ) | |||
| }, | |||
| { | |||
| id: 'fee', | |||
| field: 'fee', | |||
| headerName: intl.formatMessage({id: 'price'}), | |||
| headerName: intl.formatMessage({ id: 'price' }), | |||
| width: isMdOrLg ? 'auto' : 160, | |||
| flex: isMdOrLg ? 1 : undefined, | |||
| renderCell: (params) => { | |||
| @@ -189,11 +166,11 @@ export default function SubmittedTab({ rows }) { | |||
| { | |||
| id: 'status', | |||
| field: 'status', | |||
| headerName: intl.formatMessage({id: 'status'}), | |||
| headerName: intl.formatMessage({ id: 'status' }), | |||
| width: isMdOrLg ? 'auto' : 160, | |||
| flex: isMdOrLg ? 1 : undefined, | |||
| renderCell: (params) => { | |||
| return [StatusUtils.getStatusIntl(params,intl)] | |||
| return [StatusUtils.getStatusIntl(params, intl)] | |||
| }, | |||
| }, | |||
| { | |||
| @@ -203,8 +180,8 @@ export default function SubmittedTab({ rows }) { | |||
| width: 150, | |||
| cellClassName: 'actions', | |||
| renderCell: (params) => { | |||
| return <Button aria-label={intl.formatMessage({id: 'viewDetail'})} onClick={handleDetailClick(params)}> | |||
| <FormattedMessage id="viewDetail"/> | |||
| return <Button aria-label={intl.formatMessage({ id: 'viewDetail' })} onClick={handleDetailClick(params)}> | |||
| <FormattedMessage id="viewDetail" /> | |||
| </Button>; | |||
| }, | |||
| } | |||
| @@ -220,21 +197,20 @@ export default function SubmittedTab({ rows }) { | |||
| content.push(<> | |||
| <Stack direction="row" justifyContent="space-between"> | |||
| <Typography variant="h5"> | |||
| <FormattedMessage id="applicationId"/>: {datas[i].appNo} | |||
| <FormattedMessage id="applicationId" />: {datas[i].appNo} | |||
| </Typography> | |||
| ({DateUtils.datetimeStr(datas[i].created)}) | |||
| </Stack> | |||
| <FormattedMessage id="extraMark"/>: {datas[i].remarks} | |||
| <FormattedMessage id="extraMark" />: {datas[i].remarks} | |||
| <br /><br /> | |||
| </>); | |||
| totalAmount += datas[i].fee; | |||
| } | |||
| content.push(<Typography variant="h5"> | |||
| <FormattedMessage id="totalAmount"/> (HK$): {FormatUtils.currencyFormat(totalAmount)} | |||
| <FormattedMessage id="totalAmount" /> (HK$): {FormatUtils.currencyFormat(totalAmount)} | |||
| <br /><br /> | |||
| </Typography>); | |||
| //setAmount(totalAmount); | |||
| return content; | |||
| } | |||
| @@ -317,15 +293,15 @@ export default function SubmittedTab({ rows }) { | |||
| /> | |||
| <ThemeProvider theme={PNSPS_BUTTON_THEME}> | |||
| <Button | |||
| color="create" | |||
| variant="contained" | |||
| aria-label={intl.formatMessage({id: 'pay'})} | |||
| onClick={() => { handlePaymentBtn() }} | |||
| sx={{mt:2, ml:1}} | |||
| > | |||
| <FormattedMessage id="pay"/> | |||
| </Button> | |||
| <Button | |||
| color="create" | |||
| variant="contained" | |||
| aria-label={intl.formatMessage({ id: 'pay' })} | |||
| onClick={() => { handlePaymentBtn() }} | |||
| sx={{ mt: 2, ml: 1 }} | |||
| > | |||
| <FormattedMessage id="pay" /> | |||
| </Button> | |||
| </ThemeProvider> | |||
| </div> | |||
| @@ -343,7 +319,7 @@ export default function SubmittedTab({ rows }) { | |||
| > | |||
| <DialogTitle> | |||
| <Typography variant="h3" > | |||
| <FormattedMessage id="payConfirm"/> | |||
| <FormattedMessage id="payConfirm" /> | |||
| </Typography> | |||
| </DialogTitle> | |||
| <DialogContent style={{ display: 'flex', }}> | |||
| @@ -352,15 +328,15 @@ export default function SubmittedTab({ rows }) { | |||
| </Stack> | |||
| </DialogContent> | |||
| <DialogActions> | |||
| <Button onClick={() => setIsPopUp(false)} aria-label={intl.formatMessage({id: 'close'})}> | |||
| <Button onClick={() => setIsPopUp(false)} aria-label={intl.formatMessage({ id: 'close' })}> | |||
| <Typography variant="h5"> | |||
| <FormattedMessage id="close"/> | |||
| <FormattedMessage id="close" /> | |||
| </Typography></Button> | |||
| <Button onClick={() => doPayment()} aria-label={intl.formatMessage({id: 'confirm'})}> | |||
| <Button onClick={() => doPayment()} aria-label={intl.formatMessage({ id: 'confirm' })}> | |||
| <Typography variant="h5"> | |||
| <FormattedMessage id="confirm"/> | |||
| </Typography></Button> | |||
| <FormattedMessage id="confirm" /> | |||
| </Typography></Button> | |||
| </DialogActions> | |||
| </Dialog> | |||
| </div> | |||
| @@ -387,15 +363,15 @@ export default function SubmittedTab({ rows }) { | |||
| </Stack> | |||
| </DialogContent> | |||
| <DialogActions> | |||
| <Button onClick={() => setCheckCareOf(false)} aria-label={intl.formatMessage({id: 'close'})}> | |||
| <Button onClick={() => setCheckCareOf(false)} aria-label={intl.formatMessage({ id: 'close' })}> | |||
| <Typography variant="h5"> | |||
| <FormattedMessage id="close"/> | |||
| <FormattedMessage id="close" /> | |||
| </Typography></Button> | |||
| <Button onClick={() => afterWarningPayment()} aria-label={intl.formatMessage({id: 'confirm'})}> | |||
| <Button onClick={() => afterWarningPayment()} aria-label={intl.formatMessage({ id: 'confirm' })}> | |||
| <Typography variant="h5"> | |||
| <FormattedMessage id="confirm"/> | |||
| </Typography></Button> | |||
| <FormattedMessage id="confirm" /> | |||
| </Typography></Button> | |||
| </DialogActions> | |||
| </Dialog> | |||
| </div> | |||
| @@ -413,7 +389,7 @@ export default function SubmittedTab({ rows }) { | |||
| }} | |||
| > | |||
| <DialogTitle></DialogTitle> | |||
| <Typography variant="h2" style={{ padding: '16px' }}>行動失敗</Typography> | |||
| <Typography variant="h4" style={{ paddingLeft: '24px' }}><FormattedMessage id="MSG.actionFail" /></Typography> | |||
| <DialogContent style={{ display: 'flex', }}> | |||
| <Stack direction="column" justifyContent="space-between"> | |||
| { | |||
| @@ -422,9 +398,9 @@ export default function SubmittedTab({ rows }) { | |||
| </Stack> | |||
| </DialogContent> | |||
| <DialogActions> | |||
| <Button onClick={() => setExpiryDateErr(false)} aria-label={intl.formatMessage({id: 'close'})}> | |||
| <Button onClick={() => setExpiryDateErr(false)} aria-label={intl.formatMessage({ id: 'close' })}> | |||
| <Typography variant="h5"> | |||
| <FormattedMessage id="close"/> | |||
| <FormattedMessage id="close" /> | |||
| </Typography></Button> | |||
| </DialogActions> | |||
| </Dialog> | |||
| @@ -6,13 +6,13 @@ import { | |||
| } from '@mui/material'; | |||
| import * as DateUtils from "utils/DateUtils"; | |||
| import * as StatusUtils from "utils/statusUtils/PublicNoteStatusUtils"; | |||
| import {useNavigate} from "react-router-dom"; | |||
| import {FiDataGrid} from "components/FiDataGrid"; | |||
| import { useNavigate } from "react-router-dom"; | |||
| import { FiDataGrid } from "components/FiDataGrid"; | |||
| import { | |||
| isORGLoggedIn, | |||
| } from "utils/Utils"; | |||
| import {useTheme} from "@emotion/react"; | |||
| import {FormattedMessage, useIntl} from "react-intl"; | |||
| } from "utils/Utils"; | |||
| import { useTheme } from "@emotion/react"; | |||
| import { FormattedMessage, useIntl } from "react-intl"; | |||
| // ==============================|| EVENT TABLE ||============================== // | |||
| export default function SearchPublicNoticeTable({ recordList }) { | |||
| @@ -23,7 +23,7 @@ export default function SearchPublicNoticeTable({ recordList }) { | |||
| const intl = useIntl(); | |||
| const handleDetailClick = (params) => () => { | |||
| navigate('/publicNotice/'+ params.id); | |||
| navigate('/publicNotice/' + params.id); | |||
| }; | |||
| React.useEffect(() => { | |||
| @@ -34,14 +34,14 @@ export default function SearchPublicNoticeTable({ recordList }) { | |||
| { | |||
| id: 'appNo', | |||
| field: 'appNo', | |||
| headerName: intl.formatMessage({id: 'applicationId'}), | |||
| headerName: intl.formatMessage({ id: 'applicationId' }), | |||
| width: isMdOrLg ? 'auto' : 160, | |||
| flex: isMdOrLg ? 1 : undefined, | |||
| }, | |||
| { | |||
| id: 'created', | |||
| field: 'created', | |||
| headerName: intl.formatMessage({id: 'submitDate'}), | |||
| headerName: intl.formatMessage({ id: 'submitDate' }), | |||
| width: isMdOrLg ? 'auto' : 160, | |||
| flex: isMdOrLg ? 1 : undefined, | |||
| valueGetter: (params) => { | |||
| @@ -77,24 +77,28 @@ export default function SearchPublicNoticeTable({ recordList }) { | |||
| { | |||
| id: 'remarks', | |||
| field: 'remarks', | |||
| headerName: isORGLoggedIn()? intl.formatMessage({id: 'gazetteCount2_1'}) : intl.formatMessage({id: 'myRemarks'}), | |||
| headerName: isORGLoggedIn() ? intl.formatMessage({ id: 'gazetteCount2_1' }) : intl.formatMessage({ id: 'myRemarks' }), | |||
| width: isMdOrLg ? 'auto' : 400, | |||
| flex: isMdOrLg ? 3 : undefined, | |||
| renderCell: (params) => ( | |||
| isORGLoggedIn()? | |||
| <div> | |||
| Care Of: {params.row.careOf} <br/> | |||
| <FormattedMessage id="myRemarks"/>: {params.row.remarks} | |||
| </div>: | |||
| <div> | |||
| <Typography variant="pnspsNormalText">{params.row.remarks}</Typography> | |||
| </div> | |||
| ) | |||
| isORGLoggedIn() ? | |||
| <div> | |||
| <FormattedMessage id="gazetteCount" />: {params.row.issueVolume + "/" + params.row.issueYear | |||
| + " No. " + params.row.issueNo}<br /> | |||
| Care Of: {params.row.careOf} <br /> | |||
| <FormattedMessage id="myRemarks" />: {params.row.remarks} | |||
| </div> : | |||
| <div> | |||
| <FormattedMessage id="gazetteCount" />: {params.row.issueVolume + "/" + params.row.issueYear | |||
| + " No. " + params.row.issueNo}<br /> | |||
| <Typography variant="pnspsNormalText">{params.row.remarks}</Typography> | |||
| </div> | |||
| ) | |||
| }, | |||
| { | |||
| id: 'status', | |||
| field: 'status', | |||
| headerName: intl.formatMessage({id: 'status'}), | |||
| headerName: intl.formatMessage({ id: 'status' }), | |||
| width: 200, | |||
| renderCell: (params) => { | |||
| return [StatusUtils.getStatusIntl(params, intl)] | |||
| @@ -108,16 +112,16 @@ export default function SearchPublicNoticeTable({ recordList }) { | |||
| cellClassName: 'actions', | |||
| renderCell: (params) => { | |||
| return <Button onClick={handleDetailClick(params)} | |||
| aria-label={intl.formatMessage({id: 'viewDetail'})} | |||
| aria-label={intl.formatMessage({ id: 'viewDetail' })} | |||
| > | |||
| <FormattedMessage id="viewDetail"/> | |||
| <FormattedMessage id="viewDetail" /> | |||
| </Button>; | |||
| }, | |||
| } | |||
| ]; | |||
| function handleRowDoubleClick(params) { | |||
| navigate('/publicNotice/'+ params.id); | |||
| navigate('/publicNotice/' + params.id); | |||
| } | |||
| return ( | |||
| @@ -6,6 +6,7 @@ import { | |||
| InputAdornment, | |||
| Typography, FormLabel, | |||
| OutlinedInput, | |||
| TextField | |||
| } from '@mui/material'; | |||
| import MainCard from "../../../components/MainCard"; | |||
| import * as React from "react"; | |||
| @@ -18,6 +19,7 @@ const LoadingComponent = Loadable(lazy(() => import('../../extra-pages/LoadingCo | |||
| //import {useParams} from "react-router-dom"; | |||
| import Visibility from '@mui/icons-material/Visibility'; | |||
| import VisibilityOff from '@mui/icons-material/VisibilityOff'; | |||
| import { useIntl } from "react-intl"; | |||
| // ==============================|| DASHBOARD - DEFAULT ||============================== // | |||
| const UserInformationCard = ({ isCollectData, updateUserObject, userData, isNewRecord }) => { | |||
| @@ -25,8 +27,12 @@ const UserInformationCard = ({ isCollectData, updateUserObject, userData, isNewR | |||
| const [currentUserData, setCurrentUserData] = React.useState({}); | |||
| const [locked, setLocked] = useState(false); | |||
| const [showPassword, setShowPassword] = React.useState(false); | |||
| const [onReady, setOnReady] = useState(false); | |||
| const { register, getValues, formState: { errors }, } = useForm() | |||
| const [onReady, setOnReady] = React.useState(false); | |||
| const [pw, setPw] = React.useState(""); | |||
| const [pwErr, setPwErr] = React.useState(""); | |||
| const { register, getValues } = useForm(); | |||
| const intl = useIntl(); | |||
| const handleClickShowPassword = () => setShowPassword((show) => !show); | |||
| const handleMouseDownPassword = () => setShowPassword(!showPassword); | |||
| @@ -49,9 +55,40 @@ const UserInformationCard = ({ isCollectData, updateUserObject, userData, isNewR | |||
| } | |||
| }, [currentUserData]); | |||
| useEffect(() => { | |||
| console.log("num"); | |||
| console.log(pw.match(/^(?=.*[0-9])/)); | |||
| console.log("small char"); | |||
| console.log(pw.match(/^(?=.*[a-z])/)); | |||
| console.log("SpecialChar"); | |||
| console.log(pw.match(/^(?=.*[!@#%&]?)/)); | |||
| setPwErr(''); | |||
| if (pw.length == 0) { | |||
| setPwErr(intl.formatMessage({ id: 'requirePassword' })); | |||
| } else if (pw.length < 8) { | |||
| setPwErr(intl.formatMessage({ id: 'atLeast8CharPassword' })); | |||
| } else if (pw.length > 60) { | |||
| setPwErr(intl.formatMessage({ id: 'noMoreThenNWords' }, { num: num, fieldname: "" })); | |||
| } | |||
| else if (/\s/.test(pw) ) { | |||
| setPwErr(intl.formatMessage({ id: 'noSpacePassword' })); | |||
| } else if (! /[a-z]/.test(pw)) { | |||
| setPwErr(intl.formatMessage({ id: 'atLeastOneSmallLetter' })); | |||
| } else if (! /[A-Z]/.test(pw)) { | |||
| setPwErr(intl.formatMessage({ id: 'atLeastOneCapLetter' })); | |||
| } else if (! /[0-9]/.test(pw)) { | |||
| setPwErr(intl.formatMessage({ id: 'atLeast1Number' })); | |||
| } else if (! /[!@#%&]/.test(pw)) { | |||
| setPwErr(intl.formatMessage({ id: 'atLeast1SpecialChar' })); | |||
| } | |||
| }, [pw]); | |||
| useEffect(() => { | |||
| //upload latest data to parent | |||
| const values = getValues(); | |||
| values.password = pw; | |||
| values.pwErr = pwErr; | |||
| const objectData = { | |||
| ...values, | |||
| locked: locked, | |||
| @@ -110,19 +147,19 @@ const UserInformationCard = ({ isCollectData, updateUserObject, userData, isNewR | |||
| <Grid item xs={7} s={7} md={7} lg={6}> | |||
| <FormControl variant="outlined" fullWidth required> | |||
| <OutlinedInput | |||
| <TextField | |||
| variant="outlined" | |||
| fullWidth | |||
| size="small" | |||
| {...register("password", { | |||
| minLength: { | |||
| value: 8, | |||
| message: "Must be at least 8 characters long", | |||
| }, | |||
| validate: (value) => value % 2 === 0 || "The number of servings must be an even number", | |||
| })} | |||
| {...register("password")} | |||
| id='password' | |||
| type={showPassword ? 'text' : 'password'} | |||
| disabled={!isNewRecord} | |||
| error={pwErr} | |||
| helperText={pwErr} | |||
| onChange={(value) => { | |||
| setPw(value.target.value); | |||
| }} | |||
| endAdornment={ | |||
| <InputAdornment position="end"> | |||
| <IconButton | |||
| @@ -138,7 +175,6 @@ const UserInformationCard = ({ isCollectData, updateUserObject, userData, isNewR | |||
| /> | |||
| </FormControl> | |||
| </Grid> | |||
| <span style={{ "color": "red" }}>{errors.password?.message}</span> | |||
| </Grid> | |||
| </Grid> : null | |||
| } | |||
| @@ -171,6 +171,7 @@ const UserMaintainPage = () => { | |||
| return false; | |||
| }); | |||
| } else { | |||
| if(editedCustomerData.pwErr) return; | |||
| axios.post(POST_ADMIN_USER_REGISTER, | |||
| { | |||
| "username": editedCustomerData.username, | |||
| @@ -45,12 +45,6 @@ const UserInformationCard_Individual = ({ formData, loadDataFun }) => { | |||
| return intl.formatMessage({ id: 'noMoreThenNWords' },{num:num, fieldname:fieldname?intl.formatMessage({ id: fieldname})+": ":""}); | |||
| } | |||
| function getRequiredErrStr(fieldname){ | |||
| return intl.formatMessage({ id: 'require'},{fieldname:fieldname?intl.formatMessage({ id: fieldname}):""}); | |||
| } | |||
| const formik = useFormik({ | |||
| enableReinitialize: true, | |||
| initialValues: currentUserData, | |||
| @@ -68,7 +62,6 @@ const UserInformationCard_Individual = ({ formData, loadDataFun }) => { | |||
| fax_countryCode: yup.string().min(3, intl.formatMessage({id: 'require3Number'})), | |||
| phoneNumber: yup.string().min(8, intl.formatMessage({id: 'require8Number'})).required(intl.formatMessage({id: 'requireContactNumber'})), | |||
| faxNumber: yup.string().min(8, intl.formatMessage({id: 'require8Number'})).nullable(), | |||
| district: yup.string().required(getRequiredErrStr("district")), | |||
| }), | |||
| onSubmit: values => { | |||
| if (values.country==null){ | |||
| @@ -102,6 +95,7 @@ const UserInformationCard_Individual = ({ formData, loadDataFun }) => { | |||
| addressLine2: values.addressLine2, | |||
| addressLine3: values.addressLine3, | |||
| }, | |||
| preferLocale: values.preferLocale.type | |||
| }, | |||
| onSuccess: function () { | |||
| notifySaveSuccess(); | |||
| @@ -519,6 +513,17 @@ const UserInformationCard_Individual = ({ formData, loadDataFun }) => { | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item xs={12} sm={12} md={12} lg={4}> | |||
| {FieldUtils.getComboField({ | |||
| label: intl.formatMessage({id: 'language'}) + ":", | |||
| valueName: "preferLocale", | |||
| dataList: ComboData.Locale, | |||
| getOptionLabel: (option) => option.label? option.label: "", | |||
| disabled: (!editMode), | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| </Grid> | |||
| </Grid> | |||
| </form> | |||
| @@ -44,11 +44,6 @@ const UserInformationCard_Individual_Pub = ({ formData, loadDataFun }) => { | |||
| return intl.formatMessage({ id: 'noMoreThenNWords' },{num:num, fieldname:fieldname?intl.formatMessage({ id: fieldname})+": ":""}); | |||
| } | |||
| function getRequiredErrStr(fieldname){ | |||
| return intl.formatMessage({ id: 'require'},{fieldname:fieldname?intl.formatMessage({ id: fieldname}):""}); | |||
| } | |||
| const formik = useFormik({ | |||
| enableReinitialize: true, | |||
| initialValues: currentUserData, | |||
| @@ -63,9 +58,9 @@ const UserInformationCard_Individual_Pub = ({ formData, loadDataFun }) => { | |||
| fax_countryCode: yup.string().min(3, intl.formatMessage({id: 'require3Number'})), | |||
| phoneNumber: yup.string().min(8, intl.formatMessage({id: 'require8Number'})).required(intl.formatMessage({id: 'requireContactNumber'})), | |||
| faxNumber: yup.string().min(8, intl.formatMessage({id: 'require8Number'})).nullable(), | |||
| district: yup.string().required(getRequiredErrStr("district")), | |||
| }), | |||
| onSubmit: values => { | |||
| // console.log(values) | |||
| if (values.country==null){ | |||
| setErrorMsg(intl.formatMessage({id: 'pleaseFillInCountry'})) | |||
| } else { | |||
| @@ -92,6 +87,7 @@ const UserInformationCard_Individual_Pub = ({ formData, loadDataFun }) => { | |||
| addressLine2: values.addressLine2, | |||
| addressLine3: values.addressLine3, | |||
| }, | |||
| preferLocale: values.preferLocale.type | |||
| }, | |||
| onSuccess: function () { | |||
| notifySaveSuccess(); | |||
| @@ -357,6 +353,17 @@ const UserInformationCard_Individual_Pub = ({ formData, loadDataFun }) => { | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item xs={12} sm={12} md={12} lg={4}> | |||
| {FieldUtils.getComboField({ | |||
| label: intl.formatMessage({id: 'language'}) + ":", | |||
| valueName: "preferLocale", | |||
| dataList: ComboData.Locale, | |||
| getOptionLabel: (option) => option.label? option.label: "", | |||
| disabled: (!editMode), | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| </Grid> | |||
| </Grid> | |||
| </form> | |||
| @@ -22,7 +22,7 @@ const BackgroundHead = { | |||
| } | |||
| import Loadable from 'components/Loadable'; | |||
| import { useNavigate } from "react-router-dom"; | |||
| import {getObjectByValue} from "utils/CommonFunction"; | |||
| import {getObjectByValue,getObjectByType} from "utils/CommonFunction"; | |||
| import * as ComboData from "utils/ComboData"; | |||
| const LoadingComponent = Loadable(React.lazy(() => import('../../extra-pages/LoadingComponent'))); | |||
| const UserInformationCard = Loadable(React.lazy(() => import('./UserInformationCard_Individual'))); | |||
| @@ -80,6 +80,7 @@ const UserMaintainPage_Individual = () => { | |||
| response.data["fax_countryCode"] = response.data.faxNo?.countryCode; | |||
| response.data["lastLoginDate"] = response.data.lastLogin ? DateUtils.datetimeStr(response.data.lastLogin) : ""; | |||
| response.data["preferLocale"] = getObjectByType(ComboData.Locale, "type", response.data?.preferLocale); | |||
| setFormData(response.data); | |||
| } | |||
| @@ -104,7 +105,9 @@ const UserMaintainPage_Individual = () => { | |||
| response.data["faxNumber"] = response.data.faxNo?.faxNumber; | |||
| response.data["fax_countryCode"] = response.data.faxNo?.countryCode; | |||
| response.data["preferLocale"] = getObjectByType(ComboData.Locale, "type", response.data?.preferLocale); | |||
| // console.log(response.data) | |||
| setFormData(response.data); | |||
| } | |||
| }); | |||
| @@ -101,7 +101,7 @@ const UserInformationCard_Organization = ({ userData, loadDataFun, orgData }) => | |||
| orgId: values.orgId, | |||
| // brNo: values.brNo, | |||
| // brExpiryDate: values.brExpiryDate, | |||
| preferLocale: values.preferLocale.type | |||
| }, | |||
| onSuccess: function () { | |||
| notifySaveSuccess() | |||
| @@ -394,8 +394,17 @@ const UserInformationCard_Organization = ({ userData, loadDataFun, orgData }) => | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item lg={8}></Grid> | |||
| <Grid item xs={12} sm={12} md={12} lg={4}> | |||
| {FieldUtils.getComboField({ | |||
| label: intl.formatMessage({id: 'language'}) + ":", | |||
| valueName: "preferLocale", | |||
| dataList: ComboData.Locale, | |||
| getOptionLabel: (option) => option.label? option.label: "", | |||
| disabled: (!editMode), | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item lg={4}></Grid> | |||
| <Grid item lg={4}> | |||
| <Grid container alignItems={"center"}> | |||
| @@ -19,6 +19,7 @@ import { notifySaveSuccess, } from 'utils/CommonFunction'; | |||
| import {FormattedMessage, useIntl} from "react-intl"; | |||
| import {PNSPS_BUTTON_THEME} from "../../../themes/buttonConst"; | |||
| import {ThemeProvider} from "@emotion/react"; | |||
| import * as ComboData from "utils/ComboData"; | |||
| // import { | |||
| // isPrimaryLoggedIn, | |||
| @@ -67,6 +68,7 @@ const UserInformationCard_Organization_Pub = ({ userData, loadDataFun,}) => { | |||
| countryCode: values.tel_countryCode, | |||
| phoneNumber: values.phoneNumber | |||
| }, | |||
| preferLocale: values.preferLocale.type | |||
| }, | |||
| onSuccess: function () { | |||
| notifySaveSuccess() | |||
| @@ -202,6 +204,16 @@ const UserInformationCard_Organization_Pub = ({ userData, loadDataFun,}) => { | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| <Grid item xs={12} lg={12}> | |||
| {FieldUtils.getComboField({ | |||
| label: intl.formatMessage({id: 'language'}) + ":", | |||
| valueName: "preferLocale", | |||
| dataList: ComboData.Locale, | |||
| getOptionLabel: (option) => option.label? option.label: "", | |||
| disabled: (!editMode), | |||
| form: formik | |||
| })} | |||
| </Grid> | |||
| </Grid> | |||
| </div> | |||
| @@ -19,7 +19,7 @@ import ForwardIcon from '@mui/icons-material/Forward'; | |||
| import titleBackgroundImg from 'assets/images/dashboard/gazette-bar.png' | |||
| import { useNavigate } from 'react-router-dom'; | |||
| import * as ComboData from "utils/ComboData"; | |||
| import {getObjectByValue} from "utils/CommonFunction"; | |||
| import {getObjectByValue,getObjectByType} from "utils/CommonFunction"; | |||
| const BackgroundHead = { | |||
| backgroundImage: `url(${titleBackgroundImg})`, | |||
| @@ -139,6 +139,8 @@ const UserMaintainPage_Organization = () => { | |||
| response.data["faxNumber"] = response.data.faxNo?.faxNumber; | |||
| response.data["fax_countryCode"] = response.data.faxNo?.countryCode; | |||
| response.data["status"] = response.data?.locked?"locked":response.data?.status; | |||
| response.data["preferLocale"] = getObjectByType(ComboData.Locale, "type", response.data?.preferLocale); | |||
| //response.data["orgId"] = response.data.brExpiryDate?DateUtils.dateStr(response.data.brExpiryDate):""; | |||
| @@ -162,6 +164,7 @@ const UserMaintainPage_Organization = () => { | |||
| response.data["faxNumber"] = response.data.faxNo?.faxNumber; | |||
| response.data["fax_countryCode"] = response.data.faxNo?.countryCode; | |||
| response.data["preferLocale"] = getObjectByType(ComboData.Locale, "type", response.data?.preferLocale); | |||
| //response.data["orgId"] = response.data.brExpiryDate?DateUtils.dateStr(response.data.brExpiryDate):""; | |||
| setUserData(response.data); | |||
| @@ -46,7 +46,6 @@ const UserSearchForm = ({ applySearch }) => { | |||
| enName: data.fullenName, | |||
| post: data.post, | |||
| email: data.email, | |||
| phone: data.phone, | |||
| locked: locked, | |||
| }; | |||
| applySearch(temp); | |||
| @@ -136,18 +135,6 @@ const UserSearchForm = ({ applySearch }) => { | |||
| /> | |||
| </Grid> | |||
| <Grid item xs={9} s={6} md={5} lg={3} sx={{ ml: 3, mr: 3, mb: 3 }}> | |||
| <TextField | |||
| fullWidth | |||
| {...register("phone")} | |||
| id="phone" | |||
| label="Phone" | |||
| InputLabelProps={{ | |||
| shrink: true | |||
| }} | |||
| /> | |||
| </Grid> | |||
| <Grid item xs={9} s={6} md={5} lg={3} sx={{ ml: 3, mr: 3, mb: 3 }}> | |||
| <FormControlLabel | |||
| control={ | |||
| @@ -33,8 +33,10 @@ const UserSearchForm_Individual = ({ applySearch }) => { | |||
| fullName: data.fullenName, | |||
| email: data.email, | |||
| phone: data.phone, | |||
| accountFilter: accountFilter, | |||
| }; | |||
| if(accountFilter!="All"){ | |||
| temp["accountFilter"] = accountFilter; | |||
| } | |||
| applySearch(temp); | |||
| }; | |||
| @@ -113,7 +115,7 @@ const UserSearchForm_Individual = ({ applySearch }) => { | |||
| disablePortal | |||
| id="accountFilter" | |||
| size="small" | |||
| options={["Active", "Locked", "Not verified"]} | |||
| options={["All","Active", "Locked", "Not verified"]} | |||
| value={accountFilter} | |||
| onChange={(event, newValue) => { | |||
| if (newValue !== null) { | |||
| @@ -109,6 +109,10 @@ const AuthLoginCustom = () => { | |||
| // setLocale("zh-CN"); | |||
| localStorage.setItem('locale','zh-CN'); | |||
| } | |||
| if (response.data.preferLocale ==="en"){ | |||
| // setLocale("zh-CN"); | |||
| localStorage.setItem('locale','en'); | |||
| } | |||
| } | |||
| dispatch(handleLogin(data)) | |||
| navigate('/dashboard'); | |||
| @@ -118,7 +122,11 @@ const AuthLoginCustom = () => { | |||
| .catch((error) => { | |||
| // setSuccess(false) | |||
| setOnLogin(false) | |||
| setErrorMassage(error.response.data.error) | |||
| if(error.response!= undefined){ | |||
| setErrorMassage(error.response.data.error) | |||
| }else{ | |||
| setErrorMassage("CONNECTION_ERROR") | |||
| } | |||
| setOpen(true) | |||
| }); | |||
| } else { | |||
| @@ -303,13 +303,13 @@ const CustomFormWizard = (props) => { | |||
| selectedAddress4, selectedAddress5, | |||
| termsAndConAccept, termsAndConNotAccept, fileList]) | |||
| useEffect(()=>{ | |||
| useEffect(() => { | |||
| setDistrictErrStr(""); | |||
| if(selectedAddress5?.type === "hongKong"){ | |||
| if(selectedAddress4 ==null || selectedAddress4 == ""|| selectedAddress4 == {}) | |||
| if (selectedAddress5?.type === "hongKong") { | |||
| if (selectedAddress4 == null || selectedAddress4 == "" || selectedAddress4 == {}) | |||
| setDistrictErrStr(getRequiredErrStr("district")) | |||
| } | |||
| },[selectedAddress4, selectedAddress5]) | |||
| }, [selectedAddress4, selectedAddress5]) | |||
| useEffect(() => { | |||
| props.step == 2 ? _onSubmit() : null; | |||
| @@ -541,11 +541,11 @@ const CustomFormWizard = (props) => { | |||
| return <Typography variant="errorMessage1">{errorMsg}</Typography> | |||
| } | |||
| 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 }) + ": " : "" })); | |||
| } | |||
| 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 }) : "" })); | |||
| } | |||
| const formik = useFormik({ | |||
| @@ -581,14 +581,17 @@ const CustomFormWizard = (props) => { | |||
| .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(40, getMaxErrStr(40)).required(displayErrorMsg(intl.formatMessage({ id: 'userRequireEnglishName' }))), | |||
| chName: yup.string().max(6, getMaxErrStr(6)).required(displayErrorMsg(intl.formatMessage({ id: 'userRequireChineseName' }))), | |||
| enName: yup.string().max(40, getMaxErrStr(40)), | |||
| chName: yup.string().max(6, getMaxErrStr(6)).when('enName', { | |||
| is: (enName) => enName?false:true, | |||
| then: yup.string().required(displayErrorMsg(intl.formatMessage({ id: 'userRequireChineseName' }))) | |||
| }), | |||
| address1: yup.string().max(40, getMaxErrStr(40, "addressLine1")).required(displayErrorMsg(intl.formatMessage({ id: 'validateAddressLine1' }))), | |||
| address2: yup.string().max(40, getMaxErrStr(40, "addressLine2")), | |||
| address3: yup.string().max(40, getMaxErrStr(40, "addressLine3")), | |||
| 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' }))), | |||
| idNo: yup.string().required(displayErrorMsg(`${intl.formatMessage({ id: 'require' })}${selectedIdDocInputType}${intl.formatMessage({ id: 'number' })}`)) | |||
| idNo: yup.string().required(getRequiredErrStr('number')) | |||
| .matches(/^[aA-zZ0-9\s]+$/, { message: displayErrorMsg(`${selectedIdDocInputType}${intl.formatMessage({ id: 'noSpecialCharacter' })}`) }) | |||
| .matches(/^\S*$/, { message: displayErrorMsg(`${selectedIdDocInputType}${intl.formatMessage({ id: 'noSpace' })}`) }) | |||
| .test('checkIDCardFormat', displayErrorMsg(`${intl.formatMessage({ id: 'requiredValid' })}${selectedIdDocInputType}${intl.formatMessage({ id: 'number' })}`), function (value) { | |||
| @@ -648,7 +651,7 @@ const CustomFormWizard = (props) => { | |||
| // faxCountryCode: yup.string().min(3,'請輸入3位數字'), | |||
| phone: yup.string().min(8, displayErrorMsg(intl.formatMessage({ id: 'requireAtLeast8Number' }))).required(displayErrorMsg(intl.formatMessage({ id: 'requireContactNumber' }))), | |||
| // fax: yup.string().min(8,'請輸入8位數字'), | |||
| 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('請輸入有效驗證')), | |||
| }), | |||
| }); | |||
| @@ -934,7 +937,7 @@ const CustomFormWizard = (props) => { | |||
| /> | |||
| {formik.touched.idDocType && ( | |||
| selectedIdDocType === null || selectedIdDocType?.type == null ? | |||
| <FormHelperText error id="helper-text-idDocType-signup" sx={{fontSize:16,fontWeight: 'bold',}}> | |||
| <FormHelperText error id="helper-text-idDocType-signup" sx={{ fontSize: 16, fontWeight: 'bold', }}> | |||
| <FormattedMessage id="requireIdDocType" /> | |||
| </FormHelperText> : '' | |||
| )} | |||
| @@ -1067,12 +1070,17 @@ const CustomFormWizard = (props) => { | |||
| } | |||
| </Grid> | |||
| </Grid> | |||
| <Grid item xs={12} md={12}> | |||
| <Typography variant="subtitle1"> | |||
| (<FormattedMessage id="registerNameLabel" />) | |||
| </Typography> | |||
| </Grid> | |||
| <Grid item xs={12} md={6}> | |||
| <Stack spacing={1}> | |||
| <InputLabel htmlFor="enName-signup"> | |||
| <Typography variant="pnspsFormHeader"> | |||
| <FormattedMessage id="userEnglishName" /> | |||
| {selectedIdDocType.type === "CNID" ? "" : <span style={{ color: '#f10000' }}>*</span>} | |||
| {selectedIdDocType.type === "CNID" ? "" : <span style={{ color: '#f10000' }}></span>} | |||
| </Typography> | |||
| </InputLabel> | |||
| <OutlinedInput | |||
| @@ -1105,7 +1113,7 @@ const CustomFormWizard = (props) => { | |||
| <InputLabel htmlFor="chName-signup"> | |||
| <Typography variant="pnspsFormHeader"> | |||
| <FormattedMessage id="userChineseName" /> | |||
| <span style={{ color: '#f10000' }}>*</span> | |||
| <span style={{ color: '#f10000' }}></span> | |||
| </Typography> | |||
| </InputLabel> | |||
| <OutlinedInput | |||
| @@ -1199,7 +1207,7 @@ const CustomFormWizard = (props) => { | |||
| value={selectedAddress4} | |||
| options={ComboData.district} | |||
| disabled={checkCountry} | |||
| error={Boolean(districtErrStr!="")} | |||
| error={Boolean(districtErrStr != "")} | |||
| onBlur={formik.handleBlur} | |||
| getOptionLabel={(option) => option.type ? intl.formatMessage({ id: option.type }) : ""} | |||
| onChange={(event, newValue) => { | |||
| @@ -1252,7 +1260,7 @@ const CustomFormWizard = (props) => { | |||
| {formik.errors.address3} | |||
| </FormHelperText> | |||
| )} | |||
| {districtErrStr!= "" && ( | |||
| {districtErrStr != "" && ( | |||
| <FormHelperText error > | |||
| {districtErrStr} | |||
| </FormHelperText> | |||
| @@ -1685,8 +1693,8 @@ const CustomFormWizard = (props) => { | |||
| <FormattedMessage id="idDocType" />: | |||
| </Typography> | |||
| <Typography variant="pnspsFormHeader" name="preview-idDocType"> | |||
| {intl.formatMessage({ id: selectedIdDocType?.label??" " })} | |||
| {intl.formatMessage({ id: selectedIdDocType?.label ?? " " })} | |||
| </Typography> | |||
| </Stack> | |||
| </Grid> | |||
| @@ -29,22 +29,27 @@ const PasswordAlertDialog = (props) => { | |||
| <DialogTitle id="alert-dialog-title"> | |||
| <Stack mt={1} mr={4} direction="row" justifyContent="flex-start" alignItems="center" spacing={2}> | |||
| <CancelOutlinedIcon color="error" sx={{ width: "35px", height: "40px" }} /> | |||
| {props.errorMassage === 'ACCOUNT_LOCKED_ERROR' ? | |||
| <Stack direction="column"> | |||
| <Typography display="inline"> | |||
| 帳戶將被封鎖 | |||
| </Typography> | |||
| <Typography display="inline"> | |||
| 帳戶連續五次登入錯誤,請與系統管理員聯絡 | |||
| </Typography> | |||
| </Stack> : | |||
| props.errorMassage === 'ACCOUNT_VERIFIED_ERROR' ? | |||
| <Typography display="inline"> | |||
| 帳戶尚未驗證 | |||
| </Typography> : | |||
| <Typography display="inline"> | |||
| 用戶名或密碼錯誤 | |||
| </Typography> | |||
| { | |||
| props.errorMassage === 'ACCOUNT_LOCKED_ERROR' ? | |||
| <Stack direction="column"> | |||
| <Typography display="inline"> | |||
| <FormattedMessage id="loginErrorMessage1"/> | |||
| </Typography> | |||
| <Typography display="inline"> | |||
| <FormattedMessage id="loginErrorMessage2"/> | |||
| </Typography> | |||
| </Stack> : | |||
| props.errorMassage === 'ACCOUNT_VERIFIED_ERROR' ? | |||
| <Typography display="inline"> | |||
| <FormattedMessage id="loginErrorMessage3"/> | |||
| </Typography> : | |||
| props.errorMassage === 'CONNECTION_ERROR' ? | |||
| <Typography display="inline"> | |||
| <FormattedMessage id="loginErrorMessage4"/> | |||
| </Typography>: | |||
| <Typography display="inline"> | |||
| <FormattedMessage id="loginErrorMessage5"/> | |||
| </Typography> | |||
| } | |||
| </Stack> | |||
| </DialogTitle> | |||
| @@ -20,13 +20,26 @@ const DashboardDefault = () => { | |||
| backgroundColor: '#0C489E', | |||
| backgroundPosition: 'right' | |||
| } | |||
| const getWelcomeMsg=()=>{ | |||
| var current = new Date() | |||
| var curHr = current.getHours() | |||
| if (curHr < 12) { | |||
| return "Good Morning" | |||
| } else if (curHr < 18) { | |||
| return "Good Afternoon" | |||
| } else { | |||
| //evening | |||
| return "Good Evening" | |||
| } | |||
| } | |||
| return ( | |||
| <Grid container sx={{minHeight: '87vh', backgroundColor: "backgroundColor.default"}} direction="column"> | |||
| <Grid item xs={12}> | |||
| <div style={BackgroundHead}> | |||
| <Stack direction="row" height='70px' justifyContent="flex-start" alignItems="center"> | |||
| <Typography ml={15} color='#FFF' variant="h4" sx={{display: { xs: 'none', sm: 'none', md: 'block' }}}> | |||
| Morning, {userData.fullenName} | |||
| {getWelcomeMsg()}, {userData.fullenName} | |||
| </Typography> | |||
| </Stack> | |||
| </div> | |||
| @@ -35,6 +35,20 @@ const DashboardDefault = () => { | |||
| backgroundColor: '#0C489E', | |||
| backgroundPosition: 'right' | |||
| } | |||
| const getWelcomeMsg=()=>{ | |||
| var current = new Date() | |||
| var curHr = current.getHours() | |||
| if (curHr < 12) { | |||
| return <FormattedMessage id="welcomeMsg_am" /> | |||
| } else if (curHr < 18) { | |||
| return <FormattedMessage id="welcomeMsg_pm" /> | |||
| } else { | |||
| return <FormattedMessage id="welcomeMsg_night" /> | |||
| } | |||
| } | |||
| return ( | |||
| <Grid container sx={{ minHeight: '87vh' }} direction="column"> | |||
| <Grid item xs={12} > | |||
| @@ -42,7 +56,7 @@ const DashboardDefault = () => { | |||
| <Stack direction="row" height='70px' justifyContent="flex-start" alignItems="center"> | |||
| {/* <Typography variant="h5">我的公共啟事</Typography> */} | |||
| <Typography color='#FFF' variant="h5" sx={{ ml: 10, display: { xs: 'none', sm: 'none', md: 'block' } }}> | |||
| {isORGLoggedIn() ? userData.fullenName : userData.fullchName}, <FormattedMessage id="welcomeMsg" /> | |||
| {isORGLoggedIn() ? userData.fullenName : userData.fullchName}, {getWelcomeMsg()} | |||
| </Typography> | |||
| </Stack> | |||
| </div> | |||
| @@ -61,6 +61,10 @@ const Index = () => { | |||
| // setLocale("zh-CN"); | |||
| localStorage.setItem('locale','zh-CN'); | |||
| } | |||
| if (response.data.preferLocale ==="en"){ | |||
| // setLocale("zh-CN"); | |||
| localStorage.setItem('locale','en'); | |||
| } | |||
| } | |||
| dispatch(handleLogin(data)) | |||
| navigate('/dashboard'); | |||
| @@ -2,15 +2,16 @@ | |||
| "en": "English", | |||
| "zh-HK": "繁體中文", | |||
| "zh-CN": "简体中文", | |||
| "language":"Language", | |||
| "PNSPS": "PNSPS", | |||
| "HKSARGOV": "HKSAR Government", | |||
| "HKGLD": "Government Logistics Department", | |||
| "importantNotice": "Important Notice", | |||
| "privacyPolicy": "Privacy Policy", | |||
| "Gazette": "Gazette", | |||
| "gazetteDate": "GazetteDate", | |||
| "gazetteLength": "length", | |||
| "gazetteDate": "Gazette Date", | |||
| "gazetteLength": "Length", | |||
| "gazetteSampleName": "Gazette Supplement No. 6", | |||
| "reason": "Reason", | |||
| @@ -64,6 +65,8 @@ | |||
| "MSG.payMsg3": "If you have multiple public notice applications within the Year {issueYear}, Volume {issueVolume}, Issue {issueNo} of the Official Gazette, you can choose to merge the payment for all the approved manuscripts within this issue in 'My Public Notice' before the payment deadline.", | |||
| "MSG.proofOutOfTime": "Response out of time, please apply again.", | |||
| "MSG.plzSelectApp": "Please select application", | |||
| "MSG.actionFail": "Action failed", | |||
| "registerTitle1": "Become", | |||
| "registerTitle2": "Gazette Notice", | |||
| @@ -78,7 +81,7 @@ | |||
| "registerFail": "Application failed, please try again later", | |||
| "mainPage": "Main Page", | |||
| "myPublicNotice": "My Public Notice", | |||
| "myPublicNotice": "My Public Notices", | |||
| "publicNotice": "Public Notice", | |||
| "publicNoticePayment": "Public Notice: Payment", | |||
| "publicNoticePaymentFail": "Public Notice: Payment Failed", | |||
| @@ -93,7 +96,10 @@ | |||
| "onlinePaymentHistory": "Online Payment History", | |||
| "setting": "Settings", | |||
| "companyOrUserRecord": "Company/Institutional User Records", | |||
| "welcomeMsg": "Good afternoon! Please select the required service.", | |||
| "welcomeMsg_am": "Good morning! Please select the required service.", | |||
| "welcomeMsg_pm": "Good afternoon! Please select the required service.", | |||
| "welcomeMsg_night": "Good evening! Please select the required service.", | |||
| "login": "Login", | |||
| "logout": "Logout", | |||
| @@ -105,6 +111,13 @@ | |||
| "register": "Register", | |||
| "userLoginName": "Username", | |||
| "userPassword": "Password", | |||
| "loginErrorMessage1":"Account will be blocked", | |||
| "loginErrorMessage2":"Account login errors for Five Consecutive Times, please contact the system administrator", | |||
| "loginErrorMessage3":"Account has not been Verified", | |||
| "loginErrorMessage4":"System Connection Failed", | |||
| "loginErrorMessage5":"Incorrect Username or Password", | |||
| "newPassword": "New Password", | |||
| "setNewPassword": "Please enter new password", | |||
| "forgotUserPassword": "Forgot Password", | |||
| @@ -137,6 +150,7 @@ | |||
| "registerNewBusinessUser": "Apply as organisation/company user", | |||
| "becomeNewBusinessUser": "Become New Organisation/Company user", | |||
| "userName": "Username", | |||
| "registerNameLabel": "Please provide either an English name or a Chinese name, at a minimum.", | |||
| "userChineseName": "Chinese Name", | |||
| "userEnglishName": "English Name", | |||
| "userContactName": "Name", | |||
| @@ -312,12 +326,13 @@ | |||
| "price": "Price", | |||
| "pay": "Pay", | |||
| "payDate": "Payment Date", | |||
| "payDateFrom": "Payment date (from)", | |||
| "payDateFrom": "Payment Date (from)", | |||
| "payStatus": "Payment Status", | |||
| "payId": "Payment Code", | |||
| "payConfirm": "Confirm payment", | |||
| "payCancel": "Cancel payment", | |||
| "payTotal": "Payment total", | |||
| "payTotalDeatail": "Total Payment Amount", | |||
| "payTotal": "Total", | |||
| "payDetail": "Payment Details", | |||
| "payMethod": "Payment method", | |||
| "selectPaymentMethod": "Please select a payment method", | |||
| @@ -331,8 +346,9 @@ | |||
| "totalAmount": "Total Amount", | |||
| "close": "Close", | |||
| "confirm": "Confirm", | |||
| "terms": "Terms", | |||
| "particulars": "Particulars", | |||
| "currencyPrice": "Price", | |||
| "currencyAmount": "Amount", | |||
| "transactionRefNo": "Transaction Reference Number", | |||
| "selectedPaymentMethod": "Selected payment method", | |||
| "paymentMethodNotAvailable":"The payment function is currently not available", | |||
| @@ -342,7 +358,7 @@ | |||
| "publicNoticeDetailTitle": "Public Notice Application Information", | |||
| "applyPerson": "Applicant", | |||
| "applyStatus": "Application Status", | |||
| "applyStatus": "App. Status", | |||
| "gazetteCount": "Gazette issues number", | |||
| "gazetteCount2" :"Gazette issues number / Remarks", | |||
| "gazetteCount2_1" :"Care Of / Remarks", | |||
| @@ -383,7 +399,7 @@ | |||
| "transactionNo": "Transaction number", | |||
| "transactionDate": "Transaction date", | |||
| "transactionTime": "Transaction time", | |||
| "paymentRefCode": "Payment Reference Number", | |||
| "paymentRefCode": "Payment reference number", | |||
| "paymentInfoRecord": "Payment Notice Record", | |||
| "paymentRecordId": "Payment record number", | |||
| @@ -434,9 +450,9 @@ | |||
| "organizationProfile": "Organisation Profile", | |||
| "organizationDetails": "Organisation Details", | |||
| "brNo": "BR No.", | |||
| "creditorAccount": "Creditor account", | |||
| "creditorAccount": "Credit Client", | |||
| "nameEng": "Name (Eng)", | |||
| "nameChi": "Name (Ch)", | |||
| "nameChi": "Name (Chi)", | |||
| "expiryDate": "Expiry date", | |||
| "create": "Create", | |||
| "confirmTo": "Confirm to ", | |||
| @@ -2,6 +2,7 @@ | |||
| "en": "English", | |||
| "zh-HK": "繁體中文", | |||
| "zh-CN": "简体中文", | |||
| "language":"語言", | |||
| "PNSPS": "公共启事提交及缴费系统", | |||
| "HKSARGOV": "香港特别行政区政府", | |||
| @@ -11,7 +12,7 @@ | |||
| "Gazette": "宪报", | |||
| "gazetteDate": "宪报日期", | |||
| "gazetteLength": "长度", | |||
| "gazetteSampleName": "宪报第6号副刊公告", | |||
| "gazetteSampleName": "宪报第6号副刊公共启事", | |||
| "reason": "原因", | |||
| "payInstantly": "即时网上缴费", | |||
| @@ -63,9 +64,11 @@ | |||
| "MSG.payMsg3": "如你在宪报期数{issueYear} 年{issueVolume} 卷, 第{issueNo} 期内有多于一个公共启事的申请,你可选择完成所有此期所有稿件校对确定后,于缴费期限前在「我的公共启事」内合并付款。 ", | |||
| "MSG.proofOutOfTime": "回覆逾时,请重新申请。", | |||
| "MSG.plzSelectApp": "请选择公共启事。", | |||
| "MSG.actionFail": "行动失败", | |||
| "registerTitle1": "立即成为", | |||
| "registerTitle2": "宪报刊登公告", | |||
| "registerTitle2": "宪报刊登公共启事", | |||
| "registerTitle3": "用户", | |||
| "registerSubTitle": "只需4-5分钟", | |||
| "or": "或", | |||
| @@ -92,7 +95,9 @@ | |||
| "onlinePaymentHistory": "网上付款记录", | |||
| "setting": "设置", | |||
| "companyOrUserRecord": "公司/机构用户记录", | |||
| "welcomeMsg": "午安! 请选择所需服务。", | |||
| "welcomeMsg_am": "早安! 请选择所需服务。", | |||
| "welcomeMsg_pm": "午安! 请选择所需服务。", | |||
| "welcomeMsg_night": "晚安! 请选择所需服务。", | |||
| "login": "登录", | |||
| "logout": "登出", | |||
| @@ -104,6 +109,13 @@ | |||
| "register": "申请", | |||
| "userLoginName": "用户登入名称", | |||
| "userPassword": "密码", | |||
| "loginErrorMessage1":"帐户将被封锁", | |||
| "loginErrorMessage2":"帐户连续五次登入错误,请与系统管理员联络", | |||
| "loginErrorMessage3":"帐户尚未验证", | |||
| "loginErrorMessage4":"系统连接失败", | |||
| "loginErrorMessage5":"用户名或密码错误", | |||
| "newPassword": "新密码", | |||
| "setNewPassword": "请输入新密码", | |||
| "forgotUserPassword": "忘记密码", | |||
| @@ -132,6 +144,7 @@ | |||
| "registerNewBusinessUser": "申请机构/公司用户", | |||
| "becomeNewBusinessUser": "成为新的机构/公司用户", | |||
| "userName": "用户名称", | |||
| "registerNameLabel": "请至少输入英文姓名或中文姓名。", | |||
| "userChineseName": "中文姓名", | |||
| "userEnglishName": "英文姓名", | |||
| "userContactName": "姓名", | |||
| @@ -312,6 +325,7 @@ | |||
| "payId": "付款编号", | |||
| "payConfirm": "确认付款", | |||
| "payCancel": "取消付款", | |||
| "payTotalDeatail": "付款总额", | |||
| "payTotal": "付款总额", | |||
| "payDetail": "付款详情", | |||
| "payMethod": "付款方式", | |||
| @@ -326,8 +340,9 @@ | |||
| "totalAmount": "总额", | |||
| "close": "关闭", | |||
| "confirm": "确认", | |||
| "terms": "项目", | |||
| "particulars": "项目", | |||
| "currencyPrice": "金额", | |||
| "currencyAmount": "金额", | |||
| "transactionRefNo": "交易參考編號", | |||
| "selectedPaymentMethod": "已選擇付款方法", | |||
| "paymentMethodNotAvailable":"付款功能現在不可用", | |||
| @@ -400,8 +415,8 @@ | |||
| "submitApplication": "提交公共启事申请", | |||
| "applicationSubheading": "提供你的启事内容作排版,校对及计价。", | |||
| "announcement": "公告", | |||
| "viewAllAnnouncement": "显示所有公告", | |||
| "announcement": "公共启事", | |||
| "viewAllAnnouncement": "显示所有公共启事", | |||
| "systemMessage": "系统消息", | |||
| "viewAllSystemMessage": "显示所有消息", | |||
| "msgDetails": "消息详情", | |||
| @@ -2,6 +2,7 @@ | |||
| "en": "English", | |||
| "zh-HK": "繁體中文", | |||
| "zh-CN": "简体中文", | |||
| "language":"語言", | |||
| "PNSPS": "公共啟事提交及繳費系統", | |||
| "HKSARGOV": "香港特別行政區政府", | |||
| @@ -11,7 +12,7 @@ | |||
| "Gazette": "憲報", | |||
| "gazetteDate": "憲報日期", | |||
| "gazetteLength": "長度", | |||
| "gazetteSampleName": "憲報第6號副刊公告", | |||
| "gazetteSampleName": "憲報第6號副刊公共啟事", | |||
| "reason": "原因", | |||
| "payInstantly": "即時網上繳費", | |||
| @@ -63,9 +64,11 @@ | |||
| "MSG.payMsg3": "如你在憲報期數 {issueYear} 年 {issueVolume} 卷, 第 {issueNo} 期內有多於一個公共啟事的申請,你可選擇完成所有此期所有稿件校對確定後,於繳費期限前在「我的公共啟事」內合併付款。", | |||
| "MSG.proofOutOfTime": "回覆逾時,請重新申請。", | |||
| "MSG.plzSelectApp": "請選擇公共啟事。", | |||
| "MSG.actionFail": "行動失敗", | |||
| "registerTitle1": "立即成為", | |||
| "registerTitle2": "憲報刊登公告", | |||
| "registerTitle2": "憲報刊登公共啟事", | |||
| "registerTitle3": "用戶", | |||
| "registerSubTitle": "只需4-5分鐘", | |||
| "or": "或", | |||
| @@ -92,7 +95,9 @@ | |||
| "onlinePaymentHistory": "網上付款記錄", | |||
| "setting": "設定", | |||
| "companyOrUserRecord": "公司/機構用戶記錄", | |||
| "welcomeMsg": "午安! 請選擇所需服務。", | |||
| "welcomeMsg_am": "早安! 請選擇所需服務。", | |||
| "welcomeMsga_pm": "午安! 請選擇所需服務。", | |||
| "welcomeMsg_night": "晚安! 請選擇所需服務。", | |||
| "login": "登入", | |||
| "logout": "登出", | |||
| @@ -104,6 +109,13 @@ | |||
| "register": "申請", | |||
| "userLoginName": "用戶登入名稱", | |||
| "userPassword": "密碼", | |||
| "loginErrorMessage1":"帳戶將被封鎖", | |||
| "loginErrorMessage2":"帳戶連續五次登入錯誤,請與系統管理員聯絡", | |||
| "loginErrorMessage3":"帳戶尚未驗證", | |||
| "loginErrorMessage4":"系統連接失敗", | |||
| "loginErrorMessage5":"用戶名或密碼錯誤", | |||
| "newPassword": "新密碼", | |||
| "setNewPassword": "請輸入新密碼", | |||
| "forgotUserPassword": "忘記密碼", | |||
| @@ -112,10 +124,8 @@ | |||
| "forgotPasswordSubTitle": "請輸入你的用戶登入名稱以重設密碼", | |||
| "forgotPasswordSubTitle1": "請輸入你的用戶登入名稱", | |||
| "forgotPasswordSubTitle2": "以重設密碼", | |||
| "forgotUsernameSubTitle": "請輸入你的電郵以重設密碼", | |||
| "forgotUsernameSubTitle1": "請輸入你的電郵", | |||
| "resetPasswordSuccess": "已成功重設密碼。", | |||
| "securityCode": "安全驗證碼", | |||
| "sentSecurityCode1": "我們已將驗證碼送至你的電郵:", | |||
| @@ -137,6 +147,7 @@ | |||
| "registerNewBusinessUser": "申請機構/公司用戶", | |||
| "becomeNewBusinessUser": "成為新的機構/公司用戶", | |||
| "userName": "用戶名稱", | |||
| "registerNameLabel": "請至少輸入英文姓名或中文姓名。", | |||
| "userChineseName": "中文姓名", | |||
| "userEnglishName": "英文姓名", | |||
| "userContactName": "姓名", | |||
| @@ -317,6 +328,7 @@ | |||
| "payId": "付款編號", | |||
| "payConfirm": "確認付款", | |||
| "payCancel": "取消付款", | |||
| "payTotalDeatail": "付款總額", | |||
| "payTotal": "付款總額", | |||
| "payDetail": "付款詳情", | |||
| "payMethod": "付款方式", | |||
| @@ -331,8 +343,9 @@ | |||
| "totalAmount": "總額", | |||
| "close": "關閉", | |||
| "confirm": "確認", | |||
| "terms": "項目", | |||
| "particulars": "項目", | |||
| "currencyPrice": "金額", | |||
| "currencyAmount": "金額", | |||
| "transactionRefNo": "交易參考編號", | |||
| "selectedPaymentMethod": "已選擇付款方法", | |||
| "paymentMethodNotAvailable":"付款功能現在不可用", | |||
| @@ -405,8 +418,8 @@ | |||
| "submitApplication": "提交公共啟事申請", | |||
| "applicationSubheading": "提供你的啟事內容作排版,校對及計價。", | |||
| "announcement": "公告", | |||
| "viewAllAnnouncement": "顯示所有公告", | |||
| "announcement": "通告", | |||
| "viewAllAnnouncement": "顯示所有通告", | |||
| "systemMessage": "系統消息", | |||
| "viewAllSystemMessage": "顯示所有消息", | |||
| "msgDetails": "消息詳情", | |||
| @@ -122,6 +122,12 @@ export const denmandNoteStatus_Public = [ | |||
| export const CreditorStatus = [ | |||
| { key: 0, labelCht: '全部', label: 'All', type: 'all' }, | |||
| { key: 1, labelCht: '債權人', label:'Creditor', type: 'true' }, | |||
| { key: 2, labelCht: '非債權人', label:'No-Creditor', type: 'false' }, | |||
| { key: 1, labelCht: '債權人', label:'Credit Client', type: 'true' }, | |||
| { key: 2, labelCht: '非債權人', label:'Non-Credit Client', type: 'false' }, | |||
| ]; | |||
| export const Locale = [ | |||
| { id: 1, key: 1, label: 'English', type: 'en' }, | |||
| { id: 2, key: 2, label: '繁體中文', type: 'zh_HK' }, | |||
| { id: 3, key: 3, label: '简体中文', type: 'zh_CN' }, | |||
| ]; | |||
| @@ -30,7 +30,19 @@ export function getObjectByValue(list, valueName, value) { | |||
| const obj = list.find((element) => { | |||
| return element[valueName] === parseInt(value); | |||
| }); | |||
| console.log(obj); | |||
| // console.log(obj); | |||
| return obj === undefined || Object.keys(obj).length <= 0 ? null : obj | |||
| } | |||
| export function getObjectByType(list, valueName, value) { | |||
| // console.log(list) | |||
| // console.log(valueName) | |||
| // console.log(value) | |||
| const obj = list.find((element) => { | |||
| // console.log(element[valueName]) | |||
| return element[valueName] === value; | |||
| }); | |||
| // console.log(obj); | |||
| return obj === undefined || Object.keys(obj).length <= 0 ? null : obj | |||
| } | |||
| @@ -21,7 +21,7 @@ export function getStatusByText(status, creditor) { | |||
| return getStatusTag({ color: "#22a13f", text: "待付款" }) | |||
| case "paid": | |||
| return getStatusTag({ color: "#22a13f", text: "待發佈" }) | |||
| case "complated": | |||
| case "completed": | |||
| return getStatusTag({ color: "#8a8784", text: "已完成" }) | |||
| case "notAccepted": | |||
| return getStatusTag({ color: "#d9372b", text: "不接受" }) | |||
| @@ -54,7 +54,7 @@ export function getStatusByTextEng(status, creditor) { | |||
| return getStatusTag({ color: "#F39C12", text: "Pending Payment" }) | |||
| case "paid": | |||
| return getStatusTag({ color: "#3498DB", text: "Pending Publish" }) | |||
| case "complated": | |||
| case "completed": | |||
| return getStatusTag({ color: "#8a8784", text: "Completed" }) | |||
| case "notAccepted": | |||
| return getStatusTag({ color: "#d9372b", text: "Not accepted" }) | |||
| @@ -88,7 +88,7 @@ export function getStatusByTextIntl(status, creditor, intl) { | |||
| return getStatusTag({ color: "#22a13f", text: intl.formatMessage({id: 'pendingPayment'}) }) | |||
| case "paid": | |||
| return getStatusTag({ color: "#22a13f", text: intl.formatMessage({id: 'pendingPublish'}) }) | |||
| case "complated": | |||
| case "completed": | |||
| return getStatusTag({ color: "#8a8784", text: intl.formatMessage({id: 'completed'}) }) | |||
| case "notAccepted": | |||
| return getStatusTag({ color: "#d9372b", text: intl.formatMessage({id: 'notAccepted'}) }) | |||