163 lines
6.5 KiB
JavaScript
163 lines
6.5 KiB
JavaScript
import Navbar from "./components/Navbar.jsx";
|
|
import Table from "./components/Table.jsx";
|
|
import ModalForm from "./components/ModalForm.jsx";
|
|
import {useEffect, useState} from "react";
|
|
import Pagination from "./components/Pagination.jsx";
|
|
import {getEmployees} from "./api/employee.js";
|
|
import {showToast} from "./utils/appUtils.js";
|
|
|
|
function App() {
|
|
|
|
const [isOpen, setIsOpen] = useState(false);
|
|
const [modalMode, setModalMode] = useState("add");
|
|
const [tableData, setTableData] = useState([]);
|
|
const [employee, setEmployee] = useState(null);
|
|
const [searchTerm, setSearchTerm] = useState('');
|
|
const [page, setPage] = useState(1);
|
|
const [limit, setLimit] = useState(2);
|
|
const [totalPage, setTotalPage] = useState(1);
|
|
const [allEmployeeData, setAllEmployeeData] = useState([]);
|
|
|
|
// โหลดข้อมูลครั้งแรกครั้งเดียว ใช้ allEmployeeData เป็นแหล่งข้อมูลหลักในการแบ่งหน้าใหม่
|
|
useEffect(() => {
|
|
const employeeData = getEmployees();
|
|
setAllEmployeeData(employeeData);
|
|
setTotalPage(Math.ceil(employeeData.length / limit));
|
|
}, []);
|
|
|
|
// แบ่งหน้าแสดงข้อมูลใหม่ เมื่อหน้าเปลี่ยน
|
|
useEffect(() => {
|
|
// กรองข้อมูลตาม searchTerm จาก allEmployeeData
|
|
const filtered = allEmployeeData.filter(employee =>
|
|
employee.name.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
|
employee.mail.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
|
employee.job.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
|
employee.department.toLowerCase().includes(searchTerm.toLowerCase())
|
|
);
|
|
|
|
// คำนวณจำนวนหน้าทั้งหมดใหม่
|
|
const newTotalPage = Math.ceil(filtered.length / limit);
|
|
setTotalPage(newTotalPage);
|
|
|
|
// ตรวจสอบว่าหน้าปัจจุบันยังอยู่ในช่วงที่มีข้อมูลหรือไม่
|
|
if (page > newTotalPage && newTotalPage > 0) {
|
|
setPage(newTotalPage);
|
|
return; // ยกเลิกรอบนี้ก่อน รอให้ page เปลี่ยนแล้วค่อยรันใหม่
|
|
}
|
|
|
|
const start = (page - 1) * limit;
|
|
const end = page * limit;
|
|
const employeeDataPaginationArray = filtered.slice(start, end);
|
|
setTableData(employeeDataPaginationArray);
|
|
}, [page, allEmployeeData, searchTerm]);
|
|
|
|
// เมื่อกดที่ปุ่มใด ๆ ก็ตาม
|
|
const handleOpen = (mode, employee) => {
|
|
// กำหนดค่าตัวแปรที่จำเป็นต่อการทำงานของ Modal Form
|
|
setIsOpen(true);
|
|
setModalMode(mode);
|
|
setEmployee(employee);
|
|
}
|
|
// ตรวจสอบว่าเป็นการกดปุ่มอะไร
|
|
const handleSubmit = (newEmployeeData)=>{
|
|
if(modalMode === 'add'){
|
|
// ในอนาคตจะ Update ข้อมูลด้วย Rest API
|
|
// ปรับปรุงข้อมูลที่จะแสดงใน Table
|
|
setAllEmployeeData((prevData) => {
|
|
const updatedData = [...prevData, newEmployeeData];
|
|
setTotalPage(Math.ceil(updatedData.length / limit));
|
|
return updatedData;
|
|
});
|
|
showToast('เพิ่มข้อมูลเรียบร้อย', 'success');
|
|
console.log('Add button: ', newEmployeeData);
|
|
}
|
|
else{
|
|
console.log('Update button:', newEmployeeData);
|
|
// ในอนาคตจะ Update ข้อมูลในฐานข้อมูลด้วย Rest API
|
|
// ปรับปรุงข้อมูลที่จะแสดงใน Table
|
|
setAllEmployeeData((prevData) => {
|
|
const updatedData = prevData.map((emp) =>
|
|
emp.id === newEmployeeData.id ? newEmployeeData : emp
|
|
);
|
|
return updatedData;
|
|
});
|
|
showToast('ปรับปรุงข้อมูลเรียบร้อย', 'success');
|
|
}
|
|
}
|
|
|
|
// เมื่อกดปุ่มเปลี่ยนหน้า
|
|
const handlePageChange = (value)=>{
|
|
console.log(value);
|
|
if(value === "«"){
|
|
setPage(1);
|
|
}
|
|
else if(value === "&lsaquo"){
|
|
if(page !== 1){
|
|
setPage(page - 1);
|
|
}
|
|
}
|
|
else if(value==="&rsaquo"){
|
|
if(page !== totalPage){
|
|
setPage(page + 1);
|
|
}
|
|
}
|
|
else if(value==="»"){
|
|
setPage(totalPage);
|
|
}
|
|
else if(value === "..."){
|
|
if(page < totalPage){
|
|
setPage(page + 1);
|
|
}
|
|
else{
|
|
setPage(page - 1);
|
|
}
|
|
}
|
|
else{
|
|
setPage(value);
|
|
}
|
|
}
|
|
|
|
// ตรวจสอบกรณีที่มีการลบข้อมูลสุดท้ายในหน้า
|
|
const handleDelete = (employeeId) =>{
|
|
setAllEmployeeData((prevData) => {
|
|
const updatedData = prevData.filter(emp => emp.id !== employeeId);
|
|
const newTotalPage = Math.ceil(updatedData.length / limit);
|
|
|
|
// ถ้าหน้าที่อยู่เกินหน้าสุดท้ายหลังลบ ให้ลดหน้าลง
|
|
if (page > newTotalPage) {
|
|
setPage(newTotalPage === 0 ? 1 : newTotalPage);
|
|
}
|
|
|
|
setTotalPage(newTotalPage);
|
|
return updatedData;
|
|
});
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<Navbar onOpen={()=>handleOpen('add')} setSearchTerm={setSearchTerm}/>
|
|
<Table
|
|
handleOpen={handleOpen}
|
|
tableData={tableData}
|
|
onDelete={handleDelete}
|
|
/>
|
|
<ModalForm
|
|
isOpen={isOpen}
|
|
onClose={()=>setIsOpen(false)}
|
|
OnSubmit={handleSubmit}
|
|
mode={modalMode}
|
|
employee={employee}
|
|
/>
|
|
<Pagination
|
|
totalPage={totalPage}
|
|
page={page}
|
|
limit={limit}
|
|
sibling={1}
|
|
setPage={handlePageChange}
|
|
/>
|
|
</>
|
|
)
|
|
}
|
|
|
|
export default App
|