diff --git a/.betterer.results b/.betterer.results index beb2b73dbac..e15196995a1 100644 --- a/.betterer.results +++ b/.betterer.results @@ -5054,8 +5054,6 @@ exports[`no gf-form usage`] = { [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"] ], "packages/grafana-prometheus/src/components/PromQueryField.tsx:5381": [ - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], - [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], [0, 0, 0, "gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.", "5381"], diff --git a/packages/grafana-e2e-selectors/src/selectors/components.ts b/packages/grafana-e2e-selectors/src/selectors/components.ts index 3429df2c6be..d11995ccc92 100644 --- a/packages/grafana-e2e-selectors/src/selectors/components.ts +++ b/packages/grafana-e2e-selectors/src/selectors/components.ts @@ -526,6 +526,9 @@ export const Components = { CodeEditor: { container: 'data-testid Code editor container', }, + ReactMonacoEditor: { + container: 'data-testid ReactMonacoEditor container', + }, DashboardImportPage: { textarea: 'data-testid-import-dashboard-textarea', submit: 'data-testid-load-dashboard', diff --git a/packages/grafana-prometheus/src/components/PromQueryField.tsx b/packages/grafana-prometheus/src/components/PromQueryField.tsx index 623092b648c..ac648271d44 100644 --- a/packages/grafana-prometheus/src/components/PromQueryField.tsx +++ b/packages/grafana-prometheus/src/components/PromQueryField.tsx @@ -238,7 +238,7 @@ class PromQueryFieldClass extends React.PureComponent -
+
{ container: css({ borderRadius: theme.shape.radius.default, border: `1px solid ${theme.components.input.borderColor}`, + display: 'flex', + flexDirection: 'row', + justifyContent: 'start', + alignItems: 'center', + height: '100%', }), placeholder: css({ '::after': { diff --git a/packages/grafana-ui/src/components/Monaco/ReactMonacoEditorLazy.tsx b/packages/grafana-ui/src/components/Monaco/ReactMonacoEditorLazy.tsx index 339d718505e..5cac26c170b 100644 --- a/packages/grafana-ui/src/components/Monaco/ReactMonacoEditorLazy.tsx +++ b/packages/grafana-ui/src/components/Monaco/ReactMonacoEditorLazy.tsx @@ -1,5 +1,10 @@ +import { css } from '@emotion/css'; import React from 'react'; +import { GrafanaTheme2 } from '@grafana/data'; +import { selectors } from '@grafana/e2e-selectors'; + +import { useStyles2 } from '../../themes'; import { useAsyncDependency } from '../../utils/useAsyncDependency'; import { ErrorWithStack } from '../ErrorBoundary/ErrorWithStack'; import { LoadingPlaceholder } from '../LoadingPlaceholder/LoadingPlaceholder'; @@ -11,13 +16,14 @@ import type { ReactMonacoEditorProps } from './types'; * @internal * Experimental export **/ -export const ReactMonacoEditorLazy = (props: ReactMonacoEditorProps) => { +const MonacoEditorLazy = (props: ReactMonacoEditorProps) => { + const styles = useStyles2(getStyles); const { loading, error, dependency } = useAsyncDependency( import(/* webpackChunkName: "react-monaco-editor" */ './ReactMonacoEditor') ); if (loading) { - return ; + return ; } if (error) { @@ -31,5 +37,29 @@ export const ReactMonacoEditorLazy = (props: ReactMonacoEditorProps) => { } const ReactMonacoEditor = dependency.ReactMonacoEditor; - return ; + return ; }; + +const getStyles = (theme: GrafanaTheme2) => { + return { + container: css({ + marginBottom: 'unset', + marginLeft: theme.spacing(1), + }), + }; +}; + +const withContainer =

(Component: React.ComponentType

): React.ComponentType

=> { + const WithContainer = (props: P) => ( + // allow tests to easily determine if the code editor has rendered in any of its three states (loading, error, or ready) +

+ +
+ ); + + WithContainer.displayName = Component.displayName; + + return WithContainer; +}; + +export const ReactMonacoEditorLazy = withContainer(MonacoEditorLazy); diff --git a/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoFieldWrapper.test.tsx b/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoFieldWrapper.test.tsx index 7ff5671f8cd..ddfdd665f80 100644 --- a/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoFieldWrapper.test.tsx +++ b/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoFieldWrapper.test.tsx @@ -1,6 +1,8 @@ import { render, screen, waitFor } from '@testing-library/react'; import React from 'react'; +import { selectors } from '@grafana/e2e-selectors'; + import { createLokiDatasource } from '../../__mocks__/datasource'; import { MonacoQueryFieldWrapper, Props } from './MonacoQueryFieldWrapper'; @@ -25,7 +27,8 @@ describe('MonacoFieldWrapper', () => { renderComponent(); await waitFor(async () => { - expect(await screen.findByText('Loading...')).toBeInTheDocument(); + const monacoEditor = await screen.findByTestId(selectors.components.ReactMonacoEditor.container); + expect(monacoEditor).toBeInTheDocument(); }); }); }); diff --git a/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryField.test.tsx b/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryField.test.tsx index eb938b59597..5686179490c 100644 --- a/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryField.test.tsx +++ b/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryField.test.tsx @@ -1,6 +1,8 @@ import { render, screen } from '@testing-library/react'; import React from 'react'; +import { selectors } from '@grafana/e2e-selectors'; + import { createLokiDatasource } from '../../__mocks__/datasource'; import MonacoQueryField from './MonacoQueryField'; @@ -31,6 +33,7 @@ describe('MonacoQueryField', () => { test('Renders with no errors', async () => { renderComponent(); - expect(await screen.findByText('Loading...')).toBeInTheDocument(); + const monacoEditor = await screen.findByTestId(selectors.components.ReactMonacoEditor.container); + expect(monacoEditor).toBeInTheDocument(); }); }); diff --git a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryCodeEditor.test.tsx b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryCodeEditor.test.tsx index 19ea23c2bc5..3e850b09175 100644 --- a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryCodeEditor.test.tsx +++ b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryCodeEditor.test.tsx @@ -1,6 +1,8 @@ import { render, screen } from '@testing-library/react'; import React from 'react'; +import { selectors } from '@grafana/e2e-selectors'; + import { createLokiDatasource } from '../../__mocks__/datasource'; import { LokiQuery } from '../../types'; @@ -32,7 +34,8 @@ describe('LokiQueryCodeEditor', () => { props.showExplain = true; props.datasource.metadataRequest = jest.fn().mockResolvedValue([]); render(); - expect(await screen.findByText('Loading...')).toBeInTheDocument(); + const monacoEditor = await screen.findByTestId(selectors.components.ReactMonacoEditor.container); + expect(monacoEditor).toBeInTheDocument(); expect(screen.getByText(EXPLAIN_LABEL_FILTER_CONTENT)).toBeInTheDocument(); }); @@ -40,7 +43,8 @@ describe('LokiQueryCodeEditor', () => { const props = createDefaultProps(); props.datasource.metadataRequest = jest.fn().mockResolvedValue([]); render(); - expect(await screen.findByText('Loading...')).toBeInTheDocument(); + const monacoEditor = await screen.findByTestId(selectors.components.ReactMonacoEditor.container); + expect(monacoEditor).toBeInTheDocument(); expect(screen.queryByText(EXPLAIN_LABEL_FILTER_CONTENT)).not.toBeInTheDocument(); }); });