From 667ef625e40ce6c6d73c9661fc181055de17d96c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Gustavo?= Date: Wed, 3 Dec 2025 17:16:04 -0300 Subject: [PATCH 1/3] fix: edit-report --- susconecta/app/laudos/[id]/editar/page.tsx | 13 +++++++++++-- susconecta/app/profissional/page.tsx | 12 +++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/susconecta/app/laudos/[id]/editar/page.tsx b/susconecta/app/laudos/[id]/editar/page.tsx index ea6df2a..e6f864e 100644 --- a/susconecta/app/laudos/[id]/editar/page.tsx +++ b/susconecta/app/laudos/[id]/editar/page.tsx @@ -175,8 +175,17 @@ export default function EditarLaudoPage() { mostrarAssinatura: !r.hide_signature, }); - // Preencher conteúdo - const contentHtml = r.content_html || r.conteudo_html || ''; + // Preencher conteúdo - verificar todos os possíveis nomes de campo + const contentHtml = r.content_html || r.conteudo_html || r.contentHtml || r.conteudo || r.content || ''; + console.log('[EditarLaudoPage] Loading content - report:', r); + console.log('[EditarLaudoPage] Content fields check:', { + content_html: r.content_html, + conteudo_html: r.conteudo_html, + contentHtml: r.contentHtml, + conteudo: r.conteudo, + content: r.content, + finalContent: contentHtml + }); // Verificar se existe rascunho salvo no localStorage let finalContent = contentHtml; diff --git a/susconecta/app/profissional/page.tsx b/susconecta/app/profissional/page.tsx index 00a9662..b464818 100644 --- a/susconecta/app/profissional/page.tsx +++ b/susconecta/app/profissional/page.tsx @@ -1788,7 +1788,15 @@ const ProfissionalPage = () => { function LaudoEditor({ pacientes, laudo, onClose, isNewLaudo, preSelectedPatient, createNewReport, updateExistingReport, reloadReports, onSaved }: { pacientes?: any[]; laudo?: any; onClose: () => void; isNewLaudo?: boolean; preSelectedPatient?: any; createNewReport?: (data: any) => Promise; updateExistingReport?: (id: string, data: any) => Promise; reloadReports?: () => Promise; onSaved?: (r:any) => void }) { const { toast } = useToast(); const [activeTab, setActiveTab] = useState("editor"); - const [content, setContent] = useState(laudo?.conteudo || ""); + // Initialize content checking all possible field names + const initialContent = laudo?.conteudo ?? laudo?.content_html ?? laudo?.contentHtml ?? laudo?.content ?? ""; + console.log('[LaudoEditor] Initializing content - laudo:', laudo, 'initialContent length:', initialContent?.length, 'fields:', { + conteudo: laudo?.conteudo, + content_html: laudo?.content_html, + contentHtml: laudo?.contentHtml, + content: laudo?.content + }); + const [content, setContent] = useState(initialContent); const [showPreview, setShowPreview] = useState(false); const [pacienteSelecionado, setPacienteSelecionado] = useState(preSelectedPatient || null); const [listaPacientes, setListaPacientes] = useState([]); @@ -1875,8 +1883,10 @@ const ProfissionalPage = () => { // Carregar dados do laudo existente quando disponível (mais robusto: suporta vários nomes de campo) useEffect(() => { if (laudo && !isNewLaudo) { + console.log('[LaudoEditor useEffect] Loading existing laudo data:', laudo); // Conteúdo: aceita 'conteudo', 'content_html', 'contentHtml', 'content' const contentValue = laudo.conteudo ?? laudo.content_html ?? laudo.contentHtml ?? laudo.content ?? ""; + console.log('[LaudoEditor useEffect] Content value length:', contentValue?.length, 'Setting content...'); setContent(contentValue); // Campos: use vários fallbacks From 31b4472aee980adc2acb1e51fc9e3355de913712 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Gustavo?= Date: Wed, 3 Dec 2025 17:21:38 -0300 Subject: [PATCH 2/3] fix: deploy --- susconecta/app/laudos/[id]/editar/page.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/susconecta/app/laudos/[id]/editar/page.tsx b/susconecta/app/laudos/[id]/editar/page.tsx index e6f864e..bd6efc9 100644 --- a/susconecta/app/laudos/[id]/editar/page.tsx +++ b/susconecta/app/laudos/[id]/editar/page.tsx @@ -215,10 +215,9 @@ export default function EditarLaudoPage() { setCampos(finalCampos); setContent(finalContent); + console.log('[EditarLaudoPage] Setting content state with length:', finalContent.length); - if (editorRef.current) { - editorRef.current.innerHTML = finalContent; - } + // O innerHTML será setado no useEffect separado abaixo } catch (err) { console.warn('Erro ao carregar laudo:', err); toast({ @@ -233,6 +232,14 @@ export default function EditarLaudoPage() { fetchLaudo(); }, [laudoId, token, toast]); + // UseEffect separado para injetar o conteúdo no editor quando estiver pronto + useEffect(() => { + if (content && editorRef.current && !loading) { + console.log('[EditarLaudoPage] Injecting content into editor, length:', content.length); + editorRef.current.innerHTML = content; + } + }, [content, loading]); + // Formatação com contenteditable const applyFormat = (command: string, value?: string) => { document.execCommand(command, false, value || undefined); From 78e37220b6bd42de8f08a4bdc07a5a138fa10e79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Gustavo?= Date: Wed, 3 Dec 2025 18:18:00 -0300 Subject: [PATCH 3/3] fix: doctor-availabity --- .../app/(main-routes)/consultas/page.tsx | 9 ++- .../app/(main-routes)/doutores/page.tsx | 40 +++++++++++++- .../features/forms/availability-form.tsx | 55 +++++++++++++++---- 3 files changed, 87 insertions(+), 17 deletions(-) diff --git a/susconecta/app/(main-routes)/consultas/page.tsx b/susconecta/app/(main-routes)/consultas/page.tsx index ac76758..6d0ccaa 100644 --- a/susconecta/app/(main-routes)/consultas/page.tsx +++ b/susconecta/app/(main-routes)/consultas/page.tsx @@ -111,8 +111,11 @@ export default function ConsultasPage() { const baseDate = scheduledBase ? new Date(scheduledBase) : new Date(); const duration = appointment.duration_minutes ?? appointment.duration ?? 30; - // compute start and end times (HH:MM) - const appointmentDateStr = baseDate.toISOString().split("T")[0]; + // compute start and end times (HH:MM) and date using local time to avoid timezone issues + const year = baseDate.getFullYear(); + const month = String(baseDate.getMonth() + 1).padStart(2, '0'); + const day = String(baseDate.getDate()).padStart(2, '0'); + const appointmentDateStr = `${year}-${month}-${day}`; const startTime = `${String(baseDate.getHours()).padStart(2, '0')}:${String(baseDate.getMinutes()).padStart(2, '0')}`; const endDate = new Date(baseDate.getTime() + duration * 60000); const endTime = `${String(endDate.getHours()).padStart(2, '0')}:${String(endDate.getMinutes()).padStart(2, '0')}`; @@ -811,7 +814,7 @@ export default function ConsultasPage() {
- {capitalize(viewingAppointment?.type || "")} + {capitalize(viewingAppointment?.appointment_type || viewingAppointment?.type || "")}
diff --git a/susconecta/app/(main-routes)/doutores/page.tsx b/susconecta/app/(main-routes)/doutores/page.tsx index 1b6098d..72373f0 100644 --- a/susconecta/app/(main-routes)/doutores/page.tsx +++ b/susconecta/app/(main-routes)/doutores/page.tsx @@ -131,6 +131,7 @@ export default function DoutoresPage() { const [availabilityOpenFor, setAvailabilityOpenFor] = useState(null); const [availabilityViewingFor, setAvailabilityViewingFor] = useState(null); const [availabilities, setAvailabilities] = useState([]); + const [availabilitiesForCreate, setAvailabilitiesForCreate] = useState([]); const [availLoading, setAvailLoading] = useState(false); const [editingAvailability, setEditingAvailability] = useState(null); const [exceptions, setExceptions] = useState([]); @@ -633,7 +634,17 @@ export default function DoutoresPage() { Ver pacientes atribuídos - setAvailabilityOpenFor(doctor)}> + { + try { + const list = await listarDisponibilidades({ doctorId: doctor.id, active: true }); + setAvailabilitiesForCreate(list || []); + setAvailabilityOpenFor(doctor); + } catch (e) { + console.warn('Erro ao carregar disponibilidades:', e); + setAvailabilitiesForCreate([]); + setAvailabilityOpenFor(doctor); + } + }}> Criar disponibilidade @@ -869,6 +880,7 @@ export default function DoutoresPage() { open={!!availabilityOpenFor} onOpenChange={(open) => { if (!open) setAvailabilityOpenFor(null); }} doctorId={availabilityOpenFor?.id} + existingAvailabilities={availabilitiesForCreate} onSaved={(saved) => { console.log('Disponibilidade salva', saved); setAvailabilityOpenFor(null); /* optionally reload list */ reloadAvailabilities(availabilityOpenFor?.id); }} /> )} @@ -890,6 +902,7 @@ export default function DoutoresPage() { doctorId={editingAvailability?.doctor_id ?? availabilityViewingFor?.id} availability={editingAvailability} mode="edit" + existingAvailabilities={availabilities} onSaved={(saved) => { console.log('Disponibilidade atualizada', saved); setEditingAvailability(null); reloadAvailabilities(editingAvailability?.doctor_id ?? availabilityViewingFor?.id); }} /> )} @@ -910,14 +923,35 @@ export default function DoutoresPage() {
Carregando disponibilidades…
) : availabilities && availabilities.length ? (
- {availabilities.map((a) => ( + {availabilities + .sort((a, b) => { + // Define a ordem dos dias da semana (Segunda a Domingo) + const weekdayOrder: Record = { + 'segunda': 1, 'segunda-feira': 1, 'mon': 1, 'monday': 1, '1': 1, + 'terca': 2, 'terça': 2, 'terça-feira': 2, 'tue': 2, 'tuesday': 2, '2': 2, + 'quarta': 3, 'quarta-feira': 3, 'wed': 3, 'wednesday': 3, '3': 3, + 'quinta': 4, 'quinta-feira': 4, 'thu': 4, 'thursday': 4, '4': 4, + 'sexta': 5, 'sexta-feira': 5, 'fri': 5, 'friday': 5, '5': 5, + 'sabado': 6, 'sábado': 6, 'sat': 6, 'saturday': 6, '6': 6, + 'domingo': 7, 'dom': 7, 'sun': 7, 'sunday': 7, '0': 7, '7': 7 + }; + + const getWeekdayOrder = (weekday: any) => { + if (typeof weekday === 'number') return weekday === 0 ? 7 : weekday; + const normalized = String(weekday).toLowerCase().normalize('NFD').replace(/\p{Diacritic}/gu, ''); + return weekdayOrder[normalized] || 999; + }; + + return getWeekdayOrder(a.weekday) - getWeekdayOrder(b.weekday); + }) + .map((a) => (
{translateWeekday(a.weekday)} • {a.start_time} — {a.end_time}
Duração: {a.slot_minutes} min • Tipo: {a.appointment_type || '—'} • {a.active ? 'Ativa' : 'Inativa'}
- + - +