diff --git a/src/layout/MainLayout/Header/index.js b/src/layout/MainLayout/Header/index.js index 07ebdc8..5e52026 100644 --- a/src/layout/MainLayout/Header/index.js +++ b/src/layout/MainLayout/Header/index.js @@ -149,6 +149,9 @@ function Header(props) {
  • Holiday Setting
  • +
  • + DR Import +
  • Announcement
  • diff --git a/src/pages/Announcement/Search_Public/DataGrid.js b/src/pages/Announcement/Search_Public/DataGrid.js index 0482e52..e89ba81 100644 --- a/src/pages/Announcement/Search_Public/DataGrid.js +++ b/src/pages/Announcement/Search_Public/DataGrid.js @@ -21,7 +21,7 @@ export default function SearchPublicNoticeTable({ recordList }) { width: 250, cellClassName: 'announceDate', renderCell: (params) => { - return DateUtils.datetimeStr(params?.value); + return DateUtils.dateStr(params?.value); }, }, { diff --git a/src/pages/Message/Search/index.js b/src/pages/Message/Search/index.js index b96ae87..9ee6c86 100644 --- a/src/pages/Message/Search/index.js +++ b/src/pages/Message/Search/index.js @@ -70,7 +70,7 @@ const Index = () => {
    - +
    diff --git a/src/pages/Setting/DrImport/index.js b/src/pages/Setting/DrImport/index.js new file mode 100644 index 0000000..cbbc3bf --- /dev/null +++ b/src/pages/Setting/DrImport/index.js @@ -0,0 +1,204 @@ + +import * as React from "react"; +import * as HttpUtils from "utils/HttpUtils"; +import * as DateUtils from "utils/DateUtils"; +import * as UrlUtils from "utils/ApiPathConst"; + +import { + Grid, Typography, Button, + Stack, Box, + Dialog, DialogTitle, DialogContent, DialogActions, +} from '@mui/material'; +import { notifyDownloadSuccess } from 'utils/CommonFunction'; + +import { FormattedMessage, useIntl } from "react-intl"; + +import titleBackgroundImg from 'assets/images/dashboard/gazette-bar.png' + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const Index = () => { + const [isWarningPopUp, setIsWarningPopUp] = React.useState(false); + const [warningText, setWarningText] = React.useState(""); + const [resultStr, setResultStr] = React.useState(""); + const [wait, setWait] = React.useState(false); + + const intl = useIntl(); + + + const BackgroundHead = { + backgroundImage: `url(${titleBackgroundImg})`, + width: 'auto', + height: 'auto', + backgroundSize: 'contain', + backgroundRepeat: 'no-repeat', + backgroundColor: '#0C489E', + backgroundPosition: 'right' + } + + + const readFile = (event) => { + let file = event.target.files[0]; + setWait(true); + if (file) { + + if (file.name.toLowerCase().substr(file.name.length - 5).includes(".xlsx") + ) { + HttpUtils.postWithFiles({ + url: UrlUtils.DR_IMPORT, + params:null, + files: [event.target.files[0]], + onSuccess: function (responData) { + setWait(false); + if(responData?.msg){ + setResultStr(<>{DateUtils.datetimeStr(new Date())}
    Error
    {responData?.msg}) + }else if(responData?.success){ + setResultStr(<>{DateUtils.datetimeStr(new Date())}
    Success
    Record Count: {responData.recordCount}) + } + }, + onError: function(){ + setWait(false); + setResultStr(<>{DateUtils.datetimeStr(new Date())}
    Error
    Action Fail: Please import valid file.) + } + }); + } else { + setWait(false); + setWarningText("Please upload a valid file (file format: .xlsx)"); + setIsWarningPopUp(true); + document.getElementById("uploadFileBtn").value = ""; + return; + } + }else{ + setWait(false); + } + document.getElementById("uploadFileBtn").value = ""; + } + + return ( + + +
    + + + DR Import + + +
    +
    + + + + + + + + + + { + readFile(event) + }} + /> + + + + + + + + + + + + + + + + + + + + Result: + + {resultStr} + + + + + + +
    + setIsWarningPopUp(false)} + PaperProps={{ + sx: { + minWidth: '40vw', + maxWidth: { xs: '90vw', s: '90vw', m: '70vw', lg: '70vw' }, + maxHeight: { xs: '90vh', s: '70vh', m: '70vh', lg: '60vh' } + } + }} + > + + Action Fail + + + {warningText} + + + + + +
    +
    + setWait(false)} + PaperProps={{ + sx: { + minWidth: '40vw', + maxWidth: { xs: '90vw', s: '90vw', m: '70vw', lg: '70vw' }, + maxHeight: { xs: '90vh', s: '70vh', m: '70vh', lg: '60vh' } + } + }} + > + + Please wait ... + + +
    +
    + ); +}; + +export default Index; \ No newline at end of file diff --git a/src/pages/dashboard/Public/Notice.js b/src/pages/dashboard/Public/Notice.js index e1ce7b8..b518f11 100644 --- a/src/pages/dashboard/Public/Notice.js +++ b/src/pages/dashboard/Public/Notice.js @@ -33,7 +33,7 @@ const SearchDemandNoteForm = () => { list.push( {locale === 'en' ?item.subjectEng:locale === 'zh-HK' ?item.subjectCht:item.subjectChs} - {DateUtils.datetimeStr(item.announceDate)} + {DateUtils.dateStr(item.announceDate)} {locale === 'en' ?item.contentEng:locale === 'zh-HK' ?item.contentCht:item.contentChs} diff --git a/src/routes/GLDUserRoutes.js b/src/routes/GLDUserRoutes.js index ca96592..efa9b76 100644 --- a/src/routes/GLDUserRoutes.js +++ b/src/routes/GLDUserRoutes.js @@ -26,6 +26,7 @@ const EmailTemplatePage = Loadable(lazy(() => import('pages/EmailTemplate/Search const EmailTemplateDetailPage = Loadable(lazy(() => import('pages/EmailTemplate/Detail_GLD'))); const HolidayPage = Loadable(lazy(() => import('pages/Holiday'))); const GazetteIssuePage = Loadable(lazy(() => import('pages/GazetteIssue/index'))); +const DrImport = Loadable(lazy(() => import('pages/Setting/DrImport'))); // ==============================|| MAIN ROUTING ||============================== // @@ -120,6 +121,10 @@ const GLDUserRoutes = { path: '/setting/gazetteissuepage', element: }, + { + path: '/setting/drImport', + element: + }, ] }, ] diff --git a/src/utils/ApiPathConst.js b/src/utils/ApiPathConst.js index 47289e2..a954e4a 100644 --- a/src/utils/ApiPathConst.js +++ b/src/utils/ApiPathConst.js @@ -67,6 +67,11 @@ export const POST_FILE_LIST = apiPath+'/file/list'; export const GET_FILE_DELETE = apiPath+'/file/delete'; //export const FILE_DOWN_GET = ({id,skey,filename})=>{ return apiPath+'/file/dl/'+id+'/'+skey+'/'+filename}; +export const DR_EXPORT = apiPath+'/settings/dr/export'; +export const DR_IMPORT = apiPath+'/settings/dr/import'; + + + // POST request //Login export const POST_LOGIN = '/login'; diff --git a/src/utils/HttpUtils.js b/src/utils/HttpUtils.js index 8209476..1c208ac 100644 --- a/src/utils/HttpUtils.js +++ b/src/utils/HttpUtils.js @@ -1,109 +1,110 @@ import axios from "axios"; -import {FILE_UP_POST, FILE_DOWN_GET} from "../utils/ApiPathConst"; +import { FILE_UP_POST, FILE_DOWN_GET } from "../utils/ApiPathConst"; -export const get = ({url, params, onSuccess, onFail, onError}) =>{ - axios.get(url,{ +export const get = ({ url, params, onSuccess, onFail, onError }) => { + axios.get(url, { params: params }).then( - (response)=>{onResponse(response, onSuccess, onFail);} + (response) => { onResponse(response, onSuccess, onFail); } ).catch(error => { - return handleError(error,onError); + return handleError(error, onError); }); }; //TODO -export const put = ({url,params, onSuccess, onFail, onError}) =>{ - axios.put(url,params).then( - (response)=>{onResponse(response, onSuccess, onFail);} +export const put = ({ url, params, onSuccess, onFail, onError }) => { + axios.put(url, params).then( + (response) => { onResponse(response, onSuccess, onFail); } ).catch(error => { - return handleError(error,onError); + return handleError(error, onError); }); }; -export const patch = ({url,params, onSuccess, onFail, onError}) =>{ - axios.patch(url,params).then( - (response)=>{onResponse(response, onSuccess, onFail);} +export const patch = ({ url, params, onSuccess, onFail, onError }) => { + axios.patch(url, params).then( + (response) => { onResponse(response, onSuccess, onFail); } ).catch(error => { - return handleError(error,onError); + return handleError(error, onError); }); }; -export const post = ({url, params, onSuccess, onFail, onError, headers}) =>{ - headers = headers?headers:{ - "Content-Type":"application/json" +export const post = ({ url, params, onSuccess, onFail, onError, headers }) => { + headers = headers ? headers : { + "Content-Type": "application/json" }; - - axios.post(url,params, + + axios.post(url, params, { - headers:headers + headers: headers }).then( - (response)=>{onResponse(response, onSuccess, onFail);} - ).catch(error => { - return handleError(error,onError); - }); + (response) => { onResponse(response, onSuccess, onFail); } + ).catch(error => { + return handleError(error, onError); + }); }; -export const postWithFiles = ({url, params, files, onSuccess, onFail, onError}) =>{ +export const postWithFiles = ({ url, params, files, onSuccess, onFail, onError }) => { var formData = new FormData(); - for (let i = 0; i < files.length; i++){ + for (let i = 0; i < files.length; i++) { const file = files[i] formData.append("multipartFileList", file); } - for (var key in params) { - if(typeof(params[key]) ==='object'){ - formData.append(key, JSON.stringify(params[key])); - }else{ - formData.append(key, params[key]); - } - } - - axios.post(url,formData, - {headers: {"Content-Type":"multipart/form-data"}}) - .then( - (response)=>{onResponse(response, onSuccess, onFail);} - ).catch(error => { - return handleError(error,onError); - }); + if (params) + for (var key in params) { + if (typeof (params[key]) === 'object') { + formData.append(key, JSON.stringify(params[key])); + } else { + formData.append(key, params[key]); + } + } + + axios.post(url, formData, + { headers: { "Content-Type": "multipart/form-data" } }) + .then( + (response) => { onResponse(response, onSuccess, onFail); } + ).catch(error => { + return handleError(error, onError); + }); }; -export const fileDownload = ({url, fileId, skey, filename, params, method, onResponse, onError}) =>{ - if(!url){ - url = FILE_DOWN_GET+"/"+fileId+"/"+skey+"/"+filename +export const fileDownload = ({ url, fileId, skey, filename, params, method, onResponse, onError }) => { + if (!url) { + url = FILE_DOWN_GET + "/" + fileId + "/" + skey + "/" + filename } - if(method == 'post'){ - axios.post( url, params, + if (method == 'post') { + axios.post(url, params, { responseType: 'blob', - headers:{ - "Content-Type":"application/json" + headers: { + "Content-Type": "application/json" } } ).then( - (response)=>{ + (response) => { fileDownloadResponse(response, onResponse) } ).catch(error => { - return handleError(error,onError); + return handleError(error, onError); }); - }else{ - axios.get( url, + } else { + axios.get(url, { responseType: 'blob', - params:params + params: params } ).then( - (response)=>{ + (response) => { fileDownloadResponse(response, onResponse) } ).catch(error => { - return handleError(error,onError); + return handleError(error, onError); }); } }; -const fileDownloadResponse=(response, onResponse)=>{ - const fn = response.headers.get("content-disposition")?.split("filename=")[1]?.split('"')[1]?.trim()??filename; +const fileDownloadResponse = (response, onResponse) => { + const fn = response.headers.get("content-disposition")?.split("filename=")[1]?.split('"')[1]?.trim() ?? filename; const url = URL.createObjectURL(response.data); const a = document.createElement('a'); a.href = url; @@ -112,47 +113,47 @@ const fileDownloadResponse=(response, onResponse)=>{ a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); - if(onResponse){ + if (onResponse) { onResponse(); } } -export const fileUpload = ({refType, refId, files, refCode, onSuccess, onFail, onError}) =>{ +export const fileUpload = ({ refType, refId, files, refCode, onSuccess, onFail, onError }) => { postWithFiles({ url: FILE_UP_POST, - params:{ + params: { refType: refType, refId: refId, refCode: refCode }, files: files, onSuccess: onSuccess, - onFail:onFail, - onError:onError + onFail: onFail, + onError: onError }); }; -const onResponse= (response, onSuccess, onFail) =>{ - if (response.status >= 300 ||response.status < 200) { +const onResponse = (response, onSuccess, onFail) => { + if (response.status >= 300 || response.status < 200) { console.log("onFail"); - if(onFail){ + if (onFail) { onFail(response); - }else{ + } else { console.log(response); } return; } - - if(onSuccess){ + + if (onSuccess) { onSuccess(response?.data); } } -const handleError= (error, onError) =>{ - if(onError){ +const handleError = (error, onError) => { + if (onError) { return onError(error); - }else{ + } else { console.log(error); return false; }