HANDOFF + log atualizados pra sessao 2026-05-06

- HANDOFF.md reescrito refletindo estado atual: working tree limpa,
  5 commits criados na sessao, resumo do que foi feito (6 Melissa Pages
  blueprint + dialogs harmonizados + ConversationDrawer WhatsApp +
  bug fix de cores no MelissaPacientes), e o que continua pendente
  (A66 V2 design aguardando feedback + restore na PatientsListPage)
- Obsidian/Brain/log.md: entrada da sessao 05-06 anexada com detalhes
  e referencias dos 5 commits

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Leonardo
2026-05-06 09:18:57 -03:00
parent 15103eded5
commit 97b0ec1ec5
2 changed files with 164 additions and 356 deletions
+149 -356
View File
@@ -1,362 +1,147 @@
# HANDOFF — 2026-05-05 (sprint blueprint tabular Melissa + arquivamento de pacientes)
# HANDOFF — 2026-05-06 (Melissa Pages aplicando blueprint + ConversationDrawer WhatsApp redesign + commits)
Documento de continuidade. **Quando voltar, comece lendo esta página.**
> **🟡 PENDENTE — Sub-sessão 2 do A66 (V2 dialog)**: skeleton entregue
> em 2026-05-05 mas user **não gostou do design** ao olhar o preview.
> Aguarda feedback específico (3 zonas tá errado? hierarquia? hero
> grande demais? mobile? referência visual?). Iteração só depois disso.
> Detalhes na seção "Sessões dedicadas pendentes" no fim deste doc.
> **🟢 ENTREGUE HOJE** — Blueprint tabular aplicado nas **6 Melissa Pages restantes**
> (Compromissos, Grupos, Tags, Médicos, Conversas, Recorrências) + dialogs
> harmonizados com `FloatLabel + IconField + section dividers` + dialogs
> "Pacientes do grupo/tag/médico" com cor primary nos avatares + redesign
> completo do `ConversationDrawer` pra estilo WhatsApp (avatar circular, bg
> "papel de parede", bolhas com tail simulada, time/status overlay no canto,
> compose pill + send circular verde) + fix de cor de tags/grupos no
> MelissaPacientes (`g.cor → g.color` em 20 lugares).
> **🟢 ENTREGUE HOJE — Blueprint de página tabular Melissa**: documentado
> em `blueprints/melissa-table-page-blueprint.md` (~530 linhas, 18 seções)
> e aplicado em **MelissaCadastrosRecebidos** (refator) +
> **MelissaAgendamentosRecebidos** (NOVO, native page) +
> **MelissaPacientes** (refator parcial). Inclui DataTable com `:loading`
> + `paginator` + frozen action column, view toggle list/grade,
> sidebar com filtros coloridos por status, subheader explicativo,
> Tailwind 600 status colors, e mobile pencil + popover menu.
> **🟢 COMMITADO** — Working tree estava com 4 sprints acumulados (~50 arquivos).
> Foram criados **5 commits** lógicos antes do push, do mais antigo pro mais
> recente. Ver seção "Histórico de commits" abaixo.
Sessão de polimento e estruturação — não houve commit. Working tree
acumulada de 4 sprints (28 modificados + 22 novos).
> **🟡 AINDA PENDENTE** — Sub-sessão 2 do A66 (V2 dialog): user não gostou
> do design do esqueleto entregue em 2026-05-05. Aguarda feedback específico
> antes de iterar. Detalhes na seção "Sessões dedicadas pendentes".
---
## 🚦 STATUS — Working tree
## 🚦 STATUS — Working tree LIMPA
**Modificados:**
```
M HANDOFF.md
M database-novo/agenciapsi-db-dashboard.html
M database-novo/db.config.json
M database-novo/generate-dashboard.cjs
M src/components/notifications/NotificationDrawer.vue
M src/components/notifications/NotificationItem.vue
M src/composables/useFeriados.js
M src/features/agenda/components/AgendaClinicMosaic.vue
M src/features/agenda/components/AgendaEventDialog.vue ← A66 sub-sessão 1 done
M src/features/agenda/composables/useAgendaSettings.js
M src/features/agenda/pages/AgendaTerapeutaPage.vue
M src/features/documents/DocumentsListPage.vue
M src/features/patients/cadastro/PatientsCadastroPage.vue ← statusOpts +Arquivado HOJE
M src/features/patients/prontuario/PatientConversationsTab.vue
M src/features/patients/prontuario/PatientProntuario.vue
M src/features/patients/services/patientsRepository.js ← +restorePatient HOJE
M src/layout/melissa/MelissaAgenda.vue
M src/layout/melissa/MelissaCadastrosRecebidos.vue ← refator blueprint HOJE
M src/layout/melissa/MelissaEmbed.vue ← agendamentos-recebidos removido HOJE
M src/layout/melissa/MelissaEventoPanel.vue
M src/layout/melissa/MelissaLayout.vue ← MAR wire-up HOJE
M src/layout/melissa/MelissaPacientes.vue ← refator grande HOJE
M src/layout/melissa/composables/useMelissaAgenda.js
M src/layout/melissa/composables/useMelissaEventos.js
M src/layout/melissa/composables/useMelissaPacientes.js
M src/layout/melissa/composables/useMelissaPacientesAside.js
M src/router/routes.misc.js
D database-novo/backups/2026-03-27/ (3 arquivos antigos)
D database-novo/backups/2026-03-29/ (3 arquivos antigos)
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
```
**Novos:**
```
?? blueprints/melissa-table-page-blueprint.md ← NOVO HOJE
?? database-novo/migrations/20260504000001_fix_cancel_notifications_excluido.sql
?? src/features/agenda/components/AgendaEventDialog.vue.bak ← rollback A66
?? src/features/agenda/components/AgendaEventDialogV2.vue ← A66 sub-sessão 2 (NÃO TESTADO)
?? src/features/agenda/components/InsurancePlanQuickCreateDialog.vue
?? src/features/agenda/components/ServiceQuickCreateDialog.vue
?? src/features/agenda/composables/agendaEventHelpers.js ← A66 1A
?? src/features/agenda/composables/useAgendaEventActions.js ← A66 1C-i
?? src/features/agenda/composables/useAgendaEventComposer.js ← A66 1B
?? src/features/agenda/composables/useAgendaEventLifecycle.js ← A66 1C-ii-b
?? src/features/agenda/composables/useAgendaEventPickerBilling.js ← A66 1C-ii-a
?? src/features/agenda/composables/__tests__/ (5 specs)
?? src/features/patients/prontuario/PatientProntuario.vue.bak
?? src/layout/melissa/MelissaAgendaHistoricoCard.vue
?? src/layout/melissa/MelissaAgendamentosRecebidos.vue ← NOVO HOJE
?? src/layout/melissa/composables/useMelissaAgendaHistorico.js
?? src/layout/melissa/composables/useMelissaDockPins.js
?? src/stores/melissaCacheStore.js
?? src/views/pages/preview/ (V2 preview)
```
(após `git push`. Antes do push: 5 commits ahead.)
---
## ✅ FEITO HOJE (2026-05-05)
## 📦 Histórico de commits criados hoje
### 1. Blueprint de página tabular — `melissa-table-page-blueprint.md`
Em ordem cronológica de criação (mais antigo → mais novo):
Novo arquivo em `blueprints/`. ~530 linhas, **18 seções**:
1. **`957e912`** — `Melissa polish + Prontuario Visao Geral + agenda historico`
- Sprints B (05-03) + C (05-04) acumulados:
- NotificationDrawer/Item redesign
- Dock pins compose (`useMelissaDockPins`) + cache store global (`melissaCacheStore`)
- MelissaAgenda timeline FullCalendar parity + cards resumo + histórico card
- `useFeriados` cache opt-in
- PatientProntuario aba Visão Geral nova
- DB migration `20260504000001_fix_cancel_notifications_excluido.sql`
- 19 files, +5203 285
1. Princípio (sidebar de filtros + main com toolbar + tabela)
2. Estrutura do template (com **subheader explicativo**)
3. Estado JS (script setup) — busca, statusFilter, paginação, viewMode
4. DataTable view Lista — props canônicas explicadas
5. View Grade — cards em CSS grid, `<div role="button">`
6. Tokens de surface (light/dark) — `--p-content-background` canônico
7. Cores de status — Tailwind 600 (azul/verde/vermelho), aplicadas em 4 lugares
8. Filtro de status + Limpar filtro com Transition fade
9. **Subheader explicativo** — diferencia páginas de layout idêntico
10. Toolbar — busca + view toggle
11. DataTable estilos completos (header transparent, frozen column, paginator)
12. Botão pencil — coluna fixa
13. Empty / loading
14. Mobile (<1024px) — scroll horizontal, NÃO esconde colunas
15. Acessibilidade
16. Checklist de adoção (16 itens)
17. Anti-patterns (11 erros documentados)
18. Referência canônica → `MelissaCadastrosRecebidos.vue`
2. **`6d9b36d`** — `A66 WIP: AgendaEventDialog quebrado em 5 composables + 265 specs + V2 esqueleto`
- 5 composables (1986L total): `agendaEventHelpers`, `useAgendaEventComposer`, `useAgendaEventActions`, `useAgendaEventPickerBilling`, `useAgendaEventLifecycle`
- 5 specs em `__tests__/` (75+76+28+43+43 = **265 testes**, 495/495 passando)
- AgendaEventDialog 3522 → 2632 linhas (-25%)
- `AgendaEventDialogV2.vue` esqueleto (~1100L, 3 zonas) + preview em `/preview/agenda-dialog-v2`
- Backup byte-idêntico em `AgendaEventDialog.vue.bak`
- Dialogs auxiliares: `InsurancePlanQuickCreateDialog`, `ServiceQuickCreateDialog`
- 17 files, +10966 1298
### 2. MelissaCadastrosRecebidos — refator pra blueprint
3. **`269b531`** — `Melissa: blueprint tabular + Cadastros/Agendamentos/Pacientes + restore`
- Sprint E (05-05): Blueprint canônico em `blueprints/melissa-table-page-blueprint.md` (~530L, 18 seções)
- MelissaCadastrosRecebidos refator pro blueprint
- **MelissaAgendamentosRecebidos** novo (substitui o embed)
- MelissaPacientes refator parcial (subheader, sombras, status pills coloridas, email/phone colunas próprias, mobile pencil+popover, fix scroll com `min-height: 0`, restore de arquivados)
- `restorePatient` no `patientsRepository`
- 10 files, +4824 301
Antes era lista de cards verticais; agora é DataTable PrimeVue com:
- **Sidebar** `--m-bg-soft` + border-right + sombra `0 2px 8px` nos cards
- **Stats card** (Total / Novos / Convertidos / Rejeitados) — Novos azul / Conv verde / Rej vermelho
- **Status filter card** com 3 níveis de cor (default 5%, hover 10%, active 16% + ring) + botão
"Limpar filtro" com Transition fade quando ativo
- **Toolbar main** com search + view toggle (lista/grade)
- **DataTable** `:loading + paginator + scrollable scrollHeight="flex"
+ tableStyle="min-width:640px"` — colunas: Paciente / Contato / Recebido / Ação (frozen 60px right)
- **Coluna frozen** com bg `--p-content-background` (canônico, opaco em ambos modos),
sombra à esquerda, hover/selected herdam da row
- **Botão pencil** (`mcr-row__action`) primary tinted
- **View Grade** alternativa — cards em CSS grid `auto-fill, minmax(220px, 1fr)`
com Paginator standalone abaixo
- **Subheader explicativo** com `pi pi-info-circle` em primary
4. **`98f7252`** — `Melissa: 6 Pages aplicando blueprint + dialogs unificados + Conversa estilo WhatsApp`
- Sprint F (05-06, esta sessão):
- **MelissaCompromissos**: blueprint mantendo row design original (color stripe + name + badges + descrição + meta inline)
- **MelissaGrupos** + **MelissaTags**: blueprint completo + dialog "Pacientes do grupo/tag" com lista vinculada via `patient_group_patient` / `patient_patient_tag`
- **MelissaMedicos**: blueprint + dialog "Pacientes encaminhados" usando cor primary; dialog editar com 4 seções (Identificação/Contato/Localização/Obs) espelhando PatientsCadastroPage
- **MelissaConversas**: subheader, sidebar reestruturada, alerta unlinked no topo, kanban mobile com `min-height` nas colunas, fix bug `filters` é `ref({})` então no script precisa `.value`
- **MelissaRecorrencias**: button list de status, busca por nome do paciente, footer Limpar filtros
- **ConversationDrawer**: redesign WhatsApp (avatar primary, bg "papel de parede", bolhas com tail, time/status overlay, compose pill + send circular #00a884)
- 7 files, +7879 1467
### 3. MelissaAgendamentosRecebidos — NOVO native page
Substitui o embed via `MelissaEmbed`. Espelha 1:1 o blueprint, prefixo `mar`.
- Tabela DB: `agendador_solicitacoes` (não `patient_intake_requests`)
- **4 status com cores próprias**:
- 🔵 Pendente (`rgb(37, 99, 235)`)
- 🟢 Autorizado (`rgb(22, 163, 74)`)
- 🟦 Convertido (`rgb(13, 148, 136)` — teal, distinto)
- 🔴 Recusado (`rgb(220, 38, 38)`)
- **DataTable**: 6 colunas (Paciente / Solicitado / Tipo / Contato / Recebido / Ação frozen)
- **3 ações condicionais** no dialog de detalhes:
- **Pendente** → Recusar (com motivo) | Autorizar | Converter em sessão
- **Autorizado** → Converter em sessão (cria paciente se necessário + abre `AgendaEventDialog`)
- **Convertido/Recusado** → só fechar
- **AgendaEventDialog wired** com props canônicas (event-row, owner-id, tenant-id,
agenda-settings, commitment-options, preset-commitment-id,
restrict-patients-to-owner)
- Subheader explicativo próprio
**Wire-up no `MelissaLayout.vue`:**
- Import de MelissaAgendamentosRecebidos
- `MELISSA_EMBED_KEYS` perdeu `agendamentos-recebidos`
- `MELISSA_NON_CONFIG_SLUGS` ganhou direto
- Render block conditional entre Cadastros e Médicos
- `MelissaEmbed.EMBED_MAP` perdeu a entry agendamentos-recebidos (com comentário)
**Importante**: o `MelissaEmbed.vue` foi modificado pra fazer `hideChrome` flag
+ close flutuante numa tentativa anterior — **revertido** ao original
porque ficou ruim. Layout Rail (`/therapist/agendamentos-recebidos`,
`/admin/agendamentos-recebidos`) continua usando `AgendamentosRecebidosPage.vue`
inalterada.
### 4. MelissaPacientes — refator parcial pra blueprint
A página é 3-pane (filters / list / detail) — não converti pra
DataTable (perderia o detail panel). Aplicado o que faz sentido:
**Sidebar:**
- Sombra `0 2px 8px` nos cards `.mp-w` (sidebar + quick view direita)
- Status pills com cores próprias por status:
- Todos = neutral (sem cor)
- 🟢 Ativos verde
- 🟡 Inativos amber `rgb(217, 119, 6)` (warn, pausa temporária)
- 🔴 Arquivados vermelho
- Botão "+" do header de Grupos/Tags **substituído** por:
- Botão `pi pi-cog` no header (sem borda, hover primary) — emite
`goto-grupos`/`goto-tags` que navegam pras Melissa Pages nativas
- Botão tracejado "+ Grupo / + Tag" (texto sem "+", só com ícone
`pi pi-plus`) abaixo de cada lista — abre popover de criação
- Botão `[×]` (clear filter) agora vermelho `rgb(220, 38, 38)`
**Card de paciente (list view):**
- **Email em coluna própria** (220px, truncate) — separada do main
- **Telefone em coluna própria** (140px) — paralela ao email
- Em mobile (<768px) email/phone escondem (info no detail panel)
- Subheader explicativo
**Mobile:**
- Coluna ação fixa (`position: sticky; right: 0; bg --m-bg-medium`)
- 5 botões inline → 1 botão `pi pi-pencil` único que abre `<Popover>`
- **Popover de ações** global no fim da `<section>` 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)
- `<div role="button" tabindex="0">` 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 `<strong>` 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`
5. **`15103ed`** — `Cleanup: backups antigos removidos + dashboard config + HANDOFF/log`
- Backups `database-novo/backups/2026-03-27` e `2026-03-29` removidos
- `db.config.json` + `generate-dashboard.cjs` + `dashboard.html` atualizados
- HANDOFF.md (estado 05-05) + log.md
- 11 files, +435 87172
---
## 🧪 ROTEIRO DE TESTE (rápido — ~15 min)
## 📋 RESUMO da sessão 2026-05-06
### Setup
```powershell
Remove-Item -Recurse -Force node_modules\.vite -ErrorAction SilentlyContinue
npm run dev
```
### Padrões consolidados nas 6 páginas Melissa restantes
### 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)
Cada página agora segue o blueprint:
### 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
- **Subheader explicativo** logo abaixo do header (1-2 frases descrevendo a página + ações principais com `<strong>`)
- **Sidebar reestruturada** em 2 zonas:
- `.xx-side` com `bg: var(--m-bg-soft)` + `border-right` (visual de coluna lateral)
- `.xx-side__scroll` (flex 1, overflow auto) com cards `xx-w--side` (margin lateral 12px + sombra)
- `.xx-side__footer` (flex-shrink 0, padding 12px, bg-soft, border-top) com botão **"Limpar filtros"** global
- **Xs inline** ao lado do título de cada filter card (vermelho 18×18, aparece só quando filtro ativo)
- **Transition `xx-clear`** no footer (fade + collapse 240ms)
- **Body sem padding/gap** (sidebar fica colada à esquerda; main column tem padding interno próprio)
- **Mobile drawer** com sidebar teleportada perde bg/border-right (drawer já tem chrome) + footer vira `position: sticky; bottom: 0` com bg blur
### 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
### Dialogs harmonizados (Tags / Grupos / Médicos)
---
Espelhando o pattern do **PatientsCadastroPage > Identidade**:
## ⏭️ PRÓXIMOS PASSOS (sugestão)
- **Section dividers**: `<span class="text-[0.7rem] font-bold uppercase tracking-widest text-[var(--p-primary-color)]">` + linha `h-px` primary-tinted
- **Cada campo**: `FloatLabel variant="on"` + `IconField` + `InputIcon` + InputText/Select com `variant="filled"`
- **Grid**: `grid grid-cols-1 gap-6 xl:grid-cols-2 mb-7`
- **Erro inline**: `<small class="text-red-500">` + `pi-exclamation-circle`
- **Footer**: Button PrimeVue padrão (Cancelar secondary text + Salvar com `pi-check`)
- **Bordas dos inputs**: padrão do PrimeVue (sem CSS scoped sobreescrevendo)
### 1. Decidir A66 V2 — design
### Dialog "Pacientes vinculados" (Tags / Grupos / Médicos)
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?
Pattern unificado:
Quando tiver feedback, iterar em `AgendaEventDialogV2.vue`. Sub-sessão
3 (migração nos 9 consumers) só depois do V2 estabilizar.
- **Borda 2px na cor da entidade** (cor da tag/grupo via `:pt root style`); médicos usam `var(--p-primary-color)` (sem cor própria)
- **Header**: avatar quadrado/circular colorido + título com cor da entidade + sub com count
- **Toolbar**: search + count pill colorido
- **Estados**: loading (cor da entidade), erro (vermelho), empty (icon tinted), sem-resultado-de-busca
- **DataTable interna**: Paciente (avatar com iniciais primary-tinted + nome + email) / Telefone / Botão "Abrir" outlined
- **Click "Abrir"** → reusa `PatientCadastroDialog` com `:patient-id`
- **Sem footer "Fechar"** — o X do header é o único botão de fechar
- **X do header** estilizado como `.xx-close` (32×32, bg --m-bg-soft, border, hover bg-soft-hover) via `:pt="{ pcCloseButton: { root: { class: 'xx-pdlg-close-btn' } } }"` + CSS `:global()` (Dialog é teleportado pra body)
### 2. Aplicar blueprint nas demais páginas tabulares Melissa
### ConversationDrawer redesign (estilo WhatsApp)
Ainda faltam (todas seguem `melissa-table-page-blueprint.md`):
- `MelissaCompromissos.vue`
- `MelissaMedicos.vue`
- `MelissaConversas.vue`
- `MelissaRecorrencias.vue`
- `MelissaTags.vue`
- `MelissaGrupos.vue`
- **Header**: avatar circular 40×40 com iniciais + nome em destaque + sub (canal icon + número formatado mono)
- **Container de mensagens**: bg "papel de parede" (`color-mix` bege esverdeado WA + radial-gradient pattern de pontos)
- **Bolhas**:
- Inbound light `#ffffff` / dark `#202c33` — top-left zerado simulando tail
- Outbound light `#d9fdd3` / dark `#005c4b` — top-right zerado simulando tail
- Padding `6/10/18/10` (extra bottom pra meta)
- Border-radius 8px + sombra `0 1px 0.5px rgba(0,0,0,0.13)`
- Detecção dark via `:global(.p-dark) / html.dark / [data-theme="dark"]`
- **Meta** (HH:MM + status checks): `position: absolute` no canto inferior direito DENTRO do balão
- ✓ enviada / ✓✓ entregue / ✓✓ azul `#53bdeb` lida / ✗ vermelho falhou
- **Compose**:
- Botões emoji + templates à esquerda do input
- Textarea com `border-radius: 22px` (pill)
- Botão **Send circular 40×40** verde `#00a884` (cor send WA), translate-up no hover
Padrão: prefixo próprio (`mco`, `mmd`, etc.), sidebar com filtros
coloridos, DataTable com frozen action column, view toggle, subheader,
mobile pencil+popover.
### Bug fix: cores de tags/grupos no MelissaPacientes
### 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.
`patientsRepository.listGroups()` e `listTags()` mapeiam `cor → color` (camelCase frontend-friendly). O template do MelissaPacientes lia `g.cor` / `t.cor` (PT-BR) em **20 lugares** — sempre `undefined` → fallback caía no cinza/hex hardcoded. Trocado pra `g.color` / `t.color` via `replace_all`. Outros consumers (PatientsCadastroPage) já usavam `.color` correto, não foram afetados.
---
@@ -365,46 +150,55 @@ chama `restorePatient` do mesmo repository.
### 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 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.
Perguntas em aberto:
- 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?
---
## ⏭️ PRÓXIMOS PASSOS (sugestão)
### 1. Restore arquivados na `PatientsListPage.vue` (layout Rail)
A `PatientsListPage.vue` tem KPI "Arquivados" mas SEM botão Restaurar. Replicar o pattern da MelissaPacientes:
- Helper `isArquivado(p)` (case-insensitive)
- Botão condicional ↶ "Restaurar" baseado em `p.status === 'Arquivado'`
- Click → confirm → `restorePatient(id, { tenantId })` do mesmo repository → toast + refetch
- Toggle visual: ↶ undo primary quando arquivado / 🗑 trash vermelho quando ativo
### 2. Decidir A66 V2 design
Aguarda feedback. Sem feedback, posso:
- Tentar uma direção alternativa (ex: 1 coluna scroll mais minimalista)
- Comparar com referências externas (Outlook, Cal.com, Linear)
- Voltar pro V1 polido em vez de redesenhar
### 3. Outras Melissa Pages?
Todas as 9 páginas tabulares Melissa já estão alinhadas ao blueprint:
- ✅ Cadastros Recebidos, Agendamentos Recebidos, Pacientes (Sprint E)
- ✅ Compromissos, Grupos, Tags, Médicos, Conversas, Recorrências (Sprint F)
Não há mais páginas pendentes do plano original.
---
## 📚 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.
- **Blueprint tabular Melissa** — referência canônica: `MelissaCadastrosRecebidos.vue`. Todas as 9 páginas alinhadas.
- **Restore pacientes** — implementado no Melissa; replicar no Rail (`PatientsListPage.vue`)
- **Migration aplicada local**: `20260504000001_fix_cancel_notifications_excluido.sql`. Já aplicada no DB local.
---
@@ -421,7 +215,7 @@ npm run dev
npm run build
```
**Suite de testes** (495 testes do A66 incluídos):
**Suite de testes** (495 testes incluindo o A66):
```powershell
npm run test
```
@@ -432,5 +226,4 @@ direto em `/melissa/...`. Pra testar Rail (regressão), troca em
---
**Boa noite. Amanhã começa pelo feedback do A66 V2 ou aplicação do
blueprint nas demais Melissa Pages tabulares — o que você preferir.**
**Estado limpo, push pendente. Quando voltar, próximo passo natural é o feedback do A66 V2 ou o restore na PatientsListPage. Sua escolha.**