- Remove database-novo/backups/2026-03-27 e 2026-03-29 (deveriam estar no gitignore, mas haviam sido tracked antes) - Atualiza db.config.json + generate-dashboard.cjs + dashboard.html - HANDOFF.md atualizado com estado de 05-05 (sprint blueprint tabular + arquivamento de pacientes) - Obsidian/Brain/log.md: entrada da sessao 05-05 adicionada Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
19 KiB
HANDOFF — 2026-05-05 (sprint blueprint tabular Melissa + arquivamento de pacientes)
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 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.
Sessão de polimento e estruturação — não houve commit. Working tree acumulada de 4 sprints (28 modificados + 22 novos).
🚦 STATUS — Working tree
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)
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)
✅ FEITO HOJE (2026-05-05)
1. Blueprint de página tabular — melissa-table-page-blueprint.md
Novo arquivo em blueprints/. ~530 linhas, 18 seções:
- Princípio (sidebar de filtros + main com toolbar + tabela)
- Estrutura do template (com subheader explicativo)
- Estado JS (script setup) — busca, statusFilter, paginação, viewMode
- DataTable view Lista — props canônicas explicadas
- View Grade — cards em CSS grid,
<div role="button"> - Tokens de surface (light/dark) —
--p-content-backgroundcanônico - Cores de status — Tailwind 600 (azul/verde/vermelho), aplicadas em 4 lugares
- Filtro de status + Limpar filtro com Transition fade
- Subheader explicativo — diferencia páginas de layout idêntico
- Toolbar — busca + view toggle
- DataTable estilos completos (header transparent, frozen column, paginator)
- Botão pencil — coluna fixa
- Empty / loading
- Mobile (<1024px) — scroll horizontal, NÃO esconde colunas
- Acessibilidade
- Checklist de adoção (16 itens)
- Anti-patterns (11 erros documentados)
- Referência canônica →
MelissaCadastrosRecebidos.vue
2. MelissaCadastrosRecebidos — refator pra blueprint
Antes era lista de cards verticais; agora é DataTable PrimeVue com:
- Sidebar
--m-bg-soft+ border-right + sombra0 2px 8pxnos 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-circleem primary
3. MelissaAgendamentosRecebidos — NOVO native page
Substitui o embed via MelissaEmbed. Espelha 1:1 o blueprint, prefixo mar.
- Tabela DB:
agendador_solicitacoes(nãopatient_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))
- 🔵 Pendente (
- 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_KEYSperdeuagendamentos-recebidosMELISSA_NON_CONFIG_SLUGSganhou direto- Render block conditional entre Cadastros e Médicos
MelissaEmbed.EMBED_MAPperdeu 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 usandoAgendamentosRecebidosPage.vueinalterada.
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 8pxnos 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-cogno header (sem borda, hover primary) — emitegoto-grupos/goto-tagsque 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
- Botão
[×](clear filter) agora vermelhorgb(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: 0na.mp-list— sem isso amp-list__bodynão scrollava em mobile (flex: 1; overflow-y: autoprecisa de parent constrained)
Toolbar:
- View toggle list/grade (persistido em
mp.viewMode.v1localStorage) - Botão "Novo paciente" usa
PatientCreatePopover(mesmo do agenda) — já estava wired, só explicitei$eventno 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 })— espelhasoftDeletePatientmas setastatus = '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--restorecom hover primary - Mobile popover menu —
mp-actions-menu__item.is-restore
- Desktop (5 botões inline) —
🧪 ROTEIRO DE TESTE (rápido — ~15 min)
Setup
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/grupose/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: 0na.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.vueMelissaMedicos.vueMelissaConversas.vueMelissaRecorrencias.vueMelissaTags.vueMelissaGrupos.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):
- Sprint A — Sprint 04-29/30 (hub Configurações + 7 Melissa Pages
- dialog blueprint dark)
- Sprint B — Sprint 05-03 (timeline FullCalendar parity, cards resumo, dock pins, topbar, NotificationDrawer redesign, melissaCacheStore, useMelissaDockPins)
- Sprint C — Sprint 05-04 (MelissaAgendaHistoricoCard, useFeriados
cache opt-in, PatientProntuario aba Visão Geral, migration
20260504000001_fix_cancel_notifications_excluido.sql) - Sprint D — A66 sub-sessão 1 (5 composables + 5 specs + 265 testes) + sub-sessão 2 esqueleto (V2 + preview) — MARCAR como WIP
- 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-v2com 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
# 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):
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.