diff --git a/src/components/secretaria/SecretaryAppointmentList.tsx b/src/components/secretaria/SecretaryAppointmentList.tsx index 2ea1d4ab0..bebc2a694 100644 --- a/src/components/secretaria/SecretaryAppointmentList.tsx +++ b/src/components/secretaria/SecretaryAppointmentList.tsx @@ -24,6 +24,8 @@ export function SecretaryAppointmentList() { const [searchTerm, setSearchTerm] = useState(""); const [statusFilter, setStatusFilter] = useState("Todos"); const [typeFilter, setTypeFilter] = useState("Todos"); + const [currentPage, setCurrentPage] = useState(1); + const [itemsPerPage] = useState(10); const [showCreateModal, setShowCreateModal] = useState(false); const [modalMode, setModalMode] = useState<"create" | "edit">("create"); const [selectedAppointment, setSelectedAppointment] = useState< @@ -152,6 +154,12 @@ export function SecretaryAppointmentList() { return matchesSearch && matchesStatus && matchesType; }); + // Cálculos de paginação + const totalPages = Math.ceil(filteredAppointments.length / itemsPerPage); + const startIndex = (currentPage - 1) * itemsPerPage; + const endIndex = startIndex + itemsPerPage; + const paginatedAppointments = filteredAppointments.slice(startIndex, endIndex); + const loadDoctorsAndPatients = async () => { try { const [patientsData, doctorsData] = await Promise.all([ @@ -237,9 +245,15 @@ export function SecretaryAppointmentList() { setSearchTerm(""); setStatusFilter("Todos"); setTypeFilter("Todos"); + setCurrentPage(1); loadAppointments(); }; + // Reset página quando filtros mudarem + useEffect(() => { + setCurrentPage(1); + }, [searchTerm, statusFilter, typeFilter]); + const getStatusBadge = (status: string) => { const statusMap: Record = { confirmada: { @@ -293,8 +307,8 @@ export function SecretaryAppointmentList() { {/* Header */}
-

Consultas

-

Gerencie as consultas agendadas

+

Consultas

+

Gerencie as consultas agendadas

@@ -334,11 +348,11 @@ export function SecretaryAppointmentList() {
- Status: + Status:
- Tipo: + Tipo: setSearchTerm(e.target.value)} - className="w-full pl-10 pr-4 py-2.5 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent" + className="w-full pl-10 pr-4 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 placeholder-gray-500 dark:placeholder-gray-400" />
- Especialidade: + Especialidade: setSelectedDoctorId(e.target.value)} - className="w-full px-4 py-2.5 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent" + className="w-full px-4 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100" > {doctors.map((doctor) => (
{/* Calendar */} -
+
-

+

{formatMonthYear(currentDate)}

@@ -517,15 +517,15 @@ export function SecretaryDoctorSchedule() {
- Solicitada + Solicitada
- Confirmada + Confirmada
- Concluída + Concluída
@@ -537,11 +537,11 @@ export function SecretaryDoctorSchedule() {
-
+
{["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"].map((day) => (
{day}
@@ -549,15 +549,15 @@ export function SecretaryDoctorSchedule() { {calendarDays.map((day, index) => (
-
+
{day.date.getDate()}
@@ -575,8 +575,8 @@ export function SecretaryDoctorSchedule() { key={`exc-${i}`} className={`text-xs p-1 rounded mb-1 truncate ${ exc.kind === "bloqueio" - ? "bg-red-100 text-red-800" - : "bg-purple-100 text-purple-800" + ? "bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200" + : "bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-200" }`} title={tooltipText} > @@ -598,14 +598,14 @@ export function SecretaryDoctorSchedule() { key={`apt-${i}`} className={`text-xs p-1 rounded mb-1 truncate ${ apt.status === "requested" - ? "bg-yellow-100 text-yellow-800" + ? "bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200" : apt.status === "confirmed" - ? "bg-green-100 text-green-800" + ? "bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200" : apt.status === "completed" - ? "bg-blue-100 text-blue-800" + ? "bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200" : apt.status === "cancelled" - ? "bg-gray-100 text-gray-600" - : "bg-orange-100 text-orange-800" + ? "bg-gray-100 text-gray-600 dark:bg-gray-700 dark:text-gray-300" + : "bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-200" }`} title={`${time} - ${apt.patient_id}`} > diff --git a/src/components/secretaria/SecretaryPatientList.tsx b/src/components/secretaria/SecretaryPatientList.tsx index 71bdc5252..3c4aa2c9f 100644 --- a/src/components/secretaria/SecretaryPatientList.tsx +++ b/src/components/secretaria/SecretaryPatientList.tsx @@ -52,6 +52,8 @@ export function SecretaryPatientList({ const [insuranceFilter, setInsuranceFilter] = useState("Todos"); const [showBirthdays, setShowBirthdays] = useState(false); const [showVIP, setShowVIP] = useState(false); + const [currentPage, setCurrentPage] = useState(1); + const [itemsPerPage] = useState(10); // Modal states const [showModal, setShowModal] = useState(false); @@ -153,6 +155,12 @@ export function SecretaryPatientList({ return matchesSearch && matchesBirthday && matchesInsurance && matchesVIP; }); + // Cálculos de paginação + const totalPages = Math.ceil(filteredPatients.length / itemsPerPage); + const startIndex = (currentPage - 1) * itemsPerPage; + const endIndex = startIndex + itemsPerPage; + const paginatedPatients = filteredPatients.slice(startIndex, endIndex); + const handleSearch = () => { loadPatients(); }; @@ -162,9 +170,15 @@ export function SecretaryPatientList({ setInsuranceFilter("Todos"); setShowBirthdays(false); setShowVIP(false); + setCurrentPage(1); loadPatients(); }; + // Reset página quando filtros mudarem + useEffect(() => { + setCurrentPage(1); + }, [searchTerm, insuranceFilter, showBirthdays, showVIP]); + const handleNewPatient = () => { setModalMode("create"); setFormData({ @@ -399,8 +413,8 @@ export function SecretaryPatientList({ {/* Header */}
-

Pacientes

-

+

Pacientes

+

Gerencie os pacientes cadastrados

@@ -414,16 +428,16 @@ export function SecretaryPatientList({
{/* Search and Filters */} -
+
- + setSearchTerm(e.target.value)} - className="w-full pl-10 pr-4 py-2.5 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent" + className="w-full pl-10 pr-4 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 placeholder-gray-500 dark:placeholder-gray-400" />
@@ -448,7 +462,7 @@ export function SecretaryPatientList({ onChange={(e) => setShowBirthdays(e.target.checked)} className="h-4 w-4 text-green-600 border-gray-300 rounded focus:ring-green-500" /> - + Aniversariantes do mês @@ -459,14 +473,14 @@ export function SecretaryPatientList({ onChange={(e) => setShowVIP(e.target.checked)} className="h-4 w-4 text-green-600 border-gray-300 rounded focus:ring-green-500" /> - Somente VIP + Somente VIP
- Convênio: + Convênio: setSearchTerm(e.target.value)} - className="w-full pl-10 pr-4 py-2.5 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent" + className="w-full pl-10 pr-4 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 placeholder-gray-500 dark:placeholder-gray-400" />
@@ -378,11 +378,11 @@ export function SecretaryReportList() {
- Status: + Status: