import type { ColumnDef } from "@tanstack/react-table"; import { Crown, Mail, MessagesSquare, Paperclip, Plus, Search, ShoppingBag, Tags, User, UserCog, X, } from "lucide-react"; import Link from "next/link"; import { useRouter } from "next/router"; import { useState } from "react"; import toast from "react-hot-toast"; import { DataTable } from "~/components/custom_ui/data-table"; import { DataTableColumnHeader } from "~/components/custom_ui/dataTable-header"; import type { PinnedFiltro, SearchFiltro, } from "~/components/custom_ui/dataTable-toolbar"; import { UserAvatar } from "~/components/user_avatar"; import { cn } from "~/lib/utils"; import type { Etichette } from "~/schemas/public/Etichette"; import type { Users, UsersId } from "~/schemas/public/Users"; import { api } from "~/utils/api"; import { Etichetta } from "../etichette"; import { WhatsAppIcon2 } from "../svgs"; import { Button } from "../ui/button"; import { ContextMenuContent, ContextMenuItem, ContextMenuLabel, ContextMenuSeparator, } from "../ui/context-menu"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "../ui/dialog"; import { Separator } from "../ui/separator"; type UserWChatInfo = Pick< Users, | "id" | "username" | "email" | "telefono" | "isAdmin" | "isBlocked" | "created_at" > & { chatid: string | null; etichette: Etichette[] }; export const UsersTable = (props: { data: UserWChatInfo[] }) => { const router = useRouter(); const { mutateAsync: swap } = api.auth.swapUser.useMutation({ onSuccess: async () => { toast.success("Utente cambiato con successo"); await router.push("/area-riservata/load-page"); }, }); const [selected, setSelected] = useState<{ id: UsersId; etichette: Etichette[]; } | null>(null); const { data } = props; const tabledata = data.map((user) => { return { chatid: user.chatid, created_at: user.created_at, email: user.email, telefono: user.telefono, id: user.id, isAdmin: user.isAdmin ? "Admin" : "Utente", isBlocked: user.isBlocked ? "Bloccato" : "Attivo", username: user.username, etichette: user.etichette, }; }); const admin_options = [ { label: "Admin", value: "Admin" }, { label: "Utente", value: "Utente" }, ]; const columns_titles = { created_at: "Creato il", email: "Email", telefono: "Telefono", isAdmin: "Ruolo", isBlocked: "Status", username: "User", etichette: "📎", }; type Column = (typeof tabledata)[number]; const columns: ColumnDef[] = [ { accessorKey: "etichette", header: ({ column }) => ( ), cell: ({ row }) => { return (
{row.original.etichette.map((e) => ( ))}
); }, enableHiding: false, enableSorting: false, }, { accessorKey: "username", cell: ({ row }) => { const user = row.original; return ( {user.username} ); }, enableHiding: false, header: ({ column }) => ( ), }, { accessorKey: "telefono", header: ({ column }) => ( ), }, { accessorKey: "email", header: ({ column }) => ( ), }, { accessorKey: "created_at", cell: ({ row }) => { const date = row.getValue("created_at"); return new Date(date as Date).toLocaleDateString(); }, enableHiding: false, header: ({ column }) => ( ), sortingFn: "datetime", }, { accessorKey: "isAdmin", cell: ({ row }) => { const isadmin = admin_options.find( (status) => status.value === row.getValue("isAdmin"), ); if (!isadmin) { return null; } return (
{isadmin.value === "Admin" && } {isadmin.label}
); }, filterFn: (row, id, value) => { return value.includes(row.getValue(id)); }, header: ({ column }) => ( ), }, { accessorKey: "isBlocked", filterFn: (row, id, value) => { return value.includes(row.getValue(id)); }, header: ({ column }) => ( ), }, ]; const pinnedFiltri: PinnedFiltro[] = [ { columnName: "isAdmin", options: [ { label: "Admin", value: "Admin" }, { label: "Utente", value: "Utente" }, ], title: "Ruolo", }, { columnName: "isBlocked", options: [ { label: "Bloccato", value: "Bloccato" }, { label: "Attivo", value: "Attivo" }, ], title: "Status", }, ]; const searchFiltro: SearchFiltro = { columnName: null, placeholder: "Cerca...", }; return (
( {data.username} Ricerca Comunicazioni Profilo Ordini Allegati Chat WhatsApp )} data={tabledata} defaultColumnVisibility={{ created_at: true, email: true, telefono: true, isAdmin: true, isBlocked: false, username: true, }} defaultSort={[{ desc: true, id: "created_at" }]} pinnedFiltri={pinnedFiltri} searchColumn={searchFiltro} withContextMenu={true} />
); }; const UsersEtichetteModal = ({ selected, setSelected, }: { selected: { id: UsersId; etichette: Etichette[] } | null; setSelected: React.Dispatch< React.SetStateAction<{ id: UsersId; etichette: Etichette[] } | null> >; }) => { const utils = api.useUtils(); const { data: etichette } = api.etichette.getAllEtichette.useQuery(); const { mutate: addEtichetta } = api.etichette.addUserEtichetta.useMutation({ onSuccess: async () => { toast.success("Etichetta aggiunta con successo"); await utils.etichette.getAllEtichette.invalidate(); await utils.users.getUsersWChatInfo.invalidate(); }, onError: () => { toast.error("Errore nell'aggiunta dell'etichetta"); }, }); const { mutate: removeEtichetta } = api.etichette.removeUserEtichetta.useMutation({ onSuccess: async () => { toast.success("Etichetta rimossa con successo"); await utils.etichette.getAllEtichette.invalidate(); await utils.users.getUsersWChatInfo.invalidate(); }, onError: () => { toast.error("Errore nella rimozione dell'etichetta"); }, }); return ( { if (!v) setSelected(null); }} open={!!selected} > Etichette Etichette

Etichette Attive

{selected?.etichette.map((etichetta) => (
))}

Aggiungi Etichetta

{etichette ?.filter( (e) => !selected?.etichette.some( (etichetta) => etichetta.id_etichetta === e.id_etichetta, ), ) .map((e) => (
))}
); };