DateField Experimental
DateField is used when the user has to select a date. Compared to DatePicker, DateField has no supporting calendar to select a date, the user must input date values with a numeric keyboard.
DateField is distributed within the "gestalt-datepicker" package and must be installed separately.
Props
Variants
Controlled component
DateField is a controlled component. Use value
, onChange
, onClearInput
and onError
to implement it correctly.
import { useState } from 'react'; import { Box, Flex } from 'gestalt'; import { DateField } from 'gestalt-datepicker'; export default function Example() { const [dateValue, setDateValue] = useState(null); const [errorText, setErrorText] = useState(null); return ( <Flex alignItems="center" gap={4} height="100%" justifyContent="center" width="100%" > <Box width={400}> <DateField id="mainExample" label="Date of birth" helperText="Enter your date of birth" onError={({ errorMessage }) => setErrorText(errorMessage)} errorMessage={errorText || undefined} onChange={({ value }) => { setDateValue(value); }} value={dateValue} onClearInput={() => setDateValue(null)} name="bday_datefield" /> </Box> </Flex> ); }
Error messaging
DateField can communicate input errors to the user. Use onError
and errorMessage
to implement it correctly.
import { useState } from 'react'; import { Box, Flex } from 'gestalt'; import { DateField } from 'gestalt-datepicker'; export default function Example() { const [dateValue, setDateValue] = useState(null); const [errorText, setErrorText] = useState(null); return ( <Flex alignItems="center" gap={4} height="100%" justifyContent="center" width="100%" > <Box width={400}> <DateField id="errorExample" label="Date of birth" helperText="Enter your date of birth" onError={({ errorMessage, value }) => { const date = value ? new Date(value) : null; if (errorMessage === 'invalidDate') return; if ( errorMessage === 'disableFuture' || (date && date.getFullYear() === 1) ) setErrorText('Please, select a valid birth date'); if (date && date.getFullYear() > 1) setErrorText(null); }} errorMessage={errorText || undefined} onChange={({ value }) => { setDateValue(value); }} value={dateValue} disableRange="disableFuture" onClearInput={() => { setErrorText(null); setDateValue(null); }} name="bday_datefield" /> </Box> </Flex> ); }
States
DateField supports disabled
and readOnly
states.
import { Box, Flex } from 'gestalt'; import { DateField } from 'gestalt-datepicker'; export default function Example() { return ( <Flex alignItems="center" gap={4} height="100%" justifyContent="center" width="100%" direction="column" > <Box width={400}> <DateField id="disabled_example" disabled label="Date of birth" onError={() => {}} onChange={() => {}} value={new Date('1995-12-17T03:24:00')} onClearInput={() => {}} name="bday_datefield" /> </Box> <Box width={400}> <DateField id="readonly_example" readOnly label="Date of birth" onError={() => {}} onChange={() => {}} value={new Date('1995-12-17T03:24:00')} onClearInput={() => {}} name="bday_datefield" /> </Box> </Flex> ); }
Disable past & future dates
DateField supports disabling future & past dates from being selected.
import { useState } from 'react'; import { Box, Flex } from 'gestalt'; import { DateField } from 'gestalt-datepicker'; export default function Example() { const [dateValueDisableFuture, setDateValueDisableFuture] = useState(null); const [dateValueDisablePast, setDatealueDisablePast] = useState(null); const [errorTextDisableFuture, setErrorTextDisableFuture] = useState(null); const [errorTextDisablePast, setErrorTextDisablePast] = useState(null); return ( <Flex alignItems="center" gap={4} height="100%" justifyContent="center" width="100%" direction="column" > <Box width={400}> <DateField id="disableFuture" label="Date of birth" helperText="Enter your date of birth" onError={({ errorMessage }) => setErrorTextDisableFuture(errorMessage) } errorMessage={ (errorTextDisableFuture && errorTextDisableFuture === 'disableFuture' && 'Please, enter a valid past date') || undefined } onChange={({ value }) => { setDateValueDisableFuture(value); }} value={dateValueDisableFuture} onClearInput={() => setDateValueDisableFuture(null)} name="bday_datefield" disableRange="disableFuture" /> </Box> <Box width={400}> <DateField id="disablePast" label="Campaign activation date" helperText="Enter an activation date for your campaign" onError={({ errorMessage }) => setErrorTextDisablePast(errorMessage)} errorMessage={ (errorTextDisablePast && errorTextDisablePast === 'disablePast' && 'Please, enter a valid future date') || undefined } onChange={({ value }) => { setDatealueDisablePast(value); }} value={dateValueDisablePast} onClearInput={() => setDatealueDisablePast(null)} name="bday_datefield" disableRange="disablePast" /> </Box> </Flex> ); }
External handlers
DateField consumes external handlers from GlobalEventsHandlerProvider.
Handlers:
- onMount: executed when DateField mounts for the first time
See GlobalEventsHandlerProvider for more information.
Supporting locales
DateField supports multiple locales. Adjust the date format to each date-fns locale. The following locale examples show the different locale format variants.
IMPORTANT: Locale data from date-fns is external to gestalt-datepicker, it's not an internal dependency. Add date-fns to your app's dependencies.
import { DateField } from 'gestalt-datepicker';
import { it } from 'date-fns/locale';
<DateField localeData={it}/>
Related
DatePicker
Use DatePicker if the user is allowed to pick a date from a calendar popup.