close
Skip to content

Commit 941e990

Browse files
author
megansmith-box
authored
feat(tooltip): support error tooltip position (#3187)
1 parent efbc532 commit 941e990

4 files changed

Lines changed: 29 additions & 4 deletions

File tree

‎src/components/select-button/SelectButton.js‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,23 @@ import * as React from 'react';
33
import classNames from 'classnames';
44

55
import Tooltip from '../tooltip';
6+
import type { Position } from '../tooltip';
67
import './SelectButton.scss';
78

89
type Props = {
910
children?: React.Node,
1011
className: string,
1112
error?: React.Node,
13+
errorTooltipPosition?: Position,
1214
isDisabled: boolean,
1315
};
1416

1517
const SelectButton = React.forwardRef<Props, HTMLButtonElement>(
16-
({ children, className = '', error, isDisabled = false, ...rest }: Props, ref) => (
17-
<Tooltip isShown={!!error} position="middle-right" text={error} theme="error">
18+
(
19+
{ children, className = '', error, errorTooltipPosition = 'middle-right', isDisabled = false, ...rest }: Props,
20+
ref,
21+
) => (
22+
<Tooltip isShown={!!error} position={errorTooltipPosition} text={error} theme="error">
1823
<button
1924
className={classNames(className, 'select-button', 'bdl-SelectButton', {
2025
'is-invalid': !!error,

‎src/components/select-button/__tests__/SelectButton.test.js‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,12 @@ describe('components/select-button/SelectButton', () => {
2020
const wrapper = shallow(<SelectButton error="error">Button Text</SelectButton>);
2121
expect(wrapper).toMatchSnapshot();
2222
});
23+
test('should align error tooltip on button when errorTooltipPosition has some value', () => {
24+
const wrapper = shallow(
25+
<SelectButton error="error" errorTooltipPosition="middle-left">
26+
Button Text
27+
</SelectButton>,
28+
);
29+
expect(wrapper.find('Tooltip').prop('position')).toBe('middle-left');
30+
});
2331
});

‎src/components/select-field/BaseSelectField.js‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import SelectButton from '../select-button';
1111
import DatalistItem from '../datalist-item';
1212
import PopperComponent from '../popper';
1313
import SelectFieldDropdown from './SelectFieldDropdown';
14+
import type { Position } from '../tooltip';
1415
import type { SelectOptionValueProp, SelectOptionProp } from './props';
1516
import { PLACEMENT_BOTTOM_END, PLACEMENT_BOTTOM_START } from '../popper/constants';
1617
import SearchForm from '../search-form/SearchForm';
@@ -47,6 +48,8 @@ type Props = {
4748
defaultValue?: SelectOptionValueProp,
4849
/** An optional error to show within a tooltip. */
4950
error?: React.Node,
51+
/** Position of error message tooltip */
52+
errorTooltipPosition?: Position,
5053
/* Intl object */
5154
intl: Object,
5255
/** The select button is disabled if true */
@@ -453,7 +456,7 @@ class BaseSelectField extends React.Component<Props, State> {
453456

454457
renderSelectButton = () => {
455458
const { activeItemID, isOpen } = this.state;
456-
const { buttonProps: buttonElProps, isDisabled, className, error } = this.props;
459+
const { buttonProps: buttonElProps, isDisabled, className, error, errorTooltipPosition } = this.props;
457460
const buttonText = this.renderButtonText();
458461
const buttonProps = {
459462
...buttonElProps,
@@ -473,7 +476,7 @@ class BaseSelectField extends React.Component<Props, State> {
473476
return (
474477
// Need to store the select button reference so we can calculate the button width
475478
// in order to set it as the min width of the dropdown list
476-
<SelectButton {...buttonProps} error={error}>
479+
<SelectButton {...buttonProps} error={error} errorTooltipPosition={errorTooltipPosition}>
477480
{buttonText}
478481
</SelectButton>
479482
);

‎src/components/select-field/__tests__/BaseSelectField.test.js‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,15 @@ describe('components/select-field/BaseSelectField', () => {
135135
const buttonWrapper = wrapper.find('PopperComponent').childAt(0);
136136
expect(buttonWrapper).toMatchSnapshot();
137137
});
138+
139+
test('should send error tooltip positon to select button when errorTooltipPosition prop has some value', () => {
140+
const wrapper = shallowRenderSelectField({
141+
error: 'error',
142+
errorTooltipPosition: 'middle-left',
143+
});
144+
const buttonWrapper = wrapper.find('PopperComponent').childAt(0);
145+
expect(buttonWrapper.prop('errorTooltipPosition')).toBe('middle-left');
146+
});
138147
});
139148

140149
describe('renderSearchInput', () => {

0 commit comments

Comments
 (0)