forked from RiseUP/riseup-squad23
Alteracoes nos agendamenos
This commit is contained in:
parent
aa399d2d99
commit
cf3ea901b8
@ -11,6 +11,9 @@ const FormNovaConsulta = ({ onCancel, onSave, setAgendamento, agendamento }) =>
|
|||||||
|
|
||||||
console.log(agendamento, 'aqui2')
|
console.log(agendamento, 'aqui2')
|
||||||
|
|
||||||
|
const [sessoes,setSessoes] = useState(1)
|
||||||
|
const [tempoBaseConsulta, setTempoBaseConsulta] = useState(30); // NOVO: Tempo base da consulta em minutos
|
||||||
|
|
||||||
const [selectedFile, setSelectedFile] = useState(null);
|
const [selectedFile, setSelectedFile] = useState(null);
|
||||||
const [anexos, setAnexos] = useState([]);
|
const [anexos, setAnexos] = useState([]);
|
||||||
const [loadingAnexos, setLoadingAnexos] = useState(false);
|
const [loadingAnexos, setLoadingAnexos] = useState(false);
|
||||||
@ -165,6 +168,33 @@ const formatarHora = (datetimeString) => {
|
|||||||
disabled: !item.available
|
disabled: !item.available
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
const calcularHorarioTermino = (inicio, sessoes, tempoBase) => {
|
||||||
|
if (!inicio || inicio.length !== 5 || !inicio.includes(':')) return '';
|
||||||
|
|
||||||
|
const [horas, minutos] = inicio.split(':').map(Number);
|
||||||
|
const minutosInicio = (horas * 60) + minutos;
|
||||||
|
const duracaoTotalMinutos = sessoes * tempoBase;
|
||||||
|
const minutosTermino = minutosInicio + duracaoTotalMinutos;
|
||||||
|
|
||||||
|
const horaTermino = Math.floor(minutosTermino / 60) % 24;
|
||||||
|
const minutoTermino = minutosTermino % 60;
|
||||||
|
|
||||||
|
const formatar = (num) => String(num).padStart(2, '0');
|
||||||
|
|
||||||
|
return `${formatar(horaTermino)}:${formatar(minutoTermino)}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
// Recalcula o horário de término sempre que houver alteração nas variáveis dependentes
|
||||||
|
const novoTermino = calcularHorarioTermino(horarioInicio, sessoes, tempoBaseConsulta);
|
||||||
|
setHorarioTermino(novoTermino);
|
||||||
|
|
||||||
|
setAgendamento(prev => ({
|
||||||
|
...prev,
|
||||||
|
horarioTermino: novoTermino
|
||||||
|
}));
|
||||||
|
}, [horarioInicio, sessoes, tempoBaseConsulta, setAgendamento]);
|
||||||
|
|
||||||
const handleSubmit = (e) => {
|
const handleSubmit = (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
alert("Agendamento salvo!");
|
alert("Agendamento salvo!");
|
||||||
@ -247,27 +277,12 @@ const handleSubmit = (e) => {
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="form-check ">
|
|
||||||
<input className="form-check-input checkbox-cstom" type="checkbox" name="status" onChange={handleChange} />
|
|
||||||
<label className="form-check-label checkbox-label" htmlFor="vip">
|
|
||||||
Fila de espera
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<section id="informacoes-atendimento-segunda-linha">
|
<section id="informacoes-atendimento-segunda-linha">
|
||||||
<section id="informacoes-atendimento-segunda-linha-esquerda">
|
<section id="informacoes-atendimento-segunda-linha-esquerda">
|
||||||
|
|
||||||
<div className="campo-informacoes-atendimento">
|
<div className="campo-informacoes-atendimento">
|
||||||
<div className='campo-de-input'>
|
|
||||||
<label>Unidade *</label>
|
|
||||||
<select name="unidade">
|
|
||||||
<option value="" disabled invisible selected>Selecione a unidade</option>
|
|
||||||
<option value="centro">Núcleo de Especialidades Integradas</option>
|
|
||||||
<option value="leste">Unidade Leste</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div className="campo-de-input">
|
<div className="campo-de-input">
|
||||||
@ -275,64 +290,69 @@ const handleSubmit = (e) => {
|
|||||||
<input type="date" name="dataAtendimento" onChange={handleChange} required />
|
<input type="date" name="dataAtendimento" onChange={handleChange} required />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div className="linha">
|
||||||
|
{/* Dropdown de Início (Não modificado) */}
|
||||||
<div className="row">
|
<div className="campo-de-input">
|
||||||
<div className="campo-de-input">
|
<label htmlFor="inicio">Início *</label>
|
||||||
<label htmlFor="inicio">Início *</label>
|
<select
|
||||||
<select
|
|
||||||
id="inicio"
|
id="inicio"
|
||||||
name="inicio"
|
name="inicio"
|
||||||
required
|
required
|
||||||
value={horarioInicio}
|
value={horarioInicio}
|
||||||
onChange={(e) => setHorarioInicio(e.target.value)}
|
onChange={(e) => setHorarioInicio(e.target.value)}
|
||||||
>
|
>
|
||||||
<option value="" disabled>Selecione a hora de início</option>
|
<option value="" disabled>Selecione a hora de início</option>
|
||||||
{opcoesDeHorario?.map((opcao, index) => (
|
{opcoesDeHorario?.map((opcao, index) => (
|
||||||
<option
|
<option
|
||||||
key={index}
|
key={index}
|
||||||
value={opcao.value}
|
value={opcao.value}
|
||||||
disabled={opcao.disabled}
|
disabled={opcao.disabled}
|
||||||
>
|
>
|
||||||
{opcao.label}
|
{opcao.label}
|
||||||
{opcao.disabled && " (Indisponível)"}
|
{opcao.disabled && " (Indisponível)"}
|
||||||
</option>
|
</option>
|
||||||
))}
|
))}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
{/* SELETOR DE SESSÕES MODIFICADO */}
|
||||||
|
{/* Removemos o 'label' para evitar o desalinhamento e colocamos o texto acima */}
|
||||||
</div>
|
<div className='seletor-wrapper'>
|
||||||
|
<label>Número de Sessões *</label> {/* Novo label para o seletor */}
|
||||||
|
<div className='sessao-contador'>
|
||||||
|
<button
|
||||||
{/* Dropdown de Término */}
|
type="button" /* Adicionado para evitar submissão de formulário */
|
||||||
<div className="campo-de-input">
|
onClick={() => {if(sessoes === 0)return; else(setSessoes(sessoes - 1))}}
|
||||||
<label htmlFor="termino">Término *</label>
|
disabled={sessoes === 0} /* Desabilita o botão no limite */
|
||||||
<select
|
>
|
||||||
id="termino"
|
<i className="bi bi-chevron-compact-left"></i>
|
||||||
name="termino"
|
</button>
|
||||||
required
|
|
||||||
value={horarioTermino}
|
<p className='sessao-valor'>{sessoes}</p> {/* Adicionada classe para estilização */}
|
||||||
onChange={(e) => setHorarioTermino(e.target.value)}
|
|
||||||
>
|
<button
|
||||||
<option value="" disabled>Selecione a hora de término</option>
|
type="button" /* Adicionado para evitar submissão de formulário */
|
||||||
{opcoesDeHorario?.map((opcao, index) => (
|
onClick={() => {if(sessoes === 3 )return; else(setSessoes(sessoes + 1))}}
|
||||||
<option
|
disabled={sessoes === 3} /* Desabilita o botão no limite */
|
||||||
key={index}
|
>
|
||||||
value={opcao.value}
|
<i className="bi bi-chevron-compact-right"></i>
|
||||||
disabled={opcao.disabled}
|
</button>
|
||||||
>
|
|
||||||
{opcao.label}
|
|
||||||
{opcao.disabled && " (Indisponível)"}
|
|
||||||
</option>
|
|
||||||
))}
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="campo-de-input">
|
||||||
|
<label htmlFor="termino">Término *</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
id="termino"
|
||||||
|
name="termino"
|
||||||
|
value={horarioTermino || '— —'}
|
||||||
|
readOnly
|
||||||
|
className="horario-termino-readonly"
|
||||||
|
/>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
@ -344,13 +364,21 @@ const handleSubmit = (e) => {
|
|||||||
<textarea name="observacoes" rows="4" cols="1"></textarea>
|
<textarea name="observacoes" rows="4" cols="1"></textarea>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|
||||||
<div className="form-actions">
|
<div className="form-actions">
|
||||||
<button type="submit" className="btn-primary">Salvar agendamento</button>
|
<button type="submit" className="btn-primary">Salvar agendamento</button>
|
||||||
<button type="button" className="btn-cancel" onClick={onCancel}>Cancelar</button>
|
<button type="button" className="btn-cancel" onClick={onCancel}>Cancelar</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
<div className="campo-de-input-check">
|
||||||
|
<input className="form-check-input form-custom-check" type="checkbox" name="status" onChange={handleChange} />
|
||||||
|
<label className="form-check-label checkbox-label" htmlFor="status">
|
||||||
|
Adicionar a fila de espera
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -110,6 +110,7 @@ svg{
|
|||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 12px;
|
gap: 12px;
|
||||||
|
justify-content: flex-end;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-primary {
|
.btn-primary {
|
||||||
@ -390,3 +391,84 @@ html[data-bs-theme="dark"] svg {
|
|||||||
background-position: center;
|
background-position: center;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
}
|
}
|
||||||
|
/* Container dos três elementos na linha */
|
||||||
|
.linha {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-end; /* Garante que os campos de input e o seletor fiquem alinhados pela base */
|
||||||
|
gap: 20px; /* Espaçamento entre os campos */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------- */
|
||||||
|
/* ESTILIZAÇÃO DO SELETOR DE SESSÕES */
|
||||||
|
/* ------------------------------------------- */
|
||||||
|
|
||||||
|
.seletor-wrapper {
|
||||||
|
/* Garante que o label e o contador fiquem alinhados verticalmente com os selects */
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sessao-contador {
|
||||||
|
/* Estilo de "campo de input" */
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
|
||||||
|
/* Cores e Bordas */
|
||||||
|
background-color: #e9ecef; /* Cor cinza claro dos inputs do Bootstrap */
|
||||||
|
border: 1px solid #ced4da; /* Borda sutil */
|
||||||
|
border-radius: 0.25rem; /* Bordas arredondadas (Padrão Bootstrap) */
|
||||||
|
|
||||||
|
/* Garante a mesma altura dos selects */
|
||||||
|
height: 40px; /* Ajuste este valor para corresponder à altura exata do seu select */
|
||||||
|
width: 100px; /* Largura ajustável */
|
||||||
|
padding: 0 5px; /* Padding interno */
|
||||||
|
|
||||||
|
font-size: 1rem;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sessao-valor {
|
||||||
|
/* Estilo do número de sessões */
|
||||||
|
margin: 0;
|
||||||
|
padding: 0 5px;
|
||||||
|
font-size: 1.1rem; /* Um pouco maior que o texto dos selects */
|
||||||
|
color: #007bff; /* Cor azul destacada (como na sua imagem) */
|
||||||
|
}
|
||||||
|
|
||||||
|
.sessao-contador button {
|
||||||
|
/* Estilo dos botões de chevron */
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0 2px;
|
||||||
|
color: #495057; /* Cor do ícone */
|
||||||
|
font-size: 1.5rem; /* Aumenta o tamanho dos ícones do chevron */
|
||||||
|
line-height: 1; /* Alinha o ícone verticalmente */
|
||||||
|
transition: color 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sessao-contador button:hover:not(:disabled) {
|
||||||
|
color: #007bff; /* Cor azul ao passar o mouse */
|
||||||
|
}
|
||||||
|
|
||||||
|
.sessao-contador button:disabled {
|
||||||
|
cursor: not-allowed;
|
||||||
|
color: #adb5bd; /* Cor mais clara quando desabilitado */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------- */
|
||||||
|
/* GARANTINDO COERÊNCIA NOS SELECTS */
|
||||||
|
/* ------------------------------------------- */
|
||||||
|
|
||||||
|
.campo-de-input select {
|
||||||
|
/* Se seus selects estiverem com estilos diferentes, este bloco garante que eles se pareçam */
|
||||||
|
/* com o seletor de sessões (se já usarem classes do Bootstrap, podem não precisar disso) */
|
||||||
|
background-color: #e9ecef; /* Fundo cinza claro */
|
||||||
|
border: 1px solid #ced4da; /* Borda sutil */
|
||||||
|
border-radius: 0.25rem;
|
||||||
|
height: 40px; /* Garante a mesma altura do sessao-contador */
|
||||||
|
/* Adicione mais estilos do seu input/select se necessário (ex: font-size, padding) */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user