This commit is contained in:
@@ -25,6 +25,7 @@ import ViewEmployee from "./components/employees/ViewEmployee";
|
|||||||
import CreateRoute from "./components/trans-routes/CreateRoute";
|
import CreateRoute from "./components/trans-routes/CreateRoute";
|
||||||
import Admin from './components/admin/Admin';
|
import Admin from './components/admin/Admin';
|
||||||
import CustomerReport from "./components/admin/CustomerReport";
|
import CustomerReport from "./components/admin/CustomerReport";
|
||||||
|
import Permission from "./components/admin/Permission";
|
||||||
import Login from "./components/login/Login";
|
import Login from "./components/login/Login";
|
||||||
import RoutesHistory from "./components/trans-routes/RoutesHistory";
|
import RoutesHistory from "./components/trans-routes/RoutesHistory";
|
||||||
import RouteTemplatesList from "./components/trans-routes/RouteTemplatesList";
|
import RouteTemplatesList from "./components/trans-routes/RouteTemplatesList";
|
||||||
@@ -225,6 +226,7 @@ function App() {
|
|||||||
<Route path="/admin" element={<Admin />}>
|
<Route path="/admin" element={<Admin />}>
|
||||||
<Route path="" element={<Navigate replace to="customer-report" />} />
|
<Route path="" element={<Navigate replace to="customer-report" />} />
|
||||||
<Route path="customer-report" element={<CustomerReport/>} />
|
<Route path="customer-report" element={<CustomerReport/>} />
|
||||||
|
<Route path="permission" element={<Permission/>} />
|
||||||
</Route>
|
</Route>
|
||||||
|
|
||||||
<Route path="/dashboard/dashboard" element={<Dashboard/>} />
|
<Route path="/dashboard/dashboard" element={<Dashboard/>} />
|
||||||
|
|||||||
102
client/src/components/admin/Permission.js
Normal file
102
client/src/components/admin/Permission.js
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
import React, { useEffect, useState } from "react";
|
||||||
|
import { useNavigate } from "react-router-dom";
|
||||||
|
import { Breadcrumb } from "react-bootstrap";
|
||||||
|
import { AuthService, EmployeeService } from "../../services";
|
||||||
|
|
||||||
|
const Permission = () => {
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const [employees, setEmployees] = useState([]);
|
||||||
|
const [keyword, setKeyword] = useState("");
|
||||||
|
const [showInactive, setShowInactive] = useState(true);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!AuthService.canViewEmployees() && !AuthService.canAddOrEditEmployees()) {
|
||||||
|
window.alert("You haven't login yet OR this user does not have access to this page. Please change an admin account to login.");
|
||||||
|
AuthService.logout();
|
||||||
|
navigate("/login");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
EmployeeService.getAllEmployees().then((data) => {
|
||||||
|
setEmployees(data?.data || []);
|
||||||
|
});
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const goToEdit = (id) => {
|
||||||
|
navigate(`/employees/edit/${id}`);
|
||||||
|
};
|
||||||
|
|
||||||
|
const displayedEmployees = (employees || [])
|
||||||
|
.filter((item) => (showInactive ? true : item?.status === "active"))
|
||||||
|
.filter((item) => (item?.name || "").toLowerCase().includes(keyword.toLowerCase()));
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="list row mb-4">
|
||||||
|
<Breadcrumb>
|
||||||
|
<Breadcrumb.Item href="/">Home</Breadcrumb.Item>
|
||||||
|
<Breadcrumb.Item active>Permission</Breadcrumb.Item>
|
||||||
|
</Breadcrumb>
|
||||||
|
<div className="col-md-12 text-primary">
|
||||||
|
<h4>Permission</h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="app-main-content-list-container list-page">
|
||||||
|
<div className="app-main-content-list-func-container">
|
||||||
|
<div className="list row mb-4">
|
||||||
|
<div className="col-md-12">
|
||||||
|
<div className="mb-3">
|
||||||
|
Filter By Name:{" "}
|
||||||
|
<input type="text" value={keyword} onChange={(e) => setKeyword(e.currentTarget.value)} />
|
||||||
|
</div>
|
||||||
|
<div className="mb-3">
|
||||||
|
<input
|
||||||
|
className="me-2"
|
||||||
|
type="checkbox"
|
||||||
|
checked={showInactive === true}
|
||||||
|
onChange={() => setShowInactive(!showInactive)}
|
||||||
|
/>
|
||||||
|
Show Inactive Employees
|
||||||
|
</div>
|
||||||
|
<table className="personnel-info-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Preferred Name</th>
|
||||||
|
<th>Username</th>
|
||||||
|
<th>Status</th>
|
||||||
|
<th>Roles</th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{displayedEmployees.map((employee) => (
|
||||||
|
<tr key={employee?.id}>
|
||||||
|
<td>{employee?.name}</td>
|
||||||
|
<td>{employee?.name_cn}</td>
|
||||||
|
<td>{employee?.username}</td>
|
||||||
|
<td>{employee?.status}</td>
|
||||||
|
<td>{employee?.roles?.join(", ")}</td>
|
||||||
|
<td>
|
||||||
|
<button
|
||||||
|
className="btn btn-primary btn-sm me-2"
|
||||||
|
onClick={() => goToEdit(employee?.id)}
|
||||||
|
disabled={!AuthService.canAddOrEditEmployees()}
|
||||||
|
>
|
||||||
|
Edit
|
||||||
|
</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
))}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Permission;
|
||||||
@@ -1326,7 +1326,7 @@ const UpdateCustomer = () => {
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
<h6 className="text-primary">Additional Information</h6>
|
<h6 className="text-primary">Additional Information</h6>
|
||||||
<div className="app-main-content-fields-section base-line">
|
<div className="app-main-content-fields-section base-line" style={{ marginBottom: '24px' }}>
|
||||||
<div className="me-4">
|
<div className="me-4">
|
||||||
<div className="field-label">Profile Picture</div>
|
<div className="field-label">Profile Picture</div>
|
||||||
<label className="custom-file-upload">
|
<label className="custom-file-upload">
|
||||||
|
|||||||
@@ -532,7 +532,7 @@ const ViewCustomer = () => {
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
<h6 className="text-primary">Additional Information</h6>
|
<h6 className="text-primary">Additional Information</h6>
|
||||||
<div className="app-main-content-fields-section base-line">
|
<div className="app-main-content-fields-section base-line" style={{ marginBottom: '24px' }}>
|
||||||
<div className="field-body">
|
<div className="field-body">
|
||||||
<div className="field-label">Profile Picture</div>
|
<div className="field-label">Profile Picture</div>
|
||||||
{currentAvatar && <img height="100px" width="100px" src={`data:image/png;base64, ${currentAvatar}`}/>}
|
{currentAvatar && <img height="100px" width="100px" src={`data:image/png;base64, ${currentAvatar}`}/>}
|
||||||
|
|||||||
@@ -520,7 +520,8 @@ const EventsMultipleList = () => {
|
|||||||
id="filter-event-multi-list"
|
id="filter-event-multi-list"
|
||||||
className="me-2"
|
className="me-2"
|
||||||
show={showFilterDropdown}
|
show={showFilterDropdown}
|
||||||
onToggle={() => setShowFilterDropdown(!showFilterDropdown)}
|
onToggle={(isOpen) => setShowFilterDropdown(isOpen)}
|
||||||
|
autoClose={false}
|
||||||
>
|
>
|
||||||
<Dropdown.Toggle variant="primary">
|
<Dropdown.Toggle variant="primary">
|
||||||
<Filter size={16} className="me-2"></Filter>Filter
|
<Filter size={16} className="me-2"></Filter>Filter
|
||||||
|
|||||||
@@ -198,6 +198,26 @@ const SideMenu = () => {
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'Admin',
|
||||||
|
icon: <Tools color="#777" size={14}/>,
|
||||||
|
collapsed: false,
|
||||||
|
roleFunc: () => AuthService.canViewEmployees() || AuthService.canAddOrEditEmployees(),
|
||||||
|
subNavs: [
|
||||||
|
{
|
||||||
|
name: 'Employees',
|
||||||
|
link: '/employees/list',
|
||||||
|
category: '/employees',
|
||||||
|
roleFunc: () => AuthService.canViewEmployees() || AuthService.canAddOrEditEmployees()
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Permission',
|
||||||
|
link: '/admin/permission',
|
||||||
|
category: '/admin/permission',
|
||||||
|
roleFunc: () => AuthService.canViewEmployees() || AuthService.canAddOrEditEmployees()
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'Lobby',
|
name: 'Lobby',
|
||||||
icon: <Tools color="#777" size={14}/>,
|
icon: <Tools color="#777" size={14}/>,
|
||||||
|
|||||||
Reference in New Issue
Block a user