commit
All checks were successful
Build And Deploy Main / build-and-deploy (push) Successful in 44s

This commit is contained in:
2026-03-10 15:21:00 -04:00
parent e6671c91fc
commit 760e4eafce
6 changed files with 128 additions and 3 deletions

View File

@@ -25,6 +25,7 @@ import ViewEmployee from "./components/employees/ViewEmployee";
import CreateRoute from "./components/trans-routes/CreateRoute";
import Admin from './components/admin/Admin';
import CustomerReport from "./components/admin/CustomerReport";
import Permission from "./components/admin/Permission";
import Login from "./components/login/Login";
import RoutesHistory from "./components/trans-routes/RoutesHistory";
import RouteTemplatesList from "./components/trans-routes/RouteTemplatesList";
@@ -225,6 +226,7 @@ function App() {
<Route path="/admin" element={<Admin />}>
<Route path="" element={<Navigate replace to="customer-report" />} />
<Route path="customer-report" element={<CustomerReport/>} />
<Route path="permission" element={<Permission/>} />
</Route>
<Route path="/dashboard/dashboard" element={<Dashboard/>} />

View 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;

View File

@@ -1326,7 +1326,7 @@ const UpdateCustomer = () => {
)}
<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="field-label">Profile Picture</div>
<label className="custom-file-upload">

View File

@@ -532,7 +532,7 @@ const ViewCustomer = () => {
)}
<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-label">Profile Picture</div>
{currentAvatar && <img height="100px" width="100px" src={`data:image/png;base64, ${currentAvatar}`}/>}

View File

@@ -520,7 +520,8 @@ const EventsMultipleList = () => {
id="filter-event-multi-list"
className="me-2"
show={showFilterDropdown}
onToggle={() => setShowFilterDropdown(!showFilterDropdown)}
onToggle={(isOpen) => setShowFilterDropdown(isOpen)}
autoClose={false}
>
<Dropdown.Toggle variant="primary">
<Filter size={16} className="me-2"></Filter>Filter

View File

@@ -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',
icon: <Tools color="#777" size={14}/>,