From 6c02bd54484bacc81050ec52393b192577fd55e9 Mon Sep 17 00:00:00 2001 From: Esteban Date: Sun, 1 Feb 2026 18:30:28 -0600 Subject: [PATCH] Changes --- src/pages/UsersPage.tsx | 44 ++++- src/pages/concentrators/ConcentratorsPage.tsx | 41 ++--- .../concentrators/ConcentratorsSidebar.tsx | 7 +- src/pages/concentrators/useConcentrators.ts | 118 ++++-------- water-api/src/middleware/audit.middleware.ts | 172 ++---------------- 5 files changed, 110 insertions(+), 272 deletions(-) diff --git a/src/pages/UsersPage.tsx b/src/pages/UsersPage.tsx index fc92999..4430d52 100644 --- a/src/pages/UsersPage.tsx +++ b/src/pages/UsersPage.tsx @@ -3,6 +3,7 @@ import { Plus, Trash2, Pencil, RefreshCcw } from "lucide-react"; import MaterialTable from "@material-table/core"; import { createUser, updateUser, deleteUser, getAllUsers, CreateUserInput, UpdateUserInput, User as ApiUser } from "../api/users"; import { getAllRoles, Role as ApiRole } from "../api/roles"; +import { fetchProjects, type Project } from "../api/projects"; interface RoleOption { id: string; @@ -24,6 +25,7 @@ interface UserForm { email: string; password?: string; roleId: string; + projectId?: string; status: "ACTIVE" | "INACTIVE"; createdAt: string; } @@ -37,12 +39,14 @@ export default function UsersPage() { const [editingId, setEditingId] = useState(null); const [roles, setRoles] = useState([]); const [modalRoles, setModalRoles] = useState([]); + const [projects, setProjects] = useState([]); const [loadingUsers, setLoadingUsers] = useState(true); const [loadingModalRoles, setLoadingModalRoles] = useState(false); + const [loadingProjects, setLoadingProjects] = useState(false); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); - const emptyUser: UserForm = { name: "", email: "", roleId: "", password: "", status: "ACTIVE", createdAt: new Date().toISOString().slice(0,10) }; + const emptyUser: UserForm = { name: "", email: "", roleId: "", projectId: "", password: "", status: "ACTIVE", createdAt: new Date().toISOString().slice(0,10) }; const [form, setForm] = useState(emptyUser); useEffect(() => { @@ -96,6 +100,14 @@ export default function UsersPage() { return; } + const selectedRole = modalRoles.find(r => r.id === form.roleId); + const isOperatorRole = selectedRole?.name === "OPERATOR"; + + if (isOperatorRole && !form.projectId) { + setError("Project is required for OPERATOR role"); + return; + } + if (!editingId && !form.password) { setError("Password is required for new users"); return; @@ -181,12 +193,26 @@ export default function UsersPage() { } }; + const fetchModalProjects = async () => { + try { + setLoadingProjects(true); + const projectsData = await fetchProjects(); + console.log('Projects fetched:', projectsData); + setProjects(projectsData); + } catch (error) { + console.error('Failed to fetch projects:', error); + } finally { + setLoadingProjects(false); + } + }; + const handleOpenAddModal = () => { setForm(emptyUser); setEditingId(null); setError(null); setShowModal(true); fetchModalRoles(); + fetchModalProjects(); }; const handleOpenEditModal = (user: User) => { @@ -195,6 +221,7 @@ export default function UsersPage() { name: user.name, email: user.email, roleId: user.roleId, + projectId: "", status: user.status, createdAt: user.createdAt, password: "" @@ -202,6 +229,7 @@ export default function UsersPage() { setError(null); setShowModal(true); fetchModalRoles(); + fetchModalProjects(); }; // Filter users by search and selected role @@ -327,7 +355,7 @@ export default function UsersPage() { + {modalRoles.find(r => r.id === form.roleId)?.name === "OPERATOR" && ( + + )} +