import { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { Box, Typography, Button, Paper, IconButton, Dialog, DialogTitle, DialogContent, DialogActions, TextField, Grid, FormControl, InputLabel, Select, MenuItem, } 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 { articoliService, lookupService } from '../services/lookupService'; import { Articolo } from '../types'; export default function ArticoliPage() { const queryClient = useQueryClient(); const [openDialog, setOpenDialog] = useState(false); const [editingId, setEditingId] = useState(null); const [formData, setFormData] = useState>({ attivo: true }); const { data: articoli = [], isLoading } = useQuery({ queryKey: ['articoli'], queryFn: () => articoliService.getAll(), }); const { data: tipiMateriale = [] } = useQuery({ queryKey: ['lookup', 'tipi-materiale'], queryFn: () => lookupService.getTipiMateriale(), }); const { data: categorie = [] } = useQuery({ queryKey: ['lookup', 'categorie'], queryFn: () => lookupService.getCategorie(), }); const createMutation = useMutation({ mutationFn: (data: Partial) => articoliService.create(data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['articoli'] }); handleCloseDialog(); }, }); const updateMutation = useMutation({ mutationFn: ({ id, data }: { id: number; data: Partial }) => articoliService.update(id, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['articoli'] }); handleCloseDialog(); }, }); const deleteMutation = useMutation({ mutationFn: (id: number) => articoliService.delete(id), onSuccess: () => queryClient.invalidateQueries({ queryKey: ['articoli'] }), }); const handleCloseDialog = () => { setOpenDialog(false); setEditingId(null); setFormData({ attivo: true }); }; const handleEdit = (articolo: Articolo) => { setFormData(articolo); setEditingId(articolo.id); setOpenDialog(true); }; const handleSubmit = () => { if (editingId) { updateMutation.mutate({ id: editingId, data: formData }); } else { createMutation.mutate(formData); } }; const columns: GridColDef[] = [ { field: 'codice', headerName: 'Codice', width: 100 }, { field: 'descrizione', headerName: 'Descrizione', flex: 1, minWidth: 200 }, { field: 'tipoMateriale', headerName: 'Tipo', width: 130, valueGetter: (value: any) => value?.descrizione || '', }, { field: 'categoria', headerName: 'Categoria', width: 120, valueGetter: (value: any) => value?.descrizione || '', }, { field: 'qtaDisponibile', headerName: 'Disponibile', width: 100, type: 'number' }, { field: 'qtaStdA', headerName: 'Qta A', width: 80, type: 'number' }, { field: 'qtaStdB', headerName: 'Qta B', width: 80, type: 'number' }, { field: 'qtaStdS', headerName: 'Qta S', width: 80, type: 'number' }, { field: 'unitaMisura', headerName: 'UM', width: 60 }, { field: 'actions', headerName: 'Azioni', width: 120, sortable: false, renderCell: (params) => ( handleEdit(params.row)}> { if (confirm('Eliminare questo articolo?')) { deleteMutation.mutate(params.row.id); } }} > ), }, ]; return ( Articoli {editingId ? 'Modifica Articolo' : 'Nuovo Articolo'} setFormData({ ...formData, codice: e.target.value })} /> setFormData({ ...formData, descrizione: e.target.value })} /> Tipo Materiale Categoria setFormData({ ...formData, qtaDisponibile: parseFloat(e.target.value) || undefined })} /> setFormData({ ...formData, unitaMisura: e.target.value })} /> setFormData({ ...formData, qtaStdA: parseFloat(e.target.value) || undefined })} /> setFormData({ ...formData, qtaStdB: parseFloat(e.target.value) || undefined })} /> setFormData({ ...formData, qtaStdS: parseFloat(e.target.value) || undefined })} /> setFormData({ ...formData, note: e.target.value })} /> ); }