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
}
-
-
+
+