Files
agenciapsilmno/HANDOFF.md
T
Leonardo ff3695fbb1 HANDOFF 2026-04-27: bug Teleport + B1 toolbar + B2 stats; B3 pendente teste
Sessão de domingo curta. Bug do chip resolvido pela manhã, polimento
da Agenda à tarde (toolbar + stats interativos), à noite extração do
MelissaEventoPanel novo (não testado em browser, fica pra amanhã).

Working tree não commitado: B3 (MelissaEventoPanel novo + handlers
no MelissaLayout + patient_id no normalize + defineExpose). Ver
seção "PENDENTE DE TESTE" no HANDOFF pra plano de validação.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 08:41:00 -03:00

9.6 KiB

HANDOFF — 2026-04-27 (domingo, pincelada de polimento Melissa)

Documento de continuidade. Quando voltar, comece lendo esta página. Sessão de domingo curta — bug do chip resolvido, polimento da Agenda (toolbar + stats interativos + extração do evento panel novo).


🧪 PENDENTE DE TESTE — MelissaEventoPanel novo (B3)

Implementado mas ainda não testado em browser. Working tree:

M src/layout/melissa/MelissaAgenda.vue
M src/layout/melissa/MelissaLayout.vue
M src/layout/melissa/composables/useMelissaEventos.js
?? src/layout/melissa/MelissaEventoPanel.vue

O que mudou:

  • Novo MelissaEventoPanel.vue (~350 linhas) substitui o panel inline que vivia em MelissaLayout.vue:851-940
  • Bug latente do panel inline corrigido: o panel referenciava .valor.toFixed, .participantes, .supervisorNome, .local — campos que NÃO existem no useMelissaEventos.normalizeEvent. Crashava ao clicar em qualquer sessão real.
  • Novo painel mostra só campos REAIS: hora, modalidade (com ícone correto pra online/presencial), status pílula colorida (realizado verde, faltou vermelho, cancelado cinza, remarcar amber), descrição se houver
  • Action bar agrupada em 3 grupos:
    • Status (só pra sessão e quando status NÃO é final): Concluir | Faltou | Remarcar | Cancelar
    • Paciente (só pra sessão com paciente vinculado): Prontuário | WhatsApp | Histórico
    • Geral: Editar (sempre)
  • Tooltips PrimeVue (v-tooltip.top) em todos os botões
  • MelissaAgenda.defineExpose({ refetch, openProntuario, setView })MelissaLayout chama via melissaAgendaRef
  • MelissaLayout ganhou imports: useToast, MelissaEventoPanel, supabase, useConversationDrawerStore. Handlers: updateEventoStatus(novoStatus, msg) faz UPDATE em agenda_eventos, toast verde, refetch da agenda, fecha painel. Erro → toast vermelho.
  • useMelissaEventos.js: adicionado patient_id ao normalizeEvent + ao SELECT (era null, agora vem do DB)
  • Removido CSS órfão do panel inline (linhas 1495-1561) e função tipoLabel que ficou sem uso

O que esperar ao testar (em /preview/melissa → Agenda):

5 sessões REALIZADAS já estão no banco hoje (criadas em 2026-04-27 pra testar B2). Click em qualquer uma delas:

  • Painel abre SEM CRASH (antes morria em .valor.toFixed)
  • Status pílula verde "Realizada"
  • Como status é final, NÃO mostra grupo de mudança de status
  • Mostra: Prontuário, WhatsApp, Histórico (paciente) + Editar (geral)

Pra testar mudança de status, precisa criar evento com status agendado. Ver query de seed no fim do HANDOFF.

Actions a validar:

  • Prontuário → abre PatientProntuario do paciente real
  • WhatsApp → abre conversationDrawerStore.openForPatient(patient_id)
  • Histórico → muda FC pra view "Lista" (MVP — filtro por paciente futuro)
  • Editar → toast info "Use a Agenda completa em /agenda" (TODO real: integrar AgendaEventDialog numa sessão futura — é grande)
  • Concluir/Faltou/Cancelar (em evento agendado): UPDATE supabase → toast verde → refetch → painel fecha. Card "Realizadas" deve subir.
  • Remarcar: muda status pra 'remarcar' (MVP). Reagendamento real fica pra integrar com AgendaEventDialog depois.

Edge cases pra olhar:

  • Evento de supervisão/reunião (sem tipo='sessao') — só mostra "Editar" no action bar, sem grupos paciente/status. Visual ok?
  • Evento sem patient_id (sessão antiga sem fk) — onWhatsapp mostra toast warn "Paciente sem id"; onAbrirProntuario mesmo padrão
  • eventoBusy durante UPDATE bloqueia todos os botões (:disabled)

COMMITS DO DIA (2026-04-27)

6a92735 Melissa Agenda: toolbar polish + stats interativos com filtro       ← B1+B2
f2b15ce HANDOFF + cleanup: bug Teleport resolvido, backups antigos removidos ← reset HANDOFF
1bcb969 Layout Melissa (Direção B): preview, /profile, Agenda, dock, cadastro ← grupos 2-7 do antigo HANDOFF (todo o trabalho 24-26)
ab103ec Fix admin adjust créditos WhatsApp: clamp silencioso vira erro vermelho ← grupo 1 do antigo HANDOFF

Working tree limpo exceto pelo B3 não testado (ver acima).


BUG RESOLVIDO — chip do cronômetro

Era: dois <Teleport to=".melissa-dock"> (chip cronômetro + dock contextual) com <Transition> interno + v-if interno apontando pro mesmo target. O slot do <Transition> colapsava pra comment placeholder VNode quando falsy, e esses placeholders ficavam intercalados no array de children do target — ao patch/reorder, shouldUpdateComponent lia .component.emitsOptions em nó cujo .component foi anulado pelo unmount irmão. Daí null.

