From cf1cd67314895d8ba99f866689207042adfc6268 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Fri, 8 May 2026 19:38:41 -0300 Subject: [PATCH] MelissaPaciente: pre-popula eventRow com commitment_id + paciente nome/avatar/status MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit User detectou bug: jornada/freq/billing continuavam ocultos mesmo apos o fix do commit anterior, e o resumo lateral nao mostrava o nome do paciente apesar de aparecer no subtitle do header. Diagnostico correto: form.paciente_nome estava vazio. CAUSA: meu watch lockType (commit 73788c7) chamava selectCommitment APOS o lifecycle watcher do composer rodar resetForm(). Mas resetForm le do props.eventRow — e eu so passava paciente_id + tipo. Sem paciente_nome/avatar/status no eventRow, o form ficava com paciente_id solto e nome vazio. E sem determined_commitment_id, o lifecycle setava step=1 antes do meu watch tentar consertar via selectCommitment, gerando race condition (lifecycle await nextTick + resetForm DESFAZIA o trabalho do watch sync). FIX em goAgendar() do MelissaPaciente: 1. Acha o commitment "Sessão" (native_key='session') em melissaAgenda.commitmentOptions e pre-popula determined_commitment_id no eventRow. resetForm le isso e ja deixa form.commitment_id setado na inicializacao — isSessionEvent fica true imediatamente, sem precisar do watch lockType. 2. Pre-popula paciente_nome/avatar/status no eventRow direto dos computeds (nomeCompleto, avatarUrl, statusPaciente) que ja existem no MelissaPaciente desde a Fase 3. Composer s o faz fetch async de nome quando isEdit=true — pra criacao precisa vir no eventRow. Resultado: dialog abre ja com: - paciente_id + nome + avatar + status preenchidos no resumo lateral - commitment_id setado, isSessionEvent=true - Jornada de trabalho aparece - Billing radio (particular/convenio/gratuito) aparece - Frequencia aparece O watch lockType continua valido como redundancia (caso commitmentOptions chegue async), mas agora nao e mais o caminho principal. 301 specs passando. ESLint 0 errors da minha mudanca. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/layout/melissa/MelissaPaciente.vue | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/layout/melissa/MelissaPaciente.vue b/src/layout/melissa/MelissaPaciente.vue index 0c4056b..27df13b 100644 --- a/src/layout/melissa/MelissaPaciente.vue +++ b/src/layout/melissa/MelissaPaciente.vue @@ -495,16 +495,29 @@ function goAgendar() { const remainder = base.getMinutes() % 15; if (remainder !== 0) base.setMinutes(base.getMinutes() + (15 - remainder)); + // Acha o commitment "Sessão" (native_key='session') pra pre-popular o + // determined_commitment_id no eventRow — assim o resetForm do composer + // ja inicia com form.commitment_id setado, isSessionEvent=true e os + // blocos de jornada/billing/frequencia aparecem. + const sessaoCommitment = (melissaAgenda.commitmentOptions?.value || []) + .find((c) => c.native_key === 'session'); + + // Pre-popula tambem nome/avatar/status do paciente — sem isso o resumo + // lateral do dialog mostra "Paciente vinculado" sem nome (ja que o + // composer so faz fetch async de nome quando isEdit=true). sessaoDialogEventRow.value = { owner_id: melissaAgenda.ownerId.value, terapeuta_id: null, paciente_id: String(props.patientId), + paciente_nome: nomeCompleto.value || '', + paciente_avatar: avatarUrl.value || '', + paciente_status: statusPaciente.value || 'Ativo', + determined_commitment_id: sessaoCommitment?.id || null, tipo: 'sessao', status: 'agendado', titulo: null, observacoes: null, - visibility_scope: 'public', - determined_commitment_id: null + visibility_scope: 'public' }; sessaoDialogStartISO.value = base.toISOString(); sessaoDialogEndISO.value = new Date(base.getTime() + durMin * 60000).toISOString();