| @@ -115,7 +115,7 @@ function Header(props) { | |||
| <Link className="dashboard" to='/dashboard'>主頁</Link> | |||
| </li> | |||
| <li> | |||
| <Link className="myDocumet" to='/dashboard'>我的公共啟事</Link> | |||
| <Link className="myDocumet" to='/publicNotice'>我的公共啟事</Link> | |||
| </li> | |||
| <li> | |||
| <Link className="documentRecord" to='/dashboard'>校對記錄</Link> | |||
| @@ -58,11 +58,11 @@ const MainLayout = () => { | |||
| <Box sx={{ display: 'flex', width: '100%', flexDirection: "column", paddingTop: { xs: "5px", sm: "43px" }}}> | |||
| <Header/> | |||
| {/* <Drawer open={open} handleDrawerToggle={handleDrawerToggle} /> */} | |||
| <div style={{ width: '100%', flexGrow: 1, p: { xs: 2, sm: 3 } }}> | |||
| <Box style={{ width: '100%', flexGrow: 1 } } sx={{ paddingTop: "43px" }}> | |||
| {/* <Toolbar /> */} | |||
| {/* <Breadcrumbs navigation={navigation} title /> */} | |||
| <Outlet /> | |||
| </div> | |||
| </Box> | |||
| <Box sx={{borderTop: "3px solid #0C489E"}}> | |||
| <Footer/> | |||
| </Box> | |||
| @@ -0,0 +1,86 @@ | |||
| // material-ui | |||
| import * as React from 'react'; | |||
| import { | |||
| DataGrid, | |||
| GridActionsCellItem, | |||
| } from "@mui/x-data-grid"; | |||
| import * as Icon from '../../utils/IconUtils'; | |||
| import * as DateUtils from "../../utils/DateUtils" | |||
| // ==============================|| EVENT TABLE ||============================== // | |||
| export default function SubmittedTab({rows}) { | |||
| const [rowModesModel] = React.useState({}); | |||
| const columns = [ | |||
| { | |||
| id: 'appNo', | |||
| field: 'appNo', | |||
| headerName: '申請編號', | |||
| flex: 1, | |||
| }, | |||
| { | |||
| id: 'created', | |||
| field: 'created', | |||
| headerName: '提交日期', | |||
| flex: 1, | |||
| valueGetter:(params)=>{ | |||
| return DateUtils.datetimeStr(params.value); | |||
| } | |||
| }, | |||
| { | |||
| id: 'remarks', | |||
| field: 'remarks', | |||
| headerName: '我的備註', | |||
| flex: 1, | |||
| valueGetter:(params)=>{ | |||
| return DateUtils.datetimeStr(params.value); | |||
| } | |||
| }, | |||
| { | |||
| id: 'status', | |||
| field: 'status', | |||
| headerName: '狀態', | |||
| flex: 1, | |||
| valueGetter:(params)=>{ | |||
| return DateUtils.datetimeStr(params.value); | |||
| } | |||
| }, | |||
| { | |||
| field: 'actions', | |||
| type: 'actions', | |||
| headerName: '', | |||
| width: 50, | |||
| cellClassName: 'actions', | |||
| getActions: (params) => { | |||
| return [ | |||
| <GridActionsCellItem | |||
| key="OutSave" | |||
| icon={<Icon.Download/>} | |||
| label="查看詳細" | |||
| className="textPrimary" | |||
| onClick={onDownloadClick(params.id, params.row.skey, params.row.filename)} | |||
| color="primary" | |||
| />] | |||
| }, | |||
| } | |||
| ]; | |||
| return ( | |||
| <div style={{height: 400, width: '100%'}}> | |||
| <DataGrid | |||
| sx={sx} | |||
| rows={rows} | |||
| columns={columns} | |||
| editMode="row" | |||
| rowModesModel={rowModesModel} | |||
| initialState={{ | |||
| pagination: { | |||
| paginationModel: {page: 0, pageSize: 5}, | |||
| }, | |||
| }} | |||
| pageSizeOptions={[5, 10]} | |||
| autoHeight = {true} | |||
| /> | |||
| </div> | |||
| ); | |||
| } | |||
| @@ -0,0 +1,166 @@ | |||
| // material-ui | |||
| import { | |||
| // Grid, | |||
| Typography, | |||
| Tabs, | |||
| Tab, | |||
| Box | |||
| } from '@mui/material'; | |||
| // import {TabPanel, TabContext, TabList } from '@mui/lab'; | |||
| // import {useEffect, useState} from "react"; | |||
| import * as React from "react"; | |||
| // import * as HttpUtils from "../../utils/HttpUtils"; | |||
| // import * as UrlUtils from "../../utils/ApiPathConst"; | |||
| // import Loadable from 'components/Loadable'; | |||
| // import { lazy } from 'react'; | |||
| // const SubmittedTab = Loadable(lazy(() => import('./SubmittedTab'))); | |||
| // const LoadingComponent = Loadable(lazy(() => import('../extra-pages/LoadingComponent'))); | |||
| // ==============================|| DASHBOARD - DEFAULT ||============================== // | |||
| function a11yProps(index) { | |||
| return { | |||
| id: `simple-tab-${index}`, | |||
| 'aria-controls': `simple-tabpanel-${index}`, | |||
| }; | |||
| } | |||
| function CustomTabPanel(props) { | |||
| const { children, value, index, ...other } = props; | |||
| return ( | |||
| <div | |||
| role="tabpanel" | |||
| hidden={value !== index} | |||
| id={`simple-tabpanel-${index}`} | |||
| aria-labelledby={`simple-tab-${index}`} | |||
| {...other} | |||
| > | |||
| {value === index && ( | |||
| <Box sx={{ p: 3 }}> | |||
| <Typography>{children}</Typography> | |||
| </Box> | |||
| )} | |||
| </div> | |||
| ); | |||
| } | |||
| export default function BasicTabs() { | |||
| const [value, setValue] = React.useState(0); | |||
| const handleChange = (event, newValue) => { | |||
| setValue(newValue); | |||
| }; | |||
| return ( | |||
| <> | |||
| <Box sx={{ p: 3 }}> | |||
| <Typography>123</Typography> | |||
| </Box> | |||
| <Box sx={{ width: '100%' }}> | |||
| <Box sx={{ borderBottom: 1, borderColor: 'divider' }}> | |||
| <Tabs value={value} onChange={handleChange} aria-label="basic tabs example"> | |||
| <Tab label="Item One" {...a11yProps(0)} /> | |||
| <Tab label="Item Two" {...a11yProps(1)} /> | |||
| <Tab label="Item Three" {...a11yProps(2)} /> | |||
| </Tabs> | |||
| </Box> | |||
| <CustomTabPanel value={value} index={0}> | |||
| Item One | |||
| </CustomTabPanel> | |||
| <CustomTabPanel value={value} index={1}> | |||
| Item Two | |||
| </CustomTabPanel> | |||
| <CustomTabPanel value={value} index={2}> | |||
| Item Three | |||
| </CustomTabPanel> | |||
| </Box> | |||
| </> | |||
| ); | |||
| } | |||
| // const PublicNotice = () => { | |||
| // const [submittedList, setSubmittedList] = useState([]); | |||
| // // const [inProgressList, setInProgressList] = useState([]); | |||
| // // const [pendingPaymentList, setPendingPaymentList] = useState([]); | |||
| // // const [pendingPublishList, setPendingPublishList] = useState([]); | |||
| // const [isLoading, setLoding] = useState(true); | |||
| // const [selectedTab, setSelectedTab] = useState("1"); | |||
| // useEffect(()=>{ | |||
| // loadData(); | |||
| // },[]); | |||
| // const reloadPage=()=>{ | |||
| // window.location.reload(false); | |||
| // } | |||
| // const loadData = ()=>{ | |||
| // setLoding(true); | |||
| // HttpUtils.get({ | |||
| // url: `${UrlUtils.GET_PUBLIC_NOTICE_LIST}`, | |||
| // onSuccess: function(response){ | |||
| // setSubmittedList(response.data["submitted"]); | |||
| // // setInProgressList(response.data["inProgress"]); | |||
| // // setPendingPaymentList(response.data["pendingPayment"]); | |||
| // // setPendingPublishList(response.data["pendingPublish"]); | |||
| // } | |||
| // }); | |||
| // }; | |||
| // useEffect(() => { | |||
| // setLoding(false); | |||
| // }, [submittedList]); | |||
| // const handleChange = (event, newValue)=>{ | |||
| // setSelectedTab(newValue); | |||
| // } | |||
| // return ( | |||
| // isLoading ? | |||
| // <LoadingComponent/> | |||
| // : | |||
| // <Grid container rowSpacing={4.5} columnSpacing={2.75}> | |||
| // <Grid item xs={12} sx={{mb: -2.25}}> | |||
| // <Typography variant="h5">我的公共啟事</Typography> | |||
| // </Grid> | |||
| // {/*col 2*/} | |||
| // <Grid item xs={12}> | |||
| // <TabContext value={selectedTab}> | |||
| // <Box sx={{ borderBottom: 1, borderColor: 'divider' }}> | |||
| // <TabList onChange={handleChange} aria-label="lab API tabs example"> | |||
| // <Tab label="已提交" value="1" /> | |||
| // <Tab label="處理中" value="2" /> | |||
| // <Tab label="待付款" value="3" /> | |||
| // <Tab label="待發佈" value="4" /> | |||
| // <Tab label="搜尋申請記錄" value="5" /> | |||
| // </TabList> | |||
| // </Box> | |||
| // <TabPanel value="1"> | |||
| // <SubmittedTab | |||
| // rows={submittedList} | |||
| // reloadFunction={reloadPage} | |||
| // /> | |||
| // </TabPanel> | |||
| // <TabPanel value="2"> | |||
| // TODO | |||
| // </TabPanel> | |||
| // <TabPanel value="3"> | |||
| // TODO | |||
| // </TabPanel> | |||
| // <TabPanel value="4"> | |||
| // TODO | |||
| // </TabPanel> | |||
| // <TabPanel value="5">TODO</TabPanel> | |||
| // </TabContext> | |||
| // </Grid> | |||
| // </Grid> | |||
| // ); | |||
| // }; | |||
| // export default PublicNotice; | |||
| @@ -134,19 +134,28 @@ export default function UserTable_Individual({recordList}) { | |||
| return ( | |||
| <div style={{height: 400, width: '100%'}}> | |||
| <DataGrid | |||
| rows={rows} | |||
| columns={columns} | |||
| editMode="row" | |||
| rowModesModel={rowModesModel} | |||
| initialState={{ | |||
| pagination: { | |||
| paginationModel: {page: 0, pageSize: 5}, | |||
| }, | |||
| }} | |||
| pageSizeOptions={[5, 10]} | |||
| autoHeight | |||
| /> | |||
| <DataGrid | |||
| rows={rows} | |||
| columns={columns} | |||
| editMode="row" | |||
| rowModesModel={rowModesModel} | |||
| initialState={{ | |||
| pagination: { | |||
| paginationModel: {page: 0, pageSize: 5}, | |||
| }, | |||
| }} | |||
| pageSizeOptions={[5, 10]} | |||
| autoHeight | |||
| sx={{ | |||
| boxShadow: 1, | |||
| border: 1, | |||
| borderColor: '#DDD', | |||
| '& .super-app-theme--header': { | |||
| backgroundColor: '#EEE', | |||
| }, | |||
| }} | |||
| /> | |||
| </div> | |||
| ); | |||
| } | |||
| @@ -8,6 +8,7 @@ const MainLayout = Loadable(lazy(() => import('layout/MainLayout'))); | |||
| // render - dashboard | |||
| const DashboardDefault = Loadable(lazy(() => import('pages/publicDashboard'))); | |||
| const ManageOrgUser = Loadable(lazy(() => import('pages/ManageOrgUserPage'))); | |||
| const PublicNotice = Loadable(lazy(() => import('pages/PublicNotice'))); | |||
| // ==============================|| MAIN ROUTING ||============================== // | |||
| @@ -29,6 +30,10 @@ const PublicDashboard = { | |||
| { | |||
| path: 'setting/manageUser', | |||
| element: <ManageOrgUser/> | |||
| }, | |||
| { | |||
| path: 'publicNotice', | |||
| element: <PublicNotice/> | |||
| } | |||
| ] | |||
| }, | |||
| @@ -47,6 +47,9 @@ export const GET_PUBLIC_ORG_USER_LIST = apiPath+'/user/listOrg'; | |||
| export const GET_SET_PRIMARY_USER = apiPath+'/user/primary'; | |||
| export const GET_SET_UN_PRIMARY_USER = apiPath+'/user/un-primary'; | |||
| export const GET_PUBLIC_NOTICE_LIST = apiPath+'/application/list'; | |||
| export const GET_PUBLIC_NOTICE_LIST_ListByStatus = apiPath+'/application/status-list'; | |||
| //GLD User | |||
| export const POST_ADMIN_USER_REGISTER = apiPath+'/user/registry'; | |||
| export const DELETE_USER = apiPath+'/user'; | |||
| @@ -0,0 +1,63 @@ | |||
| import { | |||
| Autocomplete, TextField | |||
| } from '@mui/material'; | |||
| import * as React from 'react'; | |||
| import Select, { SelectChangeEvent } from '@mui/material/Select'; | |||
| export default function Combo ({valueName, disabled, form, dataList, filterOptions, getOptionLabel, isOptionEqualToValue, onInputChange, onChange, ...props}){ | |||
| const [value, setValue] = React.useState(form.values[valueName]); | |||
| const [inputValue, setInputValue] = React.useState(""); | |||
| return ( | |||
| <Autocomplete | |||
| {...props} | |||
| disablePortal | |||
| fullWidth | |||
| id={valueName} | |||
| name={valueName} | |||
| disabled={disabled} | |||
| value={value} | |||
| inputValue={inputValue} | |||
| filterOptions={filterOptions} | |||
| options={dataList} | |||
| getOptionLabel={getOptionLabel} | |||
| isOptionEqualToValue={(option, newValue)=>{ | |||
| if(isOptionEqualToValue) | |||
| isOptionEqualToValue(option,newValue, setValue,setInputValue ) | |||
| }} | |||
| onInputChange={(event, newValue) => { | |||
| setInputValue(newValue); | |||
| if(onInputChange){ | |||
| onInputChange(event,newValue, setInputValue) | |||
| } | |||
| }} | |||
| onChange={(event, newValue) => { | |||
| setValue(newValue); | |||
| if (!onChange){ | |||
| form.setFieldValue(valueName, newValue); | |||
| }else{ | |||
| onChange(event, newValue); | |||
| } | |||
| }} | |||
| sx={{ | |||
| "& .MuiInputBase-root": { | |||
| height: "41px", | |||
| padding: "0px 0px 0px 8px" | |||
| }, | |||
| "& .MuiAutocomplete-endAdornment": { | |||
| top: "auto" | |||
| }, | |||
| "& .MuiInputBase-input.Mui-disabled": { | |||
| WebkitTextFillColor: "#000000", | |||
| background: "#f8f8f8", | |||
| }, | |||
| }} | |||
| renderInput={(params) => <TextField {...params} sx={{ | |||
| "& .MuiInputBase-input.Mui-disabled": { | |||
| WebkitTextFillColor: "#000000", | |||
| background: "#f8f8f8", | |||
| }, | |||
| }}/>} | |||
| /> | |||
| ); | |||
| } | |||