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>
This commit is contained in:
Leonardo
2026-04-26 08:41:00 -03:00
parent 6a92735366
commit ff3695fbb1
+173 -140
View File
@@ -1,12 +1,96 @@
# HANDOFF — 2026-04-26 (continuação 2026-04-27: bug Teleport resolvido) # HANDOFF — 2026-04-27 (domingo, pincelada de polimento Melissa)
Documento de continuidade. **Quando voltar, comece lendo esta página.** Documento de continuidade. **Quando voltar, comece lendo esta página.**
Sessão inteira polindo o Layout Melissa: light mode, integração no /profile, Sessão de domingo curta — bug do chip resolvido, polimento da Agenda
Agenda fullscreen, dock taskbar, cadastro de paciente, ações contextuais. (toolbar + stats interativos + extração do evento panel novo).
--- ---
## ✅ BUG RESOLVIDO — chip do cronômetro (2026-04-27) ## 🧪 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) **Era:** dois `<Teleport to=".melissa-dock">` (chip cronômetro + dock contextual)
com `<Transition>` interno + `v-if` interno apontando pro mesmo target. O slot com `<Transition>` interno + `v-if` interno apontando pro mesmo target. O slot
@@ -36,135 +120,31 @@ no target compartilhado.
``` ```
Aplicado em `MelissaCronometro.vue:322` e `MelissaAgenda.vue:842`. Aplicado em `MelissaCronometro.vue:322` e `MelissaAgenda.vue:842`.
**Lição persistida:** quando múltiplos Teleports compartilham target, evitar **Lição persistida:** quando múltiplos Teleports compartilham target, evitar
`v-if` dentro do Teleport — coloca o `v-if` no próprio Teleport. `v-if` dentro do Teleport — coloca o `v-if` no próprio Teleport.
--- ---
## ✅ O que aconteceu hoje (cronologia) ## ✅ B1 — Toolbar Agenda (commit 6a92735)
### Manhã — Light mode + /profile - Cluster Hoje + chevrons num pill único (mais coeso)
- **Light bloom no MelissaLayout** — gradiente Bloom usa CSS vars (`--bloom-c1/c2/base-1/base-2`) que flipam dark/light. Dark: 400/300/950. Light: 200/100/0. Removido `background-image: none !important`. Corrigido branco-em-branco do clock + ψ + psi-kbd. Panels light com 92% opacity. Classe `win11-has-photo` quando upload de foto. - Título com flex+ellipsis (some `min-width:130px` que truncava em Mês/Lista)
- **Layout Melissa em /profile** — 3º card na seção 06 com badge "Em construção" + listras diagonais. Aceita `'melissa'` em `setVariant`/`_loadVariant`/bootstrap. Migration `20260425000001_user_settings_layout_variant_melissa.sql` (já aplicada). **Switch real do app fica pra Fase 5 (A#32 no dev_auditoria_items).** - Botão "Hoje" disabled visual (opacity 0.45) quando hoje cai no range
- **Cronômetro/Personalização em light** — trocados `color: white` scoped → `var(--m-text)` em `.mc-select`, `.mc-display`, `.mc-btn--secondary`, `.mc-chip`, `.settings-select`, `.settings-test-btn`. Pílula `psi-kbd` ganhou tokens `--m-kbd-bg/--m-kbd-text` (era `rgba(0,0,0,.65)` hardcoded — em light virava preto sobre preto). Shadow do `.psi-btn` suavizada em light. visível — antes ficava idêntico, sem affordance. Computed `refDateIsToday`
- **Ícones tons claros** — bloco de overrides em light mapeia `text-{cor}-200/300/400``text-{cor}-600` (17 cores Tailwind: emerald, green, amber, purple, blue, sky, cyan, teal, indigo, violet, pink, rose, red, orange, yellow, fuchsia, lime). - `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
### Tarde — Agenda fullscreen ## ✅ B2 — Stats interativos (commit 6a92735)
- **Cores light na MelissaAgenda** — 12 substituições de `color: white``var(--m-text)` semântico. Mantido white em `.mini-cal__day.is-hoje` (bg accent saturado). Avatar do paciente: bg `--m-accent-strong` (translúcido, invisível em light) → `--m-accent` (saturado). Tweaks light: shadow suave na `.ma-page`, eventos do FC com `saturate(140%)` + box-shadow leve, cursor "agora" com glow vermelho.
- **Mini-cal funcionalidades** — click no dia pula o FC (`fcApi().gotoDate`), range visível do FC destacado (`is-in-range` via `viewStart/viewEnd`), dots por evento real do mês (`useMelissaEventosRange(miniRangeStart, miniRangeEnd)` separado), até 3 dots por dia.
- **Feriados** — `useFeriados` integrado. Cores: nacional=rose, municipal=amber, personalizado=violet. Tooltip combina nome do feriado + count de eventos. Hoje + feriado: ring externo na cor do feriado. Recarrega ao mudar de ano via watch.
- **Dias fechados** — `useAgendaSettings.workRules` carregado. `workDowSet` computed. Dias fora da jornada → `is-fechado` (cinza apagado). Mutex com feriado (feriado vence cinza). Fallback seg-sex se sem regras.
- **FC central com feriados** — `fcEvents` agora `[...eventosSemana, ...feriadoFcEvents]` (display:'background' amber suave).
### Tarde 2 — Layout estrutural da Agenda - Click no stat filtra `fcEvents` + `sessoesHoje` pelo predicado correspondente
- **Card `Hoje` mesclado** — antes 2 cards (stats + sessões). Agora 1 só: header + 4 stats + divider + lista de sessões. Count à direita do header. (Total/Sessões/Realizadas/Faltas — feriados continuam sempre como background)
- **Card Hoje movido pra esquerda** — sai da col 3 (widgets), vai pro topo da col 1 (sidebar pacientes). Modificador `.ma-w--side` com margem + max-height 50vh + lista interna scrollable. - Stat ativo: borda accent + bg `color-mix(--m-accent 16%, --m-bg-soft)`
- **ProximosFeriadosCard reaproveitado** — entre mini-cal e Hoje na col 3. Override visual (`bg-soft`, `border-color`, `border-radius: 12px`) pra encaixar no glass. - Stats com `value=0` ficam disabled (opacity 0.4, `cursor:not-allowed`)
- Click no stat ativo limpa o filtro
### Noite 1 — Dock + cadastro de paciente - Chip flutuante "Filtrando: X" no canto sup direito do FC, click limpa
- **Dock taskbar** (`.melissa-dock`) — faixa fixa 76px no bottom, transparente, `position:fixed`. ψ desceu pra `bottom: 10px` (centralizado vertical na faixa). Token `--m-dock-h: 76px`. Páginas reservam space via `inset` (`.ma-page` ajustada). **CSS no `<style>` global** pra evitar perda de scoped em static-hoisted nodes. - `STAT_FILTERS` map global + `toggleStatFiltro(key)` helper
- **Chip cronômetro teleportado** pro dock. Substituído `position:fixed top:1.5rem left:1.5rem` por `position:relative` (filho flex). Aparece após ψ, com gap. - Tooltip dinâmico explicando ação esperada por estado
- **Animação minimize macOS-style** — `isMinimizing` flag + computed `dialogTransitionName` ('minimize' vs 'lift' default). CSS `transform-origin: 96px calc(100% - 38px)` (posição do chip no dock). Scale 1→0.05 + opacity em 340ms cubic-bezier ease-in. Chip-pop com `transition-delay: 120ms` no enter pra dar sensação macOS.
- **Botão fake "Adicionar paciente"** no topo da lista — tracejado com `+`. Click abre `PatientCreatePopover` (3 opções: rápido/completo/link de cadastro com URL+copy). Reaproveita `PatientCadastroDialog` + `ComponentCadastroRapido`. Emit `patient-created` → MelissaLayout faz `refetchPacientes`.
- **Pacientes novos no topo** — composable agora retorna `created_at`. Threshold 7 dias. Computed `pacientesFiltrados` particiona em [novos sort desc, resto alfabético]. Visual: `is-novo` bg `--m-accent-soft` + badge "novo" pílula primary.
### Noite 2 — Dock contextual ⚠️ INTRODUZIU O BUG PENDENTE
- **Imports adicionados** no MelissaAgenda: `PatientProntuario`, `useConversationDrawerStore`, `getSessionCounts`. Removido depois: `import Menu from 'primevue/menu'` (auto-import).
- **State + funções** pra dock contextual: `pacienteSelecionado` computed, `sessionCountsMap` cache, `prontuarioOpen`/`prontuarioPatient`, handlers `abrirSessoes/Whatsapp/Prontuario`, `editarPacienteSelecionado`, `desselecionarPaciente`, `toggleKebab`/`kebabItems`.
- **Template** — `<button>` do paciente virou `<div>` (não pode ter button-dentro-de-button por causa do kebab `.ma-pat__kebab`). `<Teleport to=".melissa-dock">` com `<Transition name="ma-dock-pop">` mostrando avatar + nome + count + 4 ações + close. `<Menu>` PrimeVue popup. `<PatientProntuario v-if=...>`.
- **CSS** — `.ma-dock-actions` glass aesthetic (espelha .mc-chip), responsivo (some em ≤ 1024px). `.ma-pat__kebab` só visível em mobile.
**Estado pós-implementação:** funcionou inicialmente. Depois de algum HMR, o chip do cronômetro deixou de aparecer. Erro `emitsOptions: null` no console. Tentei 3 fixes sem sucesso. Investigar amanhã.
---
## 📋 Pendências do dia (não commitado)
```
M HANDOFF.md
M src/router/routes.misc.js (rota /preview/melissa — do dia 24)
M src/views/pages/saas/SaasAddonsPage.vue (do dia 24, ainda não commitado)
M src/views/pages/account/ProfilePage.vue (card Melissa)
M src/layout/composables/layout.js (variant aceita 'melissa')
M src/app/bootstrapUserSettings.js (bootstrap aceita 'melissa')
M src/layout/melissa/MelissaLayout.vue (light bloom + dock + tokens)
M src/layout/melissa/MelissaCronometro.vue (light + teleport chip + animação minimize)
M src/layout/melissa/MelissaAgenda.vue (light + mini-cal + feriados + cadastro + dock contextual)
M src/layout/melissa/composables/useMelissaPacientes.js (created_at)
?? src/layout/melissa/ (todo o trabalho do dia 24-26)
?? layout-scratchs/ (rascunhos design Direção A)
?? database-novo/migrations/20260425000001_user_settings_layout_variant_melissa.sql
```
**Sugestão de commits separados (ordem):**
1. **Fix admin adjust créditos (do dia 24, ainda pendente):**
```
Fix admin adjust créditos: clamp silencioso vira erro vermelho
```
2. **Layout Melissa — preview funcional (dia 24):**
```
Layout Melissa (Direção B) — preview em /preview/melissa
```
3. **Layout Melissa — Profile + light mode + ícones tons claros (dia 25-26):**
```
Melissa: light bloom + opção em /account/profile (Em construção)
- Light mode usa CSS vars --bloom-* (tons 200/100/surface-0)
- Card "Melissa" em /account/profile com badge Em construção
- Migration: layout_variant aceita 'melissa'
- Cores light em cronômetro/personalização (color: white → var(--m-text))
- Ícones text-X-200/300/400 → text-X-600 em light (17 cores)
- Switch real do app: A#32 (Fase 5)
```
4. **Melissa Agenda — cores light + mini-cal funcional + feriados (dia 26):**
```
Melissa Agenda: light + mini-cal completo + feriados + dias fechados
- 12 cores white → var(--m-text) na .ma-page e widgets
- Mini-cal: click pula FC, range visível destacado, dots reais por mês
- Feriados nacional/municipal/personalizado (rose/amber/violet)
- Dias fechados (workRules) cinza apagado
- FC central com feriados como background events
```
5. **Melissa Agenda — layout estrutural (dia 26):**
```
Melissa Agenda: card Hoje na sidebar + ProximosFeriadosCard
- Card Hoje (stats+sessões) mesclados em um, movidos pra col esquerda
- ProximosFeriadosCard reaproveitado entre mini-cal e Hoje
```
6. **Melissa — dock + cadastro paciente (dia 26):**
```
Melissa: dock taskbar Win11 + cadastro paciente via PatientCreatePopover
- .melissa-dock fixed bottom 76px receptor de items teleportados
- Chip cronômetro teleportado pro dock + animação minimize macOS-style
- ψ centralizado vertical na faixa (bottom:10px)
- Botão fake "+" no topo da lista de pacientes abre popover
- Pacientes novos (7d) no topo + badge "novo"
```
7. **✅ Dock contextual com ações de paciente (bug resolvido 2026-04-27):**
- Mudanças do MelissaAgenda relacionadas a `.ma-dock-actions`, `Menu kebab`, `PatientProntuario` integration
- Bug do chip resolvido (Transition envolvendo Teleport)
```
Melissa Agenda: dock contextual com ações do paciente selecionado
```
---
## 📚 Tracking persistente
- **A#32** — Fase 5 router wire-up (ainda pendente, sessão dedicada)
- **Memória atualizada:** `project_layout_melissa.md` — adicionar nota sobre bug pendente + estado da sessão
- Adicionar **A#33** amanhã pro bug do chip do cronômetro pendente, depois fechar quando resolvido
--- ---
@@ -185,22 +165,75 @@ http://localhost:5173/auth/login # ← Login (dados reais)
--- ---
## 📌 Próximas opções (escolha amanhã) ## 🌱 Seeds de teste (DB local)
**A. Resolver bug do chip do cronômetro** ⚠️ prioridade — bloqueia commit do dock contextual 5 sessões REALIZADAS já existem hoje (owner: `aaaaaaaa-0002-...`):
- Ver hipóteses na seção "BUG PENDENTE" no topo 08:00 Karen Horney, 09:30 André Green, 11:00 Felipe Santos, 14:00 Otto Rank,
- Estratégia recomendada: comentar o `<PatientProntuario>` primeiro, hard refresh, ver se chip volta. Se sim, é o componente. Se não, comentar `<Menu>` kebab. Se não, comentar `<Teleport>` do `.ma-dock-actions`. Isolar a causa. 16:00 Larissa Souza. Pra testar mudança de status, criar evento agendado:
**B. Continuar polindo Melissa** ```sql
- Toolbar custom da Agenda (revisar visual) -- via docker exec supabase_db_agenciapsi-primesakai psql -U postgres -d postgres -c "..."
- Stats hoje (interatividade — click filtra?) INSERT INTO agenda_eventos (owner_id, tenant_id, patient_id, tipo, status, inicio_em, fim_em, modalidade, observacoes)
- Evento panel (visual + actions) VALUES (
- Drag/resize no FC com persist (Fase 2 do roadmap) 'aaaaaaaa-0002-0002-0002-000000000002',
- Recorrências virtuais (RRULE → ocorrências) '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'
);
```
**C. Fase 5 (A#32)** — wire-up router pra Layout Melissa virar real Pra LIMPAR todas as sessões de seed depois:
- Alto risco — sessão dedicada
- Precisa de Fase 3 antes (split MelissaLayout/MelissaResumo) ```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
**D. Voltar pro QA** (Seção 3.4 do roteiro de testes)
- SLA de conversas + Bot triagem + Lembrar paciente + ...