diff --git a/src/components/AgendarConsulta/FormNovaConsulta.jsx b/src/components/AgendarConsulta/FormNovaConsulta.jsx index 0ab474d..53f63c7 100644 --- a/src/components/AgendarConsulta/FormNovaConsulta.jsx +++ b/src/components/AgendarConsulta/FormNovaConsulta.jsx @@ -1,12 +1,18 @@ -import React, { useState, useEffect } from "react"; + import InputMask from "react-input-mask"; -import "./style/styleagendamentos.css"; +import "./style/formagendamentos.css"; +import { useState, useEffect } from "react"; + const FormNovaConsulta = ({ onCancel, patientID }) => { + const [selectedFile, setSelectedFile] = useState(null); const [anexos, setAnexos] = useState([]); const [loadingAnexos, setLoadingAnexos] = useState(false); - useEffect(() => { + const [paciente, setPaciente] = useState({}) + const [acessibilidade, setAcessibilidade] = useState({cadeirante:false,idoso:false,gravida:false,bebe:false, autista:false }) + + useEffect(() => { if (!patientID) return; const fetchAnexos = async () => { @@ -48,6 +54,102 @@ const FormNovaConsulta = ({ onCancel, patientID }) => { } }; + + const handleclickAcessibilidade = (id) => { + let resultado = acessibilidade[id] + + if(resultado === false){ setAcessibilidade({...acessibilidade, [id]:true}); console.log('mudou')} + + else if(resultado === true){ setAcessibilidade({...acessibilidade, [id]:false})} + console.log(id) + } + + + const FormatCPF = (valor) => { + console.log(valor) + + const digits = String(valor).replace(/\D/g, '').slice(0, 11); + BuscarPacienteExistentePeloCPF(valor) + + return digits + .replace(/(\d{3})(\d)/, '$1.$2') + .replace(/(\d{3})(\d)/, '$1.$2') + .replace(/(\d{3})(\d{1,2})$/, '$1-$2'); + } + + + const BuscarCPFnoBancodeDados = async (cpf) => { + + var myHeaders = new Headers(); + myHeaders.append("Authorization", "Bearer "); + myHeaders.append("Content-Type", "application/json"); + + var raw = JSON.stringify({ + "cpf": cpf + }); + + var requestOptions = { + method: 'POST', + headers: myHeaders, + body: raw, + redirect: 'follow' + }; + + const response = await fetch("https://mock.apidog.com/m1/1053378-0-default/pacientes/validar-cpf", requestOptions); + const result = await response.json(); + return result + + + } + + const BuscarPacienteExistentePeloCPF = async (value) => { + + if(isNaN(value[13]) === false && value.length === 14)try { + const result = await BuscarCPFnoBancodeDados(value); + console.log("Resultado:", result); + + if (result.data.existe === true){ + + var myHeaders = new Headers(); + myHeaders.append("Authorization", "Bearer "); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://mock.apidog.com/m1/1053378-0-default/pacientes/", requestOptions) + .then(response => response.json()) + .then(result => setPaciente(result.data)) + .catch(error => console.log('error', error)); + } + + + + } catch (error) { + console.log("error", error); + } + //BuscarCPFnoBancodeDados(value) + } + + const handleChange = (e) => { + + const {value, name} = e.target; + + console.log(value, name) + + if(name === 'email'){ + setPaciente({...paciente, contato:{ + ...paciente.contato, + email:value + }}) + + }else{ + setPaciente({...paciente,[name]:value}) + } + } + const handleSubmit = (e) => { e.preventDefault(); alert("Agendamento salvo!"); @@ -60,43 +162,63 @@ const FormNovaConsulta = ({ onCancel, patientID }) => {

Informações do paciente

-
- - +
+
+ + +
- - - {(inputProps) => } - +
+ + + e.target.value = FormatCPF(e.target.value)} /> + +
- - +
+ + +
- - +
+
+ + +
- - - {(inputProps) => } - +
+ + + {(inputProps) => } + +
- - - - - - - - +
+ + +
+
+
+ +
+ + +
+
+ + +
+ +
- - {(inputProps) => } - + +
+

Informações adicionais

@@ -124,59 +246,107 @@ const FormNovaConsulta = ({ onCancel, patientID }) => { )}

Informações do atendimento

+ + +
+ +
handleclickAcessibilidade(e.currentTarget.id)}> + + accessible +
- - +
handleclickAcessibilidade(e.currentTarget.id)}> + elderly +
+ +
handleclickAcessibilidade(e.currentTarget.id)}> + pregnant_woman +
+ +
handleclickAcessibilidade(e.currentTarget.id)}> + - - +
- - +
handleclickAcessibilidade(e.currentTarget.id)}> + +
+ +
- - +
+ +
+ + +
+ - - - - - - - - - - - - - - - - -

Acessibilidade

-
- - - - +
+ + +
-
- +
+
+ +
+
+ + +
+ + + +
+ + +
+
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+
+
+ +
+ + +
+ + +
+
+
+ +
+
+
); }; diff --git a/src/components/AgendarConsulta/TabelaAgendamentoMes.jsx b/src/components/AgendarConsulta/TabelaAgendamentoMes.jsx index 924332f..55d8cf9 100644 --- a/src/components/AgendarConsulta/TabelaAgendamentoMes.jsx +++ b/src/components/AgendarConsulta/TabelaAgendamentoMes.jsx @@ -47,7 +47,7 @@ const TabelaAgendamentoMes = ({ListarDiasdoMes}) => { ))}
{dias.segunda.length > 3 ? -

+ {dias.segunda.length - 3}

+

+ {dias.segunda.length - 3}

: null} @@ -65,7 +65,7 @@ const TabelaAgendamentoMes = ({ListarDiasdoMes}) => { ))} {dias.terca.length > 3 ? -

+ {dias.terca.length - 3}

+

+ {dias.terca.length - 3}

: null} @@ -83,7 +83,7 @@ const TabelaAgendamentoMes = ({ListarDiasdoMes}) => { ))} {dias.quarta.length > 3 ? -

+ {dias.quarta.length - 3}

+

+ {dias.quarta.length - 3}

: null} @@ -101,7 +101,7 @@ const TabelaAgendamentoMes = ({ListarDiasdoMes}) => { ))} {dias.quinta.length > 3 ? -

+ {dias.quinta.length - 3}

+

+ {dias.quinta.length - 3}

: null} @@ -119,7 +119,7 @@ const TabelaAgendamentoMes = ({ListarDiasdoMes}) => { ))} {dias.sexta.length > 3 ? -

+ {dias.sexta.length - 3}

+

+ {dias.sexta.length - 3}

: null} diff --git a/src/components/AgendarConsulta/style/formagendamentos.css b/src/components/AgendarConsulta/style/formagendamentos.css new file mode 100644 index 0000000..afb1403 --- /dev/null +++ b/src/components/AgendarConsulta/style/formagendamentos.css @@ -0,0 +1,210 @@ +@import url('https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined'); + +.icons-container { + display: flex; + gap: 10px; + justify-content: flex-end; + margin-bottom: -7px; +} + +.acessibilidade-ativado{ + background-color: #1e3a8a; + border: none; +} +.acessibilidade-ativado svg, .acessibilidade-ativado .icon{ + color: white; +} + + +.icons-div{ + border: 1px solid #607080; + padding: 10px; + display: flex; + align-items: center; + justify-content: center; + height: 40px; + width: 40px; + border-radius: 10px; + cursor: pointer; + transition: 0.3s; +} + +.icons-div:hover{ + background-color: #1e3a8a; + } + .icons-div:hover svg, .icons-div:hover .icon{ + color:white; + } + +svg{ + color:black; + +} +.icon { + font-family: 'Material Symbols Outlined'; + font-size: 20px; + color:black + + +} + +.form-container { + /*max-width: 800px;*/ + margin: 20px auto; + padding: 25px; + background: #f5f8ff; + border-radius: 12px; + font-family: Arial, sans-serif; +} + +.form-title { + font-size: 26px; + font-weight: bold; + color: #1e3a8a; + margin-bottom: 20px; +} + +.form-agendamento label { + display: block; + margin-top: 12px; + font-weight: bold; + color: #333; +} + +.form-agendamento input, +.form-agendamento select, +.form-agendamento textarea { + width: 100%; + padding: 8px; + margin-top: 6px; + border: 1px solid #ccc; + border-radius: 6px; + font-size: 14px; +} + +.section-title { + font-size: 20px; + margin-top: 25px; + color: #1e40af; +} + +.section-subtitle { + font-size: 16px; + margin-top: 20px; + color: #374151; +} + +.btn-group button { + margin-right: 8px; + padding: 8px 12px; + border: 1px solid #1e3a8a; + border-radius: 6px; + background: #fff; + cursor: pointer; +} + +.btn-group button:hover { + background: #e0e7ff; +} + +.form-actions { + margin-top: 25px; + display: flex; + gap: 12px; +} + +.btn-primary { + background: #1e3a8a; + color: white; + border: none; + padding: 10px 18px; + border-radius: 6px; + cursor: pointer; +} + +.btn-primary:hover { + background: #172554; +} + +.btn-cancel { + background: #e5e7eb; + border: none; + padding: 10px 18px; + border-radius: 6px; + cursor: pointer; +} + +.btn-cancel:hover { + background: #d1d5db; +} + +.btn-secondary { + margin: 10px 0; + background: #f3f4f6; + padding: 8px 14px; + border: 1px solid #9ca3af; + border-radius: 6px; + cursor: pointer; +} + +.btn-secondary:hover { + background: #e5e7eb; +} + + +.cardconsulta-infosecundaria{ + font-size: small; +} + +.campos-informacoes-paciente,.campo-informacoes-atendimento{ + display: flex; + gap: 10px; + flex-direction: row; +} + +.campo-de-input{ + display: flex; + flex-direction: column; + +} + + +#informacoes-atendimento-segunda-linha{ + margin-top: 10px; + display: flex; + flex-direction: row; + gap: 4rem; +} + +textarea{ + width: 30px; + resize: both; +} + +.campos-informacoes-paciente, +.campo-informacoes-atendimento { + display: flex; + gap: 16px; /* espaço entre campos */ +} + +.campo-de-input { + flex: 1; /* todos os filhos ocupam mesmo espaço */ + display: flex; + flex-direction: column; /* mantém label em cima do input */ +} + +#informacoes-atendimento-segunda-linha-esquerda select[name="unidade"]{ + width: 300px; +} + +input[type="time"]{ + width: 150px; +} + +select[name=solicitante]{ + width: 190px; +} + +.campo-de-input{ + width:120% +} diff --git a/src/components/AgendarConsulta/style/styleTabelas/tabeladia.css b/src/components/AgendarConsulta/style/styleTabelas/tabeladia.css index bc1a179..a242ba0 100644 --- a/src/components/AgendarConsulta/style/styleTabelas/tabeladia.css +++ b/src/components/AgendarConsulta/style/styleTabelas/tabeladia.css @@ -51,8 +51,9 @@ font-weight: 600; padding: 8px; } -/* Ajuste para a classe .diadia, se for usada */ -.diadia { +/* Ajuste para a classe calendario, se for usada */ +/* +.calendario { margin-top: 20px; border-collapse: collapse; width: 100%; @@ -61,7 +62,7 @@ font-weight: 600; box-shadow: 0 4px 12px rgb(255, 255, 255); border: 10px solid #ffffffc5; background-color: rgb(253, 253, 253); -} +}*/ .mostrar-horario td, .mostrar-horario th { diff --git a/src/components/AgendarConsulta/style/styleTabelas/tabelames.css b/src/components/AgendarConsulta/style/styleTabelas/tabelames.css index 6df085d..fbce17b 100644 --- a/src/components/AgendarConsulta/style/styleTabelas/tabelames.css +++ b/src/components/AgendarConsulta/style/styleTabelas/tabelames.css @@ -147,4 +147,10 @@ padding: 4px 8px; margin-bottom: 5px; border-radius: 4px; +} + +.cards-que-faltam{ + color: #005a9e; + font-weight: bold; + font-size: larger; } \ No newline at end of file diff --git a/src/components/AgendarConsulta/style/styleTabelas/tabelasemana.css b/src/components/AgendarConsulta/style/styleTabelas/tabelasemana.css index d2692d3..70cdeef 100644 --- a/src/components/AgendarConsulta/style/styleTabelas/tabelasemana.css +++ b/src/components/AgendarConsulta/style/styleTabelas/tabelasemana.css @@ -56,17 +56,7 @@ padding: 12px; } -/* Ajuste para a classe .diadia, se for usada */ -.diadia { - margin-top: 20px; - border-collapse: collapse; - width: 100%; - border-radius: 10px; - overflow: hidden; - box-shadow: 0 4px 12px rgb(255, 255, 255); - border: 10px solid #ffffffc5; - background-color: rgb(253, 253, 253); -} +/* Ajuste para a classe .calendario, se for usada */ .tabelasemanal tr:nth-child(even) { background-color: #e7e7e7a6 !important; @@ -80,3 +70,7 @@ .tabelasemanal tr:hover { background-color: #f1f1f1 !important; } + +tr{ + width: 1000px; +} \ No newline at end of file diff --git a/src/components/AgendarConsulta/style/styleagendamentos.css b/src/components/AgendarConsulta/style/styleagendamentos.css deleted file mode 100644 index bcdc8db..0000000 --- a/src/components/AgendarConsulta/style/styleagendamentos.css +++ /dev/null @@ -1,108 +0,0 @@ -.form-container { - max-width: 800px; - margin: 20px auto; - padding: 25px; - background: #f5f8ff; - border-radius: 12px; - font-family: Arial, sans-serif; -} - -.form-title { - font-size: 26px; - font-weight: bold; - color: #1e3a8a; - margin-bottom: 20px; -} - -.form-agendamento label { - display: block; - margin-top: 12px; - font-weight: bold; - color: #333; -} - -.form-agendamento input, -.form-agendamento select, -.form-agendamento textarea { - width: 100%; - padding: 8px; - margin-top: 6px; - border: 1px solid #ccc; - border-radius: 6px; - font-size: 14px; -} - -.section-title { - font-size: 20px; - margin-top: 25px; - color: #1e40af; -} - -.section-subtitle { - font-size: 16px; - margin-top: 20px; - color: #374151; -} - -.btn-group button { - margin-right: 8px; - padding: 8px 12px; - border: 1px solid #1e3a8a; - border-radius: 6px; - background: #fff; - cursor: pointer; -} - -.btn-group button:hover { - background: #e0e7ff; -} - -.form-actions { - margin-top: 25px; - display: flex; - gap: 12px; -} - -.btn-primary { - background: #1e3a8a; - color: white; - border: none; - padding: 10px 18px; - border-radius: 6px; - cursor: pointer; -} - -.btn-primary:hover { - background: #172554; -} - -.btn-cancel { - background: #e5e7eb; - border: none; - padding: 10px 18px; - border-radius: 6px; - cursor: pointer; -} - -.btn-cancel:hover { - background: #d1d5db; -} - -.btn-secondary { - margin: 10px 0; - background: #f3f4f6; - padding: 8px 14px; - border: 1px solid #9ca3af; - border-radius: 6px; - cursor: pointer; -} - -.btn-secondary:hover { - background: #e5e7eb; -} - - -.cardconsulta-infosecundaria{ - font-size: small; -} - diff --git a/src/components/ProfileCard.js b/src/components/ProfileCard.js index 64b88b2..7a5b181 100644 --- a/src/components/ProfileCard.js +++ b/src/components/ProfileCard.js @@ -1,4 +1,4 @@ -import React from 'react'; +/*import React from 'react'; function ProfileCard() { return ( @@ -18,4 +18,4 @@ function ProfileCard() { ); } -export default ProfileCard; \ No newline at end of file +export default ProfileCard;*/ \ No newline at end of file diff --git a/src/pages/Agendamento.jsx b/src/pages/Agendamento.jsx index 66349fd..b008dc0 100644 --- a/src/pages/Agendamento.jsx +++ b/src/pages/Agendamento.jsx @@ -10,6 +10,11 @@ import "./style/Agendamento.css"; const Agendamento = () => { + const [FiladeEspera, setFiladeEspera] = useState(false) + const [tabela, setTabela] = useState('diario') + const [PageNovaConsulta, setPageConsulta] = useState(false) + + const ListarDiasdoMes = (ano, mes) => { let segundas = []; let tercas = []; let quartas = []; let quintas = []; let sextas = [] @@ -54,8 +59,6 @@ const Agendamento = () => { return ListaDiasDatas } - const [tabela, setTabela] = useState('diario') - const [PageNovaConsulta, setPageConsulta] = useState(false) const handleClickAgendamento = (agendamento) => { @@ -76,6 +79,7 @@ const Agendamento = () => {

Agendar nova consulta

+ {!PageNovaConsulta? (
@@ -106,27 +110,41 @@ const Agendamento = () => { -
-
-
- - - +
+ + +
-
+
+ {FiladeEspera ===false ? + +
+ + + +
+
+ +
+ + + +
+ +
Realizado @@ -142,6 +160,12 @@ const Agendamento = () => { Cancelado
+ +
+ + + + {tabela === "diario" && ( { )}
+
: + +
+
+
+ + } +
) : ( diff --git a/src/pages/DoctorDetails.jsx b/src/pages/DoctorDetails.jsx index 25a26e4..c8b7726 100644 --- a/src/pages/DoctorDetails.jsx +++ b/src/pages/DoctorDetails.jsx @@ -111,7 +111,7 @@ const Details = ({ patientID, setCurrentPage }) => {
-

{paciente.anexos || "-"}

+

{ "-"}

diff --git a/src/pages/PatientCadastroManager.jsx b/src/pages/PatientCadastroManager.jsx index e33e7d4..339d3b9 100644 --- a/src/pages/PatientCadastroManager.jsx +++ b/src/pages/PatientCadastroManager.jsx @@ -1,11 +1,10 @@ -import React, { useState } from 'react'; +import { useState } from 'react'; -// Importamos os dois novos componentes que criamos import PatientForm from '../components/patients/PatientForm'; function PatientCadastroManager( {setCurrentPage} ) { - // Este estado vai controlar qual "tela" mostrar: 'list' (lista) ou 'form' (formulário) + const [formData, setFormData] = useState({}) diff --git a/src/pages/Table.jsx b/src/pages/Table.jsx index 1ad96dd..bfc0e06 100644 --- a/src/pages/Table.jsx +++ b/src/pages/Table.jsx @@ -29,8 +29,6 @@ function TablePaciente({ setCurrentPage, setPatientID }) { } - - const DeleteAnexo = async (patientID) => { @@ -61,17 +59,10 @@ function TablePaciente({ setCurrentPage, setPatientID }) { } - - - // Função para excluir paciente const deletePatient = async (id) => { - DeleteAnexo(id) - - - const requestOptionsDelete = { method: "DELETE", redirect: "follow" }; if (!window.confirm("Tem certeza que deseja excluir este paciente?")) return; @@ -85,45 +76,7 @@ function TablePaciente({ setCurrentPage, setPatientID }) { .catch((error) => console.log("Deu problema", error)); }; - // Função para marcar/desmarcar VIP - const toggleVIP = async (id, atual) => { - const novoStatus = atual === true ? false : true; - - await fetch( - `https://mock.apidog.com/m1/1053378-0-default/pacientes/${id}`, - { - method: "PUT", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ vip: novoStatus }), - } - ) - .then((response) => response.json()) - .then(() => { - setPacientes((prev) => - prev.map((p) => (p.id === id ? { ...p, vip: novoStatus } : p)) - ); - }) - .catch((error) => console.log("Erro ao atualizar VIP:", error)); - }; - - // Função para atualizar convênio/particular - const updateConvenio = async (id, convenio) => { - await fetch( - `https://mock.apidog.com/m1/1053378-0-default/pacientes/${id}`, - { - method: "PUT", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ convenio }), - } - ) - .then((response) => response.json()) - .then(() => { - setPacientes((prev) => - prev.map((p) => (p.id === id ? { ...p, convenio } : p)) - ); - }) - .catch((error) => console.log("Erro ao atualizar convênio:", error)); - }; + // Requisição inicial para buscar pacientes useEffect(() => { diff --git a/src/pages/style/Agendamento.css b/src/pages/style/Agendamento.css index d7f34d5..3bb469a 100644 --- a/src/pages/style/Agendamento.css +++ b/src/pages/style/Agendamento.css @@ -89,10 +89,11 @@ .legenda-tabela{ display: flex; - justify-content: flex-end; - margin-top: 10px; + + margin-top: 30px; margin-bottom: 10px; gap: 15px; + justify-content: flex-end; } .legenda-item-realizado{ @@ -141,4 +142,55 @@ padding: 5px; font-weight: bold; border-radius: 10px; +} + +.btns-e-legenda-container{ + + display: flex; + + justify-content: space-between; + flex-direction: row; + margin-top: 10px; +} + + +.calendario { + + border-collapse: collapse; + width: 100%; + border-radius: 10px; + overflow: hidden; + box-shadow: 0 4px 12px rgb(255, 255, 255); + border: 10px solid #ffffffc5; + background-color: rgb(253, 253, 253); +} + + + +.calendario-ou-filaespera{ + margin-top: 0; +} + +.container-btns-agenda-fila_esepera{ + margin-top: 30px; + display: flex; + flex-direction: row; + gap: 20px; + margin-left:20px ; + +} + +.btn-fila-espera, .btn-agenda{ + background-color: transparent; + border: 0px ; + border-bottom: 3px solid rgb(253, 253, 253); + padding: 8px; + border-radius: 10px 10px 0px 0px; + font-weight: bold; + +} + +.opc-filaespera-ativo, .opc-agenda-ativo{ + color: white; + background-color: #5980fd; } \ No newline at end of file