ff3695fbb1
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>
240 lines
9.6 KiB
Markdown
240 lines
9.6 KiB
Markdown
# 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.
|
|
|
|
```vue
|
|
<!-- ❌ 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
|
|
|
|
```bash
|
|
# 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:
|
|
|
|
```sql
|
|
-- 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:
|
|
|
|
```sql
|
|
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
|
|
|