diff --git a/src/layout/melissa/MelissaLayout.vue b/src/layout/melissa/MelissaLayout.vue index 0eed595..a005406 100644 --- a/src/layout/melissa/MelissaLayout.vue +++ b/src/layout/melissa/MelissaLayout.vue @@ -669,12 +669,24 @@ function fecharEvento() { // Sem isso, eventoSelecionado.value é snapshot do clique e não acompanha // updates do _paymentStateMap pós refetch (caso típico: revogar/antecipar // pagamento — record muda mas popover continuava mostrando estado antigo). -// Watch dispara apenas quando o ev correspondente aparece novo no eventos -// computed (paymentState atualizado pelo bulk-load). +// Lookup em 2 etapas: +// 1) match por id (caso comum — evento real persistente) +// 2) match por recurrence_id+recurrence_date (caso virtual → materializada: +// id muda de `rec::rule::date` pra uuid real após antecipar/Usar/etc). +// Sem o 2o lookup, popover ficava preso na versão virtual após o evento +// virar real — exemplo: revoguei antecipação, "Usar" não aparecia porque +// ev ainda era a versão virtual stale. watch(() => M.eventos.value, (novos) => { const sel = eventoSelecionado.value; if (!sel?.id) return; - const fresh = novos.find((e) => e.id === sel.id); + let fresh = novos.find((e) => e.id === sel.id); + if (!fresh && sel.recurrence_id && sel.recurrence_date) { + fresh = novos.find((e) => + !e.is_occurrence && + e.recurrence_id === sel.recurrence_id && + e.recurrence_date === sel.recurrence_date + ); + } if (fresh && fresh !== sel) { eventoSelecionado.value = fresh; }