patient cadastro: fix nav pra view individual + rename pra singular

Bug: no melissa, salvar paciente -> "Salvar e ver pacientes" caia
em /pages/access. Causa: patientsListRoute() so tinha branches
/therapist e /admin, jogava na rota errada que o guard rejeita
no contexto melissa.

Fix:
1. PatientCadastroDialog + ComponentCadastroRapido — funcao
   renomeada pra patientViewRoute(patientId). Branch /melissa
   redireciona pra /melissa/paciente?id=<id> (prontuario individual)
   quando ha id, ou /melissa/pacientes (lista) sem id.
2. Botao "Salvar e ver pacientes" -> "Salvar e ver paciente"
   (singular). Reflete a navegacao real: vai pro proprio paciente
   que acabou de salvar, nao pra lista.
3. onCreated pega data?.id || props.patientId pra montar a rota.

Comportamento melissa: salvar paciente -> abre /melissa/paciente
?id=<id> (prontuario). Therapist/admin segue indo pra lista
(comportamento pre-existente).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Leonardo
2026-05-21 21:29:46 -03:00
parent c6105df98a
commit 682840f355
2 changed files with 34 additions and 9 deletions
+16 -4
View File
@@ -197,8 +197,17 @@ function generateUser() {
}); });
} }
function patientsListRoute() { // Rota de destino do "Salvar e ver paciente". Em melissa, prefere a
// view individual do paciente recém-criado (id vem de data.id no
// emit('created')); fallback pra lista.
function patientViewRoute(patientId) {
const p = String(route.path || ''); const p = String(route.path || '');
if (p.startsWith('/melissa') && patientId) {
return { path: '/melissa/paciente', query: { id: String(patientId) } };
}
if (p.startsWith('/melissa')) {
return '/melissa/pacientes';
}
return p.startsWith('/therapist') ? '/therapist/patients' : '/admin/pacientes'; return p.startsWith('/therapist') ? '/therapist/patients' : '/admin/pacientes';
} }
@@ -252,7 +261,10 @@ async function submit(mode = 'only') {
emit('created', data); emit('created', data);
if (props.closeOnCreated) close(); if (props.closeOnCreated) close();
if (mode === 'view') await router.push(patientsListRoute()); if (mode === 'view') {
const pid = data?.id || null;
await router.push(patientViewRoute(pid));
}
} catch (err) { } catch (err) {
const msg = err?.message || err?.details || 'Não foi possível criar o paciente.'; const msg = err?.message || err?.details || 'Não foi possível criar o paciente.';
errorMsg.value = msg; errorMsg.value = msg;
@@ -334,10 +346,10 @@ async function submit(mode = 'only') {
<!-- Na rota de pacientes OU em fluxo (hideViewListButton): "Salvar" / "Salvar e fechar" --> <!-- Na rota de pacientes OU em fluxo (hideViewListButton): "Salvar" / "Salvar e fechar" -->
<Button v-if="isOnPatientsPage" label="Salvar" :loading="saving" :disabled="saving" @click="submit('only')" /> <Button v-if="isOnPatientsPage" label="Salvar" :loading="saving" :disabled="saving" @click="submit('only')" />
<Button v-else-if="hideViewListButton" label="Salvar e fechar" :loading="saving" :disabled="saving" @click="submit('only')" /> <Button v-else-if="hideViewListButton" label="Salvar e fechar" :loading="saving" :disabled="saving" @click="submit('only')" />
<!-- Standalone fora da lista: "Salvar e fechar" + "Salvar e ver pacientes" --> <!-- Standalone fora da lista: "Salvar e fechar" + "Salvar e ver paciente" -->
<template v-else> <template v-else>
<Button label="Salvar e fechar" severity="secondary" outlined :loading="saving" :disabled="saving" @click="submit('only')" /> <Button label="Salvar e fechar" severity="secondary" outlined :loading="saving" :disabled="saving" @click="submit('only')" />
<Button label="Salvar e ver pacientes" :loading="saving" :disabled="saving" @click="submit('view')" /> <Button label="Salvar e ver paciente" :loading="saving" :disabled="saving" @click="submit('view')" />
</template> </template>
</div> </div>
</template> </template>
+18 -5
View File
@@ -65,11 +65,22 @@ const router = useRouter();
const isOnPatientsPage = computed(() => { const isOnPatientsPage = computed(() => {
const p = String(route.path || ''); const p = String(route.path || '');
return p.includes('/patients') || p.includes('/pacientes'); // /melissa/paciente (singular — prontuário) é página de paciente.
// /melissa/pacientes (plural — lista) também.
return p.includes('/patients') || p.includes('/pacientes') || p.startsWith('/melissa/paciente');
}); });
function patientsListRoute() { // Rota de destino quando o usuário pede "Salvar e ver paciente":
// — no Melissa, abre o prontuário do paciente (singular, via query id)
// — no Therapist/Admin, volta pra lista (não há rota dedicada de view).
function patientViewRoute(patientId) {
const p = String(route.path || ''); const p = String(route.path || '');
if (p.startsWith('/melissa') && patientId) {
return { path: '/melissa/paciente', query: { id: String(patientId) } };
}
if (p.startsWith('/melissa')) {
return '/melissa/pacientes';
}
return p.startsWith('/therapist') ? '/therapist/patients' : '/admin/pacientes'; return p.startsWith('/therapist') ? '/therapist/patients' : '/admin/pacientes';
} }
@@ -82,7 +93,9 @@ async function onCreated(data) {
isOpen.value = false; isOpen.value = false;
emit('created', data); emit('created', data);
if (pendingMode.value === 'view') { if (pendingMode.value === 'view') {
await router.push(patientsListRoute()); // data.id vem do PatientsCadastroPage (criação ou edição)
const pid = data?.id || props.patientId || null;
await router.push(patientViewRoute(pid));
} }
} }
</script> </script>
@@ -197,10 +210,10 @@ async function onCreated(data) {
<!-- Na rota de pacientes OU em fluxo (hideViewListButton): um botao --> <!-- Na rota de pacientes OU em fluxo (hideViewListButton): um botao -->
<Button v-if="isOnPatientsPage" label="Salvar" :loading="!!pageRef?.saving?.value" :disabled="!!pageRef?.saving?.value || !!pageRef?.deleting?.value" @click="submitWith('only')" /> <Button v-if="isOnPatientsPage" label="Salvar" :loading="!!pageRef?.saving?.value" :disabled="!!pageRef?.saving?.value || !!pageRef?.deleting?.value" @click="submitWith('only')" />
<Button v-else-if="hideViewListButton" label="Salvar e fechar" :loading="!!pageRef?.saving?.value" :disabled="!!pageRef?.saving?.value || !!pageRef?.deleting?.value" @click="submitWith('only')" /> <Button v-else-if="hideViewListButton" label="Salvar e fechar" :loading="!!pageRef?.saving?.value" :disabled="!!pageRef?.saving?.value || !!pageRef?.deleting?.value" @click="submitWith('only')" />
<!-- Standalone fora da lista: "Salvar e fechar" + "Salvar e ver pacientes" --> <!-- Standalone fora da lista: "Salvar e fechar" + "Salvar e ver paciente" -->
<template v-else> <template v-else>
<Button label="Salvar e fechar" severity="secondary" outlined :loading="pendingMode === 'only' && !!pageRef?.saving?.value" :disabled="!!pageRef?.saving?.value || !!pageRef?.deleting?.value" @click="submitWith('only')" /> <Button label="Salvar e fechar" severity="secondary" outlined :loading="pendingMode === 'only' && !!pageRef?.saving?.value" :disabled="!!pageRef?.saving?.value || !!pageRef?.deleting?.value" @click="submitWith('only')" />
<Button label="Salvar e ver pacientes" :loading="pendingMode === 'view' && !!pageRef?.saving?.value" :disabled="!!pageRef?.saving?.value || !!pageRef?.deleting?.value" @click="submitWith('view')" /> <Button label="Salvar e ver paciente" :loading="pendingMode === 'view' && !!pageRef?.saving?.value" :disabled="!!pageRef?.saving?.value || !!pageRef?.deleting?.value" @click="submitWith('view')" />
</template> </template>
</div> </div>
</template> </template>