Files
2025-09-14 17:57:24 +02:00

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())
);
}