mirror of
https://git.coastit.co.za/caitlin/CRM_ENVR.git
synced 2026-07-10 11:15:43 +02:00
yo
This commit is contained in:
@@ -63,7 +63,7 @@ export default function UsersPage() {
|
|||||||
<UsersIcon className="h-5 w-5 text-amber-600 dark:text-amber-400" />
|
<UsersIcon className="h-5 w-5 text-amber-600 dark:text-amber-400" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<p className="text-2xl font-bold">{users.filter((u) => u.role === "sales").length}</p>
|
<p className="text-2xl font-bold">{users.filter((u) => u.role === "sales_user").length}</p>
|
||||||
<p className="text-xs text-muted-foreground">Sales</p>
|
<p className="text-xs text-muted-foreground">Sales</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ export function Topbar({ onMenuClick }: TopbarProps) {
|
|||||||
|
|
||||||
useEffect(() => { setMounted(true) }, [])
|
useEffect(() => { setMounted(true) }, [])
|
||||||
if (!user) return null
|
if (!user) return null
|
||||||
const initials = (user.firstName[0] + user.lastName[0]).toUpperCase()
|
const initials = user.name.split(" ").map((n) => n[0]).join("")
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<header className="sticky top-0 z-20 flex h-16 items-center gap-4 border-b bg-background px-4 lg:px-6">
|
<header className="sticky top-0 z-20 flex h-16 items-center gap-4 border-b bg-background px-4 lg:px-6">
|
||||||
@@ -119,13 +119,13 @@ export function Topbar({ onMenuClick }: TopbarProps) {
|
|||||||
<AvatarImage src={user.avatar} />
|
<AvatarImage src={user.avatar} />
|
||||||
<AvatarFallback>{initials}</AvatarFallback>
|
<AvatarFallback>{initials}</AvatarFallback>
|
||||||
</Avatar>
|
</Avatar>
|
||||||
<span className="hidden text-sm font-medium md:inline-block">{user.firstName} {user.lastName}</span>
|
<span className="hidden text-sm font-medium md:inline-block">{user.name}</span>
|
||||||
</Button>
|
</Button>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent align="end" className="w-56">
|
<DropdownMenuContent align="end" className="w-56">
|
||||||
<DropdownMenuLabel className="font-normal">
|
<DropdownMenuLabel className="font-normal">
|
||||||
<div className="flex flex-col space-y-1">
|
<div className="flex flex-col space-y-1">
|
||||||
<p className="text-sm font-medium">{user.firstName} {user.lastName}</p>
|
<p className="text-sm font-medium">{user.name}</p>
|
||||||
<p className="text-xs text-muted-foreground">{user.email}</p>
|
<p className="text-xs text-muted-foreground">{user.email}</p>
|
||||||
<Badge variant="secondary" className="mt-1 w-fit text-xs capitalize">{user.role}</Badge>
|
<Badge variant="secondary" className="mt-1 w-fit text-xs capitalize">{user.role}</Badge>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ export function UserFormDialog({ open, onOpenChange, user }: UserFormDialogProps
|
|||||||
defaultValues: {
|
defaultValues: {
|
||||||
name: "",
|
name: "",
|
||||||
email: "",
|
email: "",
|
||||||
role: "sales",
|
role: "sales_user",
|
||||||
active: true,
|
active: true,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@@ -69,7 +69,7 @@ export function UserFormDialog({ open, onOpenChange, user }: UserFormDialogProps
|
|||||||
active: user.active,
|
active: user.active,
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
form.reset({ name: "", email: "", role: "sales", active: true })
|
form.reset({ name: "", email: "", role: "sales_user", active: true })
|
||||||
}
|
}
|
||||||
}, [user, form])
|
}, [user, form])
|
||||||
|
|
||||||
@@ -130,8 +130,10 @@ export function UserFormDialog({ open, onOpenChange, user }: UserFormDialogProps
|
|||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
<SelectContent>
|
<SelectContent>
|
||||||
|
<SelectItem value="super_admin">Super Admin</SelectItem>
|
||||||
<SelectItem value="admin">Admin</SelectItem>
|
<SelectItem value="admin">Admin</SelectItem>
|
||||||
<SelectItem value="sales">Sales</SelectItem>
|
<SelectItem value="sales_user">Sales</SelectItem>
|
||||||
|
<SelectItem value="developer">Developer</SelectItem>
|
||||||
</SelectContent>
|
</SelectContent>
|
||||||
</Select>
|
</Select>
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
|
|||||||
+8
-8
@@ -1,4 +1,4 @@
|
|||||||
import { User } from "@/types"
|
import { User, UserRole } from "@/types"
|
||||||
|
|
||||||
export const users: User[] = [
|
export const users: User[] = [
|
||||||
{
|
{
|
||||||
@@ -14,7 +14,7 @@ export const users: User[] = [
|
|||||||
id: "u2",
|
id: "u2",
|
||||||
name: "Marcus Johnson",
|
name: "Marcus Johnson",
|
||||||
email: "marcus@coastalit.com",
|
email: "marcus@coastalit.com",
|
||||||
role: "sales",
|
role: "sales_user",
|
||||||
active: true,
|
active: true,
|
||||||
avatar: "https://ui-avatars.com/api/?name=Marcus+Johnson&background=2563eb&color=fff&size=128",
|
avatar: "https://ui-avatars.com/api/?name=Marcus+Johnson&background=2563eb&color=fff&size=128",
|
||||||
createdAt: "2025-02-01T09:00:00Z",
|
createdAt: "2025-02-01T09:00:00Z",
|
||||||
@@ -23,7 +23,7 @@ export const users: User[] = [
|
|||||||
id: "u3",
|
id: "u3",
|
||||||
name: "Emily Rodriguez",
|
name: "Emily Rodriguez",
|
||||||
email: "emily@coastalit.com",
|
email: "emily@coastalit.com",
|
||||||
role: "sales",
|
role: "sales_user",
|
||||||
active: true,
|
active: true,
|
||||||
avatar: "https://ui-avatars.com/api/?name=Emily+Rodriguez&background=3b82f6&color=fff&size=128",
|
avatar: "https://ui-avatars.com/api/?name=Emily+Rodriguez&background=3b82f6&color=fff&size=128",
|
||||||
createdAt: "2025-02-15T10:00:00Z",
|
createdAt: "2025-02-15T10:00:00Z",
|
||||||
@@ -32,7 +32,7 @@ export const users: User[] = [
|
|||||||
id: "u4",
|
id: "u4",
|
||||||
name: "David Kim",
|
name: "David Kim",
|
||||||
email: "david@coastalit.com",
|
email: "david@coastalit.com",
|
||||||
role: "sales",
|
role: "sales_user",
|
||||||
active: true,
|
active: true,
|
||||||
avatar: "https://ui-avatars.com/api/?name=David+Kim&background=60a5fa&color=fff&size=128",
|
avatar: "https://ui-avatars.com/api/?name=David+Kim&background=60a5fa&color=fff&size=128",
|
||||||
createdAt: "2025-03-01T08:00:00Z",
|
createdAt: "2025-03-01T08:00:00Z",
|
||||||
@@ -41,7 +41,7 @@ export const users: User[] = [
|
|||||||
id: "u5",
|
id: "u5",
|
||||||
name: "Jessica Patel",
|
name: "Jessica Patel",
|
||||||
email: "jessica@coastalit.com",
|
email: "jessica@coastalit.com",
|
||||||
role: "sales",
|
role: "sales_user",
|
||||||
active: false,
|
active: false,
|
||||||
avatar: "https://ui-avatars.com/api/?name=Jessica+Patel&background=93c5fd&color=fff&size=128",
|
avatar: "https://ui-avatars.com/api/?name=Jessica+Patel&background=93c5fd&color=fff&size=128",
|
||||||
createdAt: "2025-03-10T09:00:00Z",
|
createdAt: "2025-03-10T09:00:00Z",
|
||||||
@@ -50,7 +50,7 @@ export const users: User[] = [
|
|||||||
id: "u6",
|
id: "u6",
|
||||||
name: "Alex Thompson",
|
name: "Alex Thompson",
|
||||||
email: "alex@coastalit.com",
|
email: "alex@coastalit.com",
|
||||||
role: "sales",
|
role: "sales_user",
|
||||||
active: true,
|
active: true,
|
||||||
avatar: "https://ui-avatars.com/api/?name=Alex+Thompson&background=1d4ed8&color=fff&size=128",
|
avatar: "https://ui-avatars.com/api/?name=Alex+Thompson&background=1d4ed8&color=fff&size=128",
|
||||||
createdAt: "2025-04-01T08:00:00Z",
|
createdAt: "2025-04-01T08:00:00Z",
|
||||||
@@ -59,7 +59,7 @@ export const users: User[] = [
|
|||||||
id: "u7",
|
id: "u7",
|
||||||
name: "Rachel Williams",
|
name: "Rachel Williams",
|
||||||
email: "rachel@coastalit.com",
|
email: "rachel@coastalit.com",
|
||||||
role: "sales",
|
role: "sales_user",
|
||||||
active: true,
|
active: true,
|
||||||
avatar: "https://ui-avatars.com/api/?name=Rachel+Williams&background=2563eb&color=fff&size=128",
|
avatar: "https://ui-avatars.com/api/?name=Rachel+Williams&background=2563eb&color=fff&size=128",
|
||||||
createdAt: "2025-04-15T10:00:00Z",
|
createdAt: "2025-04-15T10:00:00Z",
|
||||||
@@ -79,7 +79,7 @@ export function getUserById(id: string): User | undefined {
|
|||||||
return users.find((u) => u.id === id)
|
return users.find((u) => u.id === id)
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getUsersByRole(role: "admin" | "sales"): User[] {
|
export function getUsersByRole(role: UserRole): User[] {
|
||||||
return users.filter((u) => u.role === role)
|
return users.filter((u) => u.role === role)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-4
@@ -156,9 +156,7 @@ export async function isAccountLocked(user: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function mapDbUserToSessionUser(dbUser: Record<string, unknown>): SessionUser {
|
export function mapDbUserToSessionUser(dbUser: Record<string, unknown>): SessionUser {
|
||||||
const roleName = dbUser.role_name as string
|
const roleName = (dbUser.role_name as string).toLowerCase()
|
||||||
const mappedRole =
|
|
||||||
roleName === "SUPER_ADMIN" || roleName === "ADMIN" ? "admin" : "sales"
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: dbUser.id as string,
|
id: dbUser.id as string,
|
||||||
@@ -166,7 +164,7 @@ export function mapDbUserToSessionUser(dbUser: Record<string, unknown>): Session
|
|||||||
email: dbUser.email as string,
|
email: dbUser.email as string,
|
||||||
firstName: dbUser.first_name as string,
|
firstName: dbUser.first_name as string,
|
||||||
lastName: dbUser.last_name as string,
|
lastName: dbUser.last_name as string,
|
||||||
role: mappedRole,
|
role: roleName,
|
||||||
avatar: `https://ui-avatars.com/api/?name=${encodeURIComponent(
|
avatar: `https://ui-avatars.com/api/?name=${encodeURIComponent(
|
||||||
`${dbUser.first_name}+${dbUser.last_name}`
|
`${dbUser.first_name}+${dbUser.last_name}`
|
||||||
)}&background=1d4ed8&color=fff&size=128`,
|
)}&background=1d4ed8&color=fff&size=128`,
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
export type LeadStatus = "open" | "contacted" | "pending" | "closed" | "ignored"
|
export type LeadStatus = "open" | "contacted" | "pending" | "closed" | "ignored"
|
||||||
export type UserRole = "admin" | "sales"
|
export type UserRole = "super_admin" | "admin" | "sales_user" | "developer"
|
||||||
|
|
||||||
export interface User {
|
export interface User {
|
||||||
id: string
|
id: string
|
||||||
|
|||||||
Reference in New Issue
Block a user