feat: make side panel Cultivos section read-only and place bed badge on the left
This commit is contained in:
+277
@@ -0,0 +1,277 @@
|
||||
import { useHospitalStore } from '@/hooks/useHospitalStore';
|
||||
import { Layout } from '@/sections/Layout';
|
||||
import { toast } from 'sonner';
|
||||
import { Dashboard } from '@/sections/Dashboard';
|
||||
import { MapaCamas } from '@/sections/MapaCamas';
|
||||
import { Pacientes } from '@/sections/Pacientes';
|
||||
import { Internaciones } from '@/sections/Internaciones';
|
||||
import { Evoluciones } from '@/sections/Evoluciones';
|
||||
import { AcidoBaseSection } from '@/sections/AcidoBase';
|
||||
import { Cultivos } from '@/sections/Cultivos';
|
||||
import { HistoriaClinica } from '@/sections/HistoriaClinica';
|
||||
import { NuevoIngreso } from '@/sections/NuevoIngreso';
|
||||
import { EditIngreso } from '@/sections/EditIngreso';
|
||||
import { Login } from '@/sections/Login';
|
||||
import { GestionUsuarios } from '@/sections/GestionUsuarios';
|
||||
import { Spinner } from '@/components/ui/spinner';
|
||||
import { Button } from '@/components/ui/button';
|
||||
import { ThemeProvider } from "@/components/theme-provider";
|
||||
import { Toaster } from '@/components/ui/sonner';
|
||||
import type { Indicacion, MovimientoIndicacion } from '@/types';
|
||||
|
||||
function AppContent() {
|
||||
const store = useHospitalStore();
|
||||
|
||||
if (!store.isLoaded) {
|
||||
return (
|
||||
<div className="min-h-screen flex items-center justify-center">
|
||||
<Spinner className="h-8 w-8" />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
if (!store.isAuthenticated) {
|
||||
return <Login />;
|
||||
}
|
||||
|
||||
const renderVista = () => {
|
||||
switch (store.vistaActual) {
|
||||
case 'dashboard':
|
||||
return (
|
||||
<Dashboard
|
||||
estadisticas={store.getEstadisticas()}
|
||||
internaciones={store.internaciones}
|
||||
cultivos={store.cultivos}
|
||||
onCambiarVista={store.setVista}
|
||||
getPacienteById={store.getPacienteById}
|
||||
/>
|
||||
);
|
||||
case 'camas':
|
||||
return (
|
||||
<MapaCamas
|
||||
camas={store.camas}
|
||||
grupos={store.grupos}
|
||||
pacientes={store.pacientes}
|
||||
internaciones={store.internaciones}
|
||||
onActualizarCama={store.actualizarCama}
|
||||
onAgregarCama={store.agregarCama}
|
||||
onEliminarCama={store.eliminarCama}
|
||||
onIniciarInternacion={store.iniciarInternacion}
|
||||
getPacienteById={store.getPacienteById}
|
||||
getInternacionById={store.getInternacionById}
|
||||
onAgregarGrupo={store.agregarGrupo}
|
||||
onActualizarGrupo={store.actualizarGrupo}
|
||||
onEliminarGrupo={store.eliminarGrupo}
|
||||
/>
|
||||
);
|
||||
case 'pacientes':
|
||||
return (
|
||||
<Pacientes
|
||||
pacientes={store.pacientes}
|
||||
internaciones={store.internaciones}
|
||||
onAgregar={store.agregarPaciente}
|
||||
onActualizar={store.actualizarPaciente}
|
||||
onEliminar={store.eliminarPaciente}
|
||||
/>
|
||||
);
|
||||
case 'internaciones':
|
||||
return (
|
||||
<Internaciones
|
||||
internaciones={store.internaciones}
|
||||
pacientes={store.pacientes}
|
||||
camas={store.camas}
|
||||
grupos={store.grupos}
|
||||
evoluciones={store.evoluciones}
|
||||
laboratorios={store.laboratorios}
|
||||
cultivos={store.cultivos}
|
||||
onIniciarInternacion={store.iniciarInternacion}
|
||||
onFinalizarInternacion={store.finalizarInternacion}
|
||||
onEliminarInternacion={store.eliminarInternacion}
|
||||
getPacienteById={store.getPacienteById}
|
||||
getCamaById={store.getCamaById}
|
||||
onVerHC={(id) => { store.setCurrentInternacion(id); store.setVista('historiaclinica'); }}
|
||||
onNuevoIngreso={() => store.setVista('nuevoingreso')}
|
||||
/>
|
||||
);
|
||||
case 'evoluciones':
|
||||
return (
|
||||
<Evoluciones
|
||||
evoluciones={store.evoluciones}
|
||||
internaciones={store.internaciones}
|
||||
pacientes={store.pacientes}
|
||||
camas={store.camas}
|
||||
getCamaById={store.getCamaById}
|
||||
onAgregarEvolucion={store.agregarEvolucion}
|
||||
onActualizarEvolucion={store.actualizarEvolucion}
|
||||
onEliminarEvolucion={store.eliminarEvolucion}
|
||||
getPacienteById={store.getPacienteById}
|
||||
getInternacionActivaByPaciente={store.getInternacionActivaByPaciente}
|
||||
/>
|
||||
);
|
||||
case 'acidobase':
|
||||
return (
|
||||
<AcidoBaseSection
|
||||
acidosBase={store.acidosBase}
|
||||
pacientes={store.pacientes}
|
||||
onAgregarAcidoBase={store.agregarAcidoBase}
|
||||
onEliminarAcidoBase={store.eliminarAcidoBase}
|
||||
getPacienteById={store.getPacienteById}
|
||||
/>
|
||||
);
|
||||
case 'cultivos':
|
||||
return (
|
||||
<Cultivos
|
||||
cultivos={store.cultivos}
|
||||
pacientes={store.pacientes}
|
||||
internaciones={store.internaciones}
|
||||
camas={store.camas}
|
||||
getPacienteById={store.getPacienteById}
|
||||
getInternacionActivaByPaciente={store.getInternacionActivaByPaciente}
|
||||
canEdit={false}
|
||||
/>
|
||||
);
|
||||
case 'historiaclinica': {
|
||||
const internacionId = store.currentInternacionId || '';
|
||||
const internacion = store.getInternacionById(internacionId);
|
||||
const paciente = internacion ? store.getPacienteById(internacion.pacienteId) : undefined;
|
||||
if (!internacion || !paciente) {
|
||||
return (
|
||||
<div className="p-4 text-center">
|
||||
<p className="text-gray-500 dark:text-gray-400">Internación no encontrada (id: {internacionId})</p>
|
||||
<Button onClick={() => store.setVista('internaciones')}>Volver a Internaciones</Button>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<HistoriaClinica
|
||||
internacion={internacion}
|
||||
paciente={paciente}
|
||||
cama={store.getCamaById(internacion.camaId)}
|
||||
allCamas={store.camas}
|
||||
evoluciones={store.getEvolucionesByInternacion(internacion.id)}
|
||||
laboratorios={store.getLaboratoriosByInternacion(internacion.id)}
|
||||
glucemias={store.getGlucemiasByInternacion(internacion.id)}
|
||||
acidosBase={store.getAcidosBaseByInternacion(internacion.id)}
|
||||
cultivos={store.getCultivosByInternacion(internacion.id)}
|
||||
estudiosComplementarios={store.estudiosComplementarios.filter(e => e.internacionId === internacion.id)}
|
||||
interconsultas={(store.interconsultas || []).filter(ic => ic.internacionId === internacion.id)}
|
||||
atb={(store.atb || []).filter(a => a.internacionId === internacion.id)}
|
||||
onAgregarEvolucion={store.agregarEvolucion}
|
||||
onActualizarEvolucion={store.actualizarEvolucion}
|
||||
onEliminarEvolucion={store.eliminarEvolucion}
|
||||
onAgregarLaboratorio={(l) => store.agregarLaboratorio({ ...l, internacionId: internacion.id })}
|
||||
onActualizarLaboratorio={store.actualizarLaboratorio}
|
||||
onEliminarLaboratorio={store.eliminarLaboratorio}
|
||||
onAgregarGlucemia={(g) => store.agregarGlucemia({ ...g, internacionId: internacion.id })}
|
||||
onActualizarGlucemia={store.actualizarGlucemia}
|
||||
onEliminarGlucemia={store.eliminarGlucemia}
|
||||
onAgregarAcidoBase={(a) => store.agregarAcidoBase({ ...a, internacionId: internacion.id })}
|
||||
onActualizarAcidoBase={store.actualizarAcidoBase}
|
||||
onEliminarAcidoBase={store.eliminarAcidoBase}
|
||||
onAgregarCultivo={(c) => store.agregarCultivo({ ...c, internacionId: internacion.id })}
|
||||
onActualizarCultivo={store.actualizarCultivo}
|
||||
onEliminarCultivo={store.eliminarCultivo}
|
||||
onAgregarEstudioComplementario={(e) => store.agregarEstudioComplementario({ ...e, internacionId: internacion.id })}
|
||||
onActualizarEstudioComplementario={store.actualizarEstudioComplementario}
|
||||
onEliminarEstudioComplementario={store.eliminarEstudioComplementario}
|
||||
onAgregarInterconsulta={(ic) => store.agregarInterconsulta({ ...ic, internacionId: internacion.id })}
|
||||
onActualizarInterconsulta={store.actualizarInterconsulta}
|
||||
onEliminarInterconsulta={store.eliminarInterconsulta}
|
||||
onAgregarATB={(atb) => store.agregarATB({ ...atb, internacionId: internacion.id })}
|
||||
onActualizarATB={store.actualizarATB}
|
||||
onEliminarATB={store.eliminarATB}
|
||||
indicadores={(Array.isArray(store.indicaciones) ? store.indicaciones : []).filter((i: Indicacion) => i.internacionId === internacion.id)}
|
||||
movimientos={store.getMovimientosByInternacion ? store.getMovimientosByInternacion(internacion.id) : []}
|
||||
onAgregarIndicacion={(i) => store.agregarIndicacion({ ...i, internacionId: internacion.id })}
|
||||
onActualizarIndicacion={store.actualizarIndicacion}
|
||||
onEliminarIndicacion={store.eliminarIndicacion}
|
||||
onAgregarMovimiento={(m: MovimientoIndicacion) => store.agregarMovimientoIndicacion ? store.agregarMovimientoIndicacion({ ...m, internacionId: internacion.id }) : null}
|
||||
onActualizarInternacion={store.actualizarInternacion}
|
||||
onActualizarCama={store.actualizarCama}
|
||||
onVolver={() => store.setVista('internaciones')}
|
||||
onEditarIngreso={() => {
|
||||
if (store.canEditIngreso(internacion.id)) {
|
||||
store.setVista('editaringreso');
|
||||
} else {
|
||||
toast.error(`Solo el usuario que creó esta internación (${internacion.medicoIngresante}) puede modificar el ingreso.`);
|
||||
}
|
||||
}}
|
||||
canEdit={store.canEditInternacion(internacion.id)}
|
||||
/>
|
||||
);
|
||||
}
|
||||
case 'nuevoingreso':
|
||||
return (
|
||||
<NuevoIngreso
|
||||
pacientes={store.pacientes}
|
||||
camas={store.camas}
|
||||
grupos={store.grupos}
|
||||
onIniciarInternacion={store.iniciarInternacion}
|
||||
onAgregarCama={store.agregarCama}
|
||||
onVolver={() => store.setVista('internaciones')}
|
||||
getGrupoName={(grupoId) => store.grupos.find(a => a.id === grupoId)?.nombre || ''}
|
||||
internaciones={store.internaciones}
|
||||
/>
|
||||
);
|
||||
|
||||
case 'editaringreso': {
|
||||
const internacionId = store.currentInternacionId || '';
|
||||
const internacion = store.getInternacionById(internacionId);
|
||||
const paciente = internacion ? store.getPacienteById(internacion.pacienteId) : undefined;
|
||||
if (!internacion || !paciente) {
|
||||
return (
|
||||
<div className="p-4 text-center">
|
||||
<p className="text-gray-500 dark:text-gray-400">Internación no encontrada (id: {internacionId})</p>
|
||||
<Button onClick={() => store.setVista('internaciones')}>Volver a Internaciones</Button>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<EditIngreso
|
||||
internacion={internacion}
|
||||
paciente={paciente}
|
||||
cama={store.getCamaById(internacion.camaId)}
|
||||
pacientes={store.pacientes}
|
||||
camas={store.camas}
|
||||
grupos={store.grupos}
|
||||
onActualizarInternacion={store.actualizarInternacion}
|
||||
onAgregarCama={store.agregarCama}
|
||||
onVolver={() => store.setVista('historiaclinica')}
|
||||
getGrupoName={(grupoId) => store.grupos.find(a => a.id === grupoId)?.nombre || ''}
|
||||
/>
|
||||
);
|
||||
}
|
||||
case 'usuarios':
|
||||
if (store.currentUser?.rol !== 'admin') {
|
||||
return (
|
||||
<div className="p-8 text-center text-red-500 font-semibold">
|
||||
<p>No tiene permisos para acceder a esta sección.</p>
|
||||
<Button className="mt-4" onClick={() => store.setVista('dashboard')}>Volver al Dashboard</Button>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<GestionUsuarios />
|
||||
);
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<Layout vistaActual={store.vistaActual} onCambiarVista={store.setVista} currentUser={store.currentUser} onLogout={store.logout}>
|
||||
{renderVista()}
|
||||
</Layout>
|
||||
);
|
||||
}
|
||||
|
||||
function App() {
|
||||
return (
|
||||
<ThemeProvider defaultTheme="dark" storageKey="vite-ui-theme">
|
||||
<AppContent />
|
||||
<Toaster position="top-right" />
|
||||
</ThemeProvider>
|
||||
);
|
||||
}
|
||||
|
||||
export default App;
|
||||
Reference in New Issue
Block a user