@patternfly/react-core
Version:
This library provides a set of common React components for use with the PatternFly reference implementation.
110 lines (94 loc) • 3.74 kB
Markdown
---
id: Date and time picker
section: components
subsection: date-and-time
---
import { useState } from 'react';
import OutlinedCalendarAltIcon from '@patternfly/react-icons/dist/esm/icons/outlined-calendar-alt-icon';
import OutlinedClockIcon from '@patternfly/react-icons/dist/esm/icons/outlined-clock-icon';
In this demo, learn how to use a [CalendarMonth](/components/date-and-time/calendar-month) component and a [Dropdown](/components/menus/dropdown) component to compose a simple DateTimePicker. The input is read only, meaning that the following example does not cover pasting a copied date and time. Also, you can pick the time only from the predefined options and cannot change it in the input.
```ts file="./examples/DateTimePicker/DateTimePicker.tsx"
```
```js
import { useState } from 'react';
import { Flex, FlexItem, InputGroup, InputGroupItem, DatePicker, isValidDate, TimePicker, yyyyMMddFormat, updateDateTime } from '@patternfly/react-core';
DateTimeRangePicker = () => {
const [from, setFrom] = useState();
const [to, setTo] = useState();
const toValidator = (date) => {
return isValidDate(from) && yyyyMMddFormat(date) >= yyyyMMddFormat(from)
? ''
: 'The "to" date must be after the "from" date';
};
const onFromDateChange = (_event, inputDate, newFromDate) => {
if (isValidDate(from) && isValidDate(newFromDate) && inputDate === yyyyMMddFormat(newFromDate)) {
newFromDate.setHours(from.getHours());
newFromDate.setMinutes(from.getMinutes());
}
if (isValidDate(newFromDate) && inputDate === yyyyMMddFormat(newFromDate)) {
setFrom(new Date(newFromDate));
}
};
const onFromTimeChange = (_event, time, hour, minute) => {
if (isValidDate(from)) {
const updatedFromDate = new Date(from);
updatedFromDate.setHours(hour);
updatedFromDate.setMinutes(minute);
setFrom(updatedFromDate);
}
};
const onToDateChange = (_event, inputDate, newToDate) => {
if (isValidDate(to) && isValidDate(newToDate) && inputDate === yyyyMMddFormat(newToDate)) {
newToDate.setHours(to.getHours());
newToDate.setMinutes(to.getMinutes());
}
if (isValidDate(newToDate) && inputDate === yyyyMMddFormat(newToDate)) {
setTo(newToDate);
}
};
const onToTimeChange = (_event, time, hour, minute) => {
if (isValidDate(to)) {
const updatedToDate = new Date(to);
updatedToDate.setHours(hour);
updatedToDate.setMinutes(minute);
setTo(updatedToDate);
}
};
return (
<Flex direction={{ default: 'column', lg: 'row' }}>
<FlexItem>
<InputGroup>
<InputGroupItem>
<DatePicker onChange={onFromDateChange} aria-label="Start date" placeholder="YYYY-MM-DD" />
</InputGroupItem>
<InputGroupItem>
<TimePicker aria-label="Start time" style={{ width: '150px' }} onChange={onFromTimeChange} />
</InputGroupItem>
</InputGroup>
</FlexItem>
<FlexItem>to</FlexItem>
<FlexItem>
<InputGroup>
<InputGroupItem>
<DatePicker
value={isValidDate(to) ? yyyyMMddFormat(to) : to}
onChange={onToDateChange}
isDisabled={!isValidDate(from)}
rangeStart={from}
validators={[toValidator]}
aria-label="End date"
placeholder="YYYY-MM-DD"
/>
</InputGroupItem>
<InputGroupItem>
<TimePicker style={{ width: '150px' }} onChange={onToTimeChange} isDisabled={!isValidDate(from)} />
</InputGroupItem>
</InputGroup>
</FlexItem>
</Flex>
);
}
```