feat: implementar permisos por área de trabajo

- Agregar funciones de verificación de área en useHospitalStore
- canEditInArea, canEditCama, canEditInternacion, canEditPaciente
- Leer datos de tablas individuales en lugar de tabla kv
- Usar sessionStorage para persistir sesión de usuario
- Agregar prop canEdit a componentes de secciones en HC
- Ocultar botones de edición para usuarios sin permisos en el área
- MapaCamas: ocultar botones de edición para camas fuera del área
This commit is contained in:
2026-04-23 02:18:42 -03:00
parent 76e01bfd79
commit e6e1582b25
8 changed files with 411 additions and 118 deletions
+28 -22
View File
@@ -9,6 +9,7 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@
import { Label } from '@/components/ui/label';
import { Input } from '@/components/ui/input';
import type { Cama, Paciente, Internacion, Area } from '@/types';
import { useHospitalStore } from '@/hooks/useHospitalStore';
interface MapaCamasProps {
camas: Cama[];
@@ -41,6 +42,7 @@ export function MapaCamas({
getPacienteById,
getInternacionById
}: MapaCamasProps) {
const { canEditCama, canEditInArea } = useHospitalStore();
const [filtroSala, setFiltroSala] = useState<string>('todas');
const [filtroTipo, setFiltroTipo] = useState<string>('todos');
const [filtroEstado, setFiltroEstado] = useState<string>('todos');
@@ -324,7 +326,7 @@ export function MapaCamas({
<div className="space-y-2">
<p className="font-medium">Acciones:</p>
<div className="grid grid-cols-1 sm:grid-cols-2 gap-2">
{cama.estado === 'Disponible' && (
{cama.estado === 'Disponible' && canEditCama(cama.id) && (
<Dialog open={dialogoAbierto} onOpenChange={setDialogoAbierto}>
<DialogTrigger asChild>
<Button variant="outline"
@@ -409,9 +411,9 @@ export function MapaCamas({
</div>
</DialogContent>
</Dialog>
)}
{cama.estado !== 'Disponible' && (
)}
{cama.estado !== 'Disponible' && canEditCama(cama.id) && (
<Button
variant="outline"
className="w-full"
@@ -422,7 +424,7 @@ export function MapaCamas({
</Button>
)}
{cama.estado !== 'Reparacion' && (
{cama.estado !== 'Reparacion' && canEditCama(cama.id) && (
<Button
variant="outline"
className="w-full"
@@ -433,7 +435,7 @@ export function MapaCamas({
</Button>
)}
{cama.estado !== 'Reservada' && (
{cama.estado !== 'Reservada' && canEditCama(cama.id) && (
<Button
variant="outline"
className="w-full"
@@ -445,22 +447,26 @@ export function MapaCamas({
)}
<Button variant="outline" onClick={() => {
setEditingBed(cama);
setBedNumero(cama.numero);
setBedTipo(cama.tipo);
setBedAreaId(cama.areaId);
setBedDialogOpen(true);
}}>
<Edit2 className="h-4 w-4 mr-1" />Editar
</Button>
<Button variant="destructive" onClick={() => {
if (confirm('Eliminar esta cama?')) {
onEliminarCama(cama.id);
}
}}>
<Trash className="h-4 w-4 mr-1" />Eliminar
</Button>
{canEditCama(cama.id) && (
<Button variant="outline" onClick={() => {
setEditingBed(cama);
setBedNumero(cama.numero);
setBedTipo(cama.tipo);
setBedAreaId(cama.areaId);
setBedDialogOpen(true);
}}>
<Edit2 className="h-4 w-4 mr-1" />Editar
</Button>
)}
{canEditCama(cama.id) && (
<Button variant="destructive" onClick={() => {
if (confirm('Eliminar esta cama?')) {
onEliminarCama(cama.id);
}
}}>
<Trash className="h-4 w-4 mr-1" />Eliminar
</Button>
)}
</div>
</div>
</div>