Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Docs] Update EuiDatePicker types #5318

Merged
merged 4 commits into from
Oct 25, 2021
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
## [`master`](https://github.com/elastic/eui/tree/master)

- Added styling support for `valign` prop on `EuiTableRowCell` ([#5283](https://github.com/elastic/eui/pull/5283))
- Removed `EuiErrorBoundary` from `EuiDatePicker` when unsupported props are used ([#5318](https://github.com/elastic/eui/pull/5318))

**Bug fixes**

Expand Down
9 changes: 4 additions & 5 deletions src-docs/src/views/date_picker/custom_input.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useState } from 'react';
import React, { forwardRef, useState } from 'react';

import PropTypes from 'prop-types';

Expand All @@ -7,15 +7,14 @@ import moment from 'moment';
import { EuiDatePicker, EuiButton } from '../../../../src/components';

// Should be a component because the date picker does some ref stuff behind the scenes
// eslint-disable-next-line react/prefer-stateless-function

const ExampleCustomInput = ({ onClick, value }) => {
// eslint-disable-next-line
const ExampleCustomInput = forwardRef(({ onClick, value }, ref) => {
return (
<EuiButton className="example-custom-input" onClick={onClick}>
{value}
</EuiButton>
);
};
});

ExampleCustomInput.propTypes = {
onClick: PropTypes.func,
Expand Down
14 changes: 8 additions & 6 deletions src-docs/src/views/date_picker/date_picker_example.js
Original file line number Diff line number Diff line change
Expand Up @@ -331,15 +331,17 @@ export const DatePickerExample = {
},
],
text: (
<p>
<>
<h3>
Dynamic <EuiCode>minDate</EuiCode> and <EuiCode>maxDate</EuiCode>
</h3>
By using <EuiCode>minDate</EuiCode> and <EuiCode>maxDate</EuiCode>,
and updating the values based on <EuiCode>startDate</EuiCode> and{' '}
<EuiCode>endDate</EuiCode>, users get immediate feedback on what range
values are allowed.
</p>
<p>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice a11y catch! ❤️

By using <EuiCode>minDate</EuiCode> and <EuiCode>maxDate</EuiCode>,
and updating the values based on <EuiCode>startDate</EuiCode> and{' '}
<EuiCode>endDate</EuiCode>, users get immediate feedback on what
range values are allowed.
</p>
</>
),
demo: <RangeRestricted />,
props: { EuiDatePickerRange },
Expand Down
75 changes: 33 additions & 42 deletions src/components/date_picker/date_picker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ import { Moment } from 'moment'; // eslint-disable-line import/named
import { EuiFormControlLayout, EuiValidatableControl } from '../form';
import { EuiFormControlLayoutIconsProps } from '../form/form_control_layout/form_control_layout_icons';

import { EuiErrorBoundary } from '../error_boundary';

import { EuiI18nConsumer } from '../context';
import { ApplyClassComponentDefaults, CommonProps } from '../common';

Expand All @@ -28,7 +26,38 @@ export const euiDatePickerDefaultTimeFormat = 'hh:mm A';

const DatePicker = _ReactDatePicker as typeof ReactDatePicker;

interface EuiExtendedDatePickerProps extends ReactDatePickerProps {
// EuiDatePicker only supports a subset of props from react-datepicker.
const unsupportedProps = [
// We don't want to show multiple months next to each other
'monthsShown',
// There is no need to show week numbers
'showWeekNumbers',
// Our css adapts to height, no need to fix it
'fixedHeight',
// We force the month / year selection UI. No need to configure it
'dropdownMode',
// Short month is unnecessary. Our UI has plenty of room for full months
'useShortMonthInDropdown',
// The today button is not needed. This should always be external to the calendar
'todayButton',
// We hide the time caption, so there is no need to overwrite its text
'timeCaption',
// We always want keyboard accessibility on
'disabledKeyboardNavigation',
// This is easy enough to do. It can conflict with isLoading state
'isClearable',
// There is no reason to launch the datepicker in its own modal. Can always build these ourselves
'withPortal',
// Causes Error: Cannot read property 'clone' of undefined
'showMonthYearDropdown',
// We overridde this with `popoverPlacement`
'popperPlacement',
] as const;

type UnsupportedProps = typeof unsupportedProps[number];

interface EuiExtendedDatePickerProps
extends Omit<ReactDatePickerProps, UnsupportedProps> {
/**
* Applies classes to the numbered days provided. Check docs for example.
*/
Expand Down Expand Up @@ -85,7 +114,7 @@ interface EuiExtendedDatePickerProps extends ReactDatePickerProps {
iconType?: EuiFormControlLayoutIconsProps['icon'];

/**
* Sets the placement of the popover. It accepts: `"bottom"`, `"bottom-end"`, `"bottom-start"`, `"left"`, `"left-end"`, `"left-start"`, `"right"`, `"right-end"`, `"right-start"`, `"top"`, `"top-end"`, `"top-start"`
* Sets the placement of the popover
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Super nice cleanup!

*/
popoverPlacement?: ReactDatePickerProps['popperPlacement'];
}
Expand Down Expand Up @@ -187,44 +216,6 @@ export class EuiDatePicker extends Component<_EuiDatePickerProps> {
fullDateFormat = `${dateFormat} ${timeFormat}`;
}

// EuiDatePicker only supports a subset of props from react-datepicker. Using any of
// the unsupported props below will spit out an error.
const PropNotSupported = () => {
throw new Error(`You are using a prop from react-datepicker that EuiDatePicker
does not support. Please check the EUI documentation for more information.`);
};

if (
// We don't want to show multiple months next to each other
this.props.monthsShown ||
// There is no need to show week numbers
this.props.showWeekNumbers ||
// Our css adapts to height, no need to fix it
this.props.fixedHeight ||
// We force the month / year selection UI. No need to configure it
this.props.dropdownMode ||
// Short month is unnecessary. Our UI has plenty of room for full months
this.props.useShortMonthInDropdown ||
// The today button is not needed. This should always be external to the calendar
this.props.todayButton ||
// We hide the time caption, so there is no need to overwrite its text
this.props.timeCaption ||
// We always want keyboard accessibility on
this.props.disabledKeyboardNavigation ||
// This is easy enough to do. It can conflict with isLoading state
this.props.isClearable ||
// There is no reason to launch the datepicker in its own modal. Can always build these ourselves
this.props.withPortal ||
// Causes Error: Cannot read property 'clone' of undefined
this.props.showMonthYearDropdown
) {
return (
<EuiErrorBoundary>
<PropNotSupported />
</EuiErrorBoundary>
);
}

return (
<span className={classes}>
<EuiFormControlLayout
Expand Down