From 6124bedb8ab7483b844b85fd76a8af1726c043af Mon Sep 17 00:00:00 2001 From: Esteban Date: Tue, 3 Feb 2026 00:28:58 -0600 Subject: [PATCH] Operator permissions --- .../concentrators/ConcentratorsSidebar.tsx | 8 +-- src/pages/concentrators/useConcentrators.ts | 5 -- src/pages/consumption/ConsumptionPage.tsx | 25 ++++++++- src/pages/meters/MeterPage.tsx | 20 +++++-- src/pages/meters/MetersSidebar.tsx | 56 +++++++++++-------- src/pages/meters/useMeters.ts | 48 ++++++++++++++-- 6 files changed, 115 insertions(+), 47 deletions(-) diff --git a/src/pages/concentrators/ConcentratorsSidebar.tsx b/src/pages/concentrators/ConcentratorsSidebar.tsx index e956e2d..aadd7b7 100644 --- a/src/pages/concentrators/ConcentratorsSidebar.tsx +++ b/src/pages/concentrators/ConcentratorsSidebar.tsx @@ -65,8 +65,6 @@ export default function ConcentratorsSidebar({

Proyectos

- Tipo: {sampleViewLabel} - {" • "} Seleccionado:{" "} {projects.find((p) => p.id === selectedProject)?.name || "—"} @@ -142,10 +140,8 @@ export default function ConcentratorsSidebar({ ) : projects.length === 0 ? (

{selectedMeterTypeId - ? `No hay proyectos con el tipo de toma seleccionado y concentradores ${sampleViewLabel}.` - : sampleView === "GENERAL" - ? "No hay proyectos con concentradores disponibles." - : `No hay proyectos con concentradores ${sampleViewLabel}.` + ? `No hay proyectos con el tipo de toma seleccionado.` + : "No hay proyectos disponibles." }
) : ( diff --git a/src/pages/concentrators/useConcentrators.ts b/src/pages/concentrators/useConcentrators.ts index cdf30fd..cd18897 100644 --- a/src/pages/concentrators/useConcentrators.ts +++ b/src/pages/concentrators/useConcentrators.ts @@ -183,11 +183,6 @@ export function useConcentrators() { let filteredProjects = visibleProjects; - filteredProjects = filteredProjects.filter((projectId) => { - const count = counts[projectId] ?? 0; - return count > 0; - }); - if (selectedMeterTypeId) { filteredProjects = filteredProjects.filter((projectId) => { const project = projects.find((p) => p.id === projectId); diff --git a/src/pages/consumption/ConsumptionPage.tsx b/src/pages/consumption/ConsumptionPage.tsx index cf32148..a0ce67d 100644 --- a/src/pages/consumption/ConsumptionPage.tsx +++ b/src/pages/consumption/ConsumptionPage.tsx @@ -22,9 +22,14 @@ import { type Pagination, } from "../../api/readings"; import { fetchProjects, type Project } from "../../api/projects"; +import { getCurrentUserRole, getCurrentUserProjectId } from "../../api/auth"; import ReadingsBulkUploadModal from "./ReadingsBulkUploadModal"; export default function ConsumptionPage() { + const userRole = useMemo(() => getCurrentUserRole(), []); + const userProjectId = useMemo(() => getCurrentUserProjectId(), []); + const isOperator = userRole?.toUpperCase() === 'OPERATOR'; + const [readings, setReadings] = useState([]); const [summary, setSummary] = useState(null); const [projects, setProjects] = useState([]); @@ -49,12 +54,23 @@ export default function ConsumptionPage() { const loadProjects = async () => { try { const data = await fetchProjects(); - setProjects(data); + + let visibleProjects = data; + if (isOperator && userProjectId) { + visibleProjects = data.filter(p => p.id === userProjectId); + + if (visibleProjects.length > 0) { + setSelectedProject(visibleProjects[0].id); + } + } + + setProjects(visibleProjects); } catch (error) { console.error("Error loading projects:", error); } }; loadProjects(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const loadData = async (page = 1) => { @@ -167,7 +183,9 @@ export default function ConsumptionPage() { }; const clearFilters = () => { - setSelectedProject(""); + if (!isOperator) { + setSelectedProject(""); + } setStartDate(""); setEndDate(""); setSearch(""); @@ -342,8 +360,9 @@ export default function ConsumptionPage() { value={selectedProject} onChange={(e) => setSelectedProject(e.target.value)} className="px-3 py-1.5 text-sm bg-white border border-slate-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500/20" + disabled={isOperator} > - + {!isOperator && } {projects.map((p) => (