Anna Ho 1 year ago
parent
commit
4ff1411d92
22 changed files with 610 additions and 359 deletions
  1. +1
    -1
      src/pages/ManageOrgUserPage/index.js
  2. +1
    -1
      src/pages/OrganizationSearchPage/OrganizationTable.js
  3. +1
    -1
      src/pages/authentication/auth-forms/BusCustomFormWizard.js
  4. +6
    -1
      src/pages/authentication/auth-forms/CustomFormWizard.js
  5. +2
    -2
      src/pages/pnspsUserDetailPage/UserAuthTable.js
  6. +2
    -5
      src/pages/pnspsUserDetailPage/UserGroupTable.js
  7. +106
    -137
      src/pages/pnspsUserDetailPage/UserInformationCard.js
  8. +126
    -21
      src/pages/pnspsUserDetailPage/index.js
  9. +7
    -1
      src/pages/pnspsUserGroupDetailPage/GroupAuthCard.js
  10. +2
    -2
      src/pages/pnspsUserGroupDetailPage/GroupAuthTable.js
  11. +30
    -18
      src/pages/pnspsUserGroupDetailPage/UserAddCard.js
  12. +13
    -7
      src/pages/pnspsUserGroupDetailPage/UserAddTable.js
  13. +123
    -26
      src/pages/pnspsUserGroupDetailPage/index.js
  14. +1
    -1
      src/pages/pnspsUserGroupSearchPage/UserGroupTable.js
  15. +10
    -10
      src/pages/pnspsUserGroupSearchPage/index.js
  16. +26
    -72
      src/pages/pnspsUserSearchPage/UserSearchForm.js
  17. +40
    -43
      src/pages/pnspsUserSearchPage/UserTable.js
  18. +5
    -4
      src/pages/pnspsUserSearchPage/index.js
  19. +1
    -1
      src/pages/pnspsUserSearchPage_Individual/UserTable_Individual.js
  20. +1
    -1
      src/pages/pnspsUserSearchPage_Organization/UserTable_Organization.js
  21. +9
    -3
      src/utils/ApiPathConst.js
  22. +97
    -1
      src/utils/CommonFunction.js

+ 1
- 1
src/pages/ManageOrgUserPage/index.js View File

@@ -160,7 +160,7 @@ const ManageOrgUserPage = () => {
},
}}
pageSizeOptions={[5, 10]}
autoHeight = {true}
autoHeight
/>
</Grid>
</Grid>


+ 1
- 1
src/pages/OrganizationSearchPage/OrganizationTable.js View File

@@ -86,7 +86,7 @@ export default function OrganizationTable({recordList}) {
},
}}
pageSizeOptions={[5, 10]}
autoHeight = {true}
autoHeight
/>
</div>
);


+ 1
- 1
src/pages/authentication/auth-forms/BusCustomFormWizard.js View File

@@ -327,7 +327,7 @@ const BusCustomFormWizard = (props) => {
}

