Oleada B: fusion Expedientes en Pacientes (+chip sin visita 6m), sidebar colapsable SKEEN, edicion completa de citas, autocompletado de paciente, bloqueos excluidos de slots

This commit is contained in:
2026-09-11 10:38:08 +00:00
parent 0b45abc197
commit 4f49188deb
9 changed files with 295 additions and 65 deletions

View File

@@ -135,6 +135,7 @@ const Pacientes: FC = () => {
const [onlyIncomplete, setOnlyIncomplete] = useState(false);
const [onlyVip, setOnlyVip] = useState(false);
const [onlyRecent, setOnlyRecent] = useState(false);
const [onlyStale, setOnlyStale] = useState(false);
const [doctorFilter, setDoctorFilter] = useState('');
const [doctors, setDoctors] = useState<Doctor[]>([]);
const [modalOpen, setModalOpen] = useState(false);
@@ -198,7 +199,7 @@ const Pacientes: FC = () => {
page_size: pageSize,
incomplete: onlyIncomplete ? 1 : undefined,
vip: onlyVip ? 1 : undefined,
recent: onlyRecent ? 1 : undefined,
recent: onlyRecent ? 1 : (onlyStale ? 0 : undefined),
doctor_id: doctorFilter ? parseInt(doctorFilter, 10) : undefined,
});
if (res.status === 'success') {
@@ -213,11 +214,11 @@ const Pacientes: FC = () => {
} finally {
setLoading(false);
}
}, [search, page, pageSize, onlyIncomplete, onlyVip, onlyRecent, doctorFilter]);
}, [search, page, pageSize, onlyIncomplete, onlyVip, onlyRecent, onlyStale, doctorFilter]);
useEffect(() => {
setPage(1);
}, [search, onlyIncomplete, onlyVip, onlyRecent, doctorFilter]);
}, [search, onlyIncomplete, onlyVip, onlyRecent, onlyStale, doctorFilter]);
useEffect(() => {
odooApi.getDoctors()
@@ -458,7 +459,8 @@ const Pacientes: FC = () => {
<div className="flex flex-wrap items-center gap-2 mb-4 sm:mb-5">
{([
{ key: 'vip', label: 'VIP', active: onlyVip, set: setOnlyVip },
{ key: 'recent', label: 'Visitas últimos 6 meses', active: onlyRecent, set: setOnlyRecent },
{ key: 'recent', label: 'Visitas últimos 6 meses', active: onlyRecent, set: (v: boolean) => { setOnlyRecent(v); if (v) setOnlyStale(false); } },
{ key: 'stale', label: 'Sin visita +6 meses', active: onlyStale, set: (v: boolean) => { setOnlyStale(v); if (v) setOnlyRecent(false); } },
{ key: 'incomplete', label: 'Expediente incompleto', active: onlyIncomplete, set: setOnlyIncomplete },
] as const).map((chip) => (
<button
@@ -474,10 +476,10 @@ const Pacientes: FC = () => {
{chip.label}
</button>
))}
{(onlyVip || onlyRecent || onlyIncomplete || doctorFilter) && (
{(onlyVip || onlyRecent || onlyStale || onlyIncomplete || doctorFilter) && (
<button
type="button"
onClick={() => { setOnlyVip(false); setOnlyRecent(false); setOnlyIncomplete(false); setDoctorFilter(''); }}
onClick={() => { setOnlyVip(false); setOnlyRecent(false); setOnlyStale(false); setOnlyIncomplete(false); setDoctorFilter(''); }}
className="text-xs text-theme-muted underline underline-offset-2 hover:text-theme-heading"
>
Quitar filtros