diff --git a/packages/grafana-ui/src/components/Cascader/Cascader.test.tsx b/packages/grafana-ui/src/components/Cascader/Cascader.test.tsx index e39b7504360..56807ba60b3 100644 --- a/packages/grafana-ui/src/components/Cascader/Cascader.test.tsx +++ b/packages/grafana-ui/src/components/Cascader/Cascader.test.tsx @@ -1,7 +1,9 @@ import { act, render, screen } from '@testing-library/react'; -import userEvent, { PointerEventsCheckLevel } from '@testing-library/user-event'; +import userEvent from '@testing-library/user-event'; import React from 'react'; +import { Field } from '../Forms/Field'; + import { Cascader, CascaderOption, CascaderProps } from './Cascader'; const options = [ @@ -118,9 +120,8 @@ describe('Cascader', () => { expect(screen.queryByDisplayValue('First/Second')).not.toBeInTheDocument(); await userEvent.click(screen.getByPlaceholderText(placeholder)); - // TODO remove skipPointerEventsCheck once https://github.com/jsdom/jsdom/issues/3232 is fixed - await userEvent.click(screen.getByText('First'), { pointerEventsCheck: PointerEventsCheckLevel.Never }); - await userEvent.click(screen.getByText('Second'), { pointerEventsCheck: PointerEventsCheckLevel.Never }); + await userEvent.click(screen.getByText('First')); + await userEvent.click(screen.getByText('Second')); expect(screen.getByDisplayValue('First / Second')).toBeInTheDocument(); }); @@ -141,9 +142,8 @@ describe('Cascader', () => { expect(screen.queryByDisplayValue('First/Second')).not.toBeInTheDocument(); await userEvent.click(screen.getByPlaceholderText(placeholder)); - // TODO remove skipPointerEventsCheck once https://github.com/jsdom/jsdom/issues/3232 is fixed - await userEvent.click(screen.getByText('First'), { pointerEventsCheck: PointerEventsCheckLevel.Never }); - await userEvent.click(screen.getByText('Second'), { pointerEventsCheck: PointerEventsCheckLevel.Never }); + await userEvent.click(screen.getByText('First')); + await userEvent.click(screen.getByText('Second')); expect(screen.getByDisplayValue(`First${separator}Second`)).toBeInTheDocument(); }); @@ -154,9 +154,8 @@ describe('Cascader', () => { ); await userEvent.click(screen.getByPlaceholderText(placeholder)); - // TODO remove skipPointerEventsCheck once https://github.com/jsdom/jsdom/issues/3232 is fixed - await userEvent.click(screen.getByText('First'), { pointerEventsCheck: PointerEventsCheckLevel.Never }); - await userEvent.click(screen.getByText('Second'), { pointerEventsCheck: PointerEventsCheckLevel.Never }); + await userEvent.click(screen.getByText('First')); + await userEvent.click(screen.getByText('Second')); expect(screen.getByDisplayValue('Second')).toBeInTheDocument(); }); @@ -165,10 +164,19 @@ describe('Cascader', () => { render(); await userEvent.click(screen.getByPlaceholderText(placeholder)); - // TODO remove skipPointerEventsCheck once https://github.com/jsdom/jsdom/issues/3232 is fixed - await userEvent.click(screen.getByText('First'), { pointerEventsCheck: PointerEventsCheckLevel.Never }); - await userEvent.click(screen.getByText('Second'), { pointerEventsCheck: PointerEventsCheckLevel.Never }); + await userEvent.click(screen.getByText('First')); + await userEvent.click(screen.getByText('Second')); expect(screen.getByDisplayValue('Second')).toBeInTheDocument(); }); + + it('should be properly associated with the Field label', () => { + render( + + + + ); + + expect(screen.getByRole('textbox', { name: 'Cascader label' })).toBeInTheDocument(); + }); }); diff --git a/packages/grafana-ui/src/components/Cascader/Cascader.tsx b/packages/grafana-ui/src/components/Cascader/Cascader.tsx index 108d285366f..c4a46551db6 100644 --- a/packages/grafana-ui/src/components/Cascader/Cascader.tsx +++ b/packages/grafana-ui/src/components/Cascader/Cascader.tsx @@ -38,6 +38,8 @@ export interface CascaderProps { cascader is hidden after selection. */ hideActiveLevelLabel?: boolean; disabled?: boolean; + /** ID for the underlying Select/Cascader component */ + id?: string; } interface CascaderState { @@ -215,7 +217,8 @@ export class Cascader extends PureComponent { }; render() { - const { allowCustomValue, formatCreateLabel, placeholder, width, changeOnSelect, options, disabled } = this.props; + const { allowCustomValue, formatCreateLabel, placeholder, width, changeOnSelect, options, disabled, id } = + this.props; const { focusCascade, isSearching, rcValue, activeLabel, inputValue } = this.state; const searchableOptions = this.getSearchableOptions(options); @@ -236,6 +239,7 @@ export class Cascader extends PureComponent { onInputChange={this.onSelectInputChange} disabled={disabled} inputValue={inputValue} + inputId={id} /> ) : ( { ) } disabled={disabled} + id={id} />