diff --git a/src/pages/Users.tsx b/src/pages/Users.tsx new file mode 100644 index 0000000..ac850d1 --- /dev/null +++ b/src/pages/Users.tsx @@ -0,0 +1,194 @@ +import { useState } from "react"; +import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; +import { Badge } from "@/components/ui/badge"; +import { Input } from "@/components/ui/input"; +import { Button } from "@/components/ui/button"; +import { Avatar, AvatarFallback } from "@/components/ui/avatar"; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; +import { + Search, Plus, Pencil, Trash2, ChevronLeft, ChevronRight, + MoreHorizontal, Filter, Download +} from "lucide-react"; +import Sidebar from "@/components/Sidebar"; +import Header from "@/components/Header"; + +const users = [ + { id: 1, name: "Sarah Mitchell", initials: "SM", email: "sarah@example.com", role: "Admin", roleColor: "bg-red-100 text-red-700", status: "Active", statusColor: "bg-emerald-100 text-emerald-700", joined: "Jan 15, 2025" }, + { id: 2, name: "James Cooper", initials: "JC", email: "james@example.com", role: "Editor", roleColor: "bg-sky-100 text-sky-700", status: "Active", statusColor: "bg-emerald-100 text-emerald-700", joined: "Feb 22, 2025" }, + { id: 3, name: "Emily Zhang", initials: "EZ", email: "emily@example.com", role: "Viewer", roleColor: "bg-slate-100 text-slate-700", status: "Active", statusColor: "bg-emerald-100 text-emerald-700", joined: "Mar 08, 2025" }, + { id: 4, name: "Michael Brown", initials: "MB", email: "michael@example.com", role: "Editor", roleColor: "bg-sky-100 text-sky-700", status: "Inactive", statusColor: "bg-slate-100 text-slate-500", joined: "Apr 14, 2025" }, + { id: 5, name: "Lisa Anderson", initials: "LA", email: "lisa@example.com", role: "Admin", roleColor: "bg-red-100 text-red-700", status: "Active", statusColor: "bg-emerald-100 text-emerald-700", joined: "May 03, 2025" }, + { id: 6, name: "David Kim", initials: "DK", email: "david@example.com", role: "Viewer", roleColor: "bg-slate-100 text-slate-700", status: "Active", statusColor: "bg-emerald-100 text-emerald-700", joined: "Jun 19, 2025" }, + { id: 7, name: "Rachel Torres", initials: "RT", email: "rachel@example.com", role: "Editor", roleColor: "bg-sky-100 text-sky-700", status: "Inactive", statusColor: "bg-slate-100 text-slate-500", joined: "Jul 27, 2025" }, + { id: 8, name: "Chris Walker", initials: "CW", email: "chris@example.com", role: "Viewer", roleColor: "bg-slate-100 text-slate-700", status: "Active", statusColor: "bg-emerald-100 text-emerald-700", joined: "Aug 11, 2025" }, +]; + +export default function UsersPage() { + const [search, setSearch] = useState(""); + const [bulkAction, setBulkAction] = useState(""); + const [selectedUsers, setSelectedUsers] = useState([]); + + const filteredUsers = users.filter( + (u) => + u.name.toLowerCase().includes(search.toLowerCase()) || + u.email.toLowerCase().includes(search.toLowerCase()) + ); + + const toggleSelect = (id: number) => { + setSelectedUsers((prev) => + prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id] + ); + }; + + const toggleAll = () => { + setSelectedUsers((prev) => + prev.length === filteredUsers.length ? [] : filteredUsers.map((u) => u.id) + ); + }; + + return ( +
+ +
+
+
+
+
+

User Management

+

Manage your team members and their permissions

+
+ +
+ + + + {/* ── Toolbar ── */} +
+
+ + setSearch(e.target.value)} + className="pl-10 bg-slate-50 border-slate-200" + /> +
+
+ {selectedUsers.length > 0 && ( + + )} + + +
+
+ + {/* ── Users Table ── */} + + + + + 0} + onChange={toggleAll} + /> + + User + Email + Role + Status + Joined + Actions + + + + {filteredUsers.map((user, idx) => ( + + + toggleSelect(user.id)} + /> + + +
+ + {user.initials} + + {user.name} +
+
+ {user.email} + + + {user.role} + + + +
+ + {user.status} +
+
+ {user.joined} + +
+ + +
+
+
+ ))} +
+
+ + {/* ── Pagination ── */} +
+

+ Showing 1-8 of 248 users +

+
+ + + + + ... + + +
+
+
+
+
+
+
+ ); +}