| @@ -149,6 +149,9 @@ function Header(props) { | |||
| <li> | |||
| <Link className="holidaySetting" to='/holiday'><Typography style={{ opacity: 0.9 }} variant={"pnspsHeaderTitle"} sx={{ ml: 2, mt: 1, mb: 1 }}>Holiday Setting</Typography></Link> | |||
| </li> | |||
| <li> | |||
| <Link className="holidaySetting" to='/setting/drImport'><Typography style={{ opacity: 0.9 }} variant={"pnspsHeaderTitle"} sx={{ ml: 2, mt: 1, mb: 1 }}>DR Import</Typography></Link> | |||
| </li> | |||
| <li> | |||
| <Link className="announcement" to='/setting/announcement'><Typography style={{ opacity: 0.9 }} variant={"pnspsHeaderTitle"} sx={{ ml: 2, mt: 1, mb: 1 }}>Announcement</Typography></Link> | |||
| </li> | |||
| @@ -0,0 +1,176 @@ | |||
| import * as React from "react"; | |||
| import * as HttpUtils from "utils/HttpUtils"; | |||
| 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 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]; | |||
| 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) { | |||
| if(responData?.msg){ | |||
| setResultStr(<>Error:<br/><span style={{"whiteSpace": "pre-line"}}>{responData?.msg}</span></>) | |||
| }else if(responData?.success){ | |||
| setResultStr(<>Success<br/>Record Count: {responData.recordCount}</>) | |||
| } | |||
| } | |||
| }); | |||
| } else { | |||
| setWarningText(intl.formatMessage({ id: 'requireValidFileWithFormat' })); | |||
| setIsWarningPopUp(true); | |||
| setAttachment({}); | |||
| document.getElementById("uploadFileBtn").value = ""; | |||
| return; | |||
| } | |||
| } | |||
| document.getElementById("uploadFileBtn").value = ""; | |||
| } | |||
| return ( | |||
| <Grid container sx={{ minHeight: '87vh', backgroundColor: 'backgroundColor.default' }} direction="column" alignItems="center"> | |||
| <Grid item xs={12} md={12} width="100%" > | |||
| <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' } }}> | |||
| DR Import | |||
| </Typography> | |||
| </Stack> | |||
| </div> | |||
| </Grid> | |||
| <Grid item xs={12} md={12} sx={{ backgroundColor: '#ffffff', ml: 2, mt: 1, }} width="98%"> | |||
| <Box xs={12} md={12} sx={{ borderRadius: '10px', backgroundColor: '#fff', p: 4 }}> | |||
| <Stack direction="row" height='70px' justifyContent="flex-start" alignItems="center"> | |||
| <Button | |||
| aria-label={intl.formatMessage({ id: 'uploadFileBtn' })} | |||
| component="span" | |||
| variant="outlined" | |||
| size="large" | |||
| onClick={()=>{ | |||
| HttpUtils.fileDownload({ | |||
| url: UrlUtils.DR_EXPORT, | |||
| onSuccess: ()=>{ | |||
| notifyDownloadSuccess(); | |||
| } | |||
| }); | |||
| }} | |||
| >Export DR Excel</Button> | |||
| <Grid item sx={{ pl: 4 }}> | |||
| <Grid container direction="row" justifyContent="flex-start" alignItems="center"> | |||
| <Grid item xs={12} md={6} lg={6} sx={{ wordBreak: 'break-word' }}> | |||
| <input | |||
| id="uploadFileBtn" | |||
| name="file" | |||
| type="file" | |||
| accept=".xlsx" | |||
| style={{ display: 'none' }} | |||
| onChange={(event) => { | |||
| readFile(event) | |||
| }} | |||
| /> | |||
| </Grid> | |||
| </Grid> | |||
| </Grid> | |||
| <Grid item > | |||
| <Grid container direction="row" justifyContent="flex-start" alignItems="center"> | |||
| <Grid item xs={12} > | |||
| <label htmlFor="uploadFileBtn"> | |||
| <Button | |||
| aria-label={intl.formatMessage({ id: 'uploadFileBtn' })} | |||
| component="span" | |||
| variant="outlined" | |||
| size="large" | |||
| >Import DR Excel</Button> | |||
| </label> | |||
| </Grid> | |||
| </Grid> | |||
| </Grid> | |||
| </Stack> | |||
| </Box> | |||
| </Grid> | |||
| <Grid item xs={12} md={12} sx={{ backgroundColor: '#ffffff', ml: 2, mt: 1, }} width="98%" > | |||
| <Box xs={12} md={12} sx={{ borderRadius: '10px', backgroundColor: '#fff', p: 4 }}> | |||
| <Typography variant="h4">Result:</Typography> | |||
| <Box xs={12} md={12} sx={{ pl: 4 }}> | |||
| {resultStr} | |||
| </Box> | |||
| </Box> | |||
| </Grid> | |||
| <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> | |||
| Action Fail | |||
| </DialogTitle> | |||
| <DialogContent style={{ display: 'flex', }}> | |||
| <Typography variant="h3" style={{ padding: '16px' }}>{warningText}</Typography> | |||
| </DialogContent> | |||
| <DialogActions> | |||
| <Button | |||
| aria-label={intl.formatMessage({ id: 'ok' })} | |||
| onClick={() => { setIsWarningPopUp(false); }} | |||
| > | |||
| <FormattedMessage id="ok" /> | |||
| </Button> | |||
| </DialogActions> | |||
| </Dialog> | |||
| </div> | |||
| </Grid> | |||
| ); | |||
| }; | |||
| export default Index; | |||
| @@ -22,6 +22,7 @@ const UserMaintainPage = Loadable(lazy(() => import('pages/User/GLDUserProfile') | |||
| const SystemSetting = Loadable(lazy(() => import('pages/Setting/SystemSetting'))); | |||
| const AnnouncementDetails = Loadable(lazy(() => import('pages/Announcement/Details'))); | |||
| const AnnouncementSearch = Loadable(lazy(() => import('pages/Announcement/Search'))); | |||
| const DrImport = Loadable(lazy(() => import('pages/Setting/DrImport'))); | |||
| // ==============================|| MAIN ROUTING ||============================== // | |||
| @@ -100,6 +101,10 @@ const GLDUserRoutes = { | |||
| path: '/setting/announcement/details/:id', | |||
| element: <AnnouncementDetails /> | |||
| }, | |||
| { | |||
| path: '/setting/drImport', | |||
| element: <DrImport /> | |||
| }, | |||
| ] | |||
| }, | |||
| ] | |||
| @@ -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'; | |||
| @@ -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; | |||
| } | |||