Melissa polish + Prontuario Visao Geral + agenda historico

Sprints B (05-03) e C (05-04) acumulados:

- NotificationDrawer/Item redesign (visual mais limpo, ações inline)
- Dock pins compose (useMelissaDockPins) + cache store global (melissaCacheStore)
- MelissaAgenda: timeline FullCalendar parity + cards resumo, histórico
  card com useMelissaAgendaHistorico, MelissaEventoPanel ajustado
- useFeriados: cache opt-in pra evitar fetch redundante de feriados
- PatientProntuario: aba Visão Geral nova; PatientConversationsTab polish
- AgendaClinicMosaic / AgendaTerapeutaPage / useAgendaSettings: ajustes
  de paridade com Melissa
- DocumentsListPage: pequenos ajustes
- DB migration 20260504000001: fix do trigger pra status 'excluido' nas
  cancel_notifications

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Leonardo
2026-05-06 09:11:55 -03:00
parent 86311ef305
commit 957e912a7f
19 changed files with 5203 additions and 285 deletions
@@ -156,10 +156,10 @@ watch(() => props.patientId, () => { load(); });
</div>
<!-- Empty -->
<div v-else-if="!messages.length" class="flex flex-col items-center justify-center gap-2 py-12 text-center text-[var(--text-color-secondary)]">
<i class="pi pi-comments text-4xl opacity-30" />
<div class="text-sm">Nenhuma conversa registrada com este paciente ainda.</div>
<div class="text-xs opacity-70">
<div v-else-if="!messages.length" class="empty-rich">
<div class="empty-rich__icon"><i class="pi pi-comments" /></div>
<div class="empty-rich__title">Nenhuma conversa registrada</div>
<div class="empty-rich__sub">
Quando {{ props.patientName || 'o paciente' }} enviar uma mensagem pelo WhatsApp (ou você enviar uma), vai aparecer aqui.
</div>
</div>
@@ -219,3 +219,48 @@ watch(() => props.patientId, () => { load(); });
</div>
</div>
</template>
<style scoped>
/* Empty state rico — espelha .pp-empty--rich do PatientProntuario.vue.
Replicado aqui pra que a aparência seja idêntica em qualquer contexto
(ficha embedded ou página standalone). */
.empty-rich {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: 14px;
padding: 48px 24px;
border: 2px dashed color-mix(in srgb, var(--primary-color) 35%, var(--surface-border));
border-radius: 16px;
background:
radial-gradient(ellipse at top, color-mix(in srgb, var(--primary-color) 5%, transparent), transparent 70%),
var(--surface-card);
color: var(--text-color-secondary);
text-align: center;
}
.empty-rich__icon {
width: 72px;
height: 72px;
display: grid;
place-items: center;
border-radius: 50%;
background: color-mix(in srgb, var(--primary-color) 10%, transparent);
border: 1px solid color-mix(in srgb, var(--primary-color) 25%, transparent);
color: var(--primary-color);
margin-bottom: 4px;
}
.empty-rich__icon .pi { font-size: 2rem; }
.empty-rich__title {
font-size: 1rem;
font-weight: 700;
color: var(--text-color);
letter-spacing: -0.02em;
}
.empty-rich__sub {
font-size: 0.82rem;
color: var(--text-color-secondary);
max-width: 340px;
line-height: 1.5;
}
</style>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff