import { useEffect, useState, useRef } from 'react'; import axios from 'axios'; import SalaryGradeModal from './SalaryGradeModal'; import '../../../Styles/components/salaryGrade/salarygrade.css'; import { useLocation, useOutletContext } from 'react-router-dom'; import '../../../Styles/globals.css'; import Swal from 'sweetalert2'; import { confirmHoldToDelete } from '../utils/confirmHoldToDelete'; import BASE_URL from "@backend/server/config"; import { CirclePlus, Search, Plus } from "lucide-react"; import Breadcrumbs from '../breadcrumbs/Breadcrumbs'; import { useSession } from '../../context/SessionContext'; import { Tooltip } from '@mui/material'; import { tooltipClasses } from '@mui/material/Tooltip'; const SalaryGrades = () => { const [salaryGrades, setSalaryGrades] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [modalOpen, setModalOpen] = useState(false); const [selectedGrade, setSelectedGrade] = useState(null); const [modalLoading, setModalLoading] = useState(false); const [searchQuery, setSearchQuery] = useState(""); const { state } = useLocation(); const { user } = useSession(); // Access user from Outlet context const tableWrapperRef = useRef(null); // Function to fetch salary grades data const fetchSalaryGrades = async () => { setLoading(true); try { const response = await axios.get(`${BASE_URL}/api/salaryGrades/salary_grades`); if (response.data.success) { const parsedData = response.data.data.map(grade => ({ ...grade, Step1: Number(grade.Step1), Step2: Number(grade.Step2), Step3: Number(grade.Step3), })); setSalaryGrades(parsedData); } else { setError('No records found.'); } } catch (error) { console.error('Error fetching salary grades:', error); setError('Failed to fetch data.'); } finally { setLoading(false); } }; // Fetch salary grades on component mount useEffect(() => { fetchSalaryGrades(); }, []); const handleEdit = (grade) => { setSelectedGrade(grade); setModalOpen(true); }; const handleAdd = () => { setSelectedGrade(null); // Set to null for adding a new grade setModalOpen(true); }; const handleDelete = async (gradeId) => { const result = await confirmHoldToDelete({ title: "Are you sure?", text: "You won't be able to revert this!", }); if (result.isConfirmed) { axios.delete(`${BASE_URL}/api/salaryGrades/delete_salary_grades?id=${gradeId}`) .then(response => { if (response.data.success) { setSalaryGrades(salaryGrades.filter(grade => grade.GradeID !== gradeId)); Swal.fire({ icon: "success", title: "Deleted!", text: "Salary grade deleted successfully.", }); } else { Swal.fire({ icon: "error", title: "Oops!", text: response.data.message || "Failed to delete record.", }); } }) .catch(error => { Swal.fire({ icon: "error", title: "Error!", text: "Error: " + error.message, }); }); } }); }; const handleSave = (newGrade) => { setModalLoading(true); // Start loading state for modal const payload = { grade_id: newGrade.grade_id, position_level: newGrade.position_level, step1: Number(newGrade.step1), step2: Number(newGrade.step2), step3: Number(newGrade.step3), }; const url = selectedGrade ? `${BASE_URL}/api/salaryGrades/update_salary_grades` : `${BASE_URL}/api/salaryGrades/add_salary_grades`; axios.post(url, payload, { headers: { 'Content-Type': 'application/json', }, timeout: 5000, }) .then(response => { setModalLoading(false); if (response.data.success) { Swal.fire({ icon: "success", title: "Success", text: response.data.message || "Salary grade saved successfully.", }).then(() => { fetchSalaryGrades(); // Fetch updated salary grades after successful save setModalOpen(false); // Close the modal }); } else { Swal.fire({ icon: "error", title: "Failed", text: response.data.message || "Failed to save salary grade.", }); } }) .catch(error => { setModalLoading(false); Swal.fire({ icon: "error", title: "Error", text: "Error saving salary grade: " + error.message, }); console.error("Error saving salary grade:", error); }); }; // Filtered salary grades based on search query const filteredSalaryGrades = salaryGrades.filter(grade => { const lowerCaseQuery = searchQuery.toLowerCase(); return ( (grade.GradeID && grade.GradeID.toLowerCase().includes(lowerCaseQuery)) || (grade.PositionLevel && grade.PositionLevel.toLowerCase().includes(lowerCaseQuery)) ); }); const breadcrumbItems = [ // { label: 'Home', path: '/' }, { label: 'Utilities Dashboard', path: '/utilitiesdashboard' }, { label: 'Salary Grades' }, ]; return (
Loading...
} {error &&{error}
} {loading ? (Loading salary grades...
) : (| Grade ID | Position Level | Step 1 | Step 2 | Step 3 | {user?.role === 'ADMIN' &&Actions | }
|---|---|---|---|---|---|
| {grade.GradeID} | {grade.PositionLevel} | {grade.Step1} | {grade.Step2} | {grade.Step3} | {user?.role === "ADMIN" && (
|
)}