diff --git a/src/components/PwTablePanel/PwTablePanel.component.scss b/src/components/PwTablePanel/PwTablePanel.component.scss new file mode 100755 index 0000000..6db1dd0 --- /dev/null +++ b/src/components/PwTablePanel/PwTablePanel.component.scss @@ -0,0 +1,3 @@ +.c-PwTablePanel { + +} diff --git a/src/components/PwTablePanel/PwTablePanel.jsx b/src/components/PwTablePanel/PwTablePanel.jsx new file mode 100755 index 0000000..d00b953 --- /dev/null +++ b/src/components/PwTablePanel/PwTablePanel.jsx @@ -0,0 +1,77 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { useNavigate } from 'react-router-dom'; +import { styled } from '@mui/material/styles'; +import { TableBody, TableCell, TableRow } from '@mui/material'; +import BasicTable from 'components/BasicTable'; +import TabPanel from 'components/Tabs'; +import EditIcon from '@mui/icons-material/Edit'; +import "./PwTablePanel.component.scss"; + +const PwTablePanel = props => { + const {backgroundColor, classes, color, headCells, id, index, navUrl, records, table, value} = props; + const navigate = useNavigate(); + + const StyledTableRow = styled(TableRow)(({ theme }) => ({ + '&:nth-of-type(even)': { + backgroundColor: theme.palette.action.hover + } + })); + + const rowRenders = ({records, headers, navUrl, table}) => { + return records && records.map((record, keyouter) => { + return + {headers.map((columnConfig, key) => { + const canEdit = columnConfig.isEditAnchor; + const isAfter = columnConfig.placement && columnConfig.placement === 'after'; + const limitWidth = columnConfig.limitWidth; + return canEdit && navigate(navUrl, {state: {[table]: record}})}> + {canEdit + ? isAfter + ? + {columnConfig.value(record)} + + + : + + {columnConfig.value(record)} + + : {columnConfig.value(record)}} + ; + } + )} + ; + }); + }; + + return + + + {records && records.length > 0 && rowRenders({records, headers: headCells, navUrl, table})} + + + {(!records || records.length === 0) + &&

No Records to Display

} +
+}; + +PwTablePanel.propTypes = { + backgroundColor: PropTypes.string, + classes: PropTypes.string, + color: PropTypes.string, + headCells: PropTypes.array, + id: PropTypes.string, + index: PropTypes.number, + navUrl: PropTypes.string, + records: PropTypes.array, + table: PropTypes.string, + value: PropTypes.number +}; + +export default PwTablePanel; \ No newline at end of file diff --git a/src/components/PwTablePanel/PwTablePanel.test.js b/src/components/PwTablePanel/PwTablePanel.test.js new file mode 100755 index 0000000..66fa815 --- /dev/null +++ b/src/components/PwTablePanel/PwTablePanel.test.js @@ -0,0 +1,8 @@ +import React from "react"; +import PwTablePanel from "./PwTablePanel"; + +describe("PwTablePanel", () => { + it("renders without error", () => { + + }); +}); \ No newline at end of file diff --git a/src/components/PwTablePanel/index.js b/src/components/PwTablePanel/index.js new file mode 100755 index 0000000..e1f66af --- /dev/null +++ b/src/components/PwTablePanel/index.js @@ -0,0 +1,3 @@ +import PwTablePanel from "./PwTablePanel.jsx"; + +export default PwTablePanel; \ No newline at end of file diff --git a/src/components/SearchBar/index.js b/src/components/SearchBar/index.js index 3a5c1f5..5a8e7ef 100644 --- a/src/components/SearchBar/index.js +++ b/src/components/SearchBar/index.js @@ -1,8 +1,11 @@ import { TextField, InputAdornment, SvgIcon } from '@mui/material'; +import PropTypes from 'prop-types'; import { makeStyles } from '@mui/styles'; import Search from 'assets/images/SearchIcon'; -function SearchBar() { +function SearchBar(props) { + + const {onChange} = props; const useStyles = makeStyles(() => ({ textField: { @@ -30,8 +33,13 @@ function SearchBar() { }} placeholder="Search" variant="outlined" + onChange={onChange} /> ); } + +SearchBar.propTypes = { + onChange: PropTypes.func +} export default SearchBar; diff --git a/src/components/index.js b/src/components/index.js index 21b318e..4ade298 100755 --- a/src/components/index.js +++ b/src/components/index.js @@ -1,9 +1,11 @@ /* PLOP_INJECT_IMPORT */ +import PwTablePanel from './PwTablePanel'; import Toggles from './Toggles'; import AllocationManager from './AllocationManager'; export { /* PLOP_INJECT_EXPORT */ + PwTablePanel, Toggles, AllocationManager }; diff --git a/src/pages/createEditUser/index.js b/src/pages/createEditUser/index.js index bb0202f..ea74d40 100644 --- a/src/pages/createEditUser/index.js +++ b/src/pages/createEditUser/index.js @@ -251,7 +251,7 @@ function CreateEditUser(props) { route={[ { name: 'Home', path: '/home' }, { name: 'Setup', path: '/setup' }, - { name: 'Access', path: '/setup/users-access' }, + { name: 'User Access', path: '/setup/users-access' }, { name: 'User Details' } ]} /> diff --git a/src/pages/useraccess/index.js b/src/pages/useraccess/index.js index 274c1f0..7f0e7a8 100644 --- a/src/pages/useraccess/index.js +++ b/src/pages/useraccess/index.js @@ -2,19 +2,16 @@ import moment from 'moment'; import React, { useEffect, useState, useMemo } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { useNavigate } from 'react-router-dom'; -import { styled } from '@mui/material/styles'; -import { Grid, TableBody, TableCell, TableRow, Tabs, Tab } from '@mui/material'; +import { Grid, Tabs, Tab } from '@mui/material'; import { makeStyles } from '@mui/styles'; import MDBox from 'components/MDBox'; -import EditIcon from '@mui/icons-material/Edit'; import DashboardNavbar from 'components/DashboardNavbar'; import DashboardLayout from 'layouts/DashboardLayout'; -import BasicTable from 'components/BasicTable'; import SearchBar from 'components/SearchBar'; import MDButton from 'components/Button'; -import TabPanel from 'components/Tabs'; import Breadcrumbs from 'components/Breadcrumbs'; +import { PwTablePanel } from 'components'; import WarehouseActions, { WarehouseSelectors } from 'redux/WarehouseRedux'; import InventoryActions, { InventorySelectors } from 'redux/InventoryRedux'; @@ -90,7 +87,7 @@ const useStyles = makeStyles((theme) => ({ function UserAccessScreen() { const classes = useStyles(); const dispatch = useDispatch(); - const [value, setValue] = useState(1); + const [value, setValue] = useState(0); const usersData = useSelector(UsersSelectors.getUsersDetail); const rolesData = useSelector(RolesSelectors.getRolesDetail); const warehouses = useSelector(WarehouseSelectors.getWarehouseDetail); @@ -99,6 +96,8 @@ function UserAccessScreen() { const permissions = useSelector(PermissionsSelectors.getPermissionsDetail); const [userRecords, setUserRecords] = useState([]); const [rolesRecords, setRoleRecords] = useState([]); + const [originalUserRecords, setOriginalUserRecords] = useState([]); + const [originalRolesRecords, setOriginalRoleRecords] = useState([]); const navigate = useNavigate(); useEffect(() => { @@ -181,6 +180,7 @@ function UserAccessScreen() { item.role_name = item.roles.map((role) => role.name).join(','); return item; }); + setOriginalUserRecords(users); setUserRecords(users); } @@ -195,6 +195,7 @@ function UserAccessScreen() { item.status = item.status ? 'ACTIVE' : 'INACTIVE'; return item; }); + setOriginalRoleRecords(roles); setRoleRecords(roles); } }, [rolesData, usersData]); @@ -203,37 +204,26 @@ function UserAccessScreen() { setValue(val); }; - const StyledTableRow = styled(TableRow)(({ theme }) => ({ - '&:nth-of-type(even)': { - backgroundColor: theme.palette.action.hover - } - })); - - const rowRenders = ({records, headers, navUrl, table}) => { - return records && records.map((record, keyouter) => { - return - {headers.map((columnConfig, key) => { - const canEdit = columnConfig.isEditAnchor; - const isAfter = columnConfig.placement && columnConfig.placement === 'after'; - const limitWidth = columnConfig.limitWidth; - return canEdit && navigate(navUrl, {state: {[table]: record}})}> - {canEdit - ? isAfter - ? - - {columnConfig.value(record)} - - : - {columnConfig.value(record)} - - - : {columnConfig.value(record)}} - ; - } - )} - ; - }); + const handleSearch = (e, currentTab) => { + const value = e.target.value; + let records = currentTab === 0 ? originalUserRecords : originalRolesRecords; + records = JSON.parse(JSON.stringify(records)); + records.forEach(record => record.status = record.status ? 'ACTIVE' : 'INACTIVE'); + let searchList = currentTab === 0 ? ['fullName', 'phoneNumber', 'role_name', 'status'] : ['name', 'permissions', 'status'] + const setter = currentTab === 0 ? setUserRecords : setRoleRecords; + searchList = searchList.concat(['createdBy.fullName', 'createdAt', 'updatedBy.fullName', 'updatedAt']); + const filteredRecords = records.filter(record => searchList.some(field => { + let recordInner = {...record}; + if (field.indexOf('.') > -1) { + field = field.split('.'); + recordInner = recordInner[field[0]]; + field = field[1]; + } + return recordInner && recordInner[field] !== undefined && typeof recordInner[field] === 'string' + && recordInner[field].toLowerCase().indexOf(value?.toLowerCase()) > -1 + })); + records.forEach(record => record.status = record.status === 'ACTIVE'); + setter(filteredRecords); }; return ( @@ -244,15 +234,15 @@ function UserAccessScreen() { route={[ { name: 'Home', path: '/home' }, { name: 'Setup', path: '/setup' }, - { name: 'Users Access' } + { name: 'User Access' } ]} /> - - + + - rolesHandler()} /> usersHandler()} /> + rolesHandler()} /> - + handleSearch(e, value)} /> - navigate(`/setup/users-access/${value === 0 ? 'create-role' : 'create-user'}`) + navigate(`/setup/users-access/${value === 0 ? 'create-user' : 'create-role'}`) } > - {value === 0 ? '+ CREATE ROLE' : '+ CREATE USER'} + {value === 0 ? '+ CREATE USER' : '+ CREATE ROLE'} - - - {rolesRecords && rolesRecords.length > 0 - ? - {rowRenders({records: rolesRecords, headers: rolesHeadCells, navUrl: '/setup/users-access/edit-role', table: 'role'})} - :

No Records to Display

} -
-
- - - {userRecords && userRecords.length > 0 - ? - {rowRenders({records: userRecords, headers: userHeadCells, navUrl: '/setup/users-access/edit-user', table: 'user'})} - :

No Records to Display

} -
-
+ +