diff --git a/src/components/AgendarConsulta/FormDisponibilidade.jsx b/src/components/AgendarConsulta/FormDisponibilidade.jsx deleted file mode 100644 index 86ba6ce..0000000 --- a/src/components/AgendarConsulta/FormDisponibilidade.jsx +++ /dev/null @@ -1,177 +0,0 @@ -import InputMask from "react-input-mask"; -import "./style/formagendamentos.css"; -import { useState, useEffect } from "react"; - -const FormNovaDisponibilidade = ({ onCancel, doctorID }) => { - - const [dadosAtendimento, setDadosAtendimento] = useState({ - profissional: '', - tipoAtendimento: '', - dataAtendimento: '', - inicio: '', - termino: '', - motivo: '' - }); - - const handleAtendimentoChange = (e) => { - const { value, name } = e.target; - setDadosAtendimento(prev => ({ - ...prev, - [name]: value - })); - }; - - const handleSubmitExcecao = async (e) => { - e.preventDefault(); - console.log("Modo Emergência Ativado: Tentando criar Exceção com novo endpoint."); - - const { profissional, dataAtendimento, tipoAtendimento, inicio, termino, motivo } = dadosAtendimento; - - if (!profissional || !dataAtendimento || !tipoAtendimento) { - alert("Por favor, preencha o Profissional, Data, e Tipo da exceção."); - return; - } - - const payload = { - doctor_id: profissional, - date: dataAtendimento, - start_time: inicio + ":00" || null, // Adiciona ":00" se o input type="time" retornar apenas HH:MM - end_time: termino + ":00" || null, // Adiciona ":00" - kind: tipoAtendimento, - reason: motivo, - }; - - var myHeaders = new Headers(); - myHeaders.append("Content-Type", "application/json"); - - var requestOptions = { - method: 'POST', - headers: myHeaders, - body: JSON.stringify(payload), - redirect: 'follow' - }; - - try { - const response = await fetch("https://mock.apidog.com/m1/1053378-0-default/rest/v1/doctor_exceptions", requestOptions); - const result = await response.json(); - - if (response.ok || response.status === 201) { - console.log("Exceção de emergência criada com sucesso:", result); - alert(`Consulta de emergência agendada como exceção! Detalhes: ${JSON.stringify(result)}`); - } else { - console.error("Erro ao criar exceção de emergência:", result); - alert(`Erro ao agendar exceção. Status: ${response.status}. Detalhes: ${result.message || JSON.stringify(result)}`); - } - } catch (error) { - console.error("Erro na requisição para criar exceção:", error); - alert("Erro de comunicação com o servidor ou formato de resposta inválido."); - } - }; - - return ( -
-
-

Informações do médico

- -
- -
- - -
- -
- - -
- -
- -
-
- -
- -
- - -
-
- -
-
- - -
- -
- - -
- -
- - -
-
-
- -
- -
- - -
-
-
- -
- - -
-
-
- ); -}; - -export default FormNovaDisponibilidade; \ No newline at end of file diff --git a/src/components/FormCriarExcecao.jsx b/src/components/FormCriarExcecao.jsx new file mode 100644 index 0000000..dcfbfcf --- /dev/null +++ b/src/components/FormCriarExcecao.jsx @@ -0,0 +1,184 @@ +// src/components/FormCriarExcecao.jsx + +import React, { useState } from "react"; +// Assumindo que você usa o mesmo estilo +import "./AgendarConsulta/style/formagendamentos.css"; + +const ENDPOINT_CRIAR_EXCECAO = "https://mock.apidog.com/m1/1053378-0-default/rest/v1/doctor_exceptions"; + +const FormCriarExcecao = ({ onCancel, doctorID }) => { + + const [dadosAtendimento, setDadosAtendimento] = useState({ + profissional: doctorID || '', + tipoAtendimento: '', + dataAtendimento: '', + inicio: '', + termino: '', + motivo: '' + }); + + const handleAtendimentoChange = (e) => { + const { value, name } = e.target; + setDadosAtendimento(prev => ({ + ...prev, + [name]: value + })); + }; + + const handleSubmitExcecao = async (e) => { + e.preventDefault(); + console.log("Tentando criar Exceção."); + + const { profissional, dataAtendimento, tipoAtendimento, inicio, termino, motivo } = dadosAtendimento; + + // Validação + if (!profissional || !dataAtendimento || !tipoAtendimento || !motivo) { + alert("Por favor, preencha o ID do Profissional, Data, Tipo e Motivo."); + return; + } + + // Adiciona ":00" se o campo de hora estiver preenchido + const startTime = inicio ? inicio + ":00" : undefined; + const endTime = termino ? termino + ":00" : undefined; + + const payload = { + doctor_id: profissional, + date: dataAtendimento, + start_time: startTime, + end_time: endTime, + kind: tipoAtendimento, + reason: motivo, + }; + + var myHeaders = new Headers(); + myHeaders.append("Content-Type", "application/json"); + + var requestOptions = { + method: 'POST', + headers: myHeaders, + body: JSON.stringify(payload), + redirect: 'follow' + }; + + try { + const response = await fetch(ENDPOINT_CRIAR_EXCECAO, requestOptions); + const resultText = await response.text(); + let result; + try { + result = JSON.parse(resultText); + } catch { + result = { message: resultText || 'Sucesso, mas resposta não é JSON.' }; + } + + if (response.ok || response.status === 201) { + console.log("Exceção criada com sucesso:", result); + alert(`Exceção criada! Detalhes: ${result.id || JSON.stringify(result)}`); + onCancel(true); // Indica sucesso para o componente pai recarregar + } else { + console.error("Erro ao criar exceção:", result); + alert(`Erro ao criar exceção. Status: ${response.status}. Detalhes: ${result.message || JSON.stringify(result)}`); + } + } catch (error) { + console.error("Erro na requisição para criar exceção:", error); + alert("Erro de comunicação com o servidor."); + } + }; + + return ( +
+
+

Informações da Nova Exceção

+ +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
+
+ + +
+ +
+ + +
+ +
+ {/* Removendo o campo solicitante, pois não está no payload da API de exceções */} +
+
+
+ +
+
+ + +
+
+
+ +
+ + +
+
+
+ ); +}; + +export default FormCriarExcecao; \ No newline at end of file diff --git a/src/pages/Agendamento.jsx b/src/pages/Agendamento.jsx index 9d2f0de..47b2043 100644 --- a/src/pages/Agendamento.jsx +++ b/src/pages/Agendamento.jsx @@ -248,7 +248,7 @@ const handleSearchMedicos = (term) => {

Agendar nova consulta

- diff --git a/src/pages/ExcecoesDisponibilidade.jsx b/src/pages/ExcecoesDisponibilidade.jsx new file mode 100644 index 0000000..7a234be --- /dev/null +++ b/src/pages/ExcecoesDisponibilidade.jsx @@ -0,0 +1,214 @@ +import React, { useState, useEffect, useCallback } from 'react'; +import dayjs from 'dayjs'; +import FormCriarExcecao from '../components/FormCriarExcecao'; +import "../components/AgendarConsulta/style/formagendamentos.css"; +import "./style/Agendamento.css"; +import './style/FilaEspera.css'; + +const ENDPOINT_LISTAR = "https://mock.apidog.com/m1/1053378-0-default/rest/v1/doctor_exceptions"; +const ENDPOINT_DELETAR = "https://mock.apidog.com/m1/1053378-0-default/rest/v1/doctor_exceptions/"; + +const ExcecoesDisponibilidade = () => { + + const [pageNovaExcecao, setPageNovaExcecao] = useState(false); + const [excecoes, setExcecoes] = useState([]); + const [loading, setLoading] = useState(false); + + // Filtros + const [filtroMedicoId, setFiltroMedicoId] = useState(''); + const [filtroData, setFiltroData] = useState(dayjs().format('YYYY-MM-DD')); + + // Estado para controlar a visualização (Diário, Semanal) + const [visualizacao, setVisualizacao] = useState('diario'); + + // Função para buscar as exceções + const fetchExcecoes = useCallback(async (doctorId, date) => { + setLoading(true); + let url = `${ENDPOINT_LISTAR}?select=*`; + + if (doctorId) { + url += `&doctor_id=eq.${doctorId}`; // Assume filtro por igualdade de ID + } + if (date) { + url += `&date=eq.${date}`; // Assume filtro por igualdade de data + } + + try { + const requestOptions = { method: 'GET', redirect: 'follow' }; + const response = await fetch(url, requestOptions); + const result = await response.json(); + + if (response.ok && Array.isArray(result)) { + setExcecoes(result); + } else { + setExcecoes([]); + console.error("Erro ao listar exceções:", result); + alert("Erro ao carregar lista de exceções."); + } + } catch (error) { + console.error('Erro na requisição de listagem de exceções:', error); + setExcecoes([]); + alert("Erro de comunicação com o servidor ao listar exceções."); + } finally { + setLoading(false); + } + }, []); + + // Função para deletar uma exceção + const deletarExcecao = async (id) => { + if (!window.confirm(`Tem certeza que deseja deletar a exceção com ID: ${id}?`)) return; + + try { + const requestOptions = { method: 'DELETE', redirect: 'follow' }; + const response = await fetch(`${ENDPOINT_DELETAR}${id}`, requestOptions); + + if (response.ok || response.status === 204) { + alert(`Exceção ${id} deletada com sucesso.`); + fetchExcecoes(filtroMedicoId, filtroData); // Recarrega a lista + } else { + const result = await response.json(); + alert(`Erro ao deletar exceção. Detalhes: ${result.message || JSON.stringify(result)}`); + } + } catch (error) { + console.error('Erro na requisição de deleção:', error); + alert('Erro de comunicação ao tentar deletar a exceção.'); + } + }; + + // Efeito para carregar exceções quando os filtros mudam + useEffect(() => { + fetchExcecoes(filtroMedicoId, filtroData); + }, [fetchExcecoes, filtroMedicoId, filtroData]); + + // Handler de cancelamento do formulário de criação + const handleCancelForm = (recarregar = false) => { + setPageNovaExcecao(false); + if (recarregar) { + fetchExcecoes(filtroMedicoId, filtroData); // Recarrega se a criação foi bem-sucedida + } + } + + // Se o formulário de criação estiver aberto, renderiza apenas ele + if (pageNovaExcecao) { + return ; + } + + // Renderiza a tela de listagem (layout da agenda) + + return ( +
+
+

Gerenciar Exceções de Disponibilidade

+ +
+
+ + {/* Filtros e Busca (Adaptados do Agendamento) */} +
+
+ + setFiltroMedicoId(e.target.value)} + /> +
+
+ + setFiltroData(e.target.value)} + /> +
+
+ + {/* Botões de Visualização (Dia/Semana/Mês) - Adaptados */} +
+ + + +
+ + {/* Tabela de Exceções (Simulando a Tabela de Agendamentos) */} +
+
+

