@@ -119,7 +119,7 @@ const ApplicationDetailCard = ( | |||||
handlePaymentCheck(appIdList) | handlePaymentCheck(appIdList) | ||||
return; | return; | ||||
} | } | ||||
setErrorText("公共啟事申請已過期"); | |||||
setErrorText(intl.formatMessage({ id: "MSG.expiredApp" })); | |||||
setErrorPopUp(true); | setErrorPopUp(true); | ||||
} | } | ||||
}); | }); | ||||
@@ -693,7 +693,7 @@ const ApplicationDetailCard = ( | |||||
}} | }} | ||||
> | > | ||||
<DialogTitle></DialogTitle> | <DialogTitle></DialogTitle> | ||||
<Typography variant="h2" style={{ padding: '16px' }}>行動失敗</Typography> | |||||
<Typography variant="h2" style={{ padding: '16px' }}><FormattedMessage id="MSG.actionFail" /></Typography> | |||||
<DialogContent style={{ display: 'flex', }}> | <DialogContent style={{ display: 'flex', }}> | ||||
<Stack direction="column" justifyContent="space-between"> | <Stack direction="column" justifyContent="space-between"> | ||||
{ | { | ||||
@@ -1,19 +1,35 @@ | |||||
// material-ui | // material-ui | ||||
import * as React from 'react'; | import * as React from 'react'; | ||||
import { | import { | ||||
Button | |||||
Button, | |||||
Grid, | |||||
Typography, | |||||
Stack, | |||||
Dialog, DialogTitle, DialogContent, DialogActions, | |||||
} from '@mui/material'; | } from '@mui/material'; | ||||
import * as UrlUtils from "utils/ApiPathConst"; | |||||
import * as HttpUtils from "utils/HttpUtils"; | |||||
import * as DateUtils from "utils/DateUtils"; | import * as DateUtils from "utils/DateUtils"; | ||||
import * as FormatUtils from "utils/FormatUtils"; | import * as FormatUtils from "utils/FormatUtils"; | ||||
import * as StatusUtils from "utils/statusUtils/PublicNoteStatusUtils"; | import * as StatusUtils from "utils/statusUtils/PublicNoteStatusUtils"; | ||||
import { useNavigate } from "react-router-dom"; | import { useNavigate } from "react-router-dom"; | ||||
import { FiDataGrid } from "components/FiDataGrid"; | import { FiDataGrid } from "components/FiDataGrid"; | ||||
import { notifyActionSuccess } from 'utils/CommonFunction'; | |||||
import { FormattedMessage, useIntl } from "react-intl"; | |||||
// ==============================|| EVENT TABLE ||============================== // | // ==============================|| EVENT TABLE ||============================== // | ||||
export default function SearchPublicNoticeTable({ recordList }) { | |||||
export default function SearchPublicNoticeTable({ recordList, reloadFunction }) { | |||||
const [rows, setRows] = React.useState(recordList); | const [rows, setRows] = React.useState(recordList); | ||||
const navigate = useNavigate() | const navigate = useNavigate() | ||||
const [selectedRowItems, setSelectedRowItems] = React.useState([]); | |||||
const [isConfirmPopUp, setIsConfirmPopUp] = React.useState(false); | |||||
const [isWarningPopUp, setIsWarningPopUp] = React.useState(false); | |||||
const intl = useIntl(); | |||||
React.useEffect(() => { | React.useEffect(() => { | ||||
setRows(recordList); | setRows(recordList); | ||||
}, [recordList]); | }, [recordList]); | ||||
@@ -57,7 +73,7 @@ export default function SearchPublicNoticeTable({ recordList }) { | |||||
headerName: 'Contact Person', | headerName: 'Contact Person', | ||||
flex: 2, | flex: 2, | ||||
renderCell: (params) => { | renderCell: (params) => { | ||||
let company = params.row.enCompanyName != null?params.row.enCompanyName: params.row.chCompanyName; | |||||
let company = params.row.enCompanyName != null ? params.row.enCompanyName : params.row.chCompanyName; | |||||
company = company != null ? company : ""; | company = company != null ? company : ""; | ||||
/* | /* | ||||
@@ -109,9 +125,55 @@ export default function SearchPublicNoticeTable({ recordList }) { | |||||
navigate('/application/' + params.id); | navigate('/application/' + params.id); | ||||
} | } | ||||
return ( | |||||
<div style={{width: '100%' }}> | |||||
const doPublish = () => { | |||||
setIsConfirmPopUp(false); | |||||
let appIdList = []; | |||||
const datas = rows?.filter((row) => | |||||
selectedRowItems.includes(row.id) | |||||
); | |||||
// console.log(datas) | |||||
for (var i = 0; i < datas?.length; i++) { | |||||
appIdList.push(datas[i].id); | |||||
} | |||||
if(appIdList.length<1){ | |||||
setIsWarningPopUp(true); | |||||
}else{ | |||||
HttpUtils.post({ | |||||
url: UrlUtils.SET_PUBLIC_NOTICE_STATUS_PUBLISH_BULK, | |||||
params: { | |||||
ids: appIdList | |||||
}, | |||||
onSuccess: () => { | |||||
reloadFunction() | |||||
notifyActionSuccess("Action Success!") | |||||
} | |||||
}); | |||||
} | |||||
} | |||||
return (<> | |||||
<div style={{ width: '100%' }}> | |||||
<Grid container direction="row" justifyContent="flex-start" alignItems="center" sx={{ p: 1 }} > | |||||
<Button | |||||
variant="contained" | |||||
onClick={()=>setIsConfirmPopUp(true)} | |||||
> | |||||
Published | |||||
</Button> | |||||
</Grid> | |||||
<FiDataGrid | <FiDataGrid | ||||
checkboxSelection | |||||
disableRowSelectionOnClick | |||||
onRowSelectionModelChange={(newSelection) => { | |||||
setSelectedRowItems(newSelection); | |||||
}} | |||||
isRowSelectable={(params) => { | |||||
return ((params.row.creditor === true && params.row.status == "confirmed") || | |||||
(params.row.creditor === false && params.row.status == "paid")) | |||||
}} | |||||
rows={rows} | rows={rows} | ||||
columns={columns} | columns={columns} | ||||
customPageSize={10} | customPageSize={10} | ||||
@@ -119,5 +181,63 @@ export default function SearchPublicNoticeTable({ recordList }) { | |||||
onRowDoubleClick={handleRowDoubleClick} | onRowDoubleClick={handleRowDoubleClick} | ||||
/> | /> | ||||
</div> | </div> | ||||
<div> | |||||
<Dialog | |||||
open={isConfirmPopUp} | |||||
onClose={() => setIsConfirmPopUp(false)} | |||||
PaperProps={{ | |||||
sx: { | |||||
minWidth: '40vw', | |||||
maxWidth: { xs: '90vw', s: '90vw', m: '70vw', lg: '30vw' }, | |||||
maxHeight: { xs: '90vh', s: '70vh', m: '70vh', lg: '50vh' } | |||||
} | |||||
}} | |||||
> | |||||
<DialogTitle> | |||||
<Typography variant="h3" > | |||||
<FormattedMessage id="confirm" /> | |||||
</Typography> | |||||
</DialogTitle> | |||||
<DialogContent style={{ display: 'flex', }}> | |||||
<Stack direction="column" justifyContent="space-between"> | |||||
<Typography variant="h4" style={{ padding: '16px' }}>Please Confirm to mark selected application as Published.</Typography> | |||||
</Stack> | |||||
</DialogContent> | |||||
<DialogActions> | |||||
<Button onClick={() => setIsConfirmPopUp(false)} aria-label={intl.formatMessage({ id: 'close' })}> | |||||
<Typography variant="h5"> | |||||
<FormattedMessage id="close" /> | |||||
</Typography></Button> | |||||
<Button onClick={()=>doPublish()} aria-label={intl.formatMessage({ id: 'confirm' })}> | |||||
<Typography variant="h5"> | |||||
<FormattedMessage id="confirm" /> | |||||
</Typography></Button> | |||||
</DialogActions> | |||||
</Dialog> | |||||
</div> | |||||
<div> | |||||
<Dialog | |||||
open={isWarningPopUp} | |||||
onClose={() => setIsWarningPopUp(false)} | |||||
PaperProps={{ | |||||
sx: { | |||||
minWidth: '40vw', | |||||
maxWidth: { xs: '90vw', s: '90vw', m: '70vw', lg: '70vw' }, | |||||
maxHeight: { xs: '90vh', s: '70vh', m: '70vh', lg: '60vh' } | |||||
} | |||||
}} | |||||
> | |||||
<DialogTitle><Typography variant="h3">Warning</Typography></DialogTitle> | |||||
<DialogContent style={{ display: 'flex', }}> | |||||
<Typography variant="h4" style={{ padding: '16px' }}>{intl.formatMessage({ id: "MSG.plzSelectApp" })}</Typography> | |||||
</DialogContent> | |||||
<DialogActions> | |||||
<Button onClick={() => setIsWarningPopUp(false)}><Typography variant="h5">OK</Typography></Button> | |||||
</DialogActions> | |||||
</Dialog> | |||||
</div> | |||||
</> | |||||
); | ); | ||||
} | } |
@@ -5,8 +5,8 @@ import { | |||||
Stack | Stack | ||||
} from '@mui/material'; | } from '@mui/material'; | ||||
import MainCard from "components/MainCard"; | import MainCard from "components/MainCard"; | ||||
import * as UrlUtils from "utils/ApiPathConst"; | |||||
import * as React from "react"; | import * as React from "react"; | ||||
import * as UrlUtils from "utils/ApiPathConst"; | |||||
import * as HttpUtils from "utils/HttpUtils"; | import * as HttpUtils from "utils/HttpUtils"; | ||||
import * as DateUtils from "utils/DateUtils"; | import * as DateUtils from "utils/DateUtils"; | ||||
@@ -40,7 +40,7 @@ const UserSearchPage_Individual = () => { | |||||
const [onReady, setOnReady] = React.useState(false); | const [onReady, setOnReady] = React.useState(false); | ||||
React.useEffect(() => { | React.useEffect(() => { | ||||
getUserList(); | |||||
getDataList(); | |||||
getOrgCombo(); | getOrgCombo(); | ||||
getIssueCombo(); | getIssueCombo(); | ||||
}, []); | }, []); | ||||
@@ -50,10 +50,10 @@ const UserSearchPage_Individual = () => { | |||||
}, [record]); | }, [record]); | ||||
React.useEffect(() => { | React.useEffect(() => { | ||||
getUserList(); | |||||
getDataList(); | |||||
}, [searchCriteria]); | }, [searchCriteria]); | ||||
function getUserList() { | |||||
function getDataList() { | |||||
HttpUtils.get({ | HttpUtils.get({ | ||||
url: UrlUtils.GET_PUBLIC_NOTICE_LIST, | url: UrlUtils.GET_PUBLIC_NOTICE_LIST, | ||||
params: searchCriteria, | params: searchCriteria, | ||||
@@ -122,6 +122,7 @@ const UserSearchPage_Individual = () => { | |||||
> | > | ||||
<EventTable | <EventTable | ||||
recordList={record} | recordList={record} | ||||
reloadFunction={getDataList} | |||||
/> | /> | ||||
</MainCard> | </MainCard> | ||||
</Grid> | </Grid> | ||||
@@ -37,6 +37,7 @@ | |||||
"MSG.registerPersonal": "To complete the online application, you need to upload digital copies of identification documents.<br/>e.g. Hong Kong Identity Card, Passport, Mainland China Identity Card, Professional Practicing Certificate, etc.", | "MSG.registerPersonal": "To complete the online application, you need to upload digital copies of identification documents.<br/>e.g. Hong Kong Identity Card, Passport, Mainland China Identity Card, Professional Practicing Certificate, etc.", | ||||
"MSG.registerOrg": "You need to upload the proof documents for the online application.<br/>e.g. Business Registration Certificate, Professional Practicing Certificate, etc.", | "MSG.registerOrg": "You need to upload the proof documents for the online application.<br/>e.g. Business Registration Certificate, Professional Practicing Certificate, etc.", | ||||
"MSG.paymentMsg": "Your application and payment have been received", | "MSG.paymentMsg": "Your application and payment have been received", | ||||
"MSG.expiredApp": "Public notice application has expired", | |||||
"MSG.paymentCancelMsg1": "Payment cancellation message:", | "MSG.paymentCancelMsg1": "Payment cancellation message:", | ||||
"MSG.paymentCancelMsg2": "Your payment has been cancelled. We have received your payment request, but due to certain reasons, the payment could not be processed. Please take note of the following:", | "MSG.paymentCancelMsg2": "Your payment has been cancelled. We have received your payment request, but due to certain reasons, the payment could not be processed. Please take note of the following:", | ||||
@@ -37,6 +37,7 @@ | |||||
"MSG.registerPersonal": "需上载身份证明文件数码档案以进行网上申请。 <br/>如:香港身份证; 护照; 中国内地身份证; 专业执业证书等", | "MSG.registerPersonal": "需上载身份证明文件数码档案以进行网上申请。 <br/>如:香港身份证; 护照; 中国内地身份证; 专业执业证书等", | ||||
"MSG.registerOrg": "需上载以下任何一份证明文件以进行网上申请。 <br/>如:商业登记证;专业执业证书", | "MSG.registerOrg": "需上载以下任何一份证明文件以进行网上申请。 <br/>如:商业登记证;专业执业证书", | ||||
"MSG.paymentMsg": "你的申请和付款已收到", | "MSG.paymentMsg": "你的申请和付款已收到", | ||||
"MSG.expiredApp": "公共启事申请已过期", | |||||
"MSG.paymentCancelMsg1": "付款取消讯息:", | "MSG.paymentCancelMsg1": "付款取消讯息:", | ||||
"MSG.paymentCancelMsg2": "你的付款已被取消。我们收到了你的付款请求,但由于某些原因,付款无法完成。请注意以下事项:", | "MSG.paymentCancelMsg2": "你的付款已被取消。我们收到了你的付款请求,但由于某些原因,付款无法完成。请注意以下事项:", | ||||
@@ -37,6 +37,7 @@ | |||||
"MSG.registerPersonal": "需上載身份證明文件數碼檔案以進行網上申請。<br/>如:香港身份證; 護照; 中國內地身份證; 專業執業証書等", | "MSG.registerPersonal": "需上載身份證明文件數碼檔案以進行網上申請。<br/>如:香港身份證; 護照; 中國內地身份證; 專業執業証書等", | ||||
"MSG.registerOrg": "需上載以下任何一份證明文件以進行網上申請。<br/>如:商業登記證;專業執業證書", | "MSG.registerOrg": "需上載以下任何一份證明文件以進行網上申請。<br/>如:商業登記證;專業執業證書", | ||||
"MSG.paymentMsg": "你的申請和付款已收到", | "MSG.paymentMsg": "你的申請和付款已收到", | ||||
"MSG.expiredApp": "公共啟事申請已過期", | |||||
"MSG.paymentCancelMsg1": "付款取消訊息:", | "MSG.paymentCancelMsg1": "付款取消訊息:", | ||||
"MSG.paymentCancelMsg2": "你的付款已被取消。我們收到了你的付款請求,但由於某些原因,付款無法完成。請注意以下事項:", | "MSG.paymentCancelMsg2": "你的付款已被取消。我們收到了你的付款請求,但由於某些原因,付款無法完成。請注意以下事項:", | ||||
@@ -116,6 +116,7 @@ export const SET_PUBLIC_NOTICE_STATUS_WITHDRAW = apiPath+'/application/applicati | |||||
export const SET_PUBLIC_NOTICE_STATUS_RESUBMIT = apiPath+'/application/application-detail-status-resubmit'; | export const SET_PUBLIC_NOTICE_STATUS_RESUBMIT = apiPath+'/application/application-detail-status-resubmit'; | ||||
export const SET_PUBLIC_NOTICE_STATUS_REVIEWED = apiPath+'/application/application-detail-status-reviewed'; | export const SET_PUBLIC_NOTICE_STATUS_REVIEWED = apiPath+'/application/application-detail-status-reviewed'; | ||||
export const SET_PUBLIC_NOTICE_STATUS_PUBLISH = apiPath+'/application/application-detail-status-publish'; | export const SET_PUBLIC_NOTICE_STATUS_PUBLISH = apiPath+'/application/application-detail-status-publish'; | ||||
export const SET_PUBLIC_NOTICE_STATUS_PUBLISH_BULK = apiPath+'/application/application-detail-status-publish-bulk'; | |||||
export const UPDATE_PUBLIC_NOTICE_APPLY_DETAIL = apiPath+'/application/save'; | export const UPDATE_PUBLIC_NOTICE_APPLY_DETAIL = apiPath+'/application/save'; | ||||
export const GET_AUDIT_LOG_LIST = apiPath+'/settings/auditLogList'; | export const GET_AUDIT_LOG_LIST = apiPath+'/settings/auditLogList'; | ||||