UNPKG

vuetify

Version:

Vue Material Component Framework

73 lines 3.21 kB
// Utilities import { computed } from 'vue'; import { incrementHour, incrementMinuteOrSecond } from "./util.js"; import { propsFactory } from "../../util/index.js"; // Types export const makeTimeValidationProps = propsFactory({ allowedHours: [Function, Array], allowedMinutes: [Function, Array], allowedSeconds: [Function, Array], max: String, min: String }, 'time-validation'); export function useTimeValidation(props) { const isAllowedHour = computed(() => { const minHour = props.min ? Number(props.min.split(':')[0]) : 0; const maxHour = props.max ? Number(props.max.split(':')[0]) : 23; return val => { if (val < minHour) return false; if (val > maxHour) return false; if (Array.isArray(props.allowedHours)) return props.allowedHours.includes(val); if (typeof props.allowedHours === 'function') return props.allowedHours(val); return true; }; }); const isAllowedMinute = computed(() => { const [minHour, minMinute] = props.min ? props.min.split(':').map(Number) : [0, 0]; const [maxHour, maxMinute] = props.max ? props.max.split(':').map(Number) : [23, 59]; const minTime = minHour * 60 + minMinute; const maxTime = maxHour * 60 + maxMinute; return (hour24hr, val) => { if (hour24hr !== null) { const time = 60 * hour24hr + val; if (time < minTime) return false; if (time > maxTime) return false; } if (Array.isArray(props.allowedMinutes)) return props.allowedMinutes.includes(val); if (typeof props.allowedMinutes === 'function') return props.allowedMinutes(val); return true; }; }); const isAllowedSecond = computed(() => { const [minHour, minMinute, minSecond] = props.min ? props.min.split(':').map(Number) : [0, 0, 0]; const [maxHour, maxMinute, maxSecond] = props.max ? props.max.split(':').map(Number) : [23, 59, 59]; const minTime = minHour * 3600 + minMinute * 60 + (minSecond || 0); const maxTime = maxHour * 3600 + maxMinute * 60 + (maxSecond || 0); return (hour24hr, minute, val) => { if (hour24hr !== null && minute !== null) { const time = 3600 * hour24hr + 60 * minute + val; if (time < minTime) return false; if (time > maxTime) return false; } if (Array.isArray(props.allowedSeconds)) return props.allowedSeconds.includes(val); if (typeof props.allowedSeconds === 'function') return props.allowedSeconds(val); return true; }; }); function findNextAllowed(type, value, increment, currentHour = null, currentMinute = null) { const isAllowed = type === 'hour' ? isAllowedHour.value : type === 'minute' ? v => isAllowedMinute.value(currentHour, v) : v => isAllowedSecond.value(currentHour, currentMinute, v); const nextValue = type === 'hour' ? v => incrementHour(v, increment, null).value : v => incrementMinuteOrSecond(v, increment); const limit = type === 'hour' ? 24 : 60; for (let i = 1; i <= limit; i++) { value = nextValue(value); if (isAllowed(value)) break; } return value; } return { isAllowedHour, isAllowedMinute, isAllowedSecond, findNextAllowed }; } //# sourceMappingURL=useTimeValidation.js.map