import { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { Box, Typography, Button, Paper, IconButton, Dialog, DialogTitle, DialogContent, DialogActions, TextField, Grid, } from '@mui/material'; import { DataGrid, GridColDef } from '@mui/x-data-grid'; import { Add as AddIcon, Edit as EditIcon, Delete as DeleteIcon } from '@mui/icons-material'; import { useTranslation } from 'react-i18next'; import { locationService } from '../services/lookupService'; import { Location } from '../types'; export default function LocationPage() { const queryClient = useQueryClient(); const { t } = useTranslation(); const [openDialog, setOpenDialog] = useState(false); const [editingId, setEditingId] = useState(null); const [formData, setFormData] = useState>({ attivo: true }); const { data: locations = [], isLoading } = useQuery({ queryKey: ['location'], queryFn: () => locationService.getAll(), }); const createMutation = useMutation({ mutationFn: (data: Partial) => locationService.create(data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['location'] }); handleCloseDialog(); }, }); const updateMutation = useMutation({ mutationFn: ({ id, data }: { id: number; data: Partial }) => locationService.update(id, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['location'] }); handleCloseDialog(); }, }); const deleteMutation = useMutation({ mutationFn: (id: number) => locationService.delete(id), onSuccess: () => queryClient.invalidateQueries({ queryKey: ['location'] }), }); const handleCloseDialog = () => { setOpenDialog(false); setEditingId(null); setFormData({ attivo: true }); }; const handleEdit = (location: Location) => { setFormData(location); setEditingId(location.id); setOpenDialog(true); }; const handleSubmit = () => { if (editingId) { updateMutation.mutate({ id: editingId, data: formData }); } else { createMutation.mutate(formData); } }; const columns: GridColDef[] = [ { field: 'nome', headerName: t('location.name'), flex: 1, minWidth: 200 }, { field: 'citta', headerName: t('location.city'), width: 150 }, { field: 'provincia', headerName: t('location.province'), width: 80 }, { field: 'distanzaKm', headerName: t('location.distance'), width: 120, type: 'number' }, { field: 'referente', headerName: t('location.contact'), width: 150 }, { field: 'telefono', headerName: t('location.phone'), width: 130 }, { field: 'actions', headerName: t('common.actions'), width: 120, sortable: false, renderCell: (params) => ( handleEdit(params.row)}> { if (confirm(t('location.deleteConfirm'))) { deleteMutation.mutate(params.row.id); } }} > ), }, ]; return ( {t('location.title')} {editingId ? t('location.editLocation') : t('location.newLocation')} setFormData({ ...formData, nome: e.target.value })} /> setFormData({ ...formData, indirizzo: e.target.value })} /> setFormData({ ...formData, cap: e.target.value })} /> setFormData({ ...formData, citta: e.target.value })} /> setFormData({ ...formData, provincia: e.target.value })} /> setFormData({ ...formData, distanzaKm: parseFloat(e.target.value) || undefined })} /> setFormData({ ...formData, telefono: e.target.value })} /> setFormData({ ...formData, email: e.target.value })} /> setFormData({ ...formData, referente: e.target.value })} /> setFormData({ ...formData, note: e.target.value })} /> ); }