1.1.4 - updated user modals
This commit is contained in:
@@ -83,6 +83,7 @@ interface Stats {
|
||||
interface UserData {
|
||||
national_id: string
|
||||
name: string
|
||||
role?: string
|
||||
in_shelter?: string
|
||||
last_updated?: string
|
||||
is_admin: boolean
|
||||
@@ -650,35 +651,64 @@ export default function AdminPage() {
|
||||
const handleAddUser = async (e: React.FormEvent) => {
|
||||
e.preventDefault()
|
||||
|
||||
if (!newUser.field || !newUser.department || !newUser.team || !newUser.role) {
|
||||
setMessage("יש לבחור תפקיד, תחום, מסגרת וצוות")
|
||||
const trimmedField = newUser.field.trim()
|
||||
const trimmedDepartment = newUser.department.trim()
|
||||
const trimmedTeam = newUser.team.trim()
|
||||
const selectedRole = newUser.role as UserRole
|
||||
|
||||
if (!trimmedField || !selectedRole) {
|
||||
setMessage("Please fill in the required fields.")
|
||||
return
|
||||
}
|
||||
|
||||
if (selectedRole === "department_admin") {
|
||||
if (!trimmedDepartment) {
|
||||
setMessage("Please fill in the required fields.")
|
||||
return
|
||||
}
|
||||
} else if (selectedRole === "team_admin" || selectedRole === "user") {
|
||||
if (!trimmedDepartment || !trimmedTeam) {
|
||||
setMessage("Please fill in the required fields.")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const payload = {
|
||||
...newUser,
|
||||
field: trimmedField,
|
||||
department: trimmedDepartment,
|
||||
team: trimmedTeam,
|
||||
adminId: user?.national_id,
|
||||
}
|
||||
|
||||
if (selectedRole === "field_admin") {
|
||||
payload.department = ""
|
||||
payload.team = ""
|
||||
} else if (selectedRole === "department_admin") {
|
||||
payload.team = ""
|
||||
}
|
||||
|
||||
const response = await fetch("/api/admin/add-user", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({
|
||||
...newUser,
|
||||
adminId: user?.national_id,
|
||||
}),
|
||||
body: JSON.stringify(payload),
|
||||
})
|
||||
|
||||
const data = await response.json()
|
||||
|
||||
if (response.ok) {
|
||||
setMessage(`${data.message}. הסיסמה הזמנית: password123`)
|
||||
setMessage(`${data.message}. Default password: password123`)
|
||||
setNewUser({ name: "", isAdmin: false, field: "", department: "", team: "", role: "" })
|
||||
refetchGlobal()
|
||||
refetchTeam()
|
||||
refetchDepartment()
|
||||
refetchField()
|
||||
} else {
|
||||
setMessage(data.error || "שגיאה בהוספת משתמש")
|
||||
setMessage(data.error || "Failed to add user.")
|
||||
}
|
||||
} catch (err) {
|
||||
setMessage("שגיאה בחיבור לשרת")
|
||||
setMessage("Failed to add user.")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1130,6 +1160,34 @@ export default function AdminPage() {
|
||||
}
|
||||
}, [allowedManagedTabs, managedTypeTab])
|
||||
|
||||
const canShowTeamTab =
|
||||
(user?.role === "team_admin" && !!user?.team) || (user?.role === "global_admin" && !!user?.team)
|
||||
const canShowDepartmentTab =
|
||||
(user?.role === "department_admin" && !!user?.department) ||
|
||||
(user?.role === "global_admin" && !!user?.department)
|
||||
const canShowFieldTab =
|
||||
user?.role === "field_admin" || (user?.role === "global_admin" && !!user?.field)
|
||||
const visibleTabs = [
|
||||
canShowTeamTab ? "team" : null,
|
||||
canShowDepartmentTab ? "department" : null,
|
||||
canShowFieldTab ? "field" : null,
|
||||
"global",
|
||||
].filter(Boolean) as string[]
|
||||
const tabColumns =
|
||||
visibleTabs.length === 1
|
||||
? "grid-cols-1"
|
||||
: visibleTabs.length === 2
|
||||
? "grid-cols-2"
|
||||
: visibleTabs.length === 3
|
||||
? "grid-cols-3"
|
||||
: "grid-cols-4"
|
||||
|
||||
useEffect(() => {
|
||||
if (visibleTabs.length > 0 && !visibleTabs.includes(activeTab)) {
|
||||
setActiveTab(visibleTabs[0])
|
||||
}
|
||||
}, [activeTab, visibleTabs])
|
||||
|
||||
if (!user) return null
|
||||
|
||||
return (
|
||||
@@ -1204,25 +1262,32 @@ export default function AdminPage() {
|
||||
)}
|
||||
|
||||
<Tabs value={activeTab} onValueChange={setActiveTab} className="w-full" dir="rtl">
|
||||
<TabsList className="grid w-full grid-cols-4">
|
||||
<TabsTrigger value="team" className="flex items-center gap-2">
|
||||
<UsersIcon className="h-4 w-4" />
|
||||
צוות
|
||||
</TabsTrigger>
|
||||
<TabsTrigger value="department" className="flex items-center gap-2">
|
||||
<Building2 className="h-4 w-4" />
|
||||
מסגרת
|
||||
</TabsTrigger>
|
||||
<TabsTrigger value="field" className="flex items-center gap-2">
|
||||
<Globe className="h-4 w-4" />
|
||||
תחום
|
||||
</TabsTrigger>
|
||||
<TabsList className={`grid w-full ${tabColumns}`}>
|
||||
{canShowTeamTab && (
|
||||
<TabsTrigger value="team" className="flex items-center gap-2">
|
||||
<UsersIcon className="h-4 w-4" />
|
||||
צוות
|
||||
</TabsTrigger>
|
||||
)}
|
||||
{canShowDepartmentTab && (
|
||||
<TabsTrigger value="department" className="flex items-center gap-2">
|
||||
<Building2 className="h-4 w-4" />
|
||||
מסגרת
|
||||
</TabsTrigger>
|
||||
)}
|
||||
{canShowFieldTab && (
|
||||
<TabsTrigger value="field" className="flex items-center gap-2">
|
||||
<Globe className="h-4 w-4" />
|
||||
תחום
|
||||
</TabsTrigger>
|
||||
)}
|
||||
<TabsTrigger value="global" className="flex items-center gap-2">
|
||||
<Globe className="h-4 w-4" />
|
||||
כללי
|
||||
</TabsTrigger>
|
||||
</TabsList>
|
||||
|
||||
{canShowTeamTab && (
|
||||
<TabsContent value="team" className="space-y-6">
|
||||
<div className="grid md:grid-cols-2 gap-6">
|
||||
<Card>
|
||||
@@ -1278,7 +1343,9 @@ export default function AdminPage() {
|
||||
</CardContent>
|
||||
</Card>
|
||||
</TabsContent>
|
||||
)}
|
||||
|
||||
{canShowDepartmentTab && (
|
||||
<TabsContent value="department" className="space-y-6">
|
||||
<div className="grid md:grid-cols-2 gap-6">
|
||||
<Card>
|
||||
@@ -1343,7 +1410,9 @@ export default function AdminPage() {
|
||||
</CardContent>
|
||||
</Card>
|
||||
</TabsContent>
|
||||
)}
|
||||
|
||||
{canShowFieldTab && (
|
||||
<TabsContent value="field" className="space-y-6">
|
||||
<div className="grid md:grid-cols-2 gap-6">
|
||||
<Card>
|
||||
@@ -1408,6 +1477,7 @@ export default function AdminPage() {
|
||||
</CardContent>
|
||||
</Card>
|
||||
</TabsContent>
|
||||
)}
|
||||
|
||||
<TabsContent value="global" className="space-y-6">
|
||||
<div className="grid md:grid-cols-2 gap-6">
|
||||
@@ -1481,6 +1551,8 @@ export default function AdminPage() {
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
{newUser.role !== "field_admin" && (
|
||||
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="department">מסגרת</Label>
|
||||
<Select
|
||||
@@ -1499,6 +1571,9 @@ export default function AdminPage() {
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
)}
|
||||
{newUser.role !== "field_admin" && newUser.role !== "department_admin" && (
|
||||
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="team">צוות</Label>
|
||||
<Select value={newUser.team} onValueChange={(value) => setNewUser({ ...newUser, team: value })}>
|
||||
@@ -1514,15 +1589,21 @@ export default function AdminPage() {
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
)}
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="role">הרשאה</Label>
|
||||
<Select
|
||||
value={newUser.role}
|
||||
onValueChange={(value) =>
|
||||
setNewUser({
|
||||
...newUser,
|
||||
role: value,
|
||||
isAdmin: value !== "user", // Automatically set isAdmin
|
||||
setNewUser((prev) => {
|
||||
const next = { ...prev, role: value, isAdmin: value !== "user" }
|
||||
if (value === "field_admin") {
|
||||
next.department = ""
|
||||
next.team = ""
|
||||
} else if (value === "department_admin") {
|
||||
next.team = ""
|
||||
}
|
||||
return next
|
||||
})
|
||||
}
|
||||
>
|
||||
|
||||
Reference in New Issue
Block a user