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:
+149
-356
@@ -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.**
|
Documento de continuidade. **Quando voltar, comece lendo esta página.**
|
||||||
|
|
||||||
> **🟡 PENDENTE — Sub-sessão 2 do A66 (V2 dialog)**: skeleton entregue
|
> **🟢 ENTREGUE HOJE** — Blueprint tabular aplicado nas **6 Melissa Pages restantes**
|
||||||
> em 2026-05-05 mas user **não gostou do design** ao olhar o preview.
|
> (Compromissos, Grupos, Tags, Médicos, Conversas, Recorrências) + dialogs
|
||||||
> Aguarda feedback específico (3 zonas tá errado? hierarquia? hero
|
> harmonizados com `FloatLabel + IconField + section dividers` + dialogs
|
||||||
> grande demais? mobile? referência visual?). Iteração só depois disso.
|
> "Pacientes do grupo/tag/médico" com cor primary nos avatares + redesign
|
||||||
> Detalhes na seção "Sessões dedicadas pendentes" no fim deste doc.
|
> 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
|
> **🟢 COMMITADO** — Working tree estava com 4 sprints acumulados (~50 arquivos).
|
||||||
> em `blueprints/melissa-table-page-blueprint.md` (~530 linhas, 18 seções)
|
> Foram criados **5 commits** lógicos antes do push, do mais antigo pro mais
|
||||||
> e aplicado em **MelissaCadastrosRecebidos** (refator) +
|
> recente. Ver seção "Histórico de commits" abaixo.
|
||||||
> **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
|
> **🟡 AINDA PENDENTE** — Sub-sessão 2 do A66 (V2 dialog): user não gostou
|
||||||
acumulada de 4 sprints (28 modificados + 22 novos).
|
> 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
|
On branch main
|
||||||
M database-novo/agenciapsi-db-dashboard.html
|
Your branch is up to date with 'origin/main'.
|
||||||
M database-novo/db.config.json
|
nothing to commit, working tree clean
|
||||||
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:**
|
(após `git push`. Antes do push: 5 commits ahead.)
|
||||||
```
|
|
||||||
?? 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)
|
## 📦 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. **`6d9b36d`** — `A66 WIP: AgendaEventDialog quebrado em 5 composables + 265 specs + V2 esqueleto`
|
||||||
2. Estrutura do template (com **subheader explicativo**)
|
- 5 composables (1986L total): `agendaEventHelpers`, `useAgendaEventComposer`, `useAgendaEventActions`, `useAgendaEventPickerBilling`, `useAgendaEventLifecycle`
|
||||||
3. Estado JS (script setup) — busca, statusFilter, paginação, viewMode
|
- 5 specs em `__tests__/` (75+76+28+43+43 = **265 testes**, 495/495 passando)
|
||||||
4. DataTable view Lista — props canônicas explicadas
|
- AgendaEventDialog 3522 → 2632 linhas (-25%)
|
||||||
5. View Grade — cards em CSS grid, `<div role="button">`
|
- `AgendaEventDialogV2.vue` esqueleto (~1100L, 3 zonas) + preview em `/preview/agenda-dialog-v2`
|
||||||
6. Tokens de surface (light/dark) — `--p-content-background` canônico
|
- Backup byte-idêntico em `AgendaEventDialog.vue.bak`
|
||||||
7. Cores de status — Tailwind 600 (azul/verde/vermelho), aplicadas em 4 lugares
|
- Dialogs auxiliares: `InsurancePlanQuickCreateDialog`, `ServiceQuickCreateDialog`
|
||||||
8. Filtro de status + Limpar filtro com Transition fade
|
- 17 files, +10966 −1298
|
||||||
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. 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:
|
4. **`98f7252`** — `Melissa: 6 Pages aplicando blueprint + dialogs unificados + Conversa estilo WhatsApp`
|
||||||
- **Sidebar** `--m-bg-soft` + border-right + sombra `0 2px 8px` nos cards
|
- Sprint F (05-06, esta sessão):
|
||||||
- **Stats card** (Total / Novos / Convertidos / Rejeitados) — Novos azul / Conv verde / Rej vermelho
|
- **MelissaCompromissos**: blueprint mantendo row design original (color stripe + name + badges + descrição + meta inline)
|
||||||
- **Status filter card** com 3 níveis de cor (default 5%, hover 10%, active 16% + ring) + botão
|
- **MelissaGrupos** + **MelissaTags**: blueprint completo + dialog "Pacientes do grupo/tag" com lista vinculada via `patient_group_patient` / `patient_patient_tag`
|
||||||
"Limpar filtro" com Transition fade quando ativo
|
- **MelissaMedicos**: blueprint + dialog "Pacientes encaminhados" usando cor primary; dialog editar com 4 seções (Identificação/Contato/Localização/Obs) espelhando PatientsCadastroPage
|
||||||
- **Toolbar main** com search + view toggle (lista/grade)
|
- **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`
|
||||||
- **DataTable** `:loading + paginator + scrollable scrollHeight="flex"
|
- **MelissaRecorrencias**: button list de status, busca por nome do paciente, footer Limpar filtros
|
||||||
+ tableStyle="min-width:640px"` — colunas: Paciente / Contato / Recebido / Ação (frozen 60px right)
|
- **ConversationDrawer**: redesign WhatsApp (avatar primary, bg "papel de parede", bolhas com tail, time/status overlay, compose pill + send circular #00a884)
|
||||||
- **Coluna frozen** com bg `--p-content-background` (canônico, opaco em ambos modos),
|
- 7 files, +7879 −1467
|
||||||
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
|
|
||||||
|
|
||||||
### 3. MelissaAgendamentosRecebidos — NOVO native page
|
5. **`15103ed`** — `Cleanup: backups antigos removidos + dashboard config + HANDOFF/log`
|
||||||
|
- Backups `database-novo/backups/2026-03-27` e `2026-03-29` removidos
|
||||||
Substitui o embed via `MelissaEmbed`. Espelha 1:1 o blueprint, prefixo `mar`.
|
- `db.config.json` + `generate-dashboard.cjs` + `dashboard.html` atualizados
|
||||||
|
- HANDOFF.md (estado 05-05) + log.md
|
||||||
- Tabela DB: `agendador_solicitacoes` (não `patient_intake_requests`)
|
- 11 files, +435 −87172
|
||||||
- **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`
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🧪 ROTEIRO DE TESTE (rápido — ~15 min)
|
## 📋 RESUMO da sessão 2026-05-06
|
||||||
|
|
||||||
### Setup
|
### Padrões consolidados nas 6 páginas Melissa restantes
|
||||||
```powershell
|
|
||||||
Remove-Item -Recurse -Force node_modules\.vite -ErrorAction SilentlyContinue
|
|
||||||
npm run dev
|
|
||||||
```
|
|
||||||
|
|
||||||
### Fase 1 — MelissaCadastrosRecebidos (5 min)
|
Cada página agora segue o blueprint:
|
||||||
- `/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)
|
- **Subheader explicativo** logo abaixo do header (1-2 frases descrevendo a página + ações principais com `<strong>`)
|
||||||
- `/melissa/agendamentos-recebidos` → mesma estrutura, 4 status com cor
|
- **Sidebar reestruturada** em 2 zonas:
|
||||||
(Pendente azul / Autorizado verde / Convertido teal / Recusado vermelho)
|
- `.xx-side` com `bg: var(--m-bg-soft)` + `border-right` (visual de coluna lateral)
|
||||||
- Click numa pendente → dialog mostra 3 ações (Recusar / Autorizar /
|
- `.xx-side__scroll` (flex 1, overflow auto) com cards `xx-w--side` (margin lateral 12px + sombra)
|
||||||
Converter em sessão); converter cria paciente automático + abre
|
- `.xx-side__footer` (flex-shrink 0, padding 12px, bg-soft, border-top) com botão **"Limpar filtros"** global
|
||||||
AgendaEventDialog
|
- **Xs inline** ao lado do título de cada filter card (vermelho 18×18, aparece só quando filtro ativo)
|
||||||
- Subheader próprio diferenciando da Cadastros Recebidos
|
- **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)
|
### Dialogs harmonizados (Tags / Grupos / Médicos)
|
||||||
- `/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
|
|
||||||
|
|
||||||
---
|
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
|
Pattern unificado:
|
||||||
`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
|
- **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)
|
||||||
3 (migração nos 9 consumers) só depois do V2 estabilizar.
|
- **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`):
|
- **Header**: avatar circular 40×40 com iniciais + nome em destaque + sub (canal icon + número formatado mono)
|
||||||
- `MelissaCompromissos.vue`
|
- **Container de mensagens**: bg "papel de parede" (`color-mix` bege esverdeado WA + radial-gradient pattern de pontos)
|
||||||
- `MelissaMedicos.vue`
|
- **Bolhas**:
|
||||||
- `MelissaConversas.vue`
|
- Inbound light `#ffffff` / dark `#202c33` — top-left zerado simulando tail
|
||||||
- `MelissaRecorrencias.vue`
|
- Outbound light `#d9fdd3` / dark `#005c4b` — top-right zerado simulando tail
|
||||||
- `MelissaTags.vue`
|
- Padding `6/10/18/10` (extra bottom pra meta)
|
||||||
- `MelissaGrupos.vue`
|
- 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
|
### Bug fix: cores de tags/grupos no MelissaPacientes
|
||||||
coloridos, DataTable com frozen action column, view toggle, subheader,
|
|
||||||
mobile pencil+popover.
|
|
||||||
|
|
||||||
### 3. Decidir commits
|
`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.
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -365,46 +150,55 @@ chama `restorePatient` do mesmo repository.
|
|||||||
### A66 — Refactor `AgendaEventDialog` V2 (3 sub-sessões)
|
### A66 — Refactor `AgendaEventDialog` V2 (3 sub-sessões)
|
||||||
|
|
||||||
**Estado**:
|
**Estado**:
|
||||||
- ✅ Sub-sessão 1 (composables) — 5 composables + 265 testes, 495/495
|
- ✅ Sub-sessão 1 (composables) — 5 composables + 265 testes, 495/495 suite passando, AgendaEventDialog 3522→2632 linhas (-25%)
|
||||||
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 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
|
- ⏳ 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.
|
**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
|
## 📚 Tracking persistente
|
||||||
|
|
||||||
- **A66** — sub-sessão 2 (V2 design) aguardando feedback do user
|
- **A66** — sub-sessão 2 (V2 design) aguardando feedback do user
|
||||||
- **Blueprint tabular Melissa** — referência canônica:
|
- **Blueprint tabular Melissa** — referência canônica: `MelissaCadastrosRecebidos.vue`. Todas as 9 páginas alinhadas.
|
||||||
`MelissaCadastrosRecebidos.vue`. Próximas adoções planejadas:
|
- **Restore pacientes** — implementado no Melissa; replicar no Rail (`PatientsListPage.vue`)
|
||||||
Compromissos, Médicos, Conversas, Recorrências, Tags, Grupos
|
- **Migration aplicada local**: `20260504000001_fix_cancel_notifications_excluido.sql`. Já aplicada no DB local.
|
||||||
- **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.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -421,7 +215,7 @@ npm run dev
|
|||||||
npm run build
|
npm run build
|
||||||
```
|
```
|
||||||
|
|
||||||
**Suite de testes** (495 testes do A66 incluídos):
|
**Suite de testes** (495 testes incluindo o A66):
|
||||||
```powershell
|
```powershell
|
||||||
npm run test
|
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
|
**Estado limpo, push pendente. Quando voltar, próximo passo natural é o feedback do A66 V2 ou o restore na PatientsListPage. Sua escolha.**
|
||||||
blueprint nas demais Melissa Pages tabulares — o que você preferir.**
|
|
||||||
|
|||||||
@@ -28,3 +28,18 @@ A66 V2 — user não gostou design, aguarda feedback específico.
|
|||||||
## [2026-05-06 12:00] session | MelissaCompromissos refator blueprint
|
## [2026-05-06 12:00] session | MelissaCompromissos refator blueprint
|
||||||
Touched: none (aplicacao direta do blueprint existente - sem mudanca de wiki)
|
Touched: none (aplicacao direta do blueprint existente - sem mudanca de wiki)
|
||||||
Detalhes: refator de MelissaCompromissos pro melissa-table-page-blueprint preservando o design do row (color stripe + name+badges + descricao + meta inline). DataTable com 3 colunas (Compromisso flex / Atividade 220px / Acoes frozen 140px com toggle+pencil+trash). Sidebar com 2 grupos de filtros: Status (Ativos verde / Inativos amber) e Tipo (Nativos blue / Meus accent), cada um com Limpar filtro proprio. Grid view com cards (color stripe 28px + toggle topo + footer com edit/trash). Subheader explicativo. View toggle persistido em mc.viewMode.v1. Removeu Popover de actions (drawer mobile cobre). Stats: Total/Ativos/Inativos/Tempo total. ESLint 0 errors. UI nao testada em browser ainda.
|
Detalhes: refator de MelissaCompromissos pro melissa-table-page-blueprint preservando o design do row (color stripe + name+badges + descricao + meta inline). DataTable com 3 colunas (Compromisso flex / Atividade 220px / Acoes frozen 140px com toggle+pencil+trash). Sidebar com 2 grupos de filtros: Status (Ativos verde / Inativos amber) e Tipo (Nativos blue / Meus accent), cada um com Limpar filtro proprio. Grid view com cards (color stripe 28px + toggle topo + footer com edit/trash). Subheader explicativo. View toggle persistido em mc.viewMode.v1. Removeu Popover de actions (drawer mobile cobre). Stats: Total/Ativos/Inativos/Tempo total. ESLint 0 errors. UI nao testada em browser ainda.
|
||||||
|
|
||||||
|
## [2026-05-06 14:00] session | Melissa 6 Pages blueprint + WhatsApp drawer + commits
|
||||||
|
Touched: none (sem nova pagina de wiki - aplicacao do blueprint existente)
|
||||||
|
Detalhes: Sprint F entregue. Blueprint tabular aplicado em MelissaCompromissos
|
||||||
|
(row design preservado), MelissaGrupos, MelissaTags, MelissaMedicos,
|
||||||
|
MelissaConversas, MelissaRecorrencias. Dialogs de criar/editar harmonizados
|
||||||
|
(FloatLabel + IconField + section dividers espelhando PatientsCadastroPage
|
||||||
|
Identidade). Dialogs "Pacientes do grupo/tag/medico" com cor primary nos
|
||||||
|
avatares de letras + X de fechar igual .xx-close. ConversationDrawer redesign
|
||||||
|
estilo WhatsApp (avatar primary, bg papel de parede, bolhas com tail simulada,
|
||||||
|
time/status overlay no canto inferior direito, compose pill + send circular
|
||||||
|
verde #00a884). Bug fix em MelissaPacientes: g.cor->g.color em 20 lugares
|
||||||
|
(repository devolve camelCase, template lia PT-BR e cores nao apareciam).
|
||||||
|
5 commits criados: 957e912, 6d9b36d, 269b531, 98f7252, 15103ed. Working tree
|
||||||
|
limpa. HANDOFF.md atualizado.
|
||||||
|
|||||||
Reference in New Issue
Block a user