Initial commit
This commit is contained in:
92
components/role-management-modal.tsx
Normal file
92
components/role-management-modal.tsx
Normal file
@@ -0,0 +1,92 @@
|
||||
"use client"
|
||||
|
||||
import { useState } from "react"
|
||||
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog"
|
||||
import { Button } from "@/components/ui/button"
|
||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
|
||||
import { Alert, AlertDescription } from "@/components/ui/alert"
|
||||
import { type User, type UserRole, ROLE_NAMES, ROLE_HIERARCHY } from "@/types/user"
|
||||
|
||||
interface RoleManagementModalProps {
|
||||
isOpen: boolean
|
||||
onClose: () => void
|
||||
user: User | null
|
||||
adminRole: UserRole
|
||||
onRoleChange: (userId: string, newRole: UserRole) => void
|
||||
}
|
||||
|
||||
export function RoleManagementModal({ isOpen, onClose, user, adminRole, onRoleChange }: RoleManagementModalProps) {
|
||||
const [selectedRole, setSelectedRole] = useState("")
|
||||
const [loading, setLoading] = useState(false)
|
||||
|
||||
if (!user) return null
|
||||
|
||||
const adminLevel = ROLE_HIERARCHY[adminRole] || 0
|
||||
const availableRoles = (Object.entries(ROLE_NAMES) as [UserRole, string][]).filter(([role]) => {
|
||||
const roleLevel = ROLE_HIERARCHY[role] || 0
|
||||
return roleLevel < adminLevel
|
||||
})
|
||||
|
||||
const handleRoleChange = async () => {
|
||||
if (!selectedRole) return
|
||||
|
||||
setLoading(true)
|
||||
try {
|
||||
await onRoleChange(user.national_id, selectedRole as UserRole)
|
||||
onClose()
|
||||
} catch (error) {
|
||||
console.error("Error changing role:", error)
|
||||
} finally {
|
||||
setLoading(false)
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<Dialog open={isOpen} onOpenChange={onClose}>
|
||||
<DialogContent className="max-w-md" dir="rtl">
|
||||
<DialogHeader>
|
||||
<DialogTitle>שינוי תפקיד - {user.name}</DialogTitle>
|
||||
<DialogDescription>בחר תפקיד חדש עבור המשתמש</DialogDescription>
|
||||
</DialogHeader>
|
||||
|
||||
<div className="space-y-4">
|
||||
<div className="bg-gray-50 p-3 rounded">
|
||||
<p className="text-sm text-gray-600">תפקיד נוכחי:</p>
|
||||
<p className="font-semibold">{ROLE_NAMES[user.role] || user.role}</p>
|
||||
</div>
|
||||
|
||||
<div className="space-y-2">
|
||||
<label className="text-sm font-medium">תפקיד חדש:</label>
|
||||
<Select value={selectedRole} onValueChange={setSelectedRole}>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="בחר תפקיד" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{availableRoles.map(([role, name]) => (
|
||||
<SelectItem key={role} value={role}>
|
||||
{name}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
|
||||
{selectedRole && (
|
||||
<Alert>
|
||||
<AlertDescription>המשתמש יקבל הרשאות של {ROLE_NAMES[selectedRole as UserRole]}</AlertDescription>
|
||||
</Alert>
|
||||
)}
|
||||
|
||||
<div className="flex gap-2 justify-end">
|
||||
<Button variant="outline" onClick={onClose}>
|
||||
ביטול
|
||||
</Button>
|
||||
<Button onClick={handleRoleChange} disabled={!selectedRole || loading}>
|
||||
{loading ? "משנה..." : "שנה תפקיד"}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user