function handlePhone(phone) {
if (phone.length < 11) {
if (phone.length < 8) {
return false;
} else {
return true;


+ 6
- 1
src/pages/authentication/auth-forms/CustomFormWizard.js View File

@@ -311,9 +311,10 @@ const CustomFormWizard = (props) => {
}

function handlePhone(value) {
if (value.length < 11) {
if (value.length < 8) {
return false;
} else {
console.log("Phone true")
return true;
}
}
@@ -322,6 +323,7 @@ const CustomFormWizard = (props) => {
if (value.length < 6) {
return false;
} else {
console.log("Username true")
return true;
}
}
@@ -334,6 +336,7 @@ const CustomFormWizard = (props) => {
else if (idNo.length < 7) {
return false;
} else {
console.log("IdNo true")
return true;
}
}
@@ -356,6 +359,7 @@ const CustomFormWizard = (props) => {
} else if (new_pass.length < 8) {
return false;
} else {
console.log("password true")
return true;
}
}
@@ -367,6 +371,7 @@ const CustomFormWizard = (props) => {
if (result == false) {
return false;
}
console.log("email true")
return true;
}



+ 2
- 2
src/pages/pnspsUserDetailPage/UserAuthTable.js View File

@@ -73,11 +73,11 @@ export default function UserAuthTable({setSelectedRow, userAuth}) {
checkboxSelection
rowSelectionModel={currentSelectedRow}
onRowSelectionModelChange={(ids) => {
console.log(ids);
// console.log(ids);
setSelectedRow(ids);
setCurrentSelectedRow(ids);
}}
autoHeight = {true}
autoHeight
/>
</div>
);


+ 2
- 5
src/pages/pnspsUserDetailPage/UserGroupTable.js View File

@@ -5,10 +5,8 @@ import {
import {useEffect, useState} from "react";
import axios from "axios";
import {apiPath} from "../../auth/utils";
//import LoadingComponent from "../extra-pages/LoadingComponent";
import * as React from "react";
import {GET_GROUP_COMBO_PATH} from "../../utils/ApiPathConst";

import Loadable from 'components/Loadable';
import { lazy } from 'react';
const LoadingComponent = Loadable(lazy(() => import('../extra-pages/LoadingComponent')));
@@ -35,8 +33,7 @@ export default function UserGroupTable({setSelectedRow, userGroup}) {

useEffect(() => {
//if state data are ready and assign to different field
console.log(groupData.length)
if (groupData !== "" && groupData !== undefined) {
if (groupData.length > 0) {
setOnReady(true);
}
}, [groupData]);
@@ -73,7 +70,7 @@ export default function UserGroupTable({setSelectedRow, userGroup}) {
setSelectedRow(ids);
setCurrentSelectedRow(ids);
}}
autoHeight = {true}
autoHeight
/>
</div>
);


+ 106
- 137
src/pages/pnspsUserDetailPage/UserInformationCard.js View File

@@ -1,82 +1,32 @@
// material-ui
import {
Grid, TextField, Typography
FormControl, IconButton,
Grid, InputAdornment, Typography, FormLabel,
OutlinedInput,
} from '@mui/material';
import MainCard from "../../components/MainCard";
import * as React from "react";
import {useForm} from "react-hook-form";
// import Autocomplete from "@mui/material/Autocomplete";
// import {
// subDivision1,
// subDivision2,
// subDivision3,
// subDivision4,
// subDivision5,
// subDivision6
// } from "../pnspsUserSearchPage/DummyComboRecord";
import {useEffect, useState} from "react";
import Checkbox from "@mui/material/Checkbox";
//import LoadingComponent from "../extra-pages/LoadingComponent";
import Loadable from 'components/Loadable';
import { lazy } from 'react';
const LoadingComponent = Loadable(lazy(() => import('../extra-pages/LoadingComponent')));
//import {useParams} from "react-router-dom";
import Visibility from '@mui/icons-material/Visibility';
import VisibilityOff from '@mui/icons-material/VisibilityOff';

// ==============================|| DASHBOARD - DEFAULT ||============================== //


// const subDivisionArray = [
// ...subDivision1,
// ...subDivision2,
// ...subDivision3,
// ...subDivision4,
// ...subDivision5,
// ...subDivision6
// ];


const UserInformationCard = ({isCollectData, updateUserObject,userData}) => {
const UserInformationCard = ({isCollectData, updateUserObject,userData,isNewRecord}) => {
//const params = useParams();
const [currentUserData, setCurrentUserData] = React.useState({});
// const [subDivision, setSubDivision] = useState(null);
const [locked, setLocked] = useState(false);
// const [isLotusNoteUser, setIsLotusNoteUser] = useState(false);
// const [lotusNoteUserList, setLotusNoteUserList] = useState([])
// const [selectedLotusUser, setSelectedLotusUser] = useState(null);

const [showPassword, setShowPassword] = React.useState(false);
const [onReady, setOnReady] = useState(false);
const {register, getValues} = useForm()

// useEffect(() => {
// //TODO: Get lotus note user list
// setLotusNoteUserList([
// {
// key: 1,
// label: "user01",
// account: "user123456"
// },
// {
// key: 2,
// label: "user02",
// account: "userabcde1"
// },
// {
// key: 3,
// label: "user03",
// account: "user2001"
// },
// {
// key: 4,
// label: "user04",
// account: "user2000"
// },
// {
// key: 5,
// label: "user05",
// account: "user1999"
// },
// ])
// }, []);
const handleClickShowPassword = () => setShowPassword((show) => !show);
const handleMouseDownPassword = () => setShowPassword(!showPassword);

useEffect(() => {
//if user data from parent are not null
@@ -87,9 +37,12 @@ const UserInformationCard = ({isCollectData, updateUserObject,userData}) => {

useEffect(() => {
//if state data are ready and assign to different field
if (Object.keys(userData).length > 0 &&currentUserData !== undefined) {
if (Object.keys(userData).length > 0 &&currentUserData !== undefined&&currentUserData.id!==undefined) {
setLocked(currentUserData.locked);
setOnReady(true);
}else if(isNewRecord){
setLocked(false);
setOnReady(true);
}
}, [currentUserData]);

@@ -98,8 +51,6 @@ const UserInformationCard = ({isCollectData, updateUserObject,userData}) => {
const values = getValues();
const objectData ={
...values,
// selectedLotusUser: selectedLotusUser,
// subDivision: subDivision,
locked: locked,
}
updateUserObject(objectData);
@@ -120,25 +71,28 @@ const UserInformationCard = ({isCollectData, updateUserObject,userData}) => {


<form>

<Grid container>
<Grid item xs={12} s={12} md={12} lg={12} sx={{ml: 3, mr: 3, mb: 3}}>
<Grid container alignItems={"center"}>
<Grid item xs={4} s={4} md={4} lg={4}
sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
Username:
<FormLabel required>Username:</FormLabel>
</Grid>

<Grid item xs={7} s={7} md={7} lg={6}>
<TextField
fullWidth
{...register("userName",
{
value: currentUserData.username,
})}
id='username'
disabled
/>
<FormControl variant="outlined" fullWidth required>
<OutlinedInput
required
fullWidth
size="small"
{...register("username",
{
value: currentUserData.username,
})}
id='username'
disabled={!isNewRecord}
/>
</FormControl>
</Grid>
</Grid>
</Grid>
@@ -151,12 +105,28 @@ const UserInformationCard = ({isCollectData, updateUserObject,userData}) => {
</Grid>

<Grid item xs={7} s={7} md={7} lg={6}>
<TextField
fullWidth
{...register("password")}
id='password'
disabled
/>
<FormControl variant="outlined" fullWidth required>
<OutlinedInput
fullWidth
size="small"
{...register("password")}
id='password'
type={showPassword ? 'text' : 'password'}
disabled
endAdornment={
<InputAdornment position="end">
<IconButton
aria-label="toggle password visibility"
onClick={handleClickShowPassword}
onMouseDown={handleMouseDownPassword}
edge="end"
>
{showPassword ? <VisibilityOff /> : <Visibility />}
</IconButton>
</InputAdornment>
}
/>
</FormControl>
</Grid>
</Grid>
</Grid>
@@ -165,18 +135,30 @@ const UserInformationCard = ({isCollectData, updateUserObject,userData}) => {
<Grid container alignItems={"center"}>
<Grid item xs={4} s={4} md={4} lg={4}
sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
Full Name:
<FormLabel required >Full Name:</FormLabel>
</Grid>

<Grid item xs={7} s={7} md={7} lg={6}>
<TextField
{/* <TextField
fullWidth
{...register("fullenName",
{...register("enName",
{
value: currentUserData.fullenName,
value: currentUserData.enName,
})}
id='fullenName'
/>
id='enName'
/> */}
<FormControl variant="outlined" fullWidth required>
<OutlinedInput
required
fullWidth
size="small"
{...register("enName",
{
value: currentUserData.enName,
})}
id='enName'
/>
</FormControl>
</Grid>
</Grid>
</Grid>
@@ -185,89 +167,76 @@ const UserInformationCard = ({isCollectData, updateUserObject,userData}) => {
<Grid container alignItems={"center"}>
<Grid item xs={4} s={4} md={4} lg={4}
sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
Post:
<FormLabel>Post:</FormLabel>
</Grid>

<Grid item xs={7} s={7} md={7} lg={6}>
<TextField
fullWidth
{...register("post",
{
value: currentUserData.post,
})}
id='post'
/>
<FormControl variant="outlined" fullWidth required>
<OutlinedInput
fullWidth
size="small"
{...register("post",
{
value: currentUserData.post,
})}
id='post'
/>
</FormControl>
</Grid>
</Grid>
</Grid>

{/* <Grid item xs={12} s={12} md={12} lg={12} sx={{ml: 3, mr: 3, mb: 3}}>
<Grid container alignItems={"center"}>
<Grid item xs={4} s={4} md={4} lg={4}
sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
Sub-Division:
</Grid>

<Grid item xs={7} s={7} md={7} lg={6}>
<Autocomplete
disablePortal
id="sub-division-combo"
value={subDivision === null ? null : subDivision}
options={subDivisionArray}
onChange={(event, newValue) => {
setSubDivision(newValue);
}}
renderInput={(params) => <TextField {...params} />}
/>
</Grid>
</Grid>
</Grid> */}

<Grid item xs={12} s={12} md={12} lg={12} sx={{ml: 3, mr: 3, mb: 3}}>
<Grid container alignItems={"center"}>
<Grid item xs={4} s={4} md={4} lg={4}
sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
Email:
<FormLabel required>Email:</FormLabel>
</Grid>

<Grid item xs={7} s={7} md={7} lg={6}>
<TextField
fullWidth
{...register("email",
{
value: currentUserData.email,
})}
id='email'
/>
<FormControl variant="outlined" fullWidth required>
<OutlinedInput
fullWidth
size="small"
{...register("emailAddress",
{
value: currentUserData.emailAddress,
})}
id='emailAddress'
/>
</FormControl>
</Grid>
</Grid>
</Grid>

<Grid item xs={12} s={12} md={12} lg={12} sx={{ml: 3, mr: 3, mb: 3}}>
{/* <Grid item xs={12} s={12} md={12} lg={12} sx={{ml: 3, mr: 3, mb: 3}}>
<Grid container alignItems={"center"}>
<Grid item xs={4} s={4} md={4} lg={4}
sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
Phone:
<FormLabel>Phone:</FormLabel>
</Grid>

<Grid item xs={7} s={7} md={7} lg={6}>
<TextField
fullWidth
{...register("phone1",
{
value: currentUserData.phone1,
})}
id='phone1'
/>
<FormControl variant="outlined" fullWidth required>
<OutlinedInput
fullWidth
size="small"
{...register("phone",
{
value: currentUserData.phone,
})}
id='phone'
/>
</FormControl>
</Grid>
</Grid>
</Grid>
</Grid> */}

<Grid item xs={12} s={12} md={12} lg={12} sx={{ml: 3, mr: 3, mb: 3}}>
<Grid container>
<Grid item xs={4} s={4} md={4} lg={4}
sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
Locked:
<FormLabel required>Locked:</FormLabel>
</Grid>

<Grid item xs={7} s={7} md={7} lg={6}>


+ 126
- 21
src/pages/pnspsUserDetailPage/index.js View File

@@ -1,14 +1,15 @@
// material-ui
import {
Button,
Grid, Typography
Grid,
Typography,
Stack
} from '@mui/material';
import {useEffect, useState} from "react";
import * as React from "react";
import axios from "axios";
import {apiPath} from "../../auth/utils";
import {useParams} from "react-router-dom";
import {GET_USER_PATH} from "../../utils/ApiPathConst";
import {useNavigate,useParams} from "react-router-dom";
import {GLD_USER_PATH,DELETE_USER} from "../../utils/ApiPathConst";

import Loadable from 'components/Loadable';
import { lazy } from 'react';
@@ -16,16 +17,17 @@ const UserInformationCard = Loadable(lazy(() => import('./UserInformationCard'))
const LoadingComponent = Loadable(lazy(() => import('../extra-pages/LoadingComponent')));
const UserGroupCard = Loadable(lazy(() => import('./UserGroupCard')));
const UserAuthorityCard = Loadable(lazy(() => import('./UserAuthorityCard')));
// import UserInformationCard from "./UserInformationCard";
// import LoadingComponent from "../extra-pages/LoadingComponent";
// import UserGroupCard from "./UserGroupCard";
// import UserAuthorityCard from "./UserAuthorityCard";
import {
GeneralConfirmWindow,
getDeletedRecordWithRefList,
} from "../../utils/CommonFunction";

// ==============================|| DASHBOARD - DEFAULT ||============================== //


const UserMaintainPage = () => {
const params = useParams();
const navigate = useNavigate();
const [userData, setUserData] = React.useState({});
const [onReady, setOnReady] = useState(false);
const [isCollectData, setIsCollectData] = useState(false);
@@ -33,6 +35,9 @@ const UserMaintainPage = () => {
const [userGroupData,setUserGroupData] = useState([]);
const [userAuthData,setUserAuthData] = useState([]);
const [userConfirm, setUserConfirm] = useState(false);
const [isNewRecord, setIsNewRecord] = useState(false);
const [refUserData, setRefUserData] = React.useState({});


function updateUserObject(userData) {
setEditedCustomerData(userData);
@@ -51,30 +56,103 @@ const UserMaintainPage = () => {
setIsCollectData(!isCollectData);
}

useEffect(() => {
console.log(params)
axios.get(`${apiPath}${GET_USER_PATH}/${params.id}`)
// ==============================|| DELETE WINDOW RELATED ||============================== //
const [isWindowOpen, setIsWindowOpen] = useState(false);
const handleClose = () => {
setIsWindowOpen(false);
};

const handleDeleteClick = () => {
setIsWindowOpen(true);
};

function deleteData(){
axios.delete(`${DELETE_USER}/${params.id}`,
)
.then((response) => {
if (response.status === 200) {
setUserData(response.data);
if (response.status === 204) {
// notifyDeleteSuccess();
setIsWindowOpen(false);
navigate('/userSearchview');
}
})
.catch(error => {
console.log(error);
return false;
});
}
// ==============================|| DELETE WINDOW RELATED ||============================== //

useEffect(() => {
if(params.id > 0 ){
axios.get(`${GLD_USER_PATH}/${params.id}`)
.then((response) => {
if (response.status === 200) {
setRefUserData(response.data);
setUserData(response.data);
}
})
.catch(error => {
console.log(error);
return false;
});
}
else{
setUserData(
{
"authIds": [],
"data": {},
"groupIds": []
}
);
setRefUserData(
{
"authIds": [],
"data": {},
"groupIds": []
}
);
setIsNewRecord(true);
}

}, []);

useEffect(() => {
setOnReady(true);
if (Object.keys(userData).length > 0 && userData !== undefined) {
setOnReady(true);
}
else if(isNewRecord){
setOnReady(true);
}
}, [userData]);

useEffect(() => {
if(userConfirm && onReady){
console.log("update in parents");
console.log(editedCustomerData);
console.log(userGroupData);
console.log(userAuthData);
const deletedUserAuth = getDeletedRecordWithRefList(refUserData.authIds,userAuthData);
const deletedUserGroup = getDeletedRecordWithRefList(refUserData.groupIds,userGroupData);
axios.post(`${GLD_USER_PATH}/${params.id}`,
{
"enName": editedCustomerData.enName,
"locked": editedCustomerData.locked,
// "password": editedCustomerData.password,
// "phone": editedCustomerData.phone,
"post": editedCustomerData.post,
"emailAddress": editedCustomerData.emailAddress,
"addGroupIds": userGroupData,
"removeGroupIds": deletedUserGroup,
"addAuthIds": userAuthData,
"removeAuthIds": deletedUserAuth,
},
).then((response) => {
if (response.status === 200) {
// notifySaveSuccess();
navigate('/userSearchview');
}
})
.catch(error => {
console.log(error);
return false;
});
}
setUserConfirm(false);
}, [editedCustomerData,userGroupData,userAuthData]);
@@ -83,9 +161,11 @@ const UserMaintainPage = () => {
!onReady ?
<LoadingComponent/>
:
<Grid container rowSpacing={4.5} columnSpacing={2.75}>
<Grid item xs={12} sx={{mb: -2.25}}>
<Typography variant="h5">Maintain User</Typography>
<Grid container sx={{minHeight: '90vh', paddingTop: '53px'}}>
<Grid item xs={12} height='60px'>
<Stack direction="row" height='100%' justifyContent="flex-start" alignItems="center">
<Typography variant="h5">Maintain User</Typography>
</Stack>
</Grid>
{/*col 1*/}
<Grid item xs={12} md={5} lg={5}>
@@ -95,6 +175,7 @@ const UserMaintainPage = () => {
updateUserObject={updateUserObject}
userData={userData}
isCollectData={isCollectData}
isNewRecord={isNewRecord}
/>
</Grid>

@@ -103,6 +184,7 @@ const UserMaintainPage = () => {
updateUserGroupList={updateUserGroupList}
userData={userData}
isCollectData={isCollectData}
isNewRecord={isNewRecord}
/>
</Grid>
</Grid>
@@ -113,12 +195,35 @@ const UserMaintainPage = () => {
updateUserAuthList={updateUserAuthList}
userData={userData}
isCollectData={isCollectData}
isNewRecord={isNewRecord}
/>
</Grid>

{/*bottom button*/}
<Grid item s={12} md={12} lg={12} sx={{mb: 3}} alignItems={"end"} justifyContent="center">
<Grid container maxWidth justifyContent="flex-end">
<Grid item sx={{ml:3, mr:3, mb:3}}>
<Button
size="large"
variant="contained"
sx={{
textTransform: 'capitalize',
alignItems: 'end'
}}
disabled={isNewRecord}
onClick={handleDeleteClick}
>
Delete User
</Button>
<GeneralConfirmWindow
isWindowOpen={isWindowOpen}
title={"Attention"}
content={`Confirm to delete User "${userData.data.username}" ?`}
onNormalClose={handleClose}
onConfirmClose={deleteData}
/>
</Grid>

<Grid item sx={{ml: 3, mr: 3}}>
<Button
size="large"


+ 7
- 1
src/pages/pnspsUserGroupDetailPage/GroupAuthCard.js View File

@@ -19,12 +19,14 @@ const GroupAuthCard = ({isCollectData, updateUserAuthList,userGroupData}) => {
const [currentAuthData, setCurrentAuthData] = React.useState({});
const [onReady, setOnReady] = useState(false);
const [selectedRow, setSelectedRow] = useState([]);
const [referenceRow, setReferenceRow] = useState([]);

useEffect(() => {
//if user data from parent are not null
if (Object.keys(userGroupData).length > 0 && userGroupData !== undefined) {
setCurrentAuthData(userGroupData.data);
setSelectedRow(userGroupData.authIds);
setReferenceRow(userGroupData.authIds);
}
}, [userGroupData]);

@@ -37,7 +39,11 @@ const GroupAuthCard = ({isCollectData, updateUserAuthList,userGroupData}) => {

useEffect(() => {
//upload latest data to parent
updateUserAuthList(selectedRow);
let deletedList = referenceRow.filter(x => !selectedRow.includes(x));
updateUserAuthList({
"currentList": selectedRow,
"deletedList": deletedList
});
}, [isCollectData]);




+ 2
- 2
src/pages/pnspsUserGroupDetailPage/GroupAuthTable.js View File

@@ -73,11 +73,11 @@ export default function GroupAuthTable({setSelectedRow, userAuth}) {
checkboxSelection
rowSelectionModel={currentSelectedRow}
onRowSelectionModelChange={(ids) => {
console.log(ids);
// console.log(ids);
setSelectedRow(ids);
setCurrentSelectedRow(ids);
}}
autoHeight = {true}
autoHeight
/>
</div>
);


+ 30
- 18
src/pages/pnspsUserGroupDetailPage/UserAddCard.js View File

@@ -23,19 +23,22 @@ const UserAddTable = Loadable(lazy(() => import('./UserAddTable')));
// ==============================|| DASHBOARD - DEFAULT ||============================== //


const UserAddCard = ({isCollectData, updateGroupMember,userGroupData}) => {
const UserAddCard = ({isCollectData, updateGroupMember,userGroupData,isNewRecord}) => {
const [currentUserData, setCurrentUserData] = React.useState({});
const [onReady, setOnReady] = useState(false);
const [groupUserData, setGroupUserData] = useState([]);
const [userComboList, setUserComboList] = useState([]);
const [selectedUser, setSelectedUser] = useState(null);
const [deletedList, setDeletedList] = useState([]);

function updateUserList (){
const idList = getIdList(groupUserData);
if(!idList.includes(selectedUser.id)){
const userList = [...groupUserData, selectedUser];
setGroupUserData(userList);
console.log(userList);
if(selectedUser!==null){
if(!idList.includes(selectedUser.id)){
const userList = [...groupUserData, selectedUser];
setGroupUserData(userList);
console.log(userList);
}
}
}

@@ -61,24 +64,32 @@ const UserAddCard = ({isCollectData, updateGroupMember,userGroupData}) => {

useEffect(() => {
//if state data are ready and assign to different field
if (Object.keys(userGroupData).length > 0 &&currentUserData !== undefined) {
axios.get(`${apiPath}${GET_GROUP_MEMBER_LIST_PATH}?id=${userGroupData.data.id}`)
.then((response) => {
if (response.status === 200) {
setGroupUserData(response.data.records);
}
setOnReady(true);
})
.catch(error => {
console.log(error);
return false;
});
if(isNewRecord){
setOnReady(true);
}
else{
if (Object.keys(userGroupData).length > 0 &&currentUserData !== undefined) {
axios.get(`${apiPath}${GET_GROUP_MEMBER_LIST_PATH}?id=${userGroupData.data.id}`)
.then((response) => {
if (response.status === 200) {
setGroupUserData(response.data.records);
}
setOnReady(true);
})
.catch(error => {
console.log(error);
return false;
});
}
}
}, [currentUserData]);

useEffect(() => {
//upload latest data to parent
updateGroupMember(groupUserData);
updateGroupMember({
"currentList" : groupUserData,
"deletedList" : deletedList
});
}, [isCollectData]);


@@ -131,6 +142,7 @@ const UserAddCard = ({isCollectData, updateGroupMember,userGroupData}) => {

<UserAddTable
setGroupUserData={setGroupUserData}
setDeletedList={setDeletedList}
userList={groupUserData}
/>
</MainCard>


+ 13
- 7
src/pages/pnspsUserGroupDetailPage/UserAddTable.js View File

@@ -14,9 +14,10 @@ const LoadingComponent = Loadable(lazy(() => import('../extra-pages/LoadingCompo

// ==============================|| EVENT TABLE ||============================== //

export default function UserAddTable({setGroupUserData, userList}) {
export default function UserAddTable({setGroupUserData, userList,setDeletedList}) {
const [groupData, setGroupData] = useState([]);
const [onReady, setOnReady] = useState(false);
const [localDeletedList, setLocalDeletedList] = React.useState([]);

useEffect(() => {
setGroupData(userList);
@@ -26,6 +27,10 @@ export default function UserAddTable({setGroupUserData, userList}) {
setGroupData(userList);
}, [userList]);

useEffect(() => {
setDeletedList(localDeletedList);
}, [localDeletedList]);

useEffect(() => {
//if state data are ready and assign to different field
if (groupData !== undefined) {
@@ -34,11 +39,18 @@ export default function UserAddTable({setGroupUserData, userList}) {
}, [groupData]);

const handleDeleteClick = (id) => () => {
if(id >0){
const temp = [...localDeletedList, id];
console.log("temp here");
console.log(temp);
setLocalDeletedList(temp);
}
const newList =removeObjectWithId(groupData,id)
setGroupUserData(newList);
setGroupData(newList);
};


const columns = [
{
field: 'actions',
@@ -64,12 +76,6 @@ export default function UserAddTable({setGroupUserData, userList}) {
headerName: 'User',
flex: 1,
},
// {
// id: 'subDiv',
// field: 'subDivisionName',
// headerName: 'Sub-Division',
// flex: 1,
// },
];

return (


+ 123
- 26
src/pages/pnspsUserGroupDetailPage/index.js View File

@@ -8,8 +8,14 @@ import * as React from "react";
import axios from "axios";
import {apiPath} from "../../auth/utils";
import {useParams} from "react-router-dom";
import {getIdList} from "../../utils/CommonFunction";
import {GET_GROUP_LIST_PATH} from "../../utils/ApiPathConst";
import {
GeneralConfirmWindow,
getDeletedRecordWithRefList,
getIdList,
notifyDeleteSuccess,
// notifySaveSuccess
} from "../../utils/CommonFunction";
import {POST_AND_UPDATE_USER_GROUP,GET_GROUP_LIST_PATH } from "../../utils/ApiPathConst";

import Loadable from 'components/Loadable';
import { lazy } from 'react';
@@ -17,10 +23,8 @@ const LoadingComponent = Loadable(lazy(() => import('../extra-pages/LoadingCompo
const GroupAuthCard = Loadable(lazy(() => import('./GroupAuthCard')));
const UserGroupInfoCard = Loadable(lazy(() => import('./UserGroupInfoCard')));
const UserAddCard = Loadable(lazy(() => import('./UserAddCard')));
//import LoadingComponent from "../extra-pages/LoadingComponent";
//import GroupAuthCard from "./GroupAuthCard";
//import UserGroupInfoCard from "./UserGroupInfoCard";
//import UserAddCard from "./UserAddCard";
import {useNavigate} from "react-router";



// ==============================|| DASHBOARD - DEFAULT ||============================== //
@@ -28,6 +32,7 @@ const UserAddCard = Loadable(lazy(() => import('./UserAddCard')));

const UserMaintainPage = () => {
const params = useParams();
const navigate = useNavigate();
const [onReady, setOnReady] = useState(false);
const [isCollectData, setIsCollectData] = useState(false);
const [editedGroupData, setEditedGroupData] = useState({});
@@ -35,17 +40,47 @@ const UserMaintainPage = () => {
const [userAuthData,setUserAuthData] = useState([]);
const [userConfirm, setUserConfirm] = useState(false);
const [groupMember, setGroupMember] = useState([]);
const [isNewRecord, setIsNewRecord] = useState(false);
const [deletedUserList, setDeletedUserList] = React.useState([]);
const [deletedAuthList, setDeletedAuthList] = React.useState([]);

const [isWindowOpen, setIsWindowOpen] = React.useState(false);
const handleClose = () => {
setIsWindowOpen(false);
};

const handleDeleteClick = () => {
setIsWindowOpen(true);
};

function deleteData(){
axios.delete(`${apiPath}${GET_GROUP_LIST_PATH}/${params.id}`,
)
.then((response) => {
if (response.status === 204) {
notifyDeleteSuccess();
setIsWindowOpen(false);
navigate('/usergroupSearchview');
}
})
.catch(error => {
console.log(error);
return false;
});
}

function updateGroupObject(groupData) {
setEditedGroupData(groupData);
}

function updateGroupMember(groupMember){
setGroupMember(groupMember);
setGroupMember(groupMember.currentList);
setDeletedUserList(groupMember.deletedList);
}

function updateUserAuthList(userAuthData){
setUserAuthData(userAuthData);
setUserAuthData(userAuthData.currentList);
setDeletedAuthList(userAuthData.deletedList);
}

const submitData = () => {
@@ -54,30 +89,67 @@ const UserMaintainPage = () => {
}

useEffect(() => {
axios.get(`${apiPath}${GET_GROUP_LIST_PATH}/${params.id}`)
.then((response) => {
if (response.status === 200) {
setUserGroupData(response.data);
if(params.id > 0 ){
axios.get(`${apiPath}${GET_GROUP_LIST_PATH}/${params.id}`)
.then((response) => {
if (response.status === 200) {
setUserGroupData(response.data);
}
})
.catch(error => {
console.log(error);
return false;
});
}
else{
//new record case
setUserGroupData(
{
"authIds": [],
"data": {},
"userIds": []
}
})
.catch(error => {
console.log(error);
return false;
});
);
setIsNewRecord(true);
}

}, []);

useEffect(() => {
console.log(userGroupData);
setOnReady(true);
if (Object.keys(userGroupData).length > 0 && userGroupData !== undefined) {
setOnReady(true);
}
else if(isNewRecord){
setOnReady(true);
}
}, [userGroupData]);

useEffect(() => {
if(userConfirm && onReady){
console.log("update in parents");
console.log(editedGroupData);
console.log(groupMember);
console.log(getIdList(groupMember));
console.log(userAuthData);
//avoid delete and add user at the same time
let finalDeletedUserList = getDeletedRecordWithRefList(deletedUserList, getIdList(groupMember));
console.log(finalDeletedUserList)
axios.post(POST_AND_UPDATE_USER_GROUP,
{
"id": parseInt(params.id) !== -1? parseInt(params.id) : null,
"name": editedGroupData.userGroupName,
"description": editedGroupData.description,
"addUserIds": getIdList(groupMember),
"removeUserIds": finalDeletedUserList,
"addAuthIds": userAuthData,
"removeAuthIds": deletedAuthList,
},
)
.then((response) => {
if (response.status === 200) {
// notifySaveSuccess();
navigate('/usergroupSearchview');
}
})
.catch(error => {
console.log(error);
return false;
});
}
setUserConfirm(false);
}, [editedGroupData,userGroupData,userAuthData]);
@@ -88,7 +160,7 @@ const UserMaintainPage = () => {
:
<Grid container rowSpacing={4.5} columnSpacing={2.75}>
<Grid item xs={12} sx={{mb: -2.25}}>
<Typography variant="h5">Maintain User Group</Typography>
<Typography variant="h5">{isNewRecord? "Create User Group" : "Maintain User Group"}</Typography>
</Grid>
{/*col 1*/}
<Grid item xs={12} md={5} lg={5}>
@@ -98,6 +170,7 @@ const UserMaintainPage = () => {
updateGroupObject={updateGroupObject}
userGroupData={userGroupData}
isCollectData={isCollectData}
isNewRecord={isNewRecord}
/>
</Grid>

@@ -106,6 +179,7 @@ const UserMaintainPage = () => {
updateGroupMember={updateGroupMember}
userGroupData={userGroupData}
isCollectData={isCollectData}
isNewRecord={isNewRecord}
/>
</Grid>
</Grid>
@@ -116,12 +190,35 @@ const UserMaintainPage = () => {
updateUserAuthList={updateUserAuthList}
userGroupData={userGroupData}
isCollectData={isCollectData}
isNewRecord={isNewRecord}
/>
</Grid>

{/*bottom button*/}
<Grid item s={12} md={12} lg={12} sx={{mb: 3}} alignItems={"end"} justifyContent="center">
<Grid container maxWidth justifyContent="flex-end">
<Grid item sx={{ml:3, mr:3, mb:3}}>
<Button
size="large"
variant="contained"
sx={{
textTransform: 'capitalize',
alignItems: 'end'
}}
disabled={isNewRecord}
onClick={handleDeleteClick}
>
Delete User Group
</Button>
<GeneralConfirmWindow
isWindowOpen={isWindowOpen}
title={"Attention"}
content={`Confirm to delete User Group "${userGroupData.data.name}" ?`}
onNormalClose={handleClose}
onConfirmClose={deleteData}
/>
</Grid>

<Grid item sx={{ml: 3, mr: 3}}>
<Button
size="large"
@@ -133,7 +230,7 @@ const UserMaintainPage = () => {
}}
onClick={submitData}
>
Save User
Save User Group
</Button>
</Grid>
</Grid>


+ 1
- 1
src/pages/pnspsUserGroupSearchPage/UserGroupTable.js View File

@@ -68,7 +68,7 @@ export default function UserGroupTable({recordList}) {
},
}}
pageSizeOptions={[10, 15, 20]}
autoHeight = {true}
autoHeight
/>
</div>
);


+ 10
- 10
src/pages/pnspsUserGroupSearchPage/index.js View File

@@ -1,11 +1,11 @@
// material-ui
import {
Box,
Button,
// Box,
Stack,
// Button,
Grid, Typography
} from '@mui/material';
import MainCard from "../../components/MainCard";

import {useEffect, useState} from "react";
import axios from "axios";
import {apiPath} from "../../auth/utils";
@@ -64,15 +64,15 @@ const UserGroupSearchPanel = () => {
!onReady ?
<LoadingComponent/>
:
<Grid container rowSpacing={4.5} columnSpacing={2.75}>
<Grid container sx={{minHeight: '90vh', paddingTop: '53px'}}>
<Grid item xs={12} md={12} lg={12}>
<Grid container justifyContent="flex-start" alignItems="center">
<Grid item xs={1} sx={{mb: -2.25}} >
<Box sx={{ display: 'flex', alignItems: 'center'}}>
<Typography align="center" variant="h5" sx={{mb:2}}>View User Group</Typography>
</Box>
<Grid item xs={12} height='50px'>
<Stack direction="row" height='100%' justifyContent="flex-start" alignItems="center">
<Typography ml={2} align="center" variant="h5">View User Group</Typography>
</Stack>
</Grid>
<Grid item xs={1} sx={{ml: 3, mr: 3}}>
{/* <Grid item xs={1} sx={{ml: 3, mr: 3}}>
<Button
size="large"
variant="contained"
@@ -80,7 +80,7 @@ const UserGroupSearchPanel = () => {
>
Create
</Button>
</Grid>
</Grid> */}
</Grid>
</Grid>



+ 26
- 72
src/pages/pnspsUserSearchPage/UserSearchForm.js View File

@@ -11,34 +11,16 @@ import {useForm} from "react-hook-form";
import {
// useEffect,
useState} from "react";
// import Autocomplete from '@mui/material/Autocomplete';
// import {
// subDivision1,
// subDivision2,
// subDivision3,
// subDivision4,
// subDivision5,
// subDivision6
// } from "pages/pnspsUserSearchPage/DummyComboRecord";

import Checkbox from "@mui/material/Checkbox";
import * as React from "react";
// import AddCircleOutlineIcon from '@mui/icons-material/AddCircleOutline';
// ==============================|| DASHBOARD - DEFAULT ||============================== //

// const subDivisionArray =[
// ...subDivision1,
// ...subDivision2,
// ...subDivision3,
// ...subDivision4,
// ...subDivision5,
// ...subDivision6
// ];

const UserSearchForm = ({applySearch}) => {

const [type, setType] = useState([]);
// const [division, setDivision] = useState(null);
// const [subDivision, setSubDivision] = useState(null);
// const [isLotusNoteUser, setIsLotusNoteUser] = useState(false);
const [locked, setLocked] = useState(false);


@@ -55,31 +37,24 @@ const UserSearchForm = ({applySearch}) => {
username: data.userName,
fullenName: data.fullenName,
post: data.post,
// subDivision: subDivision,
email: data.email,
phone: data.phone,
// isLotusNoteUser: isLotusNoteUser,
locked: locked,
};
applySearch(temp);
};

// useEffect(() => {
// if(division != null){
// setSubDivision(subDivisionArray[division.type-1][0]);
// }

// }, [division]);

function resetForm(){
setType([]);
// setDivision(null);
// setSubDivision(null);
// setIsLotusNoteUser(false);
setLocked(false);
reset();
}

// const handleNewUserClick = (id) => () => {
// navigate('/user/'+ id);
// };

return (
<MainCard xs={12} md={12} lg={12}
border={false}
@@ -89,7 +64,7 @@ const UserSearchForm = ({applySearch}) => {
{/*row 1*/}
<CardContent sx={{ px: 2.5, pt: 3 }}>
<Grid item justifyContent="space-between" alignItems="center">
Search Form
Search Form (GLD User)
</Grid>
</CardContent>

@@ -122,19 +97,6 @@ const UserSearchForm = ({applySearch}) => {
/>
</Grid>

{/* <Grid item xs={9} s={6} md={5} lg={3} sx={{ml:3, mr:3, mb:3}}>
<Autocomplete
disablePortal
id="sub-division-combo"
value={subDivision === null? null : subDivision}
options={subDivisionArray}
onChange={(event, newValue) => {
setSubDivision(newValue);
}}
renderInput={(params) => <TextField {...params} label="Sub-Division" />}
/>
</Grid> */}

<Grid item xs={9} s={6} md={5} lg={3} sx={{ml:3, mr:3, mb:3}}>
<TextField
fullWidth
@@ -153,21 +115,6 @@ const UserSearchForm = ({applySearch}) => {
/>
</Grid>

{/* <Grid item xs={9} s={6} md={5} lg={3} sx={{ml:3, mr:3, mb:3}}>
<FormControlLabel
control={
<Checkbox
checked={isLotusNoteUser}
onChange={(event) => setIsLotusNoteUser(event.target.checked)}
name="checked"
color="primary"
size="small"
/>
}
label={<Typography variant="h6">Lotus Notes User</Typography>}
/>
</Grid> */}

<Grid item xs={9} s={6} md={5} lg={3} sx={{ml:3, mr:3, mb:3}}>
<FormControlLabel
control={
@@ -182,20 +129,10 @@ const UserSearchForm = ({applySearch}) => {
label={<Typography variant="h6">Locked</Typography>}
/>
</Grid>
{/*<Grid item xs={9} s={6} md={5} lg={3} sx={{ml:3, mr:3, mb:3}}>*/}
{/* <TextField*/}
{/* fullWidth*/}
{/* {...register("subDivisionId")}*/}
{/* id="subDivision"*/}
{/* label="Sub-Division"*/}
{/* />*/}
{/*</Grid>*/}

</Grid>

{/*last row*/}
<Grid container maxWidth justifyContent="flex-end">

<Grid container maxWidth justifyContent="flex-start" direction="row" alignItems="center">
<Grid item sx={{ml:3, mr:3, mb:3, mt:3}}>
<Button
size="large"
@@ -220,7 +157,24 @@ const UserSearchForm = ({applySearch}) => {
}}>
Submit
</Button>
</Grid>
</Grid>
{/* <Grid item sx={{ml:6, mr:6, mb:6, mt:6}}>
<Grid container direction="row" justifyContent="flex-start" alignItems="center">
</Grid>
</Grid> */}
{/* <Grid item sx={{ml:3, mr:3, mb:3, mt:3}}>
<Button
size="large"
variant="contained"
onClick={handleNewUserClick}
sx={{
textTransform: 'capitalize',
alignItems: 'end'
}}>
<AddCircleOutlineIcon/>
New User
</Button>
</Grid> */}
</Grid>
</form>
</MainCard>


+ 40
- 43
src/pages/pnspsUserSearchPage/UserTable.js View File

@@ -9,9 +9,12 @@ import {useEffect} from "react";
import {useNavigate} from "react-router-dom";
import { useTheme } from '@mui/material/styles';
import Checkbox from '@mui/material/Checkbox';
import * as UrlUtils from "../../utils/ApiPathConst";
import * as HttpUtils from '../../utils/HttpUtils';

// ==============================|| EVENT TABLE ||============================== //

export default function UserTable({recordList}) {
export default function UserTable({recordList,setChangeLocked}) {
const [rows, setRows] = React.useState(recordList);
const [rowModesModel] = React.useState({});
const theme = useTheme();
@@ -26,6 +29,36 @@ export default function UserTable({recordList}) {
navigate('/user/'+ id);
};

const handleLock = (params) => () => {
setChangeLocked(false)
if (params.row.locked==true){
doUnlock(params.id)
}else{
doLock(params.id)
setRows(recordList);
}
}

const doLock = (id) => {
HttpUtils.get({
url: UrlUtils.GET_USER_LOCK+"/"+id,
onSuccess: function(){
setRows(recordList);
setChangeLocked(true)
}
});
};

const doUnlock = (id) => {
HttpUtils.get({
url: UrlUtils.GET_USER_UNLOCK+"/"+id,
onSuccess: function(){
setRows(recordList);
setChangeLocked(true)
}
});
};

const columns = [
{
field: 'actions',
@@ -52,8 +85,8 @@ export default function UserTable({recordList}) {
flex: 1,
},
{
id: 'name',
field: 'name',
id: 'enName',
field: 'enName',
headerName: 'Full Name',
flex: 1,
},
@@ -64,47 +97,11 @@ export default function UserTable({recordList}) {
flex: 1,
},
{
id: 'email',
field: 'email',
id: 'emailAddress',
field: 'emailAddress',
headerName: 'Email',
flex: 1,
},
// {
// id: 'subDivisionId',
// field: 'subDivisionId',
// //type: 'date',
// //sortable: false,
// headerName: 'Sub-Division',
// flex: 1,
// },

// {
// id: 'subDivisionId',
// field: 'subDivisionId',
// //type: 'date',
// //sortable: false,
// headerName: 'Sub-Division',
// flex: 1,
// },
// {
// id: 'lotusNotesUser',
// field: 'lotusNotesUser',
// type: 'bool',
// headerName: 'Lotus Notes User',
// flex: 1,
// renderCell: (params) => {
// return (
// <Checkbox
// theme={theme}
// key="locked"
// checked={params.row.lotusNotesUser}
// color="primary"
// size="small"
// //onChange={handleChange}
// />
// );
// },
// },

{
id: 'locked',
@@ -120,7 +117,7 @@ export default function UserTable({recordList}) {
checked={params.row.locked}
color="primary"
size="small"
//onChange={handleChange}
onClick={handleLock(params)}
/>
);
},
@@ -140,7 +137,7 @@ export default function UserTable({recordList}) {
},
}}
pageSizeOptions={[5, 10]}
autoHeight = {true}
autoHeight
/>
</div>
);


+ 5
- 4
src/pages/pnspsUserSearchPage/index.js View File

@@ -5,8 +5,7 @@ import {
import MainCard from "../../components/MainCard";
import {useEffect, useState} from "react";
import axios from "axios";
import {apiPath} from "../../auth/utils";
import {GET_USER_PATH} from "../../utils/ApiPathConst";
import {GLD_USER_PATH} from "../../utils/ApiPathConst";
import * as React from "react";

// import LoadingComponent from "../extra-pages/LoadingComponent";
@@ -25,10 +24,11 @@ const UserSettingPage = () => {
const [record,setRecord] = useState([]);
const [searchCriteria, setSearchCriteria] = useState({});
const [onReady, setOnReady] = useState(false);
const [changelocked, setChangeLocked] = React.useState(false);

useEffect(() => {
getUserList();
}, []);
}, [changelocked]);

useEffect(() => {
setOnReady(true);
@@ -39,7 +39,7 @@ const UserSettingPage = () => {
}, [searchCriteria]);

function getUserList(){
axios.get(`${apiPath}${GET_USER_PATH}`,
axios.get(`${GLD_USER_PATH}`,
{params: searchCriteria}
)
.then((response) => {
@@ -78,6 +78,7 @@ const UserSettingPage = () => {
>
<EventTable
recordList={record}
setChangeLocked={setChangeLocked}
/>
</MainCard>
</Grid>


+ 1
- 1
src/pages/pnspsUserSearchPage_Individual/UserTable_Individual.js View File

@@ -145,7 +145,7 @@ export default function UserTable_Individual({recordList}) {
},
}}
pageSizeOptions={[5, 10]}
autoHeight = {true}
autoHeight
/>
</div>
);


+ 1
- 1
src/pages/pnspsUserSearchPage_Organization/UserTable_Organization.js View File

@@ -139,7 +139,7 @@ export default function UserTable_Organization({recordList}) {
},
}}
pageSizeOptions={[5, 10]}
autoHeight = {true}
autoHeight
/>
</div>
);


+ 9
- 3
src/utils/ApiPathConst.js View File

@@ -8,7 +8,7 @@ export const GET_GROUP_COMBO_PATH = '/group/combo';
export const GET_GROUP_MEMBER_LIST_PATH = '/group/member';
export const GET_GROUP_AUTH_LIST = '/group/auth/combo';

export const GET_USER_PATH = '/user/gld';
export const GLD_USER_PATH = apiPath+'/user/gld';
export const GET_AUTH_LIST = '/user/auth/combo';
export const GET_USER_COMBO_LIST = '/user/combo';
export const GET_USER_LOCK = apiPath+'/user/lock';
@@ -41,6 +41,12 @@ export const POST_CAPTCHA = apiPath+'/captcha';
export const POST_PUBLIC_USER_REGISTER = apiPath+'/user/register';



//Public
export const GET_PUBLIC_ORG_USER_LIST = apiPath+'/user/listOrg';
export const GET_PUBLIC_ORG_USER_LIST = apiPath+'/user/listOrg';

//GLD User
export const POST_ADMIN_USER_REGISTER = apiPath+'/user/registry';
export const DELETE_USER = apiPath+'/user';

//User Group
export const POST_AND_UPDATE_USER_GROUP = apiPath+'/group/save';

+ 97
- 1
src/utils/CommonFunction.js View File

@@ -1,3 +1,16 @@
// import {toast} from "react-toastify";
import DialogTitle from "@mui/material/DialogTitle";
import DialogContent from "@mui/material/DialogContent";
import DialogContentText from "@mui/material/DialogContentText";
import DialogActions from "@mui/material/DialogActions";
import {Button} from "@mui/material";
import Dialog from "@mui/material/Dialog";
import * as React from "react";

export function getDeletedRecordWithRefList(referenceList, updatedList){
return referenceList.filter(x => !updatedList.includes(x)) ;
}

export function getIdList(input){
const output = input.map(function (obj) {
return obj.id;
@@ -5,10 +18,93 @@ export function getIdList(input){
return output;
}

export function getObjectById(list, id){
const obj = list.find((element) => {
return element.id === id;
});
return obj === undefined || Object.keys(obj).length <= 0? null : obj
}

export function removeObjectWithId(arr, id) {
// Making a copy with the Array from() method
const arrCopy = Array.from(arr);
const objWithIdIndex = arrCopy.findIndex((obj) => obj.id === id);
arrCopy.splice(objWithIdIndex, 1);
return arrCopy;
}

export function getDateString(queryDateArray) {
return(
queryDateArray[0]
+ "-" +
queryDateArray[1]
+ "-" +
queryDateArray[2]
+ " " +
queryDateArray[3]
+ ":" +
queryDateArray[4]
+ ":" +
queryDateArray[5]
)
}

// export const notifySaveSuccess = () => toast.success('Save success!', {
// position: "bottom-right",
// autoClose: 5000,
// hideProgressBar: false,
// closeOnClick: true,
// pauseOnHover: true,
// draggable: true,
// progress: undefined,
// theme: "light",
// });

export const notifyDeleteSuccess = () => toast.success('Delete Success!', {
position: "bottom-right",
autoClose: 5000,
hideProgressBar: false,
closeOnClick: true,
pauseOnHover: true,
draggable: true,
progress: undefined,
theme: "light",
});

export function prettyJson(json){
console.log(json);
console.log(JSON.stringify(json, null, 2));
return (
<div>{JSON.stringify(json, null, 2)}</div>
);
}

export function GeneralConfirmWindow({
isWindowOpen,
title,
content,
onNormalClose,
onConfirmClose}){
return (
<Dialog
open={isWindowOpen}
onClose={onNormalClose}
aria-labelledby="alert-dialog-title"
aria-describedby="alert-dialog-description"
>
<DialogTitle id="alert-dialog-title">
{title}
</DialogTitle>
<DialogContent>
<DialogContentText id="alert-dialog-description">
{content}
</DialogContentText>
</DialogContent>
<DialogActions>
<Button onClick={onNormalClose}>Cancel</Button>
<Button onClick={onConfirmClose} autoFocus>
Confirm
</Button>
</DialogActions>
</Dialog>
)
}

Loading…
Cancel
Save