import React, { useState, useEffect, useRef } from 'react'; import { useNavigate } from 'react-router-dom'; import { FaPlus, FaSearch, FaEdit, FaEye, FaTrash, FaEllipsisV, FaCalendarAlt, FaFilter, FaChevronDown, FaChevronUp, FaTimes } from 'react-icons/fa'; import { usePMSchedules, usePMScheduleMutations } from '../hooks/usePMSchedule'; import LinkField from '../components/LinkField'; const PPMPlannerList: React.FC = () => { const navigate = useNavigate(); const [page, setPage] = useState(0); const [searchTerm, setSearchTerm] = useState(''); const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(null); const [actionMenuOpen, setActionMenuOpen] = useState(null); const dropdownRef = useRef(null); // Filters const [isFilterExpanded, setIsFilterExpanded] = useState(false); const [filterHospital, setFilterHospital] = useState(''); const [filterModality, setFilterModality] = useState(''); const [filterPeriodicity, setFilterPeriodicity] = useState(''); const limit = 20; // Build filters const filters: Record = {}; if (filterHospital) filters['hospital'] = filterHospital; if (filterModality) filters['modality'] = filterModality; if (filterPeriodicity) filters['periodicity'] = filterPeriodicity; const { pmSchedules, totalCount, hasMore, loading, error, refetch } = usePMSchedules( filters, limit, page * limit, 'creation desc' ); const { deletePMSchedule, loading: mutationLoading } = usePMScheduleMutations(); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setActionMenuOpen(null); } }; if (actionMenuOpen) { document.addEventListener('mousedown', handleClickOutside); } return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, [actionMenuOpen]); const handleCreateNew = () => { navigate('/ppm-planner/new'); }; const handleView = (scheduleName: string) => { navigate(`/ppm-planner/${scheduleName}`); }; const handleEdit = (scheduleName: string) => { navigate(`/ppm-planner/${scheduleName}`); }; const handleDelete = async (scheduleName: string) => { try { await deletePMSchedule(scheduleName); refetch(); setDeleteConfirmOpen(null); } catch (err) { console.error('Error deleting PM Schedule:', err); alert('Failed to delete PM Schedule'); } }; const handleClearFilters = () => { setFilterHospital(''); setFilterModality(''); setFilterPeriodicity(''); setPage(0); }; const hasActiveFilters = filterHospital || filterModality || filterPeriodicity; const activeFilterCount = [filterHospital, filterModality, filterPeriodicity].filter(Boolean).length; // Filter schedules by search term const filteredSchedules = pmSchedules.filter(schedule => { if (!searchTerm) return true; const term = searchTerm.toLowerCase(); return ( schedule.name?.toLowerCase().includes(term) || schedule.hospital?.toLowerCase().includes(term) || schedule.modality?.toLowerCase().includes(term) || schedule.maintenance_team?.toLowerCase().includes(term) ); }); const totalPages = Math.ceil(totalCount / limit); return (
{/* Header */}

PPM Planners

Manage preventive maintenance schedules

{/* Search and Filters */}
setSearchTerm(e.target.value)} className="w-full pl-9 pr-3 py-1.5 text-sm border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 bg-white dark:bg-gray-700 text-gray-900 dark:text-white" />
{/* Filter Panel */} {isFilterExpanded && (
{/* */}
{/* */}
{hasActiveFilters && (
)}
)}
{/* Content */}
{loading && page === 0 ? (
Loading PPM Planners...
) : error ? (

{error}

) : filteredSchedules.length === 0 ? (

No PPM Planners Found

{searchTerm || hasActiveFilters ? 'Try adjusting your search or filters' : 'Get started by creating your first PPM Planner'}

{!searchTerm && !hasActiveFilters && ( )}
) : (
{filteredSchedules.map((schedule) => ( ))}
Name Hospital Modality Periodicity Due Date Status Actions
{schedule.hospital || '-'} {schedule.modality || '-'} {schedule.periodicity || '-'} {schedule.due_date ? new Date(schedule.due_date).toLocaleDateString() : '-'} {schedule.docstatus === 1 ? 'Submitted' : schedule.docstatus === 0 ? 'Draft' : 'Cancelled'}
{actionMenuOpen === schedule.name && (
)}
{/* Pagination */} {totalPages > 1 && (
Showing {page * limit + 1} to {Math.min((page + 1) * limit, totalCount)} of {totalCount} results
)}
)}
{/* Delete Confirmation Modal */} {deleteConfirmOpen && (

Confirm Delete

Are you sure you want to delete this PPM Planner? This action cannot be undone.

)}
); }; export default PPMPlannerList;