feat: refactor Potenziali context to use editingItem and improve item management
This commit is contained in:
parent
cfcddea9c8
commit
8ac1c1da3d
2 changed files with 93 additions and 38 deletions
|
|
@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue