Como criar um seletor de horários no calendário do Salesforce
O Salesforce oferece um seletor de data e um campo de hora. Ele não oferece uma grade de horários selecionáveis. Veja o que um seletor de horários de verdade exige no Salesforce e como ter um sem precisar construí-lo.
Um seletor de horários é uma interface bem específica: um calendário em que você escolhe o dia e, embaixo, uma grade que divide esse dia em intervalos reserváveis, com os ocupados claramente indisponíveis. Todo mundo reconhece, porque todo site de agendamento da internet usa. O Salesforce não traz um pronto.
O que o Salesforce oferece de fato
Um campo Data/Hora padrão aparece como uma entrada de data mais uma lista de horas. É um controle de formulário e não faz ideia do que mais está reservado. Nada impede o usuário de escolher um horário que já foi tomado, porque o campo não sabe que outros registros existem. Essa verificação acontece depois, numa regra de validação ou num fluxo, quando o usuário já fez a escolha.
Essa é a lacuna. Um seletor de horários consulta os registros existentes antes de o usuário escolher e só oferece o que está livre.
O que um seletor de horários de verdade precisa fazer
| Requisito | Campos padrão | Com o MultiDatePick |
|---|---|---|
| Dividir o dia em intervalos | Não existe o conceito de intervalo | Qualquer intervalo (o comum é 15, 30 ou 60 minutos) |
| Conhecer o expediente | Qualquer horário é válido | Hora mínima e máxima, ou o horário comercial de cada recurso |
| Mostrar o que está ocupado | Nada é mostrado | Reservas existentes desenhadas na grade |
| Várias pessoas por horário | Impossível de expressar | Capacidade com um indicador ao vivo de reservados sobre a capacidade |
| Horários diferentes em dias diferentes | Um campo, um valor | Permitir Horários Diferentes (Allow Different Times Per Date) |
| Impedir conflito ao salvar | Só com lógica personalizada | Comportamento de Conflito: bloquear, ignorar ou permitir |
Por que construir sozinho dá mais trabalho do que parece
Desenhar a grade é a parte fácil. Estas são as partes que ninguém coloca no escopo:
Consultar as reservas
De forma eficiente, sem estourar os limites do governador quando alguém abre uma visualização de dois meses.
Cálculo de sobreposição
Fica complicado assim que as reservas podem ter durações diferentes.
Fusos horários
O fuso horário do usuário e o do registro nem sempre são o mesmo.
Condições de corrida
Duas pessoas olhando para o mesmo horário livre no mesmo instante.
Segurança em nível de campo
O componente precisa respeitar o que o usuário pode ver.
Acessibilidade
Uma grade de divs clicáveis não é navegável por teclado por padrão.
A acessibilidade é o que exige mais cuidado. Uma grade de horários precisa de semântica de grade ARIA correta, navegação com as setas e um estado transmitido por mais do que a cor. É a parte que a maioria das soluções internas pula, e a parte que uma revisão de compras pergunta.
Agrupar os horários para que dê para percorrê-los
Um dia das 9h às 17h em intervalos de 15 minutos tem 32 horários. Numa lista corrida, isso vira um paredão. Agrupar por período (manhã, tarde, noite) transforma tudo em três blocos curtos. Isso ajuda principalmente quando quem escolhe é um cliente no celular.
Quando você nem precisa do calendário
Às vezes a data já está implícita. Na página de registro de um agendamento que já tem data, um calendário mensal é redundante. Somente grade de horários tira o calendário e mostra apenas a grade daquela data, vinda de um campo do registro da página ou definida diretamente.
As configurações que montam o seletor
Cada uma é um campo no Assistente de Configuração. Nada aqui exige código.
| Configuração | O que faz | Nome da API |
|---|---|---|
| Intervalo de Horário (Time Slot Interval (Minutes)) | A duração de cada horário. Qualquer número de minutos. | timeInterval |
| Hora Mínima / Hora Máxima (Earliest Time / Latest Time) | A janela que a grade cobre no componente Dates & Times. | minTime, maxTime |
| Campo de Início / Fim do Horário Comercial (Business Hours Start / End Field) | O horário de trabalho de cada recurso no componente Booking. | businessHoursStartField |
| Campo de Capacidade (Capacity Field) | Quantas reservas um recurso comporta por horário. | capacityField |
| Agrupar Horários por Período (Group Time Slots by Period) | Seções Manhã, Tarde e Noite. | groupTimeSlotsByPeriod |
| Comportamento de Conflito (Conflict Behavior) | Bloquear, ignorar ou permitir um conflito ao salvar. | conflictBehavior |
| Somente grade de horários (Time Grid Only) | Só a grade de horários, para uma data implícita. | timeGridOnly |
Perguntas frequentes
O que é um seletor de horários em calendário?
Um calendário em que você escolhe o dia e, logo abaixo, uma grade divide esse dia em intervalos reserváveis. Os horários já ocupados aparecem como indisponíveis, então as pessoas só escolhem horários livres.
O Salesforce tem um seletor de horários?
Não para os seus próprios objetos. Um campo Data/Hora padrão é uma entrada de data mais uma lista de horas, e ele não enxerga outros registros. O MultiDatePick adiciona um seletor de horários que lê as reservas existentes quando o calendário carrega e só oferece o que está livre.
Os horários podem ter qualquer duração?
Sim. O intervalo pode ser qualquer número de minutos. O comum é 15, 30 ou 60 minutos, e um horário de entrevista de 45 minutos funciona do mesmo jeito.
Preciso de Apex ou de um desenvolvedor para adicionar um seletor de horários?
Não. O Assistente de Configuração grava a configuração, e o componente vai para uma página de registro, página de aplicativo, site do Experience Cloud ou fluxo de tela (Screen Flow) bastando definir o Config Name. Não há código para escrever.
Seu seletor de horários no Salesforce, pronto para configurar
Escolha um horário livre na demo ao vivo e depois siga os Primeiros passos para colocar um na sua organização.
- US$ 20/usuário/mês, todos os recursos
- Teste grátis de 30 dias, sem cartão
- 100% nativo do Salesforce
- Sem Apex
- Em breve no Salesforce AppExchange