'use client'; import { useState } from 'react'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; import type { Role, User } from '@/lib/schemas'; import { hasPermission } from '@/lib/schemas/user'; import { CreateUserModal } from './CreateUserModal'; import { DeleteUserModal } from './DeleteUserModal'; interface UserManagementTableProps { initialData: User[]; roles: Role[]; currentUser: User; } export function UserManagementTable({ initialData, roles, currentUser }: UserManagementTableProps) { const router = useRouter(); const [usernameFilter, setUsernameFilter] = useState(''); const [roleNameFilter, setRoleNameFilter] = useState(''); const [sortBy, setSortBy] = useState('username'); const [sortDesc, setSortDesc] = useState(false); const [showCreateModal, setShowCreateModal] = useState(false); const [showDeleteModal, setShowDeleteModal] = useState(false); const [selectedUser, setSelectedUser] = useState(null); const applyFilters = () => { const params = new URLSearchParams(); if (usernameFilter) params.set('username', usernameFilter); if (roleNameFilter) params.set('role_name', roleNameFilter); params.set('sort_by', sortBy); params.set('sort_desc', sortDesc.toString()); params.set('page', '1'); router.push(`/dashboard/membership?${params.toString()}`); }; const resetFilters = () => { setUsernameFilter(''); setRoleNameFilter(''); setSortBy('username'); setSortDesc(false); router.push('/dashboard/membership'); }; const handleSort = (field: string) => { if (sortBy === field) { setSortDesc(!sortDesc); } else { setSortBy(field); setSortDesc(false); } applyFilters(); }; const getSortIcon = (field: string) => { if (sortBy !== field) return '↕️'; return sortDesc ? '↓' : '↑'; }; const openCreateModal = () => { setShowCreateModal(true); }; const closeCreateModal = () => { setShowCreateModal(false); }; const openDeleteModal = (user: User) => { setSelectedUser(user); setShowDeleteModal(true); }; const closeDeleteModal = () => { setSelectedUser(null); setShowDeleteModal(false); }; return ( <>

User Management

{hasPermission(currentUser, 'membership.create') && ( )}
{/* Filters */}

Filters

setUsernameFilter(e.target.value)} placeholder="Search by username..." className="mt-1 block w-full rounded-md border border-gray-600 bg-gray-700 px-3 py-2 text-white placeholder-gray-400 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 focus:outline-none" />
setRoleNameFilter(e.target.value)} placeholder="Filter by role..." className="mt-1 block w-full rounded-md border border-gray-600 bg-gray-700 px-3 py-2 text-white placeholder-gray-400 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 focus:outline-none" />
{/* Results Summary */}
Showing {initialData.length} users
{/* Users Table */}
{hasPermission(currentUser, 'membership.edit') && ( )} {initialData.length > 0 ? ( initialData.map((user) => ( {hasPermission(currentUser, 'membership.edit') && ( )} )) ) : ( )}
Actions
{user.username} {user.role.name}
{hasPermission(currentUser, 'membership.delete') && ( )}
No users found
{/* Modals */} {showCreateModal && } {showDeleteModal && selectedUser && ( )} ); }