Example · Advanced
Validation
Validate time input and handle invalid entries
Built-in Validation
Timepicker-UI includes built-in validation that adds error classes to invalid inputs. Use event callbacks to implement custom validation logic.
Basic Validation
The timepicker automatically validates input format:
index.tstypescript
1import { TimepickerUI } from 'timepicker-ui';23const input = document.querySelector('#timepicker');4const picker = new TimepickerUI(input, {5 callbacks: {6 onConfirm: (data) => {7 console.log('Valid time:', data);8 }9 }10});1112picker.create();1314// Invalid format will add 'tp-ui-invalid-format' class15// and show error message
Custom Validation
Implement custom validation in the onConfirm callback:
index.tstypescript
1import { TimepickerUI } from 'timepicker-ui';23const input = document.querySelector('#timepicker');4const picker = new TimepickerUI(input, {5 callbacks: {6 onConfirm: (data) => {7 const hour = parseInt(data.hour);89 // Custom rule: Only allow working hours (9 AM - 5 PM)10 if (hour < 9 || hour > 17) {11 alert('Please select time between 9 AM and 5 PM');12 input.classList.add('error');13 return;14 }1516 input.classList.remove('error');17 console.log('Valid time:', data);18 }19 }20});2122picker.create();
Required Field
Validate that a time has been selected:
index.tstypescript
1import { TimepickerUI } from 'timepicker-ui';23const input = document.querySelector('#timepicker');4const form = document.querySelector('#myForm');5const picker = new TimepickerUI(input);67picker.create();89form.addEventListener('submit', (e) => {10 e.preventDefault();1112 if (!input.value) {13 input.classList.add('error');1415 // Add error message16 const errorMsg = document.createElement('div');17 errorMsg.className = 'error-message';18 errorMsg.textContent = 'Time is required';19 input.parentElement.appendChild(errorMsg);2021 return;22 }2324 input.classList.remove('error');25 // Submit form26 console.log('Form submitted with time:', input.value);27});
Time Range Validation
Validate time is within a specific range:
index.tstypescript
1import { TimepickerUI } from 'timepicker-ui';23function validateTimeRange(time: string, min: string, max: string): boolean {4 const [timeH, timeM] = time.split(':').map(Number);5 const [minH, minM] = min.split(':').map(Number);6 const [maxH, maxM] = max.split(':').map(Number);78 const timeMinutes = timeH * 60 + timeM;9 const minMinutes = minH * 60 + minM;10 const maxMinutes = maxH * 60 + maxM;1112 return timeMinutes >= minMinutes && timeMinutes <= maxMinutes;13}1415const input = document.querySelector('#timepicker');16const picker = new TimepickerUI(input, {17 callbacks: {18 onConfirm: (data) => {19 const time = `${data.hour}:${data.minutes}`;2021 if (!validateTimeRange(time, '08:00', '18:00')) {22 alert('Time must be between 8:00 AM and 6:00 PM');23 input.classList.add('error');24 return;25 }2627 input.classList.remove('error');28 }29 }30});3132picker.create();
React Form Integration
Integrate with React form validation libraries:
index.tsxtsx
1import { useEffect, useRef, useMemo } from 'react';2import { TimepickerUI } from 'timepicker-ui';3import { useForm } from 'react-hook-form';45function TimePickerForm() {6 const inputRef = useRef<HTMLInputElement>(null);7 const pickerRef = useRef<TimepickerUI | null>(null);89 const {10 register,11 handleSubmit,12 setValue,13 formState: { errors }14 } = useForm();1516 const options = useMemo(() => ({17 callbacks: {18 onConfirm: (data) => {19 const time = `${data.hour}:${data.minutes}${data.type ? ' ' + data.type : ''}`;20 setValue('time', time, { shouldValidate: true });21 }22 }23 }), [setValue]);2425 useEffect(() => {26 if (!inputRef.current) return;2728 pickerRef.current = new TimepickerUI(inputRef.current, options);29 pickerRef.current.create();3031 return () => {32 pickerRef.current?.destroy();33 };34 }, []);3536 const onSubmit = (data) => {37 console.log('Form data:', data);38 };3940 return (41 <form onSubmit={handleSubmit(onSubmit)}>42 <input43 ref={inputRef}44 type="text"45 {...register('time', {46 required: 'Time is required',47 pattern: {48 value: /^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/,49 message: 'Invalid time format'50 }51 })}52 />53 {errors.time && (54 <span className="error">{errors.time.message}</span>55 )}56 <button type="submit">Submit</button>57 </form>58 );59}
Server-Side Validation
Handle validation errors from server responses:
index.tstypescript
1import { TimepickerUI } from 'timepicker-ui';23const input = document.querySelector('#timepicker');4const picker = new TimepickerUI(input);56picker.create();78async function submitTime(time: string) {9 try {10 const response = await fetch('/api/appointments', {11 method: 'POST',12 headers: { 'Content-Type': 'application/json' },13 body: JSON.stringify({ time })14 });1516 if (!response.ok) {17 const error = await response.json();1819 // Show server validation error20 input.classList.add('error');2122 const errorMsg = document.createElement('div');23 errorMsg.className = 'error-message';24 errorMsg.textContent = error.message;25 input.parentElement.appendChild(errorMsg);2627 return;28 }2930 console.log('Time saved successfully');31 } catch (error) {32 console.error('Validation error:', error);33 }34}