123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- import isPropValid from '@emotion/is-prop-valid';
- import {useTheme} from '@emotion/react';
- import styled from '@emotion/styled';
- import {FocusScope} from '@react-aria/focus';
- import moment from 'moment';
- import {DatePicker} from 'sentry/components/calendar';
- import FormField from 'sentry/components/forms/formField';
- import Input from 'sentry/components/input';
- import {Overlay, PositionWrapper} from 'sentry/components/overlay';
- import {IconCalendar} from 'sentry/icons';
- import useOverlay from 'sentry/utils/useOverlay';
- // XXX(epurkhiser): This is wrong, it should not be inheriting these props
- import {InputFieldProps, OnEvent} from './inputField';
- interface DatePickerFieldProps extends Omit<InputFieldProps, 'field'> {}
- function handleChangeDate(
- onChange: OnEvent,
- onBlur: OnEvent,
- date: Date,
- close: Function
- ) {
- onChange(date);
- onBlur(date);
- // close dropdown menu
- close();
- }
- export default function DatePickerField(props: DatePickerFieldProps) {
- const {
- isOpen,
- state: overlayState,
- triggerProps,
- overlayProps,
- } = useOverlay({position: 'bottom-start'});
- const theme = useTheme();
- return (
- <FormField {...props}>
- {({children: _children, onChange, onBlur, value, id, size, ...inputProps}) => {
- const dateObj = new Date(value);
- const inputValue = !isNaN(dateObj.getTime()) ? dateObj : new Date();
- const dateString = moment(inputValue).format('LL');
- return (
- <div>
- <InputWrapper id={id}>
- <StyledInput
- {...inputProps}
- {...triggerProps}
- aria-haspopup="dialog"
- size={size}
- value={dateString}
- readOnly
- />
- <StyledIconCalendar inputSize={size} size={size === 'xs' ? 'xs' : 'sm'} />
- </InputWrapper>
- {isOpen && (
- <FocusScope contain restoreFocus autoFocus>
- <PositionWrapper zIndex={theme.zIndex.dropdown} {...overlayProps}>
- <StyledOverlay>
- <DatePicker
- date={inputValue}
- onChange={date =>
- handleChangeDate(onChange, onBlur, date, overlayState.close)
- }
- />
- </StyledOverlay>
- </PositionWrapper>
- </FocusScope>
- )}
- </div>
- );
- }}
- </FormField>
- );
- }
- const InputWrapper = styled('div')`
- position: relative;
- `;
- const StyledInput = styled(Input)`
- text-align: left;
- padding-right: ${p => `calc(
- ${p.theme.formPadding[p.size ?? 'md'].paddingRight}px * 1.5 +
- ${p.theme.iconSizes.sm}
- )`};
- &:focus:not(.focus-visible) {
- border-color: ${p => p.theme.border};
- box-shadow: inset ${p => p.theme.dropShadowLight};
- }
- `;
- const StyledOverlay = styled(Overlay)`
- .rdrMonthAndYearWrapper {
- height: 50px;
- padding-top: 0;
- }
- `;
- const StyledIconCalendar = styled(IconCalendar, {
- shouldForwardProp: prop => typeof prop === 'string' && isPropValid(prop),
- })<{inputSize?: InputFieldProps['size']}>`
- position: absolute;
- top: 50%;
- right: ${p => p.theme.formPadding[p.inputSize ?? 'md'].paddingRight}px;
- transform: translateY(-50%);
- `;
|