1.1.4 - updated user modals

This commit is contained in:
2026-01-16 23:44:13 +02:00
parent a5e9072b9d
commit 458a78795d
16 changed files with 288 additions and 109 deletions

View File

@@ -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
})
}
>