From b7f3c23ad6c6bd9472d26b2770363a8d398f3ee5 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Thu, 21 May 2026 05:31:01 -0300 Subject: [PATCH] agenda C12 UX: filtrar cancelled do dialog Lancamentos da sessao MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Iteracao UX #2 do C12: records cancelled (do ciclo Revogar+Antecipar e tambem das multas) poluiam o dialog "Lancamentos da sessao", escondendo o que importa (ativos). lancamentosShowHistory ref (default false) + lancamentosFiltered computed filtra status !== 'cancelled'. lancamentosCancelledCount computa contagem pra feedback. UI: - Dialog abre limpo (sempre lancamentosShowHistory=false em onVerLancamentos) - Quando ha cancelled e existe ativo: linha acima da lista com "{N} cancelado(s) ocultos" + botao toggle "Mostrar/Ocultar historico" - Quando todos sao cancelled: empty state especial "Sem lancamentos ativos. {N} cancelado(s) no historico" + botao pra expandir - Cards cancelled atenuados (opacity 0.55, border-dashed, background sutil, description com line-through) — claramente audit trail, nao-ativo Combina com "Trocar metodo" (commit anterior) — agora o caso 99% do tempo ele ve so o record ativo, nao precisa nem expandir historico. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/layout/melissa/MelissaLayout.vue | 45 ++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/src/layout/melissa/MelissaLayout.vue b/src/layout/melissa/MelissaLayout.vue index 4644a34..4c5d062 100644 --- a/src/layout/melissa/MelissaLayout.vue +++ b/src/layout/melissa/MelissaLayout.vue @@ -751,6 +751,17 @@ const lancamentosDialogOpen = ref(false); const lancamentosList = ref([]); const lancamentosLoading = ref(false); const lancamentosEventoTitulo = ref(''); +// Por default esconde cancelled (poluem o que importa quando user só +// quer ver os ativos). Toggle 'Mostrar histórico' libera audit trail. +// Resetado a cada abertura do dialog (onVerLancamentos). +const lancamentosShowHistory = ref(false); +const lancamentosFiltered = computed(() => { + if (lancamentosShowHistory.value) return lancamentosList.value; + return lancamentosList.value.filter((r) => r.status !== 'cancelled'); +}); +const lancamentosCancelledCount = computed(() => + lancamentosList.value.filter((r) => r.status === 'cancelled').length +); // Antecipar pagamento (Fase 5, 2026-05-14): paciente quer pagar antes da // sessão (caso típico em pacote saldo). Materializa a ocorrência (se virtual) // + cria financial_record paid (PIX/etc) ou pending (Asaas). NÃO decrementa @@ -1088,6 +1099,7 @@ async function onVerLancamentos() { const isVirtual = ev.is_occurrence || isVirtualId; lancamentosEventoTitulo.value = ev.pacienteNome || ev.label || ev.titulo || 'Sessão'; + lancamentosShowHistory.value = false; // sempre abre limpo (sem cancelled) lancamentosDialogOpen.value = true; lancamentosLoading.value = true; try { @@ -3221,12 +3233,29 @@ function onKeydown(e) {
Nenhum lançamento vinculado a esta sessão.
+
+ Sem lançamentos ativos. {{ lancamentosCancelledCount }} cancelado(s) no histórico. +
+
+
+ +
+ {{ lancamentosCancelledCount }} cancelado(s) ocultos. +
@@ -3853,6 +3882,18 @@ function onKeydown(e) { margin-left: 1.5rem; border-color: color-mix(in srgb, var(--p-primary-color) 25%, var(--surface-border)); } +/* Cancelled — apenas visíveis quando user expande o histórico. + Visual atenuado pra sinalizar "audit trail, não-ativo". */ +.ml-lanc-card--cancelled { + opacity: 0.55; + border-style: dashed; + background: color-mix(in srgb, var(--surface-ground) 60%, transparent); +} +.ml-lanc-card--cancelled .ml-lanc-card__desc { + text-decoration: line-through; + text-decoration-color: currentColor; + text-decoration-thickness: 1px; +} .ml-lanc-card__head { display: flex; align-items: center;