"use client"; import CreateRoleForm from "@app/components/CreateRoleForm"; import DeleteRoleForm from "@app/components/DeleteRoleForm"; import { Button } from "@app/components/ui/button"; import { ExtendedColumnDef } from "@app/components/ui/data-table"; import { useNavigationContext } from "@app/hooks/useNavigationContext"; import { toast } from "@app/hooks/useToast"; import { getNextSortOrder, getSortDirection } from "@app/lib/sortColumn"; import { Role } from "@server/db"; import type { PaginationState } from "@tanstack/react-table"; import { ArrowDown01Icon, ArrowUp10Icon, ChevronsUpDownIcon, MoreHorizontal } from "lucide-react"; import { useTranslations } from "next-intl"; import { useRouter } from "next/navigation"; import { useState, useTransition } from "react"; import { useDebouncedCallback } from "use-debounce"; import EditRoleForm from "./EditRoleForm"; import { ControlledDataTable } from "./ui/controlled-data-table"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "./ui/dropdown-menu"; export type RoleRow = Role; type RolesTableProps = { roles: RoleRow[]; pagination: PaginationState; rowCount: number; }; export default function UsersTable({ roles, pagination, rowCount }: RolesTableProps) { const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [editingRole, setEditingRole] = useState(null); const [isEditDialogOpen, setIsEditDialogOpen] = useState(false); const router = useRouter(); const [isRefreshing, startTransition] = useTransition(); const { navigate: filter, isNavigating: isFiltering, searchParams } = useNavigationContext(); const [roleToRemove, setRoleToRemove] = useState(null); const t = useTranslations(); const refreshData = async () => { console.log("Data refreshed"); try { router.refresh(); } catch (error) { toast({ title: t("error"), description: t("refreshError"), variant: "destructive" }); } }; const columns: ExtendedColumnDef[] = [ { accessorKey: "name", enableHiding: false, friendlyName: t("name"), header: ({ column }) => { const nameOrder = getSortDirection("name", searchParams); const Icon = nameOrder === "asc" ? ArrowDown01Icon : nameOrder === "desc" ? ArrowUp10Icon : ChevronsUpDownIcon; return ( ); } }, { accessorKey: "description", friendlyName: t("description"), header: () => {t("description")} }, // { // id: "actions", // enableHiding: false, // header: () => , // cell: ({ row }) => { // const roleRow = row.original; // return ( //
// //
// ); // } // }, { id: "actions", enableHiding: false, header: () => , cell: ({ row }) => { const roleRow = row.original; const isAdmin = roleRow.isAdmin; return (
{ setRoleToRemove(roleRow); setIsDeleteModalOpen(true); }} > {t("delete")}
); } } ]; function toggleSort(column: string) { const newSearch = getNextSortOrder(column, searchParams); filter({ searchParams: newSearch }); } const handlePaginationChange = (newPage: PaginationState) => { searchParams.set("page", (newPage.pageIndex + 1).toString()); searchParams.set("pageSize", newPage.pageSize.toString()); filter({ searchParams }); }; const handleSearchChange = useDebouncedCallback((query: string) => { searchParams.set("query", query); searchParams.delete("page"); filter({ searchParams }); }, 300); return ( <> {editingRole && ( { // Delay refresh to allow modal to close smoothly setTimeout(() => { startTransition(async () => { await refreshData().then(() => setEditingRole(null) ); }); }, 150); }} /> )} { startTransition(refreshData); }} /> {roleToRemove && ( { startTransition(async () => { await refreshData().then(() => setRoleToRemove(null) ); }); }} /> )} { setIsCreateModalOpen(true); }} onRefresh={() => startTransition(refreshData)} isRefreshing={isRefreshing} /> ); }