import React, { useEffect, useState } from 'react'; import { useAvailability } from '../hooks/useAvailability'; import { useVehicles } from '../hooks/useVehicles'; import ExcelTable from '../components/ExcelTable'; import { Plus, Search, Calendar as CalendarIcon } from 'lucide-react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogDescription } from "@/components/ui/dialog"; import { toast } from 'sonner'; // Reusing styled components locally const DarkInput = ({ label, ...props }) => (
{label && }
); const DarkSelect = ({ label, options, value, onChange }) => (
{label && }
); const DarkButton = ({ children, variant = 'primary', className = '', ...props }) => { const baseClass = "px-4 py-2 rounded-lg font-bold text-sm transition-all shadow-lg active:scale-95 flex items-center justify-center gap-2"; const variants = { primary: "bg-orange-600 hover:bg-orange-500 text-white shadow-orange-500/10", secondary: "bg-slate-100 dark:bg-[#2a2a2a] hover:bg-slate-200 dark:hover:bg-[#333] text-slate-700 dark:text-slate-200 border border-slate-200 dark:border-[#333]", ghost: "bg-transparent hover:bg-slate-100 dark:hover:bg-[#2a2a2a] text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-white" }; return ( ); }; export default function AvailabilityView() { const { availabilities, fetchAvailabilities, createAvailability, updateAvailability, deleteAvailability } = useAvailability(); const { vehicles, fetchVehicles } = useVehicles(); const [searchTerm, setSearchTerm] = useState(''); const [isModalOpen, setIsModalOpen] = useState(false); const [editingItem, setEditingItem] = useState(null); const initialFormState = { iddisponibilidade_frota: '', idveiculo_frota: '', placa: '', disponibilidade: '', status_disponibilidade: 'Disponível' }; const [formData, setFormData] = useState(initialFormState); useEffect(() => { fetchAvailabilities(); fetchVehicles(); }, []); const handleOpenModal = (item = null) => { if (item) { setEditingItem(item); setFormData({ ...initialFormState, ...item }); } else { setEditingItem(null); setFormData(initialFormState); } setIsModalOpen(true); }; const handlePlateChange = (e) => { const val = e.target.value; const foundVehicle = vehicles.find(v => v.placa === val); setFormData({ ...formData, placa: val, idveiculo_frota: foundVehicle ? foundVehicle.idveiculo_frota : '' }); }; const handleSubmit = async (e) => { e.preventDefault(); const payload = { ...formData, iddisponibilidade_frota: formData.iddisponibilidade_frota ? Number(formData.iddisponibilidade_frota) : undefined, idveiculo_frota: formData.idveiculo_frota ? Number(formData.idveiculo_frota) : null }; let success; if (editingItem) { success = await updateAvailability(Number(editingItem.iddisponibilidade_frota || editingItem.id), payload); } else { success = await createAvailability(payload); } if (success) setIsModalOpen(false); }; const filteredData = availabilities.filter(item => item.placa?.toLowerCase().includes(searchTerm.toLowerCase()) ); return (

Disponibilidade e Agenda

Visualização de disponibilidade da frota.

setSearchTerm(e.target.value)} />
handleOpenModal()}> Novo Registro
row.disponibilidade?.split('T')[0] }, { header: 'STATUS', field: 'status_disponibilidade', width: '150px', render: (row) => ( {row.status_disponibilidade} )} ]} filterDefs={[ { field: 'placa', label: 'Placa', type: 'text', placeholder: 'Buscar placa...' }, { field: 'status_disponibilidade', label: 'Status', type: 'select' }, ]} onEdit={handleOpenModal} onDelete={(item) => deleteAvailability(item.iddisponibilidade_frota)} />
{editingItem ? `Editando ID: ${editingItem.iddisponibilidade_frota}` : 'Nova Disponibilidade'}
{formData.iddisponibilidade_frota && (

ID do Registro

{formData.iddisponibilidade_frota}

)}
{vehicles.map(v => ( {formData.idveiculo_frota && ( Veículo vinculado (ID: {formData.idveiculo_frota}) )}
setFormData({...formData, disponibilidade: e.target.value})} /> setFormData({...formData, status_disponibilidade: v})} /> setIsModalOpen(false)}>Cancelar Salvar
); }