` com 5 items:
Prontuário / Sessões / WhatsApp / Editar / Arquivar (com divider)
- Bug fix: **`min-height: 0` na `.mp-list`** — sem isso a `mp-list__body`
não scrollava em mobile (`flex: 1; overflow-y: auto` precisa de
parent constrained)
**Toolbar:**
- View toggle list/grade (persistido em `mp.viewMode.v1` localStorage)
- Botão "Novo paciente" usa `PatientCreatePopover` (mesmo do agenda) —
já estava wired, só explicitei `$event` no click handler
**Grid view (NOVO):**
- CSS grid `auto-fill, minmax(240px, 1fr)`
- Cards com avatar+pencil topo, nome+novo, status, email+phone empilhados,
tags, "Última: X" com border-top
- Mantém `selecionarPaciente` (mostra detail panel mesmo no grid)
- `` com handlers de teclado
### 5. Subheader explicativo (padrão novo do blueprint § 9)
Aplicado em 3 páginas, cada uma com texto próprio que diferencia
páginas de layout idêntico:
- **MelissaCadastrosRecebidos**: "Cadastros completos enviados por
pacientes via formulário externo (link público). Revise os dados,
**converta em paciente ativo** com 1 clique ou **rejeite** com motivo
opcional."
- **MelissaAgendamentosRecebidos**: "Solicitações de horário vindas do
agendador online à espera de ação. **Autorize** pra reservar o slot,
**recuse** com motivo, ou **converta direto em sessão** — a gente cria
o paciente automaticamente se ainda não existir."
- **MelissaPacientes**: "Lista completa dos pacientes cadastrados.
Filtre por **status, grupo ou tag** à esquerda, busque por nome ou
contato, e clique numa linha pra abrir o **prontuário** com histórico,
sessões e documentos."
CSS padrão: `bg --m-bg-soft` + ícone `pi pi-info-circle` em primary +
texto muted 0.78rem com `` em `--m-text`. Border-bottom matching
o page__head.
### 6. Arquivamento de pacientes — restore implementado
**Repository** (`patientsRepository.js`):
- Novo `restorePatient(id, { tenantId })` — espelha `softDeletePatient`
mas seta `status = 'Ativo'`
**PatientsCadastroPage** (`statusOpts:749`):
- Adicionado `{ label:'Arquivado', value:'Arquivado' }` à lista de
opções do dropdown — fecha o gap de inconsistência ao editar paciente
arquivado
**MelissaPacientes**:
- Helper `isArquivado(p)` (case-insensitive)
- Função `restaurarPaciente(p)` com confirm dialog → `restorePatient` →
toast "Restaurado" → `refetchTudo`
- **Toggle visual condicional**:
- Paciente **ativo**: 🗑 trash vermelho ("Arquivar")
- Paciente **arquivado**: ↶ undo primary ("Restaurar")
- Aplicado em ambos contextos:
- Desktop (5 botões inline) — `mp-card__action--restore` com hover primary
- Mobile popover menu — `mp-actions-menu__item.is-restore`
---
## 🧪 ROTEIRO DE TESTE (rápido — ~15 min)
### Setup
```powershell
Remove-Item -Recurse -Force node_modules\.vite -ErrorAction SilentlyContinue
npm run dev
```
### Fase 1 — MelissaCadastrosRecebidos (5 min)
- `/melissa/cadastros-recebidos` → DataTable com header transparent +
bold, paginator centralizado, coluna Ação frozen direita com bg
branco no light
- Toolbar: search + view toggle (lista/grade)
- Sidebar: stats com Novos azul, Convertidos verde, Rejeitados vermelho
(quando >0); Status filter com 3 cores + Limpar filtro fade
- Subheader azul info-circle explicativo
- Mobile: drawer abre, scroll horizontal funciona, pencil único na
Ação frozen, todas colunas visíveis (não escondem)
### Fase 2 — MelissaAgendamentosRecebidos (5 min)
- `/melissa/agendamentos-recebidos` → mesma estrutura, 4 status com cor
(Pendente azul / Autorizado verde / Convertido teal / Recusado vermelho)
- Click numa pendente → dialog mostra 3 ações (Recusar / Autorizar /
Converter em sessão); converter cria paciente automático + abre
AgendaEventDialog
- Subheader próprio diferenciando da Cadastros Recebidos
### Fase 3 — MelissaPacientes (5 min)
- `/melissa/pacientes`:
- Sidebar com sombras nos cards (Estatísticas, Status, Grupos, Tags)
- Cards Grupos/Tags: cog `⚙` no header (sem borda, navega pra
`/melissa/grupos` e `/melissa/tags`); botão tracejado "+ Grupo" /
"+ Tag" abaixo da lista; X de limpar filtro vermelho
- Status pills coloridas (Ativos verde / Inativos amber / Arquivados
vermelho)
- Card de paciente: email coluna própria, phone coluna própria
- Toolbar: view toggle lista/grade (persiste); "Novo paciente" abre
PatientCreatePopover com 3 opções (rápido / completo / link)
- **Mobile (<1024px)**: scroll vertical funciona (era bug, corrigido com
`min-height: 0` na `.mp-list`); ações reduzem a 1 pencil sticky-right
com Popover de 5 items
- **Restore de arquivado**:
- Filtra por "Arquivados" (cor vermelha)
- Hover num card → desktop mostra ↶ "Restaurar" (primary) no lugar
do 🗑 trash
- Mobile: pencil → popover mostra "Restaurar" primary
- Click → confirm "Restaurar X?" → status volta a Ativo → some do
filtro Arquivados, aparece em Ativos
---
## ⏭️ PRÓXIMOS PASSOS (sugestão)
### 1. Decidir A66 V2 — design
User testou o esqueleto V2 em `/preview/agenda-dialog-v2` (rota em
`routes.misc.js`) e **não gostou do design**. Aguarda feedback
específico antes de iterar:
- Estrutura: 3 zonas (PACIENTE/QUANDO/O QUÊ) tá errado? Prefere 2 zonas?
1 coluna scroll? Tabs?
- Hierarquia: hero PACIENTE muito grande/pequeno?
- Densidade: airy demais ou apertado demais?
- Chips de duração/scope/status: muito visuais?
- Mobile: já testou viewport pequeno?
- Referência visual: Win11? Cleaner? Mais como V1? Algum app?
Quando tiver feedback, iterar em `AgendaEventDialogV2.vue`. Sub-sessão
3 (migração nos 9 consumers) só depois do V2 estabilizar.
### 2. Aplicar blueprint nas demais páginas tabulares Melissa
Ainda faltam (todas seguem `melissa-table-page-blueprint.md`):
- `MelissaCompromissos.vue`
- `MelissaMedicos.vue`
- `MelissaConversas.vue`
- `MelissaRecorrencias.vue`
- `MelissaTags.vue`
- `MelissaGrupos.vue`
Padrão: prefixo próprio (`mco`, `mmd`, etc.), sidebar com filtros
coloridos, DataTable com frozen action column, view toggle, subheader,
mobile pencil+popover.
### 3. Decidir commits
Acumulado de 4 sprints sem commitar (28 mod + 22 novos). Sugestão de
chunks lógicos (em ordem temporal):
1. **Sprint A** — Sprint 04-29/30 (hub Configurações + 7 Melissa Pages
+ dialog blueprint dark)
2. **Sprint B** — Sprint 05-03 (timeline FullCalendar parity, cards
resumo, dock pins, topbar, NotificationDrawer redesign,
melissaCacheStore, useMelissaDockPins)
3. **Sprint C** — Sprint 05-04 (MelissaAgendaHistoricoCard, useFeriados
cache opt-in, PatientProntuario aba Visão Geral, migration
`20260504000001_fix_cancel_notifications_excluido.sql`)
4. **Sprint D** — A66 sub-sessão 1 (5 composables + 5 specs + 265
testes) + sub-sessão 2 esqueleto (V2 + preview) — **MARCAR como WIP**
5. **Sprint E HOJE** — Blueprint tabular Melissa + MelissaCadastrosRecebidos
+ MelissaAgendamentosRecebidos + MelissaPacientes refator + restore
de pacientes arquivados
### 4. Restore em outros layouts
A `PatientsListPage.vue` (layout Rail) também tem KPI "Arquivados"
mas SEM botão Restaurar. Quando tocar nela, replicar o pattern:
botão condicional ↶ "Restaurar" baseado em `p.status === 'Arquivado'`,
chama `restorePatient` do mesmo repository.
---
## 🛠️ Sessões dedicadas pendentes
### A66 — Refactor `AgendaEventDialog` V2 (3 sub-sessões)
**Estado**:
- ✅ Sub-sessão 1 (composables) — 5 composables + 265 testes, 495/495
suite passando, AgendaEventDialog 3522→2632 linhas (-25%)
- 🟡 Sub-sessão 2 (template V2) — esqueleto entregue 2026-05-05,
**user não gostou do design**, aguarda feedback específico
- ⏳ Sub-sessão 3 (migração nos 9 consumers) — depende do V2 estabilizar
**Por que sessão dedicada**: arquivo tinha 3522 linhas, é consumido em
9 páginas críticas (AgendaTerapeutaPage, AgendaClinicaPage,
MelissaLayout, MelissaEventoPanel, useMelissaAgenda,
AgendamentosRecebidosPage, TherapistDashboard, AgendaDevDocs).
Refatoração inteira não cabe em uma única conversa sem alto risco
de regressão.
**Estado dos arquivos**:
- Backup: `src/features/agenda/components/AgendaEventDialog.vue.bak`
(155KB, byte-idêntico ao original)
- 5 composables novos em `src/features/agenda/composables/`:
`agendaEventHelpers.js` (262L) +
`useAgendaEventComposer.js` (485L) +
`useAgendaEventActions.js` (387L) +
`useAgendaEventPickerBilling.js` (378L) +
`useAgendaEventLifecycle.js` (474L)
- 5 specs em `__tests__/` (75+76+28+43+43 = 265 testes)
- `AgendaEventDialogV2.vue` (~1100L, 3 zonas) — não testado visualmente
- Preview em `/preview/agenda-dialog-v2` com 5 cenários
**Próxima ação**: user dá feedback design → eu itero V2.
---
## 📚 Tracking persistente
- **A66** — sub-sessão 2 (V2 design) aguardando feedback do user
- **Blueprint tabular Melissa** — referência canônica:
`MelissaCadastrosRecebidos.vue`. Próximas adoções planejadas:
Compromissos, Médicos, Conversas, Recorrências, Tags, Grupos
- **Restore pacientes** — implementado no Melissa; replicar no Rail
(`PatientsListPage.vue`) quando tocar
- **Migration aplicada local**: `20260504000001_fix_cancel_notifications_excluido.sql`
(cancela 'excluido' do enum trigger). Já aplicada no DB local.
---
## 📦 Setup pra retomar
```powershell
# Limpa cache do Vite (recomendado depois de muita mudança em styles)
Remove-Item -Recurse -Force node_modules\.vite -ErrorAction SilentlyContinue
# Sobe dev
npm run dev
# Build sanity check (opcional, mas roda em ~25s)
npm run build
```
**Suite de testes** (495 testes do A66 incluídos):
```powershell
npm run test
```
**Login**: user com `layout_variant=melissa` no profile pra testar
direto em `/melissa/...`. Pra testar Rail (regressão), troca em
`/account/profile` → terceiro card "Layout".
---
**Boa noite. Amanhã começa pelo feedback do A66 V2 ou aplicação do
blueprint nas demais Melissa Pages tabulares — o que você preferir.**