From 945c6eafb63ef696810ede26b9d60f4e142af611 Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 17 Sep 2025 22:51:30 -0300 Subject: [PATCH] fix: Calendar and sidebar --- .../app/(main-routes)/calendar/index.css | 41 ++ .../app/(main-routes)/calendar/page.tsx | 174 ++++++++ .../dashboard/pacientes/loading.tsx | 0 .../dashboard/pacientes/page.tsx | 4 +- .../app/(main-routes)/dashboard/page.tsx | 41 ++ susconecta/app/(main-routes)/layout.tsx | 22 ++ susconecta/app/agenda/page.tsx | 373 ++++++++++++++++++ susconecta/app/agendamento/page.tsx | 139 ------- susconecta/app/dashboard/layout.tsx | 19 - susconecta/app/dashboard/page.tsx | 29 -- susconecta/app/globals.css | 45 +-- susconecta/app/procedimento/page.tsx | 89 +++++ susconecta/components/agenda/FooterAgenda.tsx | 34 ++ susconecta/components/agenda/HeaderAgenda.tsx | 71 ++++ susconecta/components/agenda/page.tsx | 119 ------ susconecta/components/dashboard/header.tsx | 11 +- susconecta/components/dashboard/sidebar.tsx | 109 +++-- susconecta/components/header.tsx | 35 +- susconecta/lib/mocks/appointment-mocks.ts | 65 +++ 19 files changed, 1028 insertions(+), 392 deletions(-) create mode 100644 susconecta/app/(main-routes)/calendar/index.css create mode 100644 susconecta/app/(main-routes)/calendar/page.tsx rename susconecta/app/{ => (main-routes)}/dashboard/pacientes/loading.tsx (100%) rename susconecta/app/{ => (main-routes)}/dashboard/pacientes/page.tsx (99%) create mode 100644 susconecta/app/(main-routes)/dashboard/page.tsx create mode 100644 susconecta/app/(main-routes)/layout.tsx create mode 100644 susconecta/app/agenda/page.tsx delete mode 100644 susconecta/app/agendamento/page.tsx delete mode 100644 susconecta/app/dashboard/layout.tsx delete mode 100644 susconecta/app/dashboard/page.tsx create mode 100644 susconecta/app/procedimento/page.tsx create mode 100644 susconecta/components/agenda/FooterAgenda.tsx create mode 100644 susconecta/components/agenda/HeaderAgenda.tsx delete mode 100644 susconecta/components/agenda/page.tsx create mode 100644 susconecta/lib/mocks/appointment-mocks.ts diff --git a/susconecta/app/(main-routes)/calendar/index.css b/susconecta/app/(main-routes)/calendar/index.css new file mode 100644 index 0000000..c631baa --- /dev/null +++ b/susconecta/app/(main-routes)/calendar/index.css @@ -0,0 +1,41 @@ + +.fc-media-screen { + flex-grow: 1; + height: 74vh; +} + + +.fc-prev-button, +.fc-next-button { + background-color: var(--color-blue-600) !important; + border: none !important; + transition: 0.2s ease; +} + +.fc-prev-button:hover, +.fc-next-button:hover { + background-color: var(--color-blue-700) !important; +} + +.fc-timeGridWeek-button, +.fc-timeGridDay-button, +.fc-dayGridMonth-button { + border: none !important; + background-color: var(--color-blue-600) !important; + transition: 0.2s ease; +} + +.fc-timeGridWeek-button:hover, +.fc-timeGridDay-button:hover, +.fc-dayGridMonth-button:hover { + background-color: var(--color-blue-700) !important; +} + +.fc-button-active { + background-color: var(--color-blue-500) !important; +} + +.fc-toolbar-title { + font-weight: bold; + color: var(--color-gray-900); +} \ No newline at end of file diff --git a/susconecta/app/(main-routes)/calendar/page.tsx b/susconecta/app/(main-routes)/calendar/page.tsx new file mode 100644 index 0000000..dabcec7 --- /dev/null +++ b/susconecta/app/(main-routes)/calendar/page.tsx @@ -0,0 +1,174 @@ +"use client"; + +import { useEffect, useState } from "react"; +import dynamic from "next/dynamic"; +import pt_br_locale from "@fullcalendar/core/locales/pt-br"; +import FullCalendar from "@fullcalendar/react"; +import dayGridPlugin from "@fullcalendar/daygrid"; +import interactionPlugin from "@fullcalendar/interaction"; +import timeGridPlugin from "@fullcalendar/timegrid"; +import { EventInput } from "@fullcalendar/core/index.js"; +import { Sidebar } from "@/components/dashboard/sidebar"; +import { PagesHeader } from "@/components/dashboard/header"; +import { Button } from "@/components/ui/button"; +import { + mockAppointments, + mockWaitingList, +} from "@/lib/mocks/appointment-mocks"; +import "./index.css"; +import Link from "next/link"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; + +const ListaEspera = dynamic( + () => import("@/components/agendamento/ListaEspera"), + { ssr: false } +); + +export default function AgendamentoPage() { + const [appointments, setAppointments] = useState(mockAppointments); + const [waitingList, setWaitingList] = useState(mockWaitingList); + const [activeTab, setActiveTab] = useState<"calendar" | "espera">("calendar"); + const [requestsList, setRequestsList] = useState(); + + useEffect(() => { + document.addEventListener("keydown", (event) => { + if (event.key === "c") { + setActiveTab("calendar"); + } + if (event.key === "f") { + setActiveTab("espera"); + } + }); + }, []); + + useEffect(() => { + let events: EventInput[] = []; + appointments.forEach((obj) => { + const event: EventInput = { + title: `${obj.patient}: ${obj.type}`, + start: new Date(obj.time), + end: new Date(new Date(obj.time).getTime() + obj.duration * 60 * 1000), + color: + obj.status === "confirmed" + ? "#68d68a" + : obj.status === "pending" + ? "#ffe55f" + : "#ff5f5fff", + }; + events.push(event); + }); + setRequestsList(events); + }, [appointments]); + + // mantive para caso a lógica de salvar consulta passe a funcionar + const handleSaveAppointment = (appointment: any) => { + if (appointment.id) { + setAppointments((prev) => + prev.map((a) => (a.id === appointment.id ? appointment : a)) + ); + } else { + const newAppointment = { + ...appointment, + id: Date.now().toString(), + }; + setAppointments((prev) => [...prev, newAppointment]); + } + }; + + const handleNotifyPatient = (patientId: string) => { + console.log(`Notificando paciente ${patientId}`); + }; + + return ( +
+
+
+
+
+

{activeTab === "calendar" ? "Calendário" : "Lista de Espera"}

+

+ Navegue através dos atalhos: Calendário (C) ou Fila de espera + (F). +

+
+
+ {/* + + */} + + + Opções » + + + + Agendamento + + + Procedimento + + + Financeiro + + + + +
+ + + +
+
+
+ + {activeTab === "calendar" ? ( +
+ { + info.view.calendar.changeView("timeGridDay", info.dateStr); + }} + selectable={true} + selectMirror={true} + dayMaxEvents={true} + dayMaxEventRows={3} + /> +
+ ) : ( + {}} + /> + )} +
+
+
+ ); +} diff --git a/susconecta/app/dashboard/pacientes/loading.tsx b/susconecta/app/(main-routes)/dashboard/pacientes/loading.tsx similarity index 100% rename from susconecta/app/dashboard/pacientes/loading.tsx rename to susconecta/app/(main-routes)/dashboard/pacientes/loading.tsx diff --git a/susconecta/app/dashboard/pacientes/page.tsx b/susconecta/app/(main-routes)/dashboard/pacientes/page.tsx similarity index 99% rename from susconecta/app/dashboard/pacientes/page.tsx rename to susconecta/app/(main-routes)/dashboard/pacientes/page.tsx index 106bf4c..074b512 100644 --- a/susconecta/app/dashboard/pacientes/page.tsx +++ b/susconecta/app/(main-routes)/dashboard/pacientes/page.tsx @@ -140,7 +140,7 @@ export default function PacientesPage() { if (showForm) { return ( -
+
+ + {/* barra Documentos e anexos */} +
+ Documentos e anexos +
+ + + +
+
+
+ + {/* ==== INFORMAÇÕES DO ATENDIMENTO ==== */} +
+

Informações do atendimento

+ + {/* GRID PRINCIPAL: 12 colunas */} +
+ {/* COLUNA ESQUERDA (span 6) */} +
+ {/* Nome do profissional */} +
+ +
+ + + + RA + +
+
+ +
+ {/* Unidade */} +
+ + +
+ + {/* Data com ícone */} +
+ +
+ + +
+
+
+ + {/* Início / Término / Profissional solicitante (na mesma linha) */} +
+ {/* Início (maior) */} +
+ + +
+ + {/* Término (maior) */} +
+ + +
+ + {/* Profissional solicitante */} +
+ +
+ {/* ícone de busca à esquerda */} + + + + + + + + + + +
+
+
+
+ + {/* COLUNA DIREITA — altura/posição como a imagem 1 */} +
+ {/* toolbar */} +
+ + + + + +
+ + {/* Tipo de atendimento + campo de busca */} +
+
+ + +
+ +
+ + + +
+
+ + {/* Observações + imprimir */} +
+ + +
+ + {/* Textarea mais baixo e compacto */} +