| @@ -53,11 +53,11 @@ const MainLayout = () => { | |||
| <Box sx={{ display: 'flex', width: '100%', flexDirection: "column", paddingTop: { xs: "5px", sm: "43px" }}}> | |||
| <Header/> | |||
| {/* <Drawer open={open} handleDrawerToggle={handleDrawerToggle} /> */} | |||
| <Box component="main" sx={{ width: '100%', flexGrow: 1, p: { xs: 2, sm: 3 } }}> | |||
| <div style={{ width: '100%', flexGrow: 1, p: { xs: 2, sm: 3 } }}> | |||
| <Toolbar /> | |||
| {/* <Breadcrumbs navigation={navigation} title /> */} | |||
| <Outlet /> | |||
| </Box> | |||
| </div> | |||
| <Box sx={{borderTop: "3px solid #0C489E"}}> | |||
| <Footer/> | |||
| </Box> | |||
| @@ -25,7 +25,7 @@ const BackgroundHead = { | |||
| // ==============================|| AUTHENTICATION - WRAPPER ||============================== // | |||
| const AuthWrapper = ({ children }) => ( | |||
| <Box sx={{ minHeight: '100vh' }}> | |||
| <Box sx={{ minHeight: '80vh' }}> | |||
| {/* <AuthBackground /> */} | |||
| {/* <img src={banner} alt="banner" width="100%" /> */} | |||
| <div style={BackgroundHead}> | |||
| @@ -35,7 +35,7 @@ const AuthWrapper = ({ children }) => ( | |||
| justifyContent="space-between" | |||
| alignItems="center" | |||
| sx={{ | |||
| minHeight: '100vh' | |||
| minHeight: '80vh' | |||
| }} | |||
| > | |||
| <Grid item xs={12}> | |||
| @@ -43,17 +43,18 @@ const AuthWrapper = ({ children }) => ( | |||
| justifyContent="space-between" | |||
| alignItems="center" | |||
| spacing={2}> | |||
| <Grid item xs={12} sx={{ ml: 4, mt: 3 ,display: { xs: 'none', sm: 'block' }}}> | |||
| <Grid item xs={12} md={8} sx={{ ml: 4, mt: 3 ,display: { xs: 'none', sm: 'block' }}}> | |||
| <Typography style={{textAlign: "center",fontFamily: "微軟正黑體",fontSize: "1.6rem"}}>香港特別行政區政府</Typography> | |||
| <Typography style={{textAlign: "center",fontFamily: "微軟正黑體",fontSize: "1.6rem",fontWeight:"bold"}}>憲報</Typography> | |||
| </Grid> | |||
| <Grid | |||
| item | |||
| xs={12} | |||
| md={3} | |||
| container | |||
| justifyContent="right" | |||
| alignItems="center" | |||
| sx={{ minHeight: { xs: 'calc(100vh - 134px)', md: 'calc(100vh - 112px)' } }} | |||
| sx={{ minHeight: { xs: 'calc(80vh - 134px)', md: 'calc(80vh - 112px)' } }} | |||
| > | |||
| <Grid item> | |||
| <AuthCard>{children}</AuthCard> | |||
| @@ -98,6 +98,7 @@ const AuthLoginCustom = () => { | |||
| }), | |||
| validationSchema:yup.object().shape({ | |||
| // username: yup.string().min(6,'用戶名稱最少6位').required('請輸入用戶名稱'), | |||
| username: yup.string().required('請輸入用戶名稱'), | |||
| password: yup.string().min(8,'請輸入最少8位密碼').required('請輸入密碼') | |||
| .matches(/^(?=.*[a-z])/, '請包括最少1個小寫字母') | |||
| .matches(/^(?=.*[A-Z])/, '請包括最少1個大寫字母') | |||
| @@ -58,6 +58,7 @@ const CustomFormWizard = (props) => { | |||
| const [fileList, setFileList] = useState([]); | |||
| const [fileListData, setFileListData] = useState([]); | |||
| const [checkUpload, setCheckUpload] = useState(false); | |||
| const [updateRows, setUpdateRows] = useState([]); | |||
| const handleClickShowPassword = () => { | |||
| setShowPassword(!showPassword); | |||
| @@ -141,6 +142,22 @@ const CustomFormWizard = (props) => { | |||
| } | |||
| }; | |||
| useEffect(() => { | |||
| console.log(updateRows); | |||
| let updateRowList = new DataTransfer(); | |||
| var updateRowsIndex = updateRows.length; | |||
| if (updateRowsIndex!=null){ | |||
| for (let i = 0; i < updateRowsIndex; i++){ | |||
| const file = updateRows[i] | |||
| updateRowList.items.add(file); | |||
| } | |||
| let updatedFileList = updateRowList.files; | |||
| setFileList(updatedFileList); | |||
| } | |||
| }, [updateRows]); | |||
| const handleFileUpload = (event)=>{ | |||
| let updateList = new DataTransfer(); | |||
| let currentFileList = fileListData; | |||
| @@ -263,7 +280,7 @@ const CustomFormWizard = (props) => { | |||
| { | |||
| refType:"identification", | |||
| refId: response.data.id, | |||
| file: fileList[0], | |||
| file: fileList, | |||
| onSuccess: (response)=>{ | |||
| console.log(response); | |||
| // setOpen(true); | |||
| @@ -1050,7 +1067,7 @@ const CustomFormWizard = (props) => { | |||
| <Typography display="inline" variant="h6" sx={{ fontSize: 12, color: 'primary.primary'}}>如: 香港身份證; 護照; 中國內地身份證等</Typography> | |||
| </Stack> | |||
| {fileList !=null? | |||
| <UploadFileTable recordList={fileListData} />:null} | |||
| <UploadFileTable recordList={fileListData} setUpdateRows={setUpdateRows} />:null} | |||
| {/* <Stack mt={1} direction="row" justifyContent="flex-start" alignItems="center" spacing={2}> | |||
| <Button variant="contained" type="submit" sx={{ fontSize: 12,height:'25px'}}>Submit</Button> | |||
| <Button disabled={!formik.isValid} variant="contained" type="submit" sx={{ fontSize: 12,height:'25px'}}>Submit</Button> | |||
| @@ -1271,7 +1288,7 @@ const CustomFormWizard = (props) => { | |||
| <Stack spacing={1} direction="column" justifyContent="space-between" alignItems="baseline" sx={{ mb: { xs: -0.5, sm: 0.5 } }}> | |||
| <Typography display="inline" variant="h4" sx={{ color: 'primary.primary'}}>身份證明文件</Typography> | |||
| {fileList !=null? | |||
| <UploadFileTable recordList={fileListData} />:null} | |||
| <UploadFileTable recordList={fileListData} updateRows={updateRows} />:null} | |||
| </Stack> | |||
| </Grid> | |||
| </Grid> | |||
| @@ -3,20 +3,22 @@ import * as React from 'react'; | |||
| import { | |||
| DataGrid, | |||
| GridActionsCellItem, | |||
| GridRowModes | |||
| } from "@mui/x-data-grid"; | |||
| import RemoveCircleOutlineIcon from '@mui/icons-material/RemoveCircleOutline'; | |||
| import {useEffect} from "react"; | |||
| // import {useNavigate} from "react-router-dom"; | |||
| // import { useTheme } from '@mui/material/styles'; | |||
| import { | |||
| // Box, | |||
| Box, | |||
| Stack | |||
| } from '@mui/material'; | |||
| // ==============================|| EVENT TABLE ||============================== // | |||
| export default function UploadFileTable({recordList}) { | |||
| export default function UploadFileTable({recordList, setUpdateRows}) { | |||
| const [rows, setRows] = React.useState(recordList); | |||
| const [rowModesModel] = React.useState({}); | |||
| const [rowModesModel,setRowModesModel] = React.useState({}); | |||
| // const theme = useTheme(); | |||
| // const navigate = useNavigate() | |||
| @@ -25,6 +27,10 @@ export default function UploadFileTable({recordList}) { | |||
| setRows(recordList); | |||
| }, [recordList]); | |||
| // useEffect(() => { | |||
| // console.log(updateRows); | |||
| // }, [updateRows]); | |||
| function NoRowsOverlay() { | |||
| return ( | |||
| <Stack height="100%" alignItems="center" justifyContent="center"> | |||
| @@ -34,9 +40,18 @@ export default function UploadFileTable({recordList}) { | |||
| ); | |||
| } | |||
| const handleEditClick = () => () => { | |||
| // navigate('/user/'+ id); | |||
| }; | |||
| const handleCancelClick = (id) => () => { | |||
| setRowModesModel({ | |||
| ...rowModesModel, | |||
| [id]: { mode: GridRowModes.View, ignoreModifications: true }, | |||
| }); | |||
| console.log("test123") | |||
| const editedRow = rows.find((row) => row.id === id); | |||
| console.log(editedRow) | |||
| console.log(editedRow.isNew) | |||
| setUpdateRows(rows.filter((row) => row.id !== id)); | |||
| setRows(rows.filter((row) => row.id !== id)); | |||
| } | |||
| const columns = [ | |||
| { | |||
| @@ -52,7 +67,7 @@ export default function UploadFileTable({recordList}) { | |||
| icon={<RemoveCircleOutlineIcon/>} | |||
| label="delete" | |||
| className="textPrimary" | |||
| onClick={handleEditClick(id)} | |||
| onClick={handleCancelClick(id)} | |||
| color="error" | |||
| />] | |||
| }, | |||
| @@ -76,7 +91,7 @@ export default function UploadFileTable({recordList}) { | |||
| ]; | |||
| return ( | |||
| <div style={{ height: 200, width: '100%' }}> | |||
| <Box style={{ height: '200px', width: '100%' }}> | |||
| <DataGrid | |||
| rows={rows} | |||
| columns={columns} | |||
| @@ -85,18 +100,12 @@ export default function UploadFileTable({recordList}) { | |||
| rowModesModel={rowModesModel} | |||
| disablePagination | |||
| components={{ NoRowsOverlay, }} | |||
| initialState={{ | |||
| pagination: { | |||
| paginationModel: {}, | |||
| }, | |||
| }} | |||
| // hideFooterPagination={true} | |||
| disableSelectionOnClick | |||
| disableColumnMenu | |||
| disableColumnSelector | |||
| hideFooter | |||
| //autoHeight = {true} | |||
| /> | |||
| </div> | |||
| </Box> | |||
| ); | |||
| } | |||
| @@ -56,22 +56,26 @@ export const fileDownload = ({fileId, skey, filename, onError}) =>{ | |||
| export const fileUpload = ({ refType, refId, file,refCode, onSuccess, onFail, onError}) =>{ | |||
| var formData = new FormData(); | |||
| for (let i = 0; i < file.length; i++){ | |||
| const file = file[i] | |||
| formData.append("multipartFile", file); | |||
| formData.append("refType", refType); | |||
| formData.append("refId", refId); | |||
| if(refCode){ | |||
| formData.append("refCode", refCode); | |||
| } | |||
| // formData.append("multipartFile", file); | |||
| formData.append("refType", refType); | |||
| formData.append("refId", refId); | |||
| if(refCode){ | |||
| formData.append("refCode", refCode); | |||
| } | |||
| console.log(formData) | |||
| axios.post(FILE_UP_POST,formData,{ | |||
| headers: { | |||
| "Content-Type":"multipart/form-data" | |||
| } | |||
| console.log(formData) | |||
| axios.post(FILE_UP_POST,formData,{ | |||
| headers: { | |||
| "Content-Type":"multipart/form-data" | |||
| } | |||
| }).then( | |||
| (response)=>{ | |||
| onResponse(response,onSuccess,onFail); | |||
| } | |||
| ).catch(error => { return handleError(error, onError); }); | |||
| }).then( | |||
| (response)=>{ | |||
| onResponse(response,onSuccess,onFail); | |||
| } | |||
| ).catch(error => { return handleError(error, onError); }); | |||
| }; | |||