Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | 1x 1x 1x 7x 5x 5x 1x 3x 1x 2x 2x 1x 1x 1x 3x 4x 4x 4x 1x 1x 1x 1x 3x | import React from "react"; import { WidgetProps } from "./types"; import { trans } from "../i18n"; import InputWidgetBase from "./InputWidgetBase"; const parseInteger = (s: string) => Number.parseInt(s, 10); export function isValidDate(year: number, month: number, day: number) { const date = new Date(year, month - 1, day); return ( date.getFullYear() === year && date.getMonth() === month - 1 && date.getDate() === day ); } const DATE_RE = /^\s*(?<year>\d{4})-(?<month>\d{1,2})-(?<day>\d{1,2})\s*$/; export function validateDate(value: string): string | null { if (!value) { return null; } const groups = value.match(DATE_RE)?.groups; if ( groups && isValidDate( parseInteger(groups.year), parseInteger(groups.month), parseInteger(groups.day) ) ) { return null; } return trans("ERROR_INVALID_DATE"); } const REVERSE_DATE_RE = /^(?<day>\d{1,2})\.(?<month>\d{1,2})\.(?<year>\d{4})\s*$/; const pad = (n: number) => (n < 10 ? `0${n}` : `${n}`); export function postprocessDate(value: string) { value = value.trim(); const groups = value.match(REVERSE_DATE_RE)?.groups; if (groups) { const day = parseInteger(groups.day); const month = parseInteger(groups.month); const year = parseInteger(groups.year); return `${year}-${pad(month)}-${pad(day)}`; } return value; } export function DateInputWidget(props: WidgetProps) { return ( <InputWidgetBase inputType="date" inputAddon={<i className="fa fa-calendar" />} postprocessValue={postprocessDate} validate={validateDate} {...props} /> ); } |