feat: refactor Potenziali context to use editingItem and improve item management

This commit is contained in:
Marco Pedone 2025-12-03 14:51:35 +01:00
parent cfcddea9c8
commit 8ac1c1da3d
2 changed files with 93 additions and 38 deletions

View file

@ -16,8 +16,10 @@ import type { PotenzialeData } from "~/server/services/potenziali.service";
import { import {
Credenza, Credenza,
CredenzaBody, CredenzaBody,
CredenzaClose,
CredenzaContent, CredenzaContent,
CredenzaDescription, CredenzaDescription,
CredenzaFooter,
CredenzaHeader, CredenzaHeader,
CredenzaTitle, CredenzaTitle,
CredenzaTrigger, CredenzaTrigger,
@ -29,7 +31,7 @@ import { Label } from "../ui/label";
import { UserAvatar } from "../user_avatar"; import { UserAvatar } from "../user_avatar";
export const Potenziali = () => { export const Potenziali = () => {
const { data, columns, setData, updateCall, setEditingId, editingId } = const { data, columns, setData, updateCall, setEditing, editingItem } =
usePotenziali(); usePotenziali();
return ( return (
<> <>
@ -63,7 +65,7 @@ export const Potenziali = () => {
{(data: PotenzialeData) => ( {(data: PotenzialeData) => (
<KanbanCard <KanbanCard
cardOnClick={() => { cardOnClick={() => {
setEditingId(data.id); setEditing(data.id);
}} }}
column={column.id} column={column.id}
id={data.id} id={data.id}
@ -99,10 +101,10 @@ export const Potenziali = () => {
<Credenza <Credenza
onOpenChange={(v) => { onOpenChange={(v) => {
if (!v) { if (!v) {
setEditingId(null); setEditing(null);
} }
}} }}
open={!!editingId} open={!!editingItem}
> >
<EditingContent /> <EditingContent />
</Credenza> </Credenza>
@ -153,8 +155,19 @@ export const NewCard = ({ columnId }: { columnId: PotenzialiGroupsId }) => {
const [newItemName, setNewItemName] = useState(""); const [newItemName, setNewItemName] = useState("");
const [newItemDescrizione, setNewItemDescrizione] = useState(""); const [newItemDescrizione, setNewItemDescrizione] = useState("");
const { addItem } = usePotenziali(); const { addItem } = usePotenziali();
const [open, setOpen] = useState(false);
const handleAddItem = () => {
addItem({
name: newItemName,
descrizione: newItemDescrizione,
potenziali_group_id: columnId,
});
setNewItemName("");
setNewItemDescrizione("");
setOpen(false);
};
return ( return (
<Credenza> <Credenza onOpenChange={setOpen} open={open}>
<CredenzaTrigger asChild> <CredenzaTrigger asChild>
<Button className="ml-auto" size="sm"> <Button className="ml-auto" size="sm">
<Plus className="size-4" /> <Plus className="size-4" />
@ -171,57 +184,84 @@ export const NewCard = ({ columnId }: { columnId: PotenzialiGroupsId }) => {
<Label htmlFor="titolo">Titolo</Label> <Label htmlFor="titolo">Titolo</Label>
<Input <Input
defaultValue={newItemName}
id="titolo" id="titolo"
onChange={(e) => setNewItemName(e.target.value)} onChange={(e) => setNewItemName(e.target.value)}
type="string" type="string"
value={newItemName}
/> />
<Label htmlFor="descrizione">Descrizione</Label> <Label htmlFor="descrizione">Descrizione</Label>
<Textarea <Textarea
className="min-h-64" className="min-h-64"
defaultValue={newItemDescrizione}
id="descrizione" id="descrizione"
onChange={(e) => setNewItemDescrizione(e.target.value)} onChange={(e) => setNewItemDescrizione(e.target.value)}
placeholder="" placeholder=""
value={newItemDescrizione}
/> />
</CredenzaBody>
<Button <CredenzaFooter>
disabled={!newItemName.length} <Button disabled={!newItemName.length} onClick={handleAddItem}>
onClick={() => {
addItem({
name: newItemName,
descrizione: newItemDescrizione,
potenziali_group_id: columnId,
});
setNewItemName("");
setNewItemDescrizione("");
}}
>
Aggiungi Aggiungi
</Button> </Button>
</CredenzaBody> <CredenzaClose>Chiudi</CredenzaClose>
</CredenzaFooter>
</CredenzaContent> </CredenzaContent>
</Credenza> </Credenza>
); );
}; };
const EditingContent = () => { const EditingContent = () => {
const { getEditingItem } = usePotenziali(); const { editingItem, updateItem } = usePotenziali();
const item = getEditingItem();
if (!item) return null; const [state, setState] = useState<PotenzialeData | null>(editingItem);
const [hasChanges, setHasChanges] = useState(false);
if (!state) return null;
return ( return (
<CredenzaContent className="max-h-[90vh]"> <CredenzaContent className="max-h-[90vh]">
<CredenzaHeader> <CredenzaHeader>
<CredenzaTitle className="text-center font-semibold text-2xl"> <CredenzaTitle className="text-center font-semibold text-2xl">
Modifica {item.name} Modifica {state.name}
</CredenzaTitle> </CredenzaTitle>
<CredenzaDescription className="sr-only">desc</CredenzaDescription> <CredenzaDescription className="sr-only">desc</CredenzaDescription>
</CredenzaHeader> </CredenzaHeader>
<CredenzaBody className="flex max-h-[80vh] flex-col gap-4 overflow-auto pb-5"> <CredenzaBody className="flex max-h-[80vh] flex-col gap-4 overflow-auto p-2">
<p>Descrizione: {item.descrizione}</p> <Label htmlFor="titolo">Titolo</Label>
<p>Creato il: {format(item.created_at, "dd/MM/yyyy HH:mm")}</p>
<p>Utente Assegnato: {item.userid ? item.username : "Nessuno"}</p> <Input
id="titolo"
onChange={(e) => {
setState((prev) => prev && { ...prev, name: e.target.value });
setHasChanges(true);
}}
type="string"
value={state.name}
/>
<Label htmlFor="descrizione">Descrizione</Label>
<Textarea
className="min-h-64"
id="descrizione"
onChange={(e) => {
setState(
(prev) => prev && { ...prev, descrizione: e.target.value },
);
setHasChanges(true);
}}
placeholder=""
value={state.descrizione || undefined}
/>
</CredenzaBody> </CredenzaBody>
<CredenzaFooter>
<Button
disabled={!hasChanges || !state}
onClick={() => {
updateItem(state);
}}
type="button"
>
Salva
</Button>
<CredenzaClose>Chiudi</CredenzaClose>
</CredenzaFooter>
</CredenzaContent> </CredenzaContent>
); );
}; };

View file

@ -8,14 +8,14 @@ import { api } from "~/utils/api";
type PotenzialiContextType = { type PotenzialiContextType = {
data: PotenzialeData[]; data: PotenzialeData[];
columns: PotenzialiGroups[]; columns: PotenzialiGroups[];
editingId: PotenzialiId | null; editingItem: PotenzialeData | null;
setData: (data: PotenzialeData[]) => void; setData: (data: PotenzialeData[]) => void;
updateCall: () => void; updateCall: () => void;
setEditingId: (id: PotenzialiId | null) => void; setEditing: (id: PotenzialiId | null) => void;
getEditingItem: () => PotenzialeData | null;
addItem: (item: NewPotenziali) => void; addItem: (item: NewPotenziali) => void;
removeItem: (id: PotenzialiId) => void; removeItem: (id: PotenzialiId) => void;
addColumn: (name: string) => void; addColumn: (name: string) => void;
updateItem: (item: PotenzialeData) => void;
}; };
const PotenzialiContext = createContext<PotenzialiContextType | null>(null); const PotenzialiContext = createContext<PotenzialiContextType | null>(null);
@ -28,11 +28,13 @@ export const PotenzialiProvider = ({ children }: PotenzialiProviderProps) => {
const { data: columns } = api.potenziali.getPotenzialiGroups.useQuery(); const { data: columns } = api.potenziali.getPotenzialiGroups.useQuery();
const [editingId, setEditingId] = useState<PotenzialiId | null>(null); const [editingItem, setEditingItem] = useState<PotenzialeData | null>(null);
const getEditingItem = () => { const setEditing = (id: PotenzialiId | null) => {
return data?.find((item) => item.id === editingId) || null; const item = data?.find((item) => item.id === id) || null;
setEditingItem(item);
}; };
const utils = api.useUtils(); const utils = api.useUtils();
const { mutate: addItemMutation } = api.potenziali.addPotenziale.useMutation({ const { mutate: addItemMutation } = api.potenziali.addPotenziale.useMutation({
onSuccess: async () => { onSuccess: async () => {
@ -90,20 +92,33 @@ export const PotenzialiProvider = ({ children }: PotenzialiProviderProps) => {
name, name,
}); });
}; };
const { mutate: updateItemMutation } =
api.potenziali.updatePotenziale.useMutation({
onSuccess: async () => {
toast.success("Elemento aggiornato con successo");
await utils.potenziali.getPotenziali.invalidate();
},
});
const updateItem = (item: PotenzialeData) => {
updateItemMutation({
potenzialiId: item.id,
data: item,
});
};
return ( return (
<PotenzialiContext.Provider <PotenzialiContext.Provider
value={{ value={{
data: data || [], data: data || [],
columns: columns || [], columns: columns || [],
editingId, editingItem,
setData, setData,
updateCall, updateCall,
setEditingId, setEditing,
getEditingItem,
addItem, addItem,
removeItem, removeItem,
addColumn, addColumn,
updateItem,
}} }}
> >
{children} {children}