Cleanup: backups antigos removidos + dashboard config + HANDOFF/log

- 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>
This commit is contained in:
Leonardo
2026-05-06 09:15:22 -03:00
parent 98f7252dcd
commit 15103eded5
11 changed files with 416 additions and 87153 deletions
+364 -572
View File
File diff suppressed because it is too large Load Diff
+15
View File
@@ -13,3 +13,18 @@ Chronological, append-only record of everything that's happened in this wiki.
**Quick access:** `grep "^## \[" log.md | tail -5` gives you the last 5 entries.
---
## [2026-05-05 23:45] session | Blueprint tabular Melissa + restore pacientes
Touched: none (sem mudança de wiki — handoff em HANDOFF.md)
Detalhes: criou `blueprints/melissa-table-page-blueprint.md` (~530L, 18 seções);
refatorou MelissaCadastrosRecebidos pro padrão (DataTable + frozen action +
view toggle list/grade); criou MelissaAgendamentosRecebidos nativa (substituindo
embed); MelissaPacientes ganhou subheader, sombras, status pills coloridas,
email/phone colunas próprias, mobile pencil+popover, view toggle, fix scroll
mobile (`min-height: 0` em `.mp-list`), botão Restaurar pra arquivados.
Repository: `restorePatient` novo. PatientsCadastroPage statusOpts: +Arquivado.
A66 V2 — user não gostou design, aguarda feedback específico.
## [2026-05-06 12:00] session | MelissaCompromissos refator blueprint
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.
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+22 -5
View File
@@ -132,7 +132,7 @@
"notification_templates", "notification_channels", "notification_preferences",
"notification_logs", "notification_schedules", "notification_queue",
"notifications", "notice_dismissals", "global_notices", "login_carousel_slides",
"twilio_subaccount_usage"
"twilio_subaccount_usage", "saas_twilio_config"
],
"CRM Conversas (WhatsApp)": [
"conversation_messages", "conversation_threads",
@@ -140,14 +140,30 @@
"conversation_tags", "conversation_thread_tags",
"conversation_optouts", "conversation_optout_keywords",
"conversation_autoreply_settings", "conversation_autoreply_log",
"session_reminder_settings", "session_reminder_logs"
"session_reminder_settings", "session_reminder_logs",
"conversation_assignments",
"conversation_bots", "conversation_bot_sessions",
"conversation_sla_rules", "conversation_sla_breaches",
"whatsapp_connection_incidents"
],
"Segurança / Rate limiting": [
"submission_rate_limits"
"Segurança / Auditoria": [
"submission_rate_limits",
"audit_logs",
"saas_security_config",
"math_challenges",
"patient_invite_attempts",
"public_submission_attempts"
],
"Central SaaS (docs/FAQ)": [
"saas_docs", "saas_doc_votos", "saas_faq", "saas_faq_itens"
],
"Dev / Tracking": [
"dev_auditoria_items", "dev_verificacoes_items", "dev_test_items",
"dev_roadmap_phases", "dev_roadmap_items",
"dev_competitors", "dev_competitor_features",
"dev_comparison_matrix", "dev_comparison_competitor_status",
"dev_generation_log"
],
"Estrutura / Calendário": [
"feriados"
]
@@ -163,8 +179,9 @@
"Documentos": "#0ea5e9",
"Comunicação / Notificações": "#fbbf24",
"CRM Conversas (WhatsApp)": "#25d366",
"Segurança / Rate limiting": "#ef4444",
"Segurança / Auditoria": "#ef4444",
"Central SaaS (docs/FAQ)": "#c084fc",
"Dev / Tracking": "#94a3b8",
"Estrutura / Calendário": "#fb923c"
},
"infrastructure": {
+4 -4
View File
@@ -305,7 +305,7 @@ function buildSB(){
</div>
<div class="sb-h" style="margin-top:8px">Domínios</div>\`;
for(const[d,ts]of Object.entries(D.domains)){
h+=\`<div class="sb-i \${dom===d?'active':''}" onclick="scrollToDomain(\`+JSON.stringify(d)+\`)">
h+=\`<div class="sb-i \${dom===d?'active':''}" onclick="scrollToDomain('\${D.slugs[d]}')">
<div class="sb-dot" style="background:\${gc(d)}"></div>\${escapeHtml(d)}
<span class="sb-c">\${ts.length}</span>
</div>\`;
@@ -349,7 +349,7 @@ function buildMN(){
<div class="dgrid">\`;
for(const[d,ts]of Object.entries(D.domains)){
const fks=ts.reduce((a,t)=>a+(D.tables[t]?.fks?.length||0),0);
h+=\`<div class="dc" style="--c:\${gc(d)}" onclick="scrollToDomain(\`+JSON.stringify(d)+\`)">
h+=\`<div class="dc" style="--c:\${gc(d)}" onclick="scrollToDomain('\${D.slugs[d]}')">
<div class="dc-n">\${escapeHtml(d)}</div>
<div class="dc-m"><span style="color:\${gc(d)}">\${ts.length}</span> tabelas · \${fks} FKs</div>
</div>\`;
@@ -420,7 +420,7 @@ function sel(d){
dom=d;view='overview';q='';document.getElementById('si').value='';
buildSB();buildMN();document.getElementById('mn').scrollTop=0;
}
function scrollToDomain(d){
function scrollToDomain(slug){
// Sempre ir pra overview (com todos os domínios visíveis) antes de scrollar
const needRebuild=view!=='overview'||dom!==null||q;
if(needRebuild){
@@ -429,7 +429,7 @@ function scrollToDomain(d){
buildSB();buildMN();
}
setTimeout(()=>{
const el=document.getElementById('dom-'+(D.slugs[d]||''));
const el=document.getElementById('dom-'+slug);
if(el) el.scrollIntoView({behavior:'smooth',block:'start'});
}, needRebuild?80:0);
}