87 lines
2.4 KiB
TypeScript
87 lines
2.4 KiB
TypeScript
export type DateInputDate = Date | string | number;
|
|
export type DateInputRange<T> = {
|
|
start?: T | null;
|
|
end?: T | null;
|
|
};
|
|
export type DateInputModelValue =
|
|
| DateInputDate
|
|
| DateInputDate[]
|
|
| DateInputRange<DateInputDate>
|
|
| undefined
|
|
| null
|
|
| string;
|
|
|
|
export default function () {
|
|
const { t } = useI18n();
|
|
return {
|
|
required(name: string) {
|
|
return (value: string) =>
|
|
(value && value.length > 0) || t('validation.required', { name });
|
|
},
|
|
max(name: string, max = 64) {
|
|
return (value: string) =>
|
|
(value && value.length <= max) ||
|
|
t('validation.max_length', { name, max });
|
|
},
|
|
maxOptional(name: string, max = 64) {
|
|
return (value: string) =>
|
|
!value ||
|
|
value.length <= 0 ||
|
|
value.length <= max ||
|
|
t('validation.max_length', { name, max });
|
|
},
|
|
min(name: string, min = 8) {
|
|
return (value: string) =>
|
|
(value && value.length >= min) ||
|
|
t('validation.min_length', { name, min });
|
|
},
|
|
dateRangeIsPast() {
|
|
return (model: DateInputModelValue) =>
|
|
(model && isRangeModel(model) && model.start && model.end
|
|
? new Date(model.start).getTime() < Date.now() &&
|
|
new Date(model.end).getTime() < Date.now()
|
|
: true) || t('validation.date_range_past');
|
|
},
|
|
dateIsPast() {
|
|
return (model: DateInputModelValue) =>
|
|
(model &&
|
|
isDateModel(model) &&
|
|
new Date(model).getTime() < Date.now()) ||
|
|
t('validation.date_range_past');
|
|
},
|
|
numeric(name: string) {
|
|
return (value: string) =>
|
|
(value &&
|
|
!isNaN(parseFloat(value)) &&
|
|
value?.split(' ').length === 1) ||
|
|
t('validation.numeric', { name });
|
|
},
|
|
numericOptional(name: string) {
|
|
return (value: string | undefined) =>
|
|
!value ||
|
|
(!isNaN(parseFloat(value)) && value?.split(' ').length === 1) ||
|
|
t('validation.numeric', { name });
|
|
}
|
|
} as const;
|
|
}
|
|
|
|
function isRangeModel(
|
|
model: DateInputModelValue
|
|
): model is DateInputRange<DateInputDate> {
|
|
return (
|
|
!!model &&
|
|
typeof model === 'object' &&
|
|
(model as DateInputRange<DateInputDate>)?.end !== undefined &&
|
|
(model as DateInputRange<DateInputDate>)?.start !== undefined
|
|
);
|
|
}
|
|
|
|
function isDateModel(model: DateInputModelValue): model is DateInputDate {
|
|
return (
|
|
!!model &&
|
|
!Array.isArray(model) &&
|
|
!isRangeModel(model) &&
|
|
!isNaN(new Date(model).getTime())
|
|
);
|
|
}
|