import type { ColumnDef } from "@tanstack/react-table"; import { Crown, Mail, MessagesSquare, MoreHorizontal, Paperclip, Search, ShoppingBag, Tickets, User, UserCog, } from "lucide-react"; import Link from "next/link"; import { useRouter } from "next/router"; 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 { Button } from "~/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "~/components/ui/dropdown-menu"; import { UserAvatar } from "~/components/user_avatar"; import { cn } from "~/lib/utils"; import type { Users } from "~/schemas/public/Users"; import { api } from "~/utils/api"; type UserWChatInfo = Pick< Users, "id" | "username" | "email" | "isAdmin" | "isBlocked" | "created_at" > & { chatid: string | null }; export const UsersTable = (props: { data: UserWChatInfo[] }) => { const router = useRouter(); const { mutate: swap } = api.auth.swapUser.useMutation({ onSuccess: async () => { toast.success("Utente cambiato con successo"); await router.push("/area-riservata/dashboard"); router.reload(); }, }); const { data } = props; const tabledata = data.map((user) => { return { id: user.id, username: user.username, email: user.email, isAdmin: user.isAdmin ? "Admin" : "Utente", isBanned: user.isBlocked ? "Bloccato" : "Attivo", created_at: user.created_at, chatid: user.chatid, actions: "Azioni", }; }); const admin_options = [ { label: "Admin", value: "Admin" }, { label: "Utente", value: "Utente" }, ]; const columns_titles = { username: "User", email: "Email", isAdmin: "Ruolo", isBanned: "Status", created_at: "Creato il", actions: "Azioni", }; type Column = (typeof tabledata)[number]; const columns: ColumnDef[] = [ { header: ({ column }) => ( ), accessorKey: "username", enableHiding: false, cell: ({ row }) => { const user = row.original; return ( {user.username} ); }, }, { header: ({ column }) => ( ), accessorKey: "email", }, { header: ({ column }) => ( ), 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)); }, accessorKey: "isAdmin", }, { header: ({ column }) => ( ), accessorKey: "isBanned", filterFn: (row, id, value) => { return value.includes(row.getValue(id)); }, }, { header: ({ column }) => ( ), accessorKey: "created_at", cell: ({ row }) => { const date = row.getValue("created_at"); return new Date(date as Date).toLocaleDateString(); }, sortingFn: "datetime", enableHiding: false, }, { header: ({ column }) => ( ), cell: ({ row }) => { const user = row.original; return ( Azioni Servizio Ricerca Comunicazioni Profilo Ordini Allegati Chat ); }, accessorKey: "actions", enableHiding: false, enableSorting: false, }, ]; const pinnedFiltri: PinnedFiltro[] = [ { title: "Ruolo", columnName: "isAdmin", options: [ { label: "Admin", value: "Admin" }, { label: "Utente", value: "Utente" }, ], }, { title: "Status", columnName: "isBanned", options: [ { label: "Bloccato", value: "Bloccato" }, { label: "Attivo", value: "Attivo" }, ], }, ]; const searchFiltro: SearchFiltro = { columnName: "username", placeholder: "Filtra utenti...", }; return (
); };