import { useState } from "react"; import { useQuery, useMutation } from "@tanstack/react-query"; import { DashboardLayout } from "@/layouts/dashboard-layout"; import { DataTable } from "@/components/ui/data-table"; import { Button } from "@/components/ui/button"; import { Plus, Pencil, Trash2, Shield, ShieldOff } from "lucide-react"; import { User } from "@shared/schema"; import { format } from "date-fns"; import { useToast } from "@/hooks/use-toast"; import { apiRequest, queryClient } from "@/lib/queryClient"; import { Badge } from "@/components/ui/badge"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { insertUserSchema } from "@shared/schema"; // User form schema const userFormSchema = insertUserSchema.extend({ confirmPassword: z.string().optional(), id: z.number().optional(), }).refine(data => { // If password is provided, confirmPassword must match if (data.password && data.confirmPassword) { return data.password === data.confirmPassword; } return true; }, { message: "Passwords do not match", path: ["confirmPassword"], }); type UserFormValues = z.infer; export default function UserManagementPage() { const { toast } = useToast(); const [isAddDialogOpen, setIsAddDialogOpen] = useState(false); const [userToEdit, setUserToEdit] = useState(null); const [userToDelete, setUserToDelete] = useState(null); const [pageIndex, setPageIndex] = useState(0); const [pageSize, setPageSize] = useState(10); const form = useForm({ resolver: zodResolver(userFormSchema), defaultValues: { username: "", password: "", confirmPassword: "", email: "", fullName: "", role: "user", }, }); const { data: users = [], isLoading } = useQuery({ queryKey: ["/api/users"], }); const createUserMutation = useMutation({ mutationFn: async (values: UserFormValues) => { const { confirmPassword, id, ...userData } = values; if (id) { // Update existing user await apiRequest("PUT", `/api/users/${id}`, userData); } else { // Create new user await apiRequest("POST", "/api/register", userData); } }, onSuccess: () => { toast({ title: userToEdit ? "User updated" : "User created", description: userToEdit ? "The user has been successfully updated." : "The user has been successfully created.", }); queryClient.invalidateQueries({ queryKey: ["/api/users"] }); setIsAddDialogOpen(false); setUserToEdit(null); form.reset(); }, onError: (error) => { toast({ title: "Error", description: `Failed to ${userToEdit ? "update" : "create"} user: ${error.message}`, variant: "destructive", }); }, }); const deleteUserMutation = useMutation({ mutationFn: async (id: number) => { await apiRequest("DELETE", `/api/users/${id}`); }, onSuccess: () => { toast({ title: "User deleted", description: "The user has been successfully deleted.", }); queryClient.invalidateQueries({ queryKey: ["/api/users"] }); setUserToDelete(null); }, onError: (error) => { toast({ title: "Error", description: `Failed to delete user: ${error.message}`, variant: "destructive", }); }, }); const handleAddUser = () => { form.reset({ username: "", password: "", confirmPassword: "", email: "", fullName: "", role: "user", }); setUserToEdit(null); setIsAddDialogOpen(true); }; const handleEditUser = (user: User) => { form.reset({ id: user.id, username: user.username, password: "", confirmPassword: "", email: user.email || "", fullName: user.fullName || "", role: user.role || "user", }); setUserToEdit(user); setIsAddDialogOpen(true); }; const handleDeleteUser = (user: User) => { setUserToDelete(user); }; const confirmDeleteUser = () => { if (userToDelete) { deleteUserMutation.mutate(userToDelete.id); } }; const onSubmit = (values: UserFormValues) => { createUserMutation.mutate(values); }; const columns = [ { header: "Username", accessorKey: "username", }, { header: "Full Name", accessorKey: "fullName", }, { header: "Email", accessorKey: "email", }, { header: "Role", accessorKey: "role", cell: (row: User) => ( {row.role || "user"} ), }, { header: "Created", accessorKey: "createdAt", cell: (row: User) => row.createdAt ? format(new Date(row.createdAt), 'MMM dd, yyyy') : '', }, { header: "Actions", accessorKey: (row: User) => (
{row.role === "admin" ? ( ) : ( )}
), }, ]; return (

Manage users who can access the AD Management admin interface.

{userToEdit ? "Edit User" : "Add New User"} {userToEdit ? "Update user information and permissions." : "Fill in the details to create a new user."}
( Username )} /> ( Full Name )} /> ( Email )} /> ( Role )} /> ( {userToEdit ? "New Password (optional)" : "Password"} )} /> ( {userToEdit ? "Confirm New Password" : "Confirm Password"} )} />
setUserToDelete(null)}> Delete User Are you sure you want to delete the user "{userToDelete?.username}"? This action cannot be undone. Cancel Delete
); }