From 458a78795d7902eea722b0a996398575c6c4b2a8 Mon Sep 17 00:00:00 2001 From: Tom Ruff Date: Fri, 16 Jan 2026 23:44:13 +0200 Subject: [PATCH] 1.1.4 - updated user modals --- app/admin/page.tsx | 133 ++++++++++++++---- app/api/admin/add-user/route.ts | 58 +++++--- app/api/admin/department-reset/route.ts | 10 +- app/api/admin/department-stats/route.ts | 16 ++- .../department-users-by-category/route.ts | 8 +- app/api/admin/department-users/route.ts | 9 +- app/api/admin/field-users/route.ts | 1 + app/api/admin/team-reset/route.ts | 10 +- app/api/admin/team-stats/route.ts | 17 ++- app/api/admin/team-users-by-category/route.ts | 8 +- app/api/admin/team-users/route.ts | 9 +- app/api/admin/update-user-scope/route.ts | 54 ++++--- app/api/admin/users/route.ts | 3 +- components/user-scope-modal.tsx | 57 ++++++-- next.config.mjs | 2 +- package.json | 2 +- 16 files changed, 288 insertions(+), 109 deletions(-) diff --git a/app/admin/page.tsx b/app/admin/page.tsx index 4afce5f..7a423ba 100644 --- a/app/admin/page.tsx +++ b/app/admin/page.tsx @@ -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() { )} - - - - צוות - - - - מסגרת - - - - תחום - + + {canShowTeamTab && ( + + + צוות + + )} + {canShowDepartmentTab && ( + + + מסגרת + + )} + {canShowFieldTab && ( + + + תחום + + )} כללי + {canShowTeamTab && (
@@ -1278,7 +1343,9 @@ export default function AdminPage() { + )} + {canShowDepartmentTab && (
@@ -1343,7 +1410,9 @@ export default function AdminPage() { + )} + {canShowFieldTab && (
@@ -1408,6 +1477,7 @@ export default function AdminPage() { + )}
@@ -1481,6 +1551,8 @@ export default function AdminPage() {
+ {newUser.role !== "field_admin" && ( +
+ )} + {newUser.role !== "field_admin" && newUser.role !== "department_admin" && ( +
+ )}
- + {fields.map((item) => ( @@ -119,7 +139,7 @@ export function UserScopeModal({
@@ -134,7 +157,7 @@ export function UserScopeModal({
@@ -153,7 +177,12 @@ export function UserScopeModal({ diff --git a/next.config.mjs b/next.config.mjs index 037bf05..b5227a9 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,7 +1,7 @@ /** @type {import('next').NextConfig} */ const nextConfig = { env: { - APPVERSION: '1.1.3' + APPVERSION: '1.1.4' }, experimental: { serverComponentsExternalPackages: ['mysql2'] diff --git a/package.json b/package.json index 7ad419a..3f9bafb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mamad-app", - "version": "1.1.3", + "version": "1.1.4", "private": true, "scripts": { "build": "next build", -- 2.49.1