Fix (pattern oficial Vue): <Transition> envolvendo <Teleport>, não o contrário. Assim o Teleport some/aparece como unidade, sem deixar placeholder no target compartilhado.

<!--  ANTES -->
<Teleport to=".melissa-dock">
    <Transition name="...">
        <Element v-if="cond" />
    </Transition>
</Teleport>

<!--  DEPOIS -->
<Transition name="...">
    <Teleport v-if="cond" to=".melissa-dock">
        <Element />
    </Teleport>
</Transition>

Aplicado em MelissaCronometro.vue:322 e MelissaAgenda.vue:842. Lição persistida: quando múltiplos Teleports compartilham target, evitar v-if dentro do Teleport — coloca o v-if no próprio Teleport.


B1 — Toolbar Agenda (commit 6a92735)

  • Cluster Hoje + chevrons num pill único (mais coeso)
  • Título com flex+ellipsis (some min-width:130px que truncava em Mês/Lista)
  • Botão "Hoje" disabled visual (opacity 0.45) quando hoje cai no range visível — antes ficava idêntico, sem affordance. Computed refDateIsToday
  • title=""v-tooltip.top nos chevrons (memória: tooltips PrimeVue)
  • focus-visible outline accent em todos os botões da toolbar
  • View-btn ativo ganhou box-shadow sutil

B2 — Stats interativos (commit 6a92735)

  • Click no stat filtra fcEvents + sessoesHoje pelo predicado correspondente (Total/Sessões/Realizadas/Faltas — feriados continuam sempre como background)
  • Stat ativo: borda accent + bg color-mix(--m-accent 16%, --m-bg-soft)
  • Stats com value=0 ficam disabled (opacity 0.4, cursor:not-allowed)
  • Click no stat ativo limpa o filtro
  • Chip flutuante "Filtrando: X" no canto sup direito do FC, click limpa
  • STAT_FILTERS map global + toggleStatFiltro(key) helper
  • Tooltip dinâmico explicando ação esperada por estado

📦 Setup pra retomar

# Terminal 1 — functions
supabase functions serve --no-verify-jwt --env-file supabase/functions/.env

# Terminal 2 — vite
npm run dev

# Browser
http://localhost:5173/preview/melissa     # ← Melissa preview
http://localhost:5173/account/profile     # ← /profile com card Melissa
http://localhost:5173/auth/login          # ← Login (dados reais)

🌱 Seeds de teste (DB local)

5 sessões REALIZADAS já existem hoje (owner: aaaaaaaa-0002-...): 08:00 Karen Horney, 09:30 André Green, 11:00 Felipe Santos, 14:00 Otto Rank, 16:00 Larissa Souza. Pra testar mudança de status, criar evento agendado:

-- via docker exec supabase_db_agenciapsi-primesakai psql -U postgres -d postgres -c "..."
INSERT INTO agenda_eventos (owner_id, tenant_id, patient_id, tipo, status, inicio_em, fim_em, modalidade, observacoes)
VALUES (
    'aaaaaaaa-0002-0002-0002-000000000002',
    'bbbbbbbb-0002-0002-0002-000000000002',
    'fe670066-0d81-49ea-b177-61e83b455c59',  -- Henrique Ferreira
    'sessao', 'agendado',
    current_date + time '18:00', current_date + time '19:00',
    'presencial', 'Seed B3 - testar action bar de status'
);

Pra LIMPAR todas as sessões de seed depois:

DELETE FROM agenda_eventos WHERE observacoes LIKE 'Seed B%';

📌 Próximos passos (amanhã)

1. Testar B3 (prioridade) — ver seção topo. Se quebrar:

  • Console errors → me passar pra debug
  • Visual ruim em light mode → ajustar tokens no MelissaEventoPanel.vue
  • Action falha em paciente sem patient_id → revisar guards

2. Commitar B3 após testar:

Melissa: MelissaEventoPanel novo + bug fix latente do panel inline

- Componente extraído MelissaLayout:851-940 → MelissaEventoPanel.vue
- Bug fix: panel inline crashava em .valor.toFixed (campo undefined no
  normalizeEvent). Novo só usa campos reais
- Action bar agrupada (status / paciente / geral) com 7 ações
- useMelissaEventos.normalizeEvent: adicionado patient_id
- MelissaAgenda.defineExpose({ refetch, openProntuario, setView })
- MelissaLayout: handlers updateEventoStatus + onConcluir/Faltou/etc

3. Itens futuros maiores (sessão dedicada cada):

  • Editar/Remarcar reais — integrar AgendaEventDialog no MelissaLayout (precisa carregar row crua de agenda_eventos + props extensas). ~60-90min, blast radius médio
  • Drag/resize no FC com persist (Fase 2 do roadmap) — UPDATE inicio_em/fim_em no drop, conflito detection, undo
  • Recorrências virtuais (RRULE → ocorrências) — biggest fish
  • Histórico de sessões com filtro por paciente — refinar lo que hoje só muda view do FC
  • Fase 5 (A#32) — wire-up router pra Layout Melissa virar real (alto risco, precisa de Fase 3 antes — split MelissaLayout/MelissaResumo)

4. Outras opções (não-Melissa):

  • QA Seção 3.4 do roteiro de testes — SLA conversas + Bot triagem + Lembrar paciente + ...

📚 Tracking persistente

  • A#32 — Fase 5 router wire-up (pendente, sessão dedicada)
  • A#33 — Bug do chip cronômetro: RESOLVIDO 2026-04-27
  • Memória atualizada: project_layout_melissa.md registra pattern Transition>Teleport e convenções