Exceções em {filtroData} ({excecoes.length})

+ {loading ? ( +

Carregando exceções...

+ ) : excecoes.length === 0 ? ( +

Nenhuma exceção encontrada para os filtros aplicados.

+ ) : ( + + + + + + + + + + + + + + + {excecoes.map((excecao, index) => ( + + + + + + + + + + + ))} + +
ID ExceçãoID MédicoDataInícioTérminoTipoMotivoAções
{excecao.id || 'N/A'}{excecao.doctor_id}{excecao.date}{excecao.start_time ? excecao.start_time.substring(0, 5) : 'Dia Todo'}{excecao.end_time ? excecao.end_time.substring(0, 5) : 'Dia Todo'} + + {excecao.kind} + + {excecao.reason} + {excecao.id && ( + + )} +
+ )} +
+
+
+
+ ); +} + +export default ExcecoesDisponibilidade; \ No newline at end of file diff --git a/src/perfis/perfil_secretaria/PerfilSecretaria.jsx b/src/perfis/perfil_secretaria/PerfilSecretaria.jsx index 1dc5146..de6d35d 100644 --- a/src/perfis/perfil_secretaria/PerfilSecretaria.jsx +++ b/src/perfis/perfil_secretaria/PerfilSecretaria.jsx @@ -15,7 +15,7 @@ import Details from "../../pages/Details"; import EditPage from "../../pages/EditPage"; import DoctorDetails from "../../pages/DoctorDetails"; import DoctorEditPage from "../../pages/DoctorEditPage"; -import FormDisponibilidade from "../../components/AgendarConsulta/FormDisponibilidade"; +import ExcecoesDisponibilidade from "../../pages/ExcecoesDisponibilidade"; import AgendamentoEditPage from "../../pages/AgendamentoEditPage"; function PerfilSecretaria({ onLogout }) { @@ -38,7 +38,7 @@ function PerfilSecretaria({ onLogout }) { } /> } /> Página não encontrada} /> - } /> + } />