diff --git a/CHANGELOG.md b/CHANGELOG.md index bd9291b0dec..cbf3790a0ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - Converted `EuiDescribedFormGroup` to TypeScript ([#2810](https://github.com/elastic/eui/pull/2810)) - Changed SASS comments to non-compiled comments in invisibles files ([#2807](https://github.com/elastic/eui/pull/2807)) - Added `rowHeader` prop to `EuiBasicTable` to allow consumers to set the identifying cell in a row ([#2802](https://github.com/elastic/eui/pull/2802)) +- Added prepend and append to `EuiColorPicker` ([#2819](https://github.com/elastic/eui/pull/2819)) - Improved `EuiDescribedFormGroup` accessibility by avoiding duplicated output in screen readers ([#2783](https://github.com/elastic/eui/pull/2783)) - Added optional `key` attribute to `EuiContextMenu` items and relaxed `name` attribute to allow any React node ([#2817](https://github.com/elastic/eui/pull/2817)) diff --git a/src-docs/src/views/color_picker/kitchen_sink.js b/src-docs/src/views/color_picker/kitchen_sink.js index 7d5d1cec3d5..12c7fd944d0 100644 --- a/src-docs/src/views/color_picker/kitchen_sink.js +++ b/src-docs/src/views/color_picker/kitchen_sink.js @@ -16,7 +16,7 @@ export const KitchenSink = () => { return ( {/* DisplayToggles wrapper for Docs only */} - + diff --git a/src/components/color_picker/__snapshots__/color_picker.test.tsx.snap b/src/components/color_picker/__snapshots__/color_picker.test.tsx.snap index f9c3c401960..c2a754b8a5c 100644 --- a/src/components/color_picker/__snapshots__/color_picker.test.tsx.snap +++ b/src/components/color_picker/__snapshots__/color_picker.test.tsx.snap @@ -2,7 +2,7 @@ exports[`renders EuiColorPicker 1`] = `
`; +exports[`renders a EuiColorPicker with a prepend and append 1`] = ` +
+
+
+ +
+
+
+
+ +
+ + + +
+
+
+
+
+ + + +
+
+ +
+
+
+`; + exports[`renders compressed EuiColorPicker 1`] = `
{ expect(colorPicker).toMatchSnapshot(); }); +test('renders a EuiColorPicker with a prepend and append', () => { + const component = render( + + ); + + expect(component).toMatchSnapshot(); +}); + test('renders EuiColorPicker with an empty swatch when color is null', () => { const colorPicker = render( diff --git a/src/components/color_picker/color_picker.tsx b/src/components/color_picker/color_picker.tsx index e9b38cd3d57..eaa6df78d05 100644 --- a/src/components/color_picker/color_picker.tsx +++ b/src/components/color_picker/color_picker.tsx @@ -17,7 +17,10 @@ import { EuiFocusTrap } from '../focus_trap'; import { EuiFlexGroup, EuiFlexItem } from '../flex'; // @ts-ignore import { EuiFieldText } from '../form/field_text'; -import { EuiFormControlLayout } from '../form/form_control_layout'; +import { + EuiFormControlLayout, + EuiFormControlLayoutProps, +} from '../form/form_control_layout'; import { EuiI18n } from '../i18n'; import { EuiPopover } from '../popover'; import { @@ -77,6 +80,16 @@ export interface EuiColorPickerProps * Array of hex strings (3 or 6 character) to use as swatch options. Defaults to EUI visualization colors */ swatches?: string[]; + + /** + * Creates an input group with element(s) coming before input. It only shows when the `display` is set to `default`. + */ + prepend?: EuiFormControlLayoutProps['prepend']; + + /** + * Creates an input group with element(s) coming after input. It only shows when the `display` is set to `default`. + */ + append?: EuiFormControlLayoutProps['append']; } function isKeyboardEvent( @@ -102,6 +115,8 @@ export const EuiColorPicker: FunctionComponent = ({ readOnly = false, swatches = VISUALIZATION_COLORS, popoverZIndex, + prepend, + append, }) => { const [isColorSelectorShown, setIsColorSelectorShown] = useState(false); const [colorAsHsv, setColorAsHsv] = useState( @@ -124,6 +139,7 @@ export const EuiColorPicker: FunctionComponent = ({ }, [color, lastHex]); const classes = classNames('euiColorPicker', className); + const popoverClass = 'euiColorPicker__popoverAnchor'; const panelClasses = classNames('euiColorPicker__popoverPanel', { 'euiColorPicker__popoverPanel--pickerOnly': mode === 'picker', 'euiColorPicker__popoverPanel--customButton': button, @@ -131,6 +147,9 @@ export const EuiColorPicker: FunctionComponent = ({ const swatchClass = 'euiColorPicker__swatchSelect'; const testSubjAnchor = 'colorPickerAnchor'; const testSubjPopover = 'colorPickerPopover'; + const inputClasses = classNames('euiColorPicker__input', { + 'euiColorPicker__input--inGroup': prepend || append, + }); const handleOnChange = (hex: string) => { setLastHex(hex); @@ -313,7 +332,9 @@ export const EuiColorPicker: FunctionComponent = ({ readOnly={readOnly} fullWidth={fullWidth} compressed={compressed} - onKeyDown={handleToggleOnKeyDown}> + onKeyDown={handleToggleOnKeyDown} + prepend={prepend} + append={append}>
@@ -325,7 +346,7 @@ export const EuiColorPicker: FunctionComponent = ({ ]}> {([openLabel, closeLabel]: string[]) => ( = ({ isOpen={isColorSelectorShown} closePopover={handleFinalSelection} zIndex={popoverZIndex} + className={popoverClass} panelClassName={panelClasses} display={button ? 'inlineBlock' : 'block'} attachToAnchor={button ? false